foobar
This commit is contained in:
parent
ad90fefd5e
commit
3845b28e0a
|
@ -18,9 +18,9 @@
|
||||||
"nxy.plugins.bitcoin",
|
"nxy.plugins.bitcoin",
|
||||||
"nxy.plugins.ctcp",
|
"nxy.plugins.ctcp",
|
||||||
"nxy.plugins.database",
|
"nxy.plugins.database",
|
||||||
|
"nxy.plugins.futures",
|
||||||
"nxy.plugins.mcmaniac",
|
"nxy.plugins.mcmaniac",
|
||||||
"nxy.plugins.quotes",
|
"nxy.plugins.quotes",
|
||||||
"nxy.plugins.reminder",
|
|
||||||
"nxy.plugins.useless"
|
"nxy.plugins.useless"
|
||||||
],
|
],
|
||||||
"irc3.plugins.command": {
|
"irc3.plugins.command": {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from irc3.plugins.command import Commands
|
|
||||||
from irc3 import IrcBot
|
from irc3 import IrcBot
|
||||||
|
from irc3.plugins.command import Commands
|
||||||
|
|
||||||
MODULE = __name__
|
MODULE = __name__
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
import irc3
|
||||||
|
|
||||||
from docopt import Dict as DocoptDict
|
from docopt import Dict as DocoptDict
|
||||||
from irc3 import IrcBot
|
from irc3 import IrcBot
|
||||||
from irc3.utils import IrcString
|
|
||||||
from irc3.plugins.command import command
|
from irc3.plugins.command import command
|
||||||
import irc3
|
from irc3.utils import IrcString
|
||||||
|
|
||||||
from . import MODULE, Plugin
|
from . import MODULE, Plugin
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
import irc3
|
||||||
|
|
||||||
from docopt import Dict as DocOptDict
|
from docopt import Dict as DocOptDict
|
||||||
from irc3.plugins.command import command
|
from irc3.plugins.command import command
|
||||||
from irc3.utils import IrcString
|
from irc3.utils import IrcString
|
||||||
import irc3
|
|
||||||
|
|
||||||
from . import Plugin
|
from . import Plugin
|
||||||
from ..utils import fmt, req
|
from ..utils import fmt, req
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
import irc3
|
||||||
|
import time
|
||||||
|
|
||||||
from docopt import Dict as DocOptDict
|
from docopt import Dict as DocOptDict
|
||||||
from irc3.plugins.command import command
|
from irc3.plugins.command import command
|
||||||
from irc3.utils import IrcString
|
from irc3.utils import IrcString
|
||||||
import time
|
|
||||||
import irc3
|
|
||||||
|
|
||||||
from . import Plugin
|
from . import Plugin
|
||||||
from ..utils import fmt
|
from ..utils import fmt
|
||||||
|
|
|
@ -2,17 +2,22 @@
|
||||||
import sqlite3
|
import sqlite3
|
||||||
import irc3
|
import irc3
|
||||||
|
|
||||||
|
from irc3 import IrcBot
|
||||||
|
|
||||||
from . import Plugin
|
from . import Plugin
|
||||||
|
|
||||||
|
|
||||||
@irc3.plugin
|
@irc3.plugin
|
||||||
class Database(Plugin):
|
class Database(Plugin):
|
||||||
def __init__(self, bot):
|
def __init__(self, bot: IrcBot):
|
||||||
super().__init__(bot)
|
super().__init__(bot)
|
||||||
file = bot.config.storage.split('sqlite://', 1)[1]
|
file = bot.config.storage.split('sqlite://', 1)[1]
|
||||||
if not file:
|
if not file:
|
||||||
raise ValueError('Invalid database: {}'.format(bot.config.storage))
|
raise ValueError('Invalid database: {}'.format(bot.config.storage))
|
||||||
self.db = sqlite3.connect(file)
|
# @formatter:off
|
||||||
|
self.db = sqlite3.connect(file, detect_types=sqlite3.PARSE_DECLTYPES
|
||||||
|
| sqlite3.PARSE_COLNAMES)
|
||||||
|
# @formatter:on
|
||||||
self.db.row_factory = sqlite3.Row
|
self.db.row_factory = sqlite3.Row
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
self.bot.con = self
|
self.bot.con = self
|
||||||
|
|
69
nxy/plugins/futures.py
Normal file
69
nxy/plugins/futures.py
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
# -*- 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
|
||||||
|
from irc3 import IrcBot
|
||||||
|
import irc3
|
||||||
|
|
||||||
|
from . import DatabasePlugin
|
||||||
|
from ..utils import fmt, time_delta
|
||||||
|
|
||||||
|
|
||||||
|
@irc3.plugin
|
||||||
|
class Futures(DatabasePlugin):
|
||||||
|
requires = [
|
||||||
|
'irc3.plugins.command',
|
||||||
|
'nxy.plugins.database',
|
||||||
|
]
|
||||||
|
|
||||||
|
def __init__(self, bot: IrcBot):
|
||||||
|
super().__init__(bot)
|
||||||
|
self.restore()
|
||||||
|
|
||||||
|
def restore(self):
|
||||||
|
self.cur.execute('select * 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):
|
||||||
|
"""Timer command.
|
||||||
|
%%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))
|
||||||
|
else:
|
||||||
|
self.bot.notice(mask.nick, 'Invalid delay "{delay}" for "timer"'
|
||||||
|
.format(delay=args['<delay>']))
|
||||||
|
|
||||||
|
async def _timer(self, mask: IrcString, channel: IrcString,
|
||||||
|
delta: timedelta, message: str, delay: str, row_id: int):
|
||||||
|
"""
|
||||||
|
Actually the reminder function. Sleeps `delay` seconds and then sends
|
||||||
|
message to `channel` after that.
|
||||||
|
"""
|
||||||
|
seconds = delta.total_seconds()
|
||||||
|
if seconds > 0:
|
||||||
|
await asyncio.sleep(seconds)
|
||||||
|
text = fmt('{bold}[Reminder]{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()
|
|
@ -1,7 +1,7 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from docopt import Dict as DocOptDict
|
from docopt import Dict as DocOptDict
|
||||||
from irc3.utils import IrcString
|
|
||||||
from irc3.plugins.command import command
|
from irc3.plugins.command import command
|
||||||
|
from irc3.utils import IrcString
|
||||||
|
|
||||||
from . import DatabasePlugin
|
from . import DatabasePlugin
|
||||||
from ..utils import parse_int
|
from ..utils import parse_int
|
||||||
|
@ -25,15 +25,15 @@ class McManiac(DatabasePlugin):
|
||||||
if cmd and item:
|
if cmd and item:
|
||||||
if self.guard.has_permission(mask, 'admin'):
|
if self.guard.has_permission(mask, 'admin'):
|
||||||
if cmd == 'add':
|
if cmd == 'add':
|
||||||
self.cur.execute('insert into mcmaniac (item) values (?)',
|
self.cur.execute('insert into mcmaniacs (item) values (?)',
|
||||||
[item])
|
[item])
|
||||||
if cmd == 'del':
|
if cmd == 'del':
|
||||||
index, order, op = parse_int(item, select=False)
|
index, order, op = parse_int(item, select=False)
|
||||||
if not index:
|
if not index:
|
||||||
return
|
return
|
||||||
self.cur.execute('''delete from mcmaniac where id =
|
self.cur.execute('''delete from mcmaniacs where id =
|
||||||
(select id from mcmaniac a where ? = (select count(id)
|
(select id from mcmaniacs a where ? = (select count(id)
|
||||||
from mcmaniac b where a.id {op} b.id) order by id {order})
|
from mcmaniacs b where a.id {op} b.id) order by id {order})
|
||||||
'''.format(op=op, order=order), [index])
|
'''.format(op=op, order=order), [index])
|
||||||
self.con.commit()
|
self.con.commit()
|
||||||
else:
|
else:
|
||||||
|
@ -53,9 +53,9 @@ class McManiac(DatabasePlugin):
|
||||||
extra = ''
|
extra = ''
|
||||||
binds = []
|
binds = []
|
||||||
self.cur.execute('''select item,
|
self.cur.execute('''select item,
|
||||||
(select count(id) from mcmaniac b where a.id >= b.id) as idx,
|
(select count(id) from mcmaniacs b where a.id >= b.id) as idx,
|
||||||
(select count(id) from mcmaniac) as len
|
(select count(id) from mcmaniasc) as len
|
||||||
from mcmaniac a order by {order} limit 1 {extra}
|
from mcmaniacs a order by {order} limit 1 {extra}
|
||||||
'''.format(order=order, extra=extra), binds)
|
'''.format(order=order, extra=extra), binds)
|
||||||
result = self.cur.fetchone()
|
result = self.cur.fetchone()
|
||||||
if result:
|
if result:
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from docopt import Dict as DocOptDict
|
|
||||||
from irc3.utils import IrcString
|
|
||||||
from irc3.plugins.command import command
|
|
||||||
import irc3
|
import irc3
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
from docopt import Dict as DocOptDict
|
||||||
|
from irc3.plugins.command import command
|
||||||
|
from irc3.utils import IrcString
|
||||||
|
|
||||||
from . import DatabasePlugin
|
from . import DatabasePlugin
|
||||||
from ..utils import parse_int
|
from ..utils import parse_int
|
||||||
|
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
from docopt import Dict as DocOptDict
|
|
||||||
from irc3.plugins.command import command
|
|
||||||
from irc3.utils import IrcString
|
|
||||||
import asyncio
|
|
||||||
import irc3
|
|
||||||
|
|
||||||
from . import Plugin
|
|
||||||
from ..utils import fmt, time_to_sec
|
|
||||||
|
|
||||||
|
|
||||||
@irc3.plugin
|
|
||||||
class Reminder(Plugin):
|
|
||||||
requires = [
|
|
||||||
'irc3.plugins.command',
|
|
||||||
]
|
|
||||||
|
|
||||||
@command
|
|
||||||
def remind(self, mask: IrcString, channel: IrcString, args: DocOptDict):
|
|
||||||
"""Remind command.
|
|
||||||
%%remind <delay> <message>...
|
|
||||||
"""
|
|
||||||
delay = time_to_sec(args['<delay>'])
|
|
||||||
if delay:
|
|
||||||
asyncio.ensure_future(self.timer(delay, mask, channel, args))
|
|
||||||
else:
|
|
||||||
self.bot.notice(mask.nick, 'Invalid delay "{delay}" for "remind"'
|
|
||||||
.format(delay=args['<delay>']))
|
|
||||||
|
|
||||||
async def timer(self, delay, mask: IrcString, channel: IrcString,
|
|
||||||
args: DocOptDict):
|
|
||||||
"""
|
|
||||||
Actually the reminder function. Sleeps `delay` seconds and then sends
|
|
||||||
message to `channel` after that.
|
|
||||||
"""
|
|
||||||
await asyncio.sleep(delay)
|
|
||||||
text = fmt('{bold}[Reminder]{reset} {nick}: {message} ({delay})',
|
|
||||||
message=' '.join(args['<message>']),
|
|
||||||
delay=args['<delay>'],
|
|
||||||
nick=mask.nick)
|
|
||||||
self.bot.privmsg(channel, text)
|
|
|
@ -1,10 +1,11 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
import irc3
|
||||||
|
import random
|
||||||
|
|
||||||
from docopt import Dict as DocOptDict
|
from docopt import Dict as DocOptDict
|
||||||
|
from irc3.dec import event
|
||||||
from irc3.plugins.command import command
|
from irc3.plugins.command import command
|
||||||
from irc3.utils import IrcString
|
from irc3.utils import IrcString
|
||||||
from irc3.dec import event
|
|
||||||
import random
|
|
||||||
import irc3
|
|
||||||
|
|
||||||
from . import Plugin
|
from . import Plugin
|
||||||
from ..utils import fmt
|
from ..utils import fmt
|
||||||
|
|
35
nxy/utils.py
35
nxy/utils.py
|
@ -1,8 +1,9 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from requests import request, Response
|
import re
|
||||||
|
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from pprint import pprint
|
from pprint import pprint
|
||||||
import re
|
from requests import request, Response
|
||||||
|
|
||||||
# @formatter:off
|
# @formatter:off
|
||||||
COLORS = dict(
|
COLORS = dict(
|
||||||
|
@ -62,14 +63,15 @@ async def req(method: str, url: str, **kwargs) -> Response:
|
||||||
def time_to_sec(text: str) -> int:
|
def time_to_sec(text: str) -> int:
|
||||||
match = TIME_REGEX.match(text)
|
match = TIME_REGEX.match(text)
|
||||||
if match:
|
if match:
|
||||||
unit, num = match
|
num, unit = match.groups()
|
||||||
return num * TIME_DICT[unit][1]
|
return int(num) * TIME_DICT[unit][1]
|
||||||
|
|
||||||
|
|
||||||
def time_delta(text: str) -> timedelta:
|
def time_delta(text: str) -> timedelta:
|
||||||
match = TIME_REGEX.match(text)
|
match = TIME_REGEX.match(text)
|
||||||
if match:
|
if match:
|
||||||
unit, num = match
|
num, unit = match.groups()
|
||||||
|
num = int(num)
|
||||||
if unit == 'years':
|
if unit == 'years':
|
||||||
num *= 52
|
num *= 52
|
||||||
return timedelta(**{TIME_DICT[unit][0]: num})
|
return timedelta(**{TIME_DICT[unit][0]: num})
|
||||||
|
@ -80,31 +82,12 @@ def parse_int(val: str, select: bool = True) -> tuple:
|
||||||
val = int(val)
|
val = int(val)
|
||||||
if val is not 0:
|
if val is not 0:
|
||||||
if val < 1:
|
if val < 1:
|
||||||
order = 'desc'
|
order, op = 'desc', '<='
|
||||||
val *= -1
|
val *= -1
|
||||||
op = '<='
|
|
||||||
else:
|
else:
|
||||||
order = 'asc'
|
order, op = 'asc', '>='
|
||||||
op = '>='
|
|
||||||
if select:
|
if select:
|
||||||
val -= 1
|
val -= 1
|
||||||
return val, order, op
|
return val, order, op
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def _parse_int(val: list) -> int:
|
|
||||||
"""
|
|
||||||
Parses an int from list, decremts by -1 if positiv.
|
|
||||||
Only returns if value from list is not 0.
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
val = int(''.join(val))
|
|
||||||
# Ignore val == 0
|
|
||||||
if val is not 0:
|
|
||||||
# Decrement to match list index
|
|
||||||
if val > 0:
|
|
||||||
val -= 1
|
|
||||||
return val
|
|
||||||
except ValueError:
|
|
||||||
pass
|
|
||||||
|
|
12
schema.sql
12
schema.sql
|
@ -5,8 +5,18 @@ create table if not exists quotes (
|
||||||
unique (nick, item collate nocase)
|
unique (nick, item collate nocase)
|
||||||
);
|
);
|
||||||
|
|
||||||
create table if not exists mcmaniac (
|
create table if not exists mcmaniacs (
|
||||||
id integer primary key autoincrement,
|
id integer primary key autoincrement,
|
||||||
item text not null,
|
item text not null,
|
||||||
unique (item collate nocase) on conflict replace
|
unique (item collate nocase) on conflict replace
|
||||||
);
|
);
|
||||||
|
|
||||||
|
create table if not exists timers (
|
||||||
|
id integer primary key autoincrement,
|
||||||
|
mask text not null,
|
||||||
|
channel text not null,
|
||||||
|
message text not null,
|
||||||
|
delay text not null,
|
||||||
|
until timestamp not null,
|
||||||
|
created timestamp not null default current_timestamp
|
||||||
|
);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user