2021-05-20 18:37:51 +08:00
|
|
|
|
from datetime import datetime
|
2021-12-16 11:16:28 +08:00
|
|
|
|
from typing import List
|
2021-05-20 18:37:51 +08:00
|
|
|
|
from services.db_context import db
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SignGroupUser(db.Model):
|
2021-07-30 21:21:51 +08:00
|
|
|
|
__tablename__ = "sign_group_users"
|
2021-05-20 18:37:51 +08:00
|
|
|
|
|
|
|
|
|
|
id = db.Column(db.Integer(), primary_key=True)
|
|
|
|
|
|
user_qq = db.Column(db.BigInteger(), nullable=False)
|
2022-01-16 14:52:50 +08:00
|
|
|
|
group_id = db.Column(db.BigInteger(), nullable=False)
|
2021-05-20 18:37:51 +08:00
|
|
|
|
checkin_count = db.Column(db.Integer(), nullable=False)
|
|
|
|
|
|
checkin_time_last = db.Column(db.DateTime(timezone=True), nullable=False)
|
|
|
|
|
|
impression = db.Column(db.Numeric(scale=3, asdecimal=False), nullable=False)
|
2021-07-30 21:21:51 +08:00
|
|
|
|
add_probability = db.Column(
|
|
|
|
|
|
db.Numeric(scale=3, asdecimal=False), nullable=False, default=0
|
|
|
|
|
|
)
|
|
|
|
|
|
specify_probability = db.Column(
|
|
|
|
|
|
db.Numeric(scale=3, asdecimal=False), nullable=False, default=0
|
|
|
|
|
|
)
|
2021-05-20 18:37:51 +08:00
|
|
|
|
|
2022-01-16 14:52:50 +08:00
|
|
|
|
_idx1 = db.Index("sign_group_users_idx1", "user_qq", "group_id", unique=True)
|
2021-05-20 18:37:51 +08:00
|
|
|
|
|
|
|
|
|
|
@classmethod
|
2021-07-30 21:21:51 +08:00
|
|
|
|
async def ensure(
|
2022-01-16 14:52:50 +08:00
|
|
|
|
cls, user_qq: int, group_id: int, for_update: bool = False
|
2021-07-30 21:21:51 +08:00
|
|
|
|
) -> "SignGroupUser":
|
2021-12-16 11:16:28 +08:00
|
|
|
|
"""
|
|
|
|
|
|
说明:
|
|
|
|
|
|
获取签到用户
|
|
|
|
|
|
参数:
|
|
|
|
|
|
:param user_qq: 用户qq
|
2022-01-16 14:52:50 +08:00
|
|
|
|
:param group_id: 所在群聊
|
2021-12-16 11:16:28 +08:00
|
|
|
|
:param for_update: 是否存在修改数据
|
|
|
|
|
|
"""
|
2021-05-20 18:37:51 +08:00
|
|
|
|
query = cls.query.where(
|
2022-01-16 14:52:50 +08:00
|
|
|
|
(cls.user_qq == user_qq) & (cls.group_id == group_id)
|
2021-05-20 18:37:51 +08:00
|
|
|
|
)
|
|
|
|
|
|
if for_update:
|
|
|
|
|
|
query = query.with_for_update()
|
|
|
|
|
|
user = await query.gino.first()
|
|
|
|
|
|
return user or await cls.create(
|
|
|
|
|
|
user_qq=user_qq,
|
2022-01-16 14:52:50 +08:00
|
|
|
|
group_id=group_id,
|
2021-05-20 18:37:51 +08:00
|
|
|
|
checkin_count=0,
|
|
|
|
|
|
checkin_time_last=datetime.min, # 从未签到过
|
|
|
|
|
|
impression=0,
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2021-12-16 11:16:28 +08:00
|
|
|
|
@classmethod
|
|
|
|
|
|
async def get_user_all_data(cls, user_qq: int) -> List["SignGroupUser"]:
|
|
|
|
|
|
"""
|
|
|
|
|
|
说明:
|
|
|
|
|
|
获取某用户所有数据
|
|
|
|
|
|
参数:
|
|
|
|
|
|
:param user_qq: 用户qq
|
|
|
|
|
|
"""
|
|
|
|
|
|
query = cls.query.where(cls.user_qq == user_qq)
|
|
|
|
|
|
query = query.with_for_update()
|
|
|
|
|
|
return await query.gino.all()
|
|
|
|
|
|
|
2021-05-20 18:37:51 +08:00
|
|
|
|
@classmethod
|
2021-09-05 02:21:38 +08:00
|
|
|
|
async def sign(cls, user: "SignGroupUser", impression: float, checkin_time_last: datetime):
|
2021-12-16 11:16:28 +08:00
|
|
|
|
"""
|
|
|
|
|
|
说明:
|
|
|
|
|
|
签到
|
|
|
|
|
|
说明:
|
|
|
|
|
|
:param user: 用户
|
|
|
|
|
|
:param impression: 增加的好感度
|
|
|
|
|
|
:param checkin_time_last: 签到时间
|
|
|
|
|
|
"""
|
2021-09-05 02:21:38 +08:00
|
|
|
|
await user.update(
|
|
|
|
|
|
checkin_count=user.checkin_count + 1,
|
|
|
|
|
|
checkin_time_last=checkin_time_last,
|
|
|
|
|
|
impression=user.impression + impression,
|
|
|
|
|
|
add_probability=0,
|
|
|
|
|
|
specify_probability=0,
|
|
|
|
|
|
).apply()
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
2022-01-16 14:52:50 +08:00
|
|
|
|
async def get_all_impression(cls, group_id: int) -> "list, list, list":
|
2021-07-30 21:21:51 +08:00
|
|
|
|
"""
|
|
|
|
|
|
说明:
|
|
|
|
|
|
获取该群所有用户 id 及对应 好感度
|
|
|
|
|
|
参数:
|
2022-01-16 14:52:50 +08:00
|
|
|
|
:param group_id: 群号
|
2021-07-30 21:21:51 +08:00
|
|
|
|
"""
|
2021-05-20 18:37:51 +08:00
|
|
|
|
impression_list = []
|
|
|
|
|
|
user_qq_list = []
|
2021-06-30 19:50:55 +08:00
|
|
|
|
user_group = []
|
2022-01-16 14:52:50 +08:00
|
|
|
|
if group_id:
|
|
|
|
|
|
query = cls.query.where(cls.group_id == group_id)
|
2021-06-30 19:50:55 +08:00
|
|
|
|
else:
|
|
|
|
|
|
query = cls.query
|
2021-05-20 18:37:51 +08:00
|
|
|
|
for user in await query.gino.all():
|
|
|
|
|
|
impression_list.append(user.impression)
|
|
|
|
|
|
user_qq_list.append(user.user_qq)
|
2022-01-16 14:52:50 +08:00
|
|
|
|
user_group.append(user.group_id)
|
2021-06-30 19:50:55 +08:00
|
|
|
|
return user_qq_list, impression_list, user_group
|