Merge branch 'main' of gitlab.com:bashrc2/epicyon

merge-requests/30/head
Bob Mottram 2022-05-08 19:27:01 +01:00
commit 632a864e55
4 changed files with 114 additions and 55 deletions

View File

@ -16,6 +16,8 @@ import webbrowser
import urllib.parse import urllib.parse
from pathlib import Path from pathlib import Path
from random import randint from random import randint
from utils import disallow_announce
from utils import disallow_reply
from utils import get_base_content_from_post from utils import get_base_content_from_post
from utils import has_object_dict from utils import has_object_dict
from utils import get_full_domain from utils import get_full_domain
@ -117,6 +119,8 @@ def _desktop_help() -> None:
'Previous page in the timeline') 'Previous page in the timeline')
print(indent + 'read [post number] ' + print(indent + 'read [post number] ' +
'Read a post from a timeline') 'Read a post from a timeline')
print(indent + 'show [post number] ' +
'Read a post from a timeline')
print(indent + 'open [post number] ' + print(indent + 'open [post number] ' +
'Open web links within a timeline post') 'Open web links within a timeline post')
print(indent + 'profile [post number or handle] ' + print(indent + 'profile [post number or handle] ' +
@ -1662,11 +1666,18 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str,
screenreader, system_language, espeak, screenreader, system_language, espeak,
page_number, page_number,
new_replies_exist, new_dms_exist) new_replies_exist, new_dms_exist)
elif command_str.startswith('read ') or command_str == 'read': elif (command_str.startswith('read ') or
if command_str == 'read': command_str.startswith('show ') or
command_str == 'read' or
command_str == 'show'):
if command_str == 'read' or \
command_str == 'show':
post_index_str = '1' post_index_str = '1'
else: else:
post_index_str = command_str.split('read ')[1] if 'read ' in command_str:
post_index_str = command_str.split('read ')[1]
else:
post_index_str = command_str.split('show ')[1]
if box_json and post_index_str.isdigit(): if box_json and post_index_str.isdigit():
_desktop_clear_screen() _desktop_clear_screen()
_desktop_show_banner() _desktop_show_banner()
@ -1757,27 +1768,34 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str,
print('') print('')
elif command_str in ('reply', 'r'): elif command_str in ('reply', 'r'):
if post_json_object: if post_json_object:
if post_json_object.get('id'): post_content = ''
post_id = post_json_object['id'] if post_json_object['object'].get('content'):
subject = None post_content = post_json_object['object']['content']
if post_json_object['object'].get('summary'): if not disallow_reply(post_content):
subject = post_json_object['object']['summary'] if post_json_object.get('id'):
conversation_id = None post_id = post_json_object['id']
if post_json_object['object'].get('conversation'): subject = None
conversation_id = \ if post_json_object['object'].get('summary'):
post_json_object['object']['conversation'] subject = post_json_object['object']['summary']
session_reply = create_session(proxy_type) conversation_id = None
_desktop_reply_to_post(session_reply, post_id, if post_json_object['object'].get('conversation'):
base_dir, nickname, password, conversation_id = \
domain, port, http_prefix, post_json_object['object']['conversation']
cached_webfingers, person_cache, session_reply = create_session(proxy_type)
debug, subject, _desktop_reply_to_post(session_reply, post_id,
screenreader, system_language, base_dir, nickname,
languages_understood, password,
espeak, conversation_id, domain, port, http_prefix,
low_bandwidth, cached_webfingers,
content_license_url, person_cache,
signing_priv_key_pem) debug, subject,
screenreader,
system_language,
languages_understood,
espeak, conversation_id,
low_bandwidth,
content_license_url,
signing_priv_key_pem)
refresh_timeline = True refresh_timeline = True
print('') print('')
elif (command_str == 'post' or command_str == 'p' or elif (command_str == 'post' or command_str == 'p' or
@ -2130,25 +2148,30 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str,
post_json_object = \ post_json_object = \
_desktop_get_box_post_object(box_json, curr_index) _desktop_get_box_post_object(box_json, curr_index)
if post_json_object: if post_json_object:
if post_json_object.get('id'): post_content = ''
post_id = post_json_object['id'] if post_json_object['object'].get('content'):
announce_actor = \ post_content = post_json_object['object']['content']
post_json_object['object']['attributedTo'] if not disallow_announce(post_content):
say_str = 'Announcing post by ' + \ if post_json_object.get('id'):
get_nickname_from_actor(announce_actor) post_id = post_json_object['id']
_say_command(say_str, say_str, announce_actor = \
screenreader, post_json_object['object']['attributedTo']
system_language, espeak) say_str = 'Announcing post by ' + \
session_announce = create_session(proxy_type) get_nickname_from_actor(announce_actor)
send_announce_via_server(base_dir, session_announce, _say_command(say_str, say_str,
nickname, password, screenreader,
domain, port, system_language, espeak)
http_prefix, post_id, session_announce = create_session(proxy_type)
cached_webfingers, send_announce_via_server(base_dir,
person_cache, session_announce,
True, __version__, nickname, password,
signing_priv_key_pem) domain, port,
refresh_timeline = True http_prefix, post_id,
cached_webfingers,
person_cache,
True, __version__,
signing_priv_key_pem)
refresh_timeline = True
print('') print('')
elif (command_str.startswith('unannounce') or elif (command_str.startswith('unannounce') or
command_str.startswith('undo announce') or command_str.startswith('undo announce') or
@ -2420,8 +2443,10 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str,
notification_sounds = False notification_sounds = False
elif command_str in ('speak', elif command_str in ('speak',
'screen reader on', 'screen reader on',
'speak on',
'speaker on', 'speaker on',
'talker on', 'talker on',
'talk on',
'reader on'): 'reader on'):
if original_screen_reader: if original_screen_reader:
screenreader = original_screen_reader screenreader = original_screen_reader

View File

@ -2505,6 +2505,8 @@ def _valid_post_content(base_dir: str, nickname: str, domain: str,
if 'T' not in published: if 'T' not in published:
return False return False
if 'Z' not in published: if 'Z' not in published:
print('REJECT inbox post does not use Zulu time format. ' +
published)
return False return False
if '.' in published: if '.' in published:
# converts 2022-03-30T17:37:58.734Z into 2022-03-30T17:37:58Z # converts 2022-03-30T17:37:58.734Z into 2022-03-30T17:37:58Z

View File

@ -2753,6 +2753,8 @@ def is_recent_post(post_json_object: {}, max_days: int) -> bool:
recently = days_since_epoch - max_days recently = days_since_epoch - max_days
published_date_str = post_json_object['object']['published'] published_date_str = post_json_object['object']['published']
if '.' in published_date_str:
published_date_str = published_date_str.split('.')[0] + 'Z'
try: try:
published_date = \ published_date = \
datetime.datetime.strptime(published_date_str, datetime.datetime.strptime(published_date_str,
@ -3612,3 +3614,41 @@ def is_i2p_request(calling_domain: str, referer_domain: str,
if referer_domain.endswith('.i2p'): if referer_domain.endswith('.i2p'):
return True return True
return False return False
def disallow_announce(content: str) -> bool:
"""Are announces/boosts not allowed for the given post?
"""
disallow_strings = (
':boost_no:',
':noboost:',
':noboosts:',
':no_boost:',
':no_boosts:',
':boosts_no:',
'dont_repeat',
'dont_announce',
'dont_boost'
)
for diss in disallow_strings:
if diss in content:
return True
return False
def disallow_reply(content: str) -> bool:
"""Are replies not allowed for the given post?
"""
disallow_strings = (
':reply_no:',
':noreply:',
':noreplies:',
':no_reply:',
':no_replies:',
':replies_no:',
'dont_at_me'
)
for diss in disallow_strings:
if diss in content:
return True
return False

View File

@ -25,6 +25,8 @@ from posts import post_is_muted
from posts import get_person_box from posts import get_person_box
from posts import download_announce from posts import download_announce
from posts import populate_replies_json from posts import populate_replies_json
from utils import disallow_announce
from utils import disallow_reply
from utils import convert_published_to_local_timezone from utils import convert_published_to_local_timezone
from utils import remove_hash_from_post_id from utils import remove_hash_from_post_id
from utils import remove_html from utils import remove_html
@ -2020,21 +2022,11 @@ def individual_post_as_html(signing_priv_key_pem: str,
if content_str: if content_str:
# does an emoji indicate a no boost preference? # does an emoji indicate a no boost preference?
# if so then don't show the repeat/announce icon # if so then don't show the repeat/announce icon
if ':boost_no:' in content_str or \ if disallow_announce(content_str):
':noboost:' in content_str or \
':noboosts:' in content_str or \
':no_boost:' in content_str or \
':no_boosts:' in content_str or \
':boosts_no:' in content_str:
announce_str = '' announce_str = ''
# does an emoji indicate a no replies preference? # does an emoji indicate a no replies preference?
# if so then don't show the reply icon # if so then don't show the reply icon
if ':reply_no:' in content_str or \ if disallow_reply(content_str):
':noreply:' in content_str or \
':noreplies:' in content_str or \
':no_reply:' in content_str or \
':no_replies:' in content_str or \
':replies_no:' in content_str:
reply_str = '' reply_str = ''
new_footer_str = \ new_footer_str = \