From f3c527bb062c512c4b7fa24a28977b5a60a0ebba Mon Sep 17 00:00:00 2001 From: Watchful1 Date: Wed, 16 Dec 2020 18:53:01 -0800 Subject: [PATCH] Hopefully fix removing users last point. Fix logging --- pointsbot/bot.py | 12 ++++++---- pointsbot/database.py | 39 +++++++++++++++++++++++---------- pointsbot/reply.py | 51 ++++++++++++++++++++++++------------------- 3 files changed, 64 insertions(+), 38 deletions(-) diff --git a/pointsbot/bot.py b/pointsbot/bot.py index 7a8ac88..d9c4bc9 100644 --- a/pointsbot/bot.py +++ b/pointsbot/bot.py @@ -1,4 +1,5 @@ import logging +from logging.handlers import RotatingFileHandler import os import os.path import re @@ -28,7 +29,7 @@ def run(): cfg = config.load() - file_handler = logging.FileHandler(cfg.log_path, 'w', 'utf-8') + file_handler = RotatingFileHandler(cfg.log_path, mode='w', maxBytes=1024*1024, backupCount=3, encoding='utf-8') console_handler = logging.StreamHandler(sys.stderr) console_handler.setLevel(logging.INFO) @@ -129,7 +130,10 @@ def monitor_comments(reddit, subreddit, db, levels, cfg): points = db.get_points(solver) logging.info('Total points for user "%s": %d', solver.name, points) - level_info = level.user_level_info(points, levels) + if points > 0: + level_info = level.user_level_info(points, levels) + else: + level_info = None # Reply to the comment marking the submission as solved reply_body = reply.make(solver, @@ -154,8 +158,8 @@ def monitor_comments(reddit, subreddit, db, levels, cfg): continue # Check if (non-mod) user flair should be updated to new level - lvl = level_info.current - if lvl and lvl.points == points: + if level_info and level_info.current and level_info.current.points == points: + lvl = level_info.current logging.info('User reached level: %s', lvl.name) if not subreddit.moderator(redditor=solver): logging.info('User is not mod; setting flair') diff --git a/pointsbot/database.py b/pointsbot/database.py index 3d28966..95d90d4 100644 --- a/pointsbot/database.py +++ b/pointsbot/database.py @@ -63,6 +63,16 @@ class Database: self.cursor.execute(insert_stmt, {'id': redditor.id, 'name': redditor.name}) return self.cursor.rowcount + @transaction + def remove_redditor(self, redditor): + insert_stmt = ''' + DELETE FROM redditor_points + WHERE id = :id + AND name = :name + ''' + self.cursor.execute(insert_stmt, {'id': redditor.id, 'name': redditor.name}) + return self.cursor.rowcount + def add_point(self, redditor): return self._update_points(redditor, 1) @@ -73,18 +83,21 @@ class Database: def _update_points(self, redditor, points_modifier): """points_modifier is positive to add points, negative to subtract.""" points = self.get_points(redditor, add_if_none=True) - params = { - 'id': redditor.id, - 'name': redditor.name, - 'points': points + points_modifier, - } - update_stmt = ''' - UPDATE redditor_points - SET points = :points - WHERE id = :id AND name = :name - ''' - self.cursor.execute(update_stmt, params) - return self.cursor.rowcount + if points + points_modifier <= 0: + return self.remove_redditor(redditor) + else: + params = { + 'id': redditor.id, + 'name': redditor.name, + 'points': points + points_modifier, + } + update_stmt = ''' + UPDATE redditor_points + SET points = :points + WHERE id = :id AND name = :name + ''' + self.cursor.execute(update_stmt, params) + return self.cursor.rowcount @transaction def get_points(self, redditor, add_if_none=False): @@ -101,6 +114,8 @@ class Database: elif add_if_none: points = 0 self.add_redditor(redditor) + else: + points = 0 return points diff --git a/pointsbot/reply.py b/pointsbot/reply.py index cdcd5ce..7dd4dfe 100644 --- a/pointsbot/reply.py +++ b/pointsbot/reply.py @@ -27,32 +27,35 @@ def make(redditor, points, level_info, feedback_url=None, scoreboard_url=None, i else: paras = [remove_header()] - if points <= 1: - paras.append(first_greeting(redditor)) - if level_info.current and points == level_info.current.points: - paras.append(level_up(redditor, - level_info.current.name, - tag_user=False)) - elif points > 1: - user_already_tagged = False + if level_info is None: + paras.append(no_points(redditor)) + else: + if points <= 1: + paras.append(first_greeting(redditor)) + if level_info.current and points == level_info.current.points: + paras.append(level_up(redditor, + level_info.current.name, + tag_user=False)) + elif points > 1: + user_already_tagged = False - if level_info.current and points == level_info.current.points: - paras.append(level_up(redditor, - level_info.current.name, - tag_user=(not user_already_tagged))) - user_already_tagged = True + if level_info.current and points == level_info.current.points: + paras.append(level_up(redditor, + level_info.current.name, + tag_user=(not user_already_tagged))) + user_already_tagged = True - if points % EXCESS_POINTS == 0: - first_excess = (points == EXCESS_POINTS) - paras.append(new_excess_symbol(redditor, - first_excess=first_excess, - tag_user=(not user_already_tagged))) - user_already_tagged = True + if points % EXCESS_POINTS == 0: + first_excess = (points == EXCESS_POINTS) + paras.append(new_excess_symbol(redditor, + first_excess=first_excess, + tag_user=(not user_already_tagged))) + user_already_tagged = True - if not user_already_tagged: - paras.append(normal_greeting(redditor)) + if not user_already_tagged: + paras.append(normal_greeting(redditor)) - paras.append(points_status(redditor, points, level_info)) + paras.append(points_status(redditor, points, level_info)) paras.append(divider()) paras.append(footer(feedback_url=feedback_url, scoreboard_url=scoreboard_url)) return '\n\n'.join(paras) @@ -69,6 +72,10 @@ def remove_header(): return 'Point removed.' +def no_points(redditor): + return f'u/{redditor.name} now has no points' + + def first_greeting(redditor): return (f'Congrats, u/{redditor.name}, you have received a point! Points ' 'help you "level up" to the next user flair!')