feat: Tái cấu trúc bot sang kiến trúc cog, thêm hỗ trợ đa máy chủ, giới thiệu tính năng đăng ký bóng đá, giao diện web và quản lý cấu hình.

This commit is contained in:
2026-01-16 17:26:42 +07:00
parent 8c38357c28
commit b24365927a
39 changed files with 3864 additions and 997 deletions
+131
View File
@@ -0,0 +1,131 @@
import discord
from discord.ext import commands
from repositories import HomeDebtRepository
from repositories.config import ConfigRepository
from repositories.feature_toggle import FeatureToggleRepository
from utils.common import format_vnd
class HomeDebtCog(commands.Cog):
def __init__(self, bot):
self.bot = bot
self.home_debt_repo = HomeDebtRepository()
self.config_repo = ConfigRepository()
self.feature_repo = FeatureToggleRepository()
async def get_allowed_channel_ids(self, guild_id: int) -> list[int]:
config_value = await self.config_repo.get(guild_id, "CHANNEL_HOME_DEBT_ID", "")
ids = []
if config_value:
for x in config_value.split(','):
try:
ids.append(int(x.strip()))
except ValueError:
pass
return ids
async def is_enabled(self, guild_id: int) -> bool:
return await self.feature_repo.get(guild_id, "home_debt")
async def is_correct_channel(self, ctx):
"""Kiểm tra xem command có được thực hiện trong đúng channel không"""
if not await self.is_enabled(ctx.guild.id):
return False
allowed_ids = await self.get_allowed_channel_ids(ctx.guild.id)
# New Rule: If no channels configured, allow ALL channels
if not allowed_ids:
return True
return ctx.channel.id in allowed_ids
@commands.command(name="hdadd", description="Thêm khoản chi tiêu mới")
async def add(self, ctx, amount: int):
"""Vì home chỉ có 2 người nên sẽ tự động thêm khoản chi tiêu cho người còn lại"""
try:
if not await self.is_correct_channel(ctx):
return
# Get info other user from home_debt table for THIS GUILD
other_user = await self.home_debt_repo.get_other(ctx.guild.id, ctx.author.id)
if not other_user:
await ctx.send("Không tìm thấy người dùng còn lại trong Guild này!")
return
other_user.value += round(amount / 2)
resp = await self.home_debt_repo.update_home_debt(other_user)
if not resp:
await ctx.send("Có lỗi xảy ra khi cập nhật dữ liệu")
return
await ctx.send(f"Đã thêm {format_vnd(round(amount * 1000 / 2))} cho {ctx.author.name}. Số dư hiện tại là {format_vnd(other_user.value * 1000)}")
except Exception as e:
await ctx.send(f"Có lỗi xảy ra: {str(e)}")
@commands.command(name="hdcheck", description="Kiểm tra số dư của bạn")
async def home_debt_check(self, ctx):
"""Kiểm tra số dư của mọi người"""
try:
if not await self.is_correct_channel(ctx):
return
# Get info user from home_debt table for THIS GUILD
users = await self.home_debt_repo.get_all(ctx.guild.id)
embed = discord.Embed(title=f"Số dư của mọi người tại {ctx.guild.name}", color=discord.Color.blue())
for user in users:
value = format_vnd(user.value * 1000)
member = ctx.guild.get_member(user.user_id)
name = member.display_name if member else f"User {user.user_id}"
embed.add_field(name=name, value=f"{value}", inline=False)
await ctx.send(embed=embed)
except Exception as e:
await ctx.send(f"Có lỗi xảy ra: {str(e)}")
@commands.command(name="hdvay", description="Vay nợ")
async def vay(self, ctx, amount: int):
"""Vay nợ"""
try:
if not await self.is_correct_channel(ctx):
return
# Get info user from home_debt table for THIS GUILD
user = await self.home_debt_repo.get(ctx.guild.id, ctx.author.id)
if not user:
user = await self.home_debt_repo.create_home_debt(ctx.guild.id, ctx.author.id, 0)
user.value += amount
resp = await self.home_debt_repo.update_home_debt(user)
if not resp:
await ctx.send("Có lỗi xảy ra khi cập nhật dữ liệu")
return
# Send message to user
await ctx.send(f"Đã vay {format_vnd(amount * 1000)} bởi {ctx.author.name}")
except Exception as e:
await ctx.send(f"Có lỗi xảy ra: {str(e)}")
@commands.command(name="hdtra", description="Trả nợ")
async def tra(self, ctx, amount: int):
"""Trả nợ"""
try:
if not await self.is_correct_channel(ctx):
return
# Get info user from home_debt table for THIS GUILD
user = await self.home_debt_repo.get(ctx.guild.id, ctx.author.id)
if not user:
user = await self.home_debt_repo.create_home_debt(ctx.guild.id, ctx.author.id, 0)
user.value -= amount
resp = await self.home_debt_repo.update_home_debt(user)
if not resp:
await ctx.send("Có lỗi xảy ra khi cập nhật dữ liệu")
return
# Send message to user
await ctx.send(f"Đã trả {format_vnd(amount * 1000)} từ {ctx.author.name}")
except Exception as e:
await ctx.send(f"Có lỗi xảy ra: {str(e)}")
async def setup(bot):
await bot.add_cog(HomeDebtCog(bot))