diff --git a/content.py b/content.py
index ff1535495..0538699b7 100644
--- a/content.py
+++ b/content.py
@@ -15,6 +15,7 @@ import email.parser
import urllib.parse
from shutil import copyfile
from dateutil.parser import parse
+from utils import get_full_domain
from utils import get_user_paths
from utils import convert_published_to_local_timezone
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:
return True
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)
diff --git a/daemon.py b/daemon.py
index 24558dc64..6c3b88933 100644
--- a/daemon.py
+++ b/daemon.py
@@ -264,6 +264,8 @@ from shares import shares_catalog_account_endpoint
from shares import shares_catalog_csv_endpoint
from categories import set_hashtag_category
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 set_actor_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_approve_follow_request_thread
from announce import create_announce
+from content import add_name_emojis_to_tags
from content import load_dogwhistles
from content import valid_url_lengths
from content import contains_invalid_local_links
@@ -3491,6 +3494,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.domain_full,
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 = \
html_new_post({}, False, self.server.translate,
base_dir,
@@ -3531,7 +3538,7 @@ class PubServer(BaseHTTPRequestHandler):
bold_reading,
self.server.dogwhistles,
self.server.min_images_for_accounts,
- None, None)
+ None, None, default_post_language)
if msg:
msg = msg.encode('utf-8')
msglen = len(msg)
@@ -3647,6 +3654,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.domain_full,
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 = \
html_new_post({}, False, self.server.translate,
base_dir,
@@ -3686,7 +3697,7 @@ class PubServer(BaseHTTPRequestHandler):
bold_reading,
self.server.dogwhistles,
self.server.min_images_for_accounts,
- None, None)
+ None, None, default_post_language)
if msg:
msg = msg.encode('utf-8')
msglen = len(msg)
@@ -6816,6 +6827,7 @@ class PubServer(BaseHTTPRequestHandler):
actor_changed = True
# change user bio
+ actor_json['tag'] = []
if fields.get('bio'):
if fields['bio'] != actor_json['summary']:
bio_str = remove_html(fields['bio'])
@@ -6831,7 +6843,6 @@ class PubServer(BaseHTTPRequestHandler):
bio_str, [], actor_tags,
self.server.translate)
if actor_tags:
- actor_json['tag'] = []
for _, tag in actor_tags.items():
actor_json['tag'].append(tag)
actor_changed = True
@@ -7695,6 +7706,9 @@ class PubServer(BaseHTTPRequestHandler):
# save actor json file within accounts
if actor_changed:
+ add_name_emojis_to_tags(base_dir, http_prefix,
+ domain, self.server.port,
+ actor_json)
# update the context for the actor
actor_json['@context'] = [
'https://www.w3.org/ns/activitystreams',
@@ -15776,6 +15790,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.domain_full,
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 = \
html_new_post(edit_post_params, media_instance,
translate,
@@ -15818,7 +15836,8 @@ class PubServer(BaseHTTPRequestHandler):
bold_reading,
self.server.dogwhistles,
self.server.min_images_for_accounts,
- new_post_month, new_post_year)
+ new_post_month, new_post_year,
+ default_post_language)
if not msg:
print('Error replying to ' + in_reply_to_url)
self._404()
@@ -20061,6 +20080,11 @@ class PubServer(BaseHTTPRequestHandler):
fields['location'] = None
if not fields.get('languagesDropdown'):
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:
# 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
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
httpd.css_cache = {}
diff --git a/languages.py b/languages.py
index 4563cf8ab..7ac861046 100644
--- a/languages.py
+++ b/languages.py
@@ -8,7 +8,10 @@ __status__ = "Production"
__module_group__ = "Core"
import json
+import os
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 remove_html
from utils import has_object_dict
@@ -326,3 +329,43 @@ def auto_translate_post(base_dir: str, post_json_object: {},
translated_text
return translated_text
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
diff --git a/tests.py b/tests.py
index 36ca163b1..97d883ed9 100644
--- a/tests.py
+++ b/tests.py
@@ -135,6 +135,7 @@ from inbox import valid_inbox
from inbox import valid_inbox_filenames
from inbox import cache_svg_images
from categories import guess_hashtag_category
+from content import add_name_emojis_to_tags
from content import combine_textarea_lines
from content import detect_dogwhistles
from content import remove_script
@@ -7591,6 +7592,22 @@ def _test_uninvert():
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():
base_dir = os.getcwd()
print('Running tests...')
@@ -7608,6 +7625,7 @@ def run_all_tests():
_test_checkbox_names()
_test_thread_functions()
_test_functions()
+ _test_emoji_in_actor_name(base_dir)
_test_uninvert()
_test_hashtag_maps()
_test_combine_lines()
diff --git a/webapp_create_post.py b/webapp_create_post.py
index ba963f0d9..33bf69c64 100644
--- a/webapp_create_post.py
+++ b/webapp_create_post.py
@@ -279,7 +279,8 @@ def html_new_post(edit_post_params: {},
reply_is_chat: bool, bold_reading: bool,
dogwhistles: {},
min_images_for_accounts: [],
- default_month: int, default_year) -> str:
+ default_month: int, default_year: int,
+ default_post_language: str) -> str:
"""New post screen
"""
# get the json if this is an edited post
@@ -796,9 +797,9 @@ def html_new_post(edit_post_params: {},
languages_dropdown += '
'
languages_dropdown = \
languages_dropdown.replace('