diff options
| author | Arslaan Pathan <[email protected]> | 2026-07-16 21:25:55 +1200 |
|---|---|---|
| committer | Arslaan Pathan <[email protected]> | 2026-07-16 21:25:55 +1200 |
| commit | d9a6838624e78d90eba962b6004796fbfe1b4b8c (patch) | |
| tree | deb38f222e132172b8687b57083b681999b509c7 /src | |
| parent | c2a74e7472beace631fcab24986d83326e4c5dd7 (diff) | |
| download | slack-botnet-d9a6838624e78d90eba962b6004796fbfe1b4b8c.tar.xz slack-botnet-d9a6838624e78d90eba962b6004796fbfe1b4b8c.zip | |
Complete voting mechanism
Diffstat (limited to 'src')
| -rw-r--r-- | src/db.py | 1 | ||||
| -rw-r--r-- | src/main.py | 40 |
2 files changed, 28 insertions, 13 deletions
@@ -142,7 +142,6 @@ async def get_active_users() -> list[dict]: rows = await cursor.fetchall() return [dict(row) for row in rows] - async def add_vote(deployment_id: int, voter_id: str, vote: str): async with aiosqlite.connect(DB_PATH) as db: await db.execute("INSERT OR REPLACE INTO Votes (deployment_id, voter_id, vote) VALUES (?, ?, ?)", (deployment_id, voter_id, vote)) 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(): |
