Philipp Hörist pushed to branch master at gajim / gajim
Commits: afd89099 by lovetox at 2022-01-23T20:33:06+01:00 Remove dead code
- - - - - b9335eaf by lovetox at 2022-01-23T20:33:06+01:00 Main: Refactor event handling
- Add dedicated methods for some events - Add type annotations - Events: Use JID object instead of string
- - - - - 28847ed8 by lovetox at 2022-01-23T20:41:05+01:00 Main: Reduce event imports
- - - - -
11 changed files:
- gajim/common/app.py - gajim/common/events.py - gajim/common/jingle_ft.py - gajim/common/jingle_session.py - gajim/common/modules/mam.py - gajim/common/modules/message.py - gajim/common/modules/presence.py - gajim/gtk/chat_list.py - gajim/gtk/main.py - gajim/gui_interface.py - pyrightconfig.json
Changes:
===================================== gajim/common/app.py ===================================== @@ -93,9 +93,6 @@ def __init__(self): # {account: {room_jid: {'invities': []}}} automatic_rooms: dict[str, dict[str, dict[str, list[str]]]] = {}
-# list of contacts that has just signed in -newly_added: dict[str, list[str]] = {} - # list of contacts that has just signed out to_be_removed: dict[str, list[str]] = {}
===================================== gajim/common/events.py ===================================== @@ -37,6 +37,21 @@ from gajim.common.client import Client
+MainEventT = Union['PresenceReceived', + 'MessageSent', + 'MamMessageReceived', + 'GcMessageReceived', + 'MessageUpdated', + 'ReceiptReceived', + 'DisplayedReceived', + 'MessageError', + 'MucDiscoUpdate', + 'JingleConnectedReceived', + 'JingleDisconnectedReceived', + 'JingleErrorReceived', + 'FileRequestSent'] + + @dataclass class ApplicationEvent: name: str @@ -130,7 +145,7 @@ class MusicTrackChanged(ApplicationEvent): class MessageSent(ApplicationEvent): name: str = field(init=False, default='message-sent') account: str - jid: str + jid: JID message: str message_id: str chatstate: Optional[str] @@ -200,7 +215,7 @@ class FileRequestSent(ApplicationEvent): name: str = field(init=False, default='file-request-sent') account: str file_props: FileProp - jid: str + jid: JID
@dataclass @@ -342,7 +357,7 @@ class ArchivingIntervalFinished(ApplicationEvent): class MessageUpdated(ApplicationEvent): name: str = field(init=False, default='message-updated') account: str - jid: str + jid: JID msgtxt: str properties: Any correct_id: str @@ -352,7 +367,7 @@ class MessageUpdated(ApplicationEvent): class MamMessageReceived(ApplicationEvent): name: str = field(init=False, default='mam-message-received') account: str - jid: str + jid: JID msgtxt: str properties: Any additional_data: AdditionalDataDict @@ -368,7 +383,7 @@ class MessageReceived(ApplicationEvent): conn: 'Client' stanza: Any account: str - jid: str + jid: JID msgtxt: str properties: Any additional_data: AdditionalDataDict @@ -392,7 +407,7 @@ class GcMessageReceived(MessageReceived): class MessageError(ApplicationEvent): name: str = field(init=False, default='message-error') account: str - jid: str + jid: JID room_jid: str message_id: str error: Any @@ -452,7 +467,7 @@ class SearchResultReceivedEvent(ApplicationEvent): class ReceiptReceived(ApplicationEvent): name: str = field(init=False, default='receipt-received') account: str - jid: str + jid: JID receipt_id: str
@@ -462,7 +477,7 @@ class JingleEvent(ApplicationEvent): conn: 'Client' account: str fjid: str - jid: str + jid: JID sid: str resource: str jingle_session: Any @@ -571,7 +586,7 @@ class PresenceReceived(ApplicationEvent): need_add_in_roster: bool popup: bool ptype: str - jid: str + jid: JID resource: str id_: str fjid: str @@ -622,7 +637,7 @@ class FileRequestReceivedEvent(ApplicationEvent): id_: str fjid: str account: str - jid: str + jid: JID file_props: FileProp
===================================== gajim/common/jingle_ft.py ===================================== @@ -181,7 +181,7 @@ def _raise_event(self, stanza, content): fjid = con.get_module('Bytestream')._ft_get_from(stanza) account = con.name jid = app.get_jid_without_resource(fjid) - + jid = JID.from_string(jid) if not content: return
===================================== gajim/common/jingle_session.py ===================================== @@ -902,7 +902,7 @@ def __transport_accept(self, transport): def _raise_event(self, name: str, **kwargs): jid, resource = app.get_room_and_nick_from_fjid( str(self.peerjid)) - + jid = JID.from_string(jid) event_class = JINGLE_EVENTS[name]
app.ged.raise_event(
===================================== gajim/common/modules/mam.py ===================================== @@ -260,7 +260,7 @@ def _mam_message_received(self, _con, stanza, properties):
event_attr = { 'account': self._account, - 'jid': str(properties.jid.bare), + 'jid': properties.jid.new_as_bare(), 'msgtxt': properties.body, 'properties': properties, 'additional_data': additional_data,
===================================== gajim/common/modules/message.py ===================================== @@ -179,7 +179,7 @@ def _message_received(self, _con, stanza, properties): 'account': self._account, 'additional_data': additional_data, 'fjid': fjid, - 'jid': fjid if properties.is_muc_pm else jid, + 'jid': from_ if properties.is_muc_pm else from_.new_as_bare(), 'resource': resource, 'stanza_id': stanza_id, 'unique_id': stanza_id or message_id,
===================================== gajim/common/modules/presence.py ===================================== @@ -125,7 +125,7 @@ def _presence_received(self, _con, stanza, properties): 'need_add_in_roster': False, 'popup': False, 'ptype': properties.type.value, - 'jid': properties.jid.bare, + 'jid': properties.jid.new_as_bare(), 'resource': properties.jid.resource, 'id_': properties.id, 'fjid': str(properties.jid),
===================================== gajim/gtk/chat_list.py ===================================== @@ -495,7 +495,7 @@ def _on_jingle_request_received(self, def _on_file_request_received(self, event: events.FileRequestReceivedEvent ) -> None: - row = self._chats.get((event.account, JID.from_string(event.jid))) + row = self._chats.get((event.account, event.jid)) if row is None: return row.set_timestamp(time.time())
===================================== gajim/gtk/main.py ===================================== @@ -29,23 +29,12 @@ from nbxmpp import JID
from gajim.common import app +from gajim.common import events from gajim.common import ged from gajim.common.const import Direction -from gajim.common.events import ApplicationEvent -from gajim.common.events import MucAdded -from gajim.common.events import HttpAuth -from gajim.common.events import PasswordRequired -from gajim.common.events import PlainConnection -from gajim.common.events import RosterItemExchangeEvent -from gajim.common.events import AllowGajimUpdateCheck -from gajim.common.events import GajimUpdateAvailable -from gajim.common.events import AccountEnabled -from gajim.common.events import AccountDisabled -from gajim.common.events import ShowChanged -from gajim.common.events import SignedIn +from gajim.common.ged import EventHelper from gajim.common.helpers import ask_for_status_message from gajim.common.i18n import _ -from gajim.common.ged import EventHelper from gajim.common.modules.bytestream import is_transfer_active
from .account_side_bar import AccountSideBar @@ -110,22 +99,19 @@ def __init__(self) -> None: self.register_events([ ('presence-received', ged.GUI1, self._on_event), ('message-sent', ged.GUI1, self._on_event), - ('message-received', ged.CORE, self._on_event), + ('message-received', ged.CORE, self._on_message_received), ('mam-message-received', ged.CORE, self._on_event), ('gc-message-received', ged.CORE, self._on_event), ('message-updated', ged.CORE, self._on_event), ('receipt-received', ged.GUI1, self._on_event), ('displayed-received', ged.GUI1, self._on_event), ('message-error', ged.GUI1, self._on_event), - ('muc-creation-failed', ged.GUI1, self._on_event), - ('muc-self-presence', ged.GUI1, self._on_event), - ('muc-voice-request', ged.GUI1, self._on_event), ('muc-disco-update', ged.GUI1, self._on_event), - ('jingle-request-received', ged.GUI1, self._on_event), + ('jingle-request-received', ged.GUI1, self._on_jingle_request), ('jingle-connected-received', ged.GUI1, self._on_event), ('jingle-disconnected-received', ged.GUI1, self._on_event), ('jingle-error-received', ged.GUI1, self._on_event), - ('file-request-received', ged.GUI1, self._on_event), + ('file-request-received', ged.GUI1, self._on_file_request), ('file-request-sent', ged.GUI1, self._on_event), ('our-show', ged.GUI1, self._on_our_show), ('signed-in', ged.GUI1, self._on_signed_in), @@ -178,11 +164,11 @@ def _prepare_window(self) -> None: app.settings.get('trayicon') != 'always'): self.show_all()
- def _on_account_enabled(self, event: AccountEnabled) -> None: + def _on_account_enabled(self, event: events.AccountEnabled) -> None: self._account_side_bar.add_account(event.account) self._main_stack.add_account_page(event.account)
- def _on_account_disabled(self, event: AccountDisabled) -> None: + def _on_account_disabled(self, event: events.AccountDisabled) -> None: workspace_id = self._workspace_side_bar.get_first_workspace() self.activate_workspace(workspace_id) self._account_side_bar.remove_account(event.account) @@ -190,24 +176,26 @@ def _on_account_disabled(self, event: AccountDisabled) -> None: self._main_stack.remove_chats_for_account(event.account)
@staticmethod - def _on_our_show(event: ShowChanged) -> None: + def _on_our_show(event: events.ShowChanged) -> None: if event.show == 'offline': app.app.set_account_actions_state(event.account) app.app.update_app_actions_state()
@staticmethod - def _on_signed_in(event: SignedIn) -> None: + def _on_signed_in(event: events.SignedIn) -> None: app.app.set_account_actions_state(event.account, True) app.app.update_app_actions_state()
- def _on_allow_gajim_update(self, event: AllowGajimUpdateCheck) -> None: + def _on_allow_gajim_update(self, + event: events.AllowGajimUpdateCheck) -> None: self.add_app_message(event.name)
- def _on_gajim_update_available(self, event: GajimUpdateAvailable) -> None: + def _on_gajim_update_available(self, + event: events.GajimUpdateAvailable) -> None: self.add_app_message(event.name, event.version)
@staticmethod - def _on_roster_item_exchange(event: RosterItemExchangeEvent) -> None: + def _on_roster_item_exchange(event: events.RosterItemExchangeEvent) -> None: open_window('RosterItemExchange', account=event.client.account, action=event.action, @@ -215,7 +203,7 @@ def _on_roster_item_exchange(event: RosterItemExchangeEvent) -> None: jid_from=event.jid)
@staticmethod - def _on_plain_connection(event: PlainConnection) -> None: + def _on_plain_connection(event: events.PlainConnection) -> None: ConfirmationDialog( _('Insecure Connection'), _('Insecure Connection'), @@ -233,11 +221,11 @@ def _on_plain_connection(event: PlainConnection) -> None: callback=event.connect)]).show()
@staticmethod - def _on_password_required(event: PasswordRequired) -> None: + def _on_password_required(event: events.PasswordRequired) -> None: open_window('PasswordDialog', event=event)
@staticmethod - def _on_http_auth(event: HttpAuth) -> None: + def _on_http_auth(event: events.HttpAuth) -> None: def _response(answer: str) -> None: event.client.get_module('HTTPAuth').build_http_auth_answer( event.stanza, answer) @@ -267,7 +255,7 @@ def _response(answer: str) -> None: callback=_response, args=['yes'])]).show()
- def _on_muc_added(self, event: MucAdded) -> None: + def _on_muc_added(self, event: events.MucAdded) -> None: if self.chat_exists(event.account, event.jid): return
@@ -523,7 +511,7 @@ def get_chat_list(self, workspace_id: str) -> ChatList:
def _add_group_chat(self, _action: Gio.SimpleAction, - param: Optional[GLib.Variant]) -> None: + param: GLib.Variant) -> None:
account, jid, select = param.unpack() self.add_group_chat(account, JID.from_string(jid), select) @@ -755,35 +743,41 @@ def _load_chats(self) -> None:
self._set_startup_finished()
- def _on_event(self, event: ApplicationEvent) -> None: - if event.name == 'update-roster-avatar': + def _on_event(self, event: events.MainEventT) -> None: + if not self.chat_exists(event.account, event.jid): return
+ self._main_stack.process_event(event) + + def _on_message_received(self, event: events.MessageReceived) -> None: if not self.chat_exists(event.account, event.jid): - if event.name == 'message-received': - if not event.properties.body: - # Don’t open control on chatstate etc. - return - if event.properties.is_muc_pm: - self.add_private_chat(event.account, - event.properties.jid) - else: - jid = event.properties.jid.new_as_bare() - self.add_chat(event.account, jid, 'contact') - elif event.name == 'jingle-request-received': - content_types = [] - for item in event.contents: - content_types.append(item.media) - if 'audio' in content_types or 'video' in content_types: - # AV Call received, open chat control - self.add_chat(event.account, event.jid, 'contact') - elif event.name == 'file-request-received': - # Jingle file transfer, open chat control - self.add_chat(event.account, event.jid, 'contact') - else: - # No chat is open, dont handle any gui events + if not event.properties.body: + # Don’t open control on chatstate etc. return
+ if event.properties.is_muc_pm: + self.add_private_chat(event.account, + event.properties.jid) + + else: + jid = event.properties.jid.new_as_bare() + self.add_chat(event.account, jid, 'contact') + + self._main_stack.process_event(event) + + def _on_jingle_request(self, event: events.JingleRequestReceived) -> None: + if not self.chat_exists(event.account, event.jid): + for item in event.contents: + if item.media in ('audio', 'video'): + self.add_chat(event.account, event.jid, 'contact') + break + + self._main_stack.process_event(event) + + def _on_file_request(self, event: events.FileRequestReceivedEvent) -> None: + if not self.chat_exists(event.account, event.jid): + self.add_chat(event.account, event.jid, 'contact') + self._main_stack.process_event(event)
def quit(self) -> None: @@ -807,8 +801,7 @@ def on_continue2(message: Optional[str]) -> None: app.app.start_shutdown(message=message) return # check if there is an active file transfer - files_props = app.interface.instances['file_transfers'].\ - files_props + files_props = app.interface.instances['file_transfers'].files_props transfer_active = False for x in files_props: for y in files_props[x]:
===================================== gajim/gui_interface.py ===================================== @@ -118,7 +118,7 @@ def __init__(self): self._create_core_handlers_list() self._register_core_handlers()
- self.instances = {} + self.instances: dict[str, Any] = {}
for acc in app.connections: self.instances[acc] = { @@ -126,7 +126,6 @@ def __init__(self): 'disco': {} } app.automatic_rooms[acc] = {} - app.newly_added[acc] = [] app.to_be_removed[acc] = [] app.nicks[acc] = app.settings.get_account_setting(acc, 'name')
@@ -531,7 +530,6 @@ def enable_account(self, account: str) -> None: }
app.automatic_rooms[account] = {} - app.newly_added[account] = [] app.to_be_removed[account] = [] app.nicks[account] = app.settings.get_account_setting(account, 'name') app.settings.set_account_setting(account, 'active', True) @@ -566,7 +564,6 @@ def disable_account(self, account: str) -> None: del app.nicks[account] del app.automatic_rooms[account] del app.to_be_removed[account] - del app.newly_added[account]
def remove_account(self, account: str) -> None: if app.settings.get_account_setting(account, 'active'):
===================================== pyrightconfig.json ===================================== @@ -60,6 +60,7 @@ "gajim/gtk/groupchat_nick.py", "gajim/gtk/groupchat_settings.py", "gajim/gtk/groupchat_state.py", + "gajim/gtk/main.py", "gajim/gtk/main_stack.py", "gajim/gtk/manage_sounds.py", "gajim/gtk/notification.py",
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/compare/e797ae75677f0c2d8389dab1d0121c20...