diff --git a/Baxter.rb b/Baxter.rb index b4e694c..10791bc 100755 --- a/Baxter.rb +++ b/Baxter.rb @@ -4,9 +4,17 @@ require 'open-uri' require 'nokogiri' require 'parseconfig' + $config = ParseConfig.new('credentials.cfg') $urlhelpers = Hash["c" => "Core", "p" => "Portals", "n" => "NetherPortals", "s" => "SignPortals", "a" => "Adventure"] $authrequired = true + +$plugins = [] +Dir['./handlers/*.rb'].each do |f| + require f + $plugins << Kernel.const_get(File.basename(f, ".rb")) +end + bot = Cinch::Bot.new do configure do |c| c.server = "irc.esper.net" @@ -14,135 +22,9 @@ c.user = $config.get_value('username') c.password = $config.get_value('password') c.channels = ARGV - end - - helpers do - # https://github.com/Multiverse/Multiverse-Core/issues/354 - def issue(section, issue) - actualsection = $urlhelpers[section] - url = "https://github.com/Multiverse/Multiverse-#{actualsection}/issues/#{CGI.escape(issue)}" - begin - doc = Nokogiri::HTML(open(url)) - rescue OpenURI::HTTPError - return "Sorry, issue ##{issue} didn't exist on #{actualsection}!" - end - return url - end - def wiki(sections, search) - actualresults = [] - sections.each do |section| - actualsection = $urlhelpers[section] - url = "https://github.com/Multiverse/Multiverse-#{actualsection}/wiki/_pages" - doc = Nokogiri::HTML(open(url)) - if doc == nil - return "Couldn't find the #{actualsection} wiki!!!" - end - things = doc.xpath("//div[@id='template']//ul//li//a") - pagelist = things.map{|link| [link.children.text, link['href']]} - pagelist.each do |result| - if(result[0].downcase.include?(CGI.escape(search))) - actualresults<<"http://github.com" + result[1] - end - end - end - if actualresults.count > 3 - return actualresults[0, 5]<<"..." - elsif actualresults.count == 0 - return ["No results found :("] - end - return actualresults - end - - def latest(plugins) - if plugins == nil - plugins = ["c", "p", "n", "s", "a"] - end - results = "" - plugins.each do |plugin| - actual = $urlhelpers[plugin] - url = "http://ci.onarandombox.com/job/Multiverse-#{actual}/lastSuccessfulBuild/" - doc = Nokogiri::HTML(open(url)) - results<<"#{actual} " + doc.xpath("//h1").first.text.strip.gsub(/\s+\(.*\)/, ", ") - end - return results[0..-3] - end - end - # TODO: Move these to a file - on :message, /^wiki$/i do |m| - if m.channel.opped?(m.user) || m.channel.voiced?(m.user) - m.reply "https://github.com/Multiverse/Multiverse-Core/wiki/" - end - end - - on :message, /^ci$/i do |m| - if m.channel.opped?(m.user) || m.channel.voiced?(m.user) - m.reply "http://ci.onarandombox.com/job/Multiverse-Core" - end - end - - on :message, /^forum$/i do |m| - if m.channel.opped?(m.user) || m.channel.voiced?(m.user) - m.reply "http://forums.bukkit.org/threads/3707/page-9999" - end - end - - on :message, /^latest$/i do |m| - if m.channel.opped?(m.user) || m.channel.voiced?(m.user) - m.reply(latest(nil)) - end - end - - on :message, "fish" do |m| - if m.user.authname == "fernferret" - m.reply "Hello master Fern..." - bot.logger.debug m.user - end - end - - on :message, /(hello|hi|greetings)\s*baxter/i do |m| - if m.channel.opped?(m.user) || m.channel.voiced?(m.user) - greetings = ["Hello", "Bonjour", "Hi", "Aloha", "Sup"] - m.reply(greetings[rand(greetings.size)] + " #{m.user.nick}!") - end - end - - on :message, "help" do |m| - m.user.send("Hi, My name is Baxter and I'm a super helpful bot.") - m.user.send("I'm here to help, but I'm currently being developed.") - m.user.send("Only OPs and VOICEs in #multiverse can use me for now!") - end - - on :message, /!issue-?([cpnsa])\s?#(\d+)/i do |m, type, issue| - if m.user.authname == "fernferret" - m.reply "Hello master Fern..." - m.reply(issue(type, issue)) - elsif m.channel.opped?(m.user) - m.reply "Hello cool person #{m.user.nick}!" - m.reply(issue(type, issue)) - elsif m.channel.voiced?(m.user) - m.reply "Hello super person #{m.user.nick}!" - m.reply(issue(type, issue)) - end - end - - on :message, /!wiki-?([cpnsa])\s?:(.+)/i do |m, type, page| - if m.channel.opped?(m.user) || m.channel.voiced?(m.user) - wikiresults = wiki([type], page) - wikiresults.each do |result| - m.reply(result) - end - end - end - - on :message, /!wiki\s?:(.+)/i do |m, page| - if m.channel.opped?(m.user) || m.channel.voiced?(m.user) - wikiresults = wiki(["c", "p", "n", "s"], page) - wikiresults.each do |result| - m.reply(result) - end - end + + c.plugins.plugins = $plugins end end bot.start - diff --git a/handlers/CI.rb b/handlers/CI.rb new file mode 100644 index 0000000..fcc7e07 --- /dev/null +++ b/handlers/CI.rb @@ -0,0 +1,11 @@ +class CI + include Cinch::Plugin + + match /ci$/ + + def execute(m) + if m.channel.opped?(m.user) || m.channel.voiced?(m.user) + m.reply "http://ci.onarandombox.com/job/Multiverse-Core" + end + end +end diff --git a/handlers/CoreWiki.rb b/handlers/CoreWiki.rb new file mode 100644 index 0000000..34ec35e --- /dev/null +++ b/handlers/CoreWiki.rb @@ -0,0 +1,11 @@ +class CoreWiki + include Cinch::Plugin + + match /wiki$/ + + def execute(m) + if m.channel.opped?(m.user) || m.channel.voiced?(m.user) + m.reply "https://github.com/Multiverse/Multiverse-Core/wiki/" + end + end +end diff --git a/handlers/Forum.rb b/handlers/Forum.rb new file mode 100644 index 0000000..f7fb1bc --- /dev/null +++ b/handlers/Forum.rb @@ -0,0 +1,11 @@ +class Forum + include Cinch::Plugin + + match /forum$/ + + def execute(m) + if m.channel.opped?(m.user) || m.channel.voiced?(m.user) + m.reply "http://forums.bukkit.org/threads/3707/page-9999" + end + end +end diff --git a/handlers/Greetings.rb b/handlers/Greetings.rb new file mode 100644 index 0000000..2e7cca3 --- /dev/null +++ b/handlers/Greetings.rb @@ -0,0 +1,12 @@ +class Greetings + include Cinch::Plugin + + match /(hello|hi|greetings)\s*baxter/i + + def execute(m) + if m.channel.opped?(m.user) || m.channel.voiced?(m.user) + greetings = ["Hello", "Bonjour", "Hi", "Aloha", "Sup"] + m.reply(greetings[rand(greetings.size)] + " #{m.user.nick}!") + end + end +end diff --git a/handlers/Help.rb b/handlers/Help.rb new file mode 100644 index 0000000..482a30b --- /dev/null +++ b/handlers/Help.rb @@ -0,0 +1,11 @@ +class Help + include Cinch::Plugin + + match "help" + + def execute(m) + m.user.send("Hi, My name is Baxter and I'm a super helpful bot.") + m.user.send("I'm here to help, but I'm currently being developed.") + m.user.send("Only OPs and VOICEs in #multiverse can use me for now!") + end +end diff --git a/handlers/Issue.rb b/handlers/Issue.rb new file mode 100644 index 0000000..9351e95 --- /dev/null +++ b/handlers/Issue.rb @@ -0,0 +1,27 @@ +class Issue + include Cinch::Plugin + + match /issue-?([cpnsa])\s?#(\d+)/i + + def issue(section, issue) + actualsection = $urlhelpers[section] + url = "https://github.com/Multiverse/Multiverse-#{actualsection}/issues/#{CGI.escape(issue)}" + begin + doc = Nokogiri::HTML(open(url)) + rescue OpenURI::HTTPError + return "Sorry, issue ##{issue} didn't exist on #{actualsection}!" + end + return url + end + + def execute(m, type, issue) + if m.user.authname == "fernferret" + m.reply "Hello master Fern..." + m.reply(self.issue(type, issue)) + elsif m.channel.opped?(m.user) + m.reply(self.issue(type, issue)) + elsif m.channel.voiced?(m.user) + m.reply(self.issue(type, issue)) + end + end +end diff --git a/handlers/Latest.rb b/handlers/Latest.rb new file mode 100644 index 0000000..108845c --- /dev/null +++ b/handlers/Latest.rb @@ -0,0 +1,25 @@ +class Latest + include Cinch::Plugin + + match /latest$/i + + def latest(plugins) + if plugins == nil + plugins = ["c", "p", "n", "s", "a"] + end + results = "" + plugins.each do |plugin| + actual = $urlhelpers[plugin] + url = "http://ci.onarandombox.com/job/Multiverse-#{actual}/lastSuccessfulBuild/" + doc = Nokogiri::HTML(open(url)) + results<<"#{actual} " + doc.xpath("//h1").first.text.strip.gsub(/\s+\(.*\)/, ", ") + end + return results[0..-3] + end + + def execute(m) + if m.channel.opped?(m.user) || m.channel.voiced?(m.user) + m.reply(self.latest(nil)) + end + end +end diff --git a/handlers/Wiki.rb b/handlers/Wiki.rb new file mode 100644 index 0000000..d7b1025 --- /dev/null +++ b/handlers/Wiki.rb @@ -0,0 +1,41 @@ +class Wiki + include Cinch::Plugin + + match /wiki(?:-?([cpnsa]))?\s?:(.+)/i + + def wiki(sections, search) + actualresults = [] + sections.each do |section| + actualsection = $urlhelpers[section] + url = "https://github.com/Multiverse/Multiverse-#{actualsection}/wiki/_pages" + doc = Nokogiri::HTML(open(url)) + if doc == nil + return ["Couldn't find the #{actualsection} wiki!!!"] + end + things = doc.xpath("//div[@id='wiki-content']//ul//li//a") + pagelist = things.map{|link| [link.children.text, link['href']]} + pagelist.each do |result| + if(result[0].downcase.include?(CGI.escape(search))) + actualresults<<"http://github.com" + result[1] + end + end + end + if actualresults.count > 3 + return actualresults[0, 5]<<"..." + elsif actualresults.count == 0 + return ["No results found :("] + end + return actualresults + end + + def execute(m, type, page) + type = (type.nil? && ["c", "p", "n", "s"]) || [type] + self.bot.logger.debug type + if m.channel.opped?(m.user) || m.channel.voiced?(m.user) + wikiresults = self.wiki(type, page) + wikiresults.each do |result| + m.reply(result) + end + end + end +end