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