Basic Discord functionality with assignments
This commit is contained in:
111
main.py
111
main.py
@@ -1,7 +1,7 @@
|
||||
# main.py (updated)
|
||||
import discord
|
||||
from discord.ext import commands
|
||||
from config import ALLOWED_CHANNEL_ID, HIT_CHECK_INTERVAL, REASSIGN_DELAY
|
||||
from config import ALLOWED_CHANNEL_ID, HIT_CHECK_INTERVAL, REASSIGN_DELAY, DISCORD_TOKEN
|
||||
from cogs.assignments import Assignments
|
||||
from cogs.commands import HitCommands
|
||||
|
||||
@@ -21,6 +21,7 @@ from pydantic import BaseModel
|
||||
from services.server_state import STATE, Member
|
||||
|
||||
from services.torn_api import populate_friendly, populate_enemy, start_friendly_status_loop, start_enemy_status_loop
|
||||
from services.bot_assignment import BotAssignmentManager
|
||||
|
||||
# ============================================================
|
||||
# FastAPI Setup
|
||||
@@ -56,6 +57,10 @@ class RemoveAssignmentRequest(BaseModel):
|
||||
class BotControl(BaseModel):
|
||||
action: str # "start" or "stop"
|
||||
|
||||
class DiscordMappingRequest(BaseModel):
|
||||
torn_id: int
|
||||
discord_id: int
|
||||
|
||||
# ================================
|
||||
# Helper: load JSON file into STATE
|
||||
# ================================
|
||||
@@ -201,13 +206,98 @@ async def api_clear_assignments():
|
||||
# =============================
|
||||
# Bot control endpoint
|
||||
# =============================
|
||||
@app.get("/api/bot_status")
|
||||
async def api_bot_status():
|
||||
"""Get current bot status"""
|
||||
active_count = len(assignment_manager.active_targets) if assignment_manager else 0
|
||||
return {
|
||||
"bot_running": STATE.bot_running,
|
||||
"active_assignments": active_count,
|
||||
"discord_mappings_count": len(assignment_manager.discord_mapping) if assignment_manager else 0
|
||||
}
|
||||
|
||||
@app.post("/api/bot_control")
|
||||
async def api_bot_control(req: BotControl):
|
||||
if req.action not in ("start", "stop"):
|
||||
raise HTTPException(status_code=400, detail="invalid action")
|
||||
|
||||
STATE.bot_running = (req.action == "start")
|
||||
|
||||
# Start or stop the assignment manager
|
||||
if assignment_manager:
|
||||
if req.action == "start":
|
||||
await assignment_manager.start()
|
||||
else:
|
||||
await assignment_manager.stop()
|
||||
|
||||
return {"status": "ok", "bot_running": STATE.bot_running}
|
||||
|
||||
# =============================
|
||||
# Discord Mapping endpoints
|
||||
# =============================
|
||||
@app.get("/api/discord_mappings")
|
||||
async def get_discord_mappings():
|
||||
"""Get all Torn ID to Discord ID mappings"""
|
||||
path = Path("data/discord_mapping.json")
|
||||
if not path.exists():
|
||||
return {"mappings": {}}
|
||||
|
||||
with open(path, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
return {"mappings": data.get("mappings", {})}
|
||||
|
||||
@app.post("/api/discord_mapping")
|
||||
async def add_discord_mapping(req: DiscordMappingRequest):
|
||||
"""Add or update a Torn ID to Discord ID mapping"""
|
||||
path = Path("data/discord_mapping.json")
|
||||
|
||||
# Load existing mappings
|
||||
if path.exists():
|
||||
with open(path, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
else:
|
||||
data = {"comment": "Map Torn player IDs to Discord user IDs", "mappings": {}}
|
||||
|
||||
# Update mapping
|
||||
data["mappings"][str(req.torn_id)] = str(req.discord_id)
|
||||
|
||||
# Save back
|
||||
with open(path, "w", encoding="utf-8") as f:
|
||||
json.dump(data, f, indent=2)
|
||||
|
||||
# Reload in assignment manager
|
||||
if assignment_manager:
|
||||
assignment_manager.load_discord_mapping()
|
||||
|
||||
return {"status": "ok", "torn_id": req.torn_id, "discord_id": req.discord_id}
|
||||
|
||||
@app.delete("/api/discord_mapping/{torn_id}")
|
||||
async def remove_discord_mapping(torn_id: int):
|
||||
"""Remove a Discord mapping"""
|
||||
path = Path("data/discord_mapping.json")
|
||||
|
||||
if not path.exists():
|
||||
raise HTTPException(status_code=404, detail="No mappings found")
|
||||
|
||||
with open(path, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
|
||||
# Remove mapping
|
||||
if str(torn_id) in data.get("mappings", {}):
|
||||
del data["mappings"][str(torn_id)]
|
||||
|
||||
# Save back
|
||||
with open(path, "w", encoding="utf-8") as f:
|
||||
json.dump(data, f, indent=2)
|
||||
|
||||
# Reload in assignment manager
|
||||
if assignment_manager:
|
||||
assignment_manager.load_discord_mapping()
|
||||
|
||||
return {"status": "ok", "torn_id": torn_id}
|
||||
else:
|
||||
raise HTTPException(status_code=404, detail="Mapping not found")
|
||||
|
||||
|
||||
# ============================================================
|
||||
# Reset Groups Endpoint
|
||||
@@ -257,14 +347,27 @@ class HitDispatchBot(commands.Bot):
|
||||
|
||||
bot = HitDispatchBot(command_prefix="!", intents=intents)
|
||||
|
||||
# Initialize bot assignment manager
|
||||
assignment_manager = None
|
||||
|
||||
@bot.event
|
||||
async def on_ready():
|
||||
print(f"Logged in as {bot.user.name}")
|
||||
global assignment_manager
|
||||
print(f"✓ Discord bot logged in as {bot.user.name} (ID: {bot.user.id})")
|
||||
print(f"✓ Bot is in {len(bot.guilds)} server(s)")
|
||||
|
||||
TOKEN = "YOUR_DISCORD_TOKEN"
|
||||
# Initialize assignment manager
|
||||
assignment_manager = BotAssignmentManager(bot)
|
||||
print("✓ Bot assignment manager initialized")
|
||||
|
||||
async def start_bot():
|
||||
await bot.start(TOKEN)
|
||||
try:
|
||||
print("Starting Discord bot...")
|
||||
await bot.start(DISCORD_TOKEN)
|
||||
except discord.LoginFailure:
|
||||
print("ERROR: Invalid Discord token! Please set DISCORD_TOKEN in config.py")
|
||||
except Exception as e:
|
||||
print(f"ERROR starting Discord bot: {e}")
|
||||
|
||||
# ============================================================
|
||||
# Main Entry Point
|
||||
|
||||
Reference in New Issue
Block a user