From c0226d3870851d1bfb868fc053508c446f52f13f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 1 Mar 2022 09:57:42 +0000 Subject: [PATCH 01/12] Typo --- like.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/like.py b/like.py index a878d35d5..42b007cf8 100644 --- a/like.py +++ b/like.py @@ -36,7 +36,7 @@ from posts import get_person_box def no_of_likes(post_json_object: {}) -> int: - """Returns the number of likes ona given post + """Returns the number of likes on a given post """ obj = post_json_object if has_object_dict(post_json_object): From fd80babfb8d7933d4f6034b9d2f69a84d0b26f48 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 1 Mar 2022 13:10:10 +0000 Subject: [PATCH 02/12] Screen to show the list of likers of a post --- daemon.py | 74 +++++++++++++++++++++++++++ webapp_likers.py | 129 +++++++++++++++++++++++++++++++++++++++++++++++ webapp_post.py | 6 ++- 3 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 webapp_likers.py diff --git a/daemon.py b/daemon.py index ccffdc711..2c18edf7b 100644 --- a/daemon.py +++ b/daemon.py @@ -377,6 +377,7 @@ from fitnessFunctions import fitness_thread from fitnessFunctions import sorted_watch_points from fitnessFunctions import html_watch_points_graph from siteactive import referer_is_active +from webapp_likers import html_likers_of_post import os @@ -10421,6 +10422,63 @@ class PubServer(BaseHTTPRequestHandler): self.server.debug) return result + def _show_likers_of_post(self, authorized: bool, + calling_domain: str, path: str, + base_dir: str, http_prefix: str, + domain: str, domain_full: str, port: int, + onion_domain: str, i2p_domain: str, + getreq_start_time, + proxy_type: str, cookie: str, + debug: str) -> bool: + """Show the likers of a post + """ + if not authorized: + return False + if '?likers=' not in path: + return False + if '/users/' not in path: + return False + nickname = path.split('/users/')[1] + if '?' in nickname: + nickname = nickname.split('?')[0] + post_url = path.split('?likers=')[1] + if '?' in post_url: + post_url = post_url.split('?')[0] + post_url = post_url.replace('--', '/') + + msg = \ + html_likers_of_post(base_dir, nickname, domain, port, + post_url, self.server.translate, + http_prefix, + self.server.theme_name, + self.server.access_keys, + self.server.recent_posts_cache, + self.server.max_recent_posts, + self.server.session, + self.server.cached_webfingers, + self.server.person_cache, + self.server.project_version, + self.server.yt_replace_domain, + self.server.twitter_replacement_domain, + self.server.show_published_date_only, + self.server.peertube_instances, + self.server.allow_local_network_access, + self.server.system_language, + self.server.max_like_count, + self.server.signing_priv_key_pem, + self.server.cw_lists, + self.server.lists_enabled, + 'inbox', self.server.default_timeline) + msg = msg.encode('utf-8') + msglen = len(msg) + self._set_headers('text/html', msglen, + cookie, calling_domain, False) + self._write(msg) + fitness_performance(getreq_start_time, self.server.fitness, + '_GET', '_show_likers_of_post', + self.server.debug) + return True + def _show_post_from_file(self, post_filename: str, liked_by: str, react_by: str, react_emoji: str, authorized: bool, @@ -16487,6 +16545,22 @@ class PubServer(BaseHTTPRequestHandler): self.server.getreq_busy = False return + # show the likers of a post + if self._show_likers_of_post(authorized, + calling_domain, self.path, + self.server.base_dir, + self.server.http_prefix, + self.server.domain, + self.server.domain_full, + self.server.port, + self.server.onion_domain, + self.server.i2p_domain, + getreq_start_time, + self.server.proxy_type, + cookie, self.server.debug): + self.server.getreq_busy = False + return + fitness_performance(getreq_start_time, self.server.fitness, '_GET', 'individual post done', self.server.debug) diff --git a/webapp_likers.py b/webapp_likers.py new file mode 100644 index 000000000..2d9a8cd49 --- /dev/null +++ b/webapp_likers.py @@ -0,0 +1,129 @@ +__filename__ = "webapp_likers.py" +__author__ = "Bob Mottram" +__license__ = "AGPL3+" +__version__ = "1.3.0" +__maintainer__ = "Bob Mottram" +__email__ = "bob@libreserver.org" +__status__ = "Production" +__module_group__ = "ActivityPub" + +import os +from utils import locate_post +from utils import get_config_param +from utils import get_account_timezone +from utils import get_display_name +from utils import get_nickname_from_actor +from utils import has_object_dict +from webapp_utils import html_header_with_external_style +from webapp_utils import html_footer +from webapp_utils import get_banner_file +from webapp_post import individual_post_as_html + + +def html_likers_of_post(base_dir: str, nickname: str, + domain: str, port: int, + post_url: str, translate: {}, + http_prefix: str, + theme: str, access_keys: {}, + recent_posts_cache: {}, max_recent_posts: int, + session, cached_webfingers: {}, + person_cache: {}, + project_version: str, + yt_replace_domain: str, + twitter_replacement_domain: str, + show_published_date_only: bool, + peertube_instances: [], + allow_local_network_access: bool, + system_language: str, + max_like_count: int, signing_priv_key_pem: str, + cw_lists: {}, lists_enabled: str, + boxName: str, default_timeline: str) -> str: + """Returns html for a screen showing who liked a post + """ + css_filename = base_dir + '/epicyon-profile.css' + if os.path.isfile(base_dir + '/epicyon.css'): + css_filename = base_dir + '/epicyon.css' + + instance_title = get_config_param(base_dir, 'instanceTitle') + html_str = \ + html_header_with_external_style(css_filename, instance_title, None) + + # get the post which was liked + post_json_object = \ + locate_post(base_dir, nickname, domain, post_url) + if not post_json_object: + return html_str + html_footer() + + # show the top banner + banner_file, _ = \ + get_banner_file(base_dir, nickname, domain, theme) + html_str += \ + '
\n' + \ + '\n' + html_str += '\n' + \ + '
\n' + + # show the post which was liked + timezone = get_account_timezone(base_dir, nickname, domain) + html_str += \ + individual_post_as_html(signing_priv_key_pem, + True, recent_posts_cache, + max_recent_posts, + translate, None, + base_dir, session, + cached_webfingers, + person_cache, + nickname, domain, port, + post_json_object, + None, True, False, + http_prefix, + project_version, + boxName, + yt_replace_domain, + twitter_replacement_domain, + show_published_date_only, + peertube_instances, + allow_local_network_access, + theme, system_language, + max_like_count, + False, False, False, + False, False, False, + cw_lists, lists_enabled, + timezone) + + # show likers beneath the post + obj = post_json_object + if has_object_dict(post_json_object): + obj = post_json_object['object'] + if not obj.get('likes'): + return html_str + html_footer() + if not isinstance(obj['likes'], dict): + return html_str + html_footer() + if not obj['likes'].get('items'): + return html_str + html_footer() + + html_str += '

' + translate['Liked by'] + '

\n' + + likers_list = '' + for like_item in obj['likes']['items']: + if not like_item.get('actor'): + continue + liker_actor = like_item['actor'] + liker_display_name = \ + get_display_name(base_dir, liker_actor, person_cache) + if liker_display_name: + liker_name = liker_display_name + else: + liker_name = get_nickname_from_actor(liker_actor) + if likers_list: + likers_list += ' ' + likers_list += \ + '' + liker_name + '' + html_str += '
\n' + likers_list + '\n
\n' + + return html_str + html_footer() diff --git a/webapp_post.py b/webapp_post.py index c82dc0257..15f5fb10e 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -659,6 +659,9 @@ def _get_like_icon_html(nickname: str, domain_full: str, like_str += '\n' like_post_id = remove_hash_from_post_id(post_json_object['id']) like_post_id = remove_id_ending(like_post_id) + likers_post_id = like_post_id.replace('/', '--') + likers_screen_link = \ + '/users/' + nickname + '?likers=' + likers_post_id like_str += \ ' \n' + '" + \ + like_title + like_count_str + '">\n' like_str += \ ' ' + \ '" + \ + like_title + like_count_str + '' like_str += \ ' " + \ - like_title + like_count_str + '">\n' + '?tl=' + box_name + '" title="' + likers_screen_link + '">\n' like_str += \ ' ' + \ '' - like_str += like_count_str.replace('(', '').replace(')', '').strip() - like_str += '\n' like_post_id = remove_hash_from_post_id(post_json_object['id']) like_post_id = remove_id_ending(like_post_id) - # create the link to likers of the post - likers_post_id = like_post_id.replace('/', '--') - likers_screen_link = like_title + like_count_str + like_str = '' if like_count_str: + likers_post_id = like_post_id.replace('/', '--') likers_screen_link = \ '/users/' + nickname + '?likers=' + likers_post_id - likers_screen_link = \ - '" + \ - like_title + like_count_str + '' + + # show the number of likes next to icon + like_str += '\n' + like_str += \ ' \n' + '?tl=' + box_name + '" title="' + like_title + like_count_str + '">\n' like_str += \ ' ' + \ '' + liker_name + '' + '' html_str += '
\n' + likers_list + '\n
\n' return html_str + html_footer() From e1200b9af3f67214662acb80eb1c625b33a020d3 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 1 Mar 2022 14:52:17 +0000 Subject: [PATCH 08/12] Liker screen names in similar style to hashtag categories --- epicyon-profile.css | 23 +++++++++++++++++++++++ webapp_likers.py | 4 ++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/epicyon-profile.css b/epicyon-profile.css index c770cdb4c..85f5508da 100644 --- a/epicyon-profile.css +++ b/epicyon-profile.css @@ -1,6 +1,11 @@ @charset "UTF-8"; :root { + --liker-names-margin: 2%; + --liker-names-size1: 30px; + --liker-names-size2: 40px; + --liker-names-vertical-spacing1: 50px; + --liker-names-vertical-spacing2: 100px; --pwa-theme-color: apple-mobile-web-app-status-bar-style; --pwa-theme-background-color: black-translucent; --avatar-rounding: 10%; @@ -1078,6 +1083,12 @@ div.container { font-size: var(--font-size); color: var(--title-color); } + .likerNames { + font-size: var(--liker-names-size1); + font-family: Arial, Helvetica, sans-serif; + margin: var(--liker-names-margin); + line-height: var(--liker-names-vertical-spacing1); + } .profileHeader img.vcard { width: var(--vcard-icon-size); float: right; @@ -1845,6 +1856,12 @@ div.container { blockquote { font-size: var(--quote-font-size-mobile); } + .likerNames { + font-size: var(--liker-names-size2); + font-family: Arial, Helvetica, sans-serif; + margin: var(--liker-names-margin); + line-height: var(--liker-names-vertical-spacing2); + } .profileHeader img.vcard { width: var(--vcard-icon-size-mobile); float: right; @@ -2584,6 +2601,12 @@ div.container { blockquote { font-size: var(--quote-font-size-tiny); } + .likerNames { + font-size: var(--font-size2); + font-family: 'NimbusSanL'; + margin: var(--liker-names-margin); + line-height: var(--liker-names-vertical-spacing2); + } .profileHeader img.vcard { width: var(--vcard-icon-size-tiny); float: right; diff --git a/webapp_likers.py b/webapp_likers.py index 1659c6261..088f69104 100644 --- a/webapp_likers.py +++ b/webapp_likers.py @@ -126,9 +126,9 @@ def html_likers_of_post(base_dir: str, nickname: str, else: liker_name = get_nickname_from_actor(liker_actor) if likers_list: - likers_list += ' ' + likers_list += ' ' likers_list += \ - '