we now have contact.chatstate !
This commit is contained in:
parent
549b10369e
commit
9fc1516522
|
@ -901,7 +901,8 @@ class Connection:
|
|||
# chatstates - if peer supports jep85, send chatstates
|
||||
# please note that the only valid tag inside a message containing a <body> tag is the active event
|
||||
if chatstate is not None:
|
||||
msg_iq.setTag(chatstate, {}, namespace='http://jabber.org/protocol/chatstates')
|
||||
msg_iq.setTag(chatstate, {},
|
||||
namespace = 'http://jabber.org/protocol/chatstates')
|
||||
|
||||
self.to_be_sent.append(msg_iq)
|
||||
gajim.logger.write('outgoing', msg, jid)
|
||||
|
|
|
@ -63,13 +63,13 @@ sleeper_state = {} # whether we pass auto away / xa or not
|
|||
|
||||
def get_contact_instances_from_jid(account, jid):
|
||||
''' we may have two or more resources on that jid '''
|
||||
contact_instances = gajim.contacts[account][jid]
|
||||
return contact_instances
|
||||
return contacts[account][jid]
|
||||
|
||||
def get_first_contact_instance_from_jid(account, jid):
|
||||
contact_instances = get_contact_instances_from_jid(account, jid)
|
||||
return contact_instances[0]
|
||||
return contacts[account][jid][0]
|
||||
|
||||
def get_contact_name_from_jid(account, jid):
|
||||
contact_instances = get_contact_instances_from_jid(account, jid)
|
||||
return contact_instances[0].name
|
||||
return contacts[account][jid][0].name
|
||||
|
||||
def get_jid_without_resource(jid):
|
||||
return jid.split('/')[0]
|
||||
|
|
|
@ -58,7 +58,7 @@ def get_fjid_from_nick(room_jid, nick):
|
|||
return fjid
|
||||
|
||||
def get_nick_from_jid(jid):
|
||||
pos = jid.rfind('/')
|
||||
pos = jid.find('@')
|
||||
return jid[:pos]
|
||||
|
||||
def get_nick_from_fjid(jid):
|
||||
|
|
30
src/gajim.py
30
src/gajim.py
|
@ -91,8 +91,9 @@ except ImportError:
|
|||
|
||||
class Contact:
|
||||
'''Information concerning each contact'''
|
||||
def __init__(self, jid='', name='', groups=[], show='', status='', sub='',
|
||||
ask='', resource='', priority=5, keyID='', role='', affiliation=''):
|
||||
def __init__(self, jid='', name='', groups=[], show='', status='', sub='',\
|
||||
ask='', resource='', priority=5, keyID='', role='', affiliation='',\
|
||||
chatstate=None):
|
||||
self.jid = jid
|
||||
self.name = name
|
||||
self.groups = groups
|
||||
|
@ -106,6 +107,14 @@ class Contact:
|
|||
self.role = role
|
||||
self.affiliation = affiliation
|
||||
|
||||
# please read jep-85 http://www.jabber.org/jeps/jep-0085.html
|
||||
# we keep track of jep85 support by the peer by three extra states:
|
||||
# None, False and 'ask'
|
||||
# None if no info about peer
|
||||
# False if peer does not support jep85
|
||||
# 'ask' if we sent the first 'active' chatstate and are waiting for reply
|
||||
self.chatstate = chatstate
|
||||
|
||||
import roster_window
|
||||
import systray
|
||||
import dialogs
|
||||
|
@ -347,8 +356,8 @@ class Interface:
|
|||
self.remote.raise_signal('GCPresence', (account, array))
|
||||
|
||||
def handle_event_msg(self, account, array):
|
||||
#('MSG', account, (contact, msg, time, encrypted, msg_type, subject, chatstate))
|
||||
jid = array[0].split('/')[0]
|
||||
#('MSG', account, (jid, msg, time, encrypted, msg_type, subject, chatstate))
|
||||
jid = gajim.get_jid_without_resource(array[0])
|
||||
msg_type = array[4]
|
||||
chatstate = array[6]
|
||||
if jid.find('@') <= 0:
|
||||
|
@ -379,16 +388,17 @@ class Interface:
|
|||
|
||||
if self.windows[account]['chats'].has_key(jid):
|
||||
chat_win = self.windows[account]['chats'][jid]
|
||||
contact = gajim.get_first_contact_instance_from_jid(account, jid)
|
||||
if chatstate is not None: # he sent us reply, so he supports jep85
|
||||
if chat_win.chatstates[jid] == 'ask': # we were jep85 disco?
|
||||
chat_win.chatstates[jid] = 'active' # no more
|
||||
if contact.chatstate == 'ask': # we were jep85 disco?
|
||||
contact.chatstate = 'active' # no more
|
||||
|
||||
chat_win.handle_incoming_chatstate(account, jid, chatstate)
|
||||
else:
|
||||
# got no valid jep85 answer, peer does not support it
|
||||
chat_win.chatstates[jid] = False
|
||||
contact.chatstate = False
|
||||
|
||||
if not array[1]: #empty message
|
||||
if not array[1]: #empty message text
|
||||
return
|
||||
|
||||
first = False
|
||||
|
@ -491,10 +501,10 @@ class Interface:
|
|||
'attached_gpg_keys').split()
|
||||
if jid in attached_keys:
|
||||
keyID = attached_keys[attached_keys.index(jid) + 1]
|
||||
user1 = Contact(jid = jid, name = jid.split('@')[0],
|
||||
contact1 = Contact(jid = jid, name = jid.split('@')[0],
|
||||
groups = [_('General')], show = 'online', status = 'online',
|
||||
ask = 'to', resource = array[1], keyID = keyID)
|
||||
gajim.contacts[account][jid] = [user1]
|
||||
gajim.contacts[account][jid] = [contact1]
|
||||
self.roster.add_contact_to_roster(jid, account)
|
||||
dialogs.InformationDialog(_('Authorization accepted'),
|
||||
_('The contact "%s" has authorized you to see his status.')
|
||||
|
|
|
@ -454,13 +454,6 @@ class TabbedChatWindow(chat.Chat):
|
|||
''' sends our chatstate as STANDLONE chat state message (eg. no body)
|
||||
to the current tab only if new chatstate is different
|
||||
from the previous one'''
|
||||
# please read jep-85 http://www.jabber.org/jeps/jep-0085.html
|
||||
# we keep track of jep85 support by the peer by three extra states:
|
||||
# None, False and 'ask'
|
||||
# None if no info about peer
|
||||
# False if peer does not support jep85
|
||||
# 'ask' if we sent the first 'active' chatstate and are waiting for reply
|
||||
|
||||
# JEP 85 does not allow resending the same chatstate
|
||||
# this function checks for that and just returns so it's safe to call it
|
||||
# with same state.
|
||||
|
@ -476,16 +469,17 @@ class TabbedChatWindow(chat.Chat):
|
|||
return
|
||||
|
||||
jid = self.get_active_jid()
|
||||
contact = gajim.get_first_contact_instance_from_jid(self.account, jid)
|
||||
|
||||
if self.chatstates[jid] == False: # jid cannot do jep85
|
||||
if contact.chatstate is False: # jid cannot do jep85
|
||||
return
|
||||
|
||||
# if current state equals previous state, return
|
||||
if self.chatstates[jid] == state:
|
||||
if contact.chatstate == state:
|
||||
return
|
||||
|
||||
if self.chatstates[jid] is None:
|
||||
# we don't know anything about jid,
|
||||
if contact.chatstate is None:
|
||||
# we don't know anything about jid, so return
|
||||
# NOTE:
|
||||
# send 'active', set current state to 'ask' and return is done
|
||||
# in send_message because we need REAL message (with <body>)
|
||||
|
@ -493,20 +487,20 @@ class TabbedChatWindow(chat.Chat):
|
|||
# until we know peer supports jep85
|
||||
return
|
||||
|
||||
if self.chatstates[jid] == 'ask':
|
||||
if contact.chatstate == 'ask':
|
||||
return
|
||||
|
||||
# prevent going paused if we we were not composing (JEP violation)
|
||||
if state == 'paused' and not self.chatstates[jid] == 'composing':
|
||||
if state == 'paused' and not contact.chatstate == 'composing':
|
||||
gajim.connections[self.account].send_message(jid, None, None,
|
||||
chatstate = 'active') # go active before
|
||||
|
||||
# if we're inactive prevent composing (JEP violation)
|
||||
if self.chatstates[jid] == 'inactive' and state == 'composing':
|
||||
if contact.chatstate == 'inactive' and state == 'composing':
|
||||
gajim.connections[self.account].send_message(jid, None, None,
|
||||
chatstate = 'active') # go active before
|
||||
|
||||
self.chatstates[jid] = state
|
||||
contact.chatstate = state
|
||||
gajim.connections[self.account].send_message(jid, None, None,
|
||||
chatstate = state)
|
||||
|
||||
|
@ -514,10 +508,13 @@ class TabbedChatWindow(chat.Chat):
|
|||
"""Send the given message to the active tab"""
|
||||
if not message:
|
||||
return
|
||||
|
||||
jid = self.get_active_jid()
|
||||
contact = gajim.get_first_contact_instance_from_jid(self.account, jid)
|
||||
conversation_textview = self.xmls[jid].get_widget('conversation_textview')
|
||||
message_textview = self.xmls[jid].get_widget('message_textview')
|
||||
message_buffer = message_textview.get_buffer()
|
||||
|
||||
if message != '' or message != '\n':
|
||||
self.save_sent_message(jid, message)
|
||||
if message == '/clear':
|
||||
|
@ -534,21 +531,23 @@ class TabbedChatWindow(chat.Chat):
|
|||
keyID = self.contacts[jid].keyID
|
||||
encrypted = True
|
||||
|
||||
notif_on = gajim.config.get('send_receive_chat_state_notifications')
|
||||
chatstates_on = gajim.config.get(
|
||||
'send_receive_chat_state_notifications')
|
||||
|
||||
chatstate_to_send = None
|
||||
if notif_on: # if we have them one
|
||||
if self.chatstates[jid] is None:
|
||||
|
||||
if chatstates_on: # if we have them one
|
||||
if contact.chatstate is None:
|
||||
# no info about peer
|
||||
# send active to discover chat state capabilities
|
||||
# this is here (and not in send_chatstate)
|
||||
# because we want it sent with REAL message
|
||||
# (not standlone) eg. one that has body
|
||||
chatstate_to_send = 'active'
|
||||
self.chatstates[jid] = 'ask' # pseudo state
|
||||
contact.chatstate = 'ask' # pseudo state
|
||||
|
||||
# if peer supports jep85, send 'active'
|
||||
elif self.chatstates[jid] != False:
|
||||
elif contact.chatstate is not False:
|
||||
#send active chatstate on every message (as JEP says)
|
||||
chatstate_to_send = 'active'
|
||||
|
||||
|
|
Loading…
Reference in New Issue