Archive for the ‘bot’ tag
Rbot Remote
Ich setze schon lange den grandiosen IRC-Bot “rbot” ein. Ein überaus vielseitiger und einfach zu erweiternder Bot, der dazu auch noch in meiner lieblings Script-Sprache Ruby geschrieben ist. Vielleicht komme ich dazu einige meiner Plugins, die ich für ihn geschrieben habe, hier zu Veröffentlichen.
Eines der Features von rbot welches ich erst kürzlich entdeckt habe und was absolut genial ist, ist das Rbot Remote Interface. Per Default hört der Bot nämlich auf Port 7268(127.0.0.1) und stellt dort ein DRb(Distributed Ruby) Interface zur Verfügung. Dieses erlaubt es von Außen den Bot zu steuern und beispielsweise Funktionen eines Plugins auszuführen. RbotRemote kann z.B. dazu genutzt werden bei neuen SVN-Commits im RSS Plugin das Updaten eines Commit-Feeds zu starten. Denkbar ist dies natürlich auch für neue Blog-Posts innerhalb von Wordpress etc.
Da DRb logischerweise nur für Ruby zur Verfügung steht muss bspw. eine PHP-Webapplikation ein Ruby-Skript starten welches die gewünschte Aktionen am rbot auslöst. Hier als Beispiel-Skript wird eine Nachricht an #sixserv(btw: im Freenode) gesendet:
#!/usr/bin/ruby require 'drb' rbot = DRbObject.new_with_uri("druby://localhost:7268") id = rbot.delegate(nil, "remote login owner [Owner/Auth Passwort]")[:return] rbot.delegate(id, "dispatch say #sixserv Hallo Welt!")
In /bin/rbot-remote gibt es ein ähnliches, etwas komplexeres Beispiel welches die Eingaben von stdin erwartet.
Eine weitere Möglichkeit ist wie schon erwähnt eine Methode eines Plugins zu starten. Hier ein ganz einfaches rbot-Plugin:
class SimplePlugin < Plugin def sayfoo(m, params) @bot.say '#sixserv', 'foo' if params.has_key?(:bar) then @bot.say '#sixserv', params[:bar] end end end plugin = SimplePlugin.new plugin.map 'sayfoo' plugin.map 'sayfoo :bar'
Wird die Methode extern aufgerufen kann man natürlich kein m.reply verwenden, wenn die Nachricht im Channel landen soll, ich habe das hier ganz einfach gelöst indem ich den Channel fest eingebunden habe. Hier noch das Skript welches sayfoo mit Parameter aufruft:
#!/usr/bin/ruby require 'drb' rbot = DRbObject.new_with_uri("druby://localhost:7268") id = rbot.delegate(nil, "remote login owner [Owner/Auth Passwort]")[:return] rbot.delegate(id, "dispatch sayfoo bar")