from .db import create_deployment, get_daily_user_deployment_count, get_deployment, update_deployment_status, get_active_users, get_user, add_deployment_message, get_deployment_messages from slack_sdk.web.async_client import AsyncWebClient import os from dotenv import load_dotenv DAILY_LIMIT = 2 load_dotenv() selfbot_token = os.environ.get("SLACK_SELFBOT_OAUTH_XOXP") async def deploy_message(user_id: str, message: str): user = await get_user(user_id) if not user: return { "success": False, "error": "You must be part of the botnet to deploy messages!" } daily_count = await get_daily_user_deployment_count(user_id) if daily_count >= DAILY_LIMIT and user_id not in ["U0AKCBZHHMH"]: return { "success": False, "error": f"You've reached your daily limit of {DAILY_LIMIT} messages!" } deployment_id = await create_deployment(user_id, message) print(f"DEBUG: Executing the deployment {deployment_id} on arrival - REMOVE THIS LATER!") await execute_deployment(deployment_id) return { "success": True, "deployment_id": deployment_id, "message": "Your message has been deployed!" } async def execute_deployment(deployment_id: int): deployment = await get_deployment(deployment_id) if not deployment: return users = await get_active_users() message = deployment["message"] for user in users: try: client = AsyncWebClient(token=user["oauth_token"]) response = await client.chat_postMessage( channel="C0BGMV1CAQG", # put it in #botnet for now, make it detect recent thread with CM approval yada yada later text=message, as_user=True ) await add_deployment_message(deployment_id=deployment_id, user_id=user["slack_id"], channel_id="C0BGMV1CAQG", message_id=response["ts"]) except Exception as e: print(f"Failed to send #{deployment_id} on behalf of {user['slack_id']}: {e}") try: client = AsyncWebClient(token=selfbot_token) await client.chat_postMessage( channel="C0BGMV1CAQG", text=f"Deployment #{deployment_id} deployed.\n\nMessage: {message}", as_user=True ) except Exception as e: print(f"Failed to send deployment status message: {e}") await update_deployment_status(deployment_id, "deployed")