forked from indymedia/epicyon
				
			
		
			
	
	
		
			83 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
		
		
			
		
	
	
			83 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
|  | __filename__ = "socnet.py" | ||
|  | __author__ = "Bob Mottram" | ||
|  | __license__ = "AGPL3+" | ||
|  | __version__ = "1.1.0" | ||
|  | __maintainer__ = "Bob Mottram" | ||
|  | __email__ = "bob@freedombone.net" | ||
|  | __status__ = "Production" | ||
|  | 
 | ||
|  | from session import createSession | ||
|  | from webfinger import webfingerHandle | ||
|  | from posts import getPersonBox | ||
|  | from posts import getPostDomains | ||
|  | 
 | ||
|  | 
 | ||
|  | def instancesGraph(baseDir: str, handles: str, | ||
|  |                    proxyType: str, | ||
|  |                    port: int, httpPrefix: str, | ||
|  |                    debug: bool, projectVersion: str) -> str: | ||
|  |     """ Returns a dot graph of federating instances
 | ||
|  |     based upon a few sample handles. | ||
|  |     The handles argument should contain a comma separated list | ||
|  |     of handles on different instances | ||
|  |     """
 | ||
|  |     dotGraphStr = 'digraph instances {\n' | ||
|  |     if ',' not in handles: | ||
|  |         return dotGraphStr + '}\n' | ||
|  |     session = createSession(proxyType) | ||
|  |     if not session: | ||
|  |         return dotGraphStr + '}\n' | ||
|  | 
 | ||
|  |     personCache = {} | ||
|  |     cachedWebfingers = {} | ||
|  |     federationList = [] | ||
|  |     maxMentions = 99 | ||
|  |     maxEmoji = 99 | ||
|  |     maxAttachments = 5 | ||
|  | 
 | ||
|  |     personHandles = handles.split(',') | ||
|  |     for handle in personHandles: | ||
|  |         handle = handle.strip() | ||
|  |         if handle.startswith('@'): | ||
|  |             handle = handle[1:] | ||
|  |         if '@' not in handle: | ||
|  |             continue | ||
|  | 
 | ||
|  |         nickname = handle.split('@')[0] | ||
|  |         domain = handle.split('@')[1] | ||
|  | 
 | ||
|  |         domainFull = domain | ||
|  |         if port: | ||
|  |             if port != 80 and port != 443: | ||
|  |                 if ':' not in domain: | ||
|  |                     domainFull = domain + ':' + str(port) | ||
|  |         handle = httpPrefix + "://" + domainFull + "/@" + nickname | ||
|  |         wfRequest = \ | ||
|  |             webfingerHandle(session, handle, httpPrefix, | ||
|  |                             cachedWebfingers, | ||
|  |                             domain, projectVersion) | ||
|  |         if not wfRequest: | ||
|  |             return dotGraphStr + '}\n' | ||
|  |         if not isinstance(wfRequest, dict): | ||
|  |             print('Webfinger for ' + handle + ' did not return a dict. ' + | ||
|  |                   str(wfRequest)) | ||
|  |             return dotGraphStr + '}\n' | ||
|  | 
 | ||
|  |         (personUrl, pubKeyId, pubKey, | ||
|  |          personId, shaedInbox, | ||
|  |          avatarUrl, displayName) = getPersonBox(baseDir, session, wfRequest, | ||
|  |                                                 personCache, | ||
|  |                                                 projectVersion, httpPrefix, | ||
|  |                                                 nickname, domain, 'outbox') | ||
|  |         postDomains = \ | ||
|  |             getPostDomains(session, personUrl, 64, maxMentions, maxEmoji, | ||
|  |                            maxAttachments, federationList, | ||
|  |                            personCache, debug, | ||
|  |                            projectVersion, httpPrefix, domain, []) | ||
|  |         postDomains.sort() | ||
|  |         for fedDomain in postDomains: | ||
|  |             dotLineStr = '    "' + domain + '" -> "' + fedDomain + '";\n' | ||
|  |             if dotLineStr not in dotGraphStr: | ||
|  |                 dotGraphStr += dotLineStr | ||
|  |     return dotGraphStr + '}\n' |