예제 #1
0
def login(api, ptt_id, password, kick_other_login):
    if api._login_status:
        api.logout()

    api.config.kick_other_login = kick_other_login

    def kick_other_loginDisplayMsg():
        if api.config.kick_other_login:
            return i18n.kick_other_login
        return i18n.Notkick_other_login

    def kick_other_loginResponse(Screen):
        if api.config.kick_other_login:
            return 'y' + command.Enter
        return 'n' + command.Enter

    api._mailbox_full = False

    def mailbox_full():
        log.log(api.config, log.level.INFO, i18n.MailBoxFull)
        api._mailbox_full = True

    def register_processing(screen):
        pattern = re.compile('[\d]+')
        api.process_picks = int(pattern.search(screen).group(0))

    if len(password) > 8:
        password = password[:8]

    ptt_id = ptt_id.strip()
    password = password.strip()

    api._ID = ptt_id
    api._Password = password

    api.config.kick_other_login = kick_other_login

    api.connect_core.connect()

    log.show_value(api.config, log.level.INFO, [i18n.login, i18n.ID], ptt_id)

    target_list = [
        connect_core.TargetUnit(
            # i18n.HasNewMailGotoMainMenu,
            i18n.MailBox,
            screens.Target.InMailBox,
            # 加個進去 A 選單再出來的動作,讓畫面更新最底下一行
            response=command.GoMainMenu + 'A' + command.Right + command.Left,
            break_detect=True),
        connect_core.TargetUnit(i18n.loginSuccess,
                                screens.Target.MainMenu,
                                break_detect=True),
        connect_core.TargetUnit(
            i18n.GoMainMenu,
            '【看板列表】',
            response=command.GoMainMenu,
        ),
        connect_core.TargetUnit(i18n.ErrorIDPW,
                                '密碼不對',
                                break_detect=True,
                                exceptions_=exceptions.WrongIDorPassword()),
        connect_core.TargetUnit(i18n.LoginTooOften,
                                '登入太頻繁',
                                break_detect=True,
                                exceptions_=exceptions.LoginTooOften()),
        connect_core.TargetUnit(
            i18n.SystemBusyTryLater,
            '系統過載',
            break_detect=True,
        ),
        connect_core.TargetUnit(
            i18n.DelWrongPWRecord,
            '您要刪除以上錯誤嘗試的記錄嗎',
            response='y' + command.Enter,
        ),
        connect_core.TargetUnit(
            i18n.PostNotFinish,
            '請選擇暫存檔 (0-9)[0]',
            response=command.Enter,
        ),
        connect_core.TargetUnit(
            i18n.PostNotFinish,
            '有一篇文章尚未完成',
            response='Q' + command.Enter,
        ),
        connect_core.TargetUnit(
            i18n.SigningUnPleaseWait,
            '登入中,請稍候',
        ),
        connect_core.TargetUnit(
            kick_other_loginDisplayMsg,
            '您想刪除其他重複登入的連線嗎',
            response=kick_other_loginResponse,
        ),
        connect_core.TargetUnit(i18n.AnyKeyContinue,
                                '◆ 您的註冊申請單尚在處理中',
                                response=command.Enter,
                                handler=register_processing),
        connect_core.TargetUnit(i18n.AnyKeyContinue, '任意鍵', response=' '),
        connect_core.TargetUnit(
            i18n.SigningUpdate,
            '正在更新與同步線上使用者及好友名單',
        ),
        connect_core.TargetUnit(
            i18n.GoMainMenu,
            '【分類看板】',
            response=command.GoMainMenu,
        ),
        connect_core.TargetUnit(
            i18n.ErrorLoginRichPeopleGoMainMenu,
            ['大富翁', '排行榜', '名次', '代號', '暱稱', '數目'],
            response=command.GoMainMenu,
        ),
        connect_core.TargetUnit(i18n.SkipRegistrationForm,
                                '您確定要填寫註冊單嗎',
                                response=command.Enter * 3),
        connect_core.TargetUnit(i18n.SkipRegistrationForm,
                                '以上資料是否正確',
                                response='y' + command.Enter),
        connect_core.TargetUnit(i18n.SkipRegistrationForm,
                                '另外若輸入後發生認證碼錯誤請先確認輸入是否為最後一封',
                                response='x' + command.Enter),
        connect_core.TargetUnit(i18n.SkipRegistrationForm,
                                '此帳號已設定為只能使用安全連線',
                                exceptions_=exceptions.OnlySecureConnection())
    ]

    cmd_list = []
    cmd_list.append(ptt_id)
    cmd_list.append(command.Enter)
    cmd_list.append(password)
    cmd_list.append(command.Enter)

    cmd = ''.join(cmd_list)

    index = api.connect_core.send(
        cmd,
        target_list,
        screen_timeout=api.config.screen_long_timeout,
        refresh=False,
        secret=True)
    ori_screen = api.connect_core.get_screen_queue()[-1]
    if index == 0:

        current_capacity, max_capacity = _api_util.get_mailbox_capacity(api)

        log.log(api.config, log.level.INFO, i18n.HasNewMailGotoMainMenu)

        if current_capacity > max_capacity:
            api._mailbox_full = True
            log.log(api.config, log.level.INFO, i18n.MailBoxFull)

        if api._mailbox_full:
            log.log(api.config, log.level.INFO,
                    i18n.UseMailboxAPIWillLogoutAfterExecution)

        target_list = [
            connect_core.TargetUnit(i18n.loginSuccess,
                                    screens.Target.MainMenu,
                                    break_detect=True)
        ]

        cmd = command.GoMainMenu + 'A' + command.Right + command.Left

        index = api.connect_core.send(
            cmd,
            target_list,
            screen_timeout=api.config.screen_long_timeout,
            secret=True)
        ori_screen = api.connect_core.get_screen_queue()[-1]

    if target_list[index].get_display_msg() != i18n.loginSuccess:
        print(ori_screen)
        raise exceptions.LoginError()

    if '> (' in ori_screen:
        api.cursor = data_type.Cursor.NEW
        log.log(api.config, log.level.DEBUG, i18n.NewCursor)
    else:
        api.cursor = data_type.Cursor.OLD
        log.log(api.config, log.level.DEBUG, i18n.OldCursor)

    if api.cursor not in screens.Target.InBoardWithCursor:
        screens.Target.InBoardWithCursor.append('\n' + api.cursor)

    if len(screens.Target.MainMenu) == len(screens.Target.CursorToGoodbye):
        if api.cursor == '>':
            screens.Target.CursorToGoodbye.append('> (G)oodbye')
        else:
            screens.Target.CursorToGoodbye.append('●(G)oodbye')

    api.unregistered_user = True
    if '(T)alk' in ori_screen:
        api.unregistered_user = False
    if '(P)lay' in ori_screen:
        api.unregistered_user = False
    if '(N)amelist' in ori_screen:
        api.unregistered_user = False

    if api.unregistered_user:
        # print(ori_screen)
        log.log(api.config, log.level.INFO, i18n.UnregisteredUserCantUseAllAPI)
    api.registered_user = not api.unregistered_user

    if api.process_picks != 0:
        log.show_value(api.config, log.level.INFO, i18n.PicksInRegister,
                       api.process_picks)

    api._login_status = True
