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'
|