eion/purple-hangouts

Parents 9858d990d07b
Children 994aeef10fe7
Add support for renaming chats either by setting a topic or aliasing the chat
--- a/hangouts_connection.h Tue Sep 20 07:43:11 2016 +1200
+++ b/hangouts_connection.h Wed Sep 21 23:54:03 2016 +1200
@@ -83,6 +83,7 @@
HANGOUTS_DEFINE_PBLITE_REQUEST_FUNC(get_conversation, GetConversation, "conversations/getconversation");
HANGOUTS_DEFINE_PBLITE_REQUEST_FUNC(create_conversation, CreateConversation, "conversations/createconversation");
HANGOUTS_DEFINE_PBLITE_REQUEST_FUNC(delete_conversation, DeleteConversation, "conversations/deleteconversation");
+HANGOUTS_DEFINE_PBLITE_REQUEST_FUNC(rename_conversation, RenameConversation, "conversations/renameconversation");
HANGOUTS_DEFINE_PBLITE_REQUEST_FUNC(modify_conversation_view, ModifyConversationView, "conversations/modifyconversationview");
HANGOUTS_DEFINE_PBLITE_REQUEST_FUNC(add_user, AddUser, "conversations/adduser");
HANGOUTS_DEFINE_PBLITE_REQUEST_FUNC(remove_user, RemoveUser, "conversations/removeuser");
--- a/hangouts_conversation.c Tue Sep 20 07:43:11 2016 +1200
+++ b/hangouts_conversation.c Wed Sep 21 23:54:03 2016 +1200
@@ -2067,4 +2067,20 @@
return roomlist;
}
+void
+hangouts_rename_conversation(HangoutsAccount *ha, const gchar *conv_id, const gchar *alias)
+{
+ RenameConversationRequest request;
+
+ rename_conversation_request__init(&request);
+ request.request_header = hangouts_get_request_header(ha);
+ request.event_request_header = hangouts_get_event_request_header(ha, conv_id);
+
+ request.new_name = (gchar *) alias;
+
+ hangouts_pblite_rename_conversation(ha, &request, NULL, NULL);
+
+ hangouts_request_header_free(request.request_header);
+ hangouts_event_request_header_free(request.event_request_header);
+}
--- a/hangouts_conversation.h Tue Sep 20 07:43:11 2016 +1200
+++ b/hangouts_conversation.h Wed Sep 21 23:54:03 2016 +1200
@@ -70,6 +70,7 @@
void hangouts_chat_invite(PurpleConnection *pc, int id, const char *message, const char *who);
void hangouts_create_conversation(HangoutsAccount *ha, gboolean is_one_to_one, const char *who, const gchar *optional_message);
void hangouts_archive_conversation(HangoutsAccount *ha, const gchar *conv_id);
+void hangouts_rename_conversation(HangoutsAccount *ha, const gchar *conv_id, const gchar *alias);
void hangouts_initiate_chat_from_node(PurpleBlistNode *node, gpointer userdata);
void hangouts_mark_conversation_seen(PurpleConversation *conv, PurpleConversationUpdateType type);
--- a/libhangouts.c Tue Sep 20 07:43:11 2016 +1200
+++ b/libhangouts.c Wed Sep 21 23:54:03 2016 +1200
@@ -136,6 +136,64 @@
}
}
+static void
+hangouts_blist_node_aliased(PurpleBlistNode *node, const char *old_alias)
+{
+ PurpleChat *chat = NULL;
+ PurpleAccount *account = NULL;
+ PurpleConnection *pc;
+ const gchar *conv_id;
+ GHashTable *components;
+ HangoutsAccount *ha;
+
+ if (PURPLE_IS_CHAT(node)) {
+ chat = PURPLE_CHAT(node);
+ account = purple_chat_get_account(chat);
+ }
+
+ if (account == NULL) {
+ return;
+ }
+
+ if (g_strcmp0(purple_account_get_protocol_id(account), HANGOUTS_PLUGIN_ID)) {
+ return;
+ }
+
+ pc = purple_account_get_connection(account);
+ if (pc == NULL) {
+ return;
+ }
+ ha = purple_connection_get_protocol_data(pc);
+
+ if (chat != NULL) {
+ components = purple_chat_get_components(chat);
+ conv_id = g_hash_table_lookup(components, "conv_id");
+ if (conv_id == NULL) {
+ conv_id = purple_chat_get_name_only(chat);
+ }
+
+ hangouts_rename_conversation(ha, conv_id, purple_chat_get_alias(chat));
+ }
+}
+
+static void
+hangouts_chat_set_topic(PurpleConnection *pc, int id, const char *topic)
+{
+ const gchar *conv_id;
+ PurpleChatConversation *chatconv;
+ HangoutsAccount *ha;
+
+ ha = purple_connection_get_protocol_data(pc);
+ chatconv = purple_conversations_find_chat(pc, id);
+ conv_id = purple_conversation_get_data(PURPLE_CONVERSATION(chatconv), "conv_id");
+ if (conv_id == NULL) {
+ // Fix for a race condition around the chat data and serv_got_joined_chat()
+ conv_id = purple_conversation_get_name(PURPLE_CONVERSATION(chatconv));
+ }
+
+ return hangouts_rename_conversation(ha, conv_id, topic);
+}
+
static PurpleCmdRet
hangouts_cmd_leave(PurpleConversation *conv, const gchar *cmd, gchar **args, gchar **error, void *data)
{
@@ -285,6 +343,7 @@
}
purple_signal_connect(purple_blist_get_handle(), "blist-node-removed", account, PURPLE_CALLBACK(hangouts_blist_node_removed), NULL);
+ purple_signal_connect(purple_blist_get_handle(), "blist-node-aliased", account, PURPLE_CALLBACK(hangouts_blist_node_aliased), NULL);
purple_signal_connect(purple_conversations_get_handle(), "conversation-updated", account, PURPLE_CALLBACK(hangouts_mark_conversation_seen), NULL);
ha->active_client_timeout = purple_timeout_add_seconds(HANGOUTS_ACTIVE_CLIENT_TIMEOUT, ((GSourceFunc) hangouts_set_active_client), pc);
@@ -454,7 +513,7 @@
info->id = HANGOUTS_PLUGIN_ID;
info->name = "Hangouts";
- prpl_info->options = OPT_PROTO_NO_PASSWORD;
+ prpl_info->options = OPT_PROTO_NO_PASSWORD | OPT_PROTO_CHAT_TOPIC;
prpl_info->account_options = hangouts_add_account_options(prpl_info->account_options);
purple_signal_register(plugin, "hangouts-received-stateupdate",
@@ -514,6 +573,7 @@
prpl_info->join = hangouts_join_chat;
prpl_info->get_name = hangouts_get_chat_name;
prpl_info->invite = hangouts_chat_invite;
+ prpl_info->set_topic = hangouts_chat_set_topic;
}
static void
@@ -672,7 +732,7 @@
plugin->info = info = g_new0(PurplePluginInfo, 1);
}
- prpl_info->options = OPT_PROTO_NO_PASSWORD | OPT_PROTO_IM_IMAGE;
+ prpl_info->options = OPT_PROTO_NO_PASSWORD | OPT_PROTO_IM_IMAGE | OPT_PROTO_CHAT_TOPIC;
prpl_info->protocol_options = hangouts_add_account_options(prpl_info->protocol_options);
purple_signal_register(plugin, "hangouts-received-stateupdate",
@@ -703,6 +763,7 @@
prpl_info->join_chat = hangouts_join_chat;
prpl_info->get_chat_name = hangouts_get_chat_name;
prpl_info->chat_invite = hangouts_chat_invite;
+ prpl_info->set_chat_topic = hangouts_chat_set_topic;
prpl_info->get_media_caps = hangouts_get_media_caps;
prpl_info->initiate_media = hangouts_initiate_media;
--- a/purplecompat.h Tue Sep 20 07:43:11 2016 +1200
+++ b/purplecompat.h Wed Sep 21 23:54:03 2016 +1200
@@ -20,6 +20,7 @@
#define purple_protocol_action_get_connection(action) ((action)->connection)
#define purple_chat_user_set_alias(cb, alias) g_object_set((cb), "alias", (alias), NULL)
+#define purple_chat_get_alias(chat) g_object_get_data(G_OBJECT(chat), "alias")
#else /*!PURPLE_VERSION_CHECK(3, 0, 0)*/
@@ -31,6 +32,7 @@
#define PURPLE_IS_CHAT PURPLE_BLIST_NODE_IS_CHAT
#define purple_chat_get_name_only purple_chat_get_name
#define purple_chat_set_alias purple_blist_alias_chat
+#define purple_chat_get_alias(chat) ((chat)->alias)
#define purple_buddy_set_server_alias purple_blist_server_alias_buddy
static inline void
purple_blist_node_set_transient(PurpleBlistNode *node, gboolean transient)