mirror of https://gitlab.com/bashrc2/epicyon
Merge branch 'main' of gitlab.com:bashrc2/epicyon
commit
632a864e55
|
|
@ -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
|
||||||
|
|
|
||||||
2
inbox.py
2
inbox.py
|
|
@ -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
|
||||||
|
|
|
||||||
40
utils.py
40
utils.py
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 = \
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue