summaryrefslogtreecommitdiff
path: root/data/rbot/plugins/markov.rb
blob: 1155b207f79e57a50b1e01e1fa2d31cb01d09e18 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class MarkovPlugin < Plugin
  def initialize
    super
    @registry.set_default([])
    @lastline = false
  end

  def markov(m, params)
    # limit to max of 50 words
    return unless @lastline
    word1, word2 = @lastline.split(/\s+/)
    output = word1 + " " + word2
    50.times do
      wordlist = @registry["#{word1}/#{word2}"]
      word3 = wordlist[rand(wordlist.length)]
      break if word3 == :nonword
      output = output + " " + word3
      word1, word2 = word2, word3
    end
    m.reply output
  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."
  end
  
  def clean_str(s)
    str = s.dup
    str.gsub!(/^.+:/, "")
    str.gsub!(/^.+,/, "")
    return str.strip
  end

  def listen(m)
    return unless m.kind_of?(PrivMessage) && m.public?
    return if m.address?
    message = clean_str m.message
    # in channel message, the kind we are interested in
    wordlist = message.split(/\s+/)
    return unless wordlist.length > 2
    @lastline = message
    word1, word2 = :nonword, :nonword
    wordlist.each do |word3|
      @registry["#{word1}/#{word2}"] = @registry["#{word1}/#{word2}"].push(word3)
      word1, word2 = word2, word3
    end
    @registry["#{word1}/#{word2}"] = [:nonword]
  end
end
plugin = MarkovPlugin.new
plugin.map 'markov'