mirror of https://gitlab.com/bashrc2/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'
							 |