#!/usr/bin/env python3 """ Leave a message for someone. """ import os import sys import time import threading from datetime import datetime from sqlite3 import OperationalError import config from tools.time import relativeTime from module import commands, example, hook def load_database(bot): """ Loads all entries from the 'tell' table in the bot's database and stores them in memory """ data = {} tells = bot.db.execute("SELECT * FROM tell").fetchall() for tell in tells: tellee, teller, unixtime, message = tell tell = (teller, unixtime, message) try: data[tellee].append(tell) except KeyError: data[tellee] = [tell] return data def insert_tell(bot, tellee, teller, unixtime, message): """ Inserts a new tell into the 'tell' table in the bot's database. """ bot.db.execute("INSERT INTO tell (tellee, teller, unixtime, message) " "VALUES(?,?,?,?)", (tellee, teller, unixtime, message)) def delete_tell(bot, tellee): """ Deletes a tell from the 'tell' table in the bot's database, using tellee as the key. """ bot.db.execute("DELETE FROM tell WHERE tellee = ?", (tellee,)) def setup(bot): con = bot.db.connect() cur = con.cursor() try: cur.execute("SELECT * FROM tell").fetchone() except OperationalError: cur.execute("CREATE TABLE tell(" "tellee TEXT, " "teller TEXT," "unixtime INTEGER," "message TEXT)") con.commit() con.close() bot.memory["tell"] = load_database(bot) @commands('tell') @example('.tell iou1name you broke something again.') def tell(bot, trigger): """Give someone a message the next time they're seen""" if len(trigger.args) < 2: return bot.reply("Tell whom?") if len(trigger.args) < 3: return bot.reply("Tell them what?") teller = trigger.nick tellee = trigger.args[1].rstrip('.,:;') message = ' '.join(trigger.args[2:]) if not message: return bot.reply(f"Tell {tellee} what?") if tellee == bot.nick: return bot.reply("I'm here now, you can tell me whatever you want!") if tellee == teller or tellee == "me": return bot.reply("You can tell yourself that.") unixtime = time.time() if not tellee in bot.memory['tell']: bot.memory['tell'][tellee] = [(teller, unixtime, message)] else: bot.memory['tell'][tellee].append((teller, unixtime, message)) insert_tell(bot, tellee, teller, unixtime, message) response = f"I'll pass that on when {tellee} is around." bot.reply(response) @hook(True) def tell_hook(bot, trigger): """ Hooks every line to see if a tellee has said something. If they have, it gives them all of their tells. """ if not trigger.nick in bot.memory["tell"]: return tellee = trigger.nick tells = [] for tell in bot.memory["tell"][tellee]: teller, unixtime, message = tell telldate = datetime.fromtimestamp(unixtime) reltime = relativeTime(datetime.now(), telldate) t_format = config.default_time_format telldate = datetime.strftime(telldate, t_format) msg = f"{tellee}: \x0310{message}\x03 (\x0308{teller}\x03) {telldate}" \ + f" [\x0312{reltime} ago\x03]" tells.append(msg) for tell in tells: bot.msg(tell) bot.memory["tell"].pop(tellee) delete_tell(bot, tellee)