2021-05-20 18:37:51 +08:00
|
|
|
|
from datetime import datetime
|
2021-12-01 14:03:34 +08:00
|
|
|
|
from configs.config import Config
|
2021-05-20 18:37:51 +08:00
|
|
|
|
from services.db_context import db
|
2021-09-05 02:21:38 +08:00
|
|
|
|
from typing import List, Optional
|
2021-05-20 18:37:51 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class GroupInfoUser(db.Model):
|
2021-07-30 21:21:51 +08:00
|
|
|
|
__tablename__ = "group_info_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)
|
|
|
|
|
|
user_name = db.Column(db.Unicode(), nullable=False)
|
|
|
|
|
|
belonging_group = db.Column(db.BigInteger(), nullable=False)
|
|
|
|
|
|
user_join_time = db.Column(db.DateTime(), nullable=False)
|
|
|
|
|
|
nickname = db.Column(db.Unicode())
|
2021-09-05 02:21:38 +08:00
|
|
|
|
uid = db.Column(db.BigInteger())
|
2021-05-20 18:37:51 +08:00
|
|
|
|
|
2021-07-30 21:21:51 +08:00
|
|
|
|
_idx1 = db.Index("info_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 add_member_info(
|
|
|
|
|
|
cls,
|
|
|
|
|
|
user_qq: int,
|
|
|
|
|
|
belonging_group: int,
|
|
|
|
|
|
user_name: str,
|
|
|
|
|
|
user_join_time: datetime,
|
2021-09-09 10:47:26 +08:00
|
|
|
|
uid: Optional[int] = None,
|
2021-07-30 21:21:51 +08:00
|
|
|
|
) -> bool:
|
|
|
|
|
|
"""
|
|
|
|
|
|
说明:
|
|
|
|
|
|
添加群内用户信息
|
|
|
|
|
|
参数:
|
|
|
|
|
|
:param user_qq: qq号
|
|
|
|
|
|
:param belonging_group: 群号
|
|
|
|
|
|
:param user_name: 用户名称
|
|
|
|
|
|
:param user_join_time: 入群时间
|
2021-09-09 10:47:26 +08:00
|
|
|
|
:param uid: 用户唯一 id(自动生成)
|
2021-07-30 21:21:51 +08:00
|
|
|
|
"""
|
2021-05-20 18:37:51 +08:00
|
|
|
|
query = cls.query.where(
|
|
|
|
|
|
(cls.user_qq == user_qq) & (cls.belonging_group == belonging_group)
|
|
|
|
|
|
)
|
|
|
|
|
|
try:
|
2021-07-30 21:21:51 +08:00
|
|
|
|
if not await query.gino.first():
|
2021-05-20 18:37:51 +08:00
|
|
|
|
await cls.create(
|
|
|
|
|
|
user_qq=user_qq,
|
|
|
|
|
|
user_name=user_name,
|
|
|
|
|
|
belonging_group=belonging_group,
|
|
|
|
|
|
user_join_time=user_join_time,
|
2021-09-09 10:47:26 +08:00
|
|
|
|
uid=uid
|
2021-05-20 18:37:51 +08:00
|
|
|
|
)
|
|
|
|
|
|
return True
|
2021-07-30 21:21:51 +08:00
|
|
|
|
except Exception:
|
2021-05-20 18:37:51 +08:00
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
2021-07-30 21:21:51 +08:00
|
|
|
|
async def get_member_info(
|
|
|
|
|
|
cls, user_qq: int, belonging_group: int
|
|
|
|
|
|
) -> "GroupInfoUser":
|
|
|
|
|
|
"""
|
|
|
|
|
|
说明:
|
|
|
|
|
|
查询群员信息
|
|
|
|
|
|
参数:
|
|
|
|
|
|
:param user_qq: qq号
|
|
|
|
|
|
:param belonging_group: 群号
|
|
|
|
|
|
"""
|
2021-05-20 18:37:51 +08:00
|
|
|
|
query = cls.query.where(
|
|
|
|
|
|
(cls.user_qq == user_qq) & (cls.belonging_group == belonging_group)
|
|
|
|
|
|
)
|
|
|
|
|
|
return await query.gino.first()
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
2021-07-30 21:21:51 +08:00
|
|
|
|
async def delete_member_info(cls, user_qq: int, belonging_group: int) -> bool:
|
|
|
|
|
|
"""
|
|
|
|
|
|
说明:
|
|
|
|
|
|
删除群员信息
|
|
|
|
|
|
参数:
|
|
|
|
|
|
:param user_qq: qq号
|
|
|
|
|
|
:param belonging_group: 群号
|
|
|
|
|
|
"""
|
2021-05-20 18:37:51 +08:00
|
|
|
|
query = cls.query.where(
|
|
|
|
|
|
(cls.user_qq == user_qq) & (cls.belonging_group == belonging_group)
|
|
|
|
|
|
)
|
|
|
|
|
|
query = query.with_for_update()
|
|
|
|
|
|
user = await query.gino.first()
|
|
|
|
|
|
try:
|
|
|
|
|
|
if user is None:
|
|
|
|
|
|
return True
|
|
|
|
|
|
else:
|
|
|
|
|
|
await cls.delete.where(
|
|
|
|
|
|
(cls.user_qq == user_qq) & (cls.belonging_group == belonging_group)
|
|
|
|
|
|
).gino.status()
|
|
|
|
|
|
return True
|
2021-07-30 21:21:51 +08:00
|
|
|
|
except Exception:
|
2021-05-20 18:37:51 +08:00
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
2021-07-30 21:21:51 +08:00
|
|
|
|
async def get_group_member_id_list(cls, belonging_group: int) -> List[int]:
|
|
|
|
|
|
"""
|
|
|
|
|
|
说明:
|
|
|
|
|
|
获取该群所有用户qq
|
|
|
|
|
|
参数:
|
|
|
|
|
|
:param belonging_group: 群号
|
|
|
|
|
|
"""
|
2021-05-20 18:37:51 +08:00
|
|
|
|
member_list = []
|
2021-07-30 21:21:51 +08:00
|
|
|
|
query = cls.query.where((cls.belonging_group == belonging_group))
|
2021-05-20 18:37:51 +08:00
|
|
|
|
for user in await query.gino.all():
|
|
|
|
|
|
member_list.append(user.user_qq)
|
|
|
|
|
|
return member_list
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
2021-07-30 21:21:51 +08:00
|
|
|
|
async def set_group_member_nickname(
|
|
|
|
|
|
cls, user_qq: int, belonging_group: int, nickname: str
|
|
|
|
|
|
) -> bool:
|
|
|
|
|
|
"""
|
|
|
|
|
|
说明:
|
|
|
|
|
|
设置群员在该群内的昵称
|
|
|
|
|
|
参数:
|
|
|
|
|
|
:param user_qq: qq号
|
|
|
|
|
|
:param belonging_group: 群号
|
|
|
|
|
|
:param nickname: 昵称
|
|
|
|
|
|
"""
|
2021-05-20 18:37:51 +08:00
|
|
|
|
query = cls.query.where(
|
|
|
|
|
|
(cls.user_qq == user_qq) & (cls.belonging_group == belonging_group)
|
|
|
|
|
|
)
|
2021-06-15 10:57:08 +08:00
|
|
|
|
user = await query.with_for_update().gino.first()
|
2021-05-20 18:37:51 +08:00
|
|
|
|
if user:
|
2021-07-30 21:21:51 +08:00
|
|
|
|
await user.update(nickname=nickname).apply()
|
2021-05-20 18:37:51 +08:00
|
|
|
|
return True
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
2021-12-01 14:03:34 +08:00
|
|
|
|
@classmethod
|
|
|
|
|
|
async def get_user_all_group(cls, user_qq: int) -> List[int]:
|
|
|
|
|
|
"""
|
|
|
|
|
|
获取该用户所在的所有群聊
|
|
|
|
|
|
:param user_qq: 用户qq
|
|
|
|
|
|
"""
|
|
|
|
|
|
query = await cls.query.where(cls.user_qq == user_qq).gino.all()
|
|
|
|
|
|
if query:
|
|
|
|
|
|
query = [x.belonging_group for x in query]
|
|
|
|
|
|
return query
|
|
|
|
|
|
|
2021-05-20 18:37:51 +08:00
|
|
|
|
@classmethod
|
2021-07-30 21:21:51 +08:00
|
|
|
|
async def get_group_member_nickname(cls, user_qq: int, belonging_group: int) -> str:
|
|
|
|
|
|
"""
|
|
|
|
|
|
说明:
|
|
|
|
|
|
获取用户在该群的昵称
|
|
|
|
|
|
参数:
|
|
|
|
|
|
:param user_qq: qq号
|
|
|
|
|
|
:param belonging_group: 群号
|
|
|
|
|
|
"""
|
2021-05-20 18:37:51 +08:00
|
|
|
|
query = cls.query.where(
|
|
|
|
|
|
(cls.user_qq == user_qq) & (cls.belonging_group == belonging_group)
|
|
|
|
|
|
)
|
|
|
|
|
|
user = await query.gino.first()
|
|
|
|
|
|
if user:
|
|
|
|
|
|
if user.nickname:
|
2021-12-01 14:03:34 +08:00
|
|
|
|
_tmp = ""
|
|
|
|
|
|
black_word = Config.get_config("nickname", "BLACK_WORD")
|
2021-12-16 11:16:28 +08:00
|
|
|
|
if black_word:
|
|
|
|
|
|
for x in user.nickname:
|
|
|
|
|
|
_tmp += "*" if x in black_word else x
|
2021-12-01 14:03:34 +08:00
|
|
|
|
return _tmp
|
2021-07-30 21:21:51 +08:00
|
|
|
|
return ""
|
2021-09-05 02:21:38 +08:00
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
async def get_group_member_uid(cls, user_qq: int, belonging_group: int) -> Optional[str]:
|
|
|
|
|
|
query = cls.query.where(
|
|
|
|
|
|
(cls.user_qq == user_qq) & (cls.belonging_group == belonging_group)
|
|
|
|
|
|
)
|
|
|
|
|
|
user = await query.gino.first()
|
|
|
|
|
|
_max_uid = cls.query.where((cls.user_qq == 114514) & (cls.belonging_group == 114514)).with_for_update()
|
|
|
|
|
|
_max_uid_user = await _max_uid.gino.first()
|
|
|
|
|
|
_max_uid = _max_uid_user.uid
|
|
|
|
|
|
if not user or not user.uid:
|
|
|
|
|
|
all_user = await cls.query.where(cls.user_qq == user_qq).gino.all()
|
|
|
|
|
|
for x in all_user:
|
|
|
|
|
|
if x.uid:
|
|
|
|
|
|
return x.uid
|
|
|
|
|
|
else:
|
|
|
|
|
|
if not user:
|
|
|
|
|
|
await GroupInfoUser.add_member_info(user_qq, belonging_group, '', datetime.min)
|
|
|
|
|
|
user = await cls.query.where(
|
|
|
|
|
|
(cls.user_qq == user_qq) & (cls.belonging_group == belonging_group)
|
|
|
|
|
|
).gino.first()
|
|
|
|
|
|
await user.update(
|
|
|
|
|
|
uid=_max_uid + 1,
|
|
|
|
|
|
).apply()
|
|
|
|
|
|
await _max_uid_user.update(
|
|
|
|
|
|
uid=_max_uid + 1,
|
|
|
|
|
|
).apply()
|
|
|
|
|
|
|
|
|
|
|
|
return user.uid if user and user.uid else None
|
|
|
|
|
|
|