From 6d7b8eafcaf3697ab59894ff96a6a12d778b4f28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Kera=CC=88nen?= Date: Sun, 28 May 2023 10:46:56 +0300 Subject: [PATCH 1/1] Config option and user setting for disabling Likes The Like mechanism can be disabled site-wide or on a per-user basis. --- 50_bubble.py | 9 ++++++++- feeds.py | 18 ++++++++++-------- model.py | 1 + settings.py | 15 ++++++++++++++- user.py | 2 ++ 5 files changed, 35 insertions(+), 10 deletions(-) diff --git a/50_bubble.py b/50_bubble.py index 2bcef9c..ef6579a 100644 --- a/50_bubble.py +++ b/50_bubble.py @@ -32,6 +32,7 @@ class Bubble: self.site_name = cfg.get('name', 'Bubble') self.site_info = cfg.get('info', "Bulletin Boards for Gemini") self.site_info_nouser = cfg.get('info.nouser', self.site_info) + self.likes_enabled = cfg.getboolean('user.likes', True) self.user_register = cfg.getboolean('user.register', True) self.admin_certpass = cfg.get('admin.certpass', '') self.antenna_url = cfg.get('antenna.url', 'gemini://warmedal.se/~antenna/submit') @@ -107,6 +108,12 @@ Bubble is open source: self.CHECKS = [ '[_]', '[x]' ] # TODO: Add more of these. + def is_likes_enabled(self): + enabled = self.bubble.likes_enabled + if self.user: + enabled = enabled and (self.user.flags & User.HIDE_LIKES_FLAG) == 0 + return enabled + def is_editable(self, post: Post): return self.user.role == User.ADMIN or post.user == self.user.id @@ -174,7 +181,7 @@ Bubble is open source: if not context or context.id != post.subspace: sub = f's/{post.sub_name}' if not is_user_post else post.sub_name likes = '' - if post.num_likes > 0: + if self.is_likes_enabled() and post.num_likes > 0: likes = f'{post.num_likes} like{plural_s(post.num_likes)}' if is_issue_tracker: cmt = '' diff --git a/feeds.py b/feeds.py index b2cd82b..57b2149 100644 --- a/feeds.py +++ b/feeds.py @@ -251,10 +251,11 @@ def make_post_page(session, post): page += poster_link last_age = post.age() page += f'{last_age}' - liked = [] - if post.num_likes: - liked = db.get_likes(post) - page += ' ยท ๐Ÿ‘ ' + ', '.join(liked) + if session.is_likes_enabled(): + liked = [] + if post.num_likes: + liked = db.get_likes(post) + page += ' ยท ๐Ÿ‘ ' + ', '.join(liked) page += '\n' # Post actions. @@ -270,10 +271,11 @@ def make_post_page(session, post): if session.is_editable(post): page += f'=> /edit/{post.id} โœ๏ธ Edit {kind}\n' page += f'=> /comment/{post.id} ๐Ÿ’ฌ Comment\n' - if session.user.name not in liked: - page += f'=> /like/{post.id} ๐Ÿ‘ Like\n' - else: - page += f'=> /unlike/{post.id} ๐Ÿ‘Ž Undo like\n' + if session.is_likes_enabled(): + if session.user.name not in liked: + page += f'=> /like/{post.id} ๐Ÿ‘ Like\n' + else: + page += f'=> /unlike/{post.id} ๐Ÿ‘Ž Undo like\n' if session.user.id == post.user or session.is_user_mod: page += f'=> /edit-tags/{post.id} ๐Ÿท๏ธ Add/remove tags\n' diff --git a/model.py b/model.py index 273b396..d987b3f 100644 --- a/model.py +++ b/model.py @@ -168,6 +168,7 @@ class User: # Flags: HOME_FOLLOWED_FEED_FLAG = 0x1 ASCII_ICONS_FLAG = 0x2 + HIDE_LIKES_FLAG = 0x4 def __init__(self, id, name, info, url, avatar, role, flags, notif, email, email_inter, \ email_range, password, ts_password, ts_created, ts_active, sort_post, sort_cmt): diff --git a/settings.py b/settings.py index b351529..20a47d8 100644 --- a/settings.py +++ b/settings.py @@ -275,6 +275,16 @@ def make_settings_page(session): db.update_subspace(user_space, flags=user_space.flags ^ Subspace.OMIT_FROM_FEED_BY_DEFAULT) return 30, '/settings' + elif req.path == session.path + 'settings/likes': + # If disabling likes, also disable Like notifications. + notif = user.notif + if user.flags & User.HIDE_LIKES_FLAG: + notif |= Notification.LIKE + else: + notif &= ~Notification.LIKE + db.update_user(user, flags=user.flags ^ User.HIDE_LIKES_FLAG, notif=notif) + return 30, '/settings' + elif req.path == session.path + 'settings/homefeed': db.update_user(session.user, flags=session.user.flags ^ User.HOME_FOLLOWED_FEED_FLAG) return 30, '/settings' @@ -431,7 +441,10 @@ def make_settings_page(session): page += f'=> /settings/sort-cmt Sort comments: {SORT_COMMENT[session.user.sort_cmt]}\n' page += f'=> /settings/ascii Display icons as: {ICON_MODE[nonzero(session.user.flags & User.ASCII_ICONS_FLAG)]}\n' - page += f'\n=> /settings/omit-all {session.CHECKS[nonzero(user_space.flags & Subspace.OMIT_FROM_ALL_FLAG)]} ' + \ + page += '\n' + if session.bubble.likes_enabled: + page += f'=> /settings/likes {session.CHECKS[nonzero(not (user.flags & User.HIDE_LIKES_FLAG))]} Enable likes\n' + page += f'=> /settings/omit-all {session.CHECKS[nonzero(user_space.flags & Subspace.OMIT_FROM_ALL_FLAG)]} ' + \ f'Omit u/{session.user.name} from All Posts\n' page += f'=> /settings/omit-feed {session.CHECKS[nonzero(user_space.flags & Subspace.OMIT_FROM_FEED_BY_DEFAULT)]} ' + \ 'Omit posts from Gemini feed by default\n' diff --git a/user.py b/user.py index ac81294..cdefe9b 100644 --- a/user.py +++ b/user.py @@ -12,6 +12,8 @@ def user_actions(session): req.path.startswith(session.path + 'unlike/'): if not user: return 60, 'Login required' + if not session.is_likes_enabled(): + return 50, 'Likes are disabled' found = re.match(r'^(like|unlike)/(\d+)$', req.path[len(session.path):]) action = found.group(1) post_id = int(found.group(2)) -- 2.25.1 gemini://git.skyjake.fi/bubble/main/patch/6d7b8eafcaf3697ab59894ff96a6a12d778b4f28.patch

-- Leo's gemini proxy

-- Connecting to git.skyjake.fi:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/plain

-- Response ended

-- Page fetched on Sun Jun 2 18:24:01 2024