Beispiel #1
0
def app_main(description, create_app):
    args = _parse_args(description)

    loop = asyncio.get_event_loop()

    secrets = {"TELEGRAM_TOKEN": os.environ["TELEGRAM_TOKEN"]}
    try:
        config = Config.from_file("config.json")
    except Exception:
        config = Config.from_json({"CHAT_ID": os.environ["CHAT_ID"]})

    app = create_app(loop=loop, secrets=secrets, config=config)
    web.run_app(app, host=args.host, port=args.port)
Beispiel #2
0
 def __init__(self):
     config = Config()
     self.token = config.token
     self.api_url = 'https://api.telegram.org/bot{token}/'.format(
         token=self.token)
     self.db = sqlite3.connect(config.db_filename)
     self.create_db()
     self.load_chat_ids()
     self.unfinshed_task = {}
Beispiel #3
0
def test_creating_from_json():
    data = {
        "dict": {},
        "string": "str",
        "int": 4,
        "float": 3.4,
    }
    config = Config.from_json(data)
    for key, value in data.items():
        assert getattr(config, key) == value
Beispiel #4
0
def main():
    config_name = os.environ.get('APP_SETTINGS',
                                 'service.config.DevelopmentConfig')
    config = Config.create(config_name)

    app = create_app(config)

    init_basic_auth(app)

    init_db()

    app.run(use_reloader=False)
Beispiel #5
0
SQL_CREATE_USER = '''
    INSERT INTO users (
        name,
        password,
        is_admin
    )
    
    VALUES (%(name)s, %(password)s, %(is_admin)s);
'''


class InitDBError(Exception):
    pass


config = Config.create()


def _open_admin_connection() -> connection:
    # User and DB should be created by Postgres admin
    connection = connect_with(
        host=config.DB_HOST,
        port=config.DB_PORT,
        dbname=None,
        user=config.DB_ADMIN_USER,
        password=config.DB_ADMIN_PASSWORD,
    )

    # CREATE DB statement should be done outside of transaction block
    connection.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
Beispiel #6
0
def test_creating_from_file():
    config = Config.from_file(TEST_DATA_DIR / "test_config.json")
    assert getattr(config, "CHAT_ID") == 111111111
Beispiel #7
0
    def __init__(self):
        """Constructor"""

        # Initialize configs
        self.__config = Config()

        # Read glade file
        self.__gladeXML = gtk.glade.XML(environment.NAME_GLADE_XML_PATH +
                                        self.__NAME_MAIN_WINDOW_GLADE_XML)

        # Connect signals to self
        self.__gladeXML.signal_autoconnect(self)

        # Get treeview list for settings
        self.__treeviewSettings = self.__gladeXML.get_widget(
            self.__NAME_TREEVIEW_SETTINGS_LIST)

        # Create render for displaying the text
        renderer = gtk.CellRendererText()

        # Create column
        column = gtk.TreeViewColumn('Settings name/key', renderer)
        column.set_attributes(renderer, text=0)

        # Add column to list
        self.__treeviewSettings.append_column(column)

        # Create list
        self.__liststoreSettings = gtk.ListStore(str)

        # Add list to treeview list
        self.__treeviewSettings.set_model(self.__liststoreSettings)

        # Show main window
        self.__windowMain = self.__gladeXML.get_widget(self.__NAME_MAIN_WINDOW)

        # Size
        windowSizeX = self.__config.get(Config.SECTION_WINDOW,
                                        Config.OPTION_WINDOW_SIZE_X)
        windowSizeY = self.__config.get(Config.SECTION_WINDOW,
                                        Config.OPTION_WINDOW_SIZE_Y)

        if windowSizeX is not None and windowSizeY is not None:
            self.__windowMain.resize(int(windowSizeX), (int(windowSizeY)))
        # End if

        # Position
        windowPositionX = self.__config.get(Config.SECTION_WINDOW,
                                            Config.OPTION_WINDOW_POSITION_X)
        windowPositionY = self.__config.get(Config.SECTION_WINDOW,
                                            Config.OPTION_WINDOW_POSITION_Y)

        if windowPositionX is not None and windowPositionY is not None:
            self.__windowMain.move(int(windowPositionX), int(windowPositionY))
        # End if

        # Check, if window should be started minimized
        startMinimized = self.__config.getBool(
            Config.SECTION_WINDOW, Config.OPTION_WINDOW_START_MINIMIZED)

        if startMinimized is None or not startMinimized:
            # Set default value
            self.__config.set(Config.SECTION_WINDOW,
                              Config.OPTION_WINDOW_START_MINIMIZED, False)
            # Show window
            self.__windowMain.show()
        # End if

        # Get several gui components
        # Menu items
        self.__miEdit = self.__gladeXML.get_widget('menuItemEdit')
        self.__miRemove = self.__gladeXML.get_widget('menuItemRemove')

        # Settings-list button area
        self.__bEditSetting = self.__gladeXML.get_widget(
            self.__NAME_BEDITSETTING)
        self.__bRemoveSetting = self.__gladeXML.get_widget(
            self.__NAME_BREMOVESETTING)
        self.__bRunSetting = self.__gladeXML.get_widget(
            self.__NAME_BRUNSETTING)

        # Form area
        self.__noneSelectedLabel = self.__gladeXML.get_widget(
            self.__NAME_NONE_SELECTED_LABEL)
        self.__settingsForm = self.__gladeXML.get_widget(
            self.__NAME_SETTINGS_FORM)

        # Boxes for server connection string -sc
        self.__vboxSC = self.__gladeXML.get_widget(self.__NAME_VBOX_SC)
        self.__vboxFilename = self.__gladeXML.get_widget(
            self.__NAME_VBOX_FILENAME)
        self.__vboxConfigSettings = self.__gladeXML.get_widget(
            self.__NAME_VBOX_CONFIGSETTINGS)

        # Create and setup systray-icon/.menu
        self.__systrayIcon = gtk.StatusIcon()
        self.__systrayIcon.set_from_stock(gtk.STOCK_ABOUT)
        self.__systrayIcon.connect('activate', self.on_systrayIcon_activate)
        self.__systrayIcon.connect('popup-menu',
                                   self.on_systrayIcon_popup_menu)
        self.__systrayIcon.set_title(environment.APP_NAME)
        self.__systrayIcon.set_tooltip(environment.APP_NAME)

        # Load settings
        self.__loadSettings()
Beispiel #8
0
class TMUXCSSHGUI:

    # Constant: Name of main window
    __NAME_MAIN_WINDOW_GLADE_XML = 'main.glade'
    __NAME_MAIN_WINDOW = 'windowMain'
    __NAME_BEDITSETTING = 'bEditSetting'
    __NAME_BRUNSETTING = 'bRunSetting'
    __NAME_BREMOVESETTING = 'bRemoveSetting'
    __NAME_NONE_SELECTED_LABEL = 'lChooseInfo'
    __NAME_SETTINGS_FORM = 'vboxSettingsForm'
    __NAME_VBOX_SC = 'vboxSC'
    __NAME_VBOX_FILENAME = 'vboxFilename'
    __NAME_VBOX_CONFIGSETTINGS = 'vboxConfigSettings'

    # Constant: Name of treeview list holding the settings
    __NAME_TREEVIEW_SETTINGS_LIST = 'treeviewSettings'

    __windowStateMaximized = False

    def __init__(self):
        """Constructor"""

        # Initialize configs
        self.__config = Config()

        # Read glade file
        self.__gladeXML = gtk.glade.XML(environment.NAME_GLADE_XML_PATH +
                                        self.__NAME_MAIN_WINDOW_GLADE_XML)

        # Connect signals to self
        self.__gladeXML.signal_autoconnect(self)

        # Get treeview list for settings
        self.__treeviewSettings = self.__gladeXML.get_widget(
            self.__NAME_TREEVIEW_SETTINGS_LIST)

        # Create render for displaying the text
        renderer = gtk.CellRendererText()

        # Create column
        column = gtk.TreeViewColumn('Settings name/key', renderer)
        column.set_attributes(renderer, text=0)

        # Add column to list
        self.__treeviewSettings.append_column(column)

        # Create list
        self.__liststoreSettings = gtk.ListStore(str)

        # Add list to treeview list
        self.__treeviewSettings.set_model(self.__liststoreSettings)

        # Show main window
        self.__windowMain = self.__gladeXML.get_widget(self.__NAME_MAIN_WINDOW)

        # Size
        windowSizeX = self.__config.get(Config.SECTION_WINDOW,
                                        Config.OPTION_WINDOW_SIZE_X)
        windowSizeY = self.__config.get(Config.SECTION_WINDOW,
                                        Config.OPTION_WINDOW_SIZE_Y)

        if windowSizeX is not None and windowSizeY is not None:
            self.__windowMain.resize(int(windowSizeX), (int(windowSizeY)))
        # End if

        # Position
        windowPositionX = self.__config.get(Config.SECTION_WINDOW,
                                            Config.OPTION_WINDOW_POSITION_X)
        windowPositionY = self.__config.get(Config.SECTION_WINDOW,
                                            Config.OPTION_WINDOW_POSITION_Y)

        if windowPositionX is not None and windowPositionY is not None:
            self.__windowMain.move(int(windowPositionX), int(windowPositionY))
        # End if

        # Check, if window should be started minimized
        startMinimized = self.__config.getBool(
            Config.SECTION_WINDOW, Config.OPTION_WINDOW_START_MINIMIZED)

        if startMinimized is None or not startMinimized:
            # Set default value
            self.__config.set(Config.SECTION_WINDOW,
                              Config.OPTION_WINDOW_START_MINIMIZED, False)
            # Show window
            self.__windowMain.show()
        # End if

        # Get several gui components
        # Menu items
        self.__miEdit = self.__gladeXML.get_widget('menuItemEdit')
        self.__miRemove = self.__gladeXML.get_widget('menuItemRemove')

        # Settings-list button area
        self.__bEditSetting = self.__gladeXML.get_widget(
            self.__NAME_BEDITSETTING)
        self.__bRemoveSetting = self.__gladeXML.get_widget(
            self.__NAME_BREMOVESETTING)
        self.__bRunSetting = self.__gladeXML.get_widget(
            self.__NAME_BRUNSETTING)

        # Form area
        self.__noneSelectedLabel = self.__gladeXML.get_widget(
            self.__NAME_NONE_SELECTED_LABEL)
        self.__settingsForm = self.__gladeXML.get_widget(
            self.__NAME_SETTINGS_FORM)

        # Boxes for server connection string -sc
        self.__vboxSC = self.__gladeXML.get_widget(self.__NAME_VBOX_SC)
        self.__vboxFilename = self.__gladeXML.get_widget(
            self.__NAME_VBOX_FILENAME)
        self.__vboxConfigSettings = self.__gladeXML.get_widget(
            self.__NAME_VBOX_CONFIGSETTINGS)

        # Create and setup systray-icon/.menu
        self.__systrayIcon = gtk.StatusIcon()
        self.__systrayIcon.set_from_stock(gtk.STOCK_ABOUT)
        self.__systrayIcon.connect('activate', self.on_systrayIcon_activate)
        self.__systrayIcon.connect('popup-menu',
                                   self.on_systrayIcon_popup_menu)
        self.__systrayIcon.set_title(environment.APP_NAME)
        self.__systrayIcon.set_tooltip(environment.APP_NAME)

        # Load settings
        self.__loadSettings()

    # End def

    def __loadSettings(self):
        # Initialize settings-service-object
        self.__serviceSettings = Settings()

        # Update settings list in gui
        self.__updateGUISettingsList()

    # End def

    def __updateGUISettingsList(self):
        # Reset internal selection
        self.__currentSelectedSetting = None

        # Clear list
        self.__liststoreSettings.clear()

        # Insert items
        for settingEntry in self.__serviceSettings.yieldSettings():
            self.__liststoreSettings.append([settingEntry.getKey()])
        # End for

    # End def

    def __updateGUI(self):
        # Update list
        self.__updateGUISettingsList()

        # Form area
        self.__switchFormVisibility()

    # End def

    def on_destroy(self, object):
        # Call quit
        self.__quit()

    # End def

    def __quit(self):
        # Actually quit
        gtk.main_quit()

    # End def

    def __runSetting(self, position):
        cmnd = self.__config.get(Config.SECTION_TERMINAL,
                                 Config.OPTION_TERMINAL_COMMAND)
        params = self.__config.get(Config.SECTION_TERMINAL,
                                   Config.OPTION_TERMINAL_PARAMETER)

        if cmnd is None and params is None:
            cmnd = environment.TERMINAL_EMULATOR_CMND
            self.__config.set(Config.SECTION_TERMINAL,
                              Config.OPTION_TERMINAL_COMMAND, cmnd)

            params = environment.TERMINAL_EMULATOR_PARAMETER
            self.__config.set(Config.SECTION_TERMINAL,
                              Config.OPTION_TERMINAL_PARAMETER, params)

            dlg = gtk.MessageDialog(
                self.__windowMain, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO,
                gtk.BUTTONS_OK,
                u'Terminal-Emulator-Command not set yet. Edit the config-file ('
                + environment.APP_CONFIG_FILE + '). Setting default.')
            dlg.run()
            dlg.destroy()
        # End if

        # Command and parameters available
        if cmnd and params:
            setting = self.__serviceSettings[position]

            subprocess.Popen(cmnd + ' ' + params + ' "' +
                             environment.TMUX_CSSH_COMMAND + ' ' +
                             setting.getValue() + '" ',
                             shell=True)
        # End if

    # End def

    def on_treeviewSettings_cursor_changed(self, treeviewObject):
        self.__settingSelected = True

        # Get selected rows from treeview object
        selectedRows = treeviewObject.get_selection().get_selected_rows()[1]

        # Clear current settings selection
        self.__currentSelectedSetting = None

        if len(selectedRows) > 0:
            # Get selected row number for settings-object
            selectedRow = selectedRows[0][0]

            # Fill form
            if selectedRow >= 0 and selectedRow < len(self.__serviceSettings):
                self.__currentSelectedSetting = selectedRow
                self.__showFormFromSettingsObject(
                    self.__serviceSettings[selectedRow])
            else:
                self.__showFormFromSettingsObject(None)
            # End if
        # End if

        self.__settingSelected = False

    # End def

    def on_treeviewSettings_row_activated(self, *params):
        self.__runSetting(self.__currentSelectedSetting)

    # End def

    def __switchFormVisibility(self):
        # Setting activated in list
        if self.__currentSelectedSetting is None:
            # Menu items
            self.__miEdit.set_sensitive(False)
            self.__miRemove.set_sensitive(False)

            # Button area in Settings-List
            self.__bEditSetting.set_sensitive(False)
            self.__bRemoveSetting.set_sensitive(False)
            self.__bRunSetting.set_sensitive(False)

            # Form area
            self.__noneSelectedLabel.show()
            self.__settingsForm.hide()
        # No setting activated
        else:
            # Menu items
            self.__miEdit.set_sensitive(True)
            self.__miRemove.set_sensitive(True)

            # Button area in Settings-List
            self.__bEditSetting.set_sensitive(True)
            self.__bRemoveSetting.set_sensitive(True)
            self.__bRunSetting.set_sensitive(True)

            # Form area
            self.__noneSelectedLabel.hide()
            self.__settingsForm.show()
        # End if

    # End def

    def __showFormFromSettingsObject(self, settingObject):
        # Switch form visibility
        self.__switchFormVisibility()

        # Get array with parsed settings from setting object
        settingsFromObject = self.__serviceSettings.getParsedParametersFromSettingObject(
            settingObject=settingObject)

        # Add user to form
        fUser = self.__gladeXML.get_widget('fUser')
        fUser.set_text(settingsFromObject.user[0].strip(
        ) if settingsFromObject.user is not None else '')

        # Add certificate/identity to form
        fIdentity = self.__gladeXML.get_widget('fCertificateIdentity')
        if fIdentity.get_filename() is not None:
            fIdentity.unselect_filename(fIdentity.get_filename())
        # End if

        if settingsFromObject.certificateIdentity is not None:
            fIdentity.set_filename(settingsFromObject.certificateIdentity[0])
        # End if

        # Add server connection strings to form
        # Remove old
        for vboxSCChildren in self.__vboxSC.get_children():
            self.__vboxSC.remove(vboxSCChildren)
        # End for

        # Add new
        if settingsFromObject.sshConnectString is not None:
            for serverConnectionString in settingsFromObject.sshConnectString:
                self.__addSCItem(serverConnectionString[0])
            # End for
        # End if

        # Add additional ssh args to form
        fAdditionalSSHArguments = self.__gladeXML.get_widget(
            'fAdditionalSSHArguments')
        fAdditionalSSHArguments.set_text(
            settingsFromObject.additionalSSHArgs[0].strip(
            ) if settingsFromObject.additionalSSHArgs is not None else '')

        # Add TMUX Session name to form
        fTMUXSessionName = self.__gladeXML.get_widget('fTMUXSessionName')
        fTMUXSessionName.set_text(settingsFromObject.tmuxSessionName[0].strip(
        ) if settingsFromObject.tmuxSessionName is not None else '')

        # Add Epoch time to form
        cbSetEpochTime = self.__gladeXML.get_widget('cbSetEpochTime')
        cbSetEpochTime.set_active(settingsFromObject.setEpochTime)

        # Add new session to form
        cbNewSession = self.__gladeXML.get_widget('cbNewSession')
        cbNewSession.set_active(settingsFromObject.newSession)

        # Add quiet mode to form
        cbQuietMode = self.__gladeXML.get_widget('cbQuietMode')
        cbQuietMode.set_active(settingsFromObject.quietMode)

        # Add dont-synchronization mode to form
        cbDontSynchronizeMode = self.__gladeXML.get_widget(
            'cbDontSynchronizeMode')
        cbDontSynchronizeMode.set_active(
            not settingsFromObject.synchronizePanes)

        # Add filenames to form
        # Remove old
        for vboxFilenameChildren in self.__vboxFilename.get_children():
            self.__vboxFilename.remove(vboxFilenameChildren)
        # End for

        # Add new
        if settingsFromObject.filename is not None:
            for filename in settingsFromObject.filename:
                self.__addFilenameItem(filename[0])
            # End for
        # End if

        # Add config settings to form
        # Remove old
        for vboxConfigSettingsChildren in self.__vboxConfigSettings.get_children(
        ):
            self.__vboxConfigSettings.remove(vboxConfigSettingsChildren)
        # End for

        # Add new
        if settingsFromObject.configSetting is not None:
            for configSetting in settingsFromObject.configSetting:
                self.__addConfigSettingItem(configSetting[0])
            # End for
        # End if

    # End def

    def __saveFormData(self):
        if not self.__settingSelected and self.__currentSelectedSetting is not None:
            # Get current setting
            setting = self.__serviceSettings[self.__currentSelectedSetting]

            # Gather settings from form
            valueArray = []

            # Set epoch time
            f = self.__gladeXML.get_widget('cbSetEpochTime')
            if f.get_active(): valueArray.append('-set')

            # New session
            f = self.__gladeXML.get_widget('cbNewSession')
            if f.get_active(): valueArray.append('-ns')

            # Quiet mode
            f = self.__gladeXML.get_widget('cbQuietMode')
            if f.get_active(): valueArray.append('-q')

            # Quiet mode
            f = self.__gladeXML.get_widget('cbDontSynchronizeMode')
            if f.get_active(): valueArray.append('-ds')

            # TMUX Session name
            f = self.__gladeXML.get_widget('fTMUXSessionName')
            if f.get_text().strip():
                valueArray.append('-ts "' + f.get_text().strip() + '"')

            # SSH user name
            f = self.__gladeXML.get_widget('fUser')
            if f.get_text().strip():
                valueArray.append('-u "' + f.get_text().strip() + '"')

            # Certificate / Identity
            f = self.__gladeXML.get_widget('fCertificateIdentity')
            if f.get_filename() is not None:
                valueArray.append('-c "' + f.get_filename() + '"')

            # Additional SSH arguments
            f = self.__gladeXML.get_widget('fAdditionalSSHArguments')
            if f.get_text().strip():
                valueArray.append('-sa "' + f.get_text().strip() + '"')

            # Server connection strings, -sc
            self.__addValuesFromVBox(valueArray, self.__vboxSC, '-sc')

            # Filenames with server connection strings, -f
            self.__addValuesFromVBox(valueArray, self.__vboxFilename, '-f')

            # Config settings -cs
            self.__addValuesFromVBox(valueArray, self.__vboxConfigSettings,
                                     '-cs')

            # Store to settings
            setting.setValue(' '.join(valueArray))
            self.__serviceSettings[self.__currentSelectedSetting] = setting

            # Save settings
            # already saved with [...]-__setitem__
            #self.__serviceSettings.save()
        # End if

    # End def

    def __addValuesFromVBox(self, valueArray, vbox, parameterShortcut):
        # Walk through all hbox children
        for childHBOX in vbox.get_children():
            # Get HBOX children
            childHBOXChildren = childHBOX.get_children()

            if len(childHBOXChildren) > 0:
                # Get second child of hbox, for it's the actually value
                f = childHBOXChildren[1]
                # Entry field
                if type(f) == gtk.Entry and f.get_text().strip():
                    valueArray.append(parameterShortcut + ' "' +
                                      f.get_text().strip() + '"')
                # FileChooseButton
                if type(f) == gtk.FileChooserButton and f.get_filename(
                ) is not None:
                    valueArray.append(parameterShortcut + ' "' +
                                      f.get_filename() + '"')
                # Combobox field
                if type(f) == gtk.ComboBoxEntry and f.get_active_text().strip(
                ):
                    valueArray.append(parameterShortcut + ' "' +
                                      f.get_active_text().strip() + '"')
            # End if
        # End for

    # End def

    def on_bAddSetting_clicked(self, view):
        settingName = EntryDlg(
            labeltext="Insert the name of the new setting:").Run()

        # Not empty, add config setting
        if settingName and settingName is not None:
            # Create and add setting
            setting = Setting()
            setting.setKey(settingName)
            setting.setValue('')

            self.__serviceSettings.add(setting)

            # Refresh list
            self.__updateGUI()

            # Set new item as selected
            self.__treeviewSettings.set_cursor(
                len(self.__liststoreSettings) - 1)
        # End if

    # End def

    def on_bEditSetting_clicked(self, view):
        # Get setting
        setting = self.__serviceSettings[self.__currentSelectedSetting]

        dlg = EntryDlg(labeltext="Insert the new name of the setting:",
                       defaultvalue=setting.getKey(),
                       parentWindow=self.__windowMain)
        settingName = dlg.Run()
        del dlg

        # Not empty, add config setting
        if settingName and settingName is not None:
            # Update setting
            setting.setKey(settingName)

            self.__serviceSettings[self.__currentSelectedSetting] = setting

            # Refresh list
            self.__updateGUI()
        # End if

    # End def

    def on_bRemoveSetting_clicked(self, view):
        # Get setting
        setting = self.__serviceSettings[self.__currentSelectedSetting]

        # Create and display confirm dialog
        dlg = gtk.MessageDialog(
            self.__windowMain, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION,
            gtk.BUTTONS_OK_CANCEL,
            u'Do you want to remove the config setting \'' + setting.getKey() +
            '\' ?')
        response = dlg.run()
        dlg.destroy()

        # Ok, delete setting
        if response == gtk.RESPONSE_OK:
            # Delete
            del self.__serviceSettings[self.__currentSelectedSetting]

            # Refresh list
            self.__updateGUI()
        # End if

    # End def

    def on_bRunSetting_clicked(self, view):
        self.__runSetting(self.__currentSelectedSetting)

    # End def

    def __addSCItem(self, value=""):
        # Create new Hbox
        hbox = gtk.HBox(False, 5)

        # Add label to hbox
        lLabel = gtk.Label('-sc')
        lLabel.set_property('width-request', 50)
        lLabel.set_property('xalign', 0)
        lLabel.show()
        hbox.pack_start(lLabel, False)

        # Add entry field to hbox
        fEntry = gtk.Entry()
        fEntry.set_text(value)
        fEntry.connect('focus-out-event', self.on_formitem_changed)
        fEntry.show()
        hbox.pack_start(fEntry)

        # Add remove button to hbox
        bRemove = gtk.Button('X')
        bRemove.connect('clicked', self.on_remove_item, self.__vboxSC, hbox)
        bRemove.show()
        hbox.pack_start(bRemove, False)

        # Show hbox
        hbox.show()

        self.__vboxSC.add(hbox)

        # Focus entry field
        if not value: fEntry.grab_focus()

    # End def

    def on_bAddSC_clicked(self, view):
        self.__addSCItem()

    # End def

    def on_remove_item(self, view, *data):
        # Remove hbox from vbox
        if len(data) > 0:
            vbox = data[0]
            hbox = data[1]

            vbox.remove(hbox)

            self.__saveFormData()
        # End if

    # End def

    def on_formitem_changed(self, *params):
        if not self.__settingSelected:
            self.__saveFormData()
        # End if

    # End def

    def __addFilenameItem(self, value=''):
        # Create new hbox
        hbox = gtk.HBox(False, 5)

        # Add label to hbox
        lLabel = gtk.Label('-f')
        lLabel.set_property('width-request', 50)
        lLabel.set_property('xalign', 0)
        lLabel.show()
        hbox.pack_start(lLabel, False)

        # Add entry field to hbox
        fFilename = gtk.FileChooserButton('File for -sc items')
        fFilename.set_filename(value)
        fFilename.connect('file-set', self.on_formitem_changed)
        fFilename.show()
        hbox.pack_start(fFilename)

        # Add remove button to hbox
        bRemove = gtk.Button('X')
        bRemove.connect('clicked', self.on_remove_item, self.__vboxFilename,
                        hbox)
        bRemove.show()
        hbox.pack_start(bRemove, False)

        # Show hbox
        hbox.show()

        self.__vboxFilename.add(hbox)

        # Focus file field
        if not value: fFilename.grab_focus()

    # End def

    def on_bAddFilename_clicked(self, view):
        self.__addFilenameItem()

    # End def

    def __addConfigSettingItem(self, value=''):
        # Create new hbox
        hbox = gtk.HBox(False, 5)

        # Add label to hbox
        lLabel = gtk.Label('-cs')
        lLabel.set_property('width-request', 50)
        lLabel.set_property('xalign', 0)
        lLabel.show()
        hbox.pack_start(lLabel, False)

        # Add entry field to hbox
        cbConfigSettings = gtk.combo_box_entry_new_text()
        cbConfigSettings.append_text('')
        cbConfigSettings.set_active(0)

        # Fill with available settings
        counter = 1
        for setting in self.__serviceSettings.yieldSettings():
            cbConfigSettings.append_text(setting.getKey())

            # Activate entry
            if setting.getKey() == value:
                cbConfigSettings.set_active(counter)
            # End f

            counter = counter + 1
        # End for

        cbConfigSettings.connect('changed', self.on_formitem_changed)
        cbConfigSettings.connect('focus-out-event', self.on_formitem_changed)
        cbConfigSettings.show()
        hbox.pack_start(cbConfigSettings)

        # Add remove button to hbox
        bRemove = gtk.Button('X')
        bRemove.connect('clicked', self.on_remove_item,
                        self.__vboxConfigSettings, hbox)
        bRemove.show()
        hbox.pack_start(bRemove, False)

        # Show hbox
        hbox.show()

        self.__vboxConfigSettings.add(hbox)

        # Focus entry field
        if not value: cbConfigSettings.grab_focus()

    # End def

    def on_bAddConfigSetting_clicked(self, view):
        self.__addConfigSettingItem()

    # End def

    def on_windowMain_window_state_event(self, view, event):
        self.__windowStateMaximized = (
            view.get_window().get_state()
            & gtk.gdk.WINDOW_STATE_MAXIMIZED) == gtk.gdk.WINDOW_STATE_MAXIMIZED

    # End def

    def on_windowMain_check_resize_event(self, *params):
        # Save size
        size = self.__windowMain.get_size()
        self.__config.set(Config.SECTION_WINDOW, Config.OPTION_WINDOW_SIZE_X,
                          size[0])
        self.__config.set(Config.SECTION_WINDOW, Config.OPTION_WINDOW_SIZE_Y,
                          size[1])

        # Save position
        position = self.__windowMain.get_position()
        self.__config.set(Config.SECTION_WINDOW,
                          Config.OPTION_WINDOW_POSITION_X, position[0])
        self.__config.set(Config.SECTION_WINDOW,
                          Config.OPTION_WINDOW_POSITION_Y, position[1])

    # End def

    def on_menuItemAdd_activate(self, view):
        self.on_bAddSetting_clicked(None)

    # End def

    def on_menuItemEdit_activate(self, view):
        self.on_bEditSetting_clicked(None)

    # End def

    def on_menuItemRemove_activate(self, view):
        self.on_bRemoveSetting_clicked(None)

    # End def

    def on_menuItemQuit_activate(self, view):
        self.__quit()

    # End def

    def on_menuItemAbout_activate(self, view):
        dlg = gtk.AboutDialog()
        dlg.set_name(environment.APP_NAME)
        dlg.set_version(environment.APP_VERSION)
        dlg.set_website(environment.APP_WEBSITE)
        dlg.set_authors(environment.AUTHOR_NAME)
        dlg.set_license(environment.APP_LICENSE_TEXT)
        dlg.run()
        dlg.destroy()
        del dlg

    # End def

    def on_systrayIcon_activate(self, icon):
        menu = gtk.Menu()

        for i in range(0, len(self.__serviceSettings)):
            # Get setting object
            settingEntry = self.__serviceSettings[i]

            # Create and add menu item
            item = gtk.MenuItem(settingEntry.getKey())
            item.set_use_underline(False)
            item.connect('activate', self.on_systrayIcon_setting_activate, i)
            item.show()

            menu.append(item)
        # End for

        menu.popup(None, None, None, 0, 0, self.__systrayIcon)

    # End def

    def on_systrayIcon_popup_menu(self, icon, eventButton, eventTime):
        menu = self.__gladeXML.get_widget('popmenuSystray')
        menu.popup(None, None, None, eventButton, eventTime,
                   self.__systrayIcon)

    # End def

    def on_systrayIcon_setting_activate(self, view, *params):
        self.__runSetting(params[0])

    # End def

    def on_menuitemShowHideMainwindow_activate(self, view):
        if self.__windowMain.props.visible:
            self.__windowMain.hide()
        else:
            self.__windowMain.show()
        # End if

        self.__config.set(Config.SECTION_WINDOW,
                          Config.OPTION_WINDOW_START_MINIMIZED,
                          not self.__windowMain.props.visible)

    # End def

    def on_bClearCertificateIdentity_clicked(self, view):
        fIdentity = self.__gladeXML.get_widget('fCertificateIdentity')

        if fIdentity.get_filename() is not None:
            fIdentity.unselect_filename(fIdentity.get_filename())
            self.__saveFormData()
        # End if

    # End def


# End class
Beispiel #9
0
from service.config import Config


app_conf = Config()
app_conf.setup()
Beispiel #10
0
 def __init__(self):
     super(Subtitle, self).__init__()
     self.url = "https://app.bilibili.com/bilibili.community.service.dm.v1.DM/DmView"
     self.config = Config()
Beispiel #11
0
class Subtitle(Service):
    def __init__(self):
        super(Subtitle, self).__init__()
        self.url = "https://app.bilibili.com/bilibili.community.service.dm.v1.DM/DmView"
        self.config = Config()

    def get_headers(self):
        headers = {
            "env": "prod",
            "app-key": "android",
            "user-agent": self.config.get_user_agent(),
            "x-bili-metadata-bin": self.config.get_metadata_bin(),
            "authorization": f"identify_v1 {self.config.auth}",
            "x-bili-device-bin": self.config.get_device_bin(),
            "x-bili-network-bin": self.config.get_network_bin(),
            "x-bili-restriction-bin": "",
            "x-bili-locale-bin": self.config.get_locale_bin(),
            "x-bili-fawkes-req-bin": self.config.get_fawkesreq_bin(),
            "content-type": "application/grpc",
            "accept-encoding": "gzip",
            "cookie": "bfe_id=; sid="
        }
        return headers

    def parse_payload(self, payload: bytes):
        # 用于测试解析抓包的payload
        msg = DmViewReq()
        msg.ParseFromString(self.slice_message(payload))
        return MessageToDict(msg)

    def parse_reply(self, resp: bytes):
        try:
            import json
            import pathlib
            from response.dmviewreply_pb2 import DmViewReply
        except Exception as e:
            return
        reply = DmViewReply()
        reply.ParseFromString(resp)
        path = pathlib.Path("subtitle_resp.json")
        # MessageToJson直接就是字符串了 但是中文会乱码 还是手动转一下
        text = json.dumps(MessageToDict(reply), ensure_ascii=False, indent=4)
        path.write_text(text, encoding="utf-8")

    def get_payload(self, pid: int, oid: int, stype: int = 1):
        msg = DmViewReq()
        msg.pid = pid
        msg.oid = oid
        msg.type = stype
        print(MessageToDict(msg))  # 可以输出检查一下
        return self.add_payload_header(msg.SerializeToString(),
                                       compressed=False)

    def request(self, pid: int, oid: int, stype: int = 1):
        headers = self.get_headers()
        payload = self.get_payload(pid, oid, stype)
        # print([hex(_)[2:].zfill(2).upper() for _ in list(payload)])
        try:
            r = requests.post(self.url,
                              data=payload,
                              headers=headers,
                              timeout=5)
        except Exception as e:
            print(f"error --> {e}")
            return
        resp = self.slice_message(r.content)
        self.parse_reply(resp)
        return resp
Beispiel #12
0
    def __init__(self):
        """Constructor"""

        # Initialize configs
        self.__config=Config()

        # Read glade file
        self.__gladeXML=gtk.glade.XML(environment.NAME_GLADE_XML_PATH+self.__NAME_MAIN_WINDOW_GLADE_XML)

        # Connect signals to self
        self.__gladeXML.signal_autoconnect(self)

        # Get treeview list for settings
        self.__treeviewSettings=self.__gladeXML.get_widget(self.__NAME_TREEVIEW_SETTINGS_LIST)

        # Create render for displaying the text
        renderer=gtk.CellRendererText()

        # Create column
        column=gtk.TreeViewColumn('Settings name/key', renderer)
        column.set_attributes(renderer, text=0)

        # Add column to list
        self.__treeviewSettings.append_column(column)

        # Create list
        self.__liststoreSettings=gtk.ListStore(str)

        # Add list to treeview list
        self.__treeviewSettings.set_model(self.__liststoreSettings)

        # Show main window
        self.__windowMain=self.__gladeXML.get_widget(self.__NAME_MAIN_WINDOW)

        # Size
        windowSizeX=self.__config.get(Config.SECTION_WINDOW, Config.OPTION_WINDOW_SIZE_X)
        windowSizeY=self.__config.get(Config.SECTION_WINDOW, Config.OPTION_WINDOW_SIZE_Y)

        if  windowSizeX is not None and windowSizeY is not None:
            self.__windowMain.resize(int(windowSizeX), (int(windowSizeY)))
        # End if

        # Position
        windowPositionX=self.__config.get(Config.SECTION_WINDOW, Config.OPTION_WINDOW_POSITION_X)
        windowPositionY=self.__config.get(Config.SECTION_WINDOW, Config.OPTION_WINDOW_POSITION_Y)

        if  windowPositionX is not None and windowPositionY is not None:
            self.__windowMain.move(int(windowPositionX), int(windowPositionY))
        # End if

        # Check, if window should be started minimized
        startMinimized=self.__config.getBool(Config.SECTION_WINDOW, Config.OPTION_WINDOW_START_MINIMIZED)

        if startMinimized is None or not startMinimized:
            # Set default value
            self.__config.set(Config.SECTION_WINDOW, Config.OPTION_WINDOW_START_MINIMIZED, False)
            # Show window
            self.__windowMain.show()
        # End if

        # Get several gui components
        # Menu items
        self.__miEdit=self.__gladeXML.get_widget('menuItemEdit')
        self.__miRemove=self.__gladeXML.get_widget('menuItemRemove')

        # Settings-list button area
        self.__bEditSetting=self.__gladeXML.get_widget(self.__NAME_BEDITSETTING)
        self.__bRemoveSetting=self.__gladeXML.get_widget(self.__NAME_BREMOVESETTING)
        self.__bRunSetting=self.__gladeXML.get_widget(self.__NAME_BRUNSETTING)

        # Form area
        self.__noneSelectedLabel=self.__gladeXML.get_widget(self.__NAME_NONE_SELECTED_LABEL)
        self.__settingsForm=self.__gladeXML.get_widget(self.__NAME_SETTINGS_FORM)

        # Boxes for server connection string -sc
        self.__vboxSC=self.__gladeXML.get_widget(self.__NAME_VBOX_SC)
        self.__vboxFilename=self.__gladeXML.get_widget(self.__NAME_VBOX_FILENAME)
        self.__vboxConfigSettings=self.__gladeXML.get_widget(self.__NAME_VBOX_CONFIGSETTINGS)

        # Create and setup systray-icon/.menu
        self.__systrayIcon=gtk.StatusIcon()
        self.__systrayIcon.set_from_stock(gtk.STOCK_ABOUT)
        self.__systrayIcon.connect('activate', self.on_systrayIcon_activate)
        self.__systrayIcon.connect('popup-menu', self.on_systrayIcon_popup_menu)
        self.__systrayIcon.set_title(environment.APP_NAME)
        self.__systrayIcon.set_tooltip(environment.APP_NAME)

        # Load settings
        self.__loadSettings()
