X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=data%2Frbot%2Fplugins%2Fmarkov.rb;h=21c4d63172996f6dde039132941a13f6ab97a03e;hb=052217de30c59206d7025b582d4604557a747470;hp=574dde5713548eb43e30b434a01315980996e301;hpb=06485aeb187dde5e81204b06c8e956e7e035c323;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/data/rbot/plugins/markov.rb b/data/rbot/plugins/markov.rb index 574dde57..21c4d631 100755 --- 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', @@ -226,6 +226,8 @@ class MarkovPlugin < Plugin @chains.set_default([]) @rchains = @registry.sub_registry('v2r') @rchains.set_default([]) + @chains_mutex = Mutex.new + @rchains_mutex = Mutex.new @upgrade_queue = Queue.new @upgrade_thread = nil @@ -294,15 +296,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 @@ -317,8 +319,8 @@ class MarkovPlugin < Plugin if output == input nil else - output.join(" ") - end + output.join(" ") + end end def help(plugin, topic="") @@ -365,9 +367,12 @@ class MarkovPlugin < Plugin 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 @@ -490,9 +495,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 @@ -522,7 +527,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 @@ -531,9 +536,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 @@ -601,40 +606,44 @@ class MarkovPlugin < Plugin end random_markov(m, message) unless readonly? m or m.replied? - learn message + learn clean_message(m) end def learn_triplet(word1, word2, word3) k = "#{word1} #{word2}" rk = "#{word2} #{word3}" - total = 0 - hash = Hash.new(0) - if @chains.key? k - t2, h2 = @chains[k] - total += t2 - hash.update h2 + @chains_mutex.synchronize do + total = 0 + hash = Hash.new(0) + if @chains.key? k + t2, h2 = @chains[k] + total += t2 + hash.update h2 + end + hash[word3] += 1 + total += 1 + @chains[k] = [total, hash] end - hash[word3] += 1 - total += 1 - @chains[k] = [total, hash] - # Reverse - total = 0 - hash = Hash.new(0) - if @rchains.key? rk - t2, h2 = @rchains[rk] - total += t2 - hash.update h2 + @rchains_mutex.synchronize do + # Reverse + total = 0 + hash = Hash.new(0) + if @rchains.key? rk + t2, h2 = @rchains[rk] + total += t2 + hash.update h2 + end + hash[word1] += 1 + total += 1 + @rchains[rk] = [total, hash] end - hash[word1] += 1 - total += 1 - @rchains[rk] = [total, hash] end 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