def initialize(self): if self.initialized == 1: self.initThread() result = self.getGuestToken() if result != errorCodes.OK: self.showError(result) return False if not os.path.exists(constants.AC_SPACES): d = simpleDialog.yesNoDialog( _("Twitterアカウントの連携"), _("Twitter スペースを使用する前に、使用するTwitterアカウントを設定する必要があります。今すぐ設定画面を開きますか?" )) if d == wx.ID_NO: return False if self.openTokenManager() == errorCodes.SHOULD_EXIT: return False if not self.tokenManager.load( ) or not self.tokenManager.hasDefaultAccount(): d = simpleDialog.yesNoDialog( _("Twitterアカウントの連携"), _("Twitterアカウント情報の読み込みに失敗しました。再度アカウントの連携を行ってください。今すぐ設定画面を開きますか?" )) if d == wx.ID_NO: return False if self.openTokenManager() == errorCodes.SHOULD_EXIT: return False self.initialized = 1 self.enableMenu(True) return super().initialize()
def clearHistory(self, event): dlg = simpleDialog.yesNoDialog(_("確認"), _("接続履歴を全て消去します。よろしいですか?")) if dlg == wx.ID_NO: return globalVars.app.Manager.clearHistory() self.historyList.Clear() self.itemSelected()
def post(self, event): account = self.account.GetValue() item = globalVars.app.postItem.getItem(self.item.GetValue()) if not globalVars.app.postItem.login(account): return point = self.count.GetValue() * item.point if point > globalVars.app.postItem.getPoint(account): simpleDialog.errorDialog( _("アカウント「%s」の所有ポイント数が不足しているため、アイテムを投下できません。") % account) return if globalVars.app.config.getboolean("general", "checkPoint", True): key = globalVars.app.config["advanced_ids"][account].replace( ":", "-") last = globalVars.app.config.getint("item_posted_time", key, 0) now = time.time() if now - last > 86400: # 24時間以上経過している newPoint = point else: # 24時間経過していない newPoint = globalVars.app.config.getint("item_point", key, 0) + point if newPoint > 100: d = simpleDialog.yesNoDialog( _("確認"), _("24時間以内に%dポイント使用しようとしています。100ポイント以上使用した場合であっても、自動チャージされるのは100ポイントのみです。処理を続行しますか?" ) % (newPoint)) if d == wx.ID_NO: return if now - last > 86400: globalVars.app.config["item_posted_time"][key] = int(now) globalVars.app.config["item_point"][key] = newPoint globalVars.app.postItem.postItem(account, item, self.count.GetValue()) self.account.SetFocus()
def clear(self, event): dlg = simpleDialog.yesNoDialog(_("確認"), _("お気に入りの内容を全て消去します。よろしいですか?")) if dlg == wx.ID_NO: return globalVars.app.Manager.clearFavorites() self.favoritesList.Clear() self.itemSelected()
def add(self, event): q = simpleDialog.yesNoDialog(_("アカウントの追加"), _("ブラウザを開いてアカウントの認証作業を行います。よろしいですか?")) if q == wx.ID_NO: return self.wnd.Enable(False) globalVars.app.spaces.tokenManager.addUser() self.wnd.Enable(True) self.refreshList() self.hListCtrl.SetFocus()
def showTokenError(self): self.log.error("unauthorized") if self._tokenManagerShown: return d = simpleDialog.yesNoDialog( _("Twitterアカウントの連携"), _("Twitterアカウントの認証情報が正しくありません。再度アカウントの連携を行ってください。今すぐ設定画面を開きますか?")) if d == wx.ID_NO: return wx.CallAfter(self.openTokenManager) if self.shouldExit: self.exit()
def showTokenError(self): """「有効なトークンがありません」というエラーを出す。「はい」を選ぶと認証開始。 """ winsound.MessageBeep(winsound.MB_ICONEXCLAMATION) d = simpleDialog.yesNoDialog( _("アクセストークンが見つかりません"), _("利用可能なアクセストークンが見つかりません。ブラウザを起動し、認証作業を行いますか?")) if d == wx.ID_NO: return False if not self.setToken(): return False return True
def delete(self, event): dlg = simpleDialog.yesNoDialog( _("確認"), _("%sのライブをお気に入りから削除してもよろしいですか?") % (globalVars.app.Manager.favorites[ self.favoritesList.GetSelection()])) if dlg == wx.ID_NO: return globalVars.app.Manager.deleteFavorites( self.favoritesList.GetSelection()) self.favoritesList.Delete(self.favoritesList.GetSelection()) self.itemSelected()
def onCloseButton(self, event): if self.hListCtrl.GetItemCount() == 0: d = simpleDialog.yesNoDialog(_("確認"), _("Twitterアカウントの情報が設定されていません。Twitterとの連携を停止しますか?")) if d == wx.ID_YES: self._shouldExit = True event.Skip() else: return result = globalVars.app.spaces.tokenManager.hasDefaultAccount() if not result and self.hListCtrl.GetItemCount() > 0: simpleDialog.errorDialog(_("規定のアカウントが設定されていません。")) return event.Skip()
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 OnMenuSelect(self, event): """メニュー項目が選択されたときのイベントハンドら。""" #ショートカットキーが無効状態のときは何もしない if not self.parent.shortcutEnable: event.Skip() return selected = event.GetId() #メニュー識別しの数値が出る #特殊なイベントと思われる if selected < 10 and selected > 0: event.Skip() return if not self.parent.menu.IsEnable(selected): event.Skip() return #終了 if selected == menuItemsStore.getRef("EXIT"): self.parent.hFrame.Close() #バージョン情報 elif selected == menuItemsStore.getRef("SET_KEYMAP"): if self.setKeymap("MainView", _("ショートカットキーの設定"), filter=keymap.KeyFilter().SetDefault( False, False)): #ショートカットキーの変更適用とメニューバーの再描画 self.parent.menu.InitShortcut() self.parent.menu.ApplyShortcut(self.parent.hFrame) self.parent.menu.Apply(self.parent.hFrame) elif selected == menuItemsStore.getRef("SET_HOTKEY"): if self.setKeymap("HOTKEY", _("グローバルホットキーの設定"), self.parent.hotkey, filter=self.parent.hotkey.filter): #変更適用 self.parent.hotkey.UnSet("HOTKEY", self.parent.hFrame) self.parent.applyHotKey() elif selected == menuItemsStore.getRef("VERSION_INFO"): views.versionDialog.versionDialog() #接続 elif selected == menuItemsStore.getRef("CONNECT"): self.connect() #切断 elif selected == menuItemsStore.getRef("DISCONNECT"): globalVars.app.Manager.disconnect() #履歴 elif selected == menuItemsStore.getRef("VIEW_HISTORY"): self.viewHistory() #お気に入り elif selected == menuItemsStore.getRef("VIEW_FAVORITES"): self.viewFavorites() #コメントのコピー elif selected == menuItemsStore.getRef("COPY_COMMENT"): globalVars.app.Manager.copyComment() #コメントの詳細を表示 elif selected == menuItemsStore.getRef("VIEW_COMMENT"): viewCommentDialog = views.viewComment.Dialog( globalVars.app.Manager.connection.comments[ self.parent.commentList.GetFocusedItem()]) viewCommentDialog.Initialize() viewCommentDialog.Show() #選択中のコメントに返信 elif selected == menuItemsStore.getRef("REPLY2SELECTED_COMMENT"): self.parent.commentBodyEdit.SetValue( "@" + globalVars.app.Manager.connection.comments[ self.parent.commentList.GetFocusedItem()]["from_user"] ["screen_id"] + " ") self.parent.commentBodyEdit.SetInsertionPointEnd() self.parent.commentBodyEdit.SetFocus() #全てのコメントを選択 elif selected == menuItemsStore.getRef("SELECT_ALL_COMMENT"): self.selectAllComment() #配信者に返信 elif selected == menuItemsStore.getRef("REPLY2BROADCASTER"): self.parent.commentBodyEdit.SetValue( "@" + globalVars.app.Manager.connection.movieInfo["broadcaster"] ["screen_id"] + " ") self.parent.commentBodyEdit.SetInsertionPointEnd() self.parent.commentBodyEdit.SetFocus() #コメントの削除 elif selected == menuItemsStore.getRef("DELETE_SELECTED_COMMENT"): dlg = simpleDialog.yesNoDialog(_("確認"), _("選択中のコメントを削除しますか?")) if dlg == wx.ID_NO: return globalVars.app.Manager.deleteComment() #お気に入りに追加 elif selected == menuItemsStore.getRef("ADD_FAVORITES"): if globalVars.app.Manager.connection.userId in globalVars.app.Manager.favorites: simpleDialog.errorDialog(_("すでに登録されています。")) return dlg = simpleDialog.yesNoDialog( _("確認"), _("%sのライブをお気に入りに追加しますか?") % (globalVars.app.Manager.connection.userId)) if dlg == wx.ID_NO: return globalVars.app.Manager.addFavorites() #配信者の情報 elif selected == menuItemsStore.getRef("VIEW_BROADCASTER"): viewBroadcasterDialog = views.viewBroadcaster.Dialog( globalVars.app.Manager.connection.movieInfo["broadcaster"]) viewBroadcasterDialog.Initialize() viewBroadcasterDialog.Show() #ブラウザで開く elif selected == menuItemsStore.getRef("OPEN_LIVE"): globalVars.app.Manager.openLiveWindow() # アイテム投下 elif selected == menuItemsStore.getRef("POST_ITEM"): accounts = list(globalVars.app.config["advanced_ids"].keys()) if len(accounts) == 0: simpleDialog.errorDialog( _("この機能を使用する前に、設定メニューの拡張機能用アカウントの設定から、使用するアカウントを登録してください。") ) return if not globalVars.app.postItem.login( globalVars.app.postItem.getDefaultAccount()): return items = globalVars.app.postItem.getItemList() if len(items) == 0: if len(accounts) == 1 and globalVars.app.postItem.getUserId( globalVars.app.postItem.getDefaultAccount( )) == globalVars.app.Manager.connection.userId: simpleDialog.errorDialog(_("自分のライブにアイテムを投下することはできません。")) return for i in range(1, len(accounts)): globalVars.app.postItem.setDefaultAccountIndex(i) if not globalVars.app.postItem.login( globalVars.app.postItem.getDefaultAccount()): return items = globalVars.app.postItem.getItemList() if len(items) > 0: d = views.postItem.Dialog(accounts, items) d.Initialize() d.Show() return simpleDialog.errorDialog(_("アイテム情報の取得に失敗しました。")) return d = views.postItem.Dialog(accounts, items) d.Initialize() d.Show() #設定 elif selected == menuItemsStore.getRef("SETTING"): self.settings() # コメントリスト表示設定 elif selected == menuItemsStore.getRef("COMMENT_LIST_CONFIGURATION"): d = views.commentListConfiguration.Dialog() d.Initialize() d.Show() #効果音設定 elif selected == menuItemsStore.getRef("INDICATOR_SOUND_SETTING"): self.indicatorSoundSettings() #コメント文字列置換設定 elif selected == menuItemsStore.getRef("COMMENT_REPLACE"): self.commentReplace() #表示名置換設定 elif selected == menuItemsStore.getRef("USER_NAME_REPLACE"): self.userNameReplace() #アカウントマネージャ elif selected == menuItemsStore.getRef("ACCOUNT_MANAGER"): self.accountManager() elif selected == menuItemsStore.getRef("advanced_ACCOUNT_MANAGER"): self.advancedAccountManager() #SAPI設定を開く elif selected == menuItemsStore.getRef("SAPI_SETTING"): file = os.path.join(os.getenv("windir"), "SysWOW64", "Speech", "SpeechUX", "sapi.cpl") if os.path.exists(file) == False: file = file.replace("syswow64", "system32") os.system(file) #読み上げ出力先の変更 elif selected == menuItemsStore.getRef("CHANGE_SPEECH_OUTPUT"): d = views.changeSpeechOutput.Dialog() d.Initialize() d.Show() #コメント送信(ホットキー) elif selected == menuItemsStore.getRef("POST_COMMENT"): self.postComment(None) #再生 elif selected == menuItemsStore.getRef("PLAY"): globalVars.app.Manager.play() #停止 elif selected == menuItemsStore.getRef("STOP"): globalVars.app.Manager.stop() #音量を上げる elif selected == menuItemsStore.getRef("VOLUME_UP"): globalVars.app.Manager.volumeUp() #音量を下げる elif selected == menuItemsStore.getRef("VOLUME_DOWN"): globalVars.app.Manager.volumeDown() #音量のリセット elif selected == menuItemsStore.getRef("RESET_VOLUME"): globalVars.app.Manager.resetVolume() #再生デバイス変更 elif selected == menuItemsStore.getRef("CHANGE_DEVICE"): changeDeviceDialog = views.changeDevice.Dialog() changeDeviceDialog.Initialize() ret = changeDeviceDialog.Show() if ret == wx.ID_CANCEL: return globalVars.app.Manager.changeDevice(changeDeviceDialog.GetData()) return #音声停止 elif selected == menuItemsStore.getRef("SILENCE"): try: globalVars.app.speech.silence() except AttributeError: pass # URLスキームの設定 elif selected == menuItemsStore.getRef("CUSTOM_URL_SCHEME"): self.toggleCustomUrlScheme() #ヘルプを開く elif selected == menuItemsStore.getRef("HELP"): self.help() #更新を確認 elif selected == menuItemsStore.getRef("CHECK4UPDATE"): update.checkUpdate() #コメントリストのコンテキストメニューを開く elif selected == menuItemsStore.getRef("POPUP_OPEN_COMMENT"): return self.commentContextMenu() #URLを開く elif selected >= constants.MENU_URL_FIRST: obj = event.GetEventObject() webbrowser.open(obj.GetLabel(selected)) #ユーザー情報のコンテキストメニューを開く elif selected == menuItemsStore.getRef("POPUP_OPEN_USER_INFO"): return self.userInfoContextMenu() # アイテム履歴 elif selected == menuItemsStore.getRef("ITEM_HISTORY"): self.itemHistory()
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"): simpleDialog.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() if ret==wx.ID_CANCEL: return user = str(connectDialog.GetValue()) if "https://twitcasting.tv/" in user: user = user[23:] elif "http://twitcasting.tv/" in user: user = user[22:] if "/" in user: user = user[0:user.find("/")] globalVars.app.Manager.connect(user) return #履歴 elif selected==menuItemsStore.getRef("viewHistory"): if len(globalVars.app.Manager.history) == 0: simpleDialog.errorDialog(_("接続履歴がありません。")) return viewHistoryDialog = views.viewHistory.Dialog() viewHistoryDialog.Initialize() ret = viewHistoryDialog.Show() if ret==wx.ID_CANCEL: return globalVars.app.Manager.connect(globalVars.app.Manager.history[viewHistoryDialog.GetValue()]) return #お気に入り elif selected==menuItemsStore.getRef("viewFavorites"): if len(globalVars.app.Manager.favorites) == 0: simpleDialog.errorDialog(_("お気に入りライブが登録されていません。")) return viewFavoritesDialog = views.viewFavorites.Dialog() viewFavoritesDialog.Initialize() ret = viewFavoritesDialog.Show() if ret==wx.ID_CANCEL: return globalVars.app.Manager.connect(globalVars.app.Manager.favorites[viewFavoritesDialog.GetValue()]) return #コメントの詳細を表示 elif selected==menuItemsStore.getRef("viewComment"): viewCommentDialog = views.viewComment.Dialog(globalVars.app.Manager.connection.comments[self.parent.commentList.GetFocusedItem()]) viewCommentDialog.Initialize() viewCommentDialog.Show() #選択中のコメントに返信 elif selected==menuItemsStore.getRef("replyToSelectedComment"): self.parent.commentBodyEdit.SetValue("@" + globalVars.app.Manager.connection.comments[self.parent.commentList.GetFocusedItem()]["from_user"]["screen_id"] + " ") self.parent.commentBodyEdit.SetInsertionPointEnd() self.parent.commentBodyEdit.SetFocus() #配信者に返信 elif selected==menuItemsStore.getRef("replyToBroadcaster"): self.parent.commentBodyEdit.SetValue("@" + globalVars.app.Manager.connection.movieInfo["broadcaster"]["screen_id"] + " ") self.parent.commentBodyEdit.SetInsertionPointEnd() self.parent.commentBodyEdit.SetFocus() #コメントの削除 elif selected==menuItemsStore.getRef("deleteSelectedComment"): dlg=simpleDialog.yesNoDialog(_("確認"),_("選択中のコメントを削除しますか?")) if dlg==wx.ID_NO: return globalVars.app.Manager.deleteComment() #お気に入りに追加 elif selected==menuItemsStore.getRef("addFavorites"): if globalVars.app.Manager.connection.userId in globalVars.app.Manager.favorites: simpleDialog.errorDialog(_("すでに登録されています。")) return dlg=simpleDialog.yesNoDialog(_("確認"),_("%sのライブをお気に入りに追加しますか?") %(globalVars.app.Manager.connection.userId)) if dlg==wx.ID_NO: return globalVars.app.Manager.addFavorites() #配信者の情報 elif selected==menuItemsStore.getRef("viewBroadcaster"): viewBroadcasterDialog = views.viewBroadcaster.Dialog(globalVars.app.Manager.connection.movieInfo["broadcaster"]) viewBroadcasterDialog.Initialize() viewBroadcasterDialog.Show() #ブラウザで開く elif selected==menuItemsStore.getRef("openLive"): webbrowser.open("http://twitcasting.tv/" + globalVars.app.Manager.connection.movieInfo["broadcaster"]["screen_id"]) #アカウントマネージャ elif selected==menuItemsStore.getRef("accountManager"): accountManager = views.accountManager.Dialog([]) accountManager.Initialize() accountManager.Show() #コメント送信(ホットキー) elif selected==menuItemsStore.getRef("postComment"): self.postComment(None)
def run(self): if self.shouldSkip(): return try: cmd = self.getCommand() except IOError: d = simpleDialog.yesNoDialog( _("録画エラー"), _("録画の開始に失敗しました。録画の保存先が適切に設定されていることを確認してください。定期的に再試行する場合は[はい]、処理を中断する場合は[いいえ]を選択してください。[はい]を選択して録画の保存先を変更することで、正しく録画を開始できる場合があります。" )) if d == wx.ID_NO: globalVars.app.hMainView.addLog( _("録画エラー"), _("%sのライブの録画処理を中断しました。") % self.userName) return max = 30 for i in range(max): try: cmd = self.getCommand() break except IOError: self.log.info("#%i failed." % i) sleep(30) if i + 1 == max: globalVars.app.hMainView.addLog( _("録画エラー"), _("%sのライブの録画処理を中断しました。") % self.userName) return self.source.onRecord(self.path, self.movie) globalVars.app.hMainView.addLog( _("録画開始"), _("ユーザ:%(user)s、ムービーID:%(movie)s") % { "user": self.userName, "movie": self.movie }, self.source.friendlyName) globalVars.app.tb.setAlternateText(_("録画中")) self.log.debug("command: " + " ".join(cmd)) result = subprocess.run(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, shell=True, encoding="utf-8") self.log.info("saved: %s" % self.path) while len(result.stdout) > 0: self.log.info("FFMPEG returned some errors.\n" + result.stdout) if not self.source.onRecordError(self.movie): self.log.info("End of recording") break if "404 Not Found" in result.stdout: self.log.info("not found") break globalVars.app.hMainView.addLog( _("録画エラー"), (_("%sのライブを録画中にエラーが発生したため、再度録画を開始します。") % self.userName) + (_("詳細:%s") % result.stdout), self.source.friendlyName) sleep(15) cmd = self.getCommand() self.source.onRecord(self.path, self.movie) result = subprocess.run(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, shell=True, encoding="utf-8") self.log.info("saved: %s" % self.path) if not self.source.onRecordError(self.movie): self.log.info("End of recording") break if "404 Not Found" in result.stdout: self.log.info("not found") break globalVars.app.hMainView.addLog( _("録画終了"), _("ユーザ:%(user)s、ムービーID:%(movie)s") % { "user": self.userName, "movie": self.movie }, self.source.friendlyName) if getRecordingUsers(self) == []: globalVars.app.tb.setAlternateText()