]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/autorejoin.rb
plugin(points): new message parser, see #34
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / autorejoin.rb
index f057a6598163514b19a480746ec6494823d95dd0..751966563a6e25e5a329c7776418fe661713fe5e 100644 (file)
@@ -1,22 +1,65 @@
+#-- vim:sw=2:et
+#++
+#
+# :title: Autorejoin
+
 class AutoRejoinPlugin < Plugin
+  Config.register Config::BooleanValue.new('rejoin.insult',
+    :default => true,
+    :desc => "Determines if the bot will insult whoever kicked it, after rejoin")
+  Config.register Config::BooleanValue.new('rejoin.kick',
+    :default => false,
+    :desc => "Determines if the bot will kick whoever kicked it, after rejoin")
+  Config.register Config::ArrayValue.new('rejoin.no_kick_list',
+    :default => ["owner"],
+    :desc => "List of botusers that can kick the bot without being kicked")
+
+
+  def initialize
+    super
+    @should_kick = Hash.new
+  end
+
   def help(plugin, topic="")
     "performs an automatic rejoin if the bot is kicked from a channel"
   end
+
   def kick(m)
+    password = m.channel.mode[:k].value
+
     if m.address?
+      if @bot.config['rejoin.kick'] and not @bot.config['rejoin.no_kick_list'].include? m.source.botuser.username
+        @should_kick[m.channel.downcase] = m.sourcenick
+      end
       r = rand(10)
       if r > 0
-       @bot.timer.add_once(r, m) {|m|
-         @bot.join m.channel
-         @bot.say m.channel, @bot.lang.get("insult") % m.sourcenick
+       @bot.timer.add_once(r) {
+         @bot.join m.channel, password
+         @bot.say(m.channel, @bot.lang.get("insult") % m.sourcenick) if @bot.config['rejoin.insult']
        }
       else
-       @bot.join m.channel
-       @bot.say m.channel, @bot.lang.get("insult") % m.sourcenick
+       @bot.join m.channel, password
+       @bot.say(m.channel, @bot.lang.get("insult") % m.sourcenick) if @bot.config['rejoin.insult']
       end
     end
   end
+
+  def modechange(m)
+    # if we got opped on a channel we want to kick somebody from,
+    # do the kicking
+
+    # getting opped on a channel is a channel mode change, so bail out if this
+    # is not a channel mode change
+    return unless m.target.kind_of? Channel
+    # bail out if we are not op, too
+    return unless @bot.myself.is_op?(m.target)
+    # bail out if there's nobody to kick
+    to_kick = @should_kick.delete(m.target.downcase)
+    return unless to_kick
+    # kick the evil user that kicked us
+    @bot.kick m.target, to_kick, _("for kicking me out earlier")
+  end
+
 end
 
 plugin = AutoRejoinPlugin.new
-plugin.register("autorejoin")