aboutsummaryrefslogtreecommitdiff
path: root/src/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils.py')
-rw-r--r--src/utils.py67
1 files changed, 51 insertions, 16 deletions
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