rendered paste body#!/usr/bin/env pythonimport string, whrandom, sys, os, re, impcp = imp.find_module('cPickle')cPickle = imp.load_module('cPickle', cp[0], cp[1], cp[2])MAXGEN=1000 # Max number of words to generateNONWORD = '\n' # Use as start- and endmarkersSAVECOUNT = 30class MarkovChainer: def __init__(self, bot): self.bot = bot self.bot.register_handler("pubmsg", self.handle_pubmsg) self.dict = cPickle.load(open("markov.state", 'r')) self.savecounter = 0 def handle_pubmsg(self, connection, event): spoken = 0 addressed = 0 chainable = 1 whonick = self.bot.nm_to_n(event.source()) message = event.arguments()[0] target = event.target() if re.search(string.lower(self.bot._nickname), string.lower(message)): addressed = 1 if message == "%s, status?" % self.bot._nickname: connection.privmsg(target, "I know %s phrases" % str(len(self.dict.keys()))) return message = self.strip_nick(message) message = self.strip_shit(message) if chainable: self.input(message) if not spoken: splitmsg = string.split(message, ' ') try: text = string.strip(self.output(splitmsg[0], splitmsg[1])) except: text = string.strip(self.output()) if addressed: connection.privmsg(target, text) def strip_nick(self, message): return string.replace(string.strip(message), self.bot._nickname, '') def strip_shit(self, message): index = 0 for char in string.lower(message): if char in [',']: index = index + 1 else: break return string.strip(message[index:]) def input(self, originalText): word1, word2 = NONWORD, NONWORD wordList = string.split(originalText) for word3 in wordList: # Loop over rest of words if not self.dict.has_key( (word1,word2) ): self.dict[(word1,word2)] = [] #initialize to empty list self.dict[(word1, word2)].append(word3) # Add suffix for word-pair word1,word2 = word2, word3 # Shift in new words as dictionary keys self.dict[(word1,word2)] = [NONWORD] # Mark end of text self.savecounter = self.savecounter + 1 if self.savecounter >= SAVECOUNT: self.dumpdb() self.savecounter = 0 def dumpdb(self): try: os.rename("markov.state.2", "markov.state.3") except: pass try: os.rename("markov.state.1", "markov.state.2") except: pass try: os.rename("markov.state", "markov.state.1") except: pass cPickle.dump(self.dict, open("markov.state", "w")) def output(self, word1=NONWORD, word2=NONWORD): #word1,word2 = NONWORD, NONWORD # Start at beginning output = word1 + " " + word2 for i in range(MAXGEN): successorList = self.dict[(word1,word2)] word3 = whrandom.choice(successorList) if word3 == NONWORD: break output = output + " " + word3 word1, word2 = word2, word3 return output