Class: UserDataModule

Inherits:
CoreBotModule
  • Object
show all
Defined in:
lib/rbot/core/userdata.rb

Overview

User data is stored in registries indexed by BotUser name and Irc::User nick. This core module takes care of handling its usage.

Instance Method Summary collapse

Constructor Details

#initializeUserDataModule

Returns a new instance of UserDataModule.



57
58
59
60
61
62
# File 'lib/rbot/core/userdata.rb', line 57

def initialize
  super
  @ircuser = @registry.sub_registry('ircuser')
  @transient = @registry.sub_registry('transient')
  @botuser = @registry.sub_registry('botuser')
end

Instance Method Details

#delete_data(user, *keys) ⇒ Object



148
149
150
151
152
153
154
# File 'lib/rbot/core/userdata.rb', line 148

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

#event_botuser(action, opts = {}) ⇒ Object

TODO FIXME not yet: are we going to allow non-string values for data? if so, this can’t work …

def handle_set(m, params)

user = m.server.get_user(params[:nick]) || m.source
key = params[:key].intern
data = params[:data].to_s

end



183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
# File 'lib/rbot/core/userdata.rb', line 183

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

#get_data(user, key = nil) ⇒ Object



91
92
93
94
95
96
# File 'lib/rbot/core/userdata.rb', line 91

def get_data(user, key=nil)
  h = get_data_hash(user)
  debug h
  return h if key.nil?
  return h[key]
end

#get_data_hash(user, opts = {}) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/rbot/core/userdata.rb', line 64

def get_data_hash(user, opts={})
  plain = opts[:plain]
  iu = user.to_irc_user
  bu = iu.botuser

  ih = @ircuser[iu.nick] || {}

  if bu.default?
    return ih
  elsif bu.transient?
    bh = @transient[bu.netmasks.first.fullform] || {}
  else
    bh = @botuser[bu.username] || {}
  end
  ih.merge!(bh)

  unless plain
    class << ih
      alias :single_retrieve :[]
      alias :single_assign :[]=
        include DottedIndex
    end
  end

  return ih
end

#handle_get(m, params) ⇒ Object



156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# File 'lib/rbot/core/userdata.rb', line 156

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}") % {
      :key => key,
      :user => user.nick,
      :data => data
    })
  else
    m.reply(_("sorry, no %{key} data for %{user}") % {
      :key => key,
      :user => user.nick,
    })
  end
end

#set_data(user, key, value = nil, &block) ⇒ Object



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/rbot/core/userdata.rb', line 117

def set_data(user, key, value=nil, &block)
  h = get_data_hash(user)
  debug h

  ret = value

  if not block_given?
    h[key] = value
  else
    if value and not h.has_key?(key)
      h[key] = value
    end
    ret = yield h[key]
  end
  debug ret

  set_data_hash(user, h)

  return ret
end

#set_data_hash(user, hh) ⇒ Object



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/rbot/core/userdata.rb', line 98

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

#with_data(user) {|h| ... } ⇒ Object

Yields:

  • (h)


138
139
140
141
142
143
144
145
146
# File 'lib/rbot/core/userdata.rb', line 138

def with_data(user, &block)
  h = get_data_hash(user)
  debug h
  yield h

  set_data_hash(user, h)

  return h
end