From ceb212573c5bded33a15d8ae012f6146d4c4e86f Mon Sep 17 00:00:00 2001 From: Yann Leboulanger <asterix@lagaule.org> Date: Fri, 22 Aug 2014 15:44:07 +0200 Subject: [PATCH] add /ping command in groupchat to ping occupants --- src/chat_control.py | 14 +++++++++----- src/command_system/implementation/standard.py | 9 +++++++++ src/common/connection.py | 5 +++-- src/groupchat_control.py | 9 +++++++++ 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/chat_control.py b/src/chat_control.py index 47865d7e6f..5975749c7b 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -208,11 +208,6 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): return self.print_conversation(_('Ping?'), 'status') - def _nec_ping_reply(self, obj): - if self.contact != obj.contact: - return - self.print_conversation(_('Pong! (%s s.)') % obj.seconds, 'status') - def _nec_ping_error(self, obj): if self.contact != obj.contact: return @@ -2850,6 +2845,15 @@ class ChatControl(ChatControlBase): return self.update_ui() + def _nec_ping_reply(self, obj): + if obj.control: + if obj.control != self: + return + else: + if self.contact != obj.contact: + return + self.print_conversation(_('Pong! (%s s.)') % obj.seconds, 'status') + def set_control_active(self, state): ChatControlBase.set_control_active(self, state) # send chatstate inactive to the one we're leaving diff --git a/src/command_system/implementation/standard.py b/src/command_system/implementation/standard.py index 3994eae590..f853d593f1 100644 --- a/src/command_system/implementation/standard.py +++ b/src/command_system/implementation/standard.py @@ -410,3 +410,12 @@ class StandardGroupChatCommands(CommandContainer): @doc(_("Allow an occupant to send you public or private messages")) def unblock(self, who): self.on_unblock(None, who) + + @command + @doc(_("Send a ping to the contact")) + def ping(self, nick): + if self.account == gajim.ZEROCONF_ACC_NAME: + raise CommandError(_('Command is not supported for zeroconf accounts')) + gc_c = gajim.contacts.get_gc_contact(self.account, self.room_jid, nick) + gajim.connections[self.account].sendPing(gc_c, self) + diff --git a/src/common/connection.py b/src/common/connection.py index 5fbe913a25..a1353e8af8 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -1551,10 +1551,11 @@ class Connection(CommonConnection, ConnectionHandlers): assert id_ == self.awaiting_xmpp_ping_id self.awaiting_xmpp_ping_id = None - def sendPing(self, pingTo=None): + def sendPing(self, pingTo=None, control=None): """ Send XMPP Ping (XEP-0199) request. If pingTo is not set, ping is sent to server to detect connection failure at application level + If control is set, display result there """ if not gajim.account_is_connected(self.name): return @@ -1577,7 +1578,7 @@ class Connection(CommonConnection, ConnectionHandlers): return timeDiff = round(timePong - timePing, 2) gajim.nec.push_incoming_event(PingReplyEvent(None, conn=self, - contact=pingTo, seconds=timeDiff)) + contact=pingTo, seconds=timeDiff, control=control)) if pingTo: timePing = time_time() self.connection.SendAndCallForResponse(iq, _on_response) diff --git a/src/groupchat_control.py b/src/groupchat_control.py index a2eb20b184..a0938bbb26 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -1375,6 +1375,15 @@ class GroupchatControl(ChatControlBase): obj.xhtml, self.session, msg_id=obj.msg_id, encrypted=obj.encrypted, displaymarking=obj.displaymarking) + def _nec_ping_reply(self, obj): + if obj.control: + if obj.control != self: + return + else: + if self.contact != obj.contact: + return + self.print_conversation(_('Pong! (%s s.)') % obj.seconds) + def got_connected(self): # Make autorejoin stop. if self.autorejoin: -- GitLab