X-Git-Url: https://apps.delaporte.us/gitweb/matrix-chore-bot.git/blobdiff_plain/0e8e2296efcfab2892ec552b04e46450554fd06a..145745886f1614e292c17163884e15e669dcf224:/matrix_chore_bot/bot.py diff --git a/matrix_chore_bot/bot.py b/matrix_chore_bot/bot.py index 7e33ade..c1a76d3 100644 --- a/matrix_chore_bot/bot.py +++ b/matrix_chore_bot/bot.py @@ -1,3 +1,19 @@ +''' +Prefix: !chore + +Synax: +!chore COMMAND ARGS + +Commands: +help - show this help +add - add a chore +check - check status of a chore +done - mark a chore as done +list - print the chore list +filter TERM - list all chores that include TERM +undo - mark a chore as undone +''' + from datetime import datetime as dt import logging import os @@ -6,88 +22,94 @@ import simplematrixbotlib as botlib from .db import Data as ChoreData -SERVER = os.environ.get('MATRIX_SERVER') -BOT_NAME = os.environ.get('MATRIX_BOT') -BOT_PWD = os.environ.get('MATRIX_BOT_PWD') - -CHORES = ChoreData() - logger = logging.getLogger(__name__) logging.basicConfig(filename='matrix-chore-bot.log', encoding='utf-8', level=logging.DEBUG) logging.getLogger('nio').setLevel(logging.WARNING) -async def chore_bot(room, message, bot, prefix='!chore'): - match = botlib.MessageMatch(room, message, bot, prefix) +class ChoreBot(): + def __init__(self, matrix_server, + bot_name, + bot_pwd, + db_file=None, + bot_prefix='!chore'): + + creds = botlib.Creds(matrix_server, bot_name, bot_pwd) + self.bot = botlib.Bot(creds) + self.prefix = bot_prefix + self.data = ChoreData(db_file=db_file) + + def run(self): + self.bot.run() + + async def handle_message(self, room, message): + match = botlib.MessageMatch(room, message, self.bot, self.prefix) + + if not match.is_not_from_this_bot() and match.prefix(): + return + + if match.prefix(): + try: + result_lines = await self._handle_match(match) + for line in result_lines: + await self.bot.api.send_text_message( + room.room_id, str(line)) + except Exception as ex: + line = f'Ye flask must be load bearing, or something... {str(ex)}' + await self.bot.api.send_text_message( + room.room_id, str(line)) - if not match.is_not_from_this_bot() and match.prefix(): - return - if match.prefix(): - try: - result_lines = await handle_chore(match) - for line in result_lines: - await bot.api.send_text_message( - room.room_id, str(line)) - except Exception as ex: - line = f'Ye flask must be load bearing, or something... {str(ex)}' - await bot.api.send_text_message( - room.room_id, str(line)) - - -async def handle_chore(match): - ''' - Prefix: !chore - - Synax: - !chore COMMAND ARGS - - Commands: - help - show this help - add - add a chore - check - check status of a chore - done - mark a chore as done - list - print the chore list - undo - mark a chore as undone - ''' - - if match.command('list'): - results = ['## Listing chores...'] - for item in CHORES.list(): - results.append(item) - results.append('-- End of List --') - return results - - if match.command('setup'): - results = [] - results.append('Doing chore setup...') - result = CHORES.setup() - results.append(str(result)) - return results - - if match.command('add'): - new_chore = ' '.join(match.args()[1:]) - result = CHORES.add(new_chore) - return [result] - - if match.command('check'): - chore_id = match.args()[1] - result = CHORES.check(chore_id) - return [result] - - if match.command('done'): - chore_id = match.args()[1] - result = CHORES.done(chore_id) - return [result] - - if match.command('undo'): - chore_id = match.args()[1] - result = CHORES.undo(chore_id) - return [result] - - if match.command('remove'): - chore_id = match.args()[1] - result = CHORES.remove(chore_id) - return [result] - - return [handle_chore.__doc__] + async def _handle_match(self, match): + + if match.command('list'): + results = ['## Listing all...'] + for item in self.data.list(): + results.append(item) + results.append('-- End of List --') + return results + + if match.command('filter'): + term = ' '.join(match.args()[1:]) + results = [f'## List matching {term}'] + for item in self.data.filter(term): + results.append(item) + results.append('-- End of List --') + return results + + if match.command('setup'): + results = [] + results.append('Doing chore setup...') + result = self.data.setup() + results.append(str(result)) + return results + + if match.command('add'): + new_chore = ' '.join(match.args()[1:]) + result = self.data.add(new_chore) + return [result] + + if match.command('check'): + chore_id = match.args()[1] + result = self.data.check(chore_id) + return [result] + + if match.command('done'): + ids = match.args()[1:] + results = [] + for chore_id in ids: + result = self.data.done(chore_id) + results.append(result) + return results + + if match.command('undo'): + chore_id = match.args()[1] + result = self.data.undo(chore_id) + return [result] + + if match.command('remove'): + chore_id = match.args()[1] + result = self.data.remove(chore_id) + return [result] + + return [__doc__]