+ def probability?
+ return @bot.config['markov.probability']
+ end
+
+ def status(m,params)
+ if @bot.config['markov.enabled']
+ m.reply "markov is currently enabled, #{probability?}% chance of chipping in"
+ else
+ m.reply "markov is currently disabled"
+ end
+ end
+
+ def ignore?(m=nil)
+ return false unless m
+ return true if m.address? or m.private?
+ @bot.config['markov.ignore'].each do |mask|
+ return true if m.channel.downcase == mask.downcase
+ return true if m.source.matches?(mask)
+ end
+ return false
+ end
+
+ def ignore(m, params)
+ action = params[:action]
+ user = params[:option]
+ case action
+ when 'remove':
+ if @bot.config['markov.ignore'].include? user
+ s = @bot.config['markov.ignore']
+ s.delete user
+ @bot.config['ignore'] = s
+ m.reply "#{user} removed"
+ else
+ m.reply "not found in list"
+ end
+ when 'add':
+ if user
+ if @bot.config['markov.ignore'].include?(user)
+ m.reply "#{user} already in list"
+ else
+ @bot.config['markov.ignore'] = @bot.config['markov.ignore'].push user
+ m.reply "#{user} added to markov ignore list"
+ end
+ else
+ 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(", ")}"
+ else
+ m.reply "have markov ignore the input from a hostmask or a channel. usage: markov ignore add <mask or channel>; markov ignore remove <mask or channel>; markov ignore list"
+ end
+ end
+
+ def enable(m, params)
+ @bot.config['markov.enabled'] = true
+ m.okay
+ end
+
+ def probability(m, params)
+ if params[:probability]
+ @bot.config['markov.probability'] = params[:probability].to_i
+ m.okay
+ else
+ m.reply _("markov has a %{prob}% chance of chipping in") % { :prob => probability? }
+ end
+ end
+
+ def disable(m, params)
+ @bot.config['markov.enabled'] = false
+ m.okay
+ end
+
+ def should_talk
+ return false unless @bot.config['markov.enabled']
+ prob = probability?
+ return true if prob > rand(100)
+ return false
+ end
+
+ def delay
+ 1 + rand(5)
+ end
+
+ def random_markov(m, message)
+ return unless should_talk
+
+ word1, word2 = message.split(/\s+/)
+ return unless word1 and word2
+ line = generate_string(word1, word2)
+ return unless line
+ # we do nothing if the line we return is just an initial substring
+ # of the line we received
+ return if message.index(line) == 0
+ @bot.timer.add_once(delay) {
+ m.reply line
+ }
+ end
+
+ def chat(m, params)
+ line = generate_string(params[:seed1], params[:seed2])
+ if line != "#{params[:seed1]} #{params[:seed2]}"
+ m.reply line
+ else
+ m.reply "I can't :("
+ end
+ end
+
+ def rand_chat(m, params)
+ # pick a random pair from the db and go from there
+ word1, word2 = :nonword, :nonword
+ output = Array.new
+ 50.times do
+ wordlist = @registry["#{word1} #{word2}"]
+ break if wordlist.empty?
+ word3 = wordlist[rand(wordlist.length)]
+ break if word3 == :nonword
+ output << word3
+ word1, word2 = word2, word3
+ end
+ if output.length > 1
+ m.reply output.join(" ")
+ else
+ m.reply "I can't :("
+ end
+ end
+
+ def message(m)
+ return if ignore? m
+