engine.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. // Requirments
  2. const fs = require('fs');
  3. const path = require('path');
  4. const db = require("./database");
  5. const gmquery = require('game-server-query');
  6. const tsquery = require('./ts-query').query;
  7. // Status Handler
  8. var rawTypes = JSON.parse(fs.readFileSync("availableTypes.json", "utf-8"));
  9. var types = {};
  10. var x;
  11. for(x in rawTypes){
  12. if(!rawTypes.hasOwnProperty(x)){
  13. continue;
  14. }
  15. Object.assign(types, rawTypes[x]);
  16. }
  17. exports.getServerTypes = function () {
  18. return types;
  19. };
  20. var statusHandlers = {
  21. "game-server-query": function (type, address, callback) {
  22. var port = parseInt(address.split(":")[1]);
  23. address = address.split(":")[0];
  24. var options = {type: type, host: address};
  25. if(port){
  26. options.port = port;
  27. }
  28. gmquery(
  29. options,
  30. function(state) {
  31. if(state.error){
  32. callback({
  33. offline: true
  34. });
  35. }else {
  36. callback(state);
  37. }
  38. }
  39. );
  40. },
  41. "teamspeak-query": function (type, address, callback) {
  42. var port = parseInt(address.split(":")[1]);
  43. address = address.split(":")[0];
  44. var options = {type: type, host: address};
  45. if(port){
  46. options.port = port;
  47. }
  48. const query = tsquery(options.host, options.port, function (err, data) {
  49. if(err){
  50. callback({
  51. offline: true,
  52. error: err
  53. });
  54. }else{
  55. callback(data);
  56. }
  57. });
  58. }
  59. };
  60. var responseHandlers = {
  61. defaultHandler: function (data, server) {
  62. var frame = {};
  63. if(typeof(data.players) == "number"){
  64. frame.players = data.players;
  65. }else if(data.players && data.players.length >= 0){
  66. frame.players = data.players.length;
  67. }
  68. if(typeof(data.maxplayers) == "number"){
  69. frame.maxplayers = data.maxplayers;
  70. }
  71. console.log(frame);
  72. if(frame.maxplayers && frame.players >= 0){
  73. db.traffic.create({
  74. server: server,
  75. maxplayers: frame.maxplayers,
  76. players: frame.players
  77. }, {
  78. include: [{
  79. model: db.server,
  80. as: 'server'
  81. }]
  82. });
  83. }
  84. },
  85. query: {
  86. "game-server-query": function (data, server) {
  87. var frame = {};
  88. if(typeof(data.players) == "number"){
  89. frame.players = data.players;
  90. }else if(data.players && data.players.length >= 0){
  91. frame.players = data.players.length;
  92. }
  93. if(typeof(data.maxplayers) == "number"){
  94. frame.maxplayers = data.maxplayers;
  95. }
  96. console.log(frame);
  97. if(frame.maxplayers && frame.players >= 0){
  98. db.traffic.create({
  99. serverId: server,
  100. maxplayers: frame.maxplayers,
  101. players: frame.players
  102. });
  103. }
  104. },
  105. "teamspeak-query": function (data, server) {
  106. var frame = {};
  107. if(data.virtualserver_maxclients){
  108. frame.maxplayers = data.virtualserver_maxclients;
  109. }
  110. if(data.virtualserver_clientsonline){
  111. frame.players = data.virtualserver_clientsonline;
  112. }
  113. if(frame.maxplayers && frame.players >= 0){
  114. db.traffic.create({
  115. serverId: server,
  116. maxplayers: frame.maxplayers,
  117. players: frame.players
  118. });
  119. }
  120. }
  121. },
  122. game: {
  123. }
  124. };
  125. var searchQueryType = function (type) {
  126. var x;
  127. for(x in rawTypes){
  128. if(!rawTypes.hasOwnProperty(x)){
  129. continue;
  130. }
  131. var y;
  132. for(y in rawTypes[x]) {
  133. if(!rawTypes[x].hasOwnProperty(y)) {
  134. continue;
  135. }
  136. if(rawTypes[x][y] == type){
  137. return x;
  138. }
  139. }
  140. }
  141. };
  142. exports.statusGrabber = {
  143. getHandler: function (type) {
  144. var x = statusHandlers[searchQueryType(type)];
  145. if(x){
  146. return x;
  147. }
  148. throw new Error("No handler for "+type+" type");
  149. },
  150. getStatus: function (type, address, callback){
  151. var handler = this.getHandler(type);
  152. handler(type, address, callback);
  153. },
  154. getResponseHandler: function (type) {
  155. var queryType = searchQueryType(type);
  156. if(responseHandlers.game[type]){
  157. return responseHandlers.game[type];
  158. }else if(responseHandlers.query[queryType]){
  159. return responseHandlers.query[queryType];
  160. }else{
  161. return responseHandlers.defaultHandler;
  162. }
  163. },
  164. getTraffic: function (callback) {
  165. db.traffic.findAll().then(function(servers) {
  166. callback(servers);
  167. });
  168. }
  169. };
  170. // Server menager
  171. exports.serverMenager = {
  172. list: function (callback) {
  173. // callback(serversList)
  174. // serversList - Array of servers
  175. db.server.findAll().then(function(servers) {
  176. callback(servers);
  177. });
  178. },
  179. getByID: function (id, callback) {
  180. db.server.findById(id).then(function (server) {
  181. callback(server);
  182. }).catch(function () {
  183. callback("No server with this id");
  184. });
  185. },
  186. add: function (type, address, name) {
  187. db.server.create({
  188. type: type,
  189. name: name,
  190. address: address
  191. });
  192. },
  193. remove: function (id) {
  194. db.server.destroy({
  195. where:{
  196. id: id
  197. }
  198. });
  199. }
  200. };
  201. // Config menager
  202. var configFilePath = path.resolve("./config.json");
  203. const defaultConfig = {
  204. lang: "en"
  205. };
  206. exports.configMenager = {
  207. config: {},
  208. load: function () {
  209. if(fs.existsSync(configFilePath)){
  210. this.config = JSON.parse(fs.readFileSync(configFilePath));
  211. }else{
  212. this.config = defaultConfig;
  213. this.save();
  214. }
  215. },
  216. save: function () {
  217. fs.writeFileSync(configFilePath, JSON.stringify(this.config, null, "\t"));
  218. }
  219. };
  220. exports.configMenager.load();