Display status changes in one to one chats

Make hide_status_change work there as well, with per-jid configuration
This commit is contained in:
mathieui 2016-09-29 23:47:54 +02:00
parent b035d9f2cf
commit 8f9e14dcb6
6 changed files with 59 additions and 15 deletions

View file

@ -1334,10 +1334,10 @@ class Core(object):
if tab.name.startswith(room_name):
tab.activate(reason=reason)
def on_user_changed_status_in_private(self, jid, msg):
def on_user_changed_status_in_private(self, jid, status):
tab = self.get_tab_by_name(jid, tabs.ChatTab)
if tab is not None: # display the message in private
tab.add_message(msg, typ=2)
tab.update_status(status)
def close_tab(self, tab=None):
"""

View file

@ -28,6 +28,7 @@ from poezio import xhtml
from poezio import multiuserchat as muc
from poezio.common import safeJID
from poezio.config import config, CACHE_DIR
from poezio.core.structs import Status
from poezio.contact import Resource
from poezio.logger import logger
from poezio.roster import roster
@ -299,6 +300,9 @@ class HandlerCore:
elif not own:
remote_nick = conversation.get_nick()
if not own:
conversation.last_remote_message = datetime.now()
self.core.events.trigger('conversation_msg', message, conversation)
if not message['body']:
return
@ -607,6 +611,7 @@ class HandlerCore:
if msg and body:
self.core.xmpp.send_message(mto=jid.full, mbody=msg, mtype='chat')
return
tab.last_remote_message = datetime.now()
self.core.events.trigger('private_msg', message, tab)
body = xhtml.get_body_from_message_stanza(message, use_xhtml=use_xhtml,
tmp_dir=tmp_dir,
@ -830,6 +835,8 @@ class HandlerCore:
contact.error = None
self.core.events.trigger('normal_presence', presence, contact[jid.full])
tab = self.core.get_conversation_by_jid(jid, create=False)
if tab:
tab.update_status(Status(show=presence['show'], message=presence['status']))
if isinstance(self.core.current_tab(), tabs.RosterInfoTab):
self.core.refresh_window()
elif self.core.current_tab() == tab:

View file

@ -1,5 +1,5 @@
from poezio.tabs.basetabs import Tab, ChatTab, GapTab, OneToOneTab
from poezio.tabs.basetabs import STATE_PRIORITY
from poezio.tabs.basetabs import STATE_PRIORITY, SHOW_NAME
from poezio.tabs.rostertab import RosterInfoTab
from poezio.tabs.muctab import MucTab, NS_MUC_USER
from poezio.tabs.privatetab import PrivateTab

View file

@ -18,9 +18,10 @@ log = logging.getLogger(__name__)
import string
import time
from datetime import datetime
from xml.etree import cElementTree as ET
from poezio.core.structs import Command, Completion
from poezio.core.structs import Command, Completion, Status
from poezio import timed_events
from poezio import windows
from poezio import xhtml
@ -77,6 +78,14 @@ STATE_PRIORITY = {
'attention': 3
}
SHOW_NAME = {
'dnd': 'busy',
'away': 'away',
'xa': 'not available',
'chat': 'chatty',
'': 'available'
}
class Tab(object):
plugin_commands = {}
plugin_keys = {}
@ -688,6 +697,9 @@ class OneToOneTab(ChatTab):
def __init__(self, core, jid=''):
ChatTab.__init__(self, core, jid)
self.__status = Status("", "")
self.last_remote_message = datetime.now()
# Set to true once the first disco is done
self.__initial_disco = False
# change this to True or False when
@ -698,6 +710,33 @@ class OneToOneTab(ChatTab):
self.remote_supports_receipts = True
self.check_features()
def remote_user_color(self):
return dump_tuple(get_theme().COLOR_REMOTE_USER)
def update_status(self, status):
old_status = self.__status
if not (old_status.show != status.show or
old_status.message != status.message):
return
self.__status = status
hide_status_change = config.get_by_tabname('hide_status_change',
safeJID(self.name).bare)
now = datetime.now()
dff = now - self.last_remote_message
if hide_status_change > -1 and dff.total_seconds() > hide_status_change:
return
info_c = dump_tuple(get_theme().COLOR_INFORMATION_TEXT)
nick = self.get_nick()
remote = self.remote_user_color()
msg = '\x19%(color)s}%(nick)s\x19%(info)s} changed: '
msg %= {'color': remote, 'nick': nick, 'info': info_c}
if status.message != old_status.message and status.message:
msg += 'status: %s, ' % status.message
if status.show in SHOW_NAME:
msg += 'show: %s, ' % SHOW_NAME[status.show]
self.add_message(msg[:-2], typ=2)
@property
def remote_wants_chatstates(self):
return self._remote_wants_chatstates

View file

@ -17,7 +17,7 @@ import random
import re
from datetime import datetime
from poezio.tabs import ChatTab, Tab
from poezio.tabs import ChatTab, Tab, SHOW_NAME
from poezio import common
from poezio import fixes
@ -32,17 +32,9 @@ from poezio.logger import logger
from poezio.roster import roster
from poezio.theming import get_theme, dump_tuple
from poezio.user import User
from poezio.core.structs import Completion
from poezio.core.structs import Completion, Status
SHOW_NAME = {
'dnd': 'busy',
'away': 'away',
'xa': 'not available',
'chat': 'chatty',
'': 'available'
}
NS_MUC_USER = 'http://jabber.org/protocol/muc#user'
@ -1555,7 +1547,7 @@ class MucTab(ChatTab):
self._text_buffer.add_message(msg)
self.core.on_user_changed_status_in_private('%s/%s' %
(from_room, from_nick),
msg)
Status(show, status))
self.users.remove(user)
# finally, effectively change the user status
user.update(affiliation, show, status, role)

View file

@ -62,6 +62,12 @@ class PrivateTab(OneToOneTab):
self.update_commands()
self.update_keys()
def remote_user_color(self):
user = self.parent_muc.get_user_by_name(safeJID(self.name).resource)
if user:
return dump_tuple(user.color);
return super().remote_user_color()
@property
def general_jid(self):
return self.name