diff --git a/CommandsHandler.rb b/CommandsHandler.rb new file mode 100644 index 0000000..05ea139 --- /dev/null +++ b/CommandsHandler.rb @@ -0,0 +1,152 @@ +require 'open-uri' + +def HandleCommands(line) + timestamp = Time.now.to_i + message_count = 0 + max_messages = 80 # Make sure the bot is a moderator in your channel + # moderators = 100 messages (within a 30 second window) + # default = 20 messages (within a 30 second window) + # max_messages is set to 80 just to keep it safe + + user = "" + prefix = "!" + + admin_commands = { + #"example" => "raw socket message" + } + + commands = [ + "commands", + "cortexio", + "about", + "project",] + + replacements = [ + ["USER", "@#{user}"], + ["CHANNEL", "#{CHANNEL}"], + ["COMMANDS", "#{commands}"], + ["\"", ""], ["[", ""], ["]", ""]] + + if line.index("PING") == 0 + response = Ping(line) + else + match = line.match(/^:(.+)!(.+)PRIVMSG ##{CHANNEL} :(.+)$/) + message = match && match[3] + if message =~ /^/ + message.strip! + message.downcase! + user = match[1] # Get username + + if message + if message.index("!") == 0 + message = "#{message.partition(" ").first}" # Get first word + + # ----- API COMMANDS ----- # + if message.include?(prefix + "uptime") + response, log_msg = Uptime(user) + elsif message.include?(prefix + "followed") + response, log_msg = Followed(user) + end + + # ----- ADMIN COMMANDS ----- # + if user == CHANNEL + admin_commands.each do |command, value| + if message.include?(prefix + command) + return value + "\r\n" + end + end + end + + # ----- COMMANDS ----- # + commands.each do |command| + if message.include?(prefix + command) + file = open("Responses/" + command + ".txt") + response = file.read + file.close + + response = "PRIVMSG ##{CHANNEL} :" + response + break + end + end + + # ----- GLOBAL BAN PREVENTION ----- # + if Time.now.to_i - timestamp > 30 # If more than 30 seconds has passed + message_count = 0 # Reset "message_count" + end + + if message_count == 0 # If "message_count" is 0 + timestamp = Time.now.to_i # Start counting to 30 again + end + message_count = message_count + 1 + # ----- GLOBAL BAN PREVENTION ----- # + + if response and message_count < max_messages + replacements.each {|replacement| response.gsub!(replacement[0], replacement[1])} + puts("[Command] ".bold.cyan + "#{user}: ".bold + "#{message}".bold.cyan) + log_msg = "[Command] #{user}: " + message + return response, log_msg + else + puts("[Command] ".bold.red + "#{user}: ".bold + "#{message}".bold.red) + end + else + puts("[Message] ".bold.green + "#{user}: ".bold + "#{message}".bold.green) + log_msg = "[Message] #{user}: " + message + return nil, log_msg + end + end + end + end +end + +# ----- TWITCH IRC CONFIRMATION MESSAGE ----- # +def Ping(line) + line.strip! + puts("-".bold.red*line.length) + puts "[Twitch] ".bold.cyan + "IRC: ".bold.yellow + line.bold.green + puts("-".bold.red*line.length) + + response = ("PONG :tmi.twitch.tv\r\n") + log_msg = "[IRC Message]: PING :tmi.twitch.tv" + return response, log_msg +end + + +# ----- API COMMANDS ----- # +def Uptime(user) + file = open("https://decapi.me/twitch/uptime?channel=#{CHANNEL}") + response = "#{CHANNEL} has been streaming for: " + file.read + response = "PRIVMSG ##{CHANNEL} :" + response + log_msg = "[Command] #{user}: !uptime" + return response, log_msg +end + +def Followed(user) + if user != CHANNEL + file = open("https://decapi.me/twitch/followage/#{CHANNEL}/#{user}") + response = file.read + if response == "Follow not found" + response = "#{user} is not following #{CHANNEL}" + else + response = "#{user} has been following #{CHANNEL} for " + response + end + response = "PRIVMSG ##{CHANNEL} :" + response + end + + log_msg = "[Command] #{user}: !followed" + return response, log_msg +end + + +# ----- CONSOLE COMMANDS ----- # +def Project(line) + line.slice!("project ") + File.write("Responses/project.txt", line) +end + +def Clear() + system "clear" or system "cls" + puts "Type \"clear\" to clear terminal" + puts "Type \"project \" to write to project file" + puts "Type \"disconnect\" to disconnect" + puts "" +end