diff --git a/gajim/common/modules/contacts.py b/gajim/common/modules/contacts.py index 0a0feb2321656e36e1ed193435c3fcdc8f5dbdfd..394bed214174272556c36748a887a14e8c6bc585 100644 --- a/gajim/common/modules/contacts.py +++ b/gajim/common/modules/contacts.py @@ -37,6 +37,8 @@ from gajim.common import types from gajim.common.const import PresenceShowExt from gajim.common.const import SimpleClientState +from gajim.common.setting_values import BoolContactSettings +from gajim.common.setting_values import StringContactSettings from gajim.common.setting_values import BoolGroupChatSettings from gajim.common.setting_values import IntGroupChatSettings from gajim.common.setting_values import StringGroupChatSettings @@ -52,8 +54,26 @@ class ContactSettings: def __init__(self, account: str, jid: JID) -> None: - self.get = partial(app.settings.get_contact_setting, account, jid) - self.set = partial(app.settings.set_contact_setting, account, jid) + self._account = account + self._jid = jid + + @overload + def get(self, setting: StringContactSettings) -> str: ... # noqa: E704 + @overload + def get(self, setting: BoolContactSettings) -> bool: ... # noqa: E704 + + def get(self, setting: Any) -> Any: + return app.settings.get_contact_setting( + self._account, self._jid, setting) + + @overload + def set(self, setting: StringContactSettings, value: str) -> None: ... # noqa: E501, E704 + @overload + def set(self, setting: BoolContactSettings, value: bool) -> None: ... # noqa: E501, E704 + + def set(self, setting: Any, value: Any) -> None: + app.settings.set_contact_setting( + self._account, self._jid, setting, value) class GroupChatSettings: diff --git a/gajim/common/setting_values.py b/gajim/common/setting_values.py index 7d99e297b0b112bd36a5f48cc7cc8d028adefeff..74d49fae04c3a4ea4126142f9e2fd9d277ac49fb 100644 --- a/gajim/common/setting_values.py +++ b/gajim/common/setting_values.py @@ -405,6 +405,23 @@ class _ACCOUNT_DEFAULT: AllGroupChatSettingsT = Union[str, int, bool] + +BoolContactSettings = Literal[ + 'send_marker', +] + +StringContactSettings = Literal[ + 'encryption', + 'speller_language', + 'send_chatstate', +] + +AllContactSettings = Literal[BoolContactSettings, + StringContactSettings] + +AllContactSettingsT = Union[str, bool] + + ACCOUNT_SETTINGS = { 'account': { 'account_color': 'rgb(85, 85, 85)', diff --git a/gajim/common/settings.py b/gajim/common/settings.py index 60999c3b5a7e2eaee7a61f57acc54a8769e83cbe..c8ef00479ff482ad74dc28c0a29ef3fb9f34eb57 100644 --- a/gajim/common/settings.py +++ b/gajim/common/settings.py @@ -45,6 +45,10 @@ from gajim.common.storage.base import Encoder from gajim.common.storage.base import json_decoder from gajim.common.setting_values import APP_SETTINGS +from gajim.common.setting_values import AllContactSettings +from gajim.common.setting_values import AllContactSettingsT +from gajim.common.setting_values import BoolContactSettings +from gajim.common.setting_values import StringContactSettings from gajim.common.setting_values import AllGroupChatSettings from gajim.common.setting_values import AllGroupChatSettingsT from gajim.common.setting_values import BoolGroupChatSettings @@ -923,10 +927,27 @@ def set_group_chat_settings(self, continue self.set_group_chat_setting(account, jid, setting, value) + @overload def get_contact_setting(self, account: str, jid: JID, - setting: str) -> SETTING_TYPE: + setting: BoolContactSettings + ) -> bool: + ... + + @overload + def get_contact_setting(self, + account: str, + jid: JID, + setting: StringContactSettings + ) -> str: + ... + + def get_contact_setting(self, + account: str, + jid: JID, + setting: AllContactSettings + ) -> AllContactSettingsT: if account not in self._account_settings: raise ValueError(f'Account missing: {account}') @@ -946,11 +967,27 @@ def get_contact_setting(self, return default + @overload def set_contact_setting(self, account: str, jid: JID, - setting: str, - value: SETTING_TYPE) -> None: + setting: StringContactSettings, + value: str) -> None: + ... + + @overload + def set_contact_setting(self, + account: str, + jid: JID, + setting: BoolContactSettings, + value: bool) -> None: + ... + + def set_contact_setting(self, + account: str, + jid: JID, + setting: AllContactSettings, + value: AllContactSettingsT) -> None: if account not in self._account_settings: raise ValueError(f'Account missing: {account}') @@ -992,7 +1029,7 @@ def set_contact_setting(self, def set_contact_settings(self, setting: str, - value: SETTING_TYPE) -> None: + value: AllContactSettings) -> None: for account, acc_settings in self._account_settings.items(): for jid in acc_settings['contact']: