Exemple #1
0
 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()
Exemple #2
0
	def clearHistory(self, event):
		dlg = simpleDialog.yesNoDialog(_("確認"), _("接続履歴を全て消去します。よろしいですか?"))
		if dlg == wx.ID_NO:
			return
		globalVars.app.Manager.clearHistory()
		self.historyList.Clear()
		self.itemSelected()
Exemple #3
0
 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()
Exemple #4
0
 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()
Exemple #6
0
 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()
Exemple #7
0
    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
Exemple #8
0
 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()
Exemple #10
0
 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)
Exemple #11
0
    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()
Exemple #12
0
	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)
Exemple #13
0
 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()