async def post(self): query: dict = request.args qq: Optional[str] = query.get("qq") token: Optional[str] = query.get("token") data = await request.get_data() _, msg = check_args(qq=qq, token=token) if not _: return false_ret(msg=msg) if to_token(qq) != token: abort(403) data = json.loads(data) error_key = [] process_info = defaultdict(dict) for key, enable in data.items(): SubC = judge_sub(key) if not SubC: error_key.append(key) continue if enable: result, p_msg = await SubC.add_sub(qq2event(qq), key) # type: ignore else: result, p_msg = await SubC.del_sub(qq2event(qq), key) # type: ignore process_info[key]["result"] = result process_info[key]["msg"] = p_msg if error_key: return false_ret(data=error_key, msg="error keys") return true_ret(data=process_info)
async def _get_balance(cls, user: User): sess = await User.get_session(user) res = await run_sync_func(get_ecard_balance, sess, user.student_id) if res: await _bot.send(qq2event(user.qq), str(res)) return await _bot.send(qq2event(user.qq), "查询余额出错,请稍后再试")
async def bind(): res = await request.get_json() qq = res.get("qq") username = res.get("username") password = res.get("password") token = res.get("token") logger.debug("username:{} password:{} token:{}".format( username, password, token)) result, msg = check_args(qq=qq, username=username, password=password, token=token) if to_token(qq) != token: abort(403) if not result: return false_ret(msg=msg) logger.info("qq{}正在请求绑定!".format(qq)) # 是否已经绑定 user = await User.get(str(qq)) _bot = get_bot() if user is None: logger.info("qq{}是新用户,正在尝试登录教务处...".format(qq)) u = Login(username, password) is_log, log_resp = await run_sync_func(u.try_login) if is_log: user_info = await run_sync_func(log_resp.json) logger.debug(user_info) await logger.complete() await User.add( qq=qq, student_id=username, password=password, cookies=pickle.dumps(u.get_cookies()), ) logger.info("qq{}绑定成功!".format(qq)) await _bot.send(qq2event(qq), "教务处绑定成功!") await _bot.send(qq2event(qq), "可以向我发送 帮助 来继续使用~") await _bot.send(qq2event(qq), "点击 https://bot.artin.li 来查看帮助~") await _bot.send(qq2event(qq), f"点击个人中心可以配置更多: {get_user_center(qq2event(qq))}") return true_ret("qq绑定成功!") else: logger.info("qq{}绑定失败!".format(qq)) await _bot.send(qq2event(qq), "教务处绑定失败!") return false_ret("qq绑定失败!失败原因是{}".format(log_resp)) return false_ret("该qq已经绑定了!")
async def check(cls, qq: int): user = await cls.get(str(qq)) if user: return user _bot = get_bot() await _bot.send(qq2event(qq), "未绑定,试试对我发送 `绑定`") return False
async def _get_progress(cls, user: User): try: key = f"credit/{user.qq}" res = await cache.get(key) if not res: sess = await User.get_session(user) res: CreditProgressDict = await run_sync_func( get_credit_progress, sess) if res: await cache.set(key, res, ttl=600) else: raise ValueError("查询绩点出错") await _bot.send(qq2event(user.qq), _format(res)) except Exception as e: logger.exception(e) await _bot.send(qq2event(user.qq), "查询绩点出错,请稍后再试")
async def send_score(user, score: ScoreDict): msgs = [] msgs.append(_format_cet(score["cet"])) msgs.append(_format_physical_or_physical(score, "common")) msgs.append(_format_physical_or_physical(score, "physical")) msgs.extend(_format_plan(score["plan"])) await send_msgs(qq2event(user.qq), msgs)
async def get_progress(cls, qq: int) -> Optional[str]: # 先查 user 出来,再查 Course 表 user = await User.check(qq) if not user: return "NOT_BIND" await add_job(cls._get_progress, args=[user]) await _bot.send(qq2event(qq), "正在抓取绩点,抓取过后我会直接发给你!") return "WAIT"
async def _send_score(cls, user: User): _bot = get_bot() try: res: ScoreDict = await cls._get_score(user) await save_score(user, res) await send_score(user, res) except Exception as e: logger.exception(e) await _bot.send(qq2event(user.qq), "查询成绩出错,请稍后再试")
async def send_score(cls, qq: int) -> Optional[str]: # 先查 user 出来,再查 Course 表 user = await User.check(qq) if not user: return "NOT_BIND" await add_job(cls._send_score, args=[user]) _bot = get_bot() await _bot.send(qq2event(qq), "正在抓取成绩,抓取过后我会直接发给你!") return "WAIT"
async def get_course(cls, qq: int) -> Union["CourseStudent", str]: if not await User.check(qq): return "NOT_BIND" _bot = get_bot() query = cls.join(User).select() course_student = await query.where(User.qq == str(qq)).gino.first() if course_student is None: await add_job(cls.update_course, args=[qq]) await _bot.send(qq2event(qq), "正在抓取课表,抓取过后我会直接发给你!") return "WAIT" return course_student
async def update_course(cls, qq: int): user: User = await User.get(str(qq)) if not user: return _bot = get_bot() sess = await User.get_session(user) res = await run_sync_func(get_course_api, sess) if res: c_stu = await cls.add_or_update(student_id=user.student_id, course_json=json.dumps(res)) await call_command(_bot, qq2event(qq), "cs") return c_stu
async def get(self): query: dict = request.args print("query: ", query) qq: Optional[str] = query.get("qq") token: Optional[str] = query.get("token") result, msg = check_args(qq=qq, token=token) if not result: return false_ret(msg=msg) if to_token(qq) != token: abort(403) subs = await get_subs(qq2event(int(qq))) # type: ignore return true_ret(data=subs)
async def get(self): query: dict = request.args qq: Optional[str] = query.get("qq") token: Optional[str] = query.get("token") _, msg = check_args(qq=qq, token=token) if not _: return false_ret(msg=msg) if to_token(qq) != token: abort(403) user_subs = await SubWrapper.get_user_sub(qq2event(qq)) # type: ignore available_subs = SubWrapper.get_subs() result = defaultdict(dict) for k, v in available_subs.items(): result[k]["name"] = v if user_subs.get(k): result[k]["enable"] = True else: result[k]["enable"] = False return true_ret(data=result)
async def send_cet_score(user, score: ScoreDict): bot = get_bot() await bot.send(qq2event(user.qq), _format_cet(score["cet"]))