X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=lib%2Frbot%2Fcore%2Fuserdata.rb;h=ced5c1e7fb0eab0bbec478edf62a275a4bc619c8;hb=b73f06958c304dc5bc82523765f893211785f2d0;hp=85f386b28b008e8dd4a588b097a0006284790889;hpb=f22279cf33fd211baf4c3b0e89ae0037d2607d36;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/lib/rbot/core/userdata.rb b/lib/rbot/core/userdata.rb index 85f386b2..ced5c1e7 100644 --- a/lib/rbot/core/userdata.rb +++ b/lib/rbot/core/userdata.rb @@ -4,8 +4,6 @@ # :title: rbot user data management from IRC # # Author:: Giuseppe "Oblomov" Bilotta -# Copyright:: (C) 2006,2007 Giuseppe Bilotta -# License:: GPL v2 module ::Irc class User @@ -23,12 +21,30 @@ module ::Irc # _key_; if a block is passed, it will be called with the previous # _key_ value as parameter, and its return value will be stored as # the new value. If _value_ is present in the block form, it will - # be used to initialize _key_ if it's missing - # + # be used to initialize _key_ if it's missing. + # + # 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 + # This method yields the entire Bot data Hash to the block, + # and stores any changes done to it, returning a copy + # of the (changed) Hash. + # + def with_botdata(&block) + 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 @@ -41,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) @@ -65,6 +95,25 @@ class UserDataModule < CoreBotModule return h[key] end + def set_data_hash(user, hh) + iu = user.to_irc_user + bu = iu.botuser + + # 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) h = get_data_hash(user) debug h @@ -81,29 +130,41 @@ class UserDataModule < CoreBotModule end debug ret - iu = user.to_irc_user - bu = iu.botuser + set_data_hash(user, h) - if bu.transient? or bu.default? - @ircuser[iu.nick] = h - else - @botuser[bu.username] = h - end return ret end + def with_data(user, &block) + h = get_data_hash(user) + debug h + yield h + + set_data_hash(user, h) + + 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, }) @@ -119,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