we can now disbale chat state via GUI [a MUST in jep]
This commit is contained in:
parent
dcedc99d23
commit
51aa52683a
|
@ -117,7 +117,7 @@ class Config:
|
||||||
'dictionary_url': [opt_str, 'http://dictionary.reference.com/search?q='],
|
'dictionary_url': [opt_str, 'http://dictionary.reference.com/search?q='],
|
||||||
'always_english_wikipedia': [opt_bool, False],
|
'always_english_wikipedia': [opt_bool, False],
|
||||||
'use_dbus': [opt_bool, True], # allow control via dbus service
|
'use_dbus': [opt_bool, True], # allow control via dbus service
|
||||||
'send_chat_state_notifications': [opt_bool, True],
|
'send_receive_chat_state_notifications': [opt_bool, True],
|
||||||
}
|
}
|
||||||
|
|
||||||
__options_per_key = {
|
__options_per_key = {
|
||||||
|
|
|
@ -633,12 +633,14 @@ class Connection:
|
||||||
if realm == common.xmpp.NS_REGISTER:
|
if realm == common.xmpp.NS_REGISTER:
|
||||||
if event == common.xmpp.features.REGISTER_DATA_RECEIVED:
|
if event == common.xmpp.features.REGISTER_DATA_RECEIVED:
|
||||||
# data is (agent, DataFrom)
|
# data is (agent, DataFrom)
|
||||||
if self.new_account_info and self.new_account_info['hostname'] == data[0]:
|
if self.new_account_info and\
|
||||||
|
self.new_account_info['hostname'] == data[0]:
|
||||||
#it's a new account
|
#it's a new account
|
||||||
req = data[1].asDict()
|
req = data[1].asDict()
|
||||||
req['username'] = self.new_account_info['name']
|
req['username'] = self.new_account_info['name']
|
||||||
req['password'] = self.new_account_info['password']
|
req['password'] = self.new_account_info['password']
|
||||||
if not common.xmpp.features.register(self.connection, data[0], req):
|
if not common.xmpp.features.register(self.connection, data[0],
|
||||||
|
req):
|
||||||
self.dispatch('ERROR', (_('Error:'), self.connection.lastErr))
|
self.dispatch('ERROR', (_('Error:'), self.connection.lastErr))
|
||||||
return
|
return
|
||||||
self.connected = 0
|
self.connected = 0
|
||||||
|
|
|
@ -258,8 +258,8 @@ class PreferencesWindow:
|
||||||
set_active(gajim.config.get('ignore_unknown_contacts'))
|
set_active(gajim.config.get('ignore_unknown_contacts'))
|
||||||
|
|
||||||
# send chat state notifications
|
# send chat state notifications
|
||||||
st = gajim.config.get('send_chat_state_notifications')
|
st = gajim.config.get('send_receive_chat_state_notifications')
|
||||||
btn = self.xml.get_widget('send_chat_state_checkbutton')
|
btn = self.xml.get_widget('send_receive_chat_state_checkbutton')
|
||||||
if st:
|
if st:
|
||||||
btn.set_active(True)
|
btn.set_active(True)
|
||||||
else:
|
else:
|
||||||
|
@ -696,8 +696,9 @@ class PreferencesWindow:
|
||||||
def on_ignore_events_from_unknown_contacts_checkbutton_toggled(self, widget):
|
def on_ignore_events_from_unknown_contacts_checkbutton_toggled(self, widget):
|
||||||
self.on_checkbutton_toggled(widget, 'ignore_unknown_contacts')
|
self.on_checkbutton_toggled(widget, 'ignore_unknown_contacts')
|
||||||
|
|
||||||
def on_send_chat_state_checkbutton_toggled(self, widget):
|
def on_send_receive_chat_state_checkbutton_toggled(self, widget):
|
||||||
self.on_checkbutton_toggled(widget, 'send_chat_state_notifications')
|
self.on_checkbutton_toggled(widget,
|
||||||
|
'send_receive_chat_state_notifications')
|
||||||
|
|
||||||
def on_play_sounds_checkbutton_toggled(self, widget):
|
def on_play_sounds_checkbutton_toggled(self, widget):
|
||||||
self.on_checkbutton_toggled(widget, 'sounds_on',
|
self.on_checkbutton_toggled(widget, 'sounds_on',
|
||||||
|
|
|
@ -378,7 +378,7 @@ class Interface:
|
||||||
if self.windows[account]['chats'].has_key(jid):
|
if self.windows[account]['chats'].has_key(jid):
|
||||||
chat_win = self.windows[account]['chats'][jid]
|
chat_win = self.windows[account]['chats'][jid]
|
||||||
# chatstates - display jep85 events in window
|
# chatstates - display jep85 events in window
|
||||||
if chatstate_tag != None:
|
if chatstate_tag is not None:
|
||||||
if chat_win.chatstates[jid] == 'ask':
|
if chat_win.chatstates[jid] == 'ask':
|
||||||
chat_win.chatstates[jid] = 'active'
|
chat_win.chatstates[jid] = 'active'
|
||||||
chat_win.print_conversation(jid + ' is now ' + chatstate_tag, jid, 'status', tim = array[2])
|
chat_win.print_conversation(jid + ' is now ' + chatstate_tag, jid, 'status', tim = array[2])
|
||||||
|
|
7005
src/gtkgui.glade
7005
src/gtkgui.glade
File diff suppressed because it is too large
Load Diff
|
@ -232,7 +232,7 @@ class TabbedChatWindow(chat.Chat):
|
||||||
minimize action also focuses out first so it's catched here'''
|
minimize action also focuses out first so it's catched here'''
|
||||||
window_state = widget.window.get_state()
|
window_state = widget.window.get_state()
|
||||||
if window_state is None:
|
if window_state is None:
|
||||||
print 'return NOOOOOONE'
|
#print 'return NOOOOOONE'
|
||||||
return
|
return
|
||||||
|
|
||||||
self.send_chatstate('inactive')
|
self.send_chatstate('inactive')
|
||||||
|
@ -319,6 +319,7 @@ class TabbedChatWindow(chat.Chat):
|
||||||
|
|
||||||
def check_for_possible_paused_chatstate(self, contact):
|
def check_for_possible_paused_chatstate(self, contact):
|
||||||
''' did we move mouse of that window or kbd activity in that window
|
''' did we move mouse of that window or kbd activity in that window
|
||||||
|
in the last 5 seconds?
|
||||||
if yes we go active
|
if yes we go active
|
||||||
if no we go paused if we were previously composing '''
|
if no we go paused if we were previously composing '''
|
||||||
current_state = self.chatstates[contact.jid]
|
current_state = self.chatstates[contact.jid]
|
||||||
|
@ -328,12 +329,16 @@ class TabbedChatWindow(chat.Chat):
|
||||||
#print 'mouse', self.mouse_over_in_last_5_secs
|
#print 'mouse', self.mouse_over_in_last_5_secs
|
||||||
#print 'kbd', self.kbd_activity_in_last_5_secs
|
#print 'kbd', self.kbd_activity_in_last_5_secs
|
||||||
|
|
||||||
|
#gajim.log.debug('about %s' % contact.jid)
|
||||||
if self.mouse_over_in_last_5_secs:
|
if self.mouse_over_in_last_5_secs:
|
||||||
|
#gajim.log.debug('sending active because of mouseover in last 5')
|
||||||
self.send_chatstate('active')
|
self.send_chatstate('active')
|
||||||
elif self.kbd_activity_in_last_5_secs:
|
elif self.kbd_activity_in_last_5_secs:
|
||||||
|
#gajim.log.debug('sending composing because of kbd activity in last 5')
|
||||||
self.send_chatstate('composing')
|
self.send_chatstate('composing')
|
||||||
else:
|
else:
|
||||||
if self.chatstates[contact.jid] == 'composing':
|
if self.chatstates[contact.jid] == 'composing':
|
||||||
|
#gajim.log.debug('sending paused because of inactivity in last 5')
|
||||||
self.send_chatstate('paused') # pause composing
|
self.send_chatstate('paused') # pause composing
|
||||||
|
|
||||||
# assume no activity and let the motion-notify or key_press make them True
|
# assume no activity and let the motion-notify or key_press make them True
|
||||||
|
@ -348,14 +353,17 @@ class TabbedChatWindow(chat.Chat):
|
||||||
|
|
||||||
def check_for_possible_inactive_chatstate(self, contact):
|
def check_for_possible_inactive_chatstate(self, contact):
|
||||||
''' did we move mouse over that window or kbd activity in that window
|
''' did we move mouse over that window or kbd activity in that window
|
||||||
|
in the last 30 seconds?
|
||||||
if yes we go active if not already
|
if yes we go active if not already
|
||||||
if no we go inactive if not already '''
|
if no we go inactive if not already '''
|
||||||
current_state = self.chatstates[contact.jid]
|
current_state = self.chatstates[contact.jid]
|
||||||
if current_state == False: # jid doesn't support chatstates
|
if current_state == False: # jid doesn't support chatstates
|
||||||
return False # stop looping
|
return False # stop looping
|
||||||
|
|
||||||
|
#gajim.log.debug('about %s' % contact.jid)
|
||||||
if not (self.mouse_over_in_last_30_secs or\
|
if not (self.mouse_over_in_last_30_secs or\
|
||||||
self.kbd_activity_in_last_30_secs):
|
self.kbd_activity_in_last_30_secs):
|
||||||
|
#gajim.log.debug('sending inactive because of lack of activity in last 30')
|
||||||
self.send_chatstate('inactive')
|
self.send_chatstate('inactive')
|
||||||
|
|
||||||
# assume no activity and let the motion-notify or key_press make them True
|
# assume no activity and let the motion-notify or key_press make them True
|
||||||
|
@ -445,24 +453,30 @@ class TabbedChatWindow(chat.Chat):
|
||||||
# more on that http://www.jabber.org/jeps/jep-0085.html#statechart
|
# more on that http://www.jabber.org/jeps/jep-0085.html#statechart
|
||||||
|
|
||||||
# do not send nothing if we have chat state notifications disabled
|
# do not send nothing if we have chat state notifications disabled
|
||||||
if not gajim.config.get('send_chat_state_notifications'):
|
# that means we won't reply to the <active/> from other peer
|
||||||
|
# so we do not broadcast jep85 capabalities
|
||||||
|
if not gajim.config.get('send_receive_chat_state_notifications'):
|
||||||
return
|
return
|
||||||
|
|
||||||
jid = self.get_active_jid()
|
jid = self.get_active_jid()
|
||||||
|
|
||||||
if self.chatstates[jid] == False: # jid cannot do jep85
|
if self.chatstates[jid] == False: # jid cannot do jep85
|
||||||
|
#print 'jid does not do jep85'
|
||||||
return
|
return
|
||||||
|
|
||||||
# if current state equals previous state, return
|
# if current state equals previous state, return
|
||||||
if self.chatstates[jid] == state:
|
if self.chatstates[jid] == state:
|
||||||
|
#print 'same states'
|
||||||
return
|
return
|
||||||
|
|
||||||
if self.chatstates[jid] is None:
|
if self.chatstates[jid] is None:
|
||||||
# state = 'ask'
|
# we don't know anything about jid,
|
||||||
# send and return
|
# send 'active', set current state to 'ask' and return
|
||||||
|
#print 'None so return'
|
||||||
return
|
return
|
||||||
|
|
||||||
if self.chatstates[jid] == 'ask':
|
if self.chatstates[jid] == 'ask':
|
||||||
|
#print 'ask so return'
|
||||||
return
|
return
|
||||||
|
|
||||||
# prevent going paused if we we were not composing (JEP violation)
|
# prevent going paused if we we were not composing (JEP violation)
|
||||||
|
@ -471,15 +485,17 @@ class TabbedChatWindow(chat.Chat):
|
||||||
|
|
||||||
# if we're inactive prevent composing (JEP violation)
|
# if we're inactive prevent composing (JEP violation)
|
||||||
if self.chatstates[jid] == 'inactive' and state == 'composing':
|
if self.chatstates[jid] == 'inactive' and state == 'composing':
|
||||||
raise RuntimeError, 'inactive chatstate can only be followed by active'
|
gajim.connections[self.account].send_message(jid, None, None,
|
||||||
|
chatstate = 'active') # send active before
|
||||||
|
#raise RuntimeError, 'inactive chatstate can only be followed by active'
|
||||||
|
|
||||||
self.chatstates[jid] = state
|
self.chatstates[jid] = state
|
||||||
|
#print 'SENDING', state
|
||||||
gajim.connections[self.account].send_message(jid, None, None,
|
gajim.connections[self.account].send_message(jid, None, None,
|
||||||
chatstate = state)
|
chatstate = state)
|
||||||
|
|
||||||
|
|
||||||
def send_message(self, message):
|
def send_message(self, message):
|
||||||
"""Send the message given to the active tab"""
|
"""Send the given message to the active tab"""
|
||||||
if not message:
|
if not message:
|
||||||
return
|
return
|
||||||
jid = self.get_active_jid()
|
jid = self.get_active_jid()
|
||||||
|
@ -502,20 +518,23 @@ class TabbedChatWindow(chat.Chat):
|
||||||
keyID = self.users[jid].keyID
|
keyID = self.users[jid].keyID
|
||||||
encrypted = True
|
encrypted = True
|
||||||
|
|
||||||
# chatstates - if no info about peer, discover
|
notif_on = gajim.config.get('send_receive_chat_state_notifications')
|
||||||
|
# chatstates - if no info about peer, start discover procedure
|
||||||
|
|
||||||
|
if notif_on: # if we have them one
|
||||||
if self.chatstates[jid] is None:
|
if self.chatstates[jid] is None:
|
||||||
gajim.connections[self.account].send_message(jid, message, keyID,
|
chatstate_to_send = 'active'
|
||||||
chatstate = 'active')
|
|
||||||
self.chatstates[jid] = 'ask'
|
self.chatstates[jid] = 'ask'
|
||||||
|
|
||||||
# if peer supports jep85, send 'active'
|
# if peer supports jep85, send 'active'
|
||||||
elif self.chatstates[jid] != False:
|
elif self.chatstates[jid] != False:
|
||||||
#send active chatstate on every message (as JEP says)
|
#send active chatstate on every message (as JEP says)
|
||||||
gajim.connections[self.account].send_message(jid, message, keyID,
|
chatstate_to_send = 'active'
|
||||||
chatstate = 'active')
|
|
||||||
else: # just send the message
|
else: # just send the message
|
||||||
gajim.connections[self.account].send_message(jid, message, keyID)
|
chatstate_to_send = None
|
||||||
|
|
||||||
|
gajim.connections[self.account].send_message(jid, message, keyID,
|
||||||
|
chatstate = chatstate_to_send)
|
||||||
message_buffer.set_text('')
|
message_buffer.set_text('')
|
||||||
self.print_conversation(message, jid, jid, encrypted = encrypted)
|
self.print_conversation(message, jid, jid, encrypted = encrypted)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue