X-Git-Url: https://us-delaporte.pagekite.me/gitweb/matrix-goal-bot.git/blobdiff_plain/390a4cf60a66718bed359b3a4141a51d0f9571b0..refs/heads/main:/matrix_goal_bot/bot.py?ds=inline diff --git a/matrix_goal_bot/bot.py b/matrix_goal_bot/bot.py index dce0f73..037173b 100644 --- a/matrix_goal_bot/bot.py +++ b/matrix_goal_bot/bot.py @@ -1,15 +1,16 @@ ''' -Prefix: !goal +Prefix: .goal Synax: - !goal COMMAND ARGS + .goal COMMAND ARGS Commands: help - show this help extra.help - show extended help add - add a goal + clear - clear completed tasks under current goal task ID - add a task under the goal specified by ID - close.goal ID - mark goal done by ID + close ID - mark goal done by ID done ID - mark task done by ID list - list incomplete goals print GOAL_ID - print a goal and all tasks @@ -19,12 +20,17 @@ ex_help = ''' More commands: add.vision - add a new vision (collection of goals) close.vision ID - mark vision as complete by ID - list.all - list everything + dump - dump the full data set - BEWARE - so many messages + later VISION_ID - put off all goals in VISION for 14 days + list.later - list all 'later' goals print.vision ID - print a vision and all goals set.vision GOAL_ID VISION_ID- associate GOAL_ID with VISION_ID visions - list incomplete visions list.done - list completed goals + remove ID - remove a task by ID + start GOAL_ID - un-put-off a goal (reverse of later) visionless - list goals with no set vision + wins - list recently completed goals ''' @@ -42,8 +48,6 @@ def today(): return dt.now().strftime(DATE_FORMAT) logger = logging.getLogger(__name__) -logging.basicConfig(filename='matrix-goal-bot.log', encoding='utf-8', level=logging.DEBUG) -logging.getLogger('nio').setLevel(logging.WARNING) snark = [ 'Ye cannot get ye flask.', @@ -61,7 +65,7 @@ class GoalBot(): bot_name, bot_pwd, db_file=None, - bot_prefix='!goal'): + bot_prefix='.goal'): creds = botlib.Creds(matrix_server, bot_name, bot_pwd) self.bot = botlib.Bot(creds) @@ -69,26 +73,46 @@ class GoalBot(): self.data = Data(db_file) def run(self): + logger.debug('Running goal bot...') 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(): + if not match.is_not_from_this_bot(): + # Let's not talk to our-self return + logger.debug(f'Message: {message}') + if not match.prefix(): + logger.debug(f'{message} - did not match {self.prefix}') + if match.prefix(): try: result_lines = await self._handle_match(match) + + message_lines = [] for line in result_lines: - await self.bot.api.send_text_message( - room.room_id, str(line)) + message_lines.append(str(line)) + + message = '\n'.join(message_lines) + + await self.bot.api.send_text_message( + room.room_id, message) + except Exception as ex: + logger.warn(f'Caught exception: {str(ex)}') + dumb_msg_idx = len(str(ex)) % len(snark) + dumb_msg = snark[dumb_msg_idx] + await self.bot.api.send_text_message( + room.room_id, dumb_msg) + await self.bot.api.send_text_message( room.room_id, str(ex)) async def _handle_match(self, match): + logger.debug(f'Try to match {str(match)}') if match.command('setup'): result = self.data.setup() @@ -96,12 +120,21 @@ class GoalBot(): if match.command('add'): new = ' '.join(match.args()[1:]) - result = self.data.add_goal(new) - return [f'Goal added with id {result}'] + goal_id = self.data.add_goal(new) + results = [f'Goal added with id {goal_id}'] - if match.command('list'): goals = self.data.get_all_goals() - results = ['# Goals list...'] + results.append('# Goals list...') + for goal in goals: + results.append(str(goal)) + + return results + + if match.command('list'): + logger.debug('Asked to list current goals...') + goals = self.data.get_current_goals() + results = ['# Goals list'] + results.append('------------') for goal in goals: results.append(str(goal)) return results @@ -145,13 +178,43 @@ class GoalBot(): results = pretty_print(vision, goals) return results - if match.command('close.goal'): + if match.command('close'): goal_id = int(match.args()[1]) vision_id = self.data.complete_goal(goal_id) vision,goals = self.data.get_vision(vision_id) results = pretty_print(vision, goals) return results + + if match.command('clear'): + if len(match.args()) > 1: + goal_id = int(match.args()[1]) + else: + goal_id = self.data._get_pref_goal_id() + _ = self.data.clear(goal_id) + + goal,tasks = self.data.get_goal(goal_id) + results = pretty_print(goal, tasks) + return results + + + if match.command('start'): + goal_id = int(match.args()[1]) + vision,goals = self.data.start_goal(goal_id) + results = pretty_print(vision, goals) + return results + + if match.command('later'): + vision_id = int(match.args()[1]) + self.data.put_off_vision(vision_id) + # Want to see what we just cleaned up + goals = self.data.get_current_goals() + results = ['# Goals list...'] + for goal in goals: + results.append(str(goal)) + return results + + if match.command('close.vision'): vision_id = int(match.args()[1]) self.data.complete_vision(vision_id) @@ -168,15 +231,21 @@ class GoalBot(): results = pretty_print(goal, tasks) return results - if match.command('list.all'): + if match.command('dump'): goals = self.data.get_all_goals() - results = ['# Everything is...'] + results = ['# Everything ... '] for goal in goals: _,tasks = self.data.get_goal(goal.id) details = pretty_print(goal, tasks) results += details return results + + if match.command('list.later'): + goals = self.data.get_all_goals() + results = ['# All Goals ... '] + return results + if match.command('visions'): items = self.data.get_all_visions() results = ['# Visions'] @@ -197,6 +266,18 @@ class GoalBot(): results.append(item) return results + if match.command('wins'): + items = self.data.wins() + results = ['# Wins'] + if not items: + results.append('-- No wins yet --') + + for item in items: + results.append(item) + return results + + + if match.command('set.vision'): goal_id = int(match.args()[1]) vision_id = int(match.args()[2])