From 3566e833e321fec223caaeca8a99a42a406fe627 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Sat, 6 Feb 2016 11:41:43 +0100 Subject: [PATCH] Libpurple: Fix #107 - Forward room topic to frontend --- backends/libpurple/main.cpp | 29 +++++++++++++++- tests/libpurple_jabber/muc_topic.py | 51 +++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 tests/libpurple_jabber/muc_topic.py diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 3821382c..005430c2 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -517,6 +517,28 @@ class SpectrumNetworkPlugin : public NetworkPlugin { } } + void handleRoomSubjectChangedRequest(const std::string &user, const std::string &legacyName, const std::string &message) { + PurpleAccount *account = m_sessions[user]; + if (account) { + PurpleConversation *conv = purple_find_conversation_with_account_wrapped(PURPLE_CONV_TYPE_CHAT, legacyName.c_str(), account); + if (!conv) { + conv = purple_find_conversation_with_account_wrapped(PURPLE_CONV_TYPE_IM, legacyName.c_str(), account); + if (!conv) { + conv = purple_conversation_new_wrapped(PURPLE_CONV_TYPE_IM, account, legacyName.c_str()); + } + } + + PurplePlugin *prpl = purple_find_prpl_wrapped(purple_account_get_protocol_id_wrapped(account)); + PurplePluginProtocolInfo *prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); + bool support_set_chat_topic = prpl_info && prpl_info->set_chat_topic; + if (support_set_chat_topic) { + prpl_info->set_chat_topic(purple_account_get_connection_wrapped(account), + purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv)), + message.c_str()); + } + } + } + void handleVCardRequest(const std::string &user, const std::string &legacyName, unsigned int id) { PurpleAccount *account = m_sessions[user]; if (account) { @@ -1767,6 +1789,11 @@ static void gotAttention(PurpleAccount *account, const char *who, PurpleConversa np->handleAttention(np->m_accounts[account], w, ""); } +static void conv_chat_topic_changed(PurpleConversation *conv, const char *old, const char *topic) { + PurpleAccount *account = purple_conversation_get_account_wrapped(conv); + np->handleSubject(np->m_accounts[account], purple_conversation_get_name_wrapped(conv), topic, "Spectrum 2"); +} + static bool initPurple() { bool ret; @@ -1844,7 +1871,7 @@ static bool initPurple() { // purple_signal_connect_wrapped(purple_blist_get_handle_wrapped(), "buddy-signed-off", &blist_handle,PURPLE_CALLBACK(buddySignedOff), NULL); // purple_signal_connect_wrapped(purple_blist_get_handle_wrapped(), "buddy-status-changed", &blist_handle,PURPLE_CALLBACK(buddyStatusChanged), NULL); purple_signal_connect_wrapped(purple_blist_get_handle_wrapped(), "blist-node-removed", &blist_handle,PURPLE_CALLBACK(NodeRemoved), NULL); -// purple_signal_connect_wrapped(purple_conversations_get_handle_wrapped(), "chat-topic-changed", &conversation_handle, PURPLE_CALLBACK(conv_chat_topic_changed), NULL); + purple_signal_connect_wrapped(purple_conversations_get_handle_wrapped(), "chat-topic-changed", &conversation_handle, PURPLE_CALLBACK(conv_chat_topic_changed), NULL); static int xfer_handle; purple_signal_connect_wrapped(purple_xfers_get_handle_wrapped(), "file-send-start", &xfer_handle, PURPLE_CALLBACK(fileSendStart), NULL); purple_signal_connect_wrapped(purple_xfers_get_handle_wrapped(), "file-recv-start", &xfer_handle, PURPLE_CALLBACK(fileRecvStart), NULL); diff --git a/tests/libpurple_jabber/muc_topic.py b/tests/libpurple_jabber/muc_topic.py new file mode 100644 index 00000000..b68064ca --- /dev/null +++ b/tests/libpurple_jabber/muc_topic.py @@ -0,0 +1,51 @@ +import optparse +import sys +import time +import subprocess +import os + +import sleekxmpp + + +class Responder(sleekxmpp.ClientXMPP): + def __init__(self, jid, password, room, room_password, nick): + sleekxmpp.ClientXMPP.__init__(self, jid, password) + self.room = room + self.room_password = room_password + self.nick = nick + self.finished = False + self.add_event_handler("session_start", self.start) + self.add_event_handler("groupchat_subject", self.message) + + self.tests = {} + self.tests["subject_set1"] = ["libpurple: Set subject", False] + + def message(self, msg): + if msg['subject'] == "New subject": + self.tests["subject_set1"][1] = True + + def start(self, event): + self.plugin['xep_0045'].joinMUC(self.room, self.nick, password=self.room_password, wait=True) + self.send_message(mto=self.room, mbody=None, msubject="New subject", mtype='groupchat') + +class Client(sleekxmpp.ClientXMPP): + def __init__(self, jid, password, room, nick): + sleekxmpp.ClientXMPP.__init__(self, jid, password) + self.room = room + self.nick = nick + self.add_event_handler("session_start", self.start) + self.add_event_handler("groupchat_subject", self.message) + self.finished = False + + self.tests = {} + self.tests["subject_set2"] = ["libpurple: Receive subject", False] + + def message(self, msg): + if msg['subject'] == "New subject": + self.tests["subject_set2"][1] = True + self.finished = True + + def start(self, event): + self.getRoster() + self.sendPresence() + self.plugin['xep_0045'].joinMUC(self.room, self.nick, wait=True)