Beispiel #13
0
class TMUXCSSHGUI:

    # Constant: Name of main window
    __NAME_MAIN_WINDOW_GLADE_XML = 'main.glade'
    __NAME_MAIN_WINDOW = 'windowMain'
    __NAME_BEDITSETTING = 'bEditSetting'
    __NAME_BRUNSETTING = 'bRunSetting'
    __NAME_BREMOVESETTING = 'bRemoveSetting'
    __NAME_NONE_SELECTED_LABEL = 'lChooseInfo'
    __NAME_SETTINGS_FORM = 'vboxSettingsForm'
    __NAME_VBOX_SC = 'vboxSC'
    __NAME_VBOX_FILENAME = 'vboxFilename'
    __NAME_VBOX_CONFIGSETTINGS = 'vboxConfigSettings'

    # Constant: Name of treeview list holding the settings
    __NAME_TREEVIEW_SETTINGS_LIST = 'treeviewSettings'

    __windowStateMaximized=False

    def __init__(self):
        """Constructor"""

        # Initialize configs
        self.__config=Config()

        # Read glade file
        self.__gladeXML=gtk.glade.XML(environment.NAME_GLADE_XML_PATH+self.__NAME_MAIN_WINDOW_GLADE_XML)

        # Connect signals to self
        self.__gladeXML.signal_autoconnect(self)

        # Get treeview list for settings
        self.__treeviewSettings=self.__gladeXML.get_widget(self.__NAME_TREEVIEW_SETTINGS_LIST)

        # Create render for displaying the text
        renderer=gtk.CellRendererText()

        # Create column
        column=gtk.TreeViewColumn('Settings name/key', renderer)
        column.set_attributes(renderer, text=0)

        # Add column to list
        self.__treeviewSettings.append_column(column)

        # Create list
        self.__liststoreSettings=gtk.ListStore(str)

        # Add list to treeview list
        self.__treeviewSettings.set_model(self.__liststoreSettings)

        # Show main window
        self.__windowMain=self.__gladeXML.get_widget(self.__NAME_MAIN_WINDOW)

        # Size
        windowSizeX=self.__config.get(Config.SECTION_WINDOW, Config.OPTION_WINDOW_SIZE_X)
        windowSizeY=self.__config.get(Config.SECTION_WINDOW, Config.OPTION_WINDOW_SIZE_Y)

        if  windowSizeX is not None and windowSizeY is not None:
            self.__windowMain.resize(int(windowSizeX), (int(windowSizeY)))
        # End if

        # Position
        windowPositionX=self.__config.get(Config.SECTION_WINDOW, Config.OPTION_WINDOW_POSITION_X)
        windowPositionY=self.__config.get(Config.SECTION_WINDOW, Config.OPTION_WINDOW_POSITION_Y)

        if  windowPositionX is not None and windowPositionY is not None:
            self.__windowMain.move(int(windowPositionX), int(windowPositionY))
        # End if

        # Check, if window should be started minimized
        startMinimized=self.__config.getBool(Config.SECTION_WINDOW, Config.OPTION_WINDOW_START_MINIMIZED)

        if startMinimized is None or not startMinimized:
            # Set default value
            self.__config.set(Config.SECTION_WINDOW, Config.OPTION_WINDOW_START_MINIMIZED, False)
            # Show window
            self.__windowMain.show()
        # End if

        # Get several gui components
        # Menu items
        self.__miEdit=self.__gladeXML.get_widget('menuItemEdit')
        self.__miRemove=self.__gladeXML.get_widget('menuItemRemove')

        # Settings-list button area
        self.__bEditSetting=self.__gladeXML.get_widget(self.__NAME_BEDITSETTING)
        self.__bRemoveSetting=self.__gladeXML.get_widget(self.__NAME_BREMOVESETTING)
        self.__bRunSetting=self.__gladeXML.get_widget(self.__NAME_BRUNSETTING)

        # Form area
        self.__noneSelectedLabel=self.__gladeXML.get_widget(self.__NAME_NONE_SELECTED_LABEL)
        self.__settingsForm=self.__gladeXML.get_widget(self.__NAME_SETTINGS_FORM)

        # Boxes for server connection string -sc
        self.__vboxSC=self.__gladeXML.get_widget(self.__NAME_VBOX_SC)
        self.__vboxFilename=self.__gladeXML.get_widget(self.__NAME_VBOX_FILENAME)
        self.__vboxConfigSettings=self.__gladeXML.get_widget(self.__NAME_VBOX_CONFIGSETTINGS)

        # Create and setup systray-icon/.menu
        self.__systrayIcon=gtk.StatusIcon()
        self.__systrayIcon.set_from_stock(gtk.STOCK_ABOUT)
        self.__systrayIcon.connect('activate', self.on_systrayIcon_activate)
        self.__systrayIcon.connect('popup-menu', self.on_systrayIcon_popup_menu)
        self.__systrayIcon.set_title(environment.APP_NAME)
        self.__systrayIcon.set_tooltip(environment.APP_NAME)

        # Load settings
        self.__loadSettings()
    # End def

    def __loadSettings(self):
        # Initialize settings-service-object
        self.__serviceSettings=Settings()

        # Update settings list in gui
        self.__updateGUISettingsList()
    # End def

    def __updateGUISettingsList(self):
        # Reset internal selection
        self.__currentSelectedSetting=None

        # Clear list
        self.__liststoreSettings.clear()

        # Insert items
        for settingEntry in self.__serviceSettings.yieldSettings():
            self.__liststoreSettings.append([settingEntry.getKey()])
        # End for
    # End def

    def __updateGUI(self):
        # Update list
        self.__updateGUISettingsList()

        # Form area
        self.__switchFormVisibility()
    # End def

    def on_destroy(self, object):
        # Call quit
        self.__quit()
    # End def

    def __quit(self):
        # Actually quit
        gtk.main_quit()
    # End def

    def __runSetting(self, position):
        cmnd=self.__config.get(Config.SECTION_TERMINAL, Config.OPTION_TERMINAL_COMMAND)
        params=self.__config.get(Config.SECTION_TERMINAL, Config.OPTION_TERMINAL_PARAMETER)

        if cmnd is None and params is None:
            cmnd=environment.TERMINAL_EMULATOR_CMND
            self.__config.set(Config.SECTION_TERMINAL, Config.OPTION_TERMINAL_COMMAND, cmnd)

            params=environment.TERMINAL_EMULATOR_PARAMETER
            self.__config.set(Config.SECTION_TERMINAL, Config.OPTION_TERMINAL_PARAMETER, params)

            dlg=gtk.MessageDialog(self.__windowMain, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK,
                u'Terminal-Emulator-Command not set yet. Edit the config-file ('+environment.APP_CONFIG_FILE+'). Setting default.')
            dlg.run()
            dlg.destroy()
        # End if

        # Command and parameters available
        if cmnd and params:
            setting=self.__serviceSettings[position];

            subprocess.Popen(cmnd+' '+params+' "'+environment.TMUX_CSSH_COMMAND+' '+setting.getValue()+'" ', shell=True)
        # End if

    # End def

    def on_treeviewSettings_cursor_changed(self, treeviewObject):
        self.__settingSelected=True

        # Get selected rows from treeview object
        selectedRows=treeviewObject.get_selection().get_selected_rows()[1]

        # Clear current settings selection
        self.__currentSelectedSetting=None

        if len(selectedRows)>0:
            # Get selected row number for settings-object
            selectedRow=selectedRows[0][0]

            # Fill form
            if selectedRow>=0 and selectedRow<len(self.__serviceSettings):
                self.__currentSelectedSetting=selectedRow
                self.__showFormFromSettingsObject(self.__serviceSettings[selectedRow])
            else:
                self.__showFormFromSettingsObject(None)
            # End if
        # End if

        self.__settingSelected=False
    # End def

    def on_treeviewSettings_row_activated(self, *params):
        self.__runSetting(self.__currentSelectedSetting)
    # End def

    def __switchFormVisibility(self):
        # Setting activated in list
        if self.__currentSelectedSetting is None:
            # Menu items
            self.__miEdit.set_sensitive(False)
            self.__miRemove.set_sensitive(False)

            # Button area in Settings-List
            self.__bEditSetting.set_sensitive(False)
            self.__bRemoveSetting.set_sensitive(False)
            self.__bRunSetting.set_sensitive(False)

            # Form area
            self.__noneSelectedLabel.show()
            self.__settingsForm.hide()
        # No setting activated
        else:
            # Menu items
            self.__miEdit.set_sensitive(True)
            self.__miRemove.set_sensitive(True)

            # Button area in Settings-List
            self.__bEditSetting.set_sensitive(True)
            self.__bRemoveSetting.set_sensitive(True)
            self.__bRunSetting.set_sensitive(True)

            # Form area
            self.__noneSelectedLabel.hide()
            self.__settingsForm.show()
        # End if
    # End def

    def __showFormFromSettingsObject(self, settingObject):
        # Switch form visibility
        self.__switchFormVisibility()

        # Get array with parsed settings from setting object
        settingsFromObject=self.__serviceSettings.getParsedParametersFromSettingObject(settingObject=settingObject)

        # Add user to form
        fUser=self.__gladeXML.get_widget('fUser')
        fUser.set_text(settingsFromObject.user[0].strip() if settingsFromObject.user is not None else '')

        # Add certificate/identity to form
        fIdentity=self.__gladeXML.get_widget('fCertificateIdentity')
        if fIdentity.get_filename() is not None:
            fIdentity.unselect_filename(fIdentity.get_filename())
        # End if

        if settingsFromObject.certificateIdentity is not None:
            fIdentity.set_filename(settingsFromObject.certificateIdentity[0])
        # End if

        # Add server connection strings to form
        # Remove old
        for vboxSCChildren in self.__vboxSC.get_children():
            self.__vboxSC.remove(vboxSCChildren)
        # End for

        # Add new
        if settingsFromObject.sshConnectString is not None:
            for serverConnectionString in settingsFromObject.sshConnectString:
                self.__addSCItem(serverConnectionString[0])
            # End for
        # End if

        # Add additional ssh args to form
        fAdditionalSSHArguments=self.__gladeXML.get_widget('fAdditionalSSHArguments')
        fAdditionalSSHArguments.set_text(settingsFromObject.additionalSSHArgs[0].strip() if settingsFromObject.additionalSSHArgs is not None else '')

        # Add TMUX Session name to form
        fTMUXSessionName=self.__gladeXML.get_widget('fTMUXSessionName')
        fTMUXSessionName.set_text(settingsFromObject.tmuxSessionName[0].strip() if settingsFromObject.tmuxSessionName is not None else '')

        # Add Epoch time to form
        cbSetEpochTime=self.__gladeXML.get_widget('cbSetEpochTime')
        cbSetEpochTime.set_active(settingsFromObject.setEpochTime)

        # Add new session to form
        cbNewSession=self.__gladeXML.get_widget('cbNewSession')
        cbNewSession.set_active(settingsFromObject.newSession)

        # Add quiet mode to form
        cbQuietMode=self.__gladeXML.get_widget('cbQuietMode')
        cbQuietMode.set_active(settingsFromObject.quietMode)

        # Add dont-synchronization mode to form
        cbDontSynchronizeMode=self.__gladeXML.get_widget('cbDontSynchronizeMode')
        cbDontSynchronizeMode.set_active(not settingsFromObject.synchronizePanes)

        # Add filenames to form
        # Remove old
        for vboxFilenameChildren in self.__vboxFilename.get_children():
            self.__vboxFilename.remove(vboxFilenameChildren)
        # End for

        # Add new
        if settingsFromObject.filename is not None:
            for filename in settingsFromObject.filename:
                self.__addFilenameItem(filename[0])
            # End for
        # End if

        # Add config settings to form
        # Remove old
        for vboxConfigSettingsChildren in self.__vboxConfigSettings.get_children():
            self.__vboxConfigSettings.remove(vboxConfigSettingsChildren)
        # End for

        # Add new
        if settingsFromObject.configSetting is not None:
            for configSetting in settingsFromObject.configSetting:
                self.__addConfigSettingItem(configSetting[0])
            # End for
        # End if
    # End def

    def __saveFormData(self):
        if not self.__settingSelected and self.__currentSelectedSetting is not None:
            # Get current setting
            setting=self.__serviceSettings[self.__currentSelectedSetting]

            # Gather settings from form
            valueArray=[]

            # Set epoch time
            f=self.__gladeXML.get_widget('cbSetEpochTime')
            if f.get_active(): valueArray.append('-set')

            # New session
            f=self.__gladeXML.get_widget('cbNewSession')
            if f.get_active(): valueArray.append('-ns')

            # Quiet mode
            f=self.__gladeXML.get_widget('cbQuietMode')
            if f.get_active(): valueArray.append('-q')

            # Quiet mode
            f=self.__gladeXML.get_widget('cbDontSynchronizeMode')
            if f.get_active(): valueArray.append('-ds')

            # TMUX Session name
            f=self.__gladeXML.get_widget('fTMUXSessionName')
            if f.get_text().strip(): valueArray.append('-ts "'+f.get_text().strip()+'"')

            # SSH user name
            f=self.__gladeXML.get_widget('fUser')
            if f.get_text().strip(): valueArray.append('-u "'+f.get_text().strip()+'"')

            # Certificate / Identity
            f=self.__gladeXML.get_widget('fCertificateIdentity')
            if f.get_filename() is not None: valueArray.append('-c "'+f.get_filename()+'"')

            # Additional SSH arguments
            f=self.__gladeXML.get_widget('fAdditionalSSHArguments')
            if f.get_text().strip(): valueArray.append('-sa "'+f.get_text().strip()+'"')

            # Server connection strings, -sc
            self.__addValuesFromVBox(valueArray, self.__vboxSC, '-sc')

            # Filenames with server connection strings, -f
            self.__addValuesFromVBox(valueArray, self.__vboxFilename, '-f')

            # Config settings -cs
            self.__addValuesFromVBox(valueArray, self.__vboxConfigSettings, '-cs')

            # Store to settings
            setting.setValue(' '.join(valueArray))
            self.__serviceSettings[self.__currentSelectedSetting]=setting

            # Save settings
            # already saved with [...]-__setitem__
            #self.__serviceSettings.save()
        # End if
    # End def

    def __addValuesFromVBox(self, valueArray, vbox, parameterShortcut):
        # Walk through all hbox children
        for childHBOX in vbox.get_children():
            # Get HBOX children
            childHBOXChildren=childHBOX.get_children()

            if len(childHBOXChildren)>0:
                # Get second child of hbox, for it's the actually value
                f=childHBOXChildren[1]
                # Entry field
                if type(f)==gtk.Entry and f.get_text().strip(): valueArray.append(parameterShortcut+' "'+f.get_text().strip()+'"')
                # FileChooseButton
                if type(f)==gtk.FileChooserButton and f.get_filename() is not None: valueArray.append(parameterShortcut+' "'+f.get_filename()+'"')
                # Combobox field
                if type(f)==gtk.ComboBoxEntry and f.get_active_text().strip(): valueArray.append(parameterShortcut+' "'+f.get_active_text().strip()+'"')
            # End if
        # End for
    # End def

    def on_bAddSetting_clicked(self, view):
        settingName=EntryDlg(labeltext="Insert the name of the new setting:").Run()

        # Not empty, add config setting
        if settingName and settingName is not None:
            # Create and add setting
            setting=Setting()
            setting.setKey(settingName)
            setting.setValue('')

            self.__serviceSettings.add(setting)

            # Refresh list
            self.__updateGUI()

            # Set new item as selected
            self.__treeviewSettings.set_cursor(len(self.__liststoreSettings)-1)
        # End if
    # End def

    def on_bEditSetting_clicked(self, view):
        # Get setting
        setting=self.__serviceSettings[self.__currentSelectedSetting];

        dlg=EntryDlg(labeltext="Insert the new name of the setting:", defaultvalue=setting.getKey(), parentWindow=self.__windowMain)
        settingName=dlg.Run()
        del dlg

        # Not empty, add config setting
        if settingName and settingName is not None:
            # Update setting
            setting.setKey(settingName)

            self.__serviceSettings[self.__currentSelectedSetting]=setting

            # Refresh list
            self.__updateGUI()
        # End if
    # End def

    def on_bRemoveSetting_clicked(self, view):
        # Get setting
        setting=self.__serviceSettings[self.__currentSelectedSetting];

        # Create and display confirm dialog
        dlg=gtk.MessageDialog(self.__windowMain, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_OK_CANCEL, u'Do you want to remove the config setting \''+setting.getKey()+'\' ?')
        response=dlg.run()
        dlg.destroy()

        # Ok, delete setting
        if response==gtk.RESPONSE_OK:
            # Delete
            del self.__serviceSettings[self.__currentSelectedSetting]

            # Refresh list
            self.__updateGUI()
        # End if
    # End def

    def on_bRunSetting_clicked(self, view):
        self.__runSetting(self.__currentSelectedSetting)
    # End def

    def __addSCItem(self, value=""):
        # Create new Hbox
        hbox=gtk.HBox(False, 5)

        # Add label to hbox
        lLabel=gtk.Label('-sc')
        lLabel.set_property('width-request', 50)
        lLabel.set_property('xalign', 0)
        lLabel.show()
        hbox.pack_start(lLabel, False)

        # Add entry field to hbox
        fEntry=gtk.Entry()
        fEntry.set_text(value)
        fEntry.connect('focus-out-event', self.on_formitem_changed)
        fEntry.show()
        hbox.pack_start(fEntry)

        # Add remove button to hbox
        bRemove=gtk.Button('X')
        bRemove.connect('clicked', self.on_remove_item, self.__vboxSC, hbox)
        bRemove.show();
        hbox.pack_start(bRemove, False)

        # Show hbox
        hbox.show()

        self.__vboxSC.add(hbox)

        # Focus entry field
        if not value: fEntry.grab_focus()
    # End def

    def on_bAddSC_clicked(self, view):
        self.__addSCItem()
    # End def

    def on_remove_item(self, view, *data):
        # Remove hbox from vbox
        if len(data)>0:
            vbox=data[0]
            hbox=data[1]

            vbox.remove(hbox)

            self.__saveFormData()
        # End if
    # End def

    def on_formitem_changed(self, *params):
        if not self.__settingSelected:
            self.__saveFormData()
        # End if
    # End def

    def __addFilenameItem(self, value=''):
        # Create new hbox
        hbox=gtk.HBox(False, 5)

        # Add label to hbox
        lLabel=gtk.Label('-f')
        lLabel.set_property('width-request', 50)
        lLabel.set_property('xalign', 0)
        lLabel.show()
        hbox.pack_start(lLabel, False)

        # Add entry field to hbox
        fFilename=gtk.FileChooserButton('File for -sc items')
        fFilename.set_filename(value)
        fFilename.connect('file-set', self.on_formitem_changed)
        fFilename.show()
        hbox.pack_start(fFilename)

        # Add remove button to hbox
        bRemove=gtk.Button('X')
        bRemove.connect('clicked', self.on_remove_item, self.__vboxFilename, hbox)
        bRemove.show();
        hbox.pack_start(bRemove, False)

        # Show hbox
        hbox.show()

        self.__vboxFilename.add(hbox)

        # Focus file field
        if not value: fFilename.grab_focus()
    # End def

    def on_bAddFilename_clicked(self, view):
        self.__addFilenameItem()
    # End def

    def __addConfigSettingItem(self, value=''):
        # Create new hbox
        hbox=gtk.HBox(False, 5)

        # Add label to hbox
        lLabel=gtk.Label('-cs')
        lLabel.set_property('width-request', 50)
        lLabel.set_property('xalign', 0)
        lLabel.show()
        hbox.pack_start(lLabel, False)

        # Add entry field to hbox
        cbConfigSettings=gtk.combo_box_entry_new_text()
        cbConfigSettings.append_text('')
        cbConfigSettings.set_active(0)

        # Fill with available settings
        counter=1
        for setting in self.__serviceSettings.yieldSettings():
            cbConfigSettings.append_text(setting.getKey())

            # Activate entry
            if setting.getKey()==value:
                cbConfigSettings.set_active(counter)
            # End f

            counter=counter+1
        # End for

        cbConfigSettings.connect('changed', self.on_formitem_changed)
        cbConfigSettings.connect('focus-out-event', self.on_formitem_changed)
        cbConfigSettings.show()
        hbox.pack_start(cbConfigSettings)

        # Add remove button to hbox
        bRemove=gtk.Button('X')
        bRemove.connect('clicked', self.on_remove_item, self.__vboxConfigSettings, hbox)
        bRemove.show();
        hbox.pack_start(bRemove, False)

        # Show hbox
        hbox.show()

        self.__vboxConfigSettings.add(hbox)

        # Focus entry field
        if not value: cbConfigSettings.grab_focus()
    # End def

    def on_bAddConfigSetting_clicked(self, view):
        self.__addConfigSettingItem()
    # End def

    def on_windowMain_window_state_event(self, view, event):
        self.__windowStateMaximized=(view.get_window().get_state() & gtk.gdk.WINDOW_STATE_MAXIMIZED)==gtk.gdk.WINDOW_STATE_MAXIMIZED
    # End def

    def on_windowMain_check_resize_event(self, *params):
        # Save size
        size=self.__windowMain.get_size()
        self.__config.set(Config.SECTION_WINDOW, Config.OPTION_WINDOW_SIZE_X, size[0])
        self.__config.set(Config.SECTION_WINDOW, Config.OPTION_WINDOW_SIZE_Y, size[1])

        # Save position
        position=self.__windowMain.get_position()
        self.__config.set(Config.SECTION_WINDOW, Config.OPTION_WINDOW_POSITION_X, position[0])
        self.__config.set(Config.SECTION_WINDOW, Config.OPTION_WINDOW_POSITION_Y, position[1])
    # End def

    def on_menuItemAdd_activate(self, view):
        self.on_bAddSetting_clicked(None)
    # End def

    def on_menuItemEdit_activate(self, view):
        self.on_bEditSetting_clicked(None)
    # End def

    def on_menuItemRemove_activate(self, view):
        self.on_bRemoveSetting_clicked(None)
    # End def

    def on_menuItemQuit_activate(self, view):
        self.__quit()
    # End def

    def on_menuItemAbout_activate(self, view):
        dlg=gtk.AboutDialog()
        dlg.set_name(environment.APP_NAME)
        dlg.set_version(environment.APP_VERSION)
        dlg.set_website(environment.APP_WEBSITE)
        dlg.set_authors(environment.AUTHOR_NAME)
        dlg.set_license(environment.APP_LICENSE_TEXT)
        dlg.run()
        dlg.destroy()
        del dlg
    # End def

    def on_systrayIcon_activate(self, icon):
        menu=gtk.Menu()

        for i in range(0, len(self.__serviceSettings)):
            # Get setting object
            settingEntry=self.__serviceSettings[i]

            # Create and add menu item
            item=gtk.MenuItem(settingEntry.getKey())
            item.set_use_underline(False)
            item.connect('activate', self.on_systrayIcon_setting_activate, i)
            item.show()

            menu.append(item)
        # End for

        menu.popup(None, None, None, 0, 0, self.__systrayIcon)
    # End def

    def on_systrayIcon_popup_menu(self, icon, eventButton, eventTime):
        menu=self.__gladeXML.get_widget('popmenuSystray')
        menu.popup(None, None, None, eventButton, eventTime, self.__systrayIcon)
    # End def

    def on_systrayIcon_setting_activate(self, view, *params):
        self.__runSetting(params[0])
    # End def

    def on_menuitemShowHideMainwindow_activate(self, view):
        if self.__windowMain.props.visible:
            self.__windowMain.hide()
        else:
            self.__windowMain.show()
        # End if

        self.__config.set(Config.SECTION_WINDOW, Config.OPTION_WINDOW_START_MINIMIZED, not self.__windowMain.props.visible)
    # End def

    def on_bClearCertificateIdentity_clicked(self, view):
        fIdentity=self.__gladeXML.get_widget('fCertificateIdentity')

        if fIdentity.get_filename() is not None:
            fIdentity.unselect_filename(fIdentity.get_filename())
            self.__saveFormData()
        # End if
    # End def

