You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

206 lines
7.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from nonebot import require
from nonebot.adapters.cqhttp import Message, MessageSegment
from .config import Config
from pandas import Series, DataFrame
config = Config()
mysql = require("botdb").MySQLdbMethods()
class Query:
def __init__(self, param: list, group_id: int):
self.group_id = group_id
self.param = param
self.index = []
self.user_name = []
self.uid = []
def _split(self):
for i in self.param: # type: str
if i.isdigit():
if len(i) < 4:
self.index.append(int(i))
else:
self.uid.append(int(i))
else:
self.user_name.append(i)
@staticmethod
def _fmt_in(tag: str, al: list):
if al:
return f"{tag} in({','.join(['%s'] * len(al))})"
def _where(self, is_user: bool = True):
fmt = []
if is_user:
for i in [self._fmt_in("qq", self.uid),
self._fmt_in("学号", self.uid),
self._fmt_in("序号", self.index),
self._fmt_in("姓名", self.user_name)]:
if i:
fmt.append(i)
else:
for i in [self._fmt_in("qq", self.uid),
self._fmt_in("telephone", self.uid),
self._fmt_in("name", self.user_name)]:
if i:
fmt.append(i)
return " or ".join(fmt)
async def __aexit__(self, *args):
...
class QueryUser(Query):
def __init__(self, param: list, group_id: int):
super().__init__(param, group_id)
self.not_user = True
self.is_err = False
self.reply = Message()
self._split()
async def _get_class_name(self):
"""获取班级名称并且查询是否为班级群不是班级群则报错KeyError"""
await mysql.execute(f"select class_group, class_name from {config.class_table}")
df: DataFrame = mysql.form()
class_group = list(df['class_group'])
if self.group_id in class_group:
return "and 班级='%s'" % df["class_name"][class_group.index(self.group_id)]
raise KeyError
async def get_user(self):
"""获取用户,是否有该用户,如果有则对信息进行提取并筛选出需要展示的信息"""
try:
await mysql.execute(f"select * from {config.user_table} where ({self._where()}) {await self._get_class_name()}",
[*(self.uid * 2), *self.index, *self.user_name])
data: DataFrame = mysql.form()
length = data.shape[0] # 提取的用户数量
if length < 1:
self.reply.append("抱歉,未查询到该用户!!!")
self.not_user = True
elif length == 1:
self.user(data.loc[0])
self.not_user = False
else:
self.users(data)
self.not_user = False
except KeyError:
self.is_err = True
self.reply = "此群并非班级群,无法使用查询!!!"
async def get_teacher(self):
"""获取教师"""
await mysql.execute(f"select * from {config.teacher_table} where ({self._where(False)})",
[*(self.uid * 2), *self.user_name])
data: DataFrame = mysql.form()
length = data.shape[0]
teachers = []
if length:
teachers.append("查询到为教师:")
for i in range(length):
teacher = data.loc[i]
teachers.append(f"姓名:{teacher['name']}\n"
f"QQ{teacher['qq']}\n"
f"联系方式:{teacher['telephone']}")
self.reply = Message('\n-----\n'.join(teachers))
@staticmethod
def user_key(user: Series, auto_end: str = "\n"):
"""从用户key中查看是否存在值如果存在则返回该数据加key"""
def _(key, end: str = auto_end):
"""
:param key: 数据的key
:param end: 在结尾追加字符
"""
value = user.get(key)
if value != "None" and value != "":
return f"{key}{value}{end}"
return ""
return _
def user(self, user: Series):
info = self.user_key(user)
birthday, dorm = [""] * 2
if user.get("出生日期"):
birthday = user["出生日期"].date()
if user.get("寝室长"):
if user['寝室长'] == '':
dorm = f"{user['寝室']}(寝室长)"
else:
dorm = user["寝室"]
self.reply.append(f"{info('序号')}"
f"{info('姓名')}"
f"{info('性别')}"
f"{info('班级')}"
f"{info('社团')}"
f"{info('团学')}"
f"{info('团员')}"
f"{info('入党积极份子')}"
f"{info('民族')}"
f"寝室:{dorm}\n"
f"出生日期:{birthday}\n"
f"{info('学号')}"
f"{info('微信')}"
f"{info('联系方式')}"
f"{info('邮箱')}"
f"{info('分数', '')}")
def users(self, users: DataFrame):
for i in range(users.shape[0]):
user = users.loc[i]
self.user(user)
if i < users.shape[0] - 1:
self.reply.append("\n-----\n")
def text(self):
return self.reply
async def __aenter__(self):
"""
查找用户,查看是否有用户,并且没有出现报错,如果没有报错并且没有用户则进行查找是否为教师
"""
await self.get_user()
if not self.is_err and self.not_user:
await self.get_teacher()
return self
class AtUser(Query):
def __init__(self, param: list, group_id: int):
super().__init__(param, group_id)
self.not_user = True
self.is_err = False
self.users = []
self.reply = Message()
self._split()
async def _get_class_name(self):
"""从数据库中检索出班级,提取班级名称,班级群号是唯一的"""
await mysql.execute(f"select class_name from {config.class_table} where class_group=%s",
[self.group_id])
self.class_name = mysql.form()["class_name"][0]
async def get_user(self):
await mysql.execute(f"select qq from {config.user_table} where ({self._where()}) and 班级=%s",
[*(self.uid * 2), *self.index, *self.user_name, self.class_name])
self.users = mysql.form()["qq"]
def text(self):
for i in self.users:
self.reply += MessageSegment.at(i)
return self.reply
async def __aenter__(self):
try:
await self._get_class_name()
await self.get_user()
except KeyError:
self.is_err = True
return self