diff options
author | Philipp Hörist <philipp@hoerist.com> | 2023-05-29 01:04:44 +0300 |
---|---|---|
committer | Philipp Hörist <philipp@hoerist.com> | 2023-05-29 12:43:30 +0300 |
commit | ae5ac2d3a1d582b586d58a2408dab095e3c398ff (patch) | |
tree | 4a1b61f4fd5aa86a30e65ac6cae01143ec9c4bdb /gajim/remote.py | |
parent | bbc6c55d85362de5cbc2aab65680e9525518443f (diff) |
refactor: Rename main application entry points
Diffstat (limited to 'gajim/remote.py')
-rw-r--r-- | gajim/remote.py | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/gajim/remote.py b/gajim/remote.py new file mode 100644 index 000000000..521477b54 --- /dev/null +++ b/gajim/remote.py @@ -0,0 +1,156 @@ +# This file is part of Gajim. +# +# Gajim is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published +# by the Free Software Foundation; version 3 only. +# +# Gajim is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Gajim. If not, see <http://www.gnu.org/licenses/>. + +from typing import Any + +import argparse +import logging +import sys + +from gi.repository import Gio +from gi.repository import GLib + +LOG_FORMAT = '%(asctime)s %(levelname)s %(message)s' +logging.basicConfig(level=logging.INFO, format=LOG_FORMAT) +log = logging.getLogger() + + +OBJ_PATH = '/org/gajim/dbus/RemoteObject' +INTERFACE = 'org.gajim.dbus.RemoteInterface' +SERVICE = 'org.gajim.Gajim' + +SIGNATURES = { + 'list_contacts': '(s)', + 'list_accounts': '()', + 'change_status': '(sss)', + 'send_chat_message': '(sss)', + 'send_groupchat_message': '(sss)', + 'account_info': '(s)', + 'get_status': '(s)', + 'get_status_message': '(s)', + 'get_unread_msgs_number': '()', +} + + +def call_method(args: argparse.Namespace) -> Any: + arg_dict = vars(args) + app_id = arg_dict.pop('app_id') + command = arg_dict.pop('command') + + proxy = Gio.DBusProxy.new_for_bus_sync( + Gio.BusType.SESSION, + Gio.DBusProxyFlags.NONE, + None, + app_id, + OBJ_PATH, + INTERFACE, + None) + + arguments = tuple(arg_dict.values()) + signature = SIGNATURES[command] + method = getattr(proxy, command) + return method(signature, *arguments) + + +def create_arg_parser() -> argparse.ArgumentParser: + + account_help = 'The account the command is executed for' + + parser = argparse.ArgumentParser(prog='gajim-remote') + parser.add_argument('--app-id', default=SERVICE) + + subparsers = parser.add_subparsers(required=True, + metavar='commands', + dest='command') + + subparser = subparsers.add_parser( + 'list_contacts', + help='Get all roster contacts') + subparser.add_argument('account', type=str) + + subparser = subparsers.add_parser( + 'list_accounts', + help='Get the list of accounts') + + subparser = subparsers.add_parser( + 'change_status', + help='Change the status') + subparser.add_argument('status', + choices=['offline', 'online', 'away', 'xa', 'dnd']) + subparser.add_argument('message', type=str) + subparser.add_argument('account', type=str) + + subparser = subparsers.add_parser( + 'send_chat_message', + help='Send a chat message to a contact') + subparser.add_argument('address', type=str, + help='The XMPP address of the contact') + subparser.add_argument('message', type=str, + help='The message to be sent') + subparser.add_argument('account', type=str, + help=account_help) + + subparser = subparsers.add_parser( + 'send_groupchat_message', + help='Send a chat message to a group chat') + subparser.add_argument('address', type=str, + help='The XMPP address of the group chat') + subparser.add_argument('message', type=str, + help='The message to be sent') + subparser.add_argument('account', type=str, + help=account_help) + + subparser = subparsers.add_parser( + 'account_info', + help='Get account details') + subparser.add_argument('account', type=str, help=account_help) + + subparser = subparsers.add_parser( + 'get_status', + help='Get the current status') + subparser.add_argument('account', type=str, help=account_help) + + subparser = subparsers.add_parser( + 'get_status_message', + help='Get the current status message') + subparser.add_argument('account', type=str, help=account_help) + + subparser = subparsers.add_parser( + 'get_unread_msgs_number', + help='Get the unread message count') + + return parser + + +def run() -> None: + args = create_arg_parser().parse_args() + try: + result = call_method(args) + except GLib.Error as error: + quark = GLib.quark_try_string('g-dbus-error-quark') + if error.matches(quark, Gio.DBusError.SERVICE_UNKNOWN): + log.error('Service not found. Check if Gajim is running. ' + 'If Gajim is running under a custom profile use ' + '--app-id=org.gajim.Gajim.myprofilename') + + else: + log.exception('Failed to execute method') + + sys.exit(1) + + except Exception: + log.exception('Failed to execute method') + sys.exit(1) + + print(result) |