diff --git a/tell.py b/tell.py index fef71c6..ebc0f76 100755 --- a/tell.py +++ b/tell.py @@ -5,12 +5,16 @@ Copyright 2013, sfan5 """ import random -from tools import deprecated from thread import start_new_thread, allocate_lock import sqlite3 +import time +import hashlib tell_list = [] -telldb_lock = allocate_lock() +tell_pending = [] +tell_lastdiskwrite = 0 +tell_lastlisthash = '' +tell_diskwriteinterval = 60 # seconds def tell(phenny, input): for x in phenny.bot.commands["high"].values(): @@ -25,26 +29,18 @@ def tell(phenny, input): teller = input.nick target = arg.split(" ")[0] text = " ".join(arg.split(" ")[1:]) - d = (teller, target, text) if target.lower() == teller.lower(): return phenny.say("You can tell that to yourself") if target.lower() == phenny.nick.lower(): return phenny.say("I'm not dumb, you know?") - telldb_lock.acquire() - tell_list.append(d) - db = sqlite3.connect("tell.sqlite") - c = db.cursor() - c.execute("INSERT INTO tell VALUES (?,?,?)", d) - c.close() - db.commit() - db.close() - telldb_lock.release() + d = (teller, target, text, int(time.time())) + tell_pending.append(("INSERT INTO tell (nick, tellee, msg, time) VALUES (?,?,?,?)", d)) response = "I'll pass that on when %s is around" % target rand = random.random() - if rand > 0.99: response = "yeah, yeah" - elif rand > 0.9: response = "yeah, sure, whatever" + if rand > 0.75: response = "yeah, yeah" + elif rand > 0.85: response = "yeah, sure, whatever" phenny.reply(response) @@ -52,18 +48,26 @@ tell.commands = ["tell"] def checktell(phenny, input): for e in tell_list: - if e[1].lower() == input.nick.lower(): - phenny.say("%s: <%s> %s" % (input.nick, e[0], e[2])) - telldb_lock.acquire() + if e[2].lower() == input.nick.lower(): + phenny.say("%s: %s <%s> %s" % (input.nick, time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(e[4])), e[1], e[3])) tell_list.remove(e) - db = sqlite3.connect("tell.sqlite") - c = db.cursor() - c.execute("DELETE FROM tell WHERE nick = ? AND channel = ? AND msg = ?", e) - c.close() - db.commit() - db.close() - telldb_lock.release() + tell_pending.append(("DELETE FROM tell WHERE id = ?", (e[0],))) + break + + if time.time() - tell_diskwriteinterval > tell_lastdiskwrite: + tell_lastdiskwrite = time.time() + current_hash = hashlib.sha1(','.join(str(e[0]) for e in tell_list)).hexdigest() + if current_hash == tell_lastlisthash: return + tell_lastlisthash = current_hash + db = sqlite3.connect("tell.sqlite") + c = db.cursor() + for tr in tell_pending: + c.execute(*tr) + c.close() + db.commit() + db.close() + tell_pending = [] def note(phenny, input): if input.sender.startswith('#'): @@ -80,19 +84,18 @@ note_join.rule = r'.*' note_join.event = 'JOIN' note_join.priority = 'low' -#telldb_lock.acquire() # Just to be safe db = sqlite3.connect("tell.sqlite") c = db.cursor() -c.execute("CREATE TABLE IF NOT EXISTS tell (nick text, channel text, msg text)") -c.execute("SELECT nick, channel, msg FROM tell") +c.execute("CREATE TABLE IF NOT EXISTS tell (id INTEGER PRIMARY KEY, nick TEXT, tellee TEXT, msg TEXT, time INTEGER)") +c.execute("SELECT * FROM tell") while True: e = c.fetchone() if not e: break tell_list.append(e) c.close() +db.commit() db.close() -#telldb_lock.acquire() if __name__ == '__main__': print __doc__.strip()