Merge pull request #1373 from yajiwa/main

🗃️  数据库字段"user_qq"改为"user_id"并更改字段类型为str
This commit is contained in:
HibiKier 2023-04-22 19:38:14 +08:00 committed by GitHub
commit f3a5879c66
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
34 changed files with 258 additions and 209 deletions

View File

@ -306,7 +306,7 @@ async def update_member_info(
if user_info["role"] in [ if user_info["role"] in [
"owner", "owner",
"admin", "admin",
] and not await LevelUser.is_group_flag(user_info["user_id"], group_id): ] and not await LevelUser.is_group_flag(user_info["user_id"], str(group_id)):
await LevelUser.set_level( await LevelUser.set_level(
user_info["user_id"], user_info["user_id"],
user_info["group_id"], user_info["group_id"],
@ -317,7 +317,7 @@ async def update_member_info(
user_info["user_id"], user_info["group_id"], 9 user_info["user_id"], user_info["group_id"], 9
) )
user = await GroupInfoUser.get_or_none( user = await GroupInfoUser.get_or_none(
user_qq=user_info["user_id"], group_id=user_info["group_id"] user_id=str(user_info["user_id"]), group_id=str(user_info["group_id"])
) )
if user: if user:
if user.user_name != nickname: if user.user_name != nickname:
@ -338,8 +338,8 @@ async def update_member_info(
"%Y-%m-%d %H:%M:%S", "%Y-%m-%d %H:%M:%S",
) )
await GroupInfoUser.update_or_create( await GroupInfoUser.update_or_create(
user_qq=user_info["user_id"], user_id=str(user_info["user_id"]),
group_id=user_info["group_id"], group_id=str(user_info["group_id"]),
defaults={ defaults={
"user_name": nickname, "user_name": nickname,
"user_join_time": join_time.replace( "user_join_time": join_time.replace(
@ -356,7 +356,7 @@ async def update_member_info(
) )
if _del_member_list: if _del_member_list:
for del_user in _del_member_list: for del_user in _del_member_list:
await GroupInfoUser.filter(user_qq=del_user, group_id=group_id).delete() await GroupInfoUser.filter(user_id=str(del_user), group_id=str(group_id)).delete()
logger.info(f"删除已退群用户", "更新群组成员信息", del_user, group_id) logger.info(f"删除已退群用户", "更新群组成员信息", del_user, group_id)
if _error_member_list and remind_superuser: if _error_member_list and remind_superuser:
result = "" result = ""

View File

@ -17,7 +17,7 @@ admin_notice = on_notice(priority=5)
@admin_notice.handle() @admin_notice.handle()
async def _(event: GroupAdminNoticeEvent): async def _(event: GroupAdminNoticeEvent):
if user := await GroupInfoUser.filter( if user := await GroupInfoUser.filter(
user_qq=event.user_id, group_id=event.group_id user_id=str(event.user_id), group_id=str(event.group_id)
).first(): ).first():
nickname = user.nickname nickname = user.nickname
else: else:

View File

@ -91,7 +91,7 @@ async def _():
_used_group.append(g) _used_group.append(g)
group_info = await bot.get_group_info(group_id=g) group_info = await bot.get_group_info(group_id=g)
await GroupInfo.update_or_create( await GroupInfo.update_or_create(
group_id=group_info["group_id"], group_id=str(group_info["group_id"]),
defaults={ defaults={
"group_name": group_info["group_name"], "group_name": group_info["group_name"],
"max_member_count": group_info["max_member_count"], "max_member_count": group_info["max_member_count"],
@ -118,7 +118,7 @@ async def _():
bot = bots[key] bot = bots[key]
fl = await bot.get_friend_list() fl = await bot.get_friend_list()
for f in fl: for f in fl:
await FriendUser.create(user_id=f["user_id"], user_name=f["nickname"]) await FriendUser.create(user_id=str(f["user_id"]), user_name=f["nickname"])
logger.debug(f"更新好友信息成功", "自动更新好友", f["user_id"]) logger.debug(f"更新好友信息成功", "自动更新好友", f["user_id"])
except Exception as e: except Exception as e:
logger.error(f"自动更新群组信息错误", e=e) logger.error(f"自动更新群组信息错误", e=e)

View File

@ -69,7 +69,7 @@ async def _(event: GroupMessageEvent, reg_group: Tuple[Any, ...] = RegexGroup())
num_str = "发言次数:\n\n" num_str = "发言次数:\n\n"
idx = 1 idx = 1
for uid, num in rank_data: for uid, num in rank_data:
if user := await GroupInfoUser.filter(user_qq=uid, group_id=gid).first(): if user := await GroupInfoUser.filter(user_id=str(uid), group_id=str(gid)).first():
user_name = user.user_name user_name = user.user_name
else: else:
user_name = uid user_name = uid

View File

@ -68,7 +68,7 @@ add_group = on_request(priority=1, block=False)
@group_increase_handle.handle() @group_increase_handle.handle()
async def _(bot: Bot, event: GroupIncreaseNoticeEvent): async def _(bot: Bot, event: GroupIncreaseNoticeEvent):
if event.user_id == int(bot.self_id): if event.user_id == int(bot.self_id):
group = await GroupInfo.get_or_none(group_id=event.group_id) group = await GroupInfo.get_or_none(group_id=str(event.group_id))
# 群聊不存在或被强制拉群,退出该群 # 群聊不存在或被强制拉群,退出该群
if (not group or group.group_flag == 0) and Config.get_config( if (not group or group.group_flag == 0) and Config.get_config(
"invite_manager", "flag" "invite_manager", "flag"
@ -139,8 +139,8 @@ async def _(bot: Bot, event: GroupIncreaseNoticeEvent):
group_id=event.group_id, user_id=event.user_id group_id=event.group_id, user_id=event.user_id
) )
await GroupInfoUser.update_or_create( await GroupInfoUser.update_or_create(
user_qq=user_info["user_id"], user_qq=str(user_info["user_id"]),
group_id=user_info["group_id"], group_id=str(user_info["group_id"]),
defaults={"user_name": user_info["nickname"], "user_join_time": join_time}, defaults={"user_name": user_info["nickname"], "user_join_time": join_time},
) )
logger.info(f"用户{user_info['user_id']} 所属{user_info['group_id']} 更新成功") logger.info(f"用户{user_info['user_id']} 所属{user_info['group_id']} 更新成功")
@ -187,12 +187,12 @@ async def _(bot: Bot, event: GroupDecreaseNoticeEvent):
group_id = event.group_id group_id = event.group_id
operator_id = event.operator_id operator_id = event.operator_id
if user := await GroupInfoUser.get_or_none( if user := await GroupInfoUser.get_or_none(
user_qq=event.operator_id, group_id=event.group_id user_qq=str(event.operator_id), group_id=str(event.group_id)
): ):
operator_name = user.user_name operator_name = user.user_name
else: else:
operator_name = "None" operator_name = "None"
group = await GroupInfo.filter(group_id=group_id).first() group = await GroupInfo.filter(group_id=str(group_id)).first()
group_name = group.group_name if group else "" group_name = group.group_name if group else ""
coffee = int(list(bot.config.superusers)[0]) coffee = int(list(bot.config.superusers)[0])
await bot.send_private_msg( await bot.send_private_msg(
@ -207,12 +207,12 @@ async def _(bot: Bot, event: GroupDecreaseNoticeEvent):
group_manager.delete_group(event.group_id) group_manager.delete_group(event.group_id)
return return
if user := await GroupInfoUser.get_or_none( if user := await GroupInfoUser.get_or_none(
user_qq=event.user_id, group_id=event.group_id user_qq=str(event.user_id), group_id=str(event.group_id)
): ):
user_name = user.user_name user_name = user.user_name
else: else:
user_name = f"{event.user_id}" user_name = f"{event.user_id}"
await GroupInfoUser.filter(user_qq=event.user_id, group_id=event.group_id).delete() await GroupInfoUser.filter(user_id=str(event.user_id), group_id=str(event.group_id)).delete()
logger.info( logger.info(
f"名称: {user_name} 退出群聊", f"名称: {user_name} 退出群聊",
"group_decrease_handle", "group_decrease_handle",

View File

@ -42,9 +42,9 @@ async def _(bot: Bot, event: MessageEvent, arg: Message = CommandArg()):
if str(event.user_id) in bot.config.superusers: if str(event.user_id) in bot.config.superusers:
is_super = True is_super = True
msg = msg.replace("-super", "").strip() msg = msg.replace("-super", "").strip()
msg = get_plugin_help(msg, is_super) img_msg = get_plugin_help(msg, is_super)
if msg: if img_msg:
await simple_help.send(image(b64=msg)) await simple_help.send(image(b64=img_msg))
else: else:
await simple_help.send("没有此功能的帮助信息...") await simple_help.send("没有此功能的帮助信息...")
logger.info( logger.info(

View File

@ -569,8 +569,8 @@ class AuthChecker:
event.user_id, event.group_id, psm.cost_gold event.user_id, event.group_id, psm.cost_gold
) )
await UserShopGoldLog.create( await UserShopGoldLog.create(
user_qq=event.user_id, user_qq=str(event.user_id),
group_id=event.group_id, group_id=str(event.group_id),
type=2, type=2,
name=plugin_name, name=plugin_name,
num=1, num=1,

View File

@ -58,7 +58,7 @@ async def _(bot: Bot, event: FriendRequestEvent):
if Config.get_config("invite_manager", "AUTO_ADD_FRIEND"): if Config.get_config("invite_manager", "AUTO_ADD_FRIEND"):
logger.debug(f"已开启好友请求自动同意,成功通过该请求", "好友请求", target=event.user_id) logger.debug(f"已开启好友请求自动同意,成功通过该请求", "好友请求", target=event.user_id)
await bot.set_friend_add_request(flag=event.flag, approve=True) await bot.set_friend_add_request(flag=event.flag, approve=True)
await FriendUser.create(user_id=user["user_id"], user_name=user["nickname"]) await FriendUser.create(user_id=str(user["user_id"]), user_name=user["nickname"])
else: else:
requests_manager.add_request( requests_manager.add_request(
event.user_id, event.user_id,
@ -87,7 +87,7 @@ async def _(bot: Bot, event: GroupRequestEvent):
) )
group_info = await bot.get_group_info(group_id=event.group_id) group_info = await bot.get_group_info(group_id=event.group_id)
await GroupInfo.update_or_create( await GroupInfo.update_or_create(
group_id=group_info["group_id"], group_id=str(group_info["group_id"]),
defaults={ defaults={
"group_name": group_info["group_name"], "group_name": group_info["group_name"],
"max_member_count": group_info["max_member_count"], "max_member_count": group_info["max_member_count"],

View File

@ -104,7 +104,7 @@ async def _(
): ):
(msg,) = reg_group (msg,) = reg_group
await FriendUser.set_user_nickname(event.user_id, msg) await FriendUser.set_user_nickname(event.user_id, msg)
await GroupInfoUser.filter(user_qq=event.user_id).update(nickname=msg) await GroupInfoUser.filter(user_id=str(event.user_id)).update(nickname=msg)
logger.info(f"设置全局昵称成功: {msg}", "设置全局昵称", event.user_id) logger.info(f"设置全局昵称成功: {msg}", "设置全局昵称", event.user_id)
await global_nickname.send(f"设置全局昵称成功!亲爱的{msg}") await global_nickname.send(f"设置全局昵称成功!亲爱的{msg}")

View File

@ -94,8 +94,8 @@ async def _(event: GroupMessageEvent, arg: Message = CommandArg()):
event.group_id, event.group_id,
) )
await UserShopGoldLog.create( await UserShopGoldLog.create(
user_qq=event.user_id, user_id=str(event.user_id),
group_id=event.group_id, group_id=str(event.group_id),
type=0, type=0,
name=goods.goods_name, name=goods.goods_name,
num=num, num=num,

View File

@ -33,7 +33,7 @@ my_props = on_command("我的道具", priority=5, block=True, permission=GROUP)
@my_props.handle() @my_props.handle()
async def _(event: GroupMessageEvent): async def _(event: GroupMessageEvent):
props = await BagUser.get_property(event.user_id, event.group_id) props = await BagUser.get_property(str(event.user_id), str(event.group_id))
if props: if props:
await my_props.send(image(b64=await create_bag_image(props))) await my_props.send(image(b64=await create_bag_image(props)))
logger.info(f"查看我的道具", "我的道具", event.user_id, event.group_id) logger.info(f"查看我的道具", "我的道具", event.user_id, event.group_id)

View File

@ -109,13 +109,13 @@ async def _(
if cmd[:2] == "同意": if cmd[:2] == "同意":
rid = requests_manager.get_group_id(id_) rid = requests_manager.get_group_id(id_)
if rid: if rid:
if group := await GroupInfo.get_or_none(group_id=rid): if group := await GroupInfo.get_or_none(group_id=str(rid)):
group.group_flag = 1 group.group_flag = 1
await group.save(update_fields=["group_flag"]) await group.save(update_fields=["group_flag"])
else: else:
group_info = await bot.get_group_info(group_id=rid) group_info = await bot.get_group_info(group_id=rid)
await GroupInfo.create( await GroupInfo.create(
group_id=rid, group_id=str(rid),
group_name=group_info["group_name"], group_name=group_info["group_name"],
max_member_count=group_info["max_member_count"], max_member_count=group_info["max_member_count"],
member_count=group_info["member_count"], member_count=group_info["member_count"],

View File

@ -40,7 +40,7 @@ async def _(bot: Bot, event: MessageEvent):
try: try:
group_info = await bot.get_group_info(group_id=g) group_info = await bot.get_group_info(group_id=g)
await GroupInfo.update_or_create( await GroupInfo.update_or_create(
group_id=group_info["group_id"], group_id=str(group_info["group_id"]),
defaults={ defaults={
"group_name": group_info["group_name"], "group_name": group_info["group_name"],
"max_member_count": group_info["max_member_count"], "max_member_count": group_info["max_member_count"],
@ -65,7 +65,7 @@ async def _(bot: Bot, event: MessageEvent):
for f in fl: for f in fl:
try: try:
await FriendUser.update_or_create( await FriendUser.update_or_create(
user_id=f["user_id"], defaults={"nickname": f["nickname"]} user_id=str(f["user_id"]), defaults={"nickname": f["nickname"]}
) )
logger.debug(f"更新好友信息成功", "更新好友信息", event.user_id, target=f["user_id"]) logger.debug(f"更新好友信息成功", "更新好友信息", event.user_id, target=f["user_id"])
num += 1 num += 1

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_qq TO user_id;", # 将user_qq改为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_qq 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_qq 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);",
]

View File

@ -235,7 +235,7 @@ async def _get_punish(
ban_4_duration = Config.get_config("black_word", "BAN_4_DURATION") ban_4_duration = Config.get_config("black_word", "BAN_4_DURATION")
# 口头警告内容 # 口头警告内容
warning_result = Config.get_config("black_word", "WARNING_RESULT") warning_result = Config.get_config("black_word", "WARNING_RESULT")
if user := await GroupInfoUser.get_or_none(user_qq=user_id, group_id=group_id): if user := await GroupInfoUser.get_or_none(user_id=str(user_id), group_id=str(group_id)):
uname = user.user_name uname = user.user_name
else: else:
uname = user_id uname = user_id

View File

@ -32,7 +32,7 @@ async def _(event: GroupMessageEvent):
async def get_member_info(user_qq: int, group_id: int) -> str: async def get_member_info(user_qq: int, group_id: int) -> str:
if user := await GroupInfoUser.get_or_none(user_qq=user_qq, group_id=group_id): if user := await GroupInfoUser.get_or_none(user_id=str(user_qq), group_id=str(group_id)):
result = "" result = ""
result += "昵称:" + user.user_name + "\n" result += "昵称:" + user.user_name + "\n"
result += "加群时间:" + str(user.user_join_time.date()) result += "加群时间:" + str(user.user_join_time.date())

View File

@ -73,7 +73,7 @@ async def get_user_max_count(user_qq: int, group_id: int) -> int:
Returns: Returns:
int: 最大开箱次数 int: 最大开箱次数
""" """
user, _ = await SignGroupUser.get_or_create(user_qq=user_qq, group_id=group_id) user, _ = await SignGroupUser.get_or_create(user_id=str(user_qq), group_id=str(group_id))
impression = int(user.impression) impression = int(user.impression)
initial_open_case_count = Config.get_config("open_cases", "INITIAL_OPEN_CASE_COUNT") initial_open_case_count = Config.get_config("open_cases", "INITIAL_OPEN_CASE_COUNT")
each_impression_add_count = Config.get_config( each_impression_add_count = Config.get_config(

View File

@ -160,7 +160,7 @@ async def _(event: GroupMessageEvent):
if rs_player[event.group_id]["at"] == event.user_id: if rs_player[event.group_id]["at"] == event.user_id:
at_player_name = ( at_player_name = (
await GroupInfoUser.get_or_none( await GroupInfoUser.get_or_none(
user_qq=event.user_id, group_id=event.group_id user_id=str(event.user_id), group_id=str(event.group_id)
) )
).user_name ).user_name
await accept.send( await accept.send(

View File

@ -172,7 +172,7 @@ async def _(
msg = arg.extract_plain_text().strip() msg = arg.extract_plain_text().strip()
if isinstance(event, GroupMessageEvent): if isinstance(event, GroupMessageEvent):
user, _ = await SignGroupUser.get_or_create( user, _ = await SignGroupUser.get_or_create(
user_qq=event.user_id, group_id=event.group_id user_id=str(event.user_id), group_id=str(event.group_id)
) )
impression = user.impression impression = user.impression
if luox := get_luoxiang(impression): if luox := get_luoxiang(impression):
@ -232,7 +232,7 @@ num_key = {
async def _(bot: Bot, event: MessageEvent, reg_group: Tuple[Any, ...] = RegexGroup()): async def _(bot: Bot, event: MessageEvent, reg_group: Tuple[Any, ...] = RegexGroup()):
if isinstance(event, GroupMessageEvent): if isinstance(event, GroupMessageEvent):
user, _ = await SignGroupUser.get_or_create( user, _ = await SignGroupUser.get_or_create(
user_qq=event.user_id, group_id=event.group_id user_id=str(event.user_id), group_id=str(event.group_id)
) )
impression = user.impression impression = user.impression
if luox := get_luoxiang(impression): if luox := get_luoxiang(impression):

View File

@ -31,7 +31,7 @@ async def _():
**{"好感度双倍加持卡_prob": 0.1, "好感度双倍加持卡Ⅱ_prob": 0.2, "好感度双倍加持卡Ⅲ_prob": 0.3}, **{"好感度双倍加持卡_prob": 0.1, "好感度双倍加持卡Ⅱ_prob": 0.2, "好感度双倍加持卡Ⅲ_prob": 0.3},
) )
async def sign_card(user_id: int, group_id: int, prob: float): async def sign_card(user_id: int, group_id: int, prob: float):
user, _ = await SignGroupUser.get_or_create(user_qq=user_id, group_id=group_id) user, _ = await SignGroupUser.get_or_create(user_id=str(user_id), group_id=str(group_id))
user.add_probability = prob user.add_probability = prob
await user.save(update_fields=["add_probability"]) await user.save(update_fields=["add_probability"])

View File

@ -28,7 +28,7 @@ async def group_user_check_in(
"Returns string describing the result of checking in" "Returns string describing the result of checking in"
present = datetime.now() present = datetime.now()
# 取得相应用户 # 取得相应用户
user, is_create = await SignGroupUser.get_or_create(user_qq=user_qq, group_id=group) user, is_create = await SignGroupUser.get_or_create(user_id=str(user_qq), group_id=str(group))
# 如果同一天签到过,特殊处理 # 如果同一天签到过,特殊处理
if not is_create and ( if not is_create and (
user.checkin_time_last.date() >= present.date() user.checkin_time_last.date() >= present.date()
@ -49,7 +49,7 @@ async def check_in_all(nickname: str, user_qq: int):
:param user_qq: 用户qq :param user_qq: 用户qq
""" """
present = datetime.now() present = datetime.now()
for u in await SignGroupUser.filter(user_qq=user_qq).all(): for u in await SignGroupUser.filter(user_id=str(user_qq)).all():
group = u.group_id group = u.group_id
if not ( if not (
u.checkin_time_last.date() >= present.date() u.checkin_time_last.date() >= present.date()
@ -62,7 +62,7 @@ async def check_in_all(nickname: str, user_qq: int):
async def _handle_check_in( async def _handle_check_in(
nickname: str, user_qq: int, group: int, present: datetime nickname: str, user_qq: int, group: int, present: datetime
) -> MessageSegment: ) -> MessageSegment:
user, _ = await SignGroupUser.get_or_create(user_qq=user_qq, group_id=group) user, _ = await SignGroupUser.get_or_create(user_id=str(user_qq), group_id=str(group))
impression_added = (secrets.randbelow(99) + 1) / 100 impression_added = (secrets.randbelow(99) + 1) / 100
critx2 = random.random() critx2 = random.random()
add_probability = float(user.add_probability) add_probability = float(user.add_probability)
@ -83,7 +83,7 @@ async def _handle_check_in(
gift += " + 1" gift += " + 1"
logger.info( logger.info(
f"(USER {user.user_qq}, GROUP {user.group_id})" f"(USER {user.user_id}, GROUP {user.group_id})"
f" CHECKED IN successfully. score: {user.impression:.2f} " f" CHECKED IN successfully. score: {user.impression:.2f} "
f"(+{impression_added:.2f}).获取金币:{gold + gift if gift == 'gold' else gold}" f"(+{impression_added:.2f}).获取金币:{gold + gift if gift == 'gold' else gold}"
) )
@ -95,7 +95,7 @@ async def _handle_check_in(
async def group_user_check(nickname: str, user_qq: int, group: int) -> MessageSegment: async def group_user_check(nickname: str, user_qq: int, group: int) -> MessageSegment:
# heuristic: if users find they have never checked in they are probable to check in # heuristic: if users find they have never checked in they are probable to check in
user, _ = await SignGroupUser.get_or_create(user_qq=user_qq, group_id=group) user, _ = await SignGroupUser.get_or_create(user_id=str(user_qq), group_id=str(group))
gold = await BagUser.get_gold(user_qq, group) gold = await BagUser.get_gold(user_qq, group)
return await get_card(user, nickname, None, gold, "", is_card_view=True) return await get_card(user, nickname, None, gold, "", is_card_view=True)
@ -171,7 +171,7 @@ async def _pst(users: list, impressions: list, groups: list):
impressions.pop(index) impressions.pop(index)
users.pop(index) users.pop(index)
groups.pop(index) groups.pop(index)
if user_ := await GroupInfoUser.get_or_none(user_qq=user, group_id=group): if user_ := await GroupInfoUser.get_or_none(user_id=str(user), group_id=str(group)):
user_name = user_.user_name user_name = user_.user_name
else: else:
user_name = f"我名字呢?" user_name = f"我名字呢?"

View File

@ -35,10 +35,10 @@ driver: Driver = nonebot.get_driver()
async def init_image(): async def init_image():
SIGN_RESOURCE_PATH.mkdir(parents=True, exist_ok=True) SIGN_RESOURCE_PATH.mkdir(parents=True, exist_ok=True)
SIGN_TODAY_CARD_PATH.mkdir(exist_ok=True, parents=True) SIGN_TODAY_CARD_PATH.mkdir(exist_ok=True, parents=True)
if not await GroupInfoUser.get_or_none(user_qq=114514): if not await GroupInfoUser.get_or_none(user_id="A_nmi_114514"):
await GroupInfoUser.create( await GroupInfoUser.create(
user_qq=114514, user_id="A_nmi_114514",
group_id=114514, group_id="A_nmi_114514",
user_name="", user_name="",
uid=0, uid=0,
) )
@ -55,7 +55,7 @@ async def get_card(
is_double: bool = False, is_double: bool = False,
is_card_view: bool = False, is_card_view: bool = False,
) -> MessageSegment: ) -> MessageSegment:
user_id = user.user_qq user_id = user.user_id
date = datetime.now().date() date = datetime.now().date()
_type = "view" if is_card_view else "sign" _type = "view" if is_card_view else "sign"
card_file = ( card_file = (
@ -83,7 +83,7 @@ async def get_card(
) )
is_card_view = True is_card_view = True
ava = BytesIO(await get_user_avatar(user_id)) ava = BytesIO(await get_user_avatar(user_id))
uid = await GroupInfoUser.get_group_member_uid(user.user_qq, user.group_id) uid = await GroupInfoUser.get_group_member_uid(user.user_id, user.group_id)
impression_list = None impression_list = None
if is_card_view: if is_card_view:
_, impression_list, _ = await SignGroupUser.get_all_impression( _, impression_list, _ = await SignGroupUser.get_all_impression(
@ -109,7 +109,7 @@ async def get_card(
def _generate_card( def _generate_card(
user: "SignGroupUser", user: "SignGroupUser",
nickname: str, nickname: str,
user_id: int, user_id: str,
impression: Optional[float], impression: Optional[float],
gold: Optional[int], gold: Optional[int],
gift: str, gift: str,

View File

@ -162,8 +162,8 @@ async def _(bot: Bot, event: MessageEvent, cmd: Tuple[str, ...] = Command(), arg
day_index = data["day_index"] day_index = data["day_index"]
data = data[arg][key] data = data[arg][key]
if _type == "group": if _type == "group":
group = await GroupInfo.filter(group_id=event.group_id).first() group = await GroupInfo.filter(group_id=str(event.group_id)).first()
name = name.group_name if group else str(event.group_id) name = group if group else str(event.group_id)
else: else:
name = event.sender.card or event.sender.nickname name = event.sender.card or event.sender.nickname
img = await generate_statistics_img(data, arg, name, plugin, day_index) img = await generate_statistics_img(data, arg, name, plugin, day_index)

View File

@ -56,12 +56,12 @@ async def _(parma: HandleRequest) -> Result:
if parma.type == "group": if parma.type == "group":
if rid := requests_manager.get_group_id(parma.id): if rid := requests_manager.get_group_id(parma.id):
# await GroupInfo.update_or_create(defaults={"group_flag": 1}, ) # await GroupInfo.update_or_create(defaults={"group_flag": 1}, )
if group := await GroupInfo.get_or_none(group_id=rid): if group := await GroupInfo.get_or_none(group_id=str(rid)):
await group.update_or_create(group_flag=1) await group.update_or_create(group_flag=1)
else: else:
group_info = await bot.get_group_info(group_id=rid) group_info = await bot.get_group_info(group_id=rid)
await GroupInfo.update_or_create( await GroupInfo.update_or_create(
group_id=group_info["group_id"], group_id=str(group_info["group_id"]),
defaults={ defaults={
"group_name": group_info["group_name"], "group_name": group_info["group_name"],
"max_member_count": group_info["max_member_count"], "max_member_count": group_info["max_member_count"],

View File

@ -32,7 +32,7 @@ async def init_rank(
all_user_id.remove(max_user_id) all_user_id.remove(max_user_id)
all_user_data.remove(_max) all_user_data.remove(_max)
if user := await GroupInfoUser.get_or_none( if user := await GroupInfoUser.get_or_none(
user_qq=max_user_id, group_id=group_id user_qq=str(max_user_id), group_id=str(group_id)
): ):
user_name = user.user_name user_name = user.user_name
else: else:

View File

@ -75,8 +75,8 @@ def CostGold(gold: int):
await matcher.finish(at(event.user_id) + f"金币不足..该功能需要{gold}金币..") await matcher.finish(at(event.user_id) + f"金币不足..该功能需要{gold}金币..")
await BagUser.spend_gold(event.user_id, event.group_id, gold) await BagUser.spend_gold(event.user_id, event.group_id, gold)
await UserShopGoldLog.create( await UserShopGoldLog.create(
user_qq=event.user_id, user_qq=str(event.user_id),
group_id=event.group_id, group_id=str(event.group_id),
type=2, type=2,
name=matcher.plugin_name, name=matcher.plugin_name,
num=1, num=1,