예제 #2
0
def login(
        api,
        ptt_id,
        password,
        kick_other_login):

    if api._login_status:
        api.logout()

    api.config.kick_other_login = kick_other_login

    def kick_other_loginDisplayMsg():
        if api.config.kick_other_login:
            return i18n.kick_other_login
        return i18n.Notkick_other_login

    def kick_other_loginResponse(Screen):
        if api.config.kick_other_login:
            return 'y' + command.Enter
        return 'n' + command.Enter

    if len(password) > 8:
        password = password[:8]

    ptt_id = ptt_id.strip()
    password = password.strip()

    api._ID = ptt_id
    api._Password = password

    api.config.kick_other_login = kick_other_login

    api.connect_core.connect()

    log.show_value(
        api.config,
        log.level.INFO,
        [
            i18n.login,
            i18n.ID
        ],
        ptt_id
    )

    target_list = [
        connect_core.TargetUnit(
            i18n.loginSuccess,
            screens.Target.MainMenu,
            break_detect=True
        ),
        connect_core.TargetUnit(
            i18n.HasNewMailGotoMainMenu,
            '你有新信件',
            # 加個進去 A 選單再出來的動作,讓畫面更新最底下一行
            response=command.GoMainMenu + 'A' + command.Right + command.Left,
        ),
        connect_core.TargetUnit(
            i18n.GoMainMenu,
            '【看板列表】',
            response=command.GoMainMenu,
        ),
        connect_core.TargetUnit(
            i18n.ErrorIDPW,
            '密碼不對',
            break_detect=True,
            exceptions_=exceptions.WrongIDorPassword()
        ),
        connect_core.TargetUnit(
            i18n.LoginTooOften,
            '登入太頻繁',
            break_detect=True,
            exceptions_=exceptions.LoginTooOften()
        ),
        connect_core.TargetUnit(
            i18n.SystemBusyTryLater,
            '系統過載',
            break_detect=True,
        ),
        connect_core.TargetUnit(
            i18n.DelWrongPWRecord,
            '您要刪除以上錯誤嘗試的記錄嗎',
            response='y' + command.Enter,
        ),
        connect_core.TargetUnit(
            i18n.MailBoxFull,
            '您保存信件數目',
            response=command.GoMainMenu,
        ),
        connect_core.TargetUnit(
            i18n.PostNotFinish,
            '請選擇暫存檔 (0-9)[0]',
            response=command.Enter,
        ),
        connect_core.TargetUnit(
            i18n.PostNotFinish,
            '有一篇文章尚未完成',
            response='Q' + command.Enter,
        ),
        connect_core.TargetUnit(
            i18n.SigningUnPleaseWait,
            '登入中,請稍候',
        ),
        connect_core.TargetUnit(
            kick_other_loginDisplayMsg,
            '您想刪除其他重複登入的連線嗎',
            response=kick_other_loginResponse,
        ),
        connect_core.TargetUnit(
            i18n.AnyKeyContinue,
            '任意鍵',
            response=command.Enter
        ),
        connect_core.TargetUnit(
            i18n.SigningUpdate,
            '正在更新與同步線上使用者及好友名單',
        ),
    ]

    cmd_list = []
    cmd_list.append(ptt_id)
    cmd_list.append(command.Enter)
    cmd_list.append(password)
    cmd_list.append(command.Enter)

    cmd = ''.join(cmd_list)

    index = api.connect_core.send(
        cmd,
        target_list,
        screen_timeout=api.config.screen_long_timeout,
        refresh=False,
        secret=True
    )

    if target_list[index].get_display_msg() != i18n.loginSuccess:
        ori_screen = api.connect_core.get_screen_queue()[-1]
        print(ori_screen)
        raise exceptions.LoginError()

    ori_screen = api.connect_core.get_screen_queue()[-1]
    if '> (' in ori_screen:
        api.cursor = data_type.Cursor.NEW
        log.log(
            api.config,
            log.level.DEBUG,
            i18n.NewCursor
        )
    else:
        api.cursor = data_type.Cursor.OLD
        log.log(
            api.config,
            log.level.DEBUG,
            i18n.OldCursor
        )

    if api.cursor not in screens.Target.InBoardWithCursor:
        screens.Target.InBoardWithCursor.append('\n' + api.cursor)

    api._unregistered_user = True
    if '(T)alk' in ori_screen:
        api._unregistered_user = False
    if '(P)lay' in ori_screen:
        api._unregistered_user = False
    if '(N)amelist' in ori_screen:
        api._unregistered_user = False

    if api._unregistered_user:
        # print(ori_screen)
        log.log(
            api.config,
            log.level.INFO,
            i18n.UnregisteredUserCantUseAllAPI
        )

    api._login_status = True