engine.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  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. };
  149. }
  150. { //CODE BLOCK Server menager
  151. exports.serverMenager = {
  152. list: function (callback) {
  153. // callback(serversList)
  154. // serversList - Array of servers
  155. db.server.findAll().then(function(servers) {
  156. callback(servers);
  157. });
  158. },
  159. getByID: function (id, callback) {
  160. db.server.findById(id).then(function (server) {
  161. callback(null, server);
  162. }).catch(function () {
  163. callback("No server with this id");
  164. });
  165. },
  166. add: function (type, address, name) {
  167. db.server.create({
  168. type: type,
  169. name: name,
  170. address: address
  171. });
  172. },
  173. remove: function (id) {
  174. db.server.destroy({
  175. where:{
  176. id: id
  177. }
  178. });
  179. }
  180. };
  181. }
  182. { //CODE BLOCK Config menager
  183. var configFilePath = path.resolve("./config.json");
  184. const defaultConfig = {
  185. lang: "en",
  186. updateInterval : 1000 * 60 * 15,
  187. port: 8080
  188. };
  189. exports.configMenager = {
  190. config: {},
  191. load: function () {
  192. if(fs.existsSync(configFilePath)){
  193. var tmp = JSON.parse(fs.readFileSync(configFilePath));
  194. var defaultKeys = Object.keys(defaultConfig);
  195. var safeConfig = {};
  196. var configProblem = false;
  197. defaultKeys.forEach(function (key) {
  198. if(tmp.hasOwnProperty(key)){
  199. safeConfig[key] = tmp[key];
  200. }else{
  201. configProblem = true;
  202. safeConfig[key] = defaultConfig[key];
  203. }
  204. });
  205. this.config = safeConfig;
  206. if (configProblem) {
  207. this.save();
  208. }
  209. }else{
  210. this.config = defaultConfig;
  211. this.save();
  212. }
  213. },
  214. save: function () {
  215. fs.writeFileSync(configFilePath, JSON.stringify(this.config, null, "\t"));
  216. }
  217. };
  218. exports.configMenager.load();
  219. }