def OkButtonEvent(self, event): """ 設定されたキーが重複している場合はエラーとする """ # 他のビューとの重複調査 if not views.KeyValueSettingDialogBase.KeySettingValidation( self.oldKeyConfig, self.values[0], self.log, self.checkEntries, True): return # このビュー内での重複調査 newKeys = {} for name, keys in self.values[0].items(): for key in keys.split("/"): newKeys.setdefault(key.upper(), set()).add(name) for key, names in newKeys.items(): if key == _("なし"): continue if len(names) >= 2: entries = [] for name in names: entries.append( keymap.makeEntry(self.values[1][name], key, None, self.log)) if not keymap.permitConfrict(entries, self.log): dialog( _("エラー"), _("以下の項目において、重複するキー %(key)s が設定されています。\n\n%(command)s") % { "key": key, "command": names }, self.wnd) return event.Skip()
def getToken(): manager = twitterAuthorization.TwitterAuthorization(constants.TWITTER_CONSUMER_KEY, constants.TWITTER_CONSUMER_SECRET, constants.TWITTER_PORT) l="ja" try: l=globalVars.app.config["general"]["language"].split("_")[0].lower() except: pass#end うまく読めなかったら ja を採用 #end except manager.setMessage( lang=l, success=_("認証に成功しました。このウィンドウを閉じて、アプリケーションに戻ってください。"), failed=_("認証に失敗しました。もう一度お試しください。"), transfer=_("しばらくしても画面が切り替わらない場合は、別のブラウザでお試しください。") ) webbrowser.open(manager.getUrl()) d = views.auth.waitingDialog() d.Initialize(_("Twitterアカウント認証")) d.Show(False) while True: time.sleep(0.01) wx.YieldIfNeeded() if manager.getToken(): d.Destroy() break if d.canceled == 1 or manager.getToken() == "": simpleDialog.dialog(_("処理結果"), _("キャンセルされました。")) manager.shutdown() d.Destroy() return return manager.getToken()
def Search(self): basePath = self.parent.activeTab.listObject.rootDirectory out_lst = [] # 入力画面が出てるときに、もうファイルリスト取得を開始してしまう task = workerThreads.RegisterTask(workerThreadTasks.GetRecursiveFileList, {'path': basePath, 'out_lst': out_lst, 'eol': True}) searchHistory = history.History(globalVars.app.config.getint("search", "history_count", 0, 0, 100), False) grepHistory = history.History(globalVars.app.config.getint("search", "history_count", 0, 0, 100), False) hist = {} try: with open(constants.HISTORY_FILE_NAME, 'rb') as f: hist = pickle.load(f) searchHistory.lst = hist["search"] searchHistory.cursor = len(hist["search"]) - 1 grepHistory.lst = hist["grep"] grepHistory.cursor = len(hist["grep"]) - 1 except BaseException: pass d = views.search.Dialog(basePath, list(reversed(searchHistory.getList())), list(reversed(grepHistory.getList()))) d.Initialize() canceled = False while(True): ret = d.Show() if ret == wx.ID_CANCEL: task.Cancel() canceled = True break # end キャンセルして抜ける val = d.GetValue() if val['isRegularExpression']: ret = misc.ValidateRegularExpression(val['keyword']) if ret != "OK": dialog(_("エラー"), _("正規表現の文法が間違っています。\nエラー内容: %(error)s") % {'error': ret}) continue # end 正規表現違う # end 正規表現モードがオンかどうか break # end 入力が正しくなるまで if canceled: return actionstr = "search" if val['type'] == 0 else "grep" target = { 'action': actionstr, 'basePath': basePath, 'out_lst': out_lst, 'keyword': val['keyword'], 'isRegularExpression': val['isRegularExpression']} self.parent.Navigate(target, as_new_tab=True) if val['type'] == 0: searchHistory.add(val['keyword']) else: grepHistory.add(val['keyword']) hist["search"] = searchHistory.getList() hist["grep"] = grepHistory.getList() try: with open(constants.HISTORY_FILE_NAME, 'wb') as f: pickle.dump(hist, f) except BaseException: pass
def updateUser(self): self.log.debug("Updating user info...") notFound = [] ids = self.users.getUserIds() for i in self.splitIds(ids): try: result = self.tokenManager.getClient().get_users( ids=i, user_fields="protected") except tweepy.Unauthorized as e: self.showTokenError() return except Exception as e: self.log.error(traceback.format_exc()) simpleDialog.errorDialog(_("ユーザ情報の更新に失敗しました。詳細:%s") % e) return if result.errors: for err in result.errors: if err["title"] == "Not Found Error": notFound.append(err["value"]) continue simpleDialog.errorDialog( _("ユーザ情報の更新に失敗しました。詳細:%s") % err["detail"]) return data = result.data if data: for j in data: self._updateUserInfo(j) if notFound: usernames = [] for i in notFound: usernames.append(self.users.getData()[i]["user"]) simpleDialog.errorDialog( _("以下のユーザの情報を取得できませんでした。") + "\n" + "\n".join(usernames)) simpleDialog.dialog(_("完了"), _("ユーザ情報の更新が完了しました。"))
def _GetNetworkResources(self): self.log.debug("Getting networkResource list...") try: h = win32wnet.WNetOpenEnum(5, 1, 0, None) #5=RESOURCE_CONTEXT #1=RESOURCETYPE_DISK lst = win32wnet.WNetEnumResource(h, 64) #65以上の指定不可 win32wnet.WNetCloseEnum(h) except win32net.error as er: dialog( _("エラー"), _("ネットワーク上のリソース一覧を取得できませんでした(%(error)s)") % {"error": str(er)}) return #end 情報取得失敗 lst.pop(0) #先頭はドライブではない者が入るので省く for l in lst: ret, shfileinfo = shell.SHGetFileInfo(l.lpRemoteName, 0, shellcon.SHGFI_ICON) s = browsableObjects.NetworkResource() self.log.debug("network resource found and check IP address:" + l.lpRemoteName[2:]) s.Initialize(l.lpRemoteName[2:], l.lpRemoteName, socket.getaddrinfo(l.lpRemoteName[2:], None)[0][4][0], shfileinfo[0]) self.networkResources.append(s)
def _elevate(self): """権限昇格し、アクセス拒否になった項目を再実行する。""" if globalVars.app.GetFrozenStatus( ) is False: # ビルド済みバイナリじゃないと昇格できないようにしてる dialog(_("エラー"), _("管理者権限の操作を行うためには、Falconをビルドして実行する必要があります。")) return # end ビルドしてないとダメ o = FileOperator(self.output["retry"]) fn = o.pickle() try: ret = shell.ShellExecuteEx(shellcon.SEE_MASK_NOCLOSEPROCESS, 0, "runas", "fileop.exe", fn) except pywintypes.error as e: self.log.error("Cannot elevate (%s)" % str(e)) self.output["failed"].append(o.FailAll()) dialog("error", "error") return # end except pid = ret["hProcess"] win32event.WaitForSingleObject(pid, win32event.INFINITE) win32api.CloseHandle(pid) # 昇格先で失敗した項目を拾ってくる o = FileOperator(fn) self.output["succeeded"] += o.output["succeeded"] l = len(self.output["failed"]) self.output["failed"][l:l] = o.output["failed"] self.log.debug("after elevation: success %s, failure %s." % (self.output["succeeded"], len(self.output["failed"])))
def OnMenuSelect(self, event): """メニュー項目が選択されたときのイベントハンドら。""" #ショートカットキーが無効状態のときは何もしない if not self.parent.shortcutEnable: event.Skip() return selected = event.GetId() #メニュー識別しの数値が出る if selected == menuItemsStore.getRef("exit"): self.Exit() elif selected == menuItemsStore.getRef("versionInfo"): dialog( _("バージョン情報"), _("%(appName)s Version %(versionNumber)s.\nCopyright (C) %(year)s %(developerName)s" ) % { "appName": constants.APP_NAME, "versionNumber": constants.APP_VERSION, "year": constants.APP_COPYRIGHT_YEAR, "developerName": constants.APP_DEVELOPERS }) elif selected == menuItemsStore.getRef("connect"): connectDialog = views.connect.Dialog() connectDialog.Initialize() ret = connectDialog.Show()
def RunFile(path, admin=False, prm="", workdir=""): """ファイルを起動する。admin=True の場合、管理者として実行する。""" path = os.path.expandvars(path) msg = "running '%s' prm='%s' workdir='%s' asAdmin=%s" % ( path, prm, workdir, str(admin)) log.debug(msg) msg = _("管理者で起動") if admin else _("起動") globalVars.app.say(msg) error = "" if admin: try: executable = GetExecutableState(path) p = path if executable else "cmd" a = prm if executable else "/c \"%s\" %s" % (path, prm) ret = shell.ShellExecuteEx( shellcon.SEE_MASK_NOCLOSEPROCESS, 0, "runas", p, a, workdir) except pywintypes.error as e: error = str(e) # end shellExecuteEx failure else: try: win32api.ShellExecute(0, "open", path, prm, workdir, 1) except win32api.error as er: error = str(er) # end shellExecute failure # end admin or not if error != "": dialog(_("エラー"), _("ファイルを開くことができませんでした(%(error)s)") % {"error": error})
def delete(self, event): index = self.hListCtrl.GetFocusedItem() ext = self.hListCtrl.GetItemText(index, 0) if "<default" in ext: dialog(_("エラー"), _("デフォルト設定は削除できません。")) return del (self.config[ext]) self.hListCtrl.DeleteItem(index)
def Initialize(self): t = misc.Timer() self.identifier = "mainView" #このビューを表す文字列 self.log = getLogger("falcon.%s" % self.identifier) self.log.debug("created") self.app = globalVars.app self.events = Events(self, self.identifier) title = "" if (ctypes.windll.shell32.IsUserAnAdmin()): title += "[" + _("管理者") + "]" title += constants.APP_NAME super().Initialize( title, self.app.config.getint(self.identifier, "sizeX", 800, 400), self.app.config.getint(self.identifier, "sizeY", 600, 300), self.app.config.getint(self.identifier, "positionX", 50, 0), self.app.config.getint(self.identifier, "positionY", 50, 0)) self.menu = Menu() self.menu.InitShortcut(self.identifier) #お気に入りフォルダと「ここで開く」のショートカットキーを登録 for target in (globalVars.app.userCommandManagers): for v in target.keyMap: if target == globalVars.app.openHereCommand: tabs.base.FalconTabBase.selectItemMenuConditions[0].append( target.refHead + v) tabs.base.FalconTabBase.selectItemMenuConditions[2].append( target.refHead + v) tabs.base.FalconTabBase.selectItemTypeMenuConditions[ browsableObjects.File].append(target.refHead + v) tabs.base.FalconTabBase.selectItemTypeMenuConditions[ browsableObjects.NetworkResource].append( target.refHead + v) tabs.streamList.StreamListTab.blockMenuList.append( target.refHead + v) self.menu.keymap.add(self.identifier, target.refHead + v, target.keyMap[v]) errors = self.menu.keymap.GetError(self.identifier) if errors: tmp = _( "お気に入りディレクトリもしくは「ここで開く」で設定されたショートカットキーが正しくありません。キーが重複しているか、存在しないキー名を指定しています。以下のキーの設定内容をご確認ください。\n\n" ) for v in errors: tmp += v + "\n" dialog(_("エラー"), tmp) self.InstallMenuEvent(self.menu, self.events) self.tabs = [] self.activeTab = None #最初なので空 self.hTabCtrl = self.creator.tabCtrl(_("タブ選択"), self.ChangeTab, 0, 1, wx.EXPAND) self.MakeFirstTab() self.hFrame.Bind(wx.EVT_CLOSE, self.OnClose) self.hFrame.Show() self.app.SetTopWindow(self.hFrame) self.log.debug("Finished creating main view (%f seconds)" % t.elapsed) return True
def initialize(self): _import() """アプリを初期化する。""" self.setGlobalVars() self.proxyEnviron = proxyUtil.virtualProxyEnviron() self.setProxyEnviron() self.installThreadExcepthook() # update関係を準備 if self.config.getboolean("general", "update"): globalVars.update.update(True) self.hMainView = main.MainView() if self.config.getboolean(self.hMainView.identifier, "maximized", False): self.hMainView.hFrame.Maximize() self.hMainView.Show() # sessions.dat対応 if self.config.getint("general", "fileVersion", 100) == 100: if os.path.exists(constants.SESSION_FILE_NAME): try: os.remove(constants.SESSION_FILE_NAME) self.log.debug("File %s deleted." % constants.SESSION_FILE_NAME) except Exception as e: self.log.error("Failed to delete file %s: e" % constants.SESSION_FILE_NAME) self.config["general"]["fileVersion"] = 101 self.accountManager = twitcasting.accountManager.AccountManager() self.hasAccountIssue = False self.Manager = manager.manager(self.hMainView) self.postItem = twitcasting.postItem.PostItem() if len(self.accountManager.tokens) == 0: simpleDialog.dialog( _("アカウント登録"), _("アカウントが登録されていません。ライブに接続する前に、設定メニューのアカウントマネージャからアカウントの登録を行ってください。" )) self.hasAccountIssue = True return True for i in self.accountManager.tokens: if datetime.datetime.now().timestamp() > i["expires_at"]: simpleDialog.dialog( _("アカウントの再登録"), _("期限が切れたトークンが見つかりました。設定メニューのアカウントマネージャから、再度アカウントの追加を行ってください。" )) self.accountManager.deleteAccount( self.accountManager.tokens.index(i)) self.hasAccountIssue = True self.accountManager.removeUnavailableTokens() if len(sys.argv) == 2: self.hMainView.Clear() self.Manager.connect(sys.argv[1]) return True if self.hasAccountIssue == False and self.config.getboolean( "general", "autoconnect", True) == True: self.hMainView.events.connect() return True
def InitShortcut(self,identifier): self.keymap=keymap.KeymapHandler(defaultKeymap.defaultKeymap) self.keymap_identifier=identifier self.keymap.addFile(constants.KEYMAP_FILE_NAME) errors=self.keymap.GetError(identifier) if errors: tmp=_(constants.KEYMAP_FILE_NAME+"で設定されたショートカットキーが正しくありません。キーが重複しているか、存在しないキー名を指定しています。以下のキーの設定内容をご確認ください。\n\n") for v in errors: tmp+=v+"\n" dialog(_("エラー"),tmp)
def ShowVersionInfo(self): """バージョン情報を表示する。""" dialog( _("バージョン情報"), _("%(app)s Version %(ver)s.\nCopyright (C) %(year)s %(names)s") % { "app": constants.APP_NAME, "ver": constants.APP_VERSION, "year": constants.APP_COPYRIGHT_YEAR, "names": constants.APP_DEVELOPERS })
def OkButtonEvent(self,event): """ OKボタン押下時のイベント処理。 iniファイル保存時のキーとなる先頭要素が空欄でないか、半角の=を含んでいないかバリデーションする。 問題なければValidation()を呼び出す。 """ key=self.edits[0].GetLineText(0) if key=="" or "=" in key: dialog(_("エラー"),_("%sを空白や半角の=を含む値に設定することはできません。") % self.valueNames[0][0]) return return self.Validation(event)
def GoForward(self, stream=False, admin=False): """forward アクションを実行。stream=True で、ファイルを開く代わりにストリームを開く。admin=True で、管理者モード。""" p = self.parent st = True if stream else False ret = p.activeTab.GoForward(st, admin) if issubclass(ret.__class__, tabs.base.FalconTabBase): p.ReplaceCurrentTab(ret) if ret == errorCodes.NOT_SUPPORTED: dialog(_("エラー"), _("このオペレーションはサポートされていません。")) elif ret == errorCodes.BOUNDARY: dialog("test", "mada")
def GoBackward(self): """back アクションを実行""" p = self.parent ret = p.activeTab.GoBackward() if issubclass(ret.__class__, tabs.base.FalconTabBase): p.ReplaceCurrentTab(ret) if ret == errorCodes.NOT_SUPPORTED: dialog(_("エラー"), _("このオペレーションはサポートされていません。")) elif ret == errorCodes.BOUNDARY: globalVars.app.PlaySound( globalVars.app.config["sounds"]["boundary"])
def Validation(self, event): if self.edits[0].GetLineText(0) == "" or self.edits[1].GetLineText( 0) == "": return path = os.path.expandvars(self.edits[1].GetLineText(0)) if not os.path.isabs(path): dialog(_("エラー"), _("パスは絶対パスで指定してください。")) return if not os.path.isdir(path): dialog(_("エラー"), _("入力されたパスが存在しません。有効なディレクトリへのパスであることを確認してください。")) return event.Skip()
def AddUserCommandKey(self): # お気に入りフォルダと「ここで開く」のショートカットキーを登録 for target in (globalVars.app.userCommandManagers): for v in target.keyMap: if target.keyMap[v] != "": # キーが指定されていない場合は無視 self.menu.keymap.add(self.identifier, target.refHead + v, target.keyMap[v]) errors = self.menu.keymap.GetError(self.identifier) if errors: tmp = _("お気に入りディレクトリもしくは「ここで開く」で設定されたショートカットキーが正しくありません。キーが重複しているか、存在しないキー名を指定しています。以下のキーの設定内容をご確認ください。\n\n") for v in errors: tmp += v + "\n" dialog(_("エラー"), tmp)
def OKButtonEvent(self, event): if self.extensionEdit.GetLineText( 0) == "" or self.pathEdit.GetLineText(0) == "": return if not re.match("^[a-zA-Z0-9\\-$~]+$", self.extensionEdit.GetLineText(0)): dialog(_("エラー"), _("入力された拡張子に利用できない文字が含まれています。パスを確認してください。")) return if not os.path.isfile(self.pathEdit.GetLineText(0)): dialog(_("エラー"), _("入力された実行ファイルが存在しません。パスを確認してください。")) return event.Skip()
def InitShortcut(self): self.keymap = keymap.KeymapHandler(None, self.keyFilter) if self.keymap.addFile(constants.KEYMAP_FILE_NAME) != errorCodes.OK: self.keymap.addDict(defaultKeymap.defaultKeymap) self.keymap.SaveFile(constants.KEYMAP_FILE_NAME) errors = self.keymap.GetError(self.keymap_identifier) if errors: tmp = _( constants.KEYMAP_FILE_NAME + "で設定されたショートカットキーが正しくありません。キーの重複、存在しないキー名の指定、使用できないキーパターンの指定などが考えられます。以下のキーの設定内容をご確認ください。\n\n" ) for v in errors: tmp += v + "\n" dialog(_("エラー"), tmp)
def postItem(self, account, item, count): counter = 0 for i in range(count): if self._postItem(account, item): counter += 1 if counter == 0: simpleDialog.errorDialog(_("アイテムの投下に失敗しました。")) return simpleDialog.dialog( _("完了"), _("%(name)sを%(count)d個投下しました。") % { "name": item.name, "count": counter })
def addFollowingUsers(self): from views import chooseTwitterAccount d = chooseTwitterAccount.Dialog(self.tokenManager) d.Initialize() if d.Show() == wx.ID_CANCEL: return user = d.GetData() users = self.getFollowingUsers(user, user) count = 0 for i in users: if str(i.id) in self.users.getUserIds(): continue count += 1 self.users.addUser(str(i.id), i.username, i.name, i.protected) simpleDialog.dialog(_("完了"), _("フォロー中のユーザの追加が完了しました。追加件数:%d") % count)
def toggleCustomUrlScheme(self): if not customUrlScheme.isRegistered(constants.SCHEME_NAME): if not hasattr(sys, "frozen"): simpleDialog.errorDialog( _("この機能を使用するには、TCVをビルドして実行する必要があります。")) return if customUrlScheme.register(constants.SCHEME_NAME): simpleDialog.dialog(_("成功"), _("カスタムURLスキームの登録が完了しました。")) else: simpleDialog.errorDialog(_("カスタムURLスキームの登録に失敗しました。")) else: d = simpleDialog.yesNoDialog(_("確認"), _("既に登録されています。登録を解除しますか?")) if d == wx.ID_NO: return customUrlScheme.unregister(constants.SCHEME_NAME)
def applyHotKey(self): self.hotkey = hotkeyHandler.HotkeyHandler( None, hotkeyHandler.HotkeyFilter().SetDefault()) if self.hotkey.addFile(constants.KEYMAP_FILE_NAME, ["HOTKEY"]) == errorCodes.OK: errors = self.hotkey.GetError("HOTKEY") if errors: tmp = _( constants.KEYMAP_FILE_NAME + "で設定されたホットキーが正しくありません。キーの重複、存在しないキー名の指定、使用できないキーパターンの指定などが考えられます。以下のキーの設定内容をご確認ください。\n\n" ) for v in errors: tmp += v + "\n" dialog(_("エラー"), tmp) self.hotkey.Set("HOTKEY", self.hFrame)
def keyDialog(self,no): #フィルタに引っかかるものが既に設定されている場合、その変更は許さない before=self.edits[no].GetLineText(0) if before!=_("なし"): if not self.filter.Check(before): errorDialog(_("このショートカットは変更できません。"),self.wnd) return d=views.keyConfig.Dialog(self.wnd,self.filter) d.Initialize() if d.Show()==wx.ID_CANCEL: dialog(_("設定完了"), _("解除しました。"),self.wnd) self.edits[no].SetValue(_("なし")) else: dialog(_("設定完了"), _("%s に設定しました。") % (d.GetValue()),self.wnd) self.edits[no].SetValue(d.GetValue()) return
def Initialize(self, path, silent=False): """リソースの情報を取得し、リストを初期化する。""" self.log.debug("Getting resources list...") self.rootDirectory = path t = misc.Timer() if isinstance( path, list ): # パラメータがリストなら、browsableObjects のリストとして処理刷る(ファイルリストを取得しないでコピーする) self.resources += path return errorCodes.OK # end copy self.resources.clear() if not silent: globalVars.app.say(path[2:]) # 取得対象を構造体にセット rootResource = win32wnet.NETRESOURCE() rootResource.lpRemoteName = path # リソースリストの取得 try: h = win32wnet.WNetOpenEnum(2, 1, 0, rootResource) # 2=RESOURCE_GLOBALNET # 1=RESOURCETYPE_DISK lst = win32wnet.WNetEnumResource(h, 64) # 65以上の指定不可 win32wnet.WNetCloseEnum(h) except win32wnet.error as er: dialog( _("エラー"), _("ネットワーク上のリソース一覧を取得できませんでした(%(error)s)") % {"error": str(er)}) return errorCodes.ACCESS_DENIED for l in lst: ret, shfileinfo = shell.SHGetFileInfo(l.lpRemoteName, 0, shellcon.SHGFI_ICON) s = browsableObjects.NetworkResource() self.log.debug("network resource found and check IP address:" + l.lpRemoteName[2:]) s.Initialize(l.lpRemoteName[len(path) + 1:], l.lpRemoteName, "", shfileinfo[0]) self.resources.append(s) self.log.debug("Network resource list created in %d seconds." % t.elapsed) self.log.debug(str(len(self.resources)) + " resources found.") return errorCodes.OK
def Search(self): basePath = self.parent.activeTab.listObject.rootDirectory out_lst = [] #入力画面が出てるときに、もうファイルリスト取得を開始してしまう task = workerThreads.RegisterTask( workerThreadTasks.GetRecursiveFileList, { 'path': basePath, 'out_lst': out_lst, 'eol': True }) d = views.search.Dialog(basePath) d.Initialize() canceled = False while (True): ret = d.Show() if ret == wx.ID_CANCEL: task.Cancel() canceled = True break #end キャンセルして抜ける val = d.GetValue() if val['isRegularExpression']: ret = misc.ValidateRegularExpression(val['keyword']) if ret != "OK": dialog( _("エラー"), _("正規表現の文法が間違っています。\nエラー内容: %(error)s") % {'error': ret}) continue #end 正規表現違う #end 正規表現モードがオンかどうか break #end 入力が正しくなるまで d.Destroy() if canceled: return actionstr = "search" if val['type'] == 0 else "grep" target = { 'action': actionstr, 'basePath': basePath, 'out_lst': out_lst, 'keyword': val['keyword'], 'isRegularExpression': val['isRegularExpression'] } self.parent.Navigate(target, as_new_tab=True)
def setToken(self): """新しいトークンをセットする """ manager = implicitGrantManager.ImplicitGrantManager( constants.TC_CID, constants.TC_URL, constants.TC_PORT) l = "ja" try: l = globalVars.app.config["general"]["language"].split( "_")[0].lower() except: pass #end うまく読めなかったら ja を採用 #end except manager.setMessage( lang=l, success=_("認証に成功しました。このウィンドウを閉じて、アプリケーションに戻ってください。"), failed=_("認証に失敗しました。もう一度お試しください。"), transfer=_("しばらくしても画面が切り替わらない場合は、別のブラウザでお試しください。")) webbrowser.open(manager.getUrl()) d = views.auth.waitingDialog() d.Initialize(_("アカウントの追加")) d.Show(False) while True: time.sleep(0.01) wx.YieldIfNeeded() if manager.getToken(): d.Destroy() break if d.canceled == 1 or manager.getToken() == "": simpleDialog.dialog(_("処理結果"), _("キャンセルされました。")) manager.shutdown() d.Destroy() return False token = manager.getToken() data = { "token": base64.b64encode(token["access_token"].encode()), "expires": token["expires_at"], "next": token["expires_at"] - constants.TOKEN_EXPIRE_MAX, } with open(constants.AC_TWITCASTING, "wb") as f: pickle.dump(data, f) simpleDialog.dialog(_("処理結果"), _("認証が完了しました。")) self.loadToken() return True
def initialize(self): _import() """アプリを初期化する。""" self.setGlobalVars() self.proxyEnviron = proxyUtil.virtualProxyEnviron() self.setProxyEnviron() self.installThreadExcepthook() # update関係を準備 if self.config.getboolean("general", "update"): globalVars.update.update(True) self.hMainView = main.MainView() if self.config.getboolean(self.hMainView.identifier, "maximized", False): self.hMainView.hFrame.Maximize() self.hMainView.Show() self.accountManager = twitcasting.accountManager.AccountManager() self.hasAccountIssue = False self.Manager = manager.manager(self.hMainView) if len(self.accountManager.tokens) == 0: simpleDialog.dialog( _("アカウント登録"), _("アカウントが登録されていません。ライブに接続する前に、設定メニューのアカウントマネージャからアカウントの登録を行ってください。" )) self.hasAccountIssue = True return True for i in self.accountManager.tokens: if datetime.datetime.now().timestamp() > i["expires_at"]: simpleDialog.dialog( "", _("期限が切れたトークンが見つかりました。設定メニューのアカウントマネージャから、再度アカウントの追加を行ってください。" )) self.accountManager.deleteAccount( self.accountManager.tokens.index(i)) self.hasAccountIssue = True if len(sys.argv) == 2: self.hMainView.Clear() self.Manager.connect(sys.argv[1]) return True if self.hasAccountIssue == False and self.config.getboolean( "general", "autoconnect", True) == True: self.hMainView.events.connect() return True
def _getToken(self): manager = self._getManager() l = "ja" try: l = globalVars.app.config["general"]["language"].split( "_")[0].lower() except: pass # end うまく読めなかったら ja を採用 # end except manager.setMessage( lang=l, success=_("認証に成功しました。このウィンドウを閉じて、アプリケーションに戻ってください。"), failed=_("認証に失敗しました。もう一度お試しください。"), transfer=_("しばらくしても画面が切り替わらない場合は、別のブラウザでお試しください。")) webbrowser.open(manager.getUrl()) d = views.auth.waitingDialog() d.Initialize(_("Twitterアカウント認証")) d.Show(False) self.log.debug("start authorization") while True: time.sleep(0.01) wx.YieldIfNeeded() if manager.getToken(): self.log.debug("accepted") d.Destroy() break if d.canceled == 1 or manager.getToken() == "": self.log.debug("canceled") simpleDialog.dialog(_("処理結果"), _("キャンセルされました。")) manager.shutdown() d.Destroy() return self.log.debug("waiting for browser operation...") user = self._getUser(manager) token = manager.getData() self._data[user["id"]] = { "user": user, "token": token, "default": False, } manager.shutdown() return manager.getToken()