You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

146 lines
3.9 KiB

9 years ago
#!/usr/bin/env python
""" - Phenny Seen Module
Copyright 2013, sfan5
import random
import sqlite3
import time
import calendar
import hashlib
9 years ago
DBPATH = "data/tell.sqlite"
9 years ago
tell_list = []
tell_pending = []
def tell_diskwr():
global tell_pending, tell_list
db = sqlite3.connect(DBPATH)
c = db.cursor()
for tr in tell_pending:
8 years ago
if tr[0] == "del":
r = c.execute("DELETE FROM tell WHERE id = ?", (tr[1], )).rowcount
if r != 1:
log.log("warning", "[tell] could not remove entry id %d from db?!?" % (tr[1], ))
log.log("event", "[tell] removed entry id %d from db" % (tr[1], ))
8 years ago
elif tr[0] == "add":
c.execute("INSERT INTO tell (nick, tellee, msg, time) VALUES (?,?,?,?)", tr[1])
tell_list.append((c.lastrowid, ) + tr[1]) # We actually insert the entry into the list here
log.log("event", "[tell] added entry %r to db, id=%d" % (tr[1], c.lastrowid))
8 years ago
log.log("warning", "[tell] unknown action type %s" % (tr[0], ))
tell_pending = []
9 years ago
class TellApi:
# Tell <tellee> <text> (from <teller>)
def tell(teller, tellee, text):
d = (teller, tellee, text, int(calendar.timegm(time.gmtime())))
tell_pending.append(("add", d))
# We do not insert the entry into tell_list yet because we don't know which id it will have
tell_diskwr() # Write change to disk
# Get list of not yet fulfilled "tells"
# Returns [(tell_id, teller, tellee, text, unixtime), ...]
def list():
return tell_list
# Remove tell_id from database
def remove(tell_id, internal=False):
tell_pending.append(("del", tell_id))
# Find list index of the tell entry with id == tell_id
idx = next(filter(lambda x: x != -1, (i if e[0] == tell_id else -1 for i, e in enumerate(tell_list))))
del tell_list[idx]
except StopIteration:
6 years ago
log.log("warning", "[tell] could not remove entry id %d from list?!?" % (tell_id, ))
if not internal:
tell_diskwr() # Write change to disk
_export = {
'tell': TellApi,
# Can't be named "tell" because that would interfere with the tell api
def tell_cmd(phenny, input):
9 years ago
arg =
if not arg:
return phenny.reply("Need a nickname...")
if not ' ' in arg:
return phenny.reply("...and text")
teller = input.nick
target = arg.split(" ")[0]
text = " ".join(arg.split(" ")[1:])
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?")
elif target[-1] == ":":
return phenny.reply("Do not put an : at the end of nickname")
9 years ago
TellApi.tell(teller, target, text)
9 years ago
response = "I'll pass that on when %s is around" % target
rand = random.random()
if rand > 0.85: response = "yeah, sure, whatever"
elif rand > 0.75: response = "yeah, yeah"
9 years ago
tell_cmd.commands = ["tell"]
9 years ago
def checktell(phenny, input):
r = []
9 years ago
for e in tell_list:
if e[2].lower() != input.nick.lower():
phenny.say("%s: %s <%s> %s" % (
time.strftime('%b-%d %H:%M UTC', time.gmtime(e[4])),
if len(r) > 0:
for tell_id in r:
TellApi.remove(tell_id, internal=True)
tell_diskwr() # Write changes to disk
9 years ago
def note(phenny, input):
if input.sender.startswith('#'):
checktell(phenny, input)
note.rule = r'.*'
note.priority = 'low'
note.nohook = True
9 years ago
def note_join(phenny, input):
if input.sender.startswith('#'):
checktell(phenny, input)
note_join.rule = r'.*'
note_join.event = 'JOIN'
note_join.priority = 'low'
note_join.nohook = True
9 years ago
db = sqlite3.connect(DBPATH)
9 years ago
c = db.cursor()
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")
9 years ago
while True:
e = c.fetchone()
if not e:
9 years ago
if __name__ == '__main__':
8 years ago