forked from indymedia/epicyon
				
			Handle displaying replies
							parent
							
								
									445e49b1d0
								
							
						
					
					
						commit
						d2fcb37dd9
					
				
							
								
								
									
										89
									
								
								daemon.py
								
								
								
								
							
							
						
						
									
										89
									
								
								daemon.py
								
								
								
								
							|  | @ -284,13 +284,98 @@ class PubServer(BaseHTTPRequestHandler): | |||
|                             else: | ||||
|                                 self._404() | ||||
|                                 self.server.GETbusy=False | ||||
|                                 return                         | ||||
|                                 return | ||||
|         # get replies to a post /users/nickname/statuses/number/replies | ||||
|         if self.path.endswith('/replies'): | ||||
|             if '/statuses/' in self.path and '/users/' in self.path: | ||||
|                 namedStatus=self.path.split('/users/')[1] | ||||
|                 if '/' in namedStatus: | ||||
|                     postSections=namedStatus.split('/') | ||||
|                     if len(postSections)>=4: | ||||
|                         if postSections[3].startswith('replies'): | ||||
|                             nickname=postSections[0] | ||||
|                             statusNumber=postSections[2] | ||||
|                             if len(statusNumber)>10 and statusNumber.isdigit(): | ||||
|                                 #get the replies file | ||||
|                                 domainFull=self.server.domain | ||||
|                                 if self.server.port!=80 and self.server.port!=443: | ||||
|                                     domainFull=self.server.domain+':'+str(self.server.port) | ||||
|                                     boxname='outbox' | ||||
|                                     postDir=self.server.baseDir+'/accounts/'+nickname+'@'+self.server.domain+'/'+boxname | ||||
|                                     postRepliesFilename= \ | ||||
|                                         postDir+'/'+ \ | ||||
|                                         self.server.httpPrefix+':##'+domainFull+'#users#'+nickname+'#statuses#'+statusNumber+'.replies' | ||||
|                                     if not os.path.isfile(postRepliesFilename): | ||||
|                                         # There are no replies, so show empty collection | ||||
|                                         repliesJson = { | ||||
|                                             '@context': 'https://www.w3.org/ns/activitystreams', | ||||
|                                             'first': self.server.httpPrefix+'://'+self.server.domain+'/users/'+nickname+'/statuses/'+statusNumber+'?page=true', | ||||
|                                             'id': self.server.httpPrefix+'://'+self.server.domain+'/users/'+nickname+'/statuses/'+statusNumber, | ||||
|                                             'last': self.server.httpPrefix+'://'+self.server.domain+'/users/'+nickname+'/statuses/'+statusNumber+'?page=true', | ||||
|                                             'totalItems': 0, | ||||
|                                             'type': 'OrderedCollection'} | ||||
|                                         self._set_headers('application/json') | ||||
|                                         self.wfile.write(json.dumps(repliesJson).encode('utf-8')) | ||||
|                                         self.server.GETbusy=False | ||||
|                                         return | ||||
|                                     else: | ||||
|                                         # replies exist. Itterate through the text file containing message ids | ||||
|                                         repliesJson = { | ||||
|                                             '@context': 'https://www.w3.org/ns/activitystreams', | ||||
|                                             'id': self.server.httpPrefix+'://'+self.server.domain+'/users/'+nickname+'/statuses/'+statusNumber+'?page=true', | ||||
|                                             'orderedItems': [ | ||||
|                                             ], | ||||
|                                             'partOf': self.server.httpPrefix+'://'+self.server.domain+'/users/'+nickname+'/statuses/'+statusNumber, | ||||
|                                             'type': 'OrderedCollectionPage'} | ||||
|                                         # some messages could be private, so check authorization state | ||||
|                                         authorized=self._isAuthorized() | ||||
|                                         # populate the items list with replies | ||||
|                                         repliesBoxes=['outbox','inbox'] | ||||
|                                         with open(postRepliesFilename,'r') as repliesFile:  | ||||
|                                             for messageId in repliesFile: | ||||
|                                                 replyFound=False | ||||
|                                                 # examine inbox and outbox | ||||
|                                                 for boxname in repliesBoxes: | ||||
|                                                     searchFilename= \ | ||||
|                                                         self.server.baseDir+ \ | ||||
|                                                         '/accounts/'+nickname+'@'+ \ | ||||
|                                                         self.server.domain+'/'+ \ | ||||
|                                                         boxname+'/'+ \ | ||||
|                                                         messageId.replace('\n','').replace('/','#')+'.json' | ||||
|                                                     if os.path.isfile(searchFilename): | ||||
|                                                         if authorized or \ | ||||
|                                                            'https://www.w3.org/ns/activitystreams#Public' in open(searchFilename).read(): | ||||
|                                                             with open(searchFilename, 'r') as fp: | ||||
|                                                                 postJson=commentjson.load(fp) | ||||
|                                                                 repliesJson['orderedItems'].append(postJson) | ||||
|                                                             replyFound=True | ||||
|                                                         break | ||||
|                                                 # if not in either inbox or outbox then examine the shared inbox | ||||
|                                                 if not replyFound: | ||||
|                                                     searchFilename= \ | ||||
|                                                         self.server.baseDir+ \ | ||||
|                                                         '/accounts/inbox@'+ \ | ||||
|                                                         self.server.domain+'/inbox/'+ \ | ||||
|                                                         messageId.replace('\n','').replace('/','#')+'.json' | ||||
|                                                     if os.path.isfile(searchFilename): | ||||
|                                                         if authorized or \ | ||||
|                                                            'https://www.w3.org/ns/activitystreams#Public' in open(searchFilename).read(): | ||||
|                                                             # get the json of the reply and append it to the collection | ||||
|                                                             with open(searchFilename, 'r') as fp: | ||||
|                                                                 postJson=commentjson.load(fp) | ||||
|                                                                 repliesJson['orderedItems'].append(postJson) | ||||
|                                         # send the replies json | ||||
|                                         self._set_headers('application/json') | ||||
|                                         self.wfile.write(json.dumps(repliesJson).encode('utf-8')) | ||||
|                                         self.server.GETbusy=False | ||||
|                                         return | ||||
| 
 | ||||
