disco-reaper/src/core/audit.py
2026-03-22 20:36:11 +05:30

64 lines
2.6 KiB
Python

import logging
from src.core.base import MigrationContext
logger = logging.getLogger(__name__)
async def log_audit_event(context: MigrationContext, title: str, description: str, files: list[dict] | None = None) -> None:
"""
Logs an event by sending a summary to the `#reaper-logs` audit channel.
If the channel does not exist, it will dynamically create it.
"""
async with context._audit_lock:
# 1. Initialize or Validate channel
channel_id = context.state.audit_log_channel
if channel_id:
try:
channels = await context.writer.get_channels()
channel_exists = any(str(ch.get("id")) == str(channel_id) for ch in channels)
if not channel_exists:
context.state.audit_log_channel = None
except Exception as e:
logger.warning(f"Failed to verify audit channel existence: {e}")
if not context.state.audit_log_channel:
try:
channels = await context.writer.get_channels()
channel_id = None
for ch in channels:
name = str(ch.get("name", "")).lower()
if name in ["reaper-logs", "reaper_logs"]:
channel_id = str(ch.get("id"))
break
if not channel_id:
channel_id = await context.writer.create_channel(
name="reaper-logs",
topic="Discord Reaper - Migration audit logs.",
type=0
)
context.state.audit_log_channel = channel_id
# For Fluxer, we still do the lockdown as it's proven to work
if context.target_platform == "fluxer":
await context.writer.set_channel_permission(
channel_id=channel_id,
overwrite_id=context.writer.community_id,
allow=0,
deny=1024,
is_role=True
)
context.state.save_state()
except Exception as e:
logger.error(f"Failed to setup audit log channel: {e}")
return
# 2. Format and send the message (outside the lock since setup is done)
content = f"**[{title}]**\n{description}"
try:
await context.writer.send_marker(context.state.audit_log_channel, content, files=files)
except Exception as e:
logger.error(f"Failed to send audit log event: {e}")