#!/usr/bin/python import scanjam import asdf_db import random USERID = 412 USERNAME = "pepper" ROOM = "main" SJ = scanjam.ScanJam (USERID, USERNAME, ROOM) DB = asdf_db.db () class Talker: # initialize a new talker def __init__ (self, file, rate): self.data_file = file self.seen_file = file + ".seen" # load in the data file and the file of things we've already dumped self.dumps = self.slurp (self.data_file) self.seen = self.slurp (self.seen_file) print "slurped" # remove things we've already dumped from the queue for key in self.seen.keys(): if key in self.dumps: del self.dumps[key] # start each talker off-cycle self.rate = rate print "the rate "+str(self.rate) self.tick = random.randint (0, rate) self.on = True # consider whether to say something def consider (self): print "self.on "+str(self.on) if not self.on: return self.tick += 1 # 15% chance of dumping if self.tick > self.rate and random.randint (1, 1000) > 500: #850 # is there anything left to dump? if len(self.dumps) == 0: self.on = False print "self.on "+str(self.on) return # get a new dump newdump = random.choice (self.dumps.keys()) # store that we have dumped this already self.seen[newdump] = True del self.dumps[newdump] self.unslurp (self.seen_file, self.seen) print ">", newdump # perform the dump SJ.say (newdump) self.tick = 0 # load a flatfile into a hash (url => True) def slurp (self, file): f = open (file, "r") lines = f.readlines() f.close lookup = {} for l in lines: lookup[l.strip()] = True return lookup # save a hash into a flatfile def unslurp (self, file, lookup): f = open (file, "w") for line in lookup.keys(): f.write (line + "\n") f.close return f def store_msg (who, msg): sql = "INSERT INTO dump_msg (nick,date,who,dump) VALUES(%s,%s,%s,%s)" args = (USERNAME, asdf_db.now (), who+"@scannerjammer", msg) DB.execute (sql, args) print who, ">", msg # set up one talker for dumps, one talker for videos dump_talker = Talker ("pepper/dumps.txt", 60 * 60 * 4) video_talker = Talker ("pepper/videos.txt", 5) # deduper for messages seen_msgs = {} # poll indefinitely.. while (1): dump_talker.consider () video_talker.consider () msgs = SJ.poll () for msg in msgs: if msg['msg'] in seen_msgs: continue seen_msgs[msg['msg']] = True if USERNAME in msg['msg'].lower(): store_msg (msg['nick'], msg['msg'])