X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=data%2Frbot%2Fplugins%2Fmarkov.rb;h=abb10172d639db03f91e98386285c40bfdb6b5ef;hb=90656f4203a0a989b6fb110d4a07598dd186b84c;hp=c574fd4b859b7640b5ca689742953b429da54c1e;hpb=8730fade6a8285a747367deef652b20370dfe83b;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/data/rbot/plugins/markov.rb b/data/rbot/plugins/markov.rb old mode 100755 new mode 100644 index c574fd4b..abb10172 --- a/data/rbot/plugins/markov.rb +++ b/data/rbot/plugins/markov.rb @@ -32,7 +32,7 @@ class MarkovPlugin < Plugin :validate => Proc.new { |v| v >= 0 }, :desc => "Time the learning thread spends sleeping after learning a line. If set to zero, learning from files can be very CPU intensive, but also faster.") Config.register Config::IntegerValue.new('markov.delay', - :default => true, + :default => 5, :validate => Proc.new { |v| v >= 0 }, :desc => "Wait short time before contributing to conversation.") Config.register Config::IntegerValue.new('markov.answer_addressed', @@ -183,6 +183,9 @@ class MarkovPlugin < Plugin @upgrade_queue.push nil @upgrade_thread = Thread.new do + @registry.recovery = Proc.new { |val| + return [val] + } logfile = File.open(@bot.path('markov-conversion.log'), 'a') logfile.puts "=== conversion thread started #{Time.now} ===" while k = @upgrade_queue.pop @@ -199,6 +202,7 @@ class MarkovPlugin < Plugin end logfile.puts "=== conversion thread stopped #{Time.now} ===" logfile.close + @registry.recovery = nil end @upgrade_thread.priority = -1 end @@ -253,9 +257,13 @@ class MarkovPlugin < Plugin end debug 'closing learning thread' + @learning_queue.clear @learning_queue.push nil @learning_thread.join debug 'learning thread closed' + @chains.close + @rchains.close + super end # pick a word from the registry using the pair as key. @@ -292,15 +300,15 @@ class MarkovPlugin < Plugin output = word1 keys = [] @chains.each_key(output) do |key| - if key.downcase.include? output - keys << key - else - break - end + if key.downcase.include? output + keys << key + else + break + end end return nil if keys.empty? output = keys[rand(keys.size)].split(/ /) - end + end output = output.split(/ /) unless output.is_a? Array input = [word1, word2] while output.length < @bot.config['markov.max_words'] and (output.first != MARKER or output.last != MARKER) do @@ -315,8 +323,8 @@ class MarkovPlugin < Plugin if output == input nil else - output.join(" ") - end + output.join(" ") + end end def help(plugin, topic="") @@ -358,14 +366,21 @@ class MarkovPlugin < Plugin else "markov chat => try to say something intelligent" end + when "learn" + ["markov learn from [testing [ lines]] [using pattern ]:", + "learn from the text in the specified , optionally using the given to filter the text.", + "you can sample what would be learned by specifying 'testing lines'"].join(' ') else - "markov plugin: listens to chat to build a markov chain, with which it can (perhaps) attempt to (inanely) contribute to 'discussion'. Sort of.. Will get a *lot* better after listening to a lot of chat. Usage: 'chat' to attempt to say something relevant to the last line of chat, if it can -- help topics: ignore, readonly, delay, status, probability, chat, chat about" + "markov plugin: listens to chat to build a markov chain, with which it can (perhaps) attempt to (inanely) contribute to 'discussion'. Sort of.. Will get a *lot* better after listening to a lot of chat. Usage: 'chat' to attempt to say something relevant to the last line of chat, if it can -- help topics: ignore, readonly, delay, status, probability, chat, chat about, learn" end end - def clean_str(s) - str = s.dup - str.gsub!(/^\S+[:,;]/, "") + def clean_message(m) + str = m.plainmessage.dup + str =~ /^(\S+)([:,;])/ + if $1 and m.target.is_a? Irc::Channel and m.target.user_nicks.include? $1.downcase + str.gsub!(/^(\S+)([:,;])\s+/, "") + end str.gsub!(/\s{2,}/, ' ') # fix for two or more spaces return str.strip end @@ -376,7 +391,7 @@ class MarkovPlugin < Plugin def status(m,params) if @bot.config['markov.enabled'] - reply = _("markov is currently enabled, %{p}% chance of chipping in") % { :p => probability? } + reply = _("markov is currently enabled, %{p}%% chance of chipping in") % { :p => probability? } l = @learning_queue.length reply << (_(", %{l} messages in queue") % {:l => l}) if l > 0 l = @upgrade_queue.length @@ -479,7 +494,7 @@ class MarkovPlugin < Plugin @bot.config['markov.probability'] = params[:probability].to_i m.okay else - m.reply _("markov has a %{prob}% chance of chipping in") % { :prob => probability? } + m.reply _("markov has a %{prob}%% chance of chipping in") % { :prob => probability? } end end @@ -488,9 +503,9 @@ class MarkovPlugin < Plugin m.okay end - def should_talk + def should_talk(m) return false unless @bot.config['markov.enabled'] - prob = probability? + prob = m.address? ? @bot.config['markov.answer_addressed'] : probability? return true if prob > rand(100) return false end @@ -520,7 +535,7 @@ class MarkovPlugin < Plugin def reply_delay(m, line) m.replied = true if @bot.config['markov.delay'] > 0 - @bot.timer.add_once(@bot.config['markov.delay']) { + @bot.timer.add_once(1 + rand(@bot.config['markov.delay'])) { m.reply line, :nick => false, :to => :public } else @@ -529,9 +544,9 @@ class MarkovPlugin < Plugin end def random_markov(m, message) - return unless (should_talk or (m.address? and @bot.config['markov.answer_addressed'] > rand(100))) + return unless should_talk(m) - words = clean_str(message).split(/\s+/) + words = clean_message(m).split(/\s+/) if words.length < 2 line = generate_string words.first, nil @@ -599,7 +614,7 @@ class MarkovPlugin < Plugin end random_markov(m, message) unless readonly? m or m.replied? - learn message + learn clean_message(m) end @@ -636,7 +651,7 @@ class MarkovPlugin < Plugin def learn_line(message) # debug "learning #{message.inspect}" - wordlist = clean_str(message).split(/\s+/).reject do |w| + wordlist = message.strip.split(/\s+/).reject do |w| @bot.config['markov.ignore_patterns'].map do |pat| w =~ Regexp.new(pat.to_s) end.select{|v| v}.size != 0 @@ -734,9 +749,10 @@ plugin.map 'markov enable', :action => "enable" plugin.map 'markov disable', :action => "disable" plugin.map 'markov status', :action => "status" plugin.map 'markov stats', :action => "stats" -plugin.map 'chat about :seed1 [:seed2]', :action => "chat" +plugin.map 'chat about :seed1 [:seed2]', :action => "chat", :defaults => {:seed2 => nil} plugin.map 'chat', :action => "rand_chat" plugin.map 'markov probability [:probability]', :action => "probability", + :defaults => {:probability => nil}, :requirements => {:probability => /^\d+%?$/} plugin.map 'markov learn from :file [:testing [:lines lines]] [using pattern *pattern]', :action => "learn_from", :thread => true, :requirements => {