zhenxun_bot/models/sign_group_user.py

73 lines
2.5 KiB
Python
Raw Normal View History

2021-05-20 18:37:51 +08:00
from datetime import datetime
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)
belonging_group = db.Column(db.BigInteger(), nullable=False)
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
2021-07-30 21:21:51 +08:00
_idx1 = db.Index("sign_group_users_idx1", "user_qq", "belonging_group", unique=True)
2021-05-20 18:37:51 +08:00
@classmethod
2021-07-30 21:21:51 +08:00
async def ensure(
cls, user_qq: int, belonging_group: int, for_update: bool = False
) -> "SignGroupUser":
2021-05-20 18:37:51 +08:00
query = cls.query.where(
(cls.user_qq == user_qq) & (cls.belonging_group == belonging_group)
)
if for_update:
query = query.with_for_update()
user = await query.gino.first()
return user or await cls.create(
user_qq=user_qq,
belonging_group=belonging_group,
checkin_count=0,
checkin_time_last=datetime.min, # 从未签到过
impression=0,
)
@classmethod
2021-09-05 02:21:38 +08:00
async def sign(cls, user: "SignGroupUser", impression: float, checkin_time_last: datetime):
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
async def get_all_impression(cls, belonging_group: int) -> "list, list, list":
2021-07-30 21:21:51 +08:00
"""
说明
获取该群所有用户 id 及对应 好感度
参数
:param belonging_group: 群号
"""
2021-05-20 18:37:51 +08:00
impression_list = []
user_qq_list = []
2021-06-30 19:50:55 +08:00
user_group = []
if belonging_group:
2021-07-30 21:21:51 +08:00
query = cls.query.where(cls.belonging_group == belonging_group)
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)
2021-06-30 19:50:55 +08:00
user_group.append(user.belonging_group)
return user_qq_list, impression_list, user_group