engine.js 6.9 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 gameTypes = {};
  11. var gameNames = {};
  12. for(var queryGroup in rawTypes){
  13. if(!rawTypes.hasOwnProperty(queryGroup)){
  14. continue;
  15. }
  16. Object.assign(gameTypes, rawTypes[queryGroup]);
  17. for(var gameName in rawTypes[queryGroup]){
  18. if(rawTypes[queryGroup].hasOwnProperty(gameName)){
  19. gameNames[rawTypes[queryGroup][gameName]] = gameName;
  20. }
  21. }
  22. }
  23. gameTypes = ut.sortObj(gameTypes);
  24. gameNames = ut.sortObj(gameNames);
  25. exports.st = {
  26. getServerTypes: function () {
  27. return gameTypes;
  28. },
  29. getServerType: function (id) {
  30. return gameTypes[id];
  31. },
  32. getFullServerTypes: function () {
  33. return gameNames;
  34. },
  35. getFullServerType: function (id) {
  36. return gameNames[id];
  37. }
  38. };
  39. }
  40. { //CODE BLOCK Status Handlers
  41. var statusHandlers = {
  42. "game-server-query": function (type, address, callback) {
  43. var port = parseInt(address.split(":")[1]);
  44. address = address.split(":")[0];
  45. var options = {type: type, host: address};
  46. if(port){
  47. options.port = port;
  48. }
  49. gmquery(
  50. options,
  51. function(state) {
  52. if(state.error){
  53. callback({
  54. offline: true
  55. });
  56. }else {
  57. callback(state);
  58. }
  59. }
  60. );
  61. },
  62. "teamspeak-query": function (type, address, callback) {
  63. var port = parseInt(address.split(":")[1]);
  64. address = address.split(":")[0];
  65. var options = {type: type, host: address};
  66. if(port){
  67. options.port = port;
  68. }
  69. const query = tsquery(options.host, options.port, function (err, data) {
  70. if(err){
  71. callback({
  72. offline: true,
  73. error: err
  74. });
  75. }else{
  76. callback(data);
  77. }
  78. });
  79. }
  80. };
  81. }
  82. { //CODE BLOCK Status Grabber
  83. var searchQueryType = function (type) {
  84. var x;
  85. for(x in rawTypes){
  86. if(!rawTypes.hasOwnProperty(x)){
  87. continue;
  88. }
  89. var y;
  90. for(y in rawTypes[x]) {
  91. if(!rawTypes[x].hasOwnProperty(y)) {
  92. continue;
  93. }
  94. if(rawTypes[x][y] == type){
  95. return x;
  96. }
  97. }
  98. }
  99. };
  100. var responseHandlers = require("./responseHandler")(db);
  101. var trafficAtributes = [
  102. "players",
  103. "maxplayers",
  104. "createdAt",
  105. "serverId"
  106. ];
  107. exports.statusGrabber = {
  108. getHandler: function (type) {
  109. var x = statusHandlers[searchQueryType(type)];
  110. if(x){
  111. return x;
  112. }
  113. throw new Error("No handler for "+type+" type");
  114. },
  115. getResponseHandler: function (type) {
  116. return responseHandlers.getHandler(type, searchQueryType(type));
  117. },
  118. getStatus: function (type, address, callback){
  119. var handler = this.getHandler(type);
  120. handler(type, address, callback);
  121. },
  122. getDetails: function (type, address, callback) {
  123. var handler = this.getHandler(type);
  124. var self = this;
  125. handler(type, address, function (data) {
  126. var resp = self.getResponseHandler(type);
  127. var details = resp(data, null, true);
  128. callback(details);
  129. });
  130. },
  131. getTraffic: function (callback) {
  132. db.traffic.findAll({
  133. attributes: trafficAtributes
  134. }).then(function(servers) {
  135. callback(servers);
  136. });
  137. },
  138. getTrafficById: function (id, callback) {
  139. db.traffic.findAll({where: {
  140. serverId: id
  141. },
  142. attributes: trafficAtributes
  143. }).then(function(servers) {
  144. callback(servers);
  145. });
  146. },
  147. getTrafficByRange: function (from, to, id, callback) {
  148. db.traffic.findAll({where: {
  149. serverId: id,
  150. createdAt: {
  151. $gt: from,
  152. $lt: to
  153. }
  154. },
  155. attributes: trafficAtributes
  156. }).then(function(records) {
  157. callback(records);
  158. });
  159. },
  160. pretty: {
  161. day: function (date, id, callback) {
  162. var from = new Date(date.toDateString()),
  163. to = new Date(from.valueOf() + 1000*60*60*24);
  164. exports.statusGrabber.getTrafficByRange(from, to, id, callback);
  165. },
  166. month: function (date, id, callback) {
  167. var from = new Date(date.toDateString());
  168. from.setUTCDate(1);
  169. var to = new Date(from.valueOf() + 1000*60*60*24*32);
  170. to.setUTCDate(1);
  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. }