Move PrivateChatControl into own module
This commit is contained in:
		
							parent
							
								
									fa0f35da01
								
							
						
					
					
						commit
						c97fddf0f8
					
				
					 3 changed files with 185 additions and 140 deletions
				
			
		| 
						 | 
				
			
			@ -60,10 +60,8 @@ from gajim.common import contacts
 | 
			
		|||
from gajim.common.const import StyleAttr
 | 
			
		||||
from gajim.common.const import Chatstate
 | 
			
		||||
 | 
			
		||||
from gajim.chat_control import ChatControl
 | 
			
		||||
from gajim.chat_control_base import ChatControlBase
 | 
			
		||||
 | 
			
		||||
from gajim.command_system.implementation.hosts import PrivateChatCommands
 | 
			
		||||
from gajim.command_system.implementation.hosts import GroupChatCommands
 | 
			
		||||
from gajim.common.connection_handlers_events import GcMessageOutgoingEvent
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -95,143 +93,6 @@ class Column(IntEnum):
 | 
			
		|||
    AVATAR_IMG = 4 # avatar of the contact
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PrivateChatControl(ChatControl):
 | 
			
		||||
    TYPE_ID = message_control.TYPE_PM
 | 
			
		||||
 | 
			
		||||
    # Set a command host to bound to. Every command given through a private chat
 | 
			
		||||
    # will be processed with this command host.
 | 
			
		||||
    COMMAND_HOST = PrivateChatCommands
 | 
			
		||||
 | 
			
		||||
    def __init__(self, parent_win, gc_contact, contact, account, session):
 | 
			
		||||
        room_jid = gc_contact.room_jid
 | 
			
		||||
        self.room_ctrl = app.interface.msg_win_mgr.get_gc_control(room_jid,
 | 
			
		||||
            account)
 | 
			
		||||
        if room_jid in app.interface.minimized_controls[account]:
 | 
			
		||||
            self.room_ctrl = app.interface.minimized_controls[account][room_jid]
 | 
			
		||||
        if self.room_ctrl:
 | 
			
		||||
            self.room_name = self.room_ctrl.name
 | 
			
		||||
        else:
 | 
			
		||||
            self.room_name = room_jid
 | 
			
		||||
        self.gc_contact = gc_contact
 | 
			
		||||
        ChatControl.__init__(self, parent_win, contact, account, session)
 | 
			
		||||
        self.TYPE_ID = 'pm'
 | 
			
		||||
        app.ged.register_event_handler('update-gc-avatar', ged.GUI1,
 | 
			
		||||
            self._nec_update_avatar)
 | 
			
		||||
        app.ged.register_event_handler('caps-update', ged.GUI1,
 | 
			
		||||
            self._nec_caps_received_pm)
 | 
			
		||||
        app.ged.register_event_handler('gc-presence-received', ged.GUI1,
 | 
			
		||||
            self._nec_gc_presence_received)
 | 
			
		||||
 | 
			
		||||
    def get_our_nick(self):
 | 
			
		||||
        return self.room_ctrl.nick
 | 
			
		||||
 | 
			
		||||
    def shutdown(self):
 | 
			
		||||
        super(PrivateChatControl, self).shutdown()
 | 
			
		||||
        app.ged.remove_event_handler('update-gc-avatar', ged.GUI1,
 | 
			
		||||
            self._nec_update_avatar)
 | 
			
		||||
        app.ged.remove_event_handler('caps-update', ged.GUI1,
 | 
			
		||||
            self._nec_caps_received_pm)
 | 
			
		||||
        app.ged.remove_event_handler('gc-presence-received', ged.GUI1,
 | 
			
		||||
            self._nec_gc_presence_received)
 | 
			
		||||
 | 
			
		||||
    def _nec_caps_received_pm(self, obj):
 | 
			
		||||
        if obj.conn.name != self.account or \
 | 
			
		||||
        obj.fjid != self.gc_contact.get_full_jid():
 | 
			
		||||
            return
 | 
			
		||||
        self.update_contact()
 | 
			
		||||
 | 
			
		||||
    def _nec_gc_presence_received(self, obj):
 | 
			
		||||
        if obj.conn.name != self.account:
 | 
			
		||||
            return
 | 
			
		||||
        if obj.fjid != self.full_jid:
 | 
			
		||||
            return
 | 
			
		||||
        if '303' in obj.status_code:
 | 
			
		||||
            self.print_conversation(_('%(nick)s is now known as '
 | 
			
		||||
                '%(new_nick)s') % {'nick': obj.nick, 'new_nick': obj.new_nick},
 | 
			
		||||
                'status')
 | 
			
		||||
            gc_c = app.contacts.get_gc_contact(obj.conn.name, obj.room_jid,
 | 
			
		||||
                obj.new_nick)
 | 
			
		||||
            c = gc_c.as_contact()
 | 
			
		||||
            self.gc_contact = gc_c
 | 
			
		||||
            self.contact = c
 | 
			
		||||
            self.draw_banner()
 | 
			
		||||
            old_jid = obj.room_jid + '/' + obj.nick
 | 
			
		||||
            new_jid = obj.room_jid + '/' + obj.new_nick
 | 
			
		||||
            app.interface.msg_win_mgr.change_key(old_jid, new_jid,
 | 
			
		||||
                obj.conn.name)
 | 
			
		||||
        else:
 | 
			
		||||
            self.contact.show = obj.show
 | 
			
		||||
            self.contact.status = obj.status
 | 
			
		||||
            self.gc_contact.show = obj.show
 | 
			
		||||
            self.gc_contact.status = obj.status
 | 
			
		||||
            uf_show = helpers.get_uf_show(obj.show)
 | 
			
		||||
            self.print_conversation(_('%(nick)s is now %(status)s') % {
 | 
			
		||||
                    'nick': obj.nick, 'status': uf_show}, 'status')
 | 
			
		||||
            if obj.status:
 | 
			
		||||
                self.print_conversation(' (', 'status', simple=True)
 | 
			
		||||
                self.print_conversation('%s' % (obj.status), 'status',
 | 
			
		||||
                    simple=True)
 | 
			
		||||
                self.print_conversation(')', 'status', simple=True)
 | 
			
		||||
            self.parent_win.redraw_tab(self)
 | 
			
		||||
            self.update_ui()
 | 
			
		||||
 | 
			
		||||
    def send_message(self, message, xhtml=None, process_commands=True,
 | 
			
		||||
    attention=False):
 | 
			
		||||
        """
 | 
			
		||||
        Call this method to send the message
 | 
			
		||||
        """
 | 
			
		||||
        message = helpers.remove_invalid_xml_chars(message)
 | 
			
		||||
        if not message:
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        # We need to make sure that we can still send through the room and that
 | 
			
		||||
        # the recipient did not go away
 | 
			
		||||
        contact = app.contacts.get_first_contact_from_jid(self.account,
 | 
			
		||||
                self.contact.jid)
 | 
			
		||||
        if not contact:
 | 
			
		||||
            # contact was from pm in MUC
 | 
			
		||||
            room, nick = app.get_room_and_nick_from_fjid(self.contact.jid)
 | 
			
		||||
            gc_contact = app.contacts.get_gc_contact(self.account, room, nick)
 | 
			
		||||
            if not gc_contact:
 | 
			
		||||
                ErrorDialog(
 | 
			
		||||
                    _('Sending private message failed'),
 | 
			
		||||
                    #in second %s code replaces with nickname
 | 
			
		||||
                    _('You are no longer in group chat "%(room)s" or '
 | 
			
		||||
                    '"%(nick)s" has left.') % {'room': '\u200E' + room,
 | 
			
		||||
                    'nick': nick}, transient_for=self.parent_win.window)
 | 
			
		||||
                return
 | 
			
		||||
 | 
			
		||||
        ChatControl.send_message(self, message, xhtml=xhtml,
 | 
			
		||||
            process_commands=process_commands, attention=attention)
 | 
			
		||||
 | 
			
		||||
    def update_ui(self):
 | 
			
		||||
        if self.contact.show == 'offline':
 | 
			
		||||
            self.got_disconnected()
 | 
			
		||||
        else:
 | 
			
		||||
            self.got_connected()
 | 
			
		||||
        ChatControl.update_ui(self)
 | 
			
		||||
 | 
			
		||||
    def _nec_update_avatar(self, obj):
 | 
			
		||||
        if obj.contact != self.gc_contact:
 | 
			
		||||
            return
 | 
			
		||||
        self.show_avatar()
 | 
			
		||||
 | 
			
		||||
    def show_avatar(self):
 | 
			
		||||
        if not app.config.get('show_avatar_in_chat'):
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        scale = self.parent_win.window.get_scale_factor()
 | 
			
		||||
        surface = app.interface.get_avatar(
 | 
			
		||||
            self.gc_contact.avatar_sha, AvatarSize.CHAT, scale)
 | 
			
		||||
        image = self.xml.get_object('avatar_image')
 | 
			
		||||
        image.set_from_surface(surface)
 | 
			
		||||
 | 
			
		||||
    def update_contact(self):
 | 
			
		||||
        self.contact = self.gc_contact.as_contact()
 | 
			
		||||
 | 
			
		||||
    def got_disconnected(self):
 | 
			
		||||
        ChatControl.got_disconnected(self)
 | 
			
		||||
 | 
			
		||||
