aboutsummaryrefslogtreecommitdiff
path: root/src/main.py
diff options
context:
space:
mode:
authorArslaan Pathan <[email protected]>2026-07-16 21:25:55 +1200
committerArslaan Pathan <[email protected]>2026-07-16 21:25:55 +1200
commitd9a6838624e78d90eba962b6004796fbfe1b4b8c (patch)
treedeb38f222e132172b8687b57083b681999b509c7 /src/main.py
parentc2a74e7472beace631fcab24986d83326e4c5dd7 (diff)
downloadslack-botnet-d9a6838624e78d90eba962b6004796fbfe1b4b8c.tar.xz
slack-botnet-d9a6838624e78d90eba962b6004796fbfe1b4b8c.zip
Complete voting mechanism
Diffstat (limited to 'src/main.py')
-rw-r--r--src/main.py40
1 files changed, 28 insertions, 12 deletions
diff --git a/src/main.py b/src/main.py
index 9daa8f3..c2855c1 100644
--- a/src/main.py
+++ b/src/main.py
@@ -1,11 +1,13 @@
import os
import re
+import math
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, get_user, add_vote, get_vote_counts
+from .db import init_db, get_user, add_vote, get_vote_counts, get_user_vote, get_deployment, update_deployment_status
+from .utils import generate_voting_blocks
from .auth import app as fastapi_app
-from .botnet import deploy_message
+from .botnet import deploy_message, execute_deployment
import threading
import asyncio
import uvicorn
@@ -88,20 +90,34 @@ async def handle_vote(ack, respond, logger, context, body, client):
await client.chat_postEphemeral(channel=channel_id, user=user_id, text="You must join the botnet first!")
return
- # await respond("Not implemented yet", response_type="ephemeral")
- # await client.chat_postEphemeral(channel=channel_id, user=user_id, text="Not implemented yet")
-
- existing_vote = await get_user_vote(deployment_id, user_id)
- if existing_vote:
- await client.chat_postEphemeral(channel=channel_id, user=user_id, text=f"You already voted {existing_vote} on this deployment!")
+ deployment = await get_deployment(deployment_id)
+ if not deployment or deployment["status"] != "pending":
+ await client.chat_postEphemeral(channel=channel_id,user=user_id,text="Voting for this deployment has expired!")
- await add_vote(deployment, user_id, vote_type)
+ await add_vote(deployment_id, user_id, vote_type)
approve_count, reject_count = await get_vote_counts(deployment_id)
- THRESHOLD = 3 # FIXME: DYNAMICALLY CALCULATE THIS!!
- deployment = await get_deployment(deployment_id)
-
+ active_users = await get_active_users()
+ total_members = len(active_users)
+ THRESHOLD = math.ceil(max(3, min(15, int(total_members * 0.2)))) # min 3, max 15 - use 20% total members
+
+ if approve_count >= THRESHOLD:
+ await update_deployment_status(deployment_id, "approved")
+ await execute_deployment(deployment_id)
+
+ blocks = generate_voting_blocks(deployment_id, deployment["message"], approve_count, reject_count, False)
+ await respond(blocks=blocks,text="An error occurred rendering this text.")
+ await client.chat_postMessage(channel=channel_id, text=f"Deployment #{deployment_id} was approved! ^_^")
+ elif reject_count >= THRESHOLD:
+ await update_deployment_status(deployment_id, "rejected")
+
+ blocks = generate_voting_blocks(deployment_id, deployment["message"], approve_count, reject_count, False)
+ await respond(blocks=blocks,text="An error occurred rendering this text.")
+ await client.chat_postMessage(channel=channel_id, text=f"Deployment #{deployment_id} was rejected! T_T")
+ else:
+ blocks = generate_voting_blocks(deployment_id, deployment["message"], approve_count, reject_count, True)
+ await respond(blocks=blocks,text="An error occurred rendering this text.")
@app.event("message")
async def shut_up_slack_bolt():