import os from slack_bolt.app.async_app import AsyncApp from slack_bolt.adapter.socket_mode.async_handler import AsyncSocketModeHandler from dotenv import load_dotenv from .db import init_db from .auth import app as fastapi_app from .botnet import deploy_message import threading import asyncio import uvicorn load_dotenv() selfbot_token = os.environ.get("SLACK_SELFBOT_OAUTH_XOXP") app_token = os.environ.get("SLACK_APP_TOKEN") selfbot_user_id = os.environ.get("SELFBOT_USER_ID") app = AsyncApp(token=selfbot_token) @app.message("") async def handle_messages(message, say): try: if message.get("channel_type") != "im": return if message.get("user") == selfbot_user_id: return if message.get("user") not in ["U0AKCBZHHMH"]: await say("Botnet is temporarily disabled for users other than <@U0AKCBZHHMH> for debugging and the safety of all OAuth-authorized users. Please DM <@U0AKCBZHHMH> if this is not resolved within a few days.") return text = message.get("text", "").strip() if not text.startswith("botnet"): # yay more scuffed arbitrary stuff text = "botnet help" parts = text.split(" ") if len(parts) == 1: # scuffed as hell, just sets it to help arbitrarily so it gets caught later LMAO # too bad, if it works dont touch it parts = ['botnet', 'help'] command = parts[1] args = parts[2:] if command == "help": await say("*Botnet Commands*:\n---\n*botnet help*: shows this message\n*botnet deploy *: sends a message into the deploy queue for review/voting\n*botnet approve *: approve Botnet to function in a channel (must be CM)", mrkdwn=True) elif command == "deploy": if not args: await say("Please provide a message to deploy!") return message_text = " ".join(args) result = await deploy_message(message.get("user"), message_text) if result["success"]: await say(f"^_^ {result['message']} (Deployment #{result['deployment_id']})") else: await say(f"T_T {result['error']}") elif command == "approve": await say("Not implemented yet") else: await say(f"Unknown command: {command}") except Exception as e: print(f"something broke, good luck LMAO {e}") @app.event("message") async def shut_up_slack_bolt(): # shut up that annoying debug warning that this event is unhandled pass async def main(): await init_db() def run_uvicorn(): uvicorn.run(fastapi_app, host="0.0.0.0", port=8000) thread = threading.Thread(target=run_uvicorn, daemon=True) thread.start() handler = AsyncSocketModeHandler(app, app_token=app_token) await handler.start_async() if __name__ == "__main__": # handler = SocketModeHandler(app, app_token=app_token) # handler.start() asyncio.run(main())