require 'rbot/dbhash'
module Irc
+class Bot
- # this class is now used purely for upgrading from prior versions of rbot
+ # This class is now used purely for upgrading from prior versions of rbot
# the new registry is split into multiple DBHash objects, one per plugin
- class BotRegistry
+ class Registry
def initialize(bot)
@bot = bot
upgrade_data
env.close
end
end
- end
# This class provides persistent storage for plugins via a hash interface.
# in object store mode, don't make the mistake of treating it like a live
# object, e.g. (using the example above)
# @registry[:blah][:foo] = "flump"
- # will NOT modify the object in the registry - remember that BotRegistry#[]
+ # will NOT modify the object in the registry - remember that Registry#[]
# returns a Marshal.restore'd object, the object you just modified in place
# will disappear. You would need to:
# blah = @registry[:blah]
# Your plugins section of the registry is private, it has its own namespace
# (derived from the plugin's class name, so change it and lose your data).
# Calls to registry.each etc, will only iterate over your namespace.
- class BotRegistryAccessor
+ class Accessor
attr_accessor :recovery
- # plugins don't call this - a BotRegistryAccessor is created for them and
+ # plugins don't call this - a Registry::Accessor is created for them and
# is accessible via @registry.
def initialize(bot, name)
@bot = bot
@name = name.downcase
- dirs = File.dirname("#{@bot.botclass}/registry/#{@name}").split("/")
+ @filename = "#{@bot.botclass}/registry/#{@name}"
+ dirs = File.dirname(@filename).split("/")
dirs.length.times { |i|
dir = dirs[0,i+1].join("/")+"/"
unless File.exist?(dir)
Dir.mkdir(dir)
end
}
+ @filename << ".db"
@registry = nil
@default = nil
- @recover = nil
+ @recovery = nil
# debug "initializing registry accessor with name #{@name}"
end
rescue Exception => e
error _("failed to restore marshal data for #{val.inspect}, attempting recovery or fallback to default")
debug e
- if @recovery
+ if defined? @recovery and @recovery
begin
return @recovery.call(val)
rescue Exception => ee
# lookup a key in the registry
def [](key)
+ return nil unless File.exist?(@filename)
if registry.has_key?(key)
return restore(registry[key])
elsif @default != nil
# just like Hash#each
def each(&block)
+ return nil unless File.exist?(@filename)
registry.each {|key,value|
block.call(key, restore(value))
}
# just like Hash#each_key
def each_key(&block)
+ return nil unless File.exist?(@filename)
registry.each {|key, value|
block.call(key)
}
# just like Hash#each_value
def each_value(&block)
+ return nil unless File.exist?(@filename)
registry.each {|key, value|
block.call(restore(value))
}
# just like Hash#has_key?
def has_key?(key)
+ return false unless File.exist?(@filename)
return registry.has_key?(key)
end
alias include? has_key?
alias member? has_key?
+ alias key? has_key?
# just like Hash#has_both?
def has_both?(key, value)
+ return false unless File.exist?(@filename)
return registry.has_both?(key, store(value))
end
# just like Hash#has_value?
def has_value?(value)
+ return false unless File.exist?(@filename)
return registry.has_value?(store(value))
end
# just like Hash#index?
def index(value)
+ return nil unless File.exist?(@filename)
ind = registry.index(store(value))
if ind
return ind
# delete a key from the registry
def delete(key)
+ return nil unless File.exist?(@filename)
return registry.delete(key)
end
# returns a list of your keys
def keys
+ return [] unless File.exist?(@filename)
return registry.keys
end
# Return an array of all associations [key, value] in your namespace
def to_a
+ return [] unless File.exist?(@filename)
ret = Array.new
registry.each {|key, value|
ret << [key, restore(value)]
# Return an hash of all associations {key => value} in your namespace
def to_hash
+ return {} unless File.exist?(@filename)
ret = Hash.new
registry.each {|key, value|
ret[key] = restore(value)
# empties the registry (restricted to your namespace)
def clear
+ return true unless File.exist?(@filename)
registry.clear
end
alias truncate clear
# returns an array of the values in your namespace of the registry
def values
+ return [] unless File.exist?(@filename)
ret = Array.new
self.each {|k,v|
ret << restore(v)
end
def sub_registry(prefix)
- return BotRegistryAccessor.new(@bot, @name + "/" + prefix.to_s)
+ return Accessor.new(@bot, @name + "/" + prefix.to_s)
end
# returns the number of keys in your registry namespace
end
+ end
+end
end