class GroupchatControl(ChatControlBase):
 | 
			
		||||
    TYPE_ID = message_control.TYPE_GC
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -71,7 +71,7 @@ from gajim.dialogs import ProgressWindow
 | 
			
		|||
from gajim.chat_control_base import ChatControlBase
 | 
			
		||||
from gajim.chat_control import ChatControl
 | 
			
		||||
from gajim.groupchat_control import GroupchatControl
 | 
			
		||||
from gajim.groupchat_control import PrivateChatControl
 | 
			
		||||
from gajim.privatechat_control import PrivateChatControl
 | 
			
		||||
from gajim.message_window import MessageWindowMgr
 | 
			
		||||
 | 
			
		||||
from gajim.session import ChatControlSession
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										184
									
								
								gajim/privatechat_control.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										184
									
								
								gajim/privatechat_control.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,184 @@
 | 
			
		|||
# Copyright (C) 2003-2014 Yann Leboulanger <asterix AT lagaule.org>
 | 
			
		||||
# Copyright (C) 2005-2007 Nikos Kouremenos <kourem AT gmail.com>
 | 
			
		||||
# Copyright (C) 2006 Dimitur Kirov <dkirov AT gmail.com>
 | 
			
		||||
#                    Alex Mauer <hawke AT hawkesnest.net>
 | 
			
		||||
