Advertisement
Guest User

Untitled

a guest
Jan 11th, 2017
265
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.81 KB | None | 0 0
  1. var steam = require("steam"),
  2. util = require("util"),
  3. fs = require("fs"),
  4. crypto = require("crypto"),
  5. dota2 = require("../"),
  6. steamClient = new steam.SteamClient(),
  7. steamUser = new steam.SteamUser(steamClient),
  8. steamFriends = new steam.SteamFriends(steamClient),
  9. Dota2 = new dota2.Dota2Client(steamClient, true);
  10. var mysql = require('mysql');
  11. //Настройка MySQL
  12. var db_config = {
  13. host: 'localhost',
  14. user: 'root',
  15. password: '',
  16. database: 'cyber-lobby'
  17. };
  18. var admins = ['76561198107070247'];
  19. var id;
  20. var botid = 1;
  21. var log4js = require('log4js');
  22.  
  23. log4js.loadAppender('file');
  24. log4js.addAppender(log4js.appenders.file('../logs/log.log'), 'result');
  25. log4js.addAppender(log4js.appenders.file('../logs/bots/bot'+botid+'.log'), 'BOT #'+botid);
  26. log4js.addAppender(log4js.appenders.file('../logs/bots/chat_bot'+botid+'.log'), 'CHATBOT #'+botid);
  27.  
  28. var logger = log4js.getLogger('result');
  29. var blog = log4js.getLogger('BOT #'+botid);
  30. var chat = log4js.getLogger('CHATBOT #'+botid);
  31.  
  32. function handleDisconnect() {
  33. connection = mysql.createConnection(db_config);
  34. connection.connect(function(err) {
  35. if(err) {
  36. setTimeout(handleDisconnect, 2000);
  37. }
  38. });
  39. connection.on('error', function(err) {
  40. if(err.code === 'PROTOCOL_CONNECTION_LOST') {
  41. handleDisconnect();
  42. } else {
  43. throw err;
  44. }
  45. });
  46. }
  47.  
  48. handleDisconnect();
  49.  
  50.  
  51. var t2p,t1p,gamemode,num,pass,botname;
  52. global.config = require("./configs/config" + botid);
  53. connection.connect(function(err){
  54. var users = [],
  55. lobbygame,
  56. ready = 0;
  57. var sql = 'SELECT * FROM ladder_bots WHERE bot_id = '+ botid +' LIMIT 1';
  58. connection.query(sql, function(err, rows, results) {
  59. if(rows.length != 0)
  60. {
  61. lobbygame = rows[0].bot_game_id;
  62. botname = rows[0].bot_name;
  63. }
  64. if(!err)
  65. {
  66. var sql = 'SELECT * FROM ladder_lobbies WHERE lobby_id = '+ lobbygame + ' LIMIT 1';
  67. connection.query(sql, function(err, rows, results) {
  68. gamemode = rows[0].lobby_gamemode;
  69. t1p = rows[0].lobby_players_radiant.split(',');
  70. t2p = rows[0].lobby_players_dire.split(',');
  71. num = rows[0].lobby_max_players;
  72. hash_team1 = rows[0].lobby_t1_hash;
  73. hash_team2 = rows[0].lobby_t2_hash;
  74. var players = t1p.concat(t2p);
  75.  
  76. players.forEach(function(item, i, arr) {
  77. users[i] = item;
  78. });
  79. ready = 1;
  80.  
  81. });
  82. }
  83. });
  84. function FreeBot()
  85. {
  86. connection.query("UPDATE `ladder_bots` SET `bot_busy` = 0, `bot_game_id` = 0 WHERE bot_id = " + botid);
  87. Dota2.abandonCurrentGame();
  88. Dota2.leavePracticeLobby();
  89. Dota2.leaveChat('Lobby_'+id);
  90. Dota2.exit();
  91. steamClient.disconnect();
  92. }
  93. var delay = 900,lesstime = 900; // Секунды
  94. function sendDelay(delay)
  95. {
  96. var time = lesstime/60;
  97. Dota2.sendMessage('Lobby_'+id, 'Игра начнется через '+time+' минут! Не изменяйте свои места.');
  98. lesstime -= 60;
  99. }
  100. function StartGame()
  101. {
  102. launch = -1;
  103. Dota2.sendMessage('Lobby_'+id, 'Игра начнется через 15 минут! Не изменяйте свои места.');
  104. setInterval(sendDelay(), 60000);
  105. setTimeout(function(){
  106. // KickBots();
  107. Dota2.launchPracticeLobby();
  108. launch = 1;
  109. }, delay*1000);
  110.  
  111. }
  112.  
  113. function KickBots()
  114. {
  115. switch(count(Teams.Radiant))
  116. {
  117. case 1:
  118. for (var i = 0; i < 6; i++) {
  119. Dota2.addBotToPracticeLobby(i,0,5);
  120. }
  121. break
  122. case 2:
  123. for (var i = 1; i < 6; i++) {
  124. Dota2.addBotToPracticeLobby(i,0,5);
  125. }
  126. break
  127. case 3:
  128. for (var i = 2; i < 6; i++) {
  129. Dota2.addBotToPracticeLobby(i,0,5);
  130. }
  131. break
  132. case 4:
  133. for (var i = 3; i < 6; i++) {
  134. Dota2.addBotToPracticeLobby(i,0,5);
  135. }
  136. break
  137. }
  138.  
  139. switch(count(Teams.Radiant))
  140. {
  141. case 1:
  142. for (var i = 0; i < 6; i++) {
  143. Dota2.addBotToPracticeLobby(i,1,5);
  144. }
  145. break
  146. case 2:
  147. for (var i = 1; i < 6; i++) {
  148. Dota2.addBotToPracticeLobby(i,1,5);
  149. }
  150. break
  151. case 3:
  152. for (var i = 2; i < 6; i++) {
  153. Dota2.addBotToPracticeLobby(i,1,5);
  154. }
  155. break
  156. case 4:
  157. for (var i = 3; i < 6; i++) {
  158. Dota2.addBotToPracticeLobby(i,1,5);
  159. }
  160. break
  161. }
  162. }
  163. function find(array, value) {
  164. for (var i = 0; i < array.length; i++) {
  165. if (array[i] === value) return 0;
  166. }
  167. return -1;
  168. }
  169. var HashingTeams = [],lobby_hashed = false;
  170. function VerifyHash(hash)
  171. {
  172. if(hash == hash_team1 && !HashingTeams[0])
  173. {
  174. Dota2.sendMessage('Lobby_'+id, 'Хэш команды сил света принят.');
  175. HashingTeams[0] = true;
  176. if(HashingTeams[1])
  177. {
  178. StartGame();
  179. lobby_hashed = true;
  180. }
  181. }
  182. else if(hash == hash_team2 && !HashingTeams[1])
  183. {
  184. Dota2.sendMessage('Lobby_'+id, 'Хэш команды сил тьмы принят.');
  185. HashingTeams[1] = true;
  186. if(HashingTeams[0])
  187. {
  188. StartGame();
  189. lobby_hashed = true;
  190. }
  191.  
  192.  
  193. }
  194. }
  195. function createLobby()
  196. {
  197.  
  198. /*Конфиг лобби*/
  199. var options = {
  200. "game_name": "Игра #"+lobbygame,
  201. "server_region": 3,
  202. "game_mode": gamemode,
  203. "game_version": 1,
  204. "allow_cheats": false,
  205. "fill_with_bots": false,
  206. "allow_spectating": true,
  207. "pass_key": Math.floor((Math.random() * 99999) + 1)+'_'+lobbygame,
  208. "radiant_series_wins": 0,
  209. "dire_series_wins": 0,
  210. "allchat": false
  211. }
  212. /*Конец конфига*/
  213.  
  214. Dota2.createPracticeLobby(options.pass_key, options, function(err, data){
  215. if(JSON.stringify(data['result']) == 1){
  216. blog.trace("Лобби успешно создано");
  217. admins.forEach(function(item,i,arr)
  218. {
  219. steamFriends.sendMessage(item, 'Создал игру для матча №'+lobbygame, steam.EChatEntryType.ChatMsg);
  220. });
  221. }else{
  222. blog.trace("Создать лобби не удалсоь");
  223. }
  224. });
  225. Dota2.joinPracticeLobbyTeam(1, 4, function(err, data){
  226. if(JSON.stringify(data['result']) == 1)
  227. {
  228. blog.trace("Бот занял место наблюдателя.");
  229. connection.query("UPDATE `ladder_lobbies` SET `lobby_start` = 1 WHERE `lobby_id` = " + lobbygame);
  230. }
  231. });
  232. /*Invites*/
  233. setInterval(function(){
  234. if(ready == 1){
  235. users.forEach(function(item, i, arr) {
  236. Dota2.inviteToLobby(item);
  237. });
  238. ready = 0;
  239. }
  240. },5000);
  241. }
  242. var onSteamLogOn = function onSteamLogOn(logonResp) {
  243.  
  244. if (logonResp.eresult == steam.EResult.OK) {
  245. steamFriends.setPersonaState(steam.EPersonaState.Busy);
  246. steamFriends.setPersonaName(botname);
  247. util.log("Авторизован.");
  248. Dota2.launch();
  249. Dota2.on("ready", function() {
  250. blog.info('Успешный запуск бота. (#'+botid+')');
  251. /*Создаем лобби*/
  252. createLobby();
  253. /*Лобии создано*/
  254.  
  255. Dota2.on('practiceLobbyUpdate', function(lobby) {
  256. id = lobby.lobby_id + "";
  257. var status = lobby.match_outcome;
  258. var chat = 0;
  259. if(chat == 0)
  260. {
  261. Dota2.joinChat('Lobby_'+id, 3);
  262. }
  263. if(status != 0)
  264. {
  265. connection.query("UPDATE ladder_lobbies SET lobby_status= "+ status + " WHERE lobby_id = " + lobbygame);
  266. switch(status){
  267. case 3://Победа тьмы
  268. connection.query("UPDATE ladder_lobbies SET lobby_winner= "+ 1 + " WHERE lobby_id = " + lobbygame);
  269. break
  270. case 2://Победа света
  271. connection.query("UPDATE ladder_lobbies SET lobby_winner= "+ 2 + " WHERE lobby_id = " + lobbygame);
  272. break
  273. }
  274. FreeBot();
  275. }
  276. var pn=0;
  277. Teams = {Dire:[],Radiant:[]};
  278. lobby['members'].forEach(function(item, i, arr) {
  279. pn = i+1;
  280. switch(item.team)
  281. {
  282. case 0://свет
  283. Teams.Radiant[item.slot] = Dota2.ToSteamID(item.id.low);
  284.  
  285.  
  286. break;
  287. case 1://Тьма
  288. Teams.Dire[item.slot] = Dota2.ToSteamID(item.id.low);
  289.  
  290. break;
  291. }
  292. var hash_times = 0;
  293. if(pn-1 == num && !lobby_hashed)
  294. {
  295. setTimeout(function(){
  296. hash_times += 1;
  297. Dota2.sendMessage('Lobby_'+id, 'Ожидаю хэши команд..['+hash_times+'/8]');
  298. if(hash_times >= 8)
  299. {
  300. FreeBot();
  301. }
  302. }, 10000);
  303. }
  304. if(lobby_hashed)
  305. StartGame();
  306.  
  307.  
  308. if(status != 0)
  309. {
  310. if(item.name != botname)
  311. connection.query("INSERT INTO lobby_players (lobby_id,player_name, hero_id, hero_team) VALUES ('"+item.id.low+"','"+item.name+"','"+item.hero_id+"','"+item.team+"')");
  312. }
  313. });
  314. //Сортировка игроков
  315. /* Teams.Radiant.forEach(function(item,i,arr)
  316. {
  317.  
  318. if(find(t1p, item) == -1)
  319. {
  320. Dota2.practiceLobbyKickFromTeam(Dota2.ToAccountID(item));
  321. }
  322. });
  323. Teams.Dire.forEach(function(item,i,arr)
  324. {
  325. if(find(t2p, item) == -1)
  326. {
  327. Dota2.practiceLobbyKickFromTeam(Dota2.ToAccountID(item));
  328. }
  329. });*/
  330.  
  331. });
  332. // ----------------------------------
  333. });
  334.  
  335. Dota2.on("unready", function onUnready() {
  336. util.log("Node-dota2 unready.");
  337. });
  338.  
  339. Dota2.on("chatMessage", function(channel, personaName, message) {
  340. if(message == hash_team1 || hash_team2)
  341. {
  342. VerifyHash(message);
  343. }
  344. chat.trace("[" + channel + "] " + personaName + ": " + message);
  345. });
  346.  
  347. Dota2.on("unhandled", function(kMsg) {
  348. util.log("UNHANDLED MESSAGE #" + kMsg);
  349. });
  350. }
  351. },
  352. onSteamServers = function onSteamServers(servers) {
  353. util.log("Received servers.");
  354. fs.writeFile('servers', JSON.stringify(servers));
  355. },
  356. onSteamLogOff = function onSteamLogOff(eresult) {
  357. util.log("Logged off from Steam.");
  358. },
  359. onSteamError = function onSteamError(error) {
  360. util.log("Connection closed by server.");
  361. };
  362.  
  363. steamFriends.on('message', function(source, message, type, chatter) {
  364.  
  365. switch(message)
  366. {
  367. case 'Покинуть':
  368. Dota2.abandonCurrentGame();
  369. Dota2.leavePracticeLobby();
  370. Dota2.leaveChat('Lobby_'+id);
  371. steamFriends.sendMessage(source, 'Покинул лобби #'+id, steam.EChatEntryType.ChatMsg);
  372. blog.info('Пользователь '+source+' приказал покинуть лобби #'+id);
  373. id = null;
  374. break
  375. case 'Статус':
  376. if(id != null)
  377. {
  378. var answer = 'Нахожусь в лобби #'+id+'. Пароль от лобби: '+pass;
  379. steamFriends.sendMessage(source, answer, steam.EChatEntryType.ChatMsg);
  380. blog.info('Пользователь '+source+' запросил статус игры и получил ответ: "'+answer+'"');
  381. }
  382. else
  383. {
  384. steamFriends.sendMessage(source, 'Ожидаю игру.', steam.EChatEntryType.ChatMsg);
  385. }
  386. break
  387. case 'Создать':
  388. createLobby();
  389. blog.info('Пользователь '+source+' запросил создание новой игры');
  390. break
  391. case 'Пригласить админов':
  392. Dota2.inviteToLobby("76561198107070247");
  393. steamFriends.sendMessage(source, 'Приглашение для админов было отправленно!' + source, steam.EChatEntryType.ChatMsg);
  394. blog.info('Пользователь '+source+' пригласил администрацию в лобби');
  395. break
  396. case 'Офф':
  397. FreeBot();
  398. blog.info('Пользователь '+source+' выключил бота');
  399. break
  400. case 'Начать игру':
  401. StartGame();
  402. var answer = 'Игра #' + id + ' была начата!';
  403. steamFriends.sendMessage(source, answer, steam.EChatEntryType.ChatMsg);
  404. blog.info('Пользователь '+source+' запросил старт игры и получил ответ "'+answer+'"');
  405. break
  406. case 'Кикнуть':
  407. Dota2.practiceLobbyKickFromTeam(Dota2.ToAccountID('76561198107070247'));
  408. steamFriends.sendMessage(source, 'Игрок кикнут', steam.EChatEntryType.ChatMsg);
  409. break
  410. }
  411. });
  412. steamUser.on('updateMachineAuth', function(sentry, callback) {
  413. fs.writeFileSync('sentry', sentry.bytes)
  414. util.log("sentryfile saved");
  415.  
  416. callback({ sha_file: crypto.createHash('sha1').update(sentry.bytes).digest() });
  417. });
  418.  
  419. var logOnDetails = {
  420. "account_name": global.config.steam_user,
  421. "password": global.config.steam_pass,
  422. };
  423. if (global.config.steam_guard_code) logOnDetails.auth_code = global.config.steam_guard_code;
  424.  
  425. try {
  426. var sentry = fs.readFileSync('sentry');
  427. if (sentry.length) logOnDetails.sha_sentryfile = sentry;
  428. }
  429. catch (beef){
  430. util.log("Cannot load the sentry. " + beef);
  431. }
  432.  
  433. steamClient.connect();
  434.  
  435. steamClient.on('connected', function() {
  436. steamUser.logOn(logOnDetails);
  437. });
  438.  
  439. steamClient.on('logOnResponse', onSteamLogOn);
  440. steamClient.on('loggedOff', onSteamLogOff);
  441. steamClient.on('error', onSteamError);
  442. steamClient.on('servers', onSteamServers);
  443. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement