62 lines
1.8 KiB
Python
62 lines
1.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
from docopt import Dict as DocOptDict
|
|
from irc3.utils import IrcString
|
|
from irc3.plugins.command import command
|
|
import random
|
|
import irc3
|
|
import re
|
|
|
|
from . import DatabasePlugin
|
|
from ..utils import parse_int
|
|
|
|
|
|
@irc3.plugin
|
|
class Quotes(DatabasePlugin):
|
|
requires = [
|
|
'irc3.plugins.command',
|
|
]
|
|
|
|
REGEX = re.compile(r'<?[~&@%+]?([a-zA-Z0-9_\-^`|\\\[\]{}]+)>?')
|
|
|
|
# noinspection PyUnusedLocal
|
|
@command(options_first=True)
|
|
def q(self, mask: IrcString, channel: IrcString, args: DocOptDict) -> str:
|
|
"""
|
|
Manage quotes.
|
|
%%q <cmd> <nick> <quote>...
|
|
%%q <nick> [<quote>...]
|
|
"""
|
|
cmd = args.get('<cmd>')
|
|
nick = args['<nick>']
|
|
quote = args.get('<quote>')
|
|
if cmd:
|
|
if cmd == 'add':
|
|
nick = self.REGEX.match(nick).group(1)
|
|
if nick not in self.db:
|
|
self.db[nick] = []
|
|
quote = ' '.join(quote)
|
|
if quote not in self.db[nick]:
|
|
self.db[nick].append(quote)
|
|
elif cmd == 'del':
|
|
try:
|
|
self.db[nick].pop(parse_int(quote))
|
|
if not self.db[nick]:
|
|
del self.db[nick]
|
|
except (KeyError, IndexError, TypeError):
|
|
return ''
|
|
self._db.SIGINT()
|
|
else:
|
|
if quote:
|
|
try:
|
|
quote = self.db[nick][parse_int(quote)]
|
|
except (KeyError, IndexError, TypeError):
|
|
return ''
|
|
else:
|
|
quote = random.choice(self.db[nick])
|
|
return '[{index}/{total}] <{nick}> {quote}'.format(
|
|
index=self.db[nick].index(quote) + 1,
|
|
total=len(self.db[nick]),
|
|
nick=nick,
|
|
quote=quote,
|
|
)
|