# Copyright (C) 2006-2008 Jean-Marie Traissard <jim AT lapin.org>
 | 
			
		||||
#                         Travis Shirk <travis AT pobox.com>
 | 
			
		||||
# Copyright (C) 2007-2008 Julien Pivotto <roidelapluie AT gmail.com>
 | 
			
		||||
#                         Stephan Erb <steve-e AT h3c.de>
 | 
			
		||||
# Copyright (C) 2008 Brendan Taylor <whateley AT gmail.com>
 | 
			
		||||
#                    Jonathan Schleifer <js-gajim AT webkeks.org>
 | 
			
		||||
# Copyright (C) 2018 Philipp Hörist <philipp AT hoerist.com>
 | 
			
		||||
#
 | 
			
		||||
# 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/>.
 | 
			
		||||
 | 
			
		||||
import nbxmpp
 | 
			
		||||
 | 
			
		||||
from gajim import message_control
 | 
			
		||||
 | 
			
		||||
from gajim.common import app
 | 
			
		||||
from gajim.common import helpers
 | 
			
		||||
from gajim.common import ged
 | 
			
		||||
from gajim.common.i18n import _
 | 
			
		||||
from gajim.common.const import AvatarSize
 | 
			
		||||
 | 
			
		||||
from gajim.chat_control import ChatControl
 | 
			
		||||
from gajim.command_system.implementation.hosts import PrivateChatCommands
 | 
			
		||||
 | 
			
		||||
