def show_value(config, log_level, msg, log_value): if config.log_level > log_level: return if not lib_util.check_range(level, log_level): raise ValueError('log_level', log_level) if isinstance(log_value, list): log_value = ''.join(log_value) check_ptt_msg = merge(config, [i18n.PTT, i18n.Msg]) msg = merge(config, msg) log_value = merge(config, log_value) if len(msg) == 0: return if check_ptt_msg == msg and log_value == config.log_last_value: return total_message = [] total_message.append(msg) total_message.append(' [') total_message.append(log_value) total_message.append(']') log(config, log_level, ''.join(total_message)) config.log_last_value = log_value
def log(config, log_level, msg): if not lib_util.check_range(level, log_level): raise ValueError('log_level', log_level) if config.log_level > log_level: return if isinstance(msg, int): msg = str(msg) if len(msg) == 0: return msg = merge(config, msg) total_message = '[' + strftime('%m%d %H:%M:%S') + ']' if log_level == level.DEBUG: total_message += '[' + i18n.Debug + '] ' + msg elif log_level == level.INFO: total_message += '[' + i18n.Info + '] ' + msg try: print( total_message.encode(sys.stdin.encoding, 'replace').decode(sys.stdin.encoding)) except Exception: print(total_message.encode('utf-8', "replace").decode('utf-8')) if config.log_handler is not None: config.log_handler(total_message)
def check(config, value_type, name, value, value_class=None) -> None: if not isinstance(value, value_type): if value_type is str: raise TypeError( log.merge(config, [name, str(value), i18n.MustBe, i18n.String])) elif value_type is int: raise TypeError( log.merge(config, [name, str(value), i18n.MustBe, i18n.Integer])) elif value_type is bool: raise TypeError( log.merge(config, [name, str(value), i18n.MustBe, i18n.Boolean])) if value_class is not None: if not lib_util.check_range(value_class, value): raise ValueError(f'Unknown {name}', value)
def load(input_lang): if not lib_util.check_range(language, input_lang): raise ValueError('Language', input_lang) global Connect Connect = specific_load(input_lang, [ '連線', 'Connect', ]) global Start Start = specific_load(input_lang, [ '開始', 'Start', ]) global ConnectMode ConnectMode = specific_load(input_lang, [ Connect + '模式', Connect + 'mode', ]) global ConnectMode_Telnet ConnectMode_Telnet = specific_load(input_lang, [ 'Telnet', 'Telnet', ]) global ConnectMode_WebSocket ConnectMode_WebSocket = specific_load(input_lang, [ 'WebSocket', 'WebSocket', ]) global Active Active = specific_load(input_lang, [ '啟動', 'Active', ]) global ErrorParameter ErrorParameter = specific_load(input_lang, [ '參數錯誤', 'Wrong parameter', ]) global connect_core connect_core = specific_load(input_lang, [ '連線核心', 'Connect Core', ]) global PTT PTT = specific_load(input_lang, [ '批踢踢', 'PTT', ]) global PTT2 PTT2 = specific_load(input_lang, [ '批踢踢兔', 'PTT2', ]) global Localhost Localhost = specific_load(input_lang, [ '本機', 'localhost', ]) global Init Init = specific_load(input_lang, [ '初始化', 'initialize', ]) global Done Done = specific_load(input_lang, [ '完成', 'Done', ]) global i18n i18n = specific_load(input_lang, [ '多國語系', 'i18n', ]) global Library Library = specific_load(input_lang, [ 'PyPtt', 'PyPtt', ]) global Fail Fail = specific_load(input_lang, [ '失敗', 'Fail', ]) global Success Success = specific_load(input_lang, [ '成功', 'Success', ]) global Prepare Prepare = specific_load(input_lang, [ '準備', 'Prepare', ]) global Info Info = specific_load(input_lang, [ '資訊', 'INFO', ]) global Debug Debug = specific_load(input_lang, [ '除錯', 'DBUG', ]) global Again Again = specific_load(input_lang, [ '重新', 'Re', ]) global ErrorIDPW ErrorIDPW = specific_load(input_lang, [ '密碼不對或無此帳號', 'Wrong password or no such id', ]) global ErrorPW ErrorPW = specific_load(input_lang, [ '密碼不正確', 'Wrong password', ]) global ScreenNoMatchTarget ScreenNoMatchTarget = specific_load(input_lang, [ '畫面無法辨識', 'This screen is not recognized', ]) global SigningUnPleaseWait SigningUnPleaseWait = specific_load(input_lang, [ '登入中,請稍候', 'Signing in, please wait', ]) global Msg Msg = specific_load(input_lang, [ '訊息', 'Message', ]) global SigningUpdate SigningUpdate = specific_load(input_lang, [ '更新與同步線上使用者及好友名單', 'Updating and synchronizing online users and friends list', ]) global SendMsg SendMsg = specific_load(input_lang, [ '送出訊息', 'Send Msg', ]) global kick_other_login kick_other_login = specific_load(input_lang, [ '剔除其他登入', 'Kick other login', ]) global Notkick_other_login Notkick_other_login = specific_load(input_lang, [ '不剔除其他登入', 'Not kick other login', ]) global AnyKeyContinue AnyKeyContinue = specific_load(input_lang, [ '請按任意鍵繼續', 'Any key to continue', ]) global login login = specific_load(input_lang, [ '登入', 'login', ]) global loginSuccess loginSuccess = specific_load(input_lang, [ '登入成功', 'login Success', ]) global loginFail loginFail = specific_load(input_lang, [ login + Fail, login + ' ' + Fail, ]) global MailBoxFull MailBoxFull = specific_load(input_lang, [ '郵件已滿', 'Mail box is full', ]) global PostNotFinish PostNotFinish = specific_load(input_lang, [ '文章尚未完成', 'Post is not finish', ]) global SystemBusyTryLater SystemBusyTryLater = specific_load(input_lang, [ '系統負荷過重, 請稍後再試', 'System is overloaded, please try again later', ]) global DelWrongPWRecord DelWrongPWRecord = specific_load(input_lang, [ '刪除以上錯誤嘗試的記錄', 'Delete the record of the wrong password', ]) global logout logout = specific_load(input_lang, [ '登出', 'logout', ]) global SpendTime SpendTime = specific_load(input_lang, [ '花費時間', 'Spend time', ]) global GetPTTTime GetPTTTime = specific_load(input_lang, [ '取得批踢踢時間', 'Get PTT time', ]) global LoginTooOften LoginTooOften = specific_load(input_lang, [ '登入太頻繁', 'login too often', ]) global MustBe MustBe = specific_load(input_lang, [ '必須是', 'must be', ]) global String String = specific_load(input_lang, [ '字串', 'String', ]) global Integer Integer = specific_load(input_lang, [ '整數', 'Integer', ]) global Boolean Boolean = specific_load(input_lang, [ '布林值', 'Boolean', ]) global ID ID = specific_load(input_lang, [ '帳號', 'ID', ]) global Password Password = specific_load(input_lang, [ '密碼', 'Password', ]) global InputOriginPassword InputOriginPassword = specific_load(input_lang, [ '輸入原密碼', 'Input Origin Password', ]) global InputNewPassword InputNewPassword = specific_load(input_lang, [ '設定新密碼', 'Input New Password', ]) global CheckNewPassword CheckNewPassword = specific_load(input_lang, [ '檢查新密碼', 'CheckNewPassword', ]) global Board Board = specific_load(input_lang, [ '看板', 'Board', ]) global IntoBoard IntoBoard = specific_load(input_lang, [ '進入看板', 'Into Board', ]) global ReadingBoardInfo ReadingBoardInfo = specific_load(input_lang, [ '讀取看板資訊', 'Reading Board Info', ]) global BothInput BothInput = specific_load(input_lang, [ '同時輸入', 'Both input', ]) global NoInput NoInput = specific_load(input_lang, [ '沒有輸入', 'No input', ]) global CatchPost CatchPost = specific_load(input_lang, [ '取得文章', 'Catch post', ]) global PostDeleted PostDeleted = specific_load(input_lang, [ '文章已經被刪除', 'Post has been deleted', ]) global BrowsePost BrowsePost = specific_load(input_lang, [ '瀏覽文章', 'Browse post', ]) global CatchIP CatchIP = specific_load(input_lang, [ '取得 IP', 'Catch IP', ]) global GetPush GetPush = specific_load(input_lang, [ '取得推文', 'Get push', ]) global Update Update = specific_load(input_lang, [ '更新', 'Update', ]) global Push Push = specific_load(input_lang, [ '推文', 'Push', ]) global Date Date = specific_load(input_lang, [ '日期', 'Date', ]) global Content Content = specific_load(input_lang, [ '內文', 'Content', ]) global Author Author = specific_load(input_lang, [ '作者', 'Author', ]) global Title Title = specific_load(input_lang, [ '標題', 'Title', ]) global UnknownError UnknownError = specific_load(input_lang, [ '未知錯誤', 'Unknow Error', ]) global Requirelogin Requirelogin = specific_load(input_lang, [ '請先' + login, 'Please ' + login + ' first', ]) global HasPushPermission HasPushPermission = specific_load(input_lang, [ '使用者擁有推文權限', 'User Has Push Permission', ]) global HasPostPermission HasPostPermission = specific_load(input_lang, [ '使用者擁有貼文權限', 'User Has Post Permission', ]) global NoPermission NoPermission = specific_load(input_lang, [ '使用者沒有權限', 'User Has No Permission', ]) global SaveFile SaveFile = specific_load(input_lang, [ '儲存檔案', 'Save File', ]) global SelectSignature SelectSignature = specific_load(input_lang, [ '選擇簽名檔', 'Select Signature', ]) global FindNewestIndex FindNewestIndex = specific_load(input_lang, [ '找到最新編號', 'Find Newest Index', ]) global OutOfRange OutOfRange = specific_load(input_lang, [ '超出範圍', 'Out Of Range', ]) global MustSmallOrEqual MustSmallOrEqual = specific_load(input_lang, [ '必須小於等於', 'Must be less than or equal', ]) global VotePost VotePost = specific_load(input_lang, [ '投票文章', 'Vote Post', ]) global SubstandardPost SubstandardPost = specific_load(input_lang, [ '不合規範文章', 'Substandard Post', ]) global DoNothing DoNothing = specific_load(input_lang, [ '不處理', 'Do Nothing', ]) global NoFastPush NoFastPush = specific_load(input_lang, [ '禁止快速連續推文', 'No Fast Push', ]) global OnlyArrow OnlyArrow = specific_load(input_lang, [ '使用加註方式', 'Arrow Only in Push', ]) global GetUser GetUser = specific_load(input_lang, [ '取得使用者', 'Get User', ]) global NoSuchUser NoSuchUser = specific_load(input_lang, [ '無該使用者', 'No such user', ]) global WaterBall WaterBall = specific_load(input_lang, [ '水球', 'Water Ball', ]) global UserOffline UserOffline = specific_load(input_lang, [ '使用者離線', 'User Offline', ]) global SetCallStatus SetCallStatus = specific_load(input_lang, [ '設定呼叫器狀態', 'Set Call Status', ]) global Throw Throw = specific_load(input_lang, [ '丟', 'Throw', ]) global NoWaterball NoWaterball = specific_load(input_lang, [ '無訊息記錄', 'No Waterball', ]) global BrowseWaterball BrowseWaterball = specific_load(input_lang, [ '瀏覽水球紀錄', 'Browse Waterball', ]) global languageModule languageModule = specific_load(input_lang, [ '語言模組', 'language Module', ]) global English English = specific_load(input_lang, [ '英文', 'English', ]) global ChineseTranditional ChineseTranditional = specific_load(input_lang, [ '繁體中文', 'Chinese Tranditional', ]) global GetCallStatus GetCallStatus = specific_load(input_lang, [ '取得呼叫器狀態', 'Get BBCall Status', ]) global NoMoney NoMoney = specific_load(input_lang, [ 'P 幣不足', 'No Money', ]) global InputID InputID = specific_load(input_lang, [ '輸入帳號', 'Input ID', ]) global InputMoney InputMoney = specific_load(input_lang, [ '輸入金額', 'Input Money', ]) global AuthenticationHasNotExpired AuthenticationHasNotExpired = specific_load(input_lang, [ '認證尚未過期', 'Authentication has not expired', ]) global VerifyID VerifyID = specific_load(input_lang, [ '確認身分', 'Verify ID', ]) global TradingInProgress TradingInProgress = specific_load(input_lang, [ '交易正在進行中', 'Trading is in progress', ]) global Transaction Transaction = specific_load(input_lang, [ '交易', 'Transaction', ]) global MoneyTooFew MoneyTooFew = specific_load(input_lang, [ '金額過少,交易取消!', 'The amount is too small, the transaction is cancelled!', ]) global TransactionCancelled TransactionCancelled = specific_load(input_lang, [ '交易取消!', 'The transaction is cancelled!', ]) global ConstantRedBag ConstantRedBag = specific_load(input_lang, [ '不修改紅包袋', 'Constant the red bag', ]) global SendMail SendMail = specific_load(input_lang, [ '寄信', 'Send Mail', ]) global Select Select = specific_load(input_lang, [ '選擇', 'Select', ]) global SignatureFile SignatureFile = specific_load(input_lang, [ '簽名檔', 'Signature File', ]) global NoSignatureFile NoSignatureFile = specific_load(input_lang, [ '不加簽名檔', 'No Signature File', ]) global SelfSaveDraft SelfSaveDraft = specific_load(input_lang, [ '自存底稿', 'Self-Save Draft', ]) global MailBox MailBox = specific_load(input_lang, [ '郵件選單', 'Mail Box', ]) global NoSuchBoard NoSuchBoard = specific_load(input_lang, [ '無該板面', 'No Such Board', ]) global HideSensitiveInfor HideSensitiveInfor = specific_load(input_lang, [ '隱藏敏感資訊', 'Hide Sensitive Information', ]) global PostFormatError PostFormatError = specific_load(input_lang, [ '文章格式錯誤', 'Post Format Error', ]) global log_handler log_handler = specific_load(input_lang, [ '紀錄額取器', 'log Handler', ]) global NewCursor NewCursor = specific_load(input_lang, [ '新式游標', 'New Type Cursor', ]) global OldCursor OldCursor = specific_load(input_lang, [ '舊式游標', 'Old Type Cursor', ]) global PostNoContent PostNoContent = specific_load(input_lang, [ '此文章無內容', 'Post has no content', ]) global ConnectionClosed ConnectionClosed = specific_load(input_lang, [ '連線已經被關閉', 'Connection Closed', ]) global BoardList BoardList = specific_load(input_lang, [ '看板列表', 'Board List', ]) global UnregisteredUserCantUseAllAPI UnregisteredUserCantUseAllAPI = specific_load(input_lang, [ '未註冊使用者,將無法使用全部功能', 'Unregistered User Can\'t Use All API', ]) global UnregisteredUserCantUseThisAPI UnregisteredUserCantUseThisAPI = specific_load(input_lang, [ '未註冊使用者,無法使用此功能', 'Unregistered User Can\'t Use This API', ]) global MultiThreadOperate MultiThreadOperate = specific_load(input_lang, [ '請勿使用多線程同時操作一個 PyPtt 物件', 'Do not use a multi-thread to operate a PyPtt object', ]) global HasNewMailGotoMainMenu HasNewMailGotoMainMenu = specific_load(input_lang, [ '有新信,回到主選單', 'Have a new letter, return to the main menu', ]) global UseTooManyResources UseTooManyResources = specific_load(input_lang, [ '耗用太多資源', 'Use too many resources of PTT', ]) global host host = specific_load(input_lang, [ '主機', 'host', ]) global PTT2NotSupport PTT2NotSupport = specific_load(input_lang, [ f'{PTT2}不支援', f'{PTT2} Not Support', ]) global AnimationPost AnimationPost = specific_load(input_lang, [ '動畫文章', 'Animation Post', ]) global RestoreConnection RestoreConnection = specific_load(input_lang, [ '恢復連線', 'Restore Connection', ]) global NoPush NoPush = specific_load(input_lang, [ '禁止推薦', 'No Push', ]) global NoResponse NoResponse = specific_load(input_lang, [ '很抱歉, 此文章已結案並標記, 不得回應', 'This Post has been closed and marked, no response', ]) global ReplyBoard ReplyBoard = specific_load(input_lang, [ '回應至看板', 'Respond to the Board', ]) global ReplyMail ReplyMail = specific_load(input_lang, [ '回應至作者信箱', 'Respond to the mailbox of author', ]) global ReplyBoard_Mail ReplyBoard_Mail = specific_load(input_lang, [ '回應至看板與作者信箱', 'Respond to the Board and the mailbox of author', ]) global UseTheOriginalTitle UseTheOriginalTitle = specific_load(input_lang, [ '採用原標題', 'Use the original title', ]) global QuoteOriginal QuoteOriginal = specific_load(input_lang, [ '引用原文', 'Quote original', ]) global EditPost EditPost = specific_load(input_lang, [ '編輯文章', 'Edit Post', ]) global RespondSuccess RespondSuccess = specific_load(input_lang, [ '回應成功', 'Respond Success', ]) global ForcedWrite ForcedWrite = specific_load(input_lang, [ '強制寫入', 'Forced Write', ]) global NoPost NoPost = specific_load(input_lang, [ '沒有文章', 'No Post', ]) global NeedModeratorPermission NeedModeratorPermission = specific_load(input_lang, [ '需要板主權限', 'Need Moderator Permission', ]) global NewSettingsHaveBeenSaved NewSettingsHaveBeenSaved = specific_load(input_lang, [ '已儲存新設定', 'New settings have been saved', ]) global NoChanges NoChanges = specific_load(input_lang, [ '未改變任何設定', 'No changes have been made to any settings', ]) global Mark Mark = specific_load(input_lang, [ '標記', 'Mark', ]) global MarkPost MarkPost = specific_load(input_lang, [ '標記文章', 'Mark Post', ]) global DelAllMarkPost DelAllMarkPost = specific_load(input_lang, [ '刪除所有標記文章', 'Del All Mark Post', ]) global NoSuchPost NoSuchPost = specific_load(input_lang, [ '{Target0} 板找不到這個文章代碼 {Target1}', 'In {Target0}, the post code is not exist {Target1}', ]) global GoMainMenu GoMainMenu = specific_load(input_lang, [ '回到主選單', 'Back to main memu', ]) global ErrorLoginRichPeopleGoMainMenu ErrorLoginRichPeopleGoMainMenu = specific_load(input_lang, [ '誤入大富翁區,回到主選單', 'Stray into the Monopoly area and return to the main menu', ]) global CanNotUseSearchPostCodeF CanNotUseSearchPostCodeF = specific_load(input_lang, [ '此狀態下無法使用搜尋文章代碼(AID)功能', 'This status can not use the search Post code function', ]) global FavouriteBoardList FavouriteBoardList = specific_load(input_lang, [ '我的最愛', 'Favourite Board List', ]) global bucket bucket = specific_load(input_lang, [ '水桶', 'Bucket', ]) global UserHasPreviouslyBeenBanned UserHasPreviouslyBeenBanned = specific_load(input_lang, [ '使用者之前已被禁言', 'User has previously been banned', ]) global InputBucketDays_Reason InputBucketDays_Reason = specific_load(input_lang, [ '輸入水桶天數與理由', 'Input bucket days and reason', ]) global UnconfirmedPost UnconfirmedPost = specific_load(input_lang, [ '待證實文章', 'Post To Be Confirmed', ]) global Reading Reading = specific_load(input_lang, [ '讀取中', 'Reading', ]) global ReadComplete ReadComplete = specific_load(input_lang, [ f'讀取{Done}', f'Read {Done}', ]) global QuitUserProfile QuitUserProfile = specific_load(input_lang, [ f'退出使用者檔案', f'Quit User Profile', ]) global NoMail NoMail = specific_load(input_lang, [ f'沒有信件', f'You have no mail', ]) global UseMailboxAPIWillLogoutAfterExecution UseMailboxAPIWillLogoutAfterExecution = specific_load( input_lang, [ f'如果使用信箱相關功能,將執行後自動登出', f'If you use mailbox related functions, you will be logged out automatically after execution', ]) global PicksInRegister PicksInRegister = specific_load(input_lang, [ '註冊申請單處理順位', 'Registration application processing order', ]) global RegisterInProcessing RegisterInProcessing = specific_load(input_lang, [ '註冊申請單尚在處理中', 'Register is in processing', ]) global record_ip record_ip = specific_load(input_lang, [ '紀錄 IP', 'Record ip', ]) global not_record_ip not_record_ip = specific_load(input_lang, [ '不紀錄 IP', 'Not record ip', ]) global push_aligned push_aligned = specific_load(input_lang, [ '推文對齊', 'Push aligned', ]) global not_push_aligned not_push_aligned = specific_load(input_lang, [ '無推文對齊', 'No push aligned', ]) global confirm confirm = specific_load(input_lang, [ '確認', 'Confirm', ]) global timeout timeout = specific_load(input_lang, [ '超時', 'Timeout', ])
def __init__(self, language: int = 0, log_level: int = 0, screen_time_out: int = 0, screen_long_time_out: int = 0, screen_post_timeout: int = 0, connect_mode: int = 0, port: int = 0, log_handler=None, host: int = 0): self._ID = None if log_handler is not None and not callable(log_handler): raise TypeError('[PyPtt] log_handler is must callable!!') if log_handler is not None: has_log_handler = True set_log_handler_result = True try: log_handler(f'PyPtt v {version.V}') log_handler('Developed by CodingMan') except Exception: log_handler = None set_log_handler_result = False else: has_log_handler = False print(f'PyPtt v {version.V}') print('Developed by CodingMan') self._login_status = False self._unregistered_user = True self.config = config.Config() if not isinstance(language, int): raise TypeError('[PyPtt] language must be integer') if not isinstance(log_level, int): raise TypeError('[PyPtt] log_level must be integer') if not isinstance(screen_time_out, int): raise TypeError('[PyPtt] screen_timeout must be integer') if not isinstance(screen_long_time_out, int): raise TypeError('[PyPtt] screen_long_timeout must be integer') if not isinstance(host, int): raise TypeError('[PyPtt] host must be integer') if screen_time_out != 0: self.config.screen_timeout = screen_time_out if screen_long_time_out != 0: self.config.screen_long_timeout = screen_long_time_out if screen_post_timeout != 0: self.config.screen_post_timeout = screen_post_timeout if log_level == 0: log_level = self.config.log_level elif not lib_util.check_range(log.level, log_level): raise ValueError('[PyPtt] Unknown log_level', log_level) else: self.config.log_level = log_level if language == 0: language = self.config.language elif not lib_util.check_range(i18n.language, language): raise ValueError('[PyPtt] Unknown language', language) else: self.config.language = language i18n.load(self.config.language) if log_handler is not None: self.config.log_handler = log_handler log.show_value(self.config, log.level.INFO, i18n.log_handler, i18n.Init) elif has_log_handler and not set_log_handler_result: log.show_value(self.config, log.level.INFO, i18n.log_handler, [i18n.Init, i18n.Fail]) if self.config.language == i18n.language.CHINESE: log.show_value(self.config, log.level.INFO, [i18n.ChineseTranditional, i18n.languageModule], i18n.Init) elif self.config.language == i18n.language.ENGLISH: log.show_value(self.config, log.level.INFO, [i18n.English, i18n.languageModule], i18n.Init) if connect_mode == 0: connect_mode = self.config.connect_mode elif not lib_util.check_range(connect_core.connect_mode, connect_mode): raise ValueError('[PyPtt] Unknown connect_mode', connect_mode) else: self.config.connect_mode = connect_mode if port == 0: port = self.config.port elif not 0 < port < 65535: raise ValueError('[PyPtt] Unknown port', port) else: self.config.port = port if host == 0: host = self.config.host elif not lib_util.check_range(data_type.host_type, host): raise ValueError('[PyPtt] Unknown host', host) self.config.host = host if self.config.host == data_type.host_type.PTT1: log.show_value(self.config, log.level.INFO, [i18n.Connect, i18n.host], i18n.PTT) elif self.config.host == data_type.host_type.PTT2: log.show_value(self.config, log.level.INFO, [i18n.Connect, i18n.host], i18n.PTT2) elif self.config.host == data_type.host_type.LOCALHOST: log.show_value(self.config, log.level.INFO, [i18n.Connect, i18n.host], i18n.Localhost) self.connect_core = connect_core.API(self.config) self._ExistBoardList = [] self._ModeratorList = dict() self._LastThrowWaterBallTime = 0 self._ThreadID = threading.get_ident() log.show_value(self.config, log.level.DEBUG, 'ThreadID', self._ThreadID) log.show_value(self.config, log.level.INFO, [ i18n.Library, ' v ' + version.V, ], i18n.Init)