From f263cef8843fbea7bbd38b6d254351210cd01406 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 20 Aug 2020 17:51:48 +0100 Subject: [PATCH] Receiving event posts --- happening.py | 5 ++-- inbox.py | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++-- outbox.py | 3 ++- 3 files changed, 74 insertions(+), 5 deletions(-) diff --git a/happening.py b/happening.py index 438ffa3ad..c25307efd 100644 --- a/happening.py +++ b/happening.py @@ -43,8 +43,8 @@ def removeEventFromTimeline(eventId: str, tlEventsFilename: str) -> None: pass -def saveEvent(baseDir: str, handle: str, postId: str, - eventJson: {}) -> bool: +def saveEventPost(baseDir: str, handle: str, postId: str, + eventJson: {}) -> bool: """Saves an event to the calendar and/or the events timeline If an event has extra fields, as per Mobilizon, Then it is saved as a separate entity and added to the @@ -71,6 +71,7 @@ def saveEvent(baseDir: str, handle: str, postId: str, eventJson.get('uuid') and eventJson.get('content'): if not validUuid(eventJson['uuid']): return False + print('Mobilizon type event') # if this is a full description of an event then save it # as a separate json file eventsPath = baseDir + '/accounts/' + handle + '/events' diff --git a/inbox.py b/inbox.py index 6141a2682..d7c1baf71 100644 --- a/inbox.py +++ b/inbox.py @@ -64,7 +64,7 @@ from git import isGitPatch from git import receiveGitPatch from followingCalendar import receivingCalendarEvents from content import dangerousMarkup -from happening import saveEvent +from happening import saveEventPost def storeHashTags(baseDir: str, nickname: str, postJsonObject: {}) -> None: @@ -770,6 +770,56 @@ def receiveUndo(session, baseDir: str, httpPrefix: str, return False +def isEventPost(messageJson: {}) -> bool: + """Is the given post a mobilizon-type event activity? + """ + if not messageJson.get('id'): + return False + if not messageJson.get('actor'): + return False + if not messageJson.get('object'): + return False + if not isinstance(messageJson['object'], dict): + return False + if not messageJson['object'].get('type'): + return False + if messageJson['object']['type'] != 'Event': + return False + if not messageJson['object'].get('startTime'): + return False + if not messageJson['object'].get('actor'): + return False + if not messageJson['object'].get('content'): + return False + if not messageJson['object'].get('name'): + return False + if not messageJson['object'].get('uuid'): + return False + return True + + +def receiveEventPost(recentPostsCache: {}, session, baseDir: str, + httpPrefix: str, domain: str, port: int, + sendThreads: [], postLog: [], cachedWebfingers: {}, + personCache: {}, messageJson: {}, federationList: [], + nickname: str, debug: bool) -> bool: + """Receive a mobilizon-type event activity + """ + if not isEventPost(messageJson): + return + print('Receiving event: ' + str(messageJson['object'])) + handle = nickname + '@' + domain + if port: + if port != 80 and port != 443: + handle += ':' + str(port) + + postId = \ + messageJson['id'].replace('/activity', '').replace('/', '#') + postId = postId.replace('/event', '') + + saveEventPost(baseDir, handle, postId, messageJson['object']) + + def personReceiveUpdate(baseDir: str, domain: str, port: int, updateNickname: str, updateDomain: str, @@ -1991,7 +2041,7 @@ def inboxUpdateCalendar(baseDir: str, handle: str, postJsonObject: {}) -> None: continue if not tagDict.get('startTime'): continue - saveEvent(baseDir, handle, postId, tagDict) + saveEventPost(baseDir, handle, postId, tagDict) def inboxUpdateIndex(boxname: str, baseDir: str, handle: str, @@ -2715,6 +2765,23 @@ def runInboxQueue(recentPostsCache: {}, maxRecentPosts: int, queue.pop(0) continue + if receiveEventPost(recentPostsCache, session, + baseDir, httpPrefix, + domain, port, + sendThreads, postLog, + cachedWebfingers, + personCache, + queueJson['post'], + federationList, + queueJson['postNickname'], + debug): + print('Queue: Event activity accepted from ' + keyId) + if os.path.isfile(queueFilename): + os.remove(queueFilename) + if len(queue) > 0: + queue.pop(0) + continue + if receiveUpdate(recentPostsCache, session, baseDir, httpPrefix, domain, port, diff --git a/outbox.py b/outbox.py index bbf863f22..8b99ba705 100644 --- a/outbox.py +++ b/outbox.py @@ -152,7 +152,7 @@ def postMessageToOutbox(messageJson: {}, postToNickname: str, permittedOutboxTypes = ('Create', 'Announce', 'Like', 'Follow', 'Undo', 'Update', 'Add', 'Remove', 'Block', 'Delete', - 'Delegate', 'Skill', 'Bookmark') + 'Delegate', 'Skill', 'Bookmark', 'Event') if messageJson['type'] not in permittedOutboxTypes: if debug: print('DEBUG: POST to outbox - ' + messageJson['type'] + @@ -191,6 +191,7 @@ def postMessageToOutbox(messageJson: {}, postToNickname: str, messageJson['type'] == 'Note' or \ messageJson['type'] == 'EncryptedMessage' or \ messageJson['type'] == 'Article' or \ + messageJson['type'] == 'Event' or \ messageJson['type'] == 'Patch' or \ messageJson['type'] == 'Announce': indexes = [outboxName, "inbox"]