X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=data%2Frbot%2Fplugins%2Fmarkov.rb;h=deeb9cae4cb3bdbdf0b67d306b7a9729bbefa3c6;hb=57f03b3cd65ff75684e929553d8a3d64713afd28;hp=e85664f39194eeb1300f23ee663c4257365e4264;hpb=221624ad01da6df33b6aa81c3cbd42cc380ac45d;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/data/rbot/plugins/markov.rb b/data/rbot/plugins/markov.rb old mode 100644 new mode 100755 index e85664f3..deeb9cae --- a/data/rbot/plugins/markov.rb +++ b/data/rbot/plugins/markov.rb @@ -111,7 +111,34 @@ class MarkovPlugin < Plugin end def help(plugin, topic="") - "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: 'markov' to attempt to say something relevant to the last line of chat, if it can. other options to markov: 'ignore' => ignore a hostmask (accept no input), 'status' => show current status, 'probability []' => set the % chance of rbot responding to input, or display the current probability, 'chat' => try and say something intelligent, 'chat about ' => riff on a word pair (if possible)" + topic, subtopic = topic.split + + case topic + when "ignore" + case subtopic + when "add" + "markov ignore add => ignore a hostmask or a channel" + when "list" + "markov ignore list => show ignored hostmasks and channels" + when "remove" + "markov ignore remove => unignore a hostmask or channel" + else + "ignore hostmasks or channels -- topics: add, remove, list" + end + when "status" + "markov status => show if markov is enabled, probability and amount of messages in queue for learning" + when "probability" + "markov probability [] => set the % chance of rbot responding to input, or display the current probability" + when "chat" + case subtopic + when "about" + "markov chat about [] => talk about or riff on a word pair (if possible)" + else + "markov chat => try to say something intelligent" + end + 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, status, probability, chat, chat about" + end end def clean_str(s) @@ -155,25 +182,25 @@ class MarkovPlugin < Plugin s = @bot.config['markov.ignore'] s.delete user @bot.config['ignore'] = s - m.reply "#{user} removed" + m.reply _("%{u} removed") % { :u => user } else - m.reply "not found in list" + m.reply _("not found in list") end when 'add': if user if @bot.config['markov.ignore'].include?(user) - m.reply "#{user} already in list" + m.reply _("%{u} already in list") % { :u => user } else @bot.config['markov.ignore'] = @bot.config['markov.ignore'].push user - m.reply "#{user} added to markov ignore list" + m.reply _("%{u} added to markov ignore list") % { :u => user } end else - m.reply "give the name of a person or channel to ignore" + m.reply _("give the name of a person or channel to ignore") end when 'list': - m.reply "I'm ignoring #{@bot.config['markov.ignore'].join(", ")}" + m.reply _("I'm ignoring %{ignored}") % { :ignored => @bot.config['markov.ignore'].join(", ") } else - m.reply "have markov ignore the input from a hostmask or a channel. usage: markov ignore add ; markov ignore remove ; markov ignore list" + m.reply _("have markov ignore the input from a hostmask or a channel. usage: markov ignore add ; markov ignore remove ; markov ignore list") end end @@ -227,7 +254,7 @@ class MarkovPlugin < Plugin if line and line != [params[:seed1], params[:seed2]].compact.join(" ") m.reply line else - m.reply "I can't :(" + m.reply _("I can't :(") end end @@ -246,7 +273,7 @@ class MarkovPlugin < Plugin if output.length > 1 m.reply output.join(" ") else - m.reply "I can't :(" + m.reply _("I can't :(") end end @@ -281,6 +308,71 @@ class MarkovPlugin < Plugin k = "#{word1} #{word2}" @registry[k] = @registry[k].push(:nonword) end + + # TODO allow learning from URLs + def learn_from(m, params) + begin + path = params[:file] + file = File.open(path, "r") + pattern = params[:pattern].empty? ? nil : Regexp.new(params[:pattern].to_s) + rescue Errno::ENOENT + m.reply _("no such file") + return + end + + if file.eof? + m.reply _("the file is empty!") + return + end + + if params[:testing] + lines = [] + range = case params[:lines] + when /^\d+\.\.\d+$/ + Range.new(*params[:lines].split("..").map { |e| e.to_i }) + when /^\d+$/ + Range.new(1, params[:lines].to_i) + else + Range.new(1, [@bot.config['send.max_lines'], 3].max) + end + + file.each do |line| + next unless file.lineno >= range.begin + lines << line.chomp + break if file.lineno == range.end + end + + lines = lines.map do |l| + pattern ? l.scan(pattern).to_s : l + end.reject { |e| e.empty? } + + if pattern + unless lines.empty? + m.reply _("example matches for that pattern at lines %{range} include: %{lines}") % { + :lines => lines.map { |e| Underline+e+Underline }.join(", "), + :range => range.to_s + } + else + m.reply _("the pattern doesn't match anything at lines %{range}") % { + :range => range.to_s + } + end + else + m.reply _("learning from the file without a pattern would learn, for example: ") + lines.each { |l| m.reply l } + end + + return + end + + if pattern + file.each { |l| learn(l.scan(pattern).to_s) } + else + file.each { |l| learn(l.chomp) } + end + + m.okay + end end plugin = MarkovPlugin.new @@ -294,7 +386,12 @@ plugin.map 'chat about :seed1 [:seed2]', :action => "chat" plugin.map 'chat', :action => "rand_chat" plugin.map 'markov probability [:probability]', :action => "probability", :requirements => {:probability => /^\d+%?$/} +plugin.map 'markov learn from :file [:testing [:lines lines]] [using pattern *pattern]', :action => "learn_from", :thread => true, + :requirements => { + :testing => /^testing$/, + :lines => /^(?:\d+\.\.\d+|\d+)$/ } plugin.default_auth('ignore', false) plugin.default_auth('probability', false) +plugin.default_auth('learn', false)