from gajim.gtk.dialogs import ErrorDialog
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PrivateChatControl(ChatControl):
 | 
			
		||||
    TYPE_ID = message_control.TYPE_PM
 | 
			
		||||
 | 
			
		||||
    # Set a command host to bound to. Every command given through a private chat
 | 
			
		||||
    # will be processed with this command host.
 | 
			
		||||
    COMMAND_HOST = PrivateChatCommands
 | 
			
		||||
 | 
			
		||||
    def __init__(self, parent_win, gc_contact, contact, account, session):
 | 
			
		||||
        room_jid = gc_contact.room_jid
 | 
			
		||||
        self.room_ctrl = app.interface.msg_win_mgr.get_gc_control(
 | 
			
		||||
            room_jid, account)
 | 
			
		||||
        if room_jid in app.interface.minimized_controls[account]:
 | 
			
		||||
            self.room_ctrl = app.interface.minimized_controls[account][room_jid]
 | 
			
		||||
        if self.room_ctrl:
 | 
			
		||||
            self.room_name = self.room_ctrl.name
 | 
			
		||||
        else:
 | 
			
		||||
            self.room_name = room_jid
 | 
			
		||||
        self.gc_contact = gc_contact
 | 
			
		||||
        ChatControl.__init__(self, parent_win, contact, account, session)
 | 
			
		||||
        self.TYPE_ID = 'pm'
 | 
			
		||||
        app.ged.register_event_handler('update-gc-avatar', ged.GUI1,
 | 
			
		||||
                                       self._nec_update_avatar)
 | 
			
		||||
        app.ged.register_event_handler('caps-update', ged.GUI1,
 | 
			
		||||
                                       self._nec_caps_received_pm)
 | 
			
		||||
        app.ged.register_event_handler('gc-presence-received', ged.GUI1,
 | 
			
		||||
                                       self._nec_gc_presence_received)
 | 
			
		||||
 | 
			
		||||
    def get_our_nick(self):
 | 
			
		||||
        return self.room_ctrl.nick
 | 
			
		||||
 | 
			
		||||
    def shutdown(self):
 | 
			
		||||
        super(PrivateChatControl, self).shutdown()
 | 
			
		||||
        app.ged.remove_event_handler('update-gc-avatar', ged.GUI1,
 | 
			
		||||
                                     self._nec_update_avatar)
 | 
			
		||||
        app.ged.remove_event_handler('caps-update', ged.GUI1,
 | 
			
		||||
                                     self._nec_caps_received_pm)
 | 
			
		||||
        app.ged.remove_event_handler('gc-presence-received', ged.GUI1,
 | 
			
		||||
                                     self._nec_gc_presence_received)
 | 
			
		||||
 | 
			
		||||
    def _nec_caps_received_pm(self, obj):
 | 
			
		||||
        if obj.conn.name != self.account or \
 | 
			
		||||
        obj.fjid != self.gc_contact.get_full_jid():
 | 
			
		||||
            return
 | 
			
		||||
        self.update_contact()
 | 
			
		||||
 | 
			
		||||
    def _nec_gc_presence_received(self, obj):
 | 
			
		||||
        if obj.conn.name != self.account:
 | 
			
		||||
            return
 | 
			
		||||
        if obj.fjid != self.full_jid:
 | 
			
		||||
            return
 | 
			
		||||
        if '303' in obj.status_code:
 | 
			
		||||
            self.print_conversation(
 | 
			
		||||
                _('%(nick)s is now known as %(new_nick)s') % {
 | 
			
		||||
                    'nick': obj.nick, 'new_nick': obj.new_nick},
 | 
			
		||||
                'status')
 | 
			
		||||
            gc_c = app.contacts.get_gc_contact(obj.conn.name, obj.room_jid,
 | 
			
		||||
                obj.new_nick)
 | 
			
		||||
            c = gc_c.as_contact()
 | 
			
		||||
            self.gc_contact = gc_c
 | 
			
		||||
            self.contact = c
 | 
			
		||||
            self.draw_banner()
 | 
			
		||||
            old_jid = obj.room_jid + '/' + obj.nick
 | 
			
		||||
            new_jid = obj.room_jid + '/' + obj.new_nick
 | 
			
		||||
            app.interface.msg_win_mgr.change_key(
 | 
			
		||||
                old_jid, new_jid, obj.conn.name)
 | 
			
		||||
        else:
 | 
			
		||||
            self.contact.show = obj.show
 | 
			
		||||
            self.contact.status = obj.status
 | 
			
		||||
            self.gc_contact.show = obj.show
 | 
			
		||||
            self.gc_contact.status = obj.status
 | 
			
		||||
            uf_show = helpers.get_uf_show(obj.show)
 | 
			
		||||
            self.print_conversation(
 | 
			
		||||
                _('%(nick)s is now %(status)s') % {'nick': obj.nick,
 | 
			
		||||
                                                   'status': uf_show},
 | 
			
		||||
                'status')
 | 
			
		||||
            if obj.status:
 | 
			
		||||
                self.print_conversation(' (', 'status', simple=True)
 | 
			
		||||
                self.print_conversation(
 | 
			
		||||
                    '%s' % (obj.status), 'status', simple=True)
 | 
			
		||||
                self.print_conversation(')', 'status', simple=True)
 | 
			
		||||
            self.parent_win.redraw_tab(self)
 | 
			
		||||
            self.update_ui()
 | 
			
		||||
 | 
			
		||||
    def send_message(self, message, xhtml=None, process_commands=True,
 | 
			
		||||
                     attention=False):
 | 
			
		||||
        """
 | 
			
		||||
        Call this method to send the message
 | 
			
		||||
        """
 | 
			
		||||
        message = helpers.remove_invalid_xml_chars(message)
 | 
			
		||||
        if not message:
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        # We need to make sure that we can still send through the room and that
 | 
			
		||||
        # the recipient did not go away
 | 
			
		||||
        contact = app.contacts.get_first_contact_from_jid(
 | 
			
		||||
            self.account, self.contact.jid)
 | 
			
		||||
        if not contact:
 | 
			
		||||
            # contact was from pm in MUC
 | 
			
		||||
            room, nick = app.get_room_and_nick_from_fjid(self.contact.jid)
 | 
			
		||||
            gc_contact = app.contacts.get_gc_contact(self.account, room, nick)
 | 
			
		||||
            if not gc_contact:
 | 
			
		||||
                ErrorDialog(
 | 
			
		||||
                    _('Sending private message failed'),
 | 
			
		||||
                    #in second %s code replaces with nickname
 | 
			
		||||
                    _('You are no longer in group chat "%(room)s" or '
 | 
			
		||||
                      '"%(nick)s" has left.') % {
 | 
			
		||||
                          'room': '\u200E' + room, 'nick': nick},
 | 
			
		||||
                    transient_for=self.parent_win.window)
 | 
			
		||||
                return
 | 
			
		||||
 | 
			
		||||
        ChatControl.send_message(self, message,
 | 
			
		||||
                                 xhtml=xhtml,
 | 
			
		||||
                                 process_commands=process_commands,
 | 
			
		||||
                                 attention=attention)
 | 
			
		||||
 | 
			
		||||
    def update_ui(self):
 | 
			
		||||
        if self.contact.show == 'offline':
 | 
			
		||||
            self.got_disconnected()
 | 
			
		||||
        else:
 | 
			
		||||
            self.got_connected()
 | 
			
		||||
        ChatControl.update_ui(self)
 | 
			
		||||
 | 
			
		||||
    def _nec_update_avatar(self, obj):
 | 
			
		||||
        if obj.contact != self.gc_contact:
 | 
			
		||||
            return
 | 
			
		||||
        self.show_avatar()
 | 
			
		||||
 | 
			
		||||
    def show_avatar(self):
 | 
			
		||||
        if not app.config.get('show_avatar_in_chat'):
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        scale = self.parent_win.window.get_scale_factor()
 | 
			
		||||
        surface = app.interface.get_avatar(
 | 
			
		||||
            self.gc_contact.avatar_sha, AvatarSize.CHAT, scale)
 | 
			
		||||
        image = self.xml.get_object('avatar_image')
 | 
			
		||||
        image.set_from_surface(surface)
 | 
			
		||||
 | 
			
		||||
    def update_contact(self):
 | 
			
		||||
        self.contact = self.gc_contact.as_contact()
 | 
			
		||||
 | 
			
		||||
    def got_disconnected(self):
 | 
			
		||||
        ChatControl.got_disconnected(self)
 | 
			
		||||
		Loading…
	
	Add table
		
		Reference in a new issue