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:
@@ -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))
|
||||
Reference in New Issue
Block a user