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 = [ { "type": "header", "text": { "type": "plain_text", "text": f"Voting | Deployment #{deployment_id}" } }, { "type": "section", "text": { "type": "mrkdwn", "text": f"*Message:*\n> {message}" } }, { "type": "section", "text": { "type": "mrkdwn", "text": f"*Votes:*\n> Approve: {approve_count}\n> Reject: {reject_count}" } }, ] if voting_enabled: blocks.append({ "type": "actions", "elements": [ { "type": "button", "text": {"type": "plain_text", "text": "Approve ^_^"}, "style": "primary", "action_id": f"vote_approve_{deployment_id}" }, { "type": "button", "text": {"type": "plain_text", "text": "Reject T_T"}, "style": "danger", "action_id": f"vote_reject_{deployment_id}" } ] }) return blocks 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: 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 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 data = response.json() managers = data.get("managers", []) return user_id in managers except Exception in e: print(f"flaron api failed T_T {e}") return False