__filename__ = "socnet.py" __author__ = "Bob Mottram" __license__ = "AGPL3+" __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@libreserver.org" __status__ = "Production" __module_group__ = "Moderation" from session import createSession from webfinger import webfingerHandle from posts import getPersonBox from posts import getPostDomains from utils import get_full_domain def instancesGraph(base_dir: str, handles: str, proxy_type: str, port: int, http_prefix: str, debug: bool, project_version: str, system_language: str, signing_priv_key_pem: 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(proxy_type) if not session: return dotGraphStr + '}\n' person_cache = {} cached_webfingers = {} federation_list = [] max_mentions = 99 max_emoji = 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] domain_full = get_full_domain(domain, port) handle = http_prefix + "://" + domain_full + "/@" + nickname wfRequest = \ webfingerHandle(session, handle, http_prefix, cached_webfingers, domain, project_version, debug, False, signing_priv_key_pem) 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' originDomain = None (personUrl, pubKeyId, pubKey, personId, shaedInbox, avatarUrl, displayName, _) = getPersonBox(signing_priv_key_pem, originDomain, base_dir, session, wfRequest, person_cache, project_version, http_prefix, nickname, domain, 'outbox', 27261) wordFrequency = {} postDomains = \ getPostDomains(session, personUrl, 64, max_mentions, max_emoji, maxAttachments, federation_list, person_cache, debug, project_version, http_prefix, domain, wordFrequency, [], system_language, signing_priv_key_pem) postDomains.sort() for fedDomain in postDomains: dotLineStr = ' "' + domain + '" -> "' + fedDomain + '";\n' if dotLineStr not in dotGraphStr: dotGraphStr += dotLineStr return dotGraphStr + '}\n'