nxy/nxy/plugins/timer.py

63 lines
2.4 KiB
Python

# -*- coding: utf-8 -*-
from datetime import datetime, timedelta
import asyncio
from docopt import Dict as DocOptDict
from irc3.plugins.command import command
from irc3.utils import IrcString
import irc3
from . import DatabasePlugin
from ..utils import fmt, time_delta
@irc3.plugin
class Timer(DatabasePlugin):
requires = ['irc3.plugins.command',
'nxy.plugins.database']
def __init__(self, bot: irc3.IrcBot):
super().__init__(bot)
# Restore timers from database
self.cur.execute('select id, mask, channel, message, delay, until '
'from timers')
for res in self.cur.fetchall():
delta = res['until'] - datetime.utcnow()
args = (IrcString(res['mask']), res['channel'], delta,
res['message'], res['delay'], res['id'])
asyncio.ensure_future(self._timer(*args))
@command
def timer(self, mask: IrcString, channel: IrcString, args: DocOptDict):
"""Sets a timer, delay can be: s, m, h, w, mon, y(
%%timer <delay> <message>...
"""
delay = args['<delay>']
delta = time_delta(delay)
if delta:
date = datetime.utcnow() + delta
message = ' '.join(args['<message>'])
self.cur.execute('''insert into timers (mask, channel, message,
delay, until) values (?, ?, ?, ?, ?)''', [mask.nick, channel,
message, delay, date])
self.con.commit()
asyncio.ensure_future(self._timer(mask, channel, delta, message,
delay, self.cur.lastrowid))
self.bot.notice(mask.nick, 'Timer in {delay} set: {message}'
.format(delay=delay, message=message))
else:
self.bot.privmsg(channel, 'Invalid timer delay')
async def _timer(self, mask: IrcString, channel: IrcString,
delta: timedelta, message: str, delay: str, row_id: int):
"""Async function, sleeps for `delay` seconds and sends notification"""
seconds = delta.total_seconds()
if seconds > 0:
await asyncio.sleep(seconds)
text = fmt('{bold}[Timer]{reset} {nick}: {message} ({delay})',
message=message, delay=delay, nick=mask.nick)
self.bot.privmsg(channel, text)
self.cur.execute('delete from timers where id = ?', [row_id])
self.con.commit()