# End class
Beispiel #14
0
 def __init__(self):
     super(Video, self).__init__()
     self.url = "https://grpc.biliapi.net/bilibili.pgc.gateway.player.v1.PlayURL/PlayView"
     self.config = Config()
Beispiel #15
0
class Video(Service):
    def __init__(self):
        super(Video, self).__init__()
        self.url = "https://grpc.biliapi.net/bilibili.pgc.gateway.player.v1.PlayURL/PlayView"
        self.config = Config()

    def get_headers(self):
        headers = {
            "user-agent": self.config.get_user_agent(),
            "content-type": "application/grpc",
            "te": "trailers",
            "x-bili-fawkes-req-bin": self.config.get_fawkesreq_bin(),
            "x-bili-metadata-bin": self.config.get_metadata_bin(),
            "authorization": f"identify_v1 {self.config.auth}",
            "x-bili-device-bin": self.config.get_device_bin(),
            "x-bili-network-bin": self.config.get_network_bin(),
            "x-bili-restriction-bin": "",
            "x-bili-locale-bin": self.config.get_locale_bin(),
            "grpc-encoding": "gzip",
            "grpc-accept-encoding": "identity,gzip",
            "grpc-timeout": "17985446u"  # u指微秒 -> us
        }
        return headers

    def get_payload(self, epid: int, cid: int, qn: int = 112, **kwargs):
        # 为0或者False 不做操作
        msg = PlayViewReq()
        msg.epId = epid
        msg.cid = cid
        msg.qn = qn
        # msg.fnver = kwargs["fnver"] if kwargs.get("fnver") else 0
        msg.fnval = kwargs["fnval"] if kwargs.get("fnval") else 16
        # msg.download = kwargs["download"] if kwargs.get("download") else 0
        # msg.forceHost = kwargs["forceHost"] if kwargs.get("forceHost") else 0
        msg.fourk = kwargs["fourk"] if kwargs.get("fourk") else True
        msg.spmid = kwargs["spmid"] if kwargs.get(
            "spmid") else "pgc.pgc-video-detail.0.0"
        msg.fromSpmid = kwargs["fromSpmid"] if kwargs.get(
            "fromSpmid") else "search.search-result.0.0"
        # msg.teenagersMode = kwargs["teenagersMode"] if kwargs.get("teenagersMode") else 0
        msg.preferCodecType = kwargs["preferCodecType"] if kwargs.get(
            "preferCodecType") else 2
        msg.isPreview = kwargs["isPreview"] if kwargs.get(
            "isPreview") else False  # type: bool
        # msg.roomId = kwargs["roomId"] if kwargs.get("roomId") else 0
        # print(MessageToDict(msg)) # 可以输出检查一下
        return self.add_payload_header(self.gzip_compress_proto_message(msg))

    def parse_reply(self, resp: bytes):
        try:
            import json
            import pathlib
            from response.playviewreply_pb2 import PlayViewReply
        except Exception as e:
            return
        reply = PlayViewReply()
        reply.ParseFromString(resp)
        path = pathlib.Path("video_resp.json")
        # MessageToJson直接就是字符串了 但是中文会乱码 还是手动转一下
        text = json.dumps(MessageToDict(reply), ensure_ascii=False, indent=4)
        path.write_text(text, encoding="utf-8")

    def parse_payload(self, payload: bytes):
        # 用于测试解析抓包的payload
        payload = self.slice_message(payload)
        msg = PlayViewReq()
        msg.ParseFromString(payload)
        return MessageToDict(msg)

    def request(self, epid: int, cid: int, qn: int = 112):
        headers = self.get_headers()
        payload = self.get_payload(epid, cid, qn)
        try:
            r = requests.post(self.url,
                              data=payload,
                              headers=headers,
                              timeout=5)
        except Exception as e:
            print(f"error --> {e}")
            return
        # print(r.content)
        resp = self.slice_message(r.content)
        self.parse_reply(resp)
        return resp