mirror of https://gitlab.com/bashrc2/epicyon
Merge branch 'main' of gitlab.com:bashrc2/epicyon
commit
3af1ddedbd
87
daemon.py
87
daemon.py
|
@ -2550,7 +2550,26 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
self.server.themeName,
|
self.server.themeName,
|
||||||
True, accessKeys,
|
True, accessKeys,
|
||||||
customSubmitText,
|
customSubmitText,
|
||||||
conversationId).encode('utf-8')
|
conversationId,
|
||||||
|
self.server.recentPostsCache,
|
||||||
|
self.server.maxRecentPosts,
|
||||||
|
self.server.session,
|
||||||
|
self.server.cachedWebfingers,
|
||||||
|
self.server.personCache,
|
||||||
|
self.server.port,
|
||||||
|
None,
|
||||||
|
self.server.projectVersion,
|
||||||
|
self.server.YTReplacementDomain,
|
||||||
|
self.server.twitterReplacementDomain,
|
||||||
|
self.server.showPublishedDateOnly,
|
||||||
|
self.server.peertubeInstances,
|
||||||
|
self.server.allowLocalNetworkAccess,
|
||||||
|
self.server.systemLanguage,
|
||||||
|
self.server.maxLikeCount,
|
||||||
|
self.server.signingPrivateKeyPem,
|
||||||
|
self.server.CWlists,
|
||||||
|
self.server.listsEnabled,
|
||||||
|
self.server.defaultTimeline).encode('utf-8')
|
||||||
msglen = len(msg)
|
msglen = len(msg)
|
||||||
self._set_headers('text/html', msglen,
|
self._set_headers('text/html', msglen,
|
||||||
cookie, callingDomain, False)
|
cookie, callingDomain, False)
|
||||||
|
@ -2665,7 +2684,26 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
self.server.themeName,
|
self.server.themeName,
|
||||||
True, accessKeys,
|
True, accessKeys,
|
||||||
customSubmitText,
|
customSubmitText,
|
||||||
conversationId).encode('utf-8')
|
conversationId,
|
||||||
|
self.server.recentPostsCache,
|
||||||
|
self.server.maxRecentPosts,
|
||||||
|
self.server.session,
|
||||||
|
self.server.cachedWebfingers,
|
||||||
|
self.server.personCache,
|
||||||
|
self.server.port,
|
||||||
|
None,
|
||||||
|
self.server.projectVersion,
|
||||||
|
self.server.YTReplacementDomain,
|
||||||
|
self.server.twitterReplacementDomain,
|
||||||
|
self.server.showPublishedDateOnly,
|
||||||
|
self.server.peertubeInstances,
|
||||||
|
self.server.allowLocalNetworkAccess,
|
||||||
|
self.server.systemLanguage,
|
||||||
|
self.server.maxLikeCount,
|
||||||
|
self.server.signingPrivateKeyPem,
|
||||||
|
self.server.CWlists,
|
||||||
|
self.server.listsEnabled,
|
||||||
|
self.server.defaultTimeline).encode('utf-8')
|
||||||
msglen = len(msg)
|
msglen = len(msg)
|
||||||
self._set_headers('text/html', msglen,
|
self._set_headers('text/html', msglen,
|
||||||
cookie, callingDomain, False)
|
cookie, callingDomain, False)
|
||||||
|
@ -8186,7 +8224,7 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
'actor': undoActor,
|
'actor': undoActor,
|
||||||
'to': [actorReaction],
|
'to': [actorReaction],
|
||||||
'object': {
|
'object': {
|
||||||
'type': 'EmojiReaction',
|
'type': 'EmojiReact',
|
||||||
'actor': undoActor,
|
'actor': undoActor,
|
||||||
'to': [actorReaction],
|
'to': [actorReaction],
|
||||||
'object': reactionUrl2
|
'object': reactionUrl2
|
||||||
|
@ -8217,8 +8255,8 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
undoReactionCollectionEntry(recentPostsCache,
|
undoReactionCollectionEntry(recentPostsCache,
|
||||||
baseDir,
|
baseDir,
|
||||||
reactionPostFilename, reactionUrl,
|
reactionPostFilename, reactionUrl,
|
||||||
undoActor, domain, debug, None,
|
undoActor, domain, debug,
|
||||||
emojiContent)
|
reactionPostJson, emojiContent)
|
||||||
if debug:
|
if debug:
|
||||||
print('Regenerating html post for changed ' +
|
print('Regenerating html post for changed ' +
|
||||||
'emoji reaction collection')
|
'emoji reaction collection')
|
||||||
|
@ -8259,6 +8297,7 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
else:
|
else:
|
||||||
print('WARN: Unreaction post not found: ' +
|
print('WARN: Unreaction post not found: ' +
|
||||||
reactionPostFilename)
|
reactionPostFilename)
|
||||||
|
|
||||||
self.server.GETbusy = False
|
self.server.GETbusy = False
|
||||||
actorAbsolute = self._getInstanceUrl(callingDomain) + actor
|
actorAbsolute = self._getInstanceUrl(callingDomain) + actor
|
||||||
actorPathStr = \
|
actorPathStr = \
|
||||||
|
@ -8353,7 +8392,7 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
self.server.signingPrivateKeyPem,
|
self.server.signingPrivateKeyPem,
|
||||||
self.server.CWlists,
|
self.server.CWlists,
|
||||||
self.server.listsEnabled,
|
self.server.listsEnabled,
|
||||||
self.server.defaultTimeline)
|
timelineStr, pageNumber)
|
||||||
msg = msg.encode('utf-8')
|
msg = msg.encode('utf-8')
|
||||||
msglen = len(msg)
|
msglen = len(msg)
|
||||||
self._set_headers('text/html', msglen,
|
self._set_headers('text/html', msglen,
|
||||||
|
@ -12518,6 +12557,13 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
|
|
||||||
customSubmitText = getConfigParam(baseDir, 'customSubmitText')
|
customSubmitText = getConfigParam(baseDir, 'customSubmitText')
|
||||||
|
|
||||||
|
postJsonObject = None
|
||||||
|
if inReplyToUrl:
|
||||||
|
replyPostFilename = \
|
||||||
|
locatePost(baseDir, nickname, domain, inReplyToUrl)
|
||||||
|
if replyPostFilename:
|
||||||
|
postJsonObject = loadJson(replyPostFilename)
|
||||||
|
|
||||||
msg = htmlNewPost(self.server.cssCache,
|
msg = htmlNewPost(self.server.cssCache,
|
||||||
mediaInstance,
|
mediaInstance,
|
||||||
translate,
|
translate,
|
||||||
|
@ -12535,7 +12581,26 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
self.server.themeName,
|
self.server.themeName,
|
||||||
noDropDown, accessKeys,
|
noDropDown, accessKeys,
|
||||||
customSubmitText,
|
customSubmitText,
|
||||||
conversationId).encode('utf-8')
|
conversationId,
|
||||||
|
self.server.recentPostsCache,
|
||||||
|
self.server.maxRecentPosts,
|
||||||
|
self.server.session,
|
||||||
|
self.server.cachedWebfingers,
|
||||||
|
self.server.personCache,
|
||||||
|
self.server.port,
|
||||||
|
postJsonObject,
|
||||||
|
self.server.projectVersion,
|
||||||
|
self.server.YTReplacementDomain,
|
||||||
|
self.server.twitterReplacementDomain,
|
||||||
|
self.server.showPublishedDateOnly,
|
||||||
|
self.server.peertubeInstances,
|
||||||
|
self.server.allowLocalNetworkAccess,
|
||||||
|
self.server.systemLanguage,
|
||||||
|
self.server.maxLikeCount,
|
||||||
|
self.server.signingPrivateKeyPem,
|
||||||
|
self.server.CWlists,
|
||||||
|
self.server.listsEnabled,
|
||||||
|
self.server.defaultTimeline).encode('utf-8')
|
||||||
if not msg:
|
if not msg:
|
||||||
print('Error replying to ' + inReplyToUrl)
|
print('Error replying to ' + inReplyToUrl)
|
||||||
self._404()
|
self._404()
|
||||||
|
@ -14903,7 +14968,9 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
self.server.debug)
|
self.server.debug)
|
||||||
|
|
||||||
# emoji reaction from the web interface icon
|
# emoji reaction from the web interface icon
|
||||||
if authorized and htmlGET and '?react=' in self.path:
|
if authorized and htmlGET and \
|
||||||
|
'?react=' in self.path and \
|
||||||
|
'?actor=' in self.path:
|
||||||
self._reactionButton(callingDomain, self.path,
|
self._reactionButton(callingDomain, self.path,
|
||||||
self.server.baseDir,
|
self.server.baseDir,
|
||||||
self.server.httpPrefix,
|
self.server.httpPrefix,
|
||||||
|
@ -14922,7 +14989,9 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
self.server.debug)
|
self.server.debug)
|
||||||
|
|
||||||
# undo an emoji reaction from the web interface icon
|
# undo an emoji reaction from the web interface icon
|
||||||
if authorized and htmlGET and '?unreact=' in self.path:
|
if authorized and htmlGET and \
|
||||||
|
'?unreact=' in self.path and \
|
||||||
|
'?actor=' in self.path:
|
||||||
self._undoReactionButton(callingDomain, self.path,
|
self._undoReactionButton(callingDomain, self.path,
|
||||||
self.server.baseDir,
|
self.server.baseDir,
|
||||||
self.server.httpPrefix,
|
self.server.httpPrefix,
|
||||||
|
|
|
@ -345,6 +345,10 @@ a:visited:hover {
|
||||||
filter: brightness(var(--icon-brightness-change));
|
filter: brightness(var(--icon-brightness-change));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.rlab:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
a:focus {
|
a:focus {
|
||||||
border: 2px solid var(--focus-color);
|
border: 2px solid var(--focus-color);
|
||||||
}
|
}
|
||||||
|
|
15
reaction.py
15
reaction.py
|
@ -51,7 +51,7 @@ def validEmojiContent(emojiContent: str) -> bool:
|
||||||
"""
|
"""
|
||||||
if not emojiContent:
|
if not emojiContent:
|
||||||
return False
|
return False
|
||||||
if len(emojiContent) > 1:
|
if len(emojiContent) > 2:
|
||||||
return False
|
return False
|
||||||
if len(emojiRegex.findall(emojiContent)) == 0:
|
if len(emojiRegex.findall(emojiContent)) == 0:
|
||||||
return False
|
return False
|
||||||
|
@ -514,11 +514,14 @@ def updateReactionCollection(recentPostsCache: {},
|
||||||
|
|
||||||
|
|
||||||
def htmlEmojiReactions(postJsonObject: {}, interactive: bool,
|
def htmlEmojiReactions(postJsonObject: {}, interactive: bool,
|
||||||
actor: str, maxReactionTypes: int) -> str:
|
actor: str, maxReactionTypes: int,
|
||||||
|
boxName: str, pageNumber: int) -> str:
|
||||||
"""html containing row of emoji reactions
|
"""html containing row of emoji reactions
|
||||||
"""
|
"""
|
||||||
if not hasObjectDict(postJsonObject):
|
if not hasObjectDict(postJsonObject):
|
||||||
return ''
|
return ''
|
||||||
|
if not postJsonObject.get('actor'):
|
||||||
|
return ''
|
||||||
if not postJsonObject['object'].get('reactions'):
|
if not postJsonObject['object'].get('reactions'):
|
||||||
return ''
|
return ''
|
||||||
if not postJsonObject['object']['reactions'].get('items'):
|
if not postJsonObject['object']['reactions'].get('items'):
|
||||||
|
@ -542,9 +545,13 @@ def htmlEmojiReactions(postJsonObject: {}, interactive: bool,
|
||||||
htmlStr = '<div class="emojiReactionBar">\n'
|
htmlStr = '<div class="emojiReactionBar">\n'
|
||||||
for emojiContent, count in reactions.items():
|
for emojiContent, count in reactions.items():
|
||||||
if emojiContent not in reactedToByThisActor:
|
if emojiContent not in reactedToByThisActor:
|
||||||
baseUrl = actor + '?react=' + reactBy + '?emojreact='
|
baseUrl = actor + '?react=' + reactBy
|
||||||
else:
|
else:
|
||||||
baseUrl = actor + '?unreact=' + reactBy + '?emojreact='
|
baseUrl = actor + '?unreact=' + reactBy
|
||||||
|
baseUrl += '?actor=' + postJsonObject['actor']
|
||||||
|
baseUrl += '?tl=' + boxName
|
||||||
|
baseUrl += '?page=' + str(pageNumber)
|
||||||
|
baseUrl += '?emojreact='
|
||||||
|
|
||||||
htmlStr += ' <div class="emojiReactionButton">\n'
|
htmlStr += ' <div class="emojiReactionButton">\n'
|
||||||
if count < 100:
|
if count < 100:
|
||||||
|
|
2
tests.py
2
tests.py
|
@ -5914,7 +5914,7 @@ def _testValidEmojiContent() -> None:
|
||||||
assert not validEmojiContent(None)
|
assert not validEmojiContent(None)
|
||||||
assert not validEmojiContent(' ')
|
assert not validEmojiContent(' ')
|
||||||
assert not validEmojiContent('j')
|
assert not validEmojiContent('j')
|
||||||
assert not validEmojiContent('😀😀')
|
assert not validEmojiContent('😀😀😀')
|
||||||
assert validEmojiContent('😀')
|
assert validEmojiContent('😀')
|
||||||
assert validEmojiContent('😄')
|
assert validEmojiContent('😄')
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@ from webapp_utils import htmlFooter
|
||||||
from webapp_utils import editTextField
|
from webapp_utils import editTextField
|
||||||
from webapp_utils import editNumberField
|
from webapp_utils import editNumberField
|
||||||
from webapp_utils import editCurrencyField
|
from webapp_utils import editCurrencyField
|
||||||
|
from webapp_post import individualPostAsHtml
|
||||||
|
|
||||||
|
|
||||||
def _htmlFollowingDataList(baseDir: str, nickname: str,
|
def _htmlFollowingDataList(baseDir: str, nickname: str,
|
||||||
|
@ -195,7 +196,21 @@ def htmlNewPost(cssCache: {}, mediaInstance: bool, translate: {},
|
||||||
defaultTimeline: str, newswire: {},
|
defaultTimeline: str, newswire: {},
|
||||||
theme: str, noDropDown: bool,
|
theme: str, noDropDown: bool,
|
||||||
accessKeys: {}, customSubmitText: str,
|
accessKeys: {}, customSubmitText: str,
|
||||||
conversationId: str) -> str:
|
conversationId: str,
|
||||||
|
recentPostsCache: {}, maxRecentPosts: int,
|
||||||
|
session, cachedWebfingers: {},
|
||||||
|
personCache: {}, port: int,
|
||||||
|
postJsonObject: {},
|
||||||
|
projectVersion: str,
|
||||||
|
YTReplacementDomain: str,
|
||||||
|
twitterReplacementDomain: str,
|
||||||
|
showPublishedDateOnly: bool,
|
||||||
|
peertubeInstances: [],
|
||||||
|
allowLocalNetworkAccess: bool,
|
||||||
|
systemLanguage: str,
|
||||||
|
maxLikeCount: int, signingPrivateKeyPem: str,
|
||||||
|
CWlists: {}, listsEnabled: str,
|
||||||
|
boxName: str) -> str:
|
||||||
"""New post screen
|
"""New post screen
|
||||||
"""
|
"""
|
||||||
replyStr = ''
|
replyStr = ''
|
||||||
|
@ -242,6 +257,31 @@ def htmlNewPost(cssCache: {}, mediaInstance: bool, translate: {},
|
||||||
'" rel="nofollow noopener noreferrer" ' + \
|
'" rel="nofollow noopener noreferrer" ' + \
|
||||||
'target="_blank">' + \
|
'target="_blank">' + \
|
||||||
translate['this post'] + '</a></p>\n'
|
translate['this post'] + '</a></p>\n'
|
||||||
|
if postJsonObject:
|
||||||
|
newPostText += \
|
||||||
|
individualPostAsHtml(signingPrivateKeyPem,
|
||||||
|
True, recentPostsCache,
|
||||||
|
maxRecentPosts,
|
||||||
|
translate, None,
|
||||||
|
baseDir, session,
|
||||||
|
cachedWebfingers,
|
||||||
|
personCache,
|
||||||
|
nickname, domain, port,
|
||||||
|
postJsonObject,
|
||||||
|
None, True, False,
|
||||||
|
httpPrefix, projectVersion,
|
||||||
|
boxName,
|
||||||
|
YTReplacementDomain,
|
||||||
|
twitterReplacementDomain,
|
||||||
|
showPublishedDateOnly,
|
||||||
|
peertubeInstances,
|
||||||
|
allowLocalNetworkAccess,
|
||||||
|
theme, systemLanguage,
|
||||||
|
maxLikeCount,
|
||||||
|
False, False, False,
|
||||||
|
False, False, False,
|
||||||
|
CWlists, listsEnabled)
|
||||||
|
|
||||||
replyStr = '<input type="hidden" ' + \
|
replyStr = '<input type="hidden" ' + \
|
||||||
'name="replyTo" value="' + inReplyTo + '">\n'
|
'name="replyTo" value="' + inReplyTo + '">\n'
|
||||||
|
|
||||||
|
|
|
@ -1937,7 +1937,8 @@ def individualPostAsHtml(signingPrivateKeyPem: str,
|
||||||
if showIcons:
|
if showIcons:
|
||||||
reactionStr = \
|
reactionStr = \
|
||||||
htmlEmojiReactions(postJsonObject, True, personUrl,
|
htmlEmojiReactions(postJsonObject, True, personUrl,
|
||||||
maxReactionTypes)
|
maxReactionTypes,
|
||||||
|
boxName, pageNumber)
|
||||||
if postIsSensitive and reactionStr:
|
if postIsSensitive and reactionStr:
|
||||||
reactionStr = '<br>' + reactionStr
|
reactionStr = '<br>' + reactionStr
|
||||||
postHtml = ' <div id="' + timelinePostBookmark + \
|
postHtml = ' <div id="' + timelinePostBookmark + \
|
||||||
|
@ -2196,7 +2197,7 @@ def htmlEmojiReactionPicker(cssCache: {},
|
||||||
themeName: str, systemLanguage: str,
|
themeName: str, systemLanguage: str,
|
||||||
maxLikeCount: int, signingPrivateKeyPem: str,
|
maxLikeCount: int, signingPrivateKeyPem: str,
|
||||||
CWlists: {}, listsEnabled: str,
|
CWlists: {}, listsEnabled: str,
|
||||||
defaultTimeline: str) -> str:
|
boxName: str, pageNumber: int) -> str:
|
||||||
"""Returns the emoji picker screen
|
"""Returns the emoji picker screen
|
||||||
"""
|
"""
|
||||||
reactedToPostStr = \
|
reactedToPostStr = \
|
||||||
|
@ -2234,6 +2235,9 @@ def htmlEmojiReactionPicker(cssCache: {},
|
||||||
emojiContentEncoded = urllib.parse.quote_plus(emojiContent)
|
emojiContentEncoded = urllib.parse.quote_plus(emojiContent)
|
||||||
emojiUrl = \
|
emojiUrl = \
|
||||||
baseUrl + '?react=' + postId + \
|
baseUrl + '?react=' + postId + \
|
||||||
|
'?actor=' + postJsonObject['actor'] + \
|
||||||
|
'?tl=' + boxName + \
|
||||||
|
'?page=' + str(pageNumber) + \
|
||||||
'?emojreact=' + emojiContentEncoded
|
'?emojreact=' + emojiContentEncoded
|
||||||
emojiLabel = '<label class="rlab">' + emojiContent + '</label>'
|
emojiLabel = '<label class="rlab">' + emojiContent + '</label>'
|
||||||
emojiPicksStr += \
|
emojiPicksStr += \
|
||||||
|
@ -2256,7 +2260,8 @@ def htmlEmojiReactionPicker(cssCache: {},
|
||||||
# banner
|
# banner
|
||||||
headerStr += \
|
headerStr += \
|
||||||
'<header>\n' + \
|
'<header>\n' + \
|
||||||
'<a href="/users/' + nickname + '/' + defaultTimeline + '" title="' + \
|
'<a href="/users/' + nickname + '/' + boxName + \
|
||||||
|
'?page=' + str(pageNumber) + '" title="' + \
|
||||||
translate['Switch to timeline view'] + '" alt="' + \
|
translate['Switch to timeline view'] + '" alt="' + \
|
||||||
translate['Switch to timeline view'] + '">\n'
|
translate['Switch to timeline view'] + '">\n'
|
||||||
headerStr += '<img loading="lazy" class="timeline-banner" ' + \
|
headerStr += '<img loading="lazy" class="timeline-banner" ' + \
|
||||||
|
|
Loading…
Reference in New Issue