mirror of https://gitlab.com/bashrc2/epicyon
				
				
				
			Add dm and reply notifications to speaker endpoint
							parent
							
								
									6a388a7103
								
							
						
					
					
						commit
						66056face5
					
				
							
								
								
									
										12
									
								
								inbox.py
								
								
								
								
							
							
						
						
									
										12
									
								
								inbox.py
								
								
								
								
							|  | @ -58,12 +58,12 @@ from filters import isFiltered | |||
| from utils import updateAnnounceCollection | ||||
| from utils import undoAnnounceCollectionEntry | ||||
| from utils import dangerousMarkup | ||||
| from utils import isDM | ||||
| from utils import isReply | ||||
| from httpsig import messageContentDigest | ||||
| from posts import createDirectMessagePost | ||||
| from posts import validContentWarning | ||||
| from posts import downloadAnnounce | ||||
| from posts import isDM | ||||
| from posts import isReply | ||||
| from posts import isMuted | ||||
| from posts import isImageMedia | ||||
| from posts import sendSignedJson | ||||
|  | @ -1408,7 +1408,9 @@ def _receiveAnnounce(recentPostsCache: {}, | |||
| 
 | ||||
|                 if isRecentPost(postJsonObject): | ||||
|                     if not os.path.isfile(postFilename + '.tts'): | ||||
|                         updateSpeaker(baseDir, nickname, domain, | ||||
|                         domainFull = getFullDomain(domain, port) | ||||
|                         updateSpeaker(baseDir, httpPrefix, | ||||
|                                       nickname, domain, domainFull, | ||||
|                                       postJsonObject, personCache, | ||||
|                                       translate, lookupActor) | ||||
|                         ttsFile = open(postFilename + '.tts', "w+") | ||||
|  | @ -2491,7 +2493,9 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, | |||
|                 else: | ||||
|                     if boxname == 'inbox': | ||||
|                         if isRecentPost(postJsonObject): | ||||
|                             updateSpeaker(baseDir, nickname, domain, | ||||
|                             domainFull = getFullDomain(domain, port) | ||||
|                             updateSpeaker(baseDir, httpPrefix, | ||||
|                                           nickname, domain, domainFull, | ||||
|                                           postJsonObject, personCache, | ||||
|                                           translate, None) | ||||
|                     if not unitTest: | ||||
|  |  | |||
							
								
								
									
										62
									
								
								posts.py
								
								
								
								
							
							
						
						
									
										62
									
								
								posts.py
								
								
								
								
							|  | @ -2921,34 +2921,6 @@ def createModeration(baseDir: str, nickname: str, domain: str, port: int, | |||
|     return boxItems | ||||
| 
 | ||||
| 
 | ||||
| def isDM(postJsonObject: {}) -> bool: | ||||
|     """Returns true if the given post is a DM | ||||
|     """ | ||||
|     if postJsonObject['type'] != 'Create': | ||||
|         return False | ||||
|     if not postJsonObject.get('object'): | ||||
|         return False | ||||
|     if not isinstance(postJsonObject['object'], dict): | ||||
|         return False | ||||
|     if postJsonObject['object']['type'] != 'Note' and \ | ||||
|        postJsonObject['object']['type'] != 'Patch' and \ | ||||
|        postJsonObject['object']['type'] != 'EncryptedMessage' and \ | ||||
|        postJsonObject['object']['type'] != 'Article': | ||||
|         return False | ||||
|     if postJsonObject['object'].get('moderationStatus'): | ||||
|         return False | ||||
|     fields = ('to', 'cc') | ||||
|     for f in fields: | ||||
|         if not postJsonObject['object'].get(f): | ||||
|             continue | ||||
|         for toAddress in postJsonObject['object'][f]: | ||||
|             if toAddress.endswith('#Public'): | ||||
|                 return False | ||||
|             if toAddress.endswith('followers'): | ||||
|                 return False | ||||
|     return True | ||||
| 
 | ||||
| 
 | ||||
| def isImageMedia(session, baseDir: str, httpPrefix: str, | ||||
|                  nickname: str, domain: str, | ||||
|                  postJsonObject: {}, translate: {}, | ||||
|  | @ -2992,40 +2964,6 @@ def isImageMedia(session, baseDir: str, httpPrefix: str, | |||
|     return False | ||||
| 
 | ||||
| 
 | ||||
| def isReply(postJsonObject: {}, actor: str) -> bool: | ||||
|     """Returns true if the given post is a reply to the given actor | ||||
|     """ | ||||
|     if postJsonObject['type'] != 'Create': | ||||
|         return False | ||||
|     if not postJsonObject.get('object'): | ||||
|         return False | ||||
|     if not isinstance(postJsonObject['object'], dict): | ||||
|         return False | ||||
|     if postJsonObject['object'].get('moderationStatus'): | ||||
|         return False | ||||
|     if postJsonObject['object']['type'] != 'Note' and \ | ||||
|        postJsonObject['object']['type'] != 'EncryptedMessage' and \ | ||||
|        postJsonObject['object']['type'] != 'Article': | ||||
|         return False | ||||
|     if postJsonObject['object'].get('inReplyTo'): | ||||
|         if isinstance(postJsonObject['object']['inReplyTo'], str): | ||||
|             if postJsonObject['object']['inReplyTo'].startswith(actor): | ||||
|                 return True | ||||
|     if not postJsonObject['object'].get('tag'): | ||||
|         return False | ||||
|     if not isinstance(postJsonObject['object']['tag'], list): | ||||
|         return False | ||||
|     for tag in postJsonObject['object']['tag']: | ||||
|         if not tag.get('type'): | ||||
|             continue | ||||
|         if tag['type'] == 'Mention': | ||||
|             if not tag.get('href'): | ||||
|                 continue | ||||
|             if actor in tag['href']: | ||||
|                 return True | ||||
|     return False | ||||
| 
 | ||||
| 
 | ||||
| def _addPostStringToTimeline(postStr: str, boxname: str, | ||||
|                              postsInBox: [], boxActor: str) -> bool: | ||||
|     """ is this a valid timeline post? | ||||
|  |  | |||
							
								
								
									
										27
									
								
								speaker.py
								
								
								
								
							
							
						
						
									
										27
									
								
								speaker.py
								
								
								
								
							|  | @ -12,6 +12,8 @@ import random | |||
| import urllib.parse | ||||
| from auth import createBasicAuthHeader | ||||
| from session import getJson | ||||
| from utils import isDM | ||||
| from utils import isReply | ||||
| from utils import camelCaseSplit | ||||
| from utils import getDomainFromActor | ||||
| from utils import getNicknameFromActor | ||||
|  | @ -263,7 +265,8 @@ def getSpeakerFromServer(baseDir: str, session, | |||
| 
 | ||||
| def _speakerEndpointJson(displayName: str, summary: str, | ||||
|                          content: str, imageDescription: str, | ||||
|                          links: [], gender: str, postId: str) -> {}: | ||||
|                          links: [], gender: str, postId: str, | ||||
|                          postDM: bool, postReply: bool) -> {}: | ||||
|     """Returns a json endpoint for the TTS speaker | ||||
|     """ | ||||
|     speakerJson = { | ||||
|  | @ -272,7 +275,11 @@ def _speakerEndpointJson(displayName: str, summary: str, | |||
|         "say": content, | ||||
|         "imageDescription": imageDescription, | ||||
|         "detectedLinks": links, | ||||
|         "id": postId | ||||
|         "id": postId, | ||||
|         "notify": { | ||||
|             "dm": postDM, | ||||
|             "reply": postReply | ||||
|         } | ||||
|     } | ||||
|     if gender: | ||||
|         speakerJson['gender'] = gender | ||||
|  | @ -360,7 +367,8 @@ def getSSMLbox(baseDir: str, path: str, | |||
|                                 instanceTitle, gender) | ||||
| 
 | ||||
| 
 | ||||
| def _postToSpeakerJson(baseDir: str, nickname: str, domain: str, | ||||
| def _postToSpeakerJson(baseDir: str, httpPrefix: str, | ||||
|                        nickname: str, domain: str, domainFull: str, | ||||
|                        postJsonObject: {}, personCache: {}, | ||||
|                        translate: {}, announcingActor: str) -> {}: | ||||
|     """Converts an ActivityPub post into some Json containing | ||||
|  | @ -429,19 +437,26 @@ def _postToSpeakerJson(baseDir: str, nickname: str, domain: str, | |||
|     postId = None | ||||
|     if postJsonObject['object'].get('id'): | ||||
|         postId = postJsonObject['object']['id'] | ||||
| 
 | ||||
|     actor = httpPrefix + '://' + domainFull + '/users/' + nickname | ||||
|     postDM = isDM(postJsonObject) | ||||
|     postReply = isReply(postJsonObject, actor) | ||||
|     return _speakerEndpointJson(speakerName, summary, | ||||
|                                 content, imageDescription, | ||||
|                                 detectedLinks, gender, postId) | ||||
|                                 detectedLinks, gender, postId, | ||||
|                                 postDM, postReply) | ||||
| 
 | ||||
| 
 | ||||
| def updateSpeaker(baseDir: str, nickname: str, domain: str, | ||||
| def updateSpeaker(baseDir: str, httpPrefix: str, | ||||
|                   nickname: str, domain: str, domainFull: str, | ||||
|                   postJsonObject: {}, personCache: {}, | ||||
|                   translate: {}, announcingActor: str) -> None: | ||||
|     """ Generates a json file which can be used for TTS announcement | ||||
|     of incoming inbox posts | ||||
|     """ | ||||
|     speakerJson = \ | ||||
|         _postToSpeakerJson(baseDir, nickname, domain, | ||||
|         _postToSpeakerJson(baseDir, httpPrefix, | ||||
|                            nickname, domain, domainFull, | ||||
|                            postJsonObject, personCache, | ||||
|                            translate, announcingActor) | ||||
|     speakerFilename = \ | ||||
|  |  | |||
							
								
								
									
										62
									
								
								utils.py
								
								
								
								
							
							
						
						
									
										62
									
								
								utils.py
								
								
								
								
							|  | @ -2068,3 +2068,65 @@ def rejectPostId(baseDir: str, nickname: str, domain: str, | |||
|     if rejectFile: | ||||
|         rejectFile.write('\n') | ||||
|         rejectFile.close() | ||||
| 
 | ||||
| 
 | ||||
| def isDM(postJsonObject: {}) -> bool: | ||||
|     """Returns true if the given post is a DM | ||||
|     """ | ||||
|     if postJsonObject['type'] != 'Create': | ||||
|         return False | ||||
|     if not postJsonObject.get('object'): | ||||
|         return False | ||||
|     if not isinstance(postJsonObject['object'], dict): | ||||
|         return False | ||||
|     if postJsonObject['object']['type'] != 'Note' and \ | ||||
|        postJsonObject['object']['type'] != 'Patch' and \ | ||||
|        postJsonObject['object']['type'] != 'EncryptedMessage' and \ | ||||
|        postJsonObject['object']['type'] != 'Article': | ||||
|         return False | ||||
|     if postJsonObject['object'].get('moderationStatus'): | ||||
|         return False | ||||
|     fields = ('to', 'cc') | ||||
|     for f in fields: | ||||
|         if not postJsonObject['object'].get(f): | ||||
|             continue | ||||
|         for toAddress in postJsonObject['object'][f]: | ||||
|             if toAddress.endswith('#Public'): | ||||
|                 return False | ||||
|             if toAddress.endswith('followers'): | ||||
|                 return False | ||||
|     return True | ||||
| 
 | ||||
| 
 | ||||
| def isReply(postJsonObject: {}, actor: str) -> bool: | ||||
|     """Returns true if the given post is a reply to the given actor | ||||
|     """ | ||||
|     if postJsonObject['type'] != 'Create': | ||||
|         return False | ||||
|     if not postJsonObject.get('object'): | ||||
|         return False | ||||
|     if not isinstance(postJsonObject['object'], dict): | ||||
|         return False | ||||
|     if postJsonObject['object'].get('moderationStatus'): | ||||
|         return False | ||||
|     if postJsonObject['object']['type'] != 'Note' and \ | ||||
|        postJsonObject['object']['type'] != 'EncryptedMessage' and \ | ||||
|        postJsonObject['object']['type'] != 'Article': | ||||
|         return False | ||||
|     if postJsonObject['object'].get('inReplyTo'): | ||||
|         if isinstance(postJsonObject['object']['inReplyTo'], str): | ||||
|             if postJsonObject['object']['inReplyTo'].startswith(actor): | ||||
|                 return True | ||||
|     if not postJsonObject['object'].get('tag'): | ||||
|         return False | ||||
|     if not isinstance(postJsonObject['object']['tag'], list): | ||||
|         return False | ||||
|     for tag in postJsonObject['object']['tag']: | ||||
|         if not tag.get('type'): | ||||
|             continue | ||||
|         if tag['type'] == 'Mention': | ||||
|             if not tag.get('href'): | ||||
|                 continue | ||||
|             if actor in tag['href']: | ||||
|                 return True | ||||
|     return False | ||||
|  |  | |||
|  | @ -19,9 +19,9 @@ from like import noOfLikes | |||
| from follow import isFollowingActor | ||||
| from posts import postIsMuted | ||||
| from posts import getPersonBox | ||||
| from posts import isDM | ||||
| from posts import downloadAnnounce | ||||
| from posts import populateRepliesJson | ||||
| from utils import isDM | ||||
| from utils import rejectPostId | ||||
| from utils import isRecentPost | ||||
| from utils import getConfigParam | ||||
|  | @ -1304,7 +1304,8 @@ def individualPostAsHtml(allowDownloads: bool, | |||
|                            postJsonObject['id']) | ||||
|             if announceFilename and postJsonObject.get('actor'): | ||||
|                 if not os.path.isfile(announceFilename + '.tts'): | ||||
|                     updateSpeaker(baseDir, nickname, domain, | ||||
|                     updateSpeaker(baseDir, httpPrefix, | ||||
|                                   nickname, domain, domainFull, | ||||
|                                   postJsonObject, personCache, | ||||
|                                   translate, postJsonObject['actor']) | ||||
|                     ttsFile = open(announceFilename + '.tts', "w+") | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue