zhenxun_bot/models/group_member_info.py

196 lines
6.1 KiB
Python
Raw Normal View History

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)
2022-01-16 14:52:50 +08:00
group_id = db.Column(db.BigInteger(), nullable=False)
2021-05-20 18:37:51 +08:00
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
2022-01-16 14:52:50 +08:00
_idx1 = db.Index("info_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 add_member_info(
cls,
user_qq: int,
2022-01-16 14:52:50 +08:00
group_id: int,
2021-07-30 21:21:51 +08:00
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:
"""
2022-07-23 14:09:17 +08:00
说明:
2021-07-30 21:21:51 +08:00
添加群内用户信息
2022-07-23 14:09:17 +08:00
参数:
2021-07-30 21:21:51 +08:00
:param user_qq: qq号
2022-01-16 14:52:50 +08:00
:param group_id: 群号
2021-07-30 21:21:51 +08:00
: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(
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
)
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,
2022-01-16 14:52:50 +08:00
group_id=group_id,
2021-05-20 18:37:51 +08:00
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(
2022-01-16 14:52:50 +08:00
cls, user_qq: int, group_id: int
2021-07-30 21:21:51 +08:00
) -> "GroupInfoUser":
"""
2022-07-23 14:09:17 +08:00
说明:
2021-07-30 21:21:51 +08:00
查询群员信息
2022-07-23 14:09:17 +08:00
参数:
2021-07-30 21:21:51 +08:00
:param user_qq: qq号
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
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
)
return await query.gino.first()
@classmethod
2022-01-16 14:52:50 +08:00
async def delete_member_info(cls, user_qq: int, group_id: int) -> bool:
2021-07-30 21:21:51 +08:00
"""
2022-07-23 14:09:17 +08:00
说明:
2021-07-30 21:21:51 +08:00
删除群员信息
2022-07-23 14:09:17 +08:00
参数:
2021-07-30 21:21:51 +08:00
:param user_qq: qq号
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
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
)
query = query.with_for_update()
user = await query.gino.first()
try:
if user is None:
return True
else:
await cls.delete.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
).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
2022-01-16 14:52:50 +08:00
async def get_group_member_id_list(cls, group_id: int) -> List[int]:
2021-07-30 21:21:51 +08:00
"""
2022-07-23 14:09:17 +08:00
说明:
2021-07-30 21:21:51 +08:00
获取该群所有用户qq
2022-07-23 14:09:17 +08:00
参数:
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
member_list = []
2022-01-16 14:52:50 +08:00
query = cls.query.where((cls.group_id == group_id))
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(
2022-01-16 14:52:50 +08:00
cls, user_qq: int, group_id: int, nickname: str
2021-07-30 21:21:51 +08:00
) -> bool:
"""
2022-07-23 14:09:17 +08:00
说明:
2021-07-30 21:21:51 +08:00
设置群员在该群内的昵称
2022-07-23 14:09:17 +08:00
参数:
2021-07-30 21:21:51 +08:00
:param user_qq: qq号
2022-01-16 14:52:50 +08:00
:param group_id: 群号
2021-07-30 21:21:51 +08:00
:param nickname: 昵称
"""
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
)
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]:
"""
2022-07-23 14:09:17 +08:00
说明:
2022-02-09 20:05:49 +08:00
获取该用户所在的所有群聊
2022-07-23 14:09:17 +08:00
参数:
2022-02-09 20:05:49 +08:00
:param user_qq: 用户qq
2021-12-01 14:03:34 +08:00
"""
query = await cls.query.where(cls.user_qq == user_qq).gino.all()
if query:
2022-01-16 14:52:50 +08:00
query = [x.group_id for x in query]
2021-12-01 14:03:34 +08:00
return query
2021-05-20 18:37:51 +08:00
@classmethod
2022-01-16 14:52:50 +08:00
async def get_group_member_nickname(cls, user_qq: int, group_id: int) -> str:
2021-07-30 21:21:51 +08:00
"""
2022-07-23 14:09:17 +08:00
说明:
2021-07-30 21:21:51 +08:00
获取用户在该群的昵称
2022-07-23 14:09:17 +08:00
参数:
2021-07-30 21:21:51 +08:00
:param user_qq: qq号
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
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
)
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
2022-01-16 14:52:50 +08:00
async def get_group_member_uid(cls, user_qq: int, group_id: int) -> Optional[str]:
2021-09-05 02:21:38 +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-09-05 02:21:38 +08:00
)
user = await query.gino.first()
2022-01-16 14:52:50 +08:00
_max_uid = cls.query.where((cls.user_qq == 114514) & (cls.group_id == 114514)).with_for_update()
2021-09-05 02:21:38 +08:00
_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:
2022-01-16 14:52:50 +08:00
await GroupInfoUser.add_member_info(user_qq, group_id, '', datetime.min)
2021-09-05 02:21:38 +08:00
user = await cls.query.where(
2022-01-16 14:52:50 +08:00
(cls.user_qq == user_qq) & (cls.group_id == group_id)
2021-09-05 02:21:38 +08:00
).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