engine.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. // Requirments
  2. const fs = require('fs');
  3. const path = require('path');
  4. const db = require("./database");
  5. const ut = require("./utils");
  6. const gmquery = require('game-server-query');
  7. const tsquery = require('./ts-query').query;
  8. { //CODE BLOCK Type list and modifing
  9. var rawTypes = JSON.parse(fs.readFileSync("availableTypes.json", "utf-8"));
  10. var types = {};
  11. var typesFull = {};
  12. var x;
  13. for(x in rawTypes){
  14. if(!rawTypes.hasOwnProperty(x)){
  15. continue;
  16. }
  17. Object.assign(types, rawTypes[x]);
  18. for(var y in rawTypes[x]){
  19. if(rawTypes[x].hasOwnProperty(y)){
  20. typesFull[rawTypes[x][y]] = y;
  21. }
  22. }
  23. }
  24. types = ut.sortObj(types);
  25. typesFull = ut.sortObj(typesFull);
  26. exports.st = {
  27. getServerTypes: function () {
  28. return types;
  29. },
  30. getServerType: function (id) {
  31. return types[id];
  32. },
  33. getFullServerTypes: function () {
  34. return typesFull;
  35. },
  36. getFullServerType: function (id) {
  37. return typesFull[id];
  38. }
  39. };
  40. }
  41. { //CODE BLOCK Status Handlers
  42. var statusHandlers = {
  43. "game-server-query": function (type, address, callback) {
  44. var port = parseInt(address.split(":")[1]);
  45. address = address.split(":")[0];
  46. var options = {type: type, host: address};
  47. if(port){
  48. options.port = port;
  49. }
  50. gmquery(
  51. options,
  52. function(state) {
  53. if(state.error){
  54. callback({
  55. offline: true
  56. });
  57. }else {
  58. callback(state);
  59. }
  60. }
  61. );
  62. },
  63. "teamspeak-query": function (type, address, callback) {
  64. var port = parseInt(address.split(":")[1]);
  65. address = address.split(":")[0];
  66. var options = {type: type, host: address};
  67. if(port){
  68. options.port = port;
  69. }
  70. const query = tsquery(options.host, options.port, function (err, data) {
  71. if(err){
  72. callback({
  73. offline: true,
  74. error: err
  75. });
  76. }else{
  77. callback(data);
  78. }
  79. });
  80. }
  81. };
  82. }
  83. { //CODE BLOCK Status Grabber
  84. var searchQueryType = function (type) {
  85. var x;
  86. for(x in rawTypes){
  87. if(!rawTypes.hasOwnProperty(x)){
  88. continue;
  89. }
  90. var y;
  91. for(y in rawTypes[x]) {
  92. if(!rawTypes[x].hasOwnProperty(y)) {
  93. continue;
  94. }
  95. if(rawTypes[x][y] == type){
  96. return x;
  97. }
  98. }
  99. }
  100. };
  101. var responseHandlers = require("./responseHandler")(db);
  102. var trafficAtributes = [
  103. "players",
  104. "maxplayers",
  105. "createdAt",
  106. "serverId"
  107. ];
  108. exports.statusGrabber = {
  109. getHandler: function (type) {
  110. var x = statusHandlers[searchQueryType(type)];
  111. if(x){
  112. return x;
  113. }
  114. throw new Error("No handler for "+type+" type");
  115. },
  116. getResponseHandler: function (type) {
  117. return responseHandlers.getHandler(type, searchQueryType(type));
  118. },
  119. getStatus: function (type, address, callback){
  120. var handler = this.getHandler(type);
  121. handler(type, address, callback);
  122. },
  123. getDetails: function (type, address, callback) {
  124. var handler = this.getHandler(type);
  125. var self = this;
  126. handler(type, address, function (data) {
  127. var resp = self.getResponseHandler(type);
  128. var details = resp(data, null, true);
  129. callback(details);
  130. });
  131. },
  132. getTraffic: function (callback) {
  133. db.traffic.findAll({
  134. attributes: trafficAtributes
  135. }).then(function(servers) {
  136. callback(servers);
  137. });
  138. },
  139. getTrafficById: function (id, callback) {
  140. db.traffic.findAll({where: {
  141. serverId: id
  142. },
  143. attributes: trafficAtributes
  144. }).then(function(servers) {
  145. callback(servers);
  146. });
  147. },
  148. getTrafficByRange: function (from, to, id, callback) {
  149. db.traffic.findAll({where: {
  150. serverId: id,
  151. createdAt: {
  152. $gt: from,
  153. $lt: to
  154. }
  155. },
  156. attributes: trafficAtributes
  157. }).then(function(records) {
  158. callback(records);
  159. });
  160. },
  161. pretty: {
  162. day: function (date, id, callback) {
  163. var from = new Date(date.toDateString()),
  164. to = new Date(from.valueOf() + 1000*60*60*24);
  165. exports.statusGrabber.getTrafficByRange(from, to, id, callback);
  166. },
  167. month: function (date, id, callback) {
  168. var from = new Date(date.toDateString());
  169. from.setUTCDate(1);
  170. var to = new Date(from);
  171. for(var m = to.getUTCMonth(); to.getUTCMonth() === m;){
  172. to = new Date(to.valueOf() + 1000*60*60*24);
  173. }
  174. exports.statusGrabber.getTrafficByRange(from, to, id, callback);
  175. },
  176. year: function (date, id, callback) {
  177. var from = new Date(date.toDateString());
  178. from.setUTCDate(1);
  179. from.setUTCMonth(0);
  180. var to = new Date(from);
  181. to.setUTCFullYear(to.getUTCFullYear() + 1);
  182. exports.statusGrabber.getTrafficByRange(from, to, id, callback);
  183. }
  184. }
  185. };
  186. }
  187. { //CODE BLOCK Server menager
  188. exports.serverMenager = {
  189. list: function (callback) {
  190. // callback(serversList)
  191. // serversList - Array of servers
  192. db.server.findAll().then(function(servers) {
  193. callback(servers);
  194. });
  195. },
  196. getByID: function (id, callback) {
  197. db.server.findById(id).then(function (server) {
  198. callback(null, server);
  199. }).catch(function () {
  200. callback("No server with this id");
  201. });
  202. },
  203. add: function (type, address, name) {
  204. db.server.create({
  205. type: type,
  206. name: name,
  207. address: address
  208. });
  209. },
  210. remove: function (id) {
  211. db.server.destroy({
  212. where:{
  213. id: id
  214. }
  215. });
  216. }
  217. };
  218. }
  219. { //CODE BLOCK Config menager
  220. var configFilePath = path.resolve("./config.json");
  221. const defaultConfig = {
  222. lang: "en",
  223. updateInterval : 1000 * 60 * 15,
  224. port: 8080,
  225. updateState: true
  226. };
  227. exports.configMenager = {
  228. config: {},
  229. load: function () {
  230. if(fs.existsSync(configFilePath)){
  231. var tmp = JSON.parse(fs.readFileSync(configFilePath));
  232. var defaultKeys = Object.keys(defaultConfig);
  233. var safeConfig = {};
  234. var configProblem = false;
  235. defaultKeys.forEach(function (key) {
  236. if(tmp.hasOwnProperty(key)){
  237. safeConfig[key] = tmp[key];
  238. }else{
  239. configProblem = true;
  240. safeConfig[key] = defaultConfig[key];
  241. }
  242. });
  243. this.config = safeConfig;
  244. if (configProblem) {
  245. this.save();
  246. }
  247. }else{
  248. this.config = defaultConfig;
  249. this.save();
  250. }
  251. },
  252. save: function () {
  253. fs.writeFileSync(configFilePath, JSON.stringify(this.config, null, "\t"));
  254. }
  255. };
  256. exports.configMenager.load();
  257. }