IRCv3: Implement Purple.ProtocolConversation.refresh

Mon, 23 Dec 2024 20:44:41 -0600

author
Gary Kramlich <grim@reaperworld.com>
date
Mon, 23 Dec 2024 20:44:41 -0600
changeset 43105
73562f3b9809
parent 43104
f87ae4effec7
child 43106
7cd7744de3bc

IRCv3: Implement Purple.ProtocolConversation.refresh

This just checks if the conversation is offline, sets it to online, and
rejoins it if is a channel.

Testing Done:
Called in the turtles.

Bugs closed: PIDGIN-17989

Reviewed at https://reviews.imfreedom.org/r/3700/

protocols/ircv3/purpleircv3protocolconversation.c file | annotate | diff | comparison | revisions
--- a/protocols/ircv3/purpleircv3protocolconversation.c	Mon Dec 23 20:39:36 2024 -0600
+++ b/protocols/ircv3/purpleircv3protocolconversation.c	Mon Dec 23 20:44:41 2024 -0600
@@ -289,6 +289,44 @@
 	ibis_client_write(client, message);
 }
 
+static void
+purple_ircv3_protocol_conversation_refresh(G_GNUC_UNUSED PurpleProtocolConversation *protocol,
+                                           PurpleConversation *conversation)
+{
+	PurpleIRCv3Connection *connection;
+	PurpleAccount *account = NULL;
+	PurpleConnection *purple_connection = NULL;
+	IbisClient *client = NULL;
+	IbisMessage *message = NULL;
+
+	if(purple_conversation_get_online(conversation)) {
+		return;
+	}
+
+	if(!purple_conversation_is_channel(conversation)) {
+		/* We need to mark DM's as online again. */
+		purple_conversation_set_online(conversation, TRUE);
+
+		return;
+	}
+
+	account = purple_conversation_get_account(conversation);
+	purple_connection = purple_account_get_connection(account);
+	connection = PURPLE_IRCV3_CONNECTION(purple_connection);
+
+	message = ibis_message_new(IBIS_MSG_JOIN);
+	ibis_message_set_params(message, purple_conversation_get_id(conversation),
+	                        NULL);
+
+	client = purple_ircv3_connection_get_client(connection);
+	ibis_client_write(client, message);
+
+	/* TODO: We need to validate the JOIN by handling the join from the server,
+	 * but right now we just assume it was successful.
+	 */
+	purple_conversation_set_online(conversation, TRUE);
+}
+
 void
 purple_ircv3_protocol_conversation_init(PurpleProtocolConversationInterface *iface) {
 	iface->send_message_async =
@@ -310,4 +348,6 @@
 
 	iface->send_typing  =
 		purple_ircv3_protocol_conversation_send_typing;
+	iface->refresh =
+		purple_ircv3_protocol_conversation_refresh;
 }

mercurial