use API to get matrix IDs

This commit is contained in:
Nils Büchner 2024-09-20 14:23:39 +02:00
parent b112692d9d
commit cf2ed9c75e

View file

@ -1,42 +1,40 @@
import redis import redis
import json import json
import traceback import traceback
from . launchpad_singleton import get_launchpad from .launchpad_singleton import get_launchpad
import requests
from bs4 import BeautifulSoup
# Connect to Redis # Connect to Redis
cache = redis.Redis(host='localhost', port=6379, db=0) cache = redis.Redis(host='localhost', port=6379, db=0)
def fetch_matrix_accounts(profile_id): def fetch_matrix_accounts(profile_id):
try: try:
#Try to fetch from cache first # Try to fetch from cache first
cached_result = cache.get(f"matrix_{profile_id}") cached_result = cache.get(f"matrix_{profile_id}")
if cached_result: if cached_result:
return json.loads(cached_result) return json.loads(cached_result)
# Fetch the page # Fetch Launchpad API data
url = "https://launchpad.net/~" + profile_id launchpad = get_launchpad()
response = requests.get(url) person = launchpad.people[profile_id]
page_content = response.content
# Parse the page content # Fetch social accounts by platform (Matrix)
soup = BeautifulSoup(page_content, 'html.parser') matrix_accounts = person.getSocialAccountsByPlatform(platform='Matrix platform')
# Locate the elements containing the Matrix IDs
matrix_ids_elements = soup.find_all('dd', class_='user-social-accounts__item matrix-account')
# Extract the Matrix IDs # Extract the Matrix IDs
matrix_ids = [] matrix_ids = []
for element in matrix_ids_elements: for account in matrix_accounts:
matrix_id = element.find('a').text.strip() username = account['identity']['username']
homeserver = account['identity']['homeserver']
matrix_id = f"@{username}:{homeserver}"
matrix_ids.append(matrix_id) matrix_ids.append(matrix_id)
# Cache the result with expiration time of 30 minutes (1800 seconds) # Cache the result with expiration time of 30 minutes (1800 seconds)
cache.setex(f"matrix_{profile_id}", 1800, json.dumps(matrix_ids)) cache.setex(f"matrix_{profile_id}", 1800, json.dumps(matrix_ids))
return matrix_ids return matrix_ids
except KeyError as e: except KeyError as e:
print(f"Profule with name {profile_id} was not found. Error: {e}") print(f"Profile with name {profile_id} was not found. Error: {e}")
print(traceback.format_exc()) print(traceback.format_exc())
return False return False
except Exception as e: except Exception as e:
@ -47,23 +45,26 @@ def fetch_matrix_accounts(profile_id):
def fetch_group_members(group_name, recurse=False): def fetch_group_members(group_name, recurse=False):
try: try:
#Try to fetch from cache first # Try to fetch from cache first
cached_result = cache.get(f"group_members_{group_name}") cached_result = cache.get(f"group_members_{group_name}")
if cached_result: if cached_result:
return json.loads(cached_result) return json.loads(cached_result)
# Fetch the group from the Launchpad API
launchpad = get_launchpad() launchpad = get_launchpad()
group = launchpad.people[group_name] group = launchpad.people[group_name]
group_members = set() group_members = set()
for person in group.members: for person in group.members:
print(person)
if not person.is_team: if not person.is_team:
group_members.add(person.name) group_members.add(person.name)
continue # Optional recursion to get sub-teams' members
elif recurse:
sub_group_members = fetch_group_members(person.name, recurse=True)
group_members.update(sub_group_members['group_members'])
# MXIDs should be generated for individuals only # Generate MXIDs for individual members
mxids = ['@' + member + ':ubuntu.com' for member in group_members] mxids = [f"@{member}:ubuntu.com" for member in group_members]
result = {'group_members': tuple(group_members), 'group_name': group_name, 'mxids': mxids} result = {'group_members': tuple(group_members), 'group_name': group_name, 'mxids': mxids}
# Cache the result with expiration time of 30 minutes (1800 seconds) # Cache the result with expiration time of 30 minutes (1800 seconds)