diff --git a/daemon.py b/daemon.py index 87909d1f3..07c92b2f9 100644 --- a/daemon.py +++ b/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, diff --git a/epicyon-profile.css b/epicyon-profile.css index b6a6add5e..e6663b9d1 100644 --- a/epicyon-profile.css +++ b/epicyon-profile.css @@ -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); } diff --git a/reaction.py b/reaction.py index 536dbc06e..ab42b71f3 100644 --- a/reaction.py +++ b/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 = '
\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 += '
\n' if count < 100: diff --git a/tests.py b/tests.py index 6e3641260..5623dac82 100644 --- a/tests.py +++ b/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('😄') diff --git a/webapp_create_post.py b/webapp_create_post.py index 34205d83d..554149b22 100644 --- a/webapp_create_post.py +++ b/webapp_create_post.py @@ -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'] + '

\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 = '\n' diff --git a/webapp_post.py b/webapp_post.py index 5f8fcc212..486990216 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -1937,7 +1937,8 @@ def individualPostAsHtml(signingPrivateKeyPem: str, if showIcons: reactionStr = \ htmlEmojiReactions(postJsonObject, True, personUrl, - maxReactionTypes) + maxReactionTypes, + boxName, pageNumber) if postIsSensitive and reactionStr: reactionStr = '
' + reactionStr postHtml = '
' + emojiContent + '' emojiPicksStr += \ @@ -2256,7 +2260,8 @@ def htmlEmojiReactionPicker(cssCache: {}, # banner headerStr += \ '
\n' + \ - '\n' headerStr += '