__filename__ = "conversation.py" __author__ = "Bob Mottram" __license__ = "AGPL3+" __version__ = "1.5.0" __maintainer__ = "Bob Mottram" __email__ = "bob@libreserver.org" __status__ = "Production" __module_group__ = "Timeline" import os from conversation import download_conversation_posts from flags import is_public_post from utils import remove_id_ending from utils import get_config_param from utils import get_nickname_from_actor from utils import get_domain_from_actor from utils import get_attributed_to from utils import text_mode_removals from blocking import is_blocked from webapp_utils import text_mode_browser from webapp_utils import html_header_with_external_style from webapp_utils import html_post_separator from webapp_utils import html_footer from webapp_utils import get_banner_file from webapp_post import individual_post_as_html def html_conversation_view(authorized: bool, post_id: str, translate: {}, base_dir: str, http_prefix: str, nickname: str, domain: str, project_version: str, recent_posts_cache: {}, max_recent_posts: int, session, cached_webfingers, person_cache: {}, port: int, yt_replace_domain: str, twitter_replacement_domain: str, show_published_date_only: bool, peertube_instances: [], allow_local_network_access: bool, theme_name: str, system_language: str, max_like_count: int, signing_priv_key_pem: str, cw_lists: {}, lists_enabled: str, timezone: str, bold_reading: bool, dogwhistles: {}, access_keys: {}, min_images_for_accounts: [], debug: bool, buy_sites: {}, blocked_cache: [], block_federated: [], auto_cw_cache: {}, ua_str: str, default_timeline: str, mitm_servers: []) -> str: """Show a page containing a conversation thread """ conv_posts = \ download_conversation_posts(authorized, session, http_prefix, base_dir, nickname, domain, post_id, debug, mitm_servers) if not conv_posts: return None 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') preload_images = [] metadata_str = '' if post_id: # https://swicg.github.io/activitypub-html-discovery/#html-link-element # link to the activitypub post metadata_str += \ ' \n' conv_str = \ html_header_with_external_style(css_filename, instance_title, metadata_str, preload_images) # banner and row of buttons users_path = '/users/' + nickname banner_file, _ = get_banner_file(base_dir, nickname, domain, theme_name) conv_str += \ '
\n' + \ ' \n' conv_str += '\n' + \ '
\n' separator_str = html_post_separator(base_dir, None) text_mode_separator = '

\n' minimize_all_images = False if nickname in min_images_for_accounts: minimize_all_images = True current_reading_str = '' for post_json_object in conv_posts: show_individual_post_icons = True # if not authorized then only show public posts if not authorized: show_individual_post_icons = False if not is_public_post(post_json_object): continue from_actor = \ get_attributed_to(post_json_object['object']['attributedTo']) from_nickname = get_nickname_from_actor(from_actor) from_domain, _ = get_domain_from_actor(from_actor) # don't show icons on posts from blocked accounts/instances if from_nickname and from_domain: if is_blocked(base_dir, nickname, domain, from_nickname, from_domain, blocked_cache, block_federated): show_individual_post_icons = False allow_deletion = False post_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, allow_deletion, http_prefix, project_version, 'search', yt_replace_domain, twitter_replacement_domain, show_published_date_only, peertube_instances, allow_local_network_access, theme_name, system_language, max_like_count, show_individual_post_icons, show_individual_post_icons, False, False, False, False, cw_lists, lists_enabled, timezone, False, bold_reading, dogwhistles, minimize_all_images, None, buy_sites, auto_cw_cache, mitm_servers) if post_str: conv_str += \ current_reading_str + text_mode_separator + \ separator_str + post_str # show separator at the current reading point current_reading_str = '' if post_json_object.get('id'): if isinstance(post_json_object['id'], str): id_str = remove_id_ending(post_json_object['id']) if post_id in id_str: current_reading_str = '


\n' # if using a text mode browser then don't show SHOW MORE because there # is no way to hide/expand sections. # Also replace MITM text with an eye icon if text_mode_browser(ua_str): conv_str = text_mode_removals(conv_str, translate) conv_str += text_mode_separator + html_footer() return conv_str