Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
 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), "查询余额出错,请稍后再试")
Exemplo n.º 3
0
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已经绑定了!")
Exemplo n.º 4
0
 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
Exemplo n.º 5
0
 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), "查询绩点出错,请稍后再试")
Exemplo n.º 6
0
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)
Exemplo n.º 7
0
 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"
Exemplo n.º 8
0
 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), "查询成绩出错,请稍后再试")
Exemplo n.º 9
0
 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"
Exemplo n.º 10
0
 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
Exemplo n.º 11
0
 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
Exemplo n.º 12
0
    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)
Exemplo n.º 13
0
    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)
Exemplo n.º 14
0
async def send_cet_score(user, score: ScoreDict):
    bot = get_bot()
    await bot.send(qq2event(user.qq), _format_cet(score["cet"]))