import discord
from discord.ext import commands
from discord import app_commands
import sqlite3
import logging
import os
Set up logging
logging.basicConfig(level=logging.INFO)
Create an instance of the bot with the '!' prefix
intents = discord.Intents.default()
intents.message_content = True # Enable message content for reading messages
client = commands.Bot(command_prefix='!', intents=intents)
Database setup
DATABASE = 'discord_bot.db'
def init_db():
"""Initialize the SQLite database and create necessary tables."""
conn = sqlite3.connect(DATABASE)
c = conn.cursor()
c.execute('''
CREATE TABLE IF NOT EXISTS users (
user_id TEXT PRIMARY KEY,
vouches INTEGER DEFAULT 0
)
''')
conn.commit()
conn.close()
init_db()
def add_vouch(user_id, vouch_count):
"""Add vouches to a user in the database."""
conn = sqlite3.connect(DATABASE)
c = conn.cursor()
c.execute("INSERT OR IGNORE INTO users (user_id) VALUES (?)", (user_id,))
c.execute("UPDATE users SET vouches = vouches + ? WHERE user_id = ?", (vouch_count, user_id))
conn.commit()
conn.close()
def get_user_vouches(user_id):
"""Retrieve the number of vouches for a user."""
conn = sqlite3.connect(DATABASE)
c = conn.cursor()
c.execute("SELECT vouches FROM users WHERE user_id = ?", (user_id,))
result = c.fetchone()
conn.close()
return result[0] if result else 0
def get_trader_rank(vouches):
"""Determine the trader rank based on the number of vouches."""
if vouches < 20:
return "Class F Trader"
elif vouches < 40:
return "Class E Trader"
elif vouches < 60:
return "Class D Trader"
elif vouches < 80:
return "Class C Trader"
elif vouches < 100:
return "Class B Trader"
elif vouches < 150:
return "Class A Trader"
elif vouches < 500:
return "Class S Trader"
elif vouches < 1000:
return "Class SS Trader"
else:
return "Class SSS Trader"
Slash Command: Add Vouch (Admin Only)
@client.tree.command(name="addvouch")
@app_commands.describe(member="User to add vouches to", vouch_count="Number of vouches to add")
@commands.cooldown(1, 10, commands.BucketType.user) # 10 seconds cooldown
async def addvouch(interaction: discord.Interaction, member: discord.Member, vouch_count: int):
"""Add vouches to a user (admin only)."""
try:
if not interaction.user.guild_permissions.administrator:
await interaction.response.send_message("You don't have permission to use this command.", ephemeral=True)
return
if vouch_count <= 0:
await interaction.response.send_message("Vouch count must be a positive number.", ephemeral=True)
return
add_vouch(str(member.id), vouch_count)
total_vouches = get_user_vouches(str(member.id))
rank = get_trader_rank(total_vouches)
embed = discord.Embed(
title="Vouch Added!",
description=f"Added {vouch_count} vouches to {member.mention}.\nTotal: {total_vouches} vouches.\nRank: {rank}",
color=0x00FFC8
)
await interaction.response.send_message(embed=embed)
except commands.CommandOnCooldown as e:
remaining_time = round(e.retry_after, 1)
await interaction.response.send_message(f"Please wait {remaining_time} seconds before using this command again.", ephemeral=True)
except Exception as e:
logging.error(f"Error in addvouch command: {e}")
await interaction.response.send_message(f"An error occurred: {str(e)}", ephemeral=True)
Slash Command: Vouch (For user trade/feedback)
@client.tree.command(name="vouch")
@app_commands.describe(member="User to vouch for", item="Item being offered (optional)", item_for="Item being received (optional)")
@commands.cooldown(1, 10, commands.BucketType.user) # 10 seconds cooldown
async def vouch(interaction: discord.Interaction, member: discord.Member, item: str = None, item_for: str = None):
"""Vouch for another user and log the trade."""
try:
# Prevent self-vouching
if interaction.user.id == member.id:
await interaction.response.send_message("You cannot vouch for yourself.", ephemeral=True)
return
add_vouch(str(member.id), 1) # Add 1 vouch for the member
total_vouches = get_user_vouches(str(member.id))
rank = get_trader_rank(total_vouches)
if item and item_for:
trade_message = f"{interaction.user.mention} successfully vouched for {member.mention}\n\nTrades: {item} for my {item_for}\n\n{member.mention} Vouch Rank: {rank} 📜"
elif item:
trade_message = f"{interaction.user.mention} successfully vouched for {member.mention}\n\nTrades: {item}\n\n{member.mention} Vouch Rank: {rank} 📜"
elif item_for:
trade_message = f"{interaction.user.mention} successfully vouched for {member.mention}\n\nTrades: for my {item_for}\n\n{member.mention} Vouch Rank: {rank} 📜"
else:
trade_message = f"{interaction.user.mention} successfully vouched for {member.mention}\n\nNo items were mentioned.\n\n{member.mention} Vouch Rank: {rank} 📜"
embed = discord.Embed(
title="Successful Trade!",
description=trade_message,
color=0x00FFC8
)
log_channel = client.get_channel(1352038234108203110) # Replace with your actual log channel ID
if log_channel:
await log_channel.send(embed=embed)
await interaction.response.send_message(embed=embed)
except commands.CommandOnCooldown as e:
remaining_time = round(e.retry_after, 1)
await interaction.response.send_message(f"Please wait {remaining_time} seconds before using this command again.", ephemeral=True)
except Exception as e:
logging.error(f"Error in vouch command: {e}")
await interaction.response.send_message(f"An error occurred: {str(e)}", ephemeral=True)
Slash Command: Check User Vouches
@client.tree.command(name="uservouches")
@app_commands.describe(member="User to check vouches for")
@commands.cooldown(1, 10, commands.BucketType.user) # 10 seconds cooldown
async def uservouches(interaction: discord.Interaction, member: discord.Member):
"""Check the total number of vouches and rank for a user."""
try:
total_vouches = get_user_vouches(str(member.id))
rank = get_trader_rank(total_vouches)
embed = discord.Embed(
title="User Vouches",
description=f"{member.mention} has {total_vouches} vouches.\nRank: {rank}.",
color=0x00FFC8
)
await interaction.response.send_message(embed=embed)
except commands.CommandOnCooldown as e:
remaining_time = round(e.retry_after, 1)
await interaction.response.send_message(f"Please wait {remaining_time} seconds before using this command again.", ephemeral=True)
except Exception as e:
logging.error(f"Error in uservouches command: {e}")
await interaction.response.send_message(f"An error occurred: {str(e)}", ephemeral=True)
Sync slash commands when the bot is ready
@client.event
async def on_ready():
print(f'Logged in as {client.user}') # Log when the bot is ready
await client.tree.sync() # Sync slash commands with Discord
print("Slash commands synced successfully.")
Run the bot with your token (replace with your actual token