__filename__ = "webapp_person_options.py" __author__ = "Bob Mottram" __license__ = "AGPL3+" __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@libreserver.org" __status__ = "Production" __module_group__ = "Web Interface" import os from shutil import copyfile from petnames import get_pet_name from person import is_person_snoozed from posts import is_moderator from utils import get_full_domain from utils import get_config_param from utils import is_dormant from utils import remove_html from utils import get_domain_from_actor from utils import get_nickname_from_actor from utils import is_featured_writer from utils import acct_dir from blocking import is_blocked from follow import is_follower_of_person from follow import is_following_actor from followingCalendar import receiving_calendar_events from notifyOnPost import notify_when_person_posts from webapp_utils import html_header_with_external_style from webapp_utils import html_footer from webapp_utils import get_broken_link_substitute from webapp_utils import html_keyboard_navigation def html_person_options(default_timeline: str, css_cache: {}, translate: {}, base_dir: str, domain: str, domain_full: str, originPathStr: str, optionsActor: str, optionsProfileUrl: str, optionsLink: str, pageNumber: int, donate_url: str, webAddress: str, xmpp_address: str, matrix_address: str, ssb_address: str, blog_address: str, tox_address: str, briar_address: str, jami_address: str, cwtch_address: str, enigma_pub_key: str, pgp_pub_key: str, pgp_fingerprint: str, email_address: str, dormant_months: int, backToPath: str, lockedAccount: bool, movedTo: str, alsoKnownAs: [], text_mode_banner: str, news_instance: bool, authorized: bool, access_keys: {}, isGroup: bool) -> str: """Show options for a person: view/follow/block/report """ optionsDomain, optionsPort = get_domain_from_actor(optionsActor) optionsDomainFull = get_full_domain(optionsDomain, optionsPort) if os.path.isfile(base_dir + '/accounts/options-background-custom.jpg'): if not os.path.isfile(base_dir + '/accounts/options-background.jpg'): copyfile(base_dir + '/accounts/options-background.jpg', base_dir + '/accounts/options-background.jpg') dormant = False followStr = 'Follow' if isGroup: followStr = 'Join' blockStr = 'Block' nickname = None optionsNickname = None followsYou = False if originPathStr.startswith('/users/'): nickname = originPathStr.split('/users/')[1] if '/' in nickname: nickname = nickname.split('/')[0] if '?' in nickname: nickname = nickname.split('?')[0] followerDomain, followerPort = get_domain_from_actor(optionsActor) if is_following_actor(base_dir, nickname, domain, optionsActor): followStr = 'Unfollow' if isGroup: followStr = 'Leave' dormant = \ is_dormant(base_dir, nickname, domain, optionsActor, dormant_months) optionsNickname = get_nickname_from_actor(optionsActor) optionsDomainFull = get_full_domain(optionsDomain, optionsPort) followsYou = \ is_follower_of_person(base_dir, nickname, domain, optionsNickname, optionsDomainFull) if is_blocked(base_dir, nickname, domain, optionsNickname, optionsDomainFull): blockStr = 'Block' optionsLinkStr = '' if optionsLink: optionsLinkStr = \ ' \n' css_filename = base_dir + '/epicyon-options.css' if os.path.isfile(base_dir + '/options.css'): css_filename = base_dir + '/options.css' # To snooze, or not to snooze? That is the question snoozeButtonStr = 'Snooze' if nickname: if is_person_snoozed(base_dir, nickname, domain, optionsActor): snoozeButtonStr = 'Unsnooze' donateStr = '' if donate_url: donateStr = \ ' \n' instanceTitle = \ get_config_param(base_dir, 'instanceTitle') optionsStr = \ html_header_with_external_style(css_filename, instanceTitle, None) optionsStr += html_keyboard_navigation(text_mode_banner, {}, {}) optionsStr += '

\n' optionsStr += '
\n' optionsStr += '
\n' optionsStr += '
\n' optionsStr += ' \n' optionsStr += ' \n' handle = get_nickname_from_actor(optionsActor) + '@' + optionsDomain handleShown = handle if lockedAccount: handleShown += '🔒' if movedTo: handleShown += ' ⌂' if dormant: handleShown += ' 💤' optionsStr += \ '

' + translate['Options for'] + \ ' @' + handleShown + '

\n' if followsYou: optionsStr += \ '

' + translate['Follows you'] + '

\n' if movedTo: newNickname = get_nickname_from_actor(movedTo) newDomain, newPort = get_domain_from_actor(movedTo) if newNickname and newDomain: newHandle = newNickname + '@' + newDomain optionsStr += \ '

' + \ translate['New account'] + \ ': @' + newHandle + '

\n' elif alsoKnownAs: otherAccountsHtml = \ '

' + \ translate['Other accounts'] + ': ' ctr = 0 if isinstance(alsoKnownAs, list): for altActor in alsoKnownAs: if altActor == optionsActor: continue if ctr > 0: otherAccountsHtml += ' ' ctr += 1 altDomain, altPort = get_domain_from_actor(altActor) otherAccountsHtml += \ '' + altDomain + '' elif isinstance(alsoKnownAs, str): if alsoKnownAs != optionsActor: ctr += 1 altDomain, altPort = get_domain_from_actor(alsoKnownAs) otherAccountsHtml += \ '' + altDomain + '' otherAccountsHtml += '

\n' if ctr > 0: optionsStr += otherAccountsHtml if email_address: optionsStr += \ '

' + translate['Email'] + \ ': ' + remove_html(email_address) + '

\n' if xmpp_address: optionsStr += \ '

' + translate['XMPP'] + \ ': ' + \ xmpp_address + '

\n' if matrix_address: optionsStr += \ '

' + translate['Matrix'] + ': ' + \ remove_html(matrix_address) + '

\n' if ssb_address: optionsStr += \ '

SSB: ' + remove_html(ssb_address) + '

\n' if blog_address: optionsStr += \ '

Blog: ' + \ remove_html(blog_address) + '

\n' if tox_address: optionsStr += \ '

Tox: ' + remove_html(tox_address) + '

\n' if briar_address: if briar_address.startswith('briar://'): optionsStr += \ '

' + \ remove_html(briar_address) + '

\n' else: optionsStr += \ '

briar://' + \ remove_html(briar_address) + '

\n' if jami_address: optionsStr += \ '

Jami: ' + remove_html(jami_address) + '

\n' if cwtch_address: optionsStr += \ '

Cwtch: ' + remove_html(cwtch_address) + '

\n' if enigma_pub_key: optionsStr += \ '

Enigma: ' + \ remove_html(enigma_pub_key) + '

\n' if pgp_fingerprint: optionsStr += '

PGP: ' + \ remove_html(pgp_fingerprint).replace('\n', '
') + '

\n' if pgp_pub_key: optionsStr += '

' + \ remove_html(pgp_pub_key).replace('\n', '
') + '

\n' optionsStr += '
\n' optionsStr += ' \n' optionsStr += ' \n' optionsStr += ' \n' if authorized: if originPathStr == '/users/' + nickname: if optionsNickname: # handle = optionsNickname + '@' + optionsDomainFull petname = get_pet_name(base_dir, nickname, domain, handle) optionsStr += \ ' ' + translate['Petname'] + ': \n' + \ ' \n' \ '
\n' # Notify when a post arrives from this person if is_following_actor(base_dir, nickname, domain, optionsActor): checkboxStr = \ ' 🔔' + \ translate['Notify me when this account posts'] + \ '\n
\n' if not notify_when_person_posts(base_dir, nickname, domain, optionsNickname, optionsDomainFull): checkboxStr = checkboxStr.replace(' checked>', '>') optionsStr += checkboxStr checkboxStr = \ ' ' + \ translate['Receive calendar events from this account'] + \ '\n
\n' if not receiving_calendar_events(base_dir, nickname, domain, optionsNickname, optionsDomainFull): checkboxStr = checkboxStr.replace(' checked>', '>') optionsStr += checkboxStr # checkbox for permission to post to newswire newswirePostsPermitted = False if optionsDomainFull == domain_full: admin_nickname = get_config_param(base_dir, 'admin') if (nickname == admin_nickname or (is_moderator(base_dir, nickname) and not is_moderator(base_dir, optionsNickname))): newswireBlockedFilename = \ base_dir + '/accounts/' + \ optionsNickname + '@' + optionsDomain + '/.nonewswire' checkboxStr = \ ' ' + \ translate['Allow news posts'] + \ '\n
\n' if os.path.isfile(newswireBlockedFilename): checkboxStr = checkboxStr.replace(' checked>', '>') else: newswirePostsPermitted = True optionsStr += checkboxStr # whether blogs created by this account are moderated on # the newswire if newswirePostsPermitted: moderatedFilename = \ base_dir + '/accounts/' + \ optionsNickname + '@' + \ optionsDomain + '/.newswiremoderated' checkboxStr = \ ' ' + \ translate['News posts are moderated'] + \ '\n
\n' if not os.path.isfile(moderatedFilename): checkboxStr = checkboxStr.replace(' checked>', '>') optionsStr += checkboxStr # checkbox for permission to post to featured articles if news_instance and optionsDomainFull == domain_full: admin_nickname = get_config_param(base_dir, 'admin') if (nickname == admin_nickname or (is_moderator(base_dir, nickname) and not is_moderator(base_dir, optionsNickname))): checkboxStr = \ ' ' + \ translate['Featured writer'] + \ '\n
\n' if not is_featured_writer(base_dir, optionsNickname, optionsDomain): checkboxStr = checkboxStr.replace(' checked>', '>') optionsStr += checkboxStr optionsStr += optionsLinkStr backPath = '/' if nickname: backPath = '/users/' + nickname + '/' + default_timeline if 'moderation' in backToPath: backPath = '/users/' + nickname + '/moderation' if authorized and originPathStr == '/users/' + nickname: optionsStr += \ ' \n' else: optionsStr += \ ' \n' if authorized: optionsStr += \ ' \n' optionsStr += donateStr if authorized: optionsStr += \ ' \n' optionsStr += \ ' \n' optionsStr += \ ' \n' optionsStr += \ ' \n' optionsStr += \ ' \n' if is_moderator(base_dir, nickname): optionsStr += \ ' \n' personNotes = '' if originPathStr == '/users/' + nickname: personNotesFilename = \ acct_dir(base_dir, nickname, domain) + \ '/notes/' + handle + '.txt' if os.path.isfile(personNotesFilename): with open(personNotesFilename, 'r') as fp: personNotes = fp.read() optionsStr += \ '

' + translate['Notes'] + ': \n' optionsStr += '
\n' optionsStr += \ ' \n' optionsStr += \ '
\n' + \ '
\n' + \ '
\n' + \ '
\n' optionsStr += html_footer() return optionsStr