|         # get an individual post from the path /users/nickname/statuses/number | ||||
|         if '/statuses/' in self.path and '/users/' in self.path: | ||||
|             namedStatus=self.path.split('/users/')[1] | ||||
|             if '/' in namedStatus: | ||||
|                 postSections=namedStatus.split('/') | ||||
|                 if len(postSections)>=2: | ||||
|                 if len(postSections)>=3: | ||||
|                     nickname=postSections[0] | ||||
|                     statusNumber=postSections[2] | ||||
|                     if len(statusNumber)>10 and statusNumber.isdigit(): | ||||
|  |  | |||
							
								
								
									
										50
									
								
								inbox.py
								
								
								
								
							
							
						
						
									
										50
									
								
								inbox.py
								
								
								
								
							|  | @ -673,42 +673,20 @@ def populateReplies(baseDir :str,httpPrefix :str,domain :str, \ | |||
|     if not postFilename: | ||||
|         if debug: | ||||
|             print('DEBUG: post may have expired - '+replyTo) | ||||
|         return False | ||||
|     with open(postFilename, 'r') as fp: | ||||
|         repliedToJson=commentjson.load(fp) | ||||
|         if not repliedToJson.get('object'): | ||||
|             if debug: | ||||
|                 print('DEBUG: replied to post has no object - '+postFilename) | ||||
|             return False | ||||
|         if not isinstance(repliedToJson['object'], dict): | ||||
|             if debug: | ||||
|                 print('DEBUG: replied to post object is not dict - '+postFilename) | ||||
|             return False | ||||
|         if not repliedToJson['object'].get('replies'): | ||||
|             if debug: | ||||
|                 print('DEBUG: replied to post has no replies attribute - '+postFilename) | ||||
|             return False | ||||
|         if not repliedToJson['object']['replies'].get('first'): | ||||
|             if debug: | ||||
|                 print('DEBUG: replied to post has no first attribute - '+postFilename) | ||||
|             return False | ||||
|         if not repliedToJson['object']['replies']['first'].get('items'): | ||||
|             if debug: | ||||
|                 print('DEBUG: replied to post has no items attribute - '+postFilename) | ||||
|             return False | ||||
|         messageId=messageJson['id'] | ||||
|         repliesList=repliedToJson['object']['replies']['first']['items'] | ||||
|         if messageId not in repliesList: | ||||
|             repliesList.append(messageId) | ||||
|             with open(postFilename, 'w') as fp: | ||||
|                 commentjson.dump(repliedToJson, fp, indent=4, sort_keys=False) | ||||
|                 if debug: | ||||
|                     print('DEBUG: updated replies for '+postFilename) | ||||
|                 return True | ||||
|         else: | ||||
|             if debug: | ||||
|                 print('DEBUG: reply was already added to list')             | ||||
|     return False | ||||
|         return False     | ||||
|     # populate a text file containing the ids of replies | ||||
|     postRepliesFilename=postFilename.replace('.json','.replies') | ||||
|     messageId=messageJson['id'].replace('/activity','') | ||||
|     if os.path.isfile(postRepliesFilename): | ||||
|         if messageId not in open(postRepliesFilename).read(): | ||||
|             repliesFile=open(postRepliesFilename, "a") | ||||
|             repliesFile.write(messageId+'\n') | ||||
|             repliesFile.close() | ||||
|     else: | ||||
|         repliesFile=open(postRepliesFilename, "w") | ||||
|         repliesFile.write(messageId+'\n') | ||||
|         repliesFile.close() | ||||
|     return True | ||||
|                  | ||||
| def inboxAfterCapabilities(session,keyId: str,handle: str,messageJson: {}, \ | ||||
|                            baseDir: str,httpPrefix: str,sendThreads: [], \ | ||||
|  |  | |||
							
								
								
									
										12
									
								
								utils.py
								
								
								
								
							
							
						
						
									
										12
									
								
								utils.py
								
								
								
								
							|  | @ -120,20 +120,24 @@ def followPerson(baseDir: str,nickname: str, domain: str, \ | |||
|         followfile.write(handleToFollow+'\n') | ||||
|     return True | ||||
| 
 | ||||
| def locatePost(baseDir: str,nickname: str,domain: str,postUrl: str): | ||||
| def locatePost(baseDir: str,nickname: str,domain: str,postUrl: str,replies=False) -> str: | ||||
|     """Returns the filename for the given status post url | ||||
|     """ | ||||
|     if not replies: | ||||
|         extension='json' | ||||
|     else: | ||||
|         extension='replies' | ||||
|     # if this post in the shared inbox? | ||||
|     handle='inbox@'+domain | ||||
|     boxName='inbox' | ||||
|     postFilename=baseDir+'/accounts/'+nickname+'@'+domain+'/'+boxName+'/'+postUrl.replace('/','#')+'.json' | ||||
|     postFilename=baseDir+'/accounts/'+nickname+'@'+domain+'/'+boxName+'/'+postUrl.replace('/','#')+'.'+extension | ||||
|     if not os.path.isfile(postFilename): | ||||
|         boxName='outbox' | ||||
|         postFilename=baseDir+'/accounts/'+nickname+'@'+domain+'/'+boxName+'/'+postUrl.replace('/','#')+'.json' | ||||
|         postFilename=baseDir+'/accounts/'+nickname+'@'+domain+'/'+boxName+'/'+postUrl.replace('/','#')+'.'+extension | ||||
|         if not os.path.isfile(postFilename): | ||||
|             # if this post in the inbox of the person? | ||||
|             boxName='inbox' | ||||
|             postFilename=baseDir+'/accounts/'+nickname+'@'+domain+'/'+boxName+'/'+postUrl.replace('/','#')+'.json' | ||||
|             postFilename=baseDir+'/accounts/'+nickname+'@'+domain+'/'+boxName+'/'+postUrl.replace('/','#')+'.'+extension | ||||
|             if not os.path.isfile(postFilename): | ||||
|                 postFilename=None | ||||
|     return postFilename | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue