sixserv blog

welcome to teh #sixserv!

Archive for the ‘rbot’ tag

Rbot Remote

ohne Kommentare


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")

Geschrieben von apoc

15. September 2008 @ 23:14

Posted in rbot, ruby

Tagged with , , , , ,