Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var steam = require("steam"),
- util = require("util"),
- fs = require("fs"),
- crypto = require("crypto"),
- dota2 = require("../"),
- steamClient = new steam.SteamClient(),
- steamUser = new steam.SteamUser(steamClient),
- steamFriends = new steam.SteamFriends(steamClient),
- Dota2 = new dota2.Dota2Client(steamClient, true);
- var mysql = require('mysql');
- //Настройка MySQL
- var db_config = {
- host: 'localhost',
- user: 'root',
- password: '',
- database: 'cyber-lobby'
- };
- var admins = ['76561198107070247'];
- var id;
- var botid = 1;
- var log4js = require('log4js');
- log4js.loadAppender('file');
- log4js.addAppender(log4js.appenders.file('../logs/log.log'), 'result');
- log4js.addAppender(log4js.appenders.file('../logs/bots/bot'+botid+'.log'), 'BOT #'+botid);
- log4js.addAppender(log4js.appenders.file('../logs/bots/chat_bot'+botid+'.log'), 'CHATBOT #'+botid);
- var logger = log4js.getLogger('result');
- var blog = log4js.getLogger('BOT #'+botid);
- var chat = log4js.getLogger('CHATBOT #'+botid);
- function handleDisconnect() {
- connection = mysql.createConnection(db_config);
- connection.connect(function(err) {
- if(err) {
- setTimeout(handleDisconnect, 2000);
- }
- });
- connection.on('error', function(err) {
- if(err.code === 'PROTOCOL_CONNECTION_LOST') {
- handleDisconnect();
- } else {
- throw err;
- }
- });
- }
- handleDisconnect();
- var t2p,t1p,gamemode,num,pass,botname;
- global.config = require("./configs/config" + botid);
- connection.connect(function(err){
- var users = [],
- lobbygame,
- ready = 0;
- var sql = 'SELECT * FROM ladder_bots WHERE bot_id = '+ botid +' LIMIT 1';
- connection.query(sql, function(err, rows, results) {
- if(rows.length != 0)
- {
- lobbygame = rows[0].bot_game_id;
- botname = rows[0].bot_name;
- }
- if(!err)
- {
- var sql = 'SELECT * FROM ladder_lobbies WHERE lobby_id = '+ lobbygame + ' LIMIT 1';
- connection.query(sql, function(err, rows, results) {
- gamemode = rows[0].lobby_gamemode;
- t1p = rows[0].lobby_players_radiant.split(',');
- t2p = rows[0].lobby_players_dire.split(',');
- num = rows[0].lobby_max_players;
- hash_team1 = rows[0].lobby_t1_hash;
- hash_team2 = rows[0].lobby_t2_hash;
- var players = t1p.concat(t2p);
- players.forEach(function(item, i, arr) {
- users[i] = item;
- });
- ready = 1;
- });
- }
- });
- function FreeBot()
- {
- connection.query("UPDATE `ladder_bots` SET `bot_busy` = 0, `bot_game_id` = 0 WHERE bot_id = " + botid);
- Dota2.abandonCurrentGame();
- Dota2.leavePracticeLobby();
- Dota2.leaveChat('Lobby_'+id);
- Dota2.exit();
- steamClient.disconnect();
- }
- var delay = 900,lesstime = 900; // Секунды
- function sendDelay(delay)
- {
- var time = lesstime/60;
- Dota2.sendMessage('Lobby_'+id, 'Игра начнется через '+time+' минут! Не изменяйте свои места.');
- lesstime -= 60;
- }
- function StartGame()
- {
- launch = -1;
- Dota2.sendMessage('Lobby_'+id, 'Игра начнется через 15 минут! Не изменяйте свои места.');
- setInterval(sendDelay(), 60000);
- setTimeout(function(){
- // KickBots();
- Dota2.launchPracticeLobby();
- launch = 1;
- }, delay*1000);
- }
- function KickBots()
- {
- switch(count(Teams.Radiant))
- {
- case 1:
- for (var i = 0; i < 6; i++) {
- Dota2.addBotToPracticeLobby(i,0,5);
- }
- break
- case 2:
- for (var i = 1; i < 6; i++) {
- Dota2.addBotToPracticeLobby(i,0,5);
- }
- break
- case 3:
- for (var i = 2; i < 6; i++) {
- Dota2.addBotToPracticeLobby(i,0,5);
- }
- break
- case 4:
- for (var i = 3; i < 6; i++) {
- Dota2.addBotToPracticeLobby(i,0,5);
- }
- break
- }
- switch(count(Teams.Radiant))
- {
- case 1:
- for (var i = 0; i < 6; i++) {
- Dota2.addBotToPracticeLobby(i,1,5);
- }
- break
- case 2:
- for (var i = 1; i < 6; i++) {
- Dota2.addBotToPracticeLobby(i,1,5);
- }
- break
- case 3:
- for (var i = 2; i < 6; i++) {
- Dota2.addBotToPracticeLobby(i,1,5);
- }
- break
- case 4:
- for (var i = 3; i < 6; i++) {
- Dota2.addBotToPracticeLobby(i,1,5);
- }
- break
- }
- }
- function find(array, value) {
- for (var i = 0; i < array.length; i++) {
- if (array[i] === value) return 0;
- }
- return -1;
- }
- var HashingTeams = [],lobby_hashed = false;
- function VerifyHash(hash)
- {
- if(hash == hash_team1 && !HashingTeams[0])
- {
- Dota2.sendMessage('Lobby_'+id, 'Хэш команды сил света принят.');
- HashingTeams[0] = true;
- if(HashingTeams[1])
- {
- StartGame();
- lobby_hashed = true;
- }
- }
- else if(hash == hash_team2 && !HashingTeams[1])
- {
- Dota2.sendMessage('Lobby_'+id, 'Хэш команды сил тьмы принят.');
- HashingTeams[1] = true;
- if(HashingTeams[0])
- {
- StartGame();
- lobby_hashed = true;
- }
- }
- }
- function createLobby()
- {
- /*Конфиг лобби*/
- var options = {
- "game_name": "Игра #"+lobbygame,
- "server_region": 3,
- "game_mode": gamemode,
- "game_version": 1,
- "allow_cheats": false,
- "fill_with_bots": false,
- "allow_spectating": true,
- "pass_key": Math.floor((Math.random() * 99999) + 1)+'_'+lobbygame,
- "radiant_series_wins": 0,
- "dire_series_wins": 0,
- "allchat": false
- }
- /*Конец конфига*/
- Dota2.createPracticeLobby(options.pass_key, options, function(err, data){
- if(JSON.stringify(data['result']) == 1){
- blog.trace("Лобби успешно создано");
- admins.forEach(function(item,i,arr)
- {
- steamFriends.sendMessage(item, 'Создал игру для матча №'+lobbygame, steam.EChatEntryType.ChatMsg);
- });
- }else{
- blog.trace("Создать лобби не удалсоь");
- }
- });
- Dota2.joinPracticeLobbyTeam(1, 4, function(err, data){
- if(JSON.stringify(data['result']) == 1)
- {
- blog.trace("Бот занял место наблюдателя.");
- connection.query("UPDATE `ladder_lobbies` SET `lobby_start` = 1 WHERE `lobby_id` = " + lobbygame);
- }
- });
- /*Invites*/
- setInterval(function(){
- if(ready == 1){
- users.forEach(function(item, i, arr) {
- Dota2.inviteToLobby(item);
- });
- ready = 0;
- }
- },5000);
- }
- var onSteamLogOn = function onSteamLogOn(logonResp) {
- if (logonResp.eresult == steam.EResult.OK) {
- steamFriends.setPersonaState(steam.EPersonaState.Busy);
- steamFriends.setPersonaName(botname);
- util.log("Авторизован.");
- Dota2.launch();
- Dota2.on("ready", function() {
- blog.info('Успешный запуск бота. (#'+botid+')');
- /*Создаем лобби*/
- createLobby();
- /*Лобии создано*/
- Dota2.on('practiceLobbyUpdate', function(lobby) {
- id = lobby.lobby_id + "";
- var status = lobby.match_outcome;
- var chat = 0;
- if(chat == 0)
- {
- Dota2.joinChat('Lobby_'+id, 3);
- }
- if(status != 0)
- {
- connection.query("UPDATE ladder_lobbies SET lobby_status= "+ status + " WHERE lobby_id = " + lobbygame);
- switch(status){
- case 3://Победа тьмы
- connection.query("UPDATE ladder_lobbies SET lobby_winner= "+ 1 + " WHERE lobby_id = " + lobbygame);
- break
- case 2://Победа света
- connection.query("UPDATE ladder_lobbies SET lobby_winner= "+ 2 + " WHERE lobby_id = " + lobbygame);
- break
- }
- FreeBot();
- }
- var pn=0;
- Teams = {Dire:[],Radiant:[]};
- lobby['members'].forEach(function(item, i, arr) {
- pn = i+1;
- switch(item.team)
- {
- case 0://свет
- Teams.Radiant[item.slot] = Dota2.ToSteamID(item.id.low);
- break;
- case 1://Тьма
- Teams.Dire[item.slot] = Dota2.ToSteamID(item.id.low);
- break;
- }
- var hash_times = 0;
- if(pn-1 == num && !lobby_hashed)
- {
- setTimeout(function(){
- hash_times += 1;
- Dota2.sendMessage('Lobby_'+id, 'Ожидаю хэши команд..['+hash_times+'/8]');
- if(hash_times >= 8)
- {
- FreeBot();
- }
- }, 10000);
- }
- if(lobby_hashed)
- StartGame();
- if(status != 0)
- {
- if(item.name != botname)
- 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+"')");
- }
- });
- //Сортировка игроков
- /* Teams.Radiant.forEach(function(item,i,arr)
- {
- if(find(t1p, item) == -1)
- {
- Dota2.practiceLobbyKickFromTeam(Dota2.ToAccountID(item));
- }
- });
- Teams.Dire.forEach(function(item,i,arr)
- {
- if(find(t2p, item) == -1)
- {
- Dota2.practiceLobbyKickFromTeam(Dota2.ToAccountID(item));
- }
- });*/
- });
- // ----------------------------------
- });
- Dota2.on("unready", function onUnready() {
- util.log("Node-dota2 unready.");
- });
- Dota2.on("chatMessage", function(channel, personaName, message) {
- if(message == hash_team1 || hash_team2)
- {
- VerifyHash(message);
- }
- chat.trace("[" + channel + "] " + personaName + ": " + message);
- });
- Dota2.on("unhandled", function(kMsg) {
- util.log("UNHANDLED MESSAGE #" + kMsg);
- });
- }
- },
- onSteamServers = function onSteamServers(servers) {
- util.log("Received servers.");
- fs.writeFile('servers', JSON.stringify(servers));
- },
- onSteamLogOff = function onSteamLogOff(eresult) {
- util.log("Logged off from Steam.");
- },
- onSteamError = function onSteamError(error) {
- util.log("Connection closed by server.");
- };
- steamFriends.on('message', function(source, message, type, chatter) {
- switch(message)
- {
- case 'Покинуть':
- Dota2.abandonCurrentGame();
- Dota2.leavePracticeLobby();
- Dota2.leaveChat('Lobby_'+id);
- steamFriends.sendMessage(source, 'Покинул лобби #'+id, steam.EChatEntryType.ChatMsg);
- blog.info('Пользователь '+source+' приказал покинуть лобби #'+id);
- id = null;
- break
- case 'Статус':
- if(id != null)
- {
- var answer = 'Нахожусь в лобби #'+id+'. Пароль от лобби: '+pass;
- steamFriends.sendMessage(source, answer, steam.EChatEntryType.ChatMsg);
- blog.info('Пользователь '+source+' запросил статус игры и получил ответ: "'+answer+'"');
- }
- else
- {
- steamFriends.sendMessage(source, 'Ожидаю игру.', steam.EChatEntryType.ChatMsg);
- }
- break
- case 'Создать':
- createLobby();
- blog.info('Пользователь '+source+' запросил создание новой игры');
- break
- case 'Пригласить админов':
- Dota2.inviteToLobby("76561198107070247");
- steamFriends.sendMessage(source, 'Приглашение для админов было отправленно!' + source, steam.EChatEntryType.ChatMsg);
- blog.info('Пользователь '+source+' пригласил администрацию в лобби');
- break
- case 'Офф':
- FreeBot();
- blog.info('Пользователь '+source+' выключил бота');
- break
- case 'Начать игру':
- StartGame();
- var answer = 'Игра #' + id + ' была начата!';
- steamFriends.sendMessage(source, answer, steam.EChatEntryType.ChatMsg);
- blog.info('Пользователь '+source+' запросил старт игры и получил ответ "'+answer+'"');
- break
- case 'Кикнуть':
- Dota2.practiceLobbyKickFromTeam(Dota2.ToAccountID('76561198107070247'));
- steamFriends.sendMessage(source, 'Игрок кикнут', steam.EChatEntryType.ChatMsg);
- break
- }
- });
- steamUser.on('updateMachineAuth', function(sentry, callback) {
- fs.writeFileSync('sentry', sentry.bytes)
- util.log("sentryfile saved");
- callback({ sha_file: crypto.createHash('sha1').update(sentry.bytes).digest() });
- });
- var logOnDetails = {
- "account_name": global.config.steam_user,
- "password": global.config.steam_pass,
- };
- if (global.config.steam_guard_code) logOnDetails.auth_code = global.config.steam_guard_code;
- try {
- var sentry = fs.readFileSync('sentry');
- if (sentry.length) logOnDetails.sha_sentryfile = sentry;
- }
- catch (beef){
- util.log("Cannot load the sentry. " + beef);
- }
- steamClient.connect();
- steamClient.on('connected', function() {
- steamUser.logOn(logOnDetails);
- });
- steamClient.on('logOnResponse', onSteamLogOn);
- steamClient.on('loggedOff', onSteamLogOff);
- steamClient.on('error', onSteamError);
- steamClient.on('servers', onSteamServers);
- });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement