end
end
+ # return an array of all the possible values
+ def to_factoids(key)
+ ar = Array.new
+ @values.each { |val|
+ debug "key #{key}, value #{val}"
+ vals = val.split(" or ")
+ vals.each { |v|
+ ar << "%s %s %s" % [key, @type, v]
+ }
+ }
+ return ar
+ end
+
# describe the keyword (show all values without interpolation)
def desc
@values.join(" | ")
# handle it, checks for a keyword command or lookup, otherwise the message
# is delegated to plugins
class Keywords < Plugin
- BotConfig.register BotConfigBooleanValue.new('keyword.listen',
+ Config.register Config::BooleanValue.new('keyword.listen',
:default => false,
:desc => "Should the bot listen to all chat and attempt to automatically detect keywords? (e.g. by spotting someone say 'foo is bar')")
- BotConfig.register BotConfigBooleanValue.new('keyword.address',
+ Config.register Config::BooleanValue.new('keyword.address',
:default => true,
:desc => "Should the bot require that keyword lookups are addressed to it? If not, the bot will attempt to lookup foo if someone says 'foo?' in channel")
- BotConfig.register BotConfigIntegerValue.new('keyword.search_results',
+ Config.register Config::IntegerValue.new('keyword.search_results',
:default => 3,
:desc => "How many search results to display at a time")
end
end
- # drop static keywords and reload them from files, picking up any new
- # keyword files that have been added
- def rescan
- @statickeywords = Hash.new
- scan
- end
-
# load static keywords from files, picking up any new keyword files that
# have been added
def scan
# forget one of the dynamic keywords
def keyword_forget(m, key)
- if(@keywords.has_key?(key))
- @keywords.delete(key)
- @bot.okay m.replyto
+ if @keywords.delete(key)
+ m.okay
+ else
+ m.reply _("couldn't find keyword %{key}" % { :key => key })
+ end
+ end
+
+ # low-level keyword wipe command for when forget doesn't work
+ def keyword_wipe(m, key)
+ reg = @keywords.registry
+ reg.env.begin(reg) { |t, b|
+ b.delete_if { |k, v|
+ (k == key) && (m.reply "wiping keyword #{key} with stored value #{Marshal.restore(v)}")
+ }
+ t.commit
+ }
+ m.reply "done"
+ end
+
+ # export keywords to factoids file
+ def keyword_factoids_export
+ ar = Array.new
+
+ debug @keywords.keys
+
+ @keywords.each { |k, val|
+ next unless val
+ kw = Keyword.restore(val)
+ ar |= kw.to_factoids(k)
+ }
+
+ # TODO check factoids config
+ # also TODO: runtime export
+ dir = File.join(@bot.botclass,"factoids")
+ fname = File.join(dir,"keyword_factoids.rbot")
+
+ Dir.mkdir(dir) unless FileTest.directory?(dir)
+ Utils.safe_save(fname) do |file|
+ file.puts ar
end
end
case m.plugin
when "keyword"
case m.params
+ when /^export$/
+ begin
+ keyword_factoids_export
+ m.okay
+ rescue
+ m.reply _("failed to export keywords as factoids (%{err})" % {:err => $!})
+ end
when /^set\s+(.+?)\s+(is|are)\s+(.+)$/
keyword_command(m, $1, $2, $3) if @bot.auth.allow?('keycmd', m.source, m.replyto)
when /^forget\s+(.+)$/
keyword_forget(m, $1) if @bot.auth.allow?('keycmd', m.source, m.replyto)
+ when /^wipe\s(.+)$/ # note that only one space is stripped, allowing removal of space-prefixed keywords
+ keyword_wipe(m, $1) if @bot.auth.allow?('keycmd', m.source, m.replyto)
when /^lookup\s+(.+)$/
keyword_lookup(m, $1) if @bot.auth.allow?('keyword', m.source, m.replyto)
when /^stats\s*$/
plugin = Keywords.new
plugin.register 'keyword'
-plugin.register 'forget'
-plugin.register 'tell'
-plugin.register 'learn'
+plugin.register 'forget' rescue nil
+plugin.register 'tell' rescue nil
+plugin.register 'learn' rescue nil