X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=data%2Frbot%2Fplugins%2Fkeywords.rb;h=97fe4258e862d86b8001a0fa3d413df596deb212;hb=f6ec4e09d5d309f297b4ff6fd6c65ca82c74b462;hp=0c1b35262ca693c1e265b468294f528116bc201e;hpb=73be154bcffb5039995fdf66a2ff71be6c4e25d6;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/data/rbot/plugins/keywords.rb b/data/rbot/plugins/keywords.rb index 0c1b3526..97fe4258 100644 --- a/data/rbot/plugins/keywords.rb +++ b/data/rbot/plugins/keywords.rb @@ -28,6 +28,19 @@ class Keyword 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(" | ") @@ -79,15 +92,18 @@ end # 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") + Config.register Config::ArrayValue.new('keyword.ignore_words', + :default => ["how", "that", "these", "they", "this", "what", "when", "where", "who", "why", "you"], + :desc => "A list of words that the bot should passively ignore.") # create a new KeywordPlugin instance, associated to bot +bot+ def initialize @@ -117,13 +133,6 @@ class Keywords < Plugin 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 @@ -252,6 +261,11 @@ class Keywords < Plugin return false end + # is +word+ a passively ignored keyword? + def ignored_word?(word) + @bot.config["keyword.ignore_words"].include?(word) + end + # m:: PrivMessage containing message info # key:: key being queried # quiet:: optional, if false, complain if +key+ is not found @@ -437,9 +451,45 @@ class Keywords < Plugin # 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 @@ -448,10 +498,19 @@ class Keywords < Plugin 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*$/ @@ -489,23 +548,21 @@ class Keywords < Plugin end end - def listen(m) - return if m.address? - # in channel message, not to me + def unreplied(m) # TODO option to do if(m.message =~ /^(.*)$/, ie try any line as a # keyword lookup. - if !@bot.config["keyword.address"] && m.message =~ /^(.*\S)\s*\?\s*$/ - keyword_lookup m, $1, true if @bot.auth.allow?("keyword", m.source) + if m.message =~ /^(.*\S)\s*\?\s*$/ and (m.address? or not @bot.config["keyword.address"]) + keyword_lookup m, $1, true if !ignored_word?($1) && @bot.auth.allow?("keyword", m.source) elsif @bot.config["keyword.listen"] && (m.message =~ /^(.*?)\s+(is|are)\s+(.*)$/) # TODO MUCH more selective on what's allowed here - keyword_command m, $1, $2, $3, true if @bot.auth.allow?("keycmd", m.source) + keyword_command m, $1, $2, $3, true if !ignored_word?($1) && @bot.auth.allow?("keycmd", m.source) end end end 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