SanYeCao-Nonebot/src/my_sqlite/models/user.py

112 lines
3.9 KiB
Python
Raw Normal View History

2025-01-24 11:11:07 +00:00
from datetime import datetime, timedelta
import random
from tortoise import fields
from src.my_sqlite.data_init.db_connect import Model
class UserList(Model):
user_id = fields.CharField(max_length=64, description="用户member_openid")
group_id = fields.CharField(max_length=64, description="用户所在群聊id")
last_used_time = fields.DateField(auto_now_add=True, description="用户最近一次使用时间")
class Meta:
table = "user_list"
table_description = "用户表"
@classmethod
async def get_user_id(cls, user_id: str | None, group_id: str | None, days: int = 3) -> str | None:
"""
获取指定天数内有活动的用户ID并随机选择一个作为伴侣ID
:param user_id: 用户ID
:param group_id: 群组ID
:param days: 最近活动天数默认为3天
:return: 随机选择的伴侣ID如果没有符合条件的用户则返回None
"""
# 检查用户是否已有伴侣
has_wife = await Wife.has_wife(user_id=user_id, group_id=group_id)
if has_wife:
return has_wife
# 获取最近指定天数内有活动的用户
start_date = datetime.now().date() - timedelta(days=days)
end_date = datetime.now().date()
user_ids = await cls.filter(group_id=group_id, last_used_time__range=(start_date, end_date)) \
.exclude(user_id=user_id).values_list("user_id", flat=True)
if user_ids:
wife_id = random.choice(user_ids)
await Wife.save_wife(user_id=user_id, group_id=group_id, wife_id=wife_id)
return wife_id
else:
return None
@classmethod
async def insert_user(cls, user_id: str | None, group_id: str | None):
"""
插入用户数据
:param user_id:
:param group_id:
:return:
"""
user_table = await cls.filter(user_id=user_id, group_id=group_id).first()
if user_table:
2025-02-06 04:33:59 +00:00
user_table.last_used_time = datetime.now().date()
2025-01-24 11:11:07 +00:00
await user_table.save()
else:
await cls.create(user_id=user_id,group_id=group_id,last_used_time=datetime.now().date())
class Wife(Model):
"""
群今日老婆记录表包含群老婆和二次元老婆
"""
id = fields.IntField(primary_key=True, generated=True, auto_increment=True)
user_id = fields.CharField(max_length=64, description="用户id", null=True)
group_id = fields.CharField(max_length=64, description="群聊id", null=True)
wife_id = fields.CharField(max_length=64, description="对应群聊用户抽取到的id", null=True)
wife_name = fields.CharField(max_length=64, description="名称", null=True)
wife_description = fields.CharField(max_length=64, description="描述", null=True)
create_time = fields.DateField(auto_now_add=True, description="创建时间", null=True)
class Meta:
# 指定表名
table = "wife"
table_description = "群今日老婆记录表"
@classmethod
async def has_wife(cls, user_id: str | None, group_id: str | None) -> str | None:
"""
查询是否有今日群老婆
:param user_id:
:param group_id:
:return:
"""
wife = await cls.filter(user_id=user_id, group_id=group_id, create_time=datetime.now().date()).first()
if wife is None:
return None
else:
return wife.wife_id
@classmethod
async def save_wife(cls, user_id: str | None, group_id: str | None, wife_id: str | None):
"""
保存今日群老婆
:param user_id:
:param group_id:
:param wife_id:
:return:
"""
data = {
"user_id":user_id,
"group_id":group_id,
"wife_id":wife_id,
"create_time":datetime.now().date()
}
await cls.create(**data)