# -*- coding: utf-8 -*- import re import irc3 from docopt import Dict from irc3.plugins.command import command from irc3.utils import IrcString from . import DatabasePlugin class Seen(DatabasePlugin): @command def seen(self, mask: IrcString, target: IrcString, args: Dict): """Get last seen date and message for a nick %%seen [] """ nick = args.get('', mask.nick) # Don't be stupid if nick == mask.nick: return '{}, look in the mirror faggot!'.format(nick) # Fetch seen from database with self.con.cursor() as cur: cur.execute(''' SELECT seen_at, message, channel FROM seens WHERE nick = lower(%s) ''', [nick]) seen = cur.fetchone() # No result if not seen: return 'I\'ve never seen {}'.format(nick) # Return result return '{nick} was last seen {delta} in {channel} saying: {message}'.format( nick=nick, # TODO: relative string delta? delta=seen['seen_at'], channel=seen['channel'], message=re.sub(r'\x01ACTION (.*)\x01', r'/me \1', seen['message']), ) @irc3.event(r'(?i)^:(?P\S+) PRIVMSG (?P\S+) :(?P.*)') def save(self, mask: str, target: str, msg: str): mask = IrcString(mask) with self.con.cursor() as cur: cur.execute(''' INSERT INTO seens (nick, host, channel, message) VALUES (lower(%s), %s, %s, %s) ON CONFLICT (nick) DO UPDATE SET host = excluded.host, channel = excluded.channel, seen_at = now(), message = excluded.message ''', [mask.nick, mask.host, target, msg]) self.con.commit()