mirror of https://gitlab.com/bashrc2/epicyon
Merge branch 'main' of gitlab.com:bashrc2/epicyon
commit
2cf195b9f0
75
content.py
75
content.py
|
@ -15,6 +15,7 @@ import email.parser
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
from shutil import copyfile
|
from shutil import copyfile
|
||||||
from dateutil.parser import parse
|
from dateutil.parser import parse
|
||||||
|
from utils import get_full_domain
|
||||||
from utils import get_user_paths
|
from utils import get_user_paths
|
||||||
from utils import convert_published_to_local_timezone
|
from utils import convert_published_to_local_timezone
|
||||||
from utils import has_object_dict
|
from utils import has_object_dict
|
||||||
|
@ -1998,3 +1999,77 @@ def reject_twitter_summary(base_dir: str, nickname: str, domain: str,
|
||||||
'birdsite' in summary_lower:
|
'birdsite' in summary_lower:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def add_name_emojis_to_tags(base_dir: str, http_prefix: str,
|
||||||
|
domain: str, port: int,
|
||||||
|
actor_json: {}) -> None:
|
||||||
|
"""Add any custom emojis within the name of an actor to
|
||||||
|
the tag list
|
||||||
|
"""
|
||||||
|
if not actor_json.get('name'):
|
||||||
|
return
|
||||||
|
name = actor_json['name']
|
||||||
|
|
||||||
|
# does the name contain an emoji?
|
||||||
|
if ':' not in name:
|
||||||
|
return
|
||||||
|
if ':' not in name.split(':', 1)[1]:
|
||||||
|
return
|
||||||
|
|
||||||
|
# get emojis from the actor name
|
||||||
|
words = name.split(' ')
|
||||||
|
emojis = []
|
||||||
|
for wrd in words:
|
||||||
|
if wrd.startswith(':') and wrd.endswith(':'):
|
||||||
|
if wrd not in emojis:
|
||||||
|
emojis.append(wrd)
|
||||||
|
if not emojis:
|
||||||
|
return
|
||||||
|
|
||||||
|
actor_tags = []
|
||||||
|
if actor_json.get('tag'):
|
||||||
|
actor_tags = actor_json['tag']
|
||||||
|
|
||||||
|
# is the emoji already in the tag list?
|
||||||
|
for tag_dict in actor_tags:
|
||||||
|
if not tag_dict.get('type'):
|
||||||
|
continue
|
||||||
|
if tag_dict['type'] != 'Emoji':
|
||||||
|
continue
|
||||||
|
if not tag_dict.get('name'):
|
||||||
|
continue
|
||||||
|
if not tag_dict['name'].startswith(':'):
|
||||||
|
continue
|
||||||
|
if not tag_dict['name'].endswith(':'):
|
||||||
|
continue
|
||||||
|
if tag_dict['name'] in emojis:
|
||||||
|
emojis.remove(tag_dict['name'])
|
||||||
|
if not emojis:
|
||||||
|
return
|
||||||
|
|
||||||
|
domain_full = get_full_domain(domain, port)
|
||||||
|
for emoji_tag_name in emojis:
|
||||||
|
emoji_name = emoji_tag_name.replace(':', '')
|
||||||
|
emoji_id = \
|
||||||
|
http_prefix + '://' + domain_full + '/emoji/' + \
|
||||||
|
emoji_name
|
||||||
|
url = emoji_id + '.png'
|
||||||
|
emoji_filename = base_dir + '/emoji/' + emoji_name + '.png'
|
||||||
|
updated = None
|
||||||
|
if os.path.isfile(emoji_filename):
|
||||||
|
updated = file_last_modified(emoji_filename)
|
||||||
|
new_tag = {
|
||||||
|
'icon': {
|
||||||
|
'mediaType': 'image/png',
|
||||||
|
'type': 'Image',
|
||||||
|
'url': url
|
||||||
|
},
|
||||||
|
'id': emoji_id,
|
||||||
|
'name': emoji_tag_name,
|
||||||
|
'type': 'Emoji',
|
||||||
|
'updated': '2022-11-15T23:45:42Z'
|
||||||
|
}
|
||||||
|
if updated:
|
||||||
|
new_tag['updated'] = updated
|
||||||
|
actor_json['tag'].append(new_tag)
|
||||||
|
|
35
daemon.py
35
daemon.py
|
@ -264,6 +264,8 @@ from shares import shares_catalog_account_endpoint
|
||||||
from shares import shares_catalog_csv_endpoint
|
from shares import shares_catalog_csv_endpoint
|
||||||
from categories import set_hashtag_category
|
from categories import set_hashtag_category
|
||||||
from categories import update_hashtag_categories
|
from categories import update_hashtag_categories
|
||||||
|
from languages import load_default_post_languages
|
||||||
|
from languages import set_default_post_language
|
||||||
from languages import get_actor_languages
|
from languages import get_actor_languages
|
||||||
from languages import set_actor_languages
|
from languages import set_actor_languages
|
||||||
from languages import get_understood_languages
|
from languages import get_understood_languages
|
||||||
|
@ -346,6 +348,7 @@ from utils import has_group_type
|
||||||
from manualapprove import manual_deny_follow_request_thread
|
from manualapprove import manual_deny_follow_request_thread
|
||||||
from manualapprove import manual_approve_follow_request_thread
|
from manualapprove import manual_approve_follow_request_thread
|
||||||
from announce import create_announce
|
from announce import create_announce
|
||||||
|
from content import add_name_emojis_to_tags
|
||||||
from content import load_dogwhistles
|
from content import load_dogwhistles
|
||||||
from content import valid_url_lengths
|
from content import valid_url_lengths
|
||||||
from content import contains_invalid_local_links
|
from content import contains_invalid_local_links
|
||||||
|
@ -3491,6 +3494,10 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
self.server.domain_full,
|
self.server.domain_full,
|
||||||
self.server.person_cache)
|
self.server.person_cache)
|
||||||
|
|
||||||
|
default_post_language = self.server.system_language
|
||||||
|
if self.server.default_post_language.get(nickname):
|
||||||
|
default_post_language = \
|
||||||
|
self.server.default_post_language[nickname]
|
||||||
msg = \
|
msg = \
|
||||||
html_new_post({}, False, self.server.translate,
|
html_new_post({}, False, self.server.translate,
|
||||||
base_dir,
|
base_dir,
|
||||||
|
@ -3531,7 +3538,7 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
bold_reading,
|
bold_reading,
|
||||||
self.server.dogwhistles,
|
self.server.dogwhistles,
|
||||||
self.server.min_images_for_accounts,
|
self.server.min_images_for_accounts,
|
||||||
None, None)
|
None, None, default_post_language)
|
||||||
if msg:
|
if msg:
|
||||||
msg = msg.encode('utf-8')
|
msg = msg.encode('utf-8')
|
||||||
msglen = len(msg)
|
msglen = len(msg)
|
||||||
|
@ -3647,6 +3654,10 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
self.server.domain_full,
|
self.server.domain_full,
|
||||||
self.server.person_cache)
|
self.server.person_cache)
|
||||||
|
|
||||||
|
default_post_language = self.server.system_language
|
||||||
|
if self.server.default_post_language.get(nickname):
|
||||||
|
default_post_language = \
|
||||||
|
self.server.default_post_language[nickname]
|
||||||
msg = \
|
msg = \
|
||||||
html_new_post({}, False, self.server.translate,
|
html_new_post({}, False, self.server.translate,
|
||||||
base_dir,
|
base_dir,
|
||||||
|
@ -3686,7 +3697,7 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
bold_reading,
|
bold_reading,
|
||||||
self.server.dogwhistles,
|
self.server.dogwhistles,
|
||||||
self.server.min_images_for_accounts,
|
self.server.min_images_for_accounts,
|
||||||
None, None)
|
None, None, default_post_language)
|
||||||
if msg:
|
if msg:
|
||||||
msg = msg.encode('utf-8')
|
msg = msg.encode('utf-8')
|
||||||
msglen = len(msg)
|
msglen = len(msg)
|
||||||
|
@ -6816,6 +6827,7 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
actor_changed = True
|
actor_changed = True
|
||||||
|
|
||||||
# change user bio
|
# change user bio
|
||||||
|
actor_json['tag'] = []
|
||||||
if fields.get('bio'):
|
if fields.get('bio'):
|
||||||
if fields['bio'] != actor_json['summary']:
|
if fields['bio'] != actor_json['summary']:
|
||||||
bio_str = remove_html(fields['bio'])
|
bio_str = remove_html(fields['bio'])
|
||||||
|
@ -6831,7 +6843,6 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
bio_str, [], actor_tags,
|
bio_str, [], actor_tags,
|
||||||
self.server.translate)
|
self.server.translate)
|
||||||
if actor_tags:
|
if actor_tags:
|
||||||
actor_json['tag'] = []
|
|
||||||
for _, tag in actor_tags.items():
|
for _, tag in actor_tags.items():
|
||||||
actor_json['tag'].append(tag)
|
actor_json['tag'].append(tag)
|
||||||
actor_changed = True
|
actor_changed = True
|
||||||
|
@ -7695,6 +7706,9 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
|
|
||||||
# save actor json file within accounts
|
# save actor json file within accounts
|
||||||
if actor_changed:
|
if actor_changed:
|
||||||
|
add_name_emojis_to_tags(base_dir, http_prefix,
|
||||||
|
domain, self.server.port,
|
||||||
|
actor_json)
|
||||||
# update the context for the actor
|
# update the context for the actor
|
||||||
actor_json['@context'] = [
|
actor_json['@context'] = [
|
||||||
'https://www.w3.org/ns/activitystreams',
|
'https://www.w3.org/ns/activitystreams',
|
||||||
|
@ -15776,6 +15790,10 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
self.server.domain_full,
|
self.server.domain_full,
|
||||||
self.server.person_cache)
|
self.server.person_cache)
|
||||||
|
|
||||||
|
default_post_language = self.server.system_language
|
||||||
|
if self.server.default_post_language.get(nickname):
|
||||||
|
default_post_language = \
|
||||||
|
self.server.default_post_language[nickname]
|
||||||
msg = \
|
msg = \
|
||||||
html_new_post(edit_post_params, media_instance,
|
html_new_post(edit_post_params, media_instance,
|
||||||
translate,
|
translate,
|
||||||
|
@ -15818,7 +15836,8 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
bold_reading,
|
bold_reading,
|
||||||
self.server.dogwhistles,
|
self.server.dogwhistles,
|
||||||
self.server.min_images_for_accounts,
|
self.server.min_images_for_accounts,
|
||||||
new_post_month, new_post_year)
|
new_post_month, new_post_year,
|
||||||
|
default_post_language)
|
||||||
if not msg:
|
if not msg:
|
||||||
print('Error replying to ' + in_reply_to_url)
|
print('Error replying to ' + in_reply_to_url)
|
||||||
self._404()
|
self._404()
|
||||||
|
@ -20061,6 +20080,11 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
fields['location'] = None
|
fields['location'] = None
|
||||||
if not fields.get('languagesDropdown'):
|
if not fields.get('languagesDropdown'):
|
||||||
fields['languagesDropdown'] = self.server.system_language
|
fields['languagesDropdown'] = self.server.system_language
|
||||||
|
set_default_post_language(self.server.base_dir, nickname,
|
||||||
|
self.server.domain,
|
||||||
|
fields['languagesDropdown'])
|
||||||
|
self.server.default_post_language[nickname] = \
|
||||||
|
fields['languagesDropdown']
|
||||||
|
|
||||||
if not citations_button_press:
|
if not citations_button_press:
|
||||||
# Store a file which contains the time in seconds
|
# Store a file which contains the time in seconds
|
||||||
|
@ -22340,6 +22364,9 @@ def run_daemon(max_hashtags: int,
|
||||||
# which accounts should minimize all attached images by default
|
# which accounts should minimize all attached images by default
|
||||||
httpd.min_images_for_accounts = load_min_images_for_accounts(base_dir)
|
httpd.min_images_for_accounts = load_min_images_for_accounts(base_dir)
|
||||||
|
|
||||||
|
# default language for each account when creating a new post
|
||||||
|
httpd.default_post_language = load_default_post_languages(base_dir)
|
||||||
|
|
||||||
# caches css files
|
# caches css files
|
||||||
httpd.css_cache = {}
|
httpd.css_cache = {}
|
||||||
|
|
||||||
|
|
43
languages.py
43
languages.py
|
@ -8,7 +8,10 @@ __status__ = "Production"
|
||||||
__module_group__ = "Core"
|
__module_group__ = "Core"
|
||||||
|
|
||||||
import json
|
import json
|
||||||
|
import os
|
||||||
from urllib import request, parse
|
from urllib import request, parse
|
||||||
|
from utils import is_account_dir
|
||||||
|
from utils import acct_dir
|
||||||
from utils import get_actor_languages_list
|
from utils import get_actor_languages_list
|
||||||
from utils import remove_html
|
from utils import remove_html
|
||||||
from utils import has_object_dict
|
from utils import has_object_dict
|
||||||
|
@ -326,3 +329,43 @@ def auto_translate_post(base_dir: str, post_json_object: {},
|
||||||
translated_text
|
translated_text
|
||||||
return translated_text
|
return translated_text
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
|
|
||||||
|
def set_default_post_language(base_dir: str, nickname: str, domain: str,
|
||||||
|
language: str) -> None:
|
||||||
|
"""Sets the default language for new posts
|
||||||
|
"""
|
||||||
|
default_post_language_filename = \
|
||||||
|
acct_dir(base_dir, nickname, domain) + '/.new_post_language'
|
||||||
|
try:
|
||||||
|
with open(default_post_language_filename, 'w+',
|
||||||
|
encoding='utf-8') as fp_lang:
|
||||||
|
fp_lang.write(language)
|
||||||
|
except OSError:
|
||||||
|
print('EX: Unable to write default post language ' +
|
||||||
|
default_post_language_filename)
|
||||||
|
|
||||||
|
|
||||||
|
def load_default_post_languages(base_dir: str) -> {}:
|
||||||
|
"""Returns a dictionary containing the default languages
|
||||||
|
for new posts for each account
|
||||||
|
"""
|
||||||
|
result = {}
|
||||||
|
for _, dirs, _ in os.walk(base_dir + '/accounts'):
|
||||||
|
for handle in dirs:
|
||||||
|
if not is_account_dir(handle):
|
||||||
|
continue
|
||||||
|
nickname = handle.split('@')[0]
|
||||||
|
domain = handle.split('@')[1]
|
||||||
|
default_post_language_filename = \
|
||||||
|
acct_dir(base_dir, nickname, domain) + '/.new_post_language'
|
||||||
|
if not os.path.isfile(default_post_language_filename):
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
with open(default_post_language_filename, 'r',
|
||||||
|
encoding='utf-8') as fp_lang:
|
||||||
|
result[nickname] = fp_lang.read()
|
||||||
|
except OSError:
|
||||||
|
print('EX: Unable to read default post language ' +
|
||||||
|
default_post_language_filename)
|
||||||
|
return result
|
||||||
|
|
18
tests.py
18
tests.py
|
@ -135,6 +135,7 @@ from inbox import valid_inbox
|
||||||
from inbox import valid_inbox_filenames
|
from inbox import valid_inbox_filenames
|
||||||
from inbox import cache_svg_images
|
from inbox import cache_svg_images
|
||||||
from categories import guess_hashtag_category
|
from categories import guess_hashtag_category
|
||||||
|
from content import add_name_emojis_to_tags
|
||||||
from content import combine_textarea_lines
|
from content import combine_textarea_lines
|
||||||
from content import detect_dogwhistles
|
from content import detect_dogwhistles
|
||||||
from content import remove_script
|
from content import remove_script
|
||||||
|
@ -7591,6 +7592,22 @@ def _test_uninvert():
|
||||||
assert result == expected
|
assert result == expected
|
||||||
|
|
||||||
|
|
||||||
|
def _test_emoji_in_actor_name(base_dir: str) -> None:
|
||||||
|
print('test_emoji_in_actor_name')
|
||||||
|
actor_json = {
|
||||||
|
'name': 'First Sea Lord Wibbles :verified:',
|
||||||
|
'tag': []
|
||||||
|
}
|
||||||
|
http_prefix = 'https'
|
||||||
|
domain = 'fluffysupernova.city'
|
||||||
|
port = 443
|
||||||
|
add_name_emojis_to_tags(base_dir, http_prefix,
|
||||||
|
domain, port, actor_json)
|
||||||
|
assert len(actor_json['tag']) == 1
|
||||||
|
assert actor_json['tag'][0].get('updated')
|
||||||
|
assert actor_json['tag'][0]['name'] == ':verified:'
|
||||||
|
|
||||||
|
|
||||||
def run_all_tests():
|
def run_all_tests():
|
||||||
base_dir = os.getcwd()
|
base_dir = os.getcwd()
|
||||||
print('Running tests...')
|
print('Running tests...')
|
||||||
|
@ -7608,6 +7625,7 @@ def run_all_tests():
|
||||||
_test_checkbox_names()
|
_test_checkbox_names()
|
||||||
_test_thread_functions()
|
_test_thread_functions()
|
||||||
_test_functions()
|
_test_functions()
|
||||||
|
_test_emoji_in_actor_name(base_dir)
|
||||||
_test_uninvert()
|
_test_uninvert()
|
||||||
_test_hashtag_maps()
|
_test_hashtag_maps()
|
||||||
_test_combine_lines()
|
_test_combine_lines()
|
||||||
|
|
|
@ -279,7 +279,8 @@ def html_new_post(edit_post_params: {},
|
||||||
reply_is_chat: bool, bold_reading: bool,
|
reply_is_chat: bool, bold_reading: bool,
|
||||||
dogwhistles: {},
|
dogwhistles: {},
|
||||||
min_images_for_accounts: [],
|
min_images_for_accounts: [],
|
||||||
default_month: int, default_year) -> str:
|
default_month: int, default_year: int,
|
||||||
|
default_post_language: str) -> str:
|
||||||
"""New post screen
|
"""New post screen
|
||||||
"""
|
"""
|
||||||
# get the json if this is an edited post
|
# get the json if this is an edited post
|
||||||
|
@ -796,9 +797,9 @@ def html_new_post(edit_post_params: {},
|
||||||
languages_dropdown += ' </select><br>'
|
languages_dropdown += ' </select><br>'
|
||||||
languages_dropdown = \
|
languages_dropdown = \
|
||||||
languages_dropdown.replace('<option value="' +
|
languages_dropdown.replace('<option value="' +
|
||||||
system_language + '">',
|
default_post_language + '">',
|
||||||
'<option value="' +
|
'<option value="' +
|
||||||
system_language +
|
default_post_language +
|
||||||
'" selected>')
|
'" selected>')
|
||||||
replies_section += \
|
replies_section += \
|
||||||
' <label class="labels">' + \
|
' <label class="labels">' + \
|
||||||
|
|
Loading…
Reference in New Issue