]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - lib/rbot/core/userdata.rb
remove whitespace
[user/henk/code/ruby/rbot.git] / lib / rbot / core / userdata.rb
index 0164f659e244e5e21068b7f7a82f2ec0f7ce63a8..ced5c1e7fb0eab0bbec478edf62a275a4bc619c8 100644 (file)
@@ -4,8 +4,6 @@
 # :title: rbot user data management from IRC
 #
 # Author:: Giuseppe "Oblomov" Bilotta <giuseppe.bilotta@gmail.com>
-# Copyright:: (C) 2006,2007 Giuseppe Bilotta
-# License:: GPL v2
 
 module ::Irc
   class User
@@ -27,7 +25,7 @@ module ::Irc
     #
     # If you have to do large-scale editing of the Bot data Hash,
     # please use with_botdata.
-    # 
+    #
     def set_botdata(key, value=nil, &block)
       Irc::Utils.bot.plugins['userdata'].set_data(self, key, value, &block)
     end
@@ -40,6 +38,13 @@ module ::Irc
       Irc::Utils.bot.plugins['userdata'].with_data(self, &block)
     end
 
+    # This method removes the data associated with the key, returning
+    # the value of the deleted key.
+
+    def delete_botdata(*keys)
+      Irc::Utils.bot.plugins['userdata'].delete_data(self, *keys)
+    end
+
   end
 end
 
@@ -52,21 +57,35 @@ class UserDataModule < CoreBotModule
   def initialize
     super
     @ircuser = @registry.sub_registry('ircuser')
+    @transient = @registry.sub_registry('transient')
     @botuser = @registry.sub_registry('botuser')
   end
 
-  def get_data_hash(user)
+  def get_data_hash(user, opts={})
+    plain = opts[:plain]
     iu = user.to_irc_user
     bu = iu.botuser
 
     ih = @ircuser[iu.nick] || {}
 
-    if bu.transient? or bu.default?
+    if bu.default?
       return ih
+    elsif bu.transient?
+      bh = @transient[bu.netmasks.first.fullform] || {}
     else
       bh = @botuser[bu.username] || {}
-      return ih.merge! bh
     end
+    ih.merge!(bh)
+
+    unless plain
+      class << ih
+        alias :single_retrieve :[]
+        alias :single_assign :[]=
+          include DottedIndex
+      end
+    end
+
+    return ih
   end
 
   def get_data(user, key=nil)
@@ -76,15 +95,23 @@ class UserDataModule < CoreBotModule
     return h[key]
   end
 
-  def set_data_hash(user, h)
+  def set_data_hash(user, hh)
     iu = user.to_irc_user
     bu = iu.botuser
 
-    if bu.transient? or bu.default?
-      @ircuser[iu.nick] = h
+    # we .dup the hash to remove singleton methods
+    # and make it dump-able
+    h = hh.dup
+
+    @ircuser[iu.nick] = h
+    return h if bu.default?
+
+    if bu.transient?
+      @transient[bu.netmasks.first.fullform] = h
     else
       @botuser[bu.username] = h
     end
+    return h
   end
 
   def set_data(user, key, value=nil, &block)
@@ -118,18 +145,26 @@ class UserDataModule < CoreBotModule
     return h
   end
 
+  def delete_data(user, *keys)
+    h = get_data_hash(user)
+    debug h
+    rv = keys.map { |k| h.delete k }
+    set_data_hash(user, h)
+    rv.size == 1 ? rv.first : rv
+  end
+
   def handle_get(m, params)
     user = m.server.get_user(params[:nick]) || m.source
     key = params[:key].intern
     data = get_data(user, key)
     if data
-      m.reply (_("%{key} data for %{user}: %{data}") % {
+      m.reply(_("%{key} data for %{user}: %{data}") % {
         :key => key,
         :user => user.nick,
         :data => data
       })
     else
-      m.reply (_("sorry, no %{key} data for %{user}") % {
+      m.reply(_("sorry, no %{key} data for %{user}") % {
         :key => key,
         :user => user.nick,
       })
@@ -145,6 +180,28 @@ class UserDataModule < CoreBotModule
   #   data = params[:data].to_s
   # end
 
+  def event_botuser(action, opts={})
+    case action
+    when :copy, :rename
+      source = opts[:source]
+      return unless @botuser.key?(source)
+      dest = opts[:dest]
+      @botuser[dest] = @botuser[source].dup
+      @botuser.delete(source) if action == :rename
+    when :pre_perm
+      @permification ||= {}
+      k = [opts[:irc_user], opts[:bot_user]]
+      @permification[k] = get_data_hash(opts[:irc_user], :plain => true)
+    when :post_perm
+      @permification ||= {}
+      k = [opts[:irc_user], opts[:bot_user]]
+      if @permification.has_key?(k)
+        @botuser[opts[:bot_user]] = @permification[k]
+        @permification.delete(k)
+      end
+    end
+  end
+
 end
 
 plugin = UserDataModule.new