discordbot/test_usage_counters.py
Slipstream 1a6330537f
feat: Implement command usage tracking
Introduces a new `command_usage_counters` table to track how many times specific commands are used between two users.

- Adds `_ensure_usage_table_exists` to create the table if it doesn't exist.
- Implements `_increment_usage_counter` to update or insert usage counts.
- Adds `_get_usage_count` to retrieve usage counts.
- Integrates usage tracking into the `molest` command (both slash and legacy).
- Adds logging for database operations related to usage tracking.
2025-05-26 21:45:30 -06:00

107 lines
3.8 KiB
Python

#!/usr/bin/env python3
"""
Test script to verify usage counter functionality.
This script demonstrates how to query the usage counters table.
"""
import asyncio
import asyncpg
import os
from dotenv import load_dotenv
# Load environment variables
load_dotenv()
async def test_usage_counters():
"""Test the usage counters functionality."""
# Create database connection
try:
conn_string = f"postgresql://{os.getenv('POSTGRES_USER')}:{os.getenv('POSTGRES_PASSWORD')}@{os.getenv('POSTGRES_HOST')}:{os.getenv('POSTGRES_PORT')}/{os.getenv('POSTGRES_SETTINGS_DB')}"
conn = await asyncpg.connect(conn_string)
print("✅ Connected to database successfully")
except Exception as e:
print(f"❌ Failed to connect to database: {e}")
return
try:
# Check if the table exists
table_exists = await conn.fetchval("""
SELECT EXISTS (
SELECT FROM information_schema.tables
WHERE table_name = 'command_usage_counters'
)
""")
if table_exists:
print("✅ command_usage_counters table exists")
# Get some sample data
records = await conn.fetch("""
SELECT user1_id, user2_id, command_name, usage_count
FROM command_usage_counters
ORDER BY usage_count DESC
LIMIT 10
""")
if records:
print("\n📊 Top 10 command usages:")
print("User1 ID | User2 ID | Command | Count")
print("-" * 45)
for record in records:
print(f"{record['user1_id']} | {record['user2_id']} | {record['command_name']} | {record['usage_count']}")
else:
print("📝 No usage data found yet (table is empty)")
# Get total count
total_count = await conn.fetchval("SELECT COUNT(*) FROM command_usage_counters")
print(f"\n📈 Total unique user-command combinations: {total_count}")
else:
print("⚠️ command_usage_counters table does not exist yet")
print(" It will be created automatically when a command is first used")
except Exception as e:
print(f"❌ Error querying database: {e}")
finally:
await conn.close()
print("🔌 Database connection closed")
async def get_usage_for_users(user1_id: int, user2_id: int):
"""Get usage statistics for a specific pair of users."""
try:
conn_string = f"postgresql://{os.getenv('POSTGRES_USER')}:{os.getenv('POSTGRES_PASSWORD')}@{os.getenv('POSTGRES_HOST')}:{os.getenv('POSTGRES_PORT')}/{os.getenv('POSTGRES_SETTINGS_DB')}"
conn = await asyncpg.connect(conn_string)
records = await conn.fetch("""
SELECT command_name, usage_count
FROM command_usage_counters
WHERE user1_id = $1 AND user2_id = $2
ORDER BY usage_count DESC
""", user1_id, user2_id)
if records:
print(f"\n👥 Usage between users {user1_id} and {user2_id}:")
print("Command | Count")
print("-" * 20)
for record in records:
print(f"{record['command_name']} | {record['usage_count']}")
else:
print(f"📝 No usage data found between users {user1_id} and {user2_id}")
await conn.close()
except Exception as e:
print(f"❌ Error querying user data: {e}")
if __name__ == "__main__":
print("🧪 Testing Usage Counters Functionality")
print("=" * 40)
# Test basic functionality
asyncio.run(test_usage_counters())
# Example: Get usage for specific users (replace with actual user IDs)
# asyncio.run(get_usage_for_users(123456789, 987654321))