]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/topic.rb
plugin(quotes): use registry for storage see #42
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / topic.rb
old mode 100755 (executable)
new mode 100644 (file)
index e57c0e8..672bf82
@@ -1,4 +1,12 @@
-# Author: Giuseppe "Oblomov" Bilotta <giuseppe.bilotta@gmail.com>
+#-- vim:sw=2:et
+#++
+#
+# :title: Topic manipulation plugin for rbot
+#
+# Author:: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
+# Copyright:: (C) 2006-2007 Giuseppe Bilotta
+# License:: GPL v2
+#
 # Add a bunch of topic manipulation features
 
 class TopicPlugin < Plugin
@@ -31,8 +39,10 @@ class TopicPlugin < Plugin
         return "topic clear => clears the topic"
       when "set"
         return "topic set <text> => sets the topic to <text>"
+      when "undo"
+        return "topic undo => undoes the latest change to the topic"
       else
-        return "topic add(at)|prepend|del(ete)|replace|sep(arator)|learn|restore|clear|set: " + \
+        return "topic add(at)|prepend|del(ete)|replace|sep(arator)|learn|restore|clear|set|undo: " + \
                "manipulate the topic of the current channel; use topic <#channel> <command> " + \
                "for private addressing"
       end
@@ -88,12 +98,15 @@ class TopicPlugin < Plugin
       end
     when 'restore'
       restoretopic(m, ch)
+    when 'undo'
+      undotopic(m, ch)
     else
       m.reply 'unknown command'
     end
   end
 
   def topicsep(m, ch, txt)
+    return if !@bot.auth.allow?("topic::edit::separator", m.source, m.replyto)
     if txt
       sep = txt.strip
       if sep != ""
@@ -120,7 +133,7 @@ class TopicPlugin < Plugin
 
     if sep != oldsep and topicarray.length > 0
       newtopic = topicarray.join(" #{sep} ")
-      @bot.topic ch, newtopic
+      @bot.topic ch, newtopic if newtopic != topic
     end
 
     data[:separator] = sep
@@ -140,13 +153,14 @@ class TopicPlugin < Plugin
     return @separator
   end
 
-  def topicaddat(m, channel, num, txt)
-    sep = getsep(channel)
-    topic = channel.topic.to_s
+  def topicaddat(m, ch, num, txt)
+    return if !@bot.auth.allow?("topic::edit::add", m.source, m.replyto)
+    sep = getsep(ch)
+    topic = ch.topic.text
     topicarray = topic.split(/\s+#{Regexp.escape(sep)}\s*/)
     topicarray.insert(num, txt)
     newtopic = topicarray.join(" #{sep} ")
-    @bot.topic channel, newtopic
+    changetopic(m, ch, newtopic)
   end
 
   def topicappend(m, ch, txt)
@@ -157,19 +171,20 @@ class TopicPlugin < Plugin
     topicaddat(m, ch, 0, txt)
   end
 
-  def topicdel(m, channel, num)
-    sep = getsep(channel)
-    topic = channel.topic.to_s
+  def topicdel(m, ch, num)
+    return if !@bot.auth.allow?("topic::edit::del", m.source, m.replyto)
+    sep = getsep(ch)
+    topic = ch.topic.text
     topicarray = topic.split(/\s+#{Regexp.escape(sep)}\s*/)
     topicarray.delete_at(num)
     newtopic = topicarray.join(" #{sep} ")
-    @bot.topic channel, newtopic
+    changetopic(m, ch, newtopic)
   end
 
-  def learntopic(m, channel)
-    return if !@bot.auth.allow?("learntopic", m.source, m.replyto)
-    topic = channel.topic.to_s
-    k = channel.downcase
+  def learntopic(m, ch)
+    return if !@bot.auth.allow?("topic::store::store", m.source, m.replyto)
+    topic = ch.topic.text
+    k = ch.downcase
     if @registry.has_key?(k)
       data = @registry[k]
     else
@@ -180,37 +195,66 @@ class TopicPlugin < Plugin
     m.okay
   end
 
-  def replacetopic(m, channel, num, txt)
-    return if !@bot.auth.allow?("topic", m.source, m.replyto)
-    sep = getsep(channel)
-    topic = @bot.channels[channel].topic.to_s
+  def replacetopic(m, ch, num, txt)
+    return if !@bot.auth.allow?("topic::edit::replace", m.source, m.replyto)
+    sep = getsep(ch)
+    topic = ch.topic.text
     topicarray = topic.split(/\s+#{Regexp.escape(sep)}\s*/)
     topicarray[num] = txt
     newtopic = topicarray.join(" #{sep} ")
-    @bot.topic channel, newtopic
+    changetopic(m, ch, newtopic)
   end
 
-  def restoretopic(m, channel)
-    return if !@bot.auth.allow?("restoretopic", m.source, m.replyto)
-    k = channel.downcase
+  def restoretopic(m, ch)
+    return if !@bot.auth.allow?("topic::store::restore", m.source, m.replyto)
+    k = ch.downcase
     if @registry.has_key?(k) && @registry[k].has_key?(:topic)
       topic = @registry[k][:topic]
-      @bot.topic channel, topic
+      topicset(m, ch, topic)
+    else
+      m.reply "I don't remember any topic for #{ch}"
+    end
+  end
+
+  def topicset(m, ch, text)
+    return if !@bot.auth.allow?("topic::edit::replace", m.source, m.replyto)
+    changetopic(m, ch, text)
+  end
+
+  # This method changes the topic on channel +ch+ to +text+, storing
+  # the previous topic for undo
+  def changetopic(m, ch, text)
+    k = ch.downcase
+    if @registry.has_key?(k)
+      data = @registry[k]
     else
-      m.reply "I don't remember any topic for this channel"
+      data = Hash.new
     end
+
+    data[:oldtopic] = ch.topic.text
+    @registry[k] = data
+
+    @bot.topic ch, text
   end
 
-  def topicset(m, channel, text)
-    return if !@bot.auth.allow?("topic", m.source, m.replyto)
-    @bot.topic channel, text
+  def undotopic(m, ch)
+    k = ch.downcase
+    if @registry.has_key?(k)
+      data = @registry[k]
+      if data.has_key?(:oldtopic)
+        changetopic(m, ch, data[:oldtopic].dup)
+        return
+      end
+    end
+
+    m.reply "No recent changes were recorded for #{ch}"
   end
 
 end
 plugin = TopicPlugin.new
 
-plugin.map 'topic :command *text', :action => 'handletopic', :public => true, :private => false
-plugin.map 'topic :channel :command *text', :action => 'handletopic', :public => false, :private => true
+plugin.map 'topic :command [*text]', :action => 'handletopic', :public => true, :private => false
+plugin.map 'topic :channel :command [*text]', :action => 'handletopic', :public => false, :private => true
 
 plugin.default_auth('*', false)