Esempio n. 1
0
    def login(self):
        """登录"""
        sid = GLOBAL_CONFIG.get_user_sid()
        token = GLOBAL_CONFIG.get_user_token()
        # 尝试使用 cookies 登录
        if sid and token and self._mgr.login_by_cookie(sid, token):
            GLOBAL_CONFIG.set_user_sid(sid)
            GLOBAL_CONFIG.set_user_token(token)
            info("使用 Cookie 登录成功!")
            self._stu_info = self._mgr.get_stu_info()
            self._gpa_info = self._mgr.get_gpa_info()
            return

        # cookies 无效, 用户名密码登录
        username = input("输入学号: ")
        password = input("输入密码: ")
        if username and password and self._mgr.login(username, password):
            cookies = self._mgr.get_cookies()
            GLOBAL_CONFIG.set_user_sid(cookies.get("sid"))
            GLOBAL_CONFIG.set_user_token(cookies.get("token"))
            info("登录成功, Cookie 已保存!")
            self._stu_info = self._mgr.get_stu_info()
            self._gpa_info = self._mgr.get_gpa_info()
            return

        error("登录失败!")
Esempio n. 2
0
 def _ask_for_choice(lst: List[T]) -> Optional[T]:
     try:
         choose = input("\n选择序号: ")
     except KeyboardInterrupt:
         return
     if not choose or not choose.isdigit():
         error("序号有误")
         return
     choose = int(choose) - 1
     if choose < 0 or choose >= len(lst):
         error("序号有误")
         return
     return lst[choose]
Esempio n. 3
0
 def auto_select_course(self, courses: List[Course], interval: float):
     """一直选课, 直到成功"""
     if interval < 1:
         info("太快了, 慢点啊兄弟! 时间间隔不能小于 1s")
     count = 1
     try:
         while True:
             if self._mgr.select_courses(courses):
                 info("选课成功!")
                 break
             error(f"{count} 选课失败, {interval}s 后重试...")
             count += 1
             sleep(interval)
     except KeyboardInterrupt:
         pass
Esempio n. 4
0
    def print_task_courses(self, task: TeachTask) -> Optional[List[Course]]:
        course_list = self._mgr.get_task_courses(task)
        if not course_list:
            error("获取课程信息失败")
            return None

        for i, course in enumerate(course_list, 1):
            selected = "[√]" if course.is_selected else "[  ]"
            max_stu = course.max_stu_num if course.max_stu_num > 0 else "∞"
            remains = course.max_stu_num - course.cur_stu_num
            text = f"[{i}] {course.course_type_value}\t{course.tech_class:<4} {course.cur_stu_num:>4}/{max_stu:<4}\t剩余: {remains:>4}\t已选: {selected}\t{course.teachers}\t备注: {course.brief}"
            if course.is_selected:
                color_print(text, "green")
            else:
                print(text)
        return course_list
Esempio n. 5
0
    def exit_courses(self):
        """
        退课操作
        """
        selected_tasks = self._mgr.get_selected_task()
        for i, task in enumerate(selected_tasks, 1):
            text = f"[{i}] {text_align(task.course_name, 28)}\t{task.task_type_value}\t学分: {task.credit:<3}\t{task.choose_status_value}\t{task.status_value}"
            color_print(text, "green")
            print(f"\t{task.t_class_info} \t {task.s_class_info}\n")

        task = self._ask_for_choice(selected_tasks)
        if not task:
            return
        if self._mgr.exit_course(task):
            info(f"{task.course_name}: 退课成功!")
        else:
            error(f"{task.course_name}: 退课失败,该课程选课已关闭或已结束")
Esempio n. 6
0
    def select_task(self, is_must):
        """打印课程信息列表"""
        tasks = self._mgr.get_teach_tasks(is_must)
        if not tasks:
            error("获取信息失败, 请检查网络连接并重试!")
            return

        for i, task in enumerate(tasks, 1):
            selected = "[√]" if task.is_selected else "[  ]"
            max_stu = task.max_stu_num if task.max_stu_num > 0 else "∞"
            text = f"[{i}]\t{text_align(task.course_name, 28)}\t学分: {task.credit:<8}{task.cur_stu_num:>4}/{max_stu:<4} {task.task_type_value}  {task.choose_status_value}  已选: {selected}"
            if task.is_selected:
                color_print(text, "green")
            else:
                print(text)

        task = self._ask_for_choice(tasks)
        if not task:
            return
        courses_list = self.print_task_courses(task)
        if not courses_list:
            return

        task_nums = input("\n选择课程编号(多个编号用空格分开): ") or ""
        if not task_nums:
            info("放弃选课")
            return
        task_nums = [int(n) - 1 for n in task_nums.split()]
        for n in task_nums:
            if n < 0 or n >= len(courses_list):
                error("包含无效课程编号, 请检查")
                return
        courses = [courses_list[n] for n in task_nums]
        if self._mgr.select_courses(courses):
            info("选课成功!")
            return

        error("选课失败!")
        choose = input("是否需要挂机抢课(y/n): ") or "n"
        if choose.lower() == "y":
            interval = float(input("挂机抢课时间间隔(秒): ") or "3")
            self.auto_select_course(courses, interval)
Esempio n. 7
0
 def inner(self, *args, **kwargs):
     if not self._stu_info:
         error("请先登录!")
         return
     return func(self, *args, **kwargs)