🧱 Update the 'user_qq' field in the database to 'user_id'

This commit is contained in:
yajiwa 2023-04-14 11:45:45 +08:00
parent 08c7aae6b7
commit 04c516f783
9 changed files with 201 additions and 152 deletions

View File

@ -11,9 +11,9 @@ class BagUser(Model):
id = fields.IntField(pk=True, generated=True, auto_increment=True) id = fields.IntField(pk=True, generated=True, auto_increment=True)
"""自增id""" """自增id"""
user_qq = fields.BigIntField() user_id = fields.CharField(255)
"""用户id""" """用户id"""
group_id = fields.BigIntField() group_id = fields.CharField(255)
"""群聊id""" """群聊id"""
gold = fields.IntField(default=100) gold = fields.IntField(default=100)
"""金币数量""" """金币数量"""
@ -31,18 +31,18 @@ class BagUser(Model):
class Meta: class Meta:
table = "bag_users" table = "bag_users"
table_description = "用户道具数据表" table_description = "用户道具数据表"
unique_together = ("user_qq", "group_id") unique_together = ("user_id", "group_id")
@classmethod @classmethod
async def get_user_total_gold(cls, user_qq: int, group_id: int) -> str: async def get_user_total_gold(cls, user_id: str | int, group_id: str | int) -> str:
""" """
说明: 说明:
获取金币概况 获取金币概况
参数: 参数:
:param user_qq: qq号 :param user_id: 用户id
:param group_id: 所在群 :param group_id: 所在群组id
""" """
user, _ = await cls.get_or_create(user_qq=user_qq, group_id=group_id) user, _ = await cls.get_or_create(user_id=str(user_id), group_id=str(group_id))
return ( return (
f"当前金币:{user.gold}\n今日获取金币:{user.get_today_gold}\n今日花费金币:{user.spend_today_gold}" f"当前金币:{user.gold}\n今日获取金币:{user.get_today_gold}\n今日花费金币:{user.spend_today_gold}"
f"\n今日收益:{user.get_today_gold - user.spend_today_gold}" f"\n今日收益:{user.get_today_gold - user.spend_today_gold}"
@ -50,30 +50,30 @@ class BagUser(Model):
) )
@classmethod @classmethod
async def get_gold(cls, user_qq: int, group_id: int) -> int: async def get_gold(cls, user_id: str | int, group_id: str | int) -> int:
""" """
说明: 说明:
获取当前金币 获取当前金币
参数: 参数:
:param user_qq: qq号 :param user_id: 用户id
:param group_id: 所在群 :param group_id: 所在群组id
""" """
user, _ = await cls.get_or_create(user_qq=user_qq, group_id=group_id) user, _ = await cls.get_or_create(user_id=str(user_id), group_id=str(group_id))
return user.gold return user.gold
@classmethod @classmethod
async def get_property( async def get_property(
cls, user_qq: int, group_id: int, only_active: bool = False cls, user_id: str | int, group_id: str | int, only_active: bool = False
) -> Dict[str, int]: ) -> Dict[str, int]:
""" """
说明: 说明:
获取当前道具 获取当前道具
参数: 参数:
:param user_qq: qq号 :param user_id: 用户id
:param group_id: 所在群 :param group_id: 所在群组id
:param only_active: 仅仅获取主动使用的道具 :param only_active: 仅仅获取主动使用的道具
""" """
user, _ = await cls.get_or_create(user_qq=user_qq, group_id=group_id) user, _ = await cls.get_or_create(user_id=str(user_id), group_id=str(group_id))
if only_active and user.property: if only_active and user.property:
data = {} data = {}
name_list = [ name_list = [
@ -87,49 +87,49 @@ class BagUser(Model):
return user.property return user.property
@classmethod @classmethod
async def add_gold(cls, user_qq: int, group_id: int, num: int): async def add_gold(cls, user_id: str | int, group_id: str | int, num: int):
""" """
说明: 说明:
增加金币 增加金币
参数: 参数:
:param user_qq: qq号 :param user_id: 用户id
:param group_id: 所在群 :param group_id: 所在群组id
:param num: 金币数量 :param num: 金币数量
""" """
user, _ = await cls.get_or_create(user_qq=user_qq, group_id=group_id) user, _ = await cls.get_or_create(user_id=str(user_id), group_id=str(group_id))
user.gold = user.gold + num user.gold = user.gold + num
user.get_total_gold = user.get_total_gold + num user.get_total_gold = user.get_total_gold + num
user.get_today_gold = user.get_today_gold + num user.get_today_gold = user.get_today_gold + num
await user.save(update_fields=["gold", "get_today_gold", "get_total_gold"]) await user.save(update_fields=["gold", "get_today_gold", "get_total_gold"])
@classmethod @classmethod
async def spend_gold(cls, user_qq: int, group_id: int, num: int): async def spend_gold(cls, user_id: str | int, group_id: str | int, num: int):
""" """
说明: 说明:
花费金币 花费金币
参数: 参数:
:param user_qq: qq号 :param user_id: 用户id
:param group_id: 所在群 :param group_id: 所在群组id
:param num: 金币数量 :param num: 金币数量
""" """
user, _ = await cls.get_or_create(user_qq=user_qq, group_id=group_id) user, _ = await cls.get_or_create(user_id=str(user_id), group_id=str(group_id))
user.gold = user.gold - num user.gold = user.gold - num
user.spend_total_gold = user.spend_total_gold + num user.spend_total_gold = user.spend_total_gold + num
user.spend_today_gold = user.spend_today_gold + num user.spend_today_gold = user.spend_today_gold + num
await user.save(update_fields=["gold", "spend_total_gold", "spend_today_gold"]) await user.save(update_fields=["gold", "spend_total_gold", "spend_today_gold"])
@classmethod @classmethod
async def add_property(cls, user_qq: int, group_id: int, name: str, num: int = 1): async def add_property(cls, user_id: str | int, group_id: str | int, name: str, num: int = 1):
""" """
说明: 说明:
增加道具 增加道具
参数: 参数:
:param user_qq: qq号 :param user_id: 用户id
:param group_id: 所在群 :param group_id: 所在群组id
:param name: 道具名称 :param name: 道具名称
:param num: 道具数量 :param num: 道具数量
""" """
user, _ = await cls.get_or_create(user_qq=user_qq, group_id=group_id) user, _ = await cls.get_or_create(user_id=str(user_id), group_id=str(group_id))
property_ = user.property property_ = user.property
if property_.get(name) is None: if property_.get(name) is None:
property_[name] = 0 property_[name] = 0
@ -139,18 +139,18 @@ class BagUser(Model):
@classmethod @classmethod
async def delete_property( async def delete_property(
cls, user_qq: int, group_id: int, name: str, num: int = 1 cls, user_id: str | int, group_id: str | int, name: str, num: int = 1
) -> bool: ) -> bool:
""" """
说明: 说明:
使用/删除 道具 使用/删除 道具
参数: 参数:
:param user_qq: qq号 :param user_id: 用户id
:param group_id: 所在群 :param group_id: 所在群组id
:param name: 道具名称 :param name: 道具名称
:param num: 使用个数 :param num: 使用个数
""" """
user, _ = await cls.get_or_create(user_qq=user_qq, group_id=group_id) user, _ = await cls.get_or_create(user_id=str(user_id), group_id=str(group_id))
property_ = user.property property_ = user.property
if name in property_: if name in property_:
if (n := property_.get(name, 0)) < num: if (n := property_.get(name, 0)) < num:
@ -165,5 +165,9 @@ class BagUser(Model):
@classmethod @classmethod
async def _run_script(cls): async def _run_script(cls):
await cls.raw("ALTER TABLE bag_users DROP props;") return ["ALTER TABLE bag_users DROP props;", # 删除 props 字段
"""删除 props 字段""" "ALTER TABLE bag_users RENAME COLUMN user_id TO user_id;", # 将user_id改为user_id
"ALTER TABLE bag_users ALTER COLUMN user_id TYPE character varying(255);",
# 将user_id字段类型改为character varying(255)
"ALTER TABLE bag_users ALTER COLUMN group_id TYPE character varying(255);"
]

View File

@ -9,7 +9,7 @@ from services.log import logger
class BanUser(Model): class BanUser(Model):
user_qq = fields.IntField(pk=True) user_id = fields.CharField(255, pk=True)
"""用户id""" """用户id"""
ban_level = fields.IntField() ban_level = fields.IntField()
"""使用ban命令的用户等级""" """使用ban命令的用户等级"""
@ -23,33 +23,33 @@ class BanUser(Model):
table_description = ".ban/b了 封禁人员数据表" table_description = ".ban/b了 封禁人员数据表"
@classmethod @classmethod
async def check_ban_level(cls, user_qq: int, level: int) -> bool: async def check_ban_level(cls, user_id: str | int, level: int) -> bool:
""" """
说明: 说明:
检测ban掉目标的用户与unban用户的权限等级大小 检测ban掉目标的用户与unban用户的权限等级大小
参数: 参数:
:param user_qq: unban用户的qq号 :param user_id: unban用户的用户id
:param level: ban掉目标用户的权限等级 :param level: ban掉目标用户的权限等级
""" """
user = await cls.filter(user_qq=user_qq).first() user = await cls.filter(user_id=str(user_id)).first()
if user: if user:
logger.debug( logger.debug(
f"检测用户被ban等级user_level: {user.ban_level}level: {level}", f"检测用户被ban等级user_level: {user.ban_level}level: {level}",
target=user_qq, target=str(user_id),
) )
return bool(user and user.ban_level > level) return bool(user and user.ban_level > level)
return False return False
@classmethod @classmethod
async def check_ban_time(cls, user_qq: int) -> Union[str, int]: async def check_ban_time(cls, user_id: str | int) -> Union[str, int]:
""" """
说明: 说明:
检测用户被ban时长 检测用户被ban时长
参数: 参数:
:param user_qq: qq号 :param user_id: 用户id
""" """
logger.debug(f"获取用户ban时长", target=user_qq) logger.debug(f"获取用户ban时长", target=str(user_id))
if user := await cls.filter(user_qq=user_qq).first(): if user := await cls.filter(user_id=str(user_id)).first():
if ( if (
time.time() - (user.ban_time + user.duration) > 0 time.time() - (user.ban_time + user.duration) > 0
and user.duration != -1 and user.duration != -1
@ -61,64 +61,71 @@ class BanUser(Model):
return "" return ""
@classmethod @classmethod
async def is_ban(cls, user_qq: int) -> bool: async def is_ban(cls, user_id: str | int) -> bool:
""" """
说明: 说明:
判断用户是否被ban 判断用户是否被ban
参数: 参数:
:param user_qq: qq号 :param user_id: 用户id
""" """
logger.debug(f"检测是否被ban", target=user_qq) logger.debug(f"检测是否被ban", target=str(user_id))
if await cls.check_ban_time(user_qq): if await cls.check_ban_time(str(user_id)):
return True return True
else: else:
await cls.unban(user_qq) await cls.unban(user_id)
return False return False
@classmethod @classmethod
async def is_super_ban(cls, user_qq: int) -> bool: async def is_super_ban(cls, user_id: str | int) -> bool:
""" """
说明: 说明:
判断用户是否被超级用户ban / b了 判断用户是否被超级用户ban / b了
参数: 参数:
:param user_qq: qq号 :param user_id: 用户id
""" """
logger.debug(f"检测是否被超级用户权限封禁", target=user_qq) logger.debug(f"检测是否被超级用户权限封禁", target=str(user_id))
if user := await cls.filter(user_qq=user_qq).first(): if user := await cls.filter(user_id=str(user_id)).first():
if user.ban_level == 10: if user.ban_level == 10:
return True return True
return False return False
@classmethod @classmethod
async def ban(cls, user_qq: int, ban_level: int, duration: int): async def ban(cls, user_id: str | int, ban_level: int, duration: int):
""" """
说明: 说明:
ban掉目标用户 ban掉目标用户
参数: 参数:
:param user_qq: 目标用户qq号 :param user_id: 目标用户id
:param ban_level: 使用ban命令用户的权限 :param ban_level: 使用ban命令用户的权限
:param duration: ban时长 :param duration: ban时长
""" """
logger.debug(f"封禁用户,等级:{ban_level},时长: {duration}", target=user_qq) logger.debug(f"封禁用户,等级:{ban_level},时长: {duration}", target=str(user_id))
if await cls.filter(user_qq=user_qq).first(): if await cls.filter(user_id=str(user_id)).first():
await cls.unban(user_qq) await cls.unban(user_id)
await cls.create( await cls.create(
user_qq=user_qq, user_id=str(user_id),
ban_level=ban_level, ban_level=ban_level,
ban_time=time.time(), ban_time=time.time(),
duration=duration, duration=duration,
) )
@classmethod @classmethod
async def unban(cls, user_qq: int) -> bool: async def unban(cls, user_id: str | int) -> bool:
""" """
说明: 说明:
unban用户 unban用户
参数: 参数:
:param user_qq: qq号 :param user_id: 用户id
""" """
if user := await cls.filter(user_qq=user_qq).first(): if user := await cls.filter(user_id=str(user_id)).first():
logger.debug("解除封禁", target=user_qq) logger.debug("解除封禁", target=str(user_id))
await user.delete() await user.delete()
return True return True
return False return False
@classmethod
async def _run_script(cls):
return ["ALTER TABLE ban_users RENAME COLUMN user_qq TO user_id;", # 将user_id改为user_id
"ALTER TABLE ban_users ALTER COLUMN user_id TYPE character varying(255);",
# 将user_id字段类型改为character varying(255)
]

View File

@ -11,9 +11,9 @@ class ChatHistory(Model):
id = fields.IntField(pk=True, generated=True, auto_increment=True) id = fields.IntField(pk=True, generated=True, auto_increment=True)
"""自增id""" """自增id"""
user_qq = fields.BigIntField() user_id = fields.CharField(255)
"""用户id""" """用户id"""
group_id = fields.BigIntField(null=True) group_id = fields.CharField(255, null=True)
"""群聊id""" """群聊id"""
text = fields.TextField(null=True) text = fields.TextField(null=True)
"""文本内容""" """文本内容"""
@ -29,7 +29,7 @@ class ChatHistory(Model):
@classmethod @classmethod
async def get_group_msg_rank( async def get_group_msg_rank(
cls, cls,
gid: int, gid: str | int,
limit: int = 10, limit: int = 10,
order: str = "DESC", order: str = "DESC",
date_scope: Optional[Tuple[datetime, datetime]] = None, date_scope: Optional[Tuple[datetime, datetime]] = None,
@ -44,27 +44,27 @@ class ChatHistory(Model):
:param date_scope: 日期范围 :param date_scope: 日期范围
""" """
o = "-" if order == "DESC" else "" o = "-" if order == "DESC" else ""
query = cls.filter(group_id=gid) query = cls.filter(group_id=str(gid))
if date_scope: if date_scope:
query = query.filter(create_time__range=date_scope) query = query.filter(create_time__range=date_scope)
return list( return list(
await query.annotate(count=Count("user_qq")) await query.annotate(count=Count("user_id"))
.order_by(o + "count") .order_by(o + "count")
.group_by("user_qq") .group_by("user_id")
.limit(limit) .limit(limit)
.values_list("user_qq", "count") .values_list("user_id", "count")
) # type: ignore ) # type: ignore
@classmethod @classmethod
async def get_group_first_msg_datetime(cls, group_id: int) -> Optional[datetime]: async def get_group_first_msg_datetime(cls, group_id: str | int) -> Optional[datetime]:
""" """
说明: 说明:
获取群第一条记录消息时间 获取群第一条记录消息时间
参数: 参数:
:param group_id: id :param group_id: id
""" """
if ( if (
message := await cls.filter(group_id=group_id) message := await cls.filter(group_id=str(group_id))
.order_by("create_time") .order_by("create_time")
.first() .first()
): ):
@ -73,8 +73,8 @@ class ChatHistory(Model):
@classmethod @classmethod
async def get_message( async def get_message(
cls, cls,
uid: Optional[int], uid: Union[int, str],
gid: Optional[int], gid: Union[int, str],
type_: Literal["user", "group"], type_: Literal["user", "group"],
msg_type: Optional[Literal["private", "group"]] = None, msg_type: Optional[Literal["private", "group"]] = None,
days: Optional[Union[int, Tuple[datetime, datetime]]] = None, days: Optional[Union[int, Tuple[datetime, datetime]]] = None,
@ -83,22 +83,22 @@ class ChatHistory(Model):
说明: 说明:
获取消息查询query 获取消息查询query
参数: 参数:
:param uid: 用户qq :param uid: 用户id
:param gid: :param gid: 聊id
:param type_: 类型私聊或群聊 :param type_: 类型私聊或群聊
:param msg_type: 消息类型用户或群聊 :param msg_type: 消息类型用户或群聊
:param days: 限制日期 :param days: 限制日期
""" """
if type_ == "user": if type_ == "user":
query = cls.filter(user_qq=uid) query = cls.filter(user_id=str(uid))
if msg_type == "private": if msg_type == "private":
query = query.filter(group_id__isnull=True) query = query.filter(group_id__isnull=True)
elif msg_type == "group": elif msg_type == "group":
query = query.filter(group_id__not_isnull=True) query = query.filter(group_id__not_isnull=True)
else: else:
query = cls.filter(group_id=gid) query = cls.filter(group_id=str(gid))
if uid: if uid:
query = query.filter(user_qq=uid) query = query.filter(user_id=str(uid))
if days: if days:
if isinstance(days, int): if isinstance(days, int):
query = query.filter( query = query.filter(
@ -114,4 +114,7 @@ class ChatHistory(Model):
"alter table chat_history alter group_id drop not null;", # 允许 group_id 为空 "alter table chat_history alter group_id drop not null;", # 允许 group_id 为空
"alter table chat_history alter text drop not null;", # 允许 text 为空 "alter table chat_history alter text drop not null;", # 允许 text 为空
"alter table chat_history alter plain_text drop not null;", # 允许 plain_text 为空 "alter table chat_history alter plain_text drop not null;", # 允许 plain_text 为空
"ALTER TABLE chat_history RENAME COLUMN user_qq TO user_id;", # 将user_id改为user_id
"ALTER TABLE chat_history ALTER COLUMN user_id TYPE character varying(255);",
"ALTER TABLE chat_history ALTER COLUMN group_id TYPE character varying(255);",
] ]

View File

@ -8,7 +8,7 @@ class FriendUser(Model):
id = fields.IntField(pk=True, generated=True, auto_increment=True) id = fields.IntField(pk=True, generated=True, auto_increment=True)
"""自增id""" """自增id"""
user_id = fields.BigIntField(unique=True) user_id = fields.CharField(255, unique=True)
"""用户id""" """用户id"""
user_name = fields.CharField(max_length=255, default="") user_name = fields.CharField(max_length=255, default="")
"""用户名称""" """用户名称"""
@ -20,26 +20,26 @@ class FriendUser(Model):
table_description = "好友信息数据表" table_description = "好友信息数据表"
@classmethod @classmethod
async def get_user_name(cls, user_id: int) -> str: async def get_user_name(cls, user_id: str | int) -> str:
""" """
说明: 说明:
获取好友用户名称 获取好友用户名称
参数: 参数:
:param user_id: qq号 :param user_id: 用户id
""" """
if user := await cls.get_or_none(user_id=user_id): if user := await cls.get_or_none(user_id=str(user_id)):
return user.user_name return user.user_name
return "" return ""
@classmethod @classmethod
async def get_user_nickname(cls, user_id: int) -> str: async def get_user_nickname(cls, user_id: str | int) -> str:
""" """
说明: 说明:
获取用户昵称 获取用户昵称
参数: 参数:
:param user_id: qq号 :param user_id: 用户id
""" """
if user := await cls.get_or_none(user_id=user_id): if user := await cls.get_or_none(user_id=str(user_id)):
if user.nickname: if user.nickname:
_tmp = "" _tmp = ""
if black_word := Config.get_config("nickname", "BLACK_WORD"): if black_word := Config.get_config("nickname", "BLACK_WORD"):
@ -49,12 +49,17 @@ class FriendUser(Model):
return "" return ""
@classmethod @classmethod
async def set_user_nickname(cls, user_id: int, nickname: str): async def set_user_nickname(cls, user_id: str | int, nickname: str):
""" """
说明: 说明:
设置用户昵称 设置用户昵称
参数: 参数:
:param user_id: qq号 :param user_id: 用户id
:param nickname: 昵称 :param nickname: 昵称
""" """
await cls.update_or_create(user_id=user_id, defaults={"nickname": nickname}) await cls.update_or_create(user_id=str(user_id), defaults={"nickname": nickname})
@classmethod
async def _run_script(cls):
await cls.raw("ALTER TABLE friend_users ALTER COLUMN user_id TYPE character varying(255);")
# 将user_id字段类型改为character varying(255))

View File

@ -8,7 +8,7 @@ from services.log import logger
class GroupInfo(Model): class GroupInfo(Model):
group_id = fields.BigIntField(pk=True) group_id = fields.CharField(255, pk=True)
"""群聊id""" """群聊id"""
group_name = fields.TextField(default="") group_name = fields.TextField(default="")
"""群聊名称""" """群聊名称"""
@ -25,6 +25,7 @@ class GroupInfo(Model):
@classmethod @classmethod
def _run_script(cls): def _run_script(cls):
return [ return ["ALTER TABLE group_info ADD group_flag Integer NOT NULL DEFAULT 0;", # group_info表添加一个group_flag
"ALTER TABLE group_info ADD group_flag Integer NOT NULL DEFAULT 0;" # group_info表添加一个group_flag "ALTER TABLE group_info ALTER COLUMN group_id TYPE character varying(255);"
] # 将group_id字段类型改为character varying(255)
]

View File

@ -12,11 +12,11 @@ class GroupInfoUser(Model):
id = fields.IntField(pk=True, generated=True, auto_increment=True) id = fields.IntField(pk=True, generated=True, auto_increment=True)
"""自增id""" """自增id"""
user_qq = fields.BigIntField() user_id = fields.CharField(255)
"""用户id""" """用户id"""
user_name = fields.CharField(255, default="") user_name = fields.CharField(255, default="")
"""用户昵称""" """用户昵称"""
group_id = fields.BigIntField() group_id = fields.CharField(255)
"""群聊id""" """群聊id"""
user_join_time: datetime = fields.DatetimeField(null=True) user_join_time: datetime = fields.DatetimeField(null=True)
"""用户入群时间""" """用户入群时间"""
@ -28,58 +28,58 @@ class GroupInfoUser(Model):
class Meta: class Meta:
table = "group_info_users" table = "group_info_users"
table_description = "群员信息数据表" table_description = "群员信息数据表"
unique_together = ("user_qq", "group_id") unique_together = ("user_id", "group_id")
@classmethod @classmethod
async def get_group_member_id_list(cls, group_id: int) -> Set[int]: async def get_group_member_id_list(cls, group_id: str | int) -> Set[int]:
""" """
说明: 说明:
获取该群所有用户qq 获取该群所有用户id
参数: 参数:
:param group_id: 群号 :param group_id: 群号
""" """
return set( return set(
await cls.filter(group_id=group_id).values_list("user_qq", flat=True) await cls.filter(group_id=str(group_id)).values_list("user_id", flat=True)
) # type: ignore ) # type: ignore
@classmethod @classmethod
async def set_user_nickname(cls, user_qq: int, group_id: int, nickname: str): async def set_user_nickname(cls, user_id: str | int, group_id: str | int, nickname: str):
""" """
说明: 说明:
设置群员在该群内的昵称 设置群员在该群内的昵称
参数: 参数:
:param user_qq: qq号 :param user_id: 用户id
:param group_id: 群号 :param group_id: 群号
:param nickname: 昵称 :param nickname: 昵称
""" """
await cls.update_or_create( await cls.update_or_create(
user_qq=user_qq, user_id=str(user_id),
group_id=group_id, group_id=str(group_id),
defaults={"nickname": nickname}, defaults={"nickname": nickname},
) )
@classmethod @classmethod
async def get_user_all_group(cls, user_qq: int) -> List[int]: async def get_user_all_group(cls, user_id: str | int) -> List[int]:
""" """
说明: 说明:
获取该用户所在的所有群聊 获取该用户所在的所有群聊
参数: 参数:
:param user_qq: 用户qq :param user_id: 用户id
""" """
return list( return list(
await cls.filter(user_qq=user_qq).values_list("group_id", flat=True) await cls.filter(user_id=str(user_id)).values_list("group_id", flat=True)
) # type: ignore ) # type: ignore
@classmethod @classmethod
async def get_user_nickname(cls, user_qq: int, group_id: int) -> str: async def get_user_nickname(cls, user_id: str | int, group_id: str | int) -> str:
""" """
说明: 说明:
获取用户在该群的昵称 获取用户在该群的昵称
参数: 参数:
:param user_qq: qq号 :param user_id: 用户id
:param group_id: 群号 :param group_id: 群号
""" """
if user := await cls.get_or_none(user_qq=user_qq, group_id=group_id): if user := await cls.get_or_none(user_id=str(user_id), group_id=str(group_id)):
if user.nickname: if user.nickname:
nickname = "" nickname = ""
if black_word := Config.get_config("nickname", "BLACK_WORD"): if black_word := Config.get_config("nickname", "BLACK_WORD"):
@ -90,15 +90,15 @@ class GroupInfoUser(Model):
return "" return ""
@classmethod @classmethod
async def get_group_member_uid(cls, user_qq: int, group_id: int) -> Optional[int]: async def get_group_member_uid(cls, user_id: str | int, group_id: str | int) -> Optional[int]:
logger.debug( logger.debug(
f"GroupInfoUser 尝试获取 用户[<u><e>{user_qq}</e></u>] 群聊[<u><e>{group_id}</e></u>] UID" f"GroupInfoUser 尝试获取 用户[<u><e>{user_id}</e></u>] 群聊[<u><e>{group_id}</e></u>] UID"
) )
user, _ = await cls.get_or_create(user_qq=user_qq, group_id=group_id) user, _ = await cls.get_or_create(user_id=str(user_id), group_id=str(group_id))
_max_uid_user, _ = await cls.get_or_create(user_qq=114514, group_id=114514) _max_uid_user, _ = await cls.get_or_create(user_id=114514, group_id=114514)
_max_uid = _max_uid_user.uid _max_uid = _max_uid_user.uid
if not user.uid: if not user.uid:
all_user = await cls.filter(user_qq=user_qq).all() all_user = await cls.filter(user_id=str(user_id)).all()
for x in all_user: for x in all_user:
if x.uid: if x.uid:
return x.uid return x.uid
@ -106,7 +106,7 @@ class GroupInfoUser(Model):
_max_uid_user.uid = _max_uid + 1 _max_uid_user.uid = _max_uid + 1
await cls.bulk_update([user, _max_uid_user], ["uid"]) await cls.bulk_update([user, _max_uid_user], ["uid"])
logger.debug( logger.debug(
f"GroupInfoUser 获取 用户[<u><e>{user_qq}</e></u>] 群聊[<u><e>{group_id}</e></u>] UID: {user.uid}" f"GroupInfoUser 获取 用户[<u><e>{user_id}</e></u>] 群聊[<u><e>{group_id}</e></u>] UID: {user.uid}"
) )
return user.uid return user.uid
@ -115,4 +115,8 @@ class GroupInfoUser(Model):
return [ return [
"alter table group_info_users alter user_join_time drop not null;", # 允许 user_join_time 为空 "alter table group_info_users alter user_join_time drop not null;", # 允许 user_join_time 为空
"ALTER TABLE group_info_users ALTER COLUMN user_join_time TYPE timestamp with time zone USING user_join_time::timestamp with time zone;", "ALTER TABLE group_info_users ALTER COLUMN user_join_time TYPE timestamp with time zone USING user_join_time::timestamp with time zone;",
"ALTER TABLE group_info_users RENAME COLUMN user_qq TO user_id;", # 将user_id改为user_id
"ALTER TABLE group_info_users ALTER COLUMN user_id TYPE character varying(255);",
# 将user_id字段类型改为character varying(255)
"ALTER TABLE group_info_users ALTER COLUMN group_id TYPE character varying(255);"
] ]

View File

@ -7,9 +7,9 @@ class LevelUser(Model):
id = fields.IntField(pk=True, generated=True, auto_increment=True) id = fields.IntField(pk=True, generated=True, auto_increment=True)
"""自增id""" """自增id"""
user_qq = fields.BigIntField() user_id = fields.CharField(255)
"""用户id""" """用户id"""
group_id = fields.BigIntField() group_id = fields.CharField(255)
"""群聊id""" """群聊id"""
user_level = fields.BigIntField() user_level = fields.BigIntField()
"""用户权限等级""" """用户权限等级"""
@ -19,82 +19,90 @@ class LevelUser(Model):
class Meta: class Meta:
table = "level_users" table = "level_users"
table_description = "用户权限数据库" table_description = "用户权限数据库"
unique_together = ("user_qq", "group_id") unique_together = ("user_id", "group_id")
@classmethod @classmethod
async def get_user_level(cls, user_qq: int, group_id: int) -> int: async def get_user_level(cls, user_id: str | int, group_id: str | int) -> int:
""" """
说明: 说明:
获取用户在群内的等级 获取用户在群内的等级
参数: 参数:
:param user_qq: qq号 :param user_id: 用户id
:param group_id: :param group_id: 组id
""" """
if user := await cls.get_or_none(user_qq=user_qq, group_id=group_id): if user := await cls.get_or_none(user_id=str(user_id), group_id=str(group_id)):
return user.user_level return user.user_level
return -1 return -1
@classmethod @classmethod
async def set_level( async def set_level(
cls, user_qq: int, group_id: int, level: int, group_flag: int = 0 cls, user_id: str | int, group_id: str | int, level: int, group_flag: int = 0
): ):
""" """
说明: 说明:
设置用户在群内的权限 设置用户在群内的权限
参数: 参数:
:param user_qq: qq号 :param user_id: 用户id
:param group_id: :param group_id: 组id
:param level: 权限等级 :param level: 权限等级
:param group_flag: 是否被自动更新刷新权限 01 :param group_flag: 是否被自动更新刷新权限 01
""" """
await cls.update_or_create( await cls.update_or_create(
user_qq=user_qq, user_id=str(user_id),
group_id=group_id, group_id=str(group_id),
defaults={"user_level": level, "group_flag": group_flag}, defaults={"user_level": level, "group_flag": group_flag},
) )
@classmethod @classmethod
async def delete_level(cls, user_qq: int, group_id: int) -> bool: async def delete_level(cls, user_id: str | int, group_id: str | int) -> bool:
""" """
说明: 说明:
删除用户权限 删除用户权限
参数: 参数:
:param user_qq: qq号 :param user_id: 用户id
:param group_id: :param group_id: 组id
""" """
if user := await cls.get_or_none(user_qq=user_qq, group_id=group_id): if user := await cls.get_or_none(user_id=str(user_id), group_id=str(group_id)):
await user.delete() await user.delete()
return True return True
return False return False
@classmethod @classmethod
async def check_level(cls, user_qq: int, group_id: int, level: int) -> bool: async def check_level(cls, user_id: str | int, group_id: str | int, level: int) -> bool:
""" """
说明: 说明:
检查用户权限等级是否大于 level 检查用户权限等级是否大于 level
参数: 参数:
:param user_qq: qq号 :param user_id: 用户id
:param group_id: :param group_id: 组id
:param level: 权限等级 :param level: 权限等级
""" """
if group_id: if group_id:
if user := await cls.get_or_none(user_qq=user_qq, group_id=group_id): if user := await cls.get_or_none(user_id=str(user_id), group_id=str(group_id)):
return user.user_level >= level return user.user_level >= level
else: else:
user_list = await cls.filter(user_qq=user_qq).all() user_list = await cls.filter(user_id=str(user_id)).all()
user = max(user_list, key=lambda x: x.user_level) user = max(user_list, key=lambda x: x.user_level)
return user.user_level >= level return user.user_level >= level
return False return False
@classmethod @classmethod
async def is_group_flag(cls, user_qq: int, group_id: int) -> bool: async def is_group_flag(cls, user_id: str | int, group_id: str | int) -> bool:
""" """
说明: 说明:
检测是否会被自动更新刷新权限 检测是否会被自动更新刷新权限
参数: 参数:
:param user_qq: qq号 :param user_id: 用户id
:param group_id: :param group_id: 组id
""" """
if user := await cls.get_or_none(user_qq=user_qq, group_id=group_id): if user := await cls.get_or_none(user_id=str(user_id), group_id=str(group_id)):
return user.group_flag == 1 return user.group_flag == 1
return False return False
@classmethod
async def _run_script(cls):
return ["ALTER TABLE level_users RENAME COLUMN user_id TO user_id;", # 将user_id改为user_id
"ALTER TABLE level_users ALTER COLUMN user_id TYPE character varying(255);",
# 将user_id字段类型改为character varying(255)
"ALTER TABLE level_users ALTER COLUMN group_id TYPE character varying(255);"
]

View File

@ -1,5 +1,5 @@
from datetime import datetime from datetime import datetime
from typing import List, Literal, Optional, Tuple from typing import List, Literal, Optional, Tuple, Union
from tortoise import fields from tortoise import fields
@ -10,9 +10,9 @@ class SignGroupUser(Model):
id = fields.IntField(pk=True, generated=True, auto_increment=True) id = fields.IntField(pk=True, generated=True, auto_increment=True)
"""自增id""" """自增id"""
user_qq = fields.BigIntField() user_id = fields.CharField(255)
"""用户id""" """用户id"""
group_id = fields.BigIntField() group_id = fields.CharField(255)
"""群聊id""" """群聊id"""
checkin_count = fields.IntField(default=0) checkin_count = fields.IntField(default=0)
"""签到次数""" """签到次数"""
@ -29,7 +29,7 @@ class SignGroupUser(Model):
class Meta: class Meta:
table = "sign_group_users" table = "sign_group_users"
table_description = "群员签到数据表" table_description = "群员签到数据表"
unique_together = ("user_qq", "group_id") unique_together = ("user_id", "group_id")
@classmethod @classmethod
async def sign(cls, user: "SignGroupUser", impression: float): async def sign(cls, user: "SignGroupUser", impression: float):
@ -49,8 +49,8 @@ class SignGroupUser(Model):
@classmethod @classmethod
async def get_all_impression( async def get_all_impression(
cls, group_id: Optional[int] cls, group_id: Union[int, str]
) -> Tuple[List[int], List[int], List[float]]: ) -> Tuple[List[str], List[str], List[float]]:
""" """
说明: 说明:
获取该群所有用户 id 及对应 好感度 获取该群所有用户 id 及对应 好感度
@ -58,15 +58,23 @@ class SignGroupUser(Model):
:param group_id: 群号 :param group_id: 群号
""" """
if group_id: if group_id:
query = cls.filter(group_id=group_id) query = cls.filter(group_id=str(group_id))
else: else:
query = cls query = cls
value_list = await query.all().values_list("user_qq", "group_id", "impression") # type: ignore value_list = await query.all().values_list("user_id", "group_id", "impression") # type: ignore
qq_list = [] user_list = []
group_list = [] group_list = []
impression_list = [] impression_list = []
for value in value_list: for value in value_list:
qq_list.append(value[0]) user_list.append(value[0])
group_list.append(value[1]) group_list.append(value[1])
impression_list.append(float(value[2])) impression_list.append(float(value[2]))
return qq_list, impression_list, group_list return user_list, group_list, impression_list
@classmethod
async def _run_script(cls):
return ["ALTER TABLE sign_group_users RENAME COLUMN user_id TO user_id;", # 将user_id改为user_id
"ALTER TABLE sign_group_users ALTER COLUMN user_id TYPE character varying(255);",
# 将user_id字段类型改为character varying(255)
"ALTER TABLE sign_group_users ALTER COLUMN group_id TYPE character varying(255);"
]

View File

@ -9,9 +9,9 @@ class UserShopGoldLog(Model):
id = fields.IntField(pk=True, generated=True, auto_increment=True) id = fields.IntField(pk=True, generated=True, auto_increment=True)
"""自增id""" """自增id"""
user_qq = fields.BigIntField() user_id = fields.CharField(255)
"""用户id""" """用户id"""
group_id = fields.BigIntField() group_id = fields.CharField(255)
"""群聊id""" """群聊id"""
type = fields.IntField() type = fields.IntField()
"""金币使用类型 0: 购买, 1: 使用, 2: 插件""" """金币使用类型 0: 购买, 1: 使用, 2: 插件"""
@ -27,3 +27,12 @@ class UserShopGoldLog(Model):
class Meta: class Meta:
table = "user_shop_gold_log" table = "user_shop_gold_log"
table_description = "金币使用日志表" table_description = "金币使用日志表"
@classmethod
def _run_script(cls):
return [
"ALTER TABLE user_shop_gold_log RENAME COLUMN user_qq TO user_id;", # 将user_qq改为user_id
"ALTER TABLE user_shop_gold_log ALTER COLUMN user_id TYPE character varying(255);",
# 将user_id字段类型改为character varying(255)
"ALTER TABLE user_shop_gold_log ALTER COLUMN group_id TYPE character varying(255);",
]