mirror of
https://github.com/ClovertaTheTrilobita/SanYeCao-Nonebot.git
synced 2026-04-01 22:04:51 +00:00
111 lines
3.9 KiB
Python
111 lines
3.9 KiB
Python
from datetime import datetime, timedelta
|
||
import random
|
||
from tortoise import fields
|
||
from src.clover_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:
|
||
user_table.last_used_time = datetime.now().date()
|
||
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)
|
||
|
||
|