From 2eb0e1197b40c07de4a57701504f77345d77dc36 Mon Sep 17 00:00:00 2001 From: Arslaan Pathan Date: Fri, 17 Jul 2026 00:03:03 +1200 Subject: IT WORKS YES YES YES IM SAVED --- src/utils.py | 67 +++++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 51 insertions(+), 16 deletions(-) (limited to 'src/utils.py') diff --git a/src/utils.py b/src/utils.py index a42539f..ec614d6 100644 --- a/src/utils.py +++ b/src/utils.py @@ -1,5 +1,7 @@ import random +import httpx from slack_sdk.web.async_client import AsyncWebClient +from .db import get_approved_channels def generate_voting_blocks(deployment_id: int, message: str, approve_count: int, reject_count: int, voting_enabled: bool): blocks = [ @@ -47,24 +49,57 @@ def generate_voting_blocks(deployment_id: int, message: str, approve_count: int, return blocks -async def get_random_channel(oauth_token: str): - client = AsyncWebClient(token=oauth_token) +async def get_random_channel(user_oauth_token: str, user_id: str) -> str | None: + approved = await get_approved_channels() + print(f"DEBUG get_random_channel: approved = {approved}") + + if not approved: + print("DEBUG get_random_channel: No approved channels") + return None + + random.shuffle(approved) + print(f"DEBUG get_random_channel: shuffled approved = {approved}") + + for channel_id in approved: + print(f"DEBUG get_random_channel: checking channel {channel_id} for user {user_id}") + is_member = await user_is_in_channel(user_oauth_token, channel_id, user_id) + print(f"DEBUG get_random_channel: is_member = {is_member}") + if is_member: + print(f"DEBUG get_random_channel: FOUND! returning {channel_id}") + return channel_id + + print("DEBUG get_random_channel: No channels found") + return None +async def user_is_in_channel(oauth_token: str, channel_id: str, user_id: str) -> bool: + client = AsyncWebClient(token=oauth_token) + try: - response = await client.conversations_list(types="public_channel", limit=200, exclude_archived=True) - - channels = [c for c in response.get("channels", []) if c.get("is_member", False)] + print(f"DEBUG user_is_in_channel: calling conversations_members for {channel_id}") + response = await client.conversations_members(channel=channel_id) + print(f"DEBUG user_is_in_channel: response ok = {response.get('ok')}") + + members = response.get("members", []) + print(f"DEBUG user_is_in_channel: members count = {len(members)}") + print(f"DEBUG user_is_in_channel: looking for {user_id} in members") + + return user_id in members + except Exception as e: + print(f"DEBUG user_is_in_channel: EXCEPTION - {e}") + return False - if not channels: - return None +async def is_user_cm(channel_id: str, user_id: str): + try: + async with httpx.AsyncClient() as client: + response = await client.get(f"https://flaron.halceon.dev/channel/{channel_id}") + + if response.status_code != 200: + return False - channel_approved = False - while not channel_approved: - channel = random.choice(channels) - # FIXME: Check if CM-approved here - channel_approved = True + data = response.json() - return channel - except Exception as e: - print(f"random channel is broken, we might be cooked: {e}") - return None + managers = data.get("managers", []) + return user_id in managers + except Exception in e: + print(f"flaron api failed T_T {e}") + return False -- cgit v1.2.3