diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4129f9d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/bot_config.yaml + diff --git a/bot_config.yaml.example b/bot_config.yaml.example new file mode 100644 index 0000000..883d036 --- /dev/null +++ b/bot_config.yaml.example @@ -0,0 +1,10 @@ +token: '' +telnet: + host: '' + port: '30004' + pass: 'guest' +admin: + - 11111111 +authorized_chats: + - 11111111 + diff --git a/commands.rb b/commands.rb new file mode 100644 index 0000000..ee7dfaf --- /dev/null +++ b/commands.rb @@ -0,0 +1,71 @@ +def message_from_admin?(message, adm) + #return @admin_userids.include? message.from.id.to_s + #puts adm.class + #puts message.from.id + #puts adm + if adm.include?(message.from.id) + puts "Command is from an admin. [#{message.from.username}]" + return true + else + puts "Command is NOT from an admin! [#{message.from.username}]" + return false + end +end + +def is_chat_authorized?(message, auth_chat) + if auth_chat.include?(message.chat.id) + puts "Group [#{message.chat.id}][#{message.chat.title}] is authorized" + return true + else + puts "Group [#{message.chat.id}][#{message.chat.title}] is NOT authorized!" + return false + end +end + +def process_command_srvstart(message, command, adm) + puts "Received command: srvstart" + #pp message + from_admin = message_from_admin?(message, adm) + auth_grp = is_chat_authorized?(message, @auth_chat) + if ! auth_grp && ! from_admin + return "Refusal: I am not authorized to perform this function for this group, meatbag." + elsif ! from_admin + return "Refusal: The meatbag #{message.from.username} is not my master." + elsif ! auth_grp + return "Refusal: Although I respect your wishes, master, I am not authorized to perform this function for this group." + else + telnet = @conf['telnet'] + puts `./scripts/srvstart #{telnet['host']}` + #return "Starting up the Empyrion service." + return "This function is currently broken. An attempt was made, but odds are against the server having actually started.\n\n" + + "Use /status for more info." + end +end + +def process_command_srvstop(message, command, adm) + puts "Received command: srvstop" + from_admin = message_from_admin?(message, adm) + auth_grp = is_chat_authorized?(message, @auth_chat) + if ! auth_grp && ! from_admin + return "Refusal: I am not authorized to perform this function for this group, meatbag." + elsif ! from_admin + return "Refusal: The meatbag #{message.from.username} is not my master." + elsif ! auth_grp + return "Refusal: Although I respect your wishes, master, I am not authorized to perform this function for this group." + else + telnet = @conf['telnet'] + `./scripts/srvstop #{telnet['host']} #{telnet['port']} #{telnet['pass']}` + return "Affirmation: I am shutting down the Empyrion service." + end +end + +def process_command_srvstatus(message, command, adm) + if is_chat_authorized?(message, @auth_chat) || message_from_admin?(message, adm) + telnet = @conf['telnet'] + reply = `./scripts/srvstatus #{telnet['host']} #{telnet['port']} #{telnet['pass']}` + else + reply = "Refusal: I am not authorized to provide this information here." + end + return reply +end + diff --git a/run.rb b/run.rb new file mode 100755 index 0000000..a43ed15 --- /dev/null +++ b/run.rb @@ -0,0 +1,153 @@ +#!/usr/bin/env ruby + +require 'rubygems' +require 'yaml' +require 'telegram/bot' +require 'pp' +require_relative 'commands.rb' + +#conf = YAML.load(File.read("bot_config.yaml")) +@conf = YAML.load_file("bot_config.yaml") +@botname = @conf['botname'] +token = @conf['token'] +telnet = @conf['telnet'] +admin = @conf['admin'] +@auth_chat = @conf['authorized_chats'] + +# Sanity check +errcount = 0 +puts "Checking if environment is sane...\n\n" +if token.nil? + puts "No bot token defined in bot_config.yaml!\nTHIS IS REQUIRED! Bot initialization failed; exiting..." + exit(1) +end +if @botname.nil? + errcount += 1 + puts "Error(#{errcount.to_s}): No bot name defined. This is superficial. We'll call him Bob.\n\n" + @botname = "Bob" +end +if telnet.nil? + errcount += 1 + puts "Error(#{errcount.to_s}): No telnet information provided in bot_config.yaml.\nThis is required for nearly all Empyrion-related " + + "functions.\nTHIS SHOULD BE ADDRESSED. Continuing. (some commands will return broken messages)\n\n" +end +if admin.nil? + errcount += 1 + puts "Error(#{errcount.to_s}): No admin Telegram IDs provided in bot_config.yaml.\nThis is required for many functions.\n" + + "THIS SHOULD BE ADDRESSED. Continuing. (some commands will not be available)\n\n" + admin = ["0"] +end +if @auth_chat.nil? + errcount += 1 + puts "Error(#{errcount.to_s}): No authorized Telegram group IDs provided in bot_config.yaml.\nThis is required for most Empyrion-related " + + "functions.\nTHIS SHOULD BE ADDRESSED. Continuing. (some commands will not be available)\n\n" + @auth_chat = ["0"] +end +puts "Errors found: #{errcount.to_s}\n\n" + +puts "Starting [#{@botname}]...\n\n" +puts "Empyrion Host: #{telnet['host']}" +puts "Empyrion Telnet Port: #{telnet['port']}" +puts "Authorized administrator IDs: #{admin}" +puts "Authorized chat IDs: #{@auth_chat}" +puts "Bot token: #{token}\n\n\n\n" + +#def process_command_srvstart(message) +# puts "Received command: srvstart" +# reply = `./srvstart` +#end +# +#def process_command_srvstop(message) +# puts "Received command: srvstop" +# reply = `./srvstop` +#end + +def handle_message(message) + #Format sender name + if ! message.from.username.nil? + message.from.username = "@" + message.from.username + elsif ! message.from.first_name.nil? + message.from.username = message.from.first_name + end + + #Format command + command = message.text.split(" ")[0].split("@")[0].downcase #Strip command from arguments and @tags + + reply = 'Empty String' + #conf = YAML.load_file("bot_config.yaml") + telnet = @conf['telnet'] + adm = @conf['admin'] + #case message.text.split(" ")[0].split("@")[0].downcase #Strip command from arguments and @tags + puts "Received command from #{message.from.username}: #{command}" + case command + when '/start' + reply = "Introduction: I am #{@botname}, and I am here to make life easier for meatbag admins like you. Currently I can retrieve information " + + "from an Empyrion server as well as kill the server process.\n\n" + + "Commands available:\n/start (Shows this message)\n/srvstart (Probably won't work)\n/srvstop\n/status\n/whoami\n\n" + + "Check again later to see if any new functions have been added." + if ! message_from_admin?(message, adm) && ! is_chat_authorized?(message, @auth_chat) + if message.from.id == message.chat.id + reply = reply + "\n\nWARNING: I am not authorized to work you directly. My functionality is limited." + else + reply = reply + "\n\nWARNING: I am not authorized to participate with this group. My functionality is limited." + end + elsif message_from_admin?(message, adm) && ! is_chat_authorized?(message, @auth_chat) + reply = reply + "\n\nWARNING: Although you are my master, I have not been authorized to participate in this group. My functionality is limited." + end + when '/srvstart' + reply = process_command_srvstart(message, command, adm) + when '/srvstop' + reply = process_command_srvstop(message, command, adm) + when '/status' + reply = process_command_srvstatus(message, command, adm) + #if is_chat_authorized?(message, @auth_chat) || message_from_admin?(message, adm) + # reply = `./scripts/srvstatus #{telnet['host']} #{telnet['port']} #{telnet['pass']}` + #else + # reply = "Refusal: I am not authorized to provide this information here." + #end + when '/location', '/whereareyou' + if message_from_admin?(message, adm) || is_chat_authorized?(message, @auth_chat) + reply = "I am currently located at:\n\nHost: #{`echo $HOSTNAME`}ExtIP: #{`curl myip.contegix.com 2>/dev/null`}" + else + reply = "Refusal: I am not authorized to provide this information here." + end + when '/whoami', '/chatinfo' + #reply = "Answer: You are a meatbag named #{message.from.username}\n\nUser ID: #{message.from.id}\n\nChat ID: #{message.chat.id}" + reply = "User ID: #{message.from.id}\nChat ID: #{message.chat.id}" + if command == '/whoami' + reply = "Answer: You are a meatbag named #{message.from.username}\n\n" + reply + end + when '/pp', '/debug' + pp message + reply = "Confirmation: Message debug information sent to console." + when '/dance' + if is_chat_authorized?(message, @auth_chat) || message_from_admin?(message, adm) + reply = "dance" + else + reply = "Refusal: I am not authorized to bust a move in this location." + end + when '/flex' + if is_chat_authorized?(message, @auth_chat) || message_from_admin?(message, adm) + reply = "flex" + else + reply = "Refusal: I am not authorized to bring the gun show to this location." + end + else + reply = "Mockery: My name is #{message.from.username}, I am a meatbag, and I think #{command} is a valid command." + end + puts "Sending #{reply.inspect}\n\n" + #puts "End of case" + return reply +end + +Telegram::Bot::Client.run(token) do |bot| + bot.listen do |message| + reply = handle_message(message) + if reply == "dance" || reply == "flex" + bot.api.sendVideo(chat_id: message.chat.id, video: "https://img.skyfalltech.net/togra/#{reply}.gif") + else + bot.api.send_message(chat_id: message.chat.id, text: "#{reply}") + end + end +end + diff --git a/scripts/srvstart b/scripts/srvstart new file mode 100755 index 0000000..61fe211 --- /dev/null +++ b/scripts/srvstart @@ -0,0 +1,16 @@ +#!/usr/bin/env sh +#ssh ajohnson@tartarus srvstart.bat +#ssh ajohnson@tartarus 'X:\server\alpha9\start-nova9.cmd' +ssh ajohnson@tartarus '.\srvstart.bat' +#echo "Yay you did it" + +#set timeout 10 +#set host [lindex $argv 0] +# +#spawn ssh ajohnson@${host} +#expect "Microsoft Windows" +#send ".\\srvstart.bat\r" +##expect "Logged in successfully" +##send "saveandexit 0\r" +#expect eof + diff --git a/scripts/srvstart.expect b/scripts/srvstart.expect new file mode 100755 index 0000000..0db1955 --- /dev/null +++ b/scripts/srvstart.expect @@ -0,0 +1,15 @@ +#!/usr/bin/expect +#ssh ajohnson@tartarus srvstart.bat +#ssh ajohnson@tartarus "X:\server\alpha9\start-nova9.cmd" +#echo "Yay you did it" + +set timeout 10 +set host [lindex $argv 0] + +spawn ssh ajohnson@${host} +expect "Microsoft Windows" +send ".\\srvstart.bat\r" +#expect "Logged in successfully" +#send "saveandexit 0\r" +expect eof + diff --git a/scripts/srvstatus b/scripts/srvstatus new file mode 100755 index 0000000..b0fe0bf --- /dev/null +++ b/scripts/srvstatus @@ -0,0 +1,18 @@ +#!/usr/bin/env sh + +host=$1 +port=$2 +pass=$3 + +if nc -zvw3 $host $port 2>/dev/null; then + ./scripts/srvstatus.expect $host $port $pass > /tmp/.stat + grep -B1 -A8 Empyrion\ dedicated\ server /tmp/.stat | egrep -v Playfield\|Game\ seed + printf "\nOnline players:\n- - - - - - - - - - - - -" + sed -n '/Global\ online/,/Global\ players/p' /tmp/.stat | awk -F\= '{print $3}' | sed 's/....$//' + rm /tmp/.stat + exit 0 +else + printf "Server is DOWN!" + exit 1 +fi + diff --git a/scripts/srvstatus.expect b/scripts/srvstatus.expect new file mode 100755 index 0000000..db9b981 --- /dev/null +++ b/scripts/srvstatus.expect @@ -0,0 +1,14 @@ +#!/usr/bin/expect + +set timeout 10 +set host [lindex $argv 0] +set port [lindex $argv 1] +set pass [lindex $argv 2] + +spawn telnet $host $port +expect "password:" +send "$pass\r" +expect "Logged in successfully" +send "plys\r" +expect eof + diff --git a/scripts/srvstop b/scripts/srvstop new file mode 100755 index 0000000..a23ac36 --- /dev/null +++ b/scripts/srvstop @@ -0,0 +1,29 @@ +#!/usr/bin/expect + +set timeout 10 +set host [lindex $argv 0] +set port [lindex $argv 1] +set pass [lindex $argv 2] + +spawn telnet $host $port +expect "password:" +send "$pass\r" +expect "Logged in successfully" +#send "say 'This is a test (shutdown command) (no, it is not actually shutting down, hence the test).'\r" +send "saveandexit 0\r" +expect eof + + +##!/usr/bin/env sh +#host=$1 +#port=$2 +#pass=$3 +# +#telnet $host $port <