aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/db.py1
-rw-r--r--src/main.py40
2 files changed, 28 insertions, 13 deletions
diff --git a/src/db.py b/src/db.py
index f1ae4f6..3ff226e 100644
--- a/src/db.py
+++ b/src/db.py
@@ -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():