# HG changeset patch
# Node ID df86f4b0d9e4
# Parent  d861b10105fb
diff --git a/ChangeLog.API b/ChangeLog.API
--- a/ChangeLog.API
+++ b/ChangeLog.API
@@ -36,7 +36,6 @@
 		* PurpleProtocolChatIface
 		* PurpleProtocolXferIface
 		* PurpleProtocolRoomlistIface
-		* PurpleProtocolAttentionIface
 		* PurpleProtocolMediaIface
 		* PurpleProtocolFactoryIface
 		* purple_protocol_get_* for PurpleProtocol members
@@ -337,6 +336,17 @@
 		* purple_account_set_password.  Use
 		  purple_credential_manager_write_password_async instead.
 		* purple_account_set_public_alias
+		* PurpleAttentionType
+		* purple_attention_type_set_name
+		* purple_attention_type_set_incoming_desc
+		* purple_attention_type_set_outgoing_desc
+		* purple_attention_type_set_icon_name
+		* purple_attention_type_set_unlocalized_name
+		* purple_attention_type_get_name
+		* purple_attention_type_get_incoming_desc
+		* purple_attention_type_get_outgoing_desc
+		* purple_attention_type_get_icon_name
+		* purple_attention_type_get_unlocalized_name
 		* purple_base16_*
 		* purple_base64_*. Use g_base64_* instead
 		* purple_blist_get_ui_data
@@ -413,6 +423,7 @@
 		* purple_find_pounce
 		* PurpleGetPublicAliasSuccessCallback
 		* PurpleGetPublicAliasFailureCallback
+		* purple_get_attention_type_from_code
 		* purple_get_host_name. Use g_get_host_name, instead.
 		* purple_get_tzoff_str(). Use g_date_time_format, instead.
 		* PurpleIdleUiOps
@@ -536,6 +547,9 @@
 		* pidgin_protocol_option_menu_new
 		* purple_proxy_connect_socks5
 		* purple_proxy_connect_socks5_account
+		* purple_prpl_got_attention
+		* purple_prpl_got_attention_in_chat
+		* purple_prpl_send_attention
 		* purple_quotedp_decode. See the GMime library if needed.
 		* purple_restore_default_signal_handlers
 		* purple_request_certificate
diff --git a/libpurple/meson.build b/libpurple/meson.build
--- a/libpurple/meson.build
+++ b/libpurple/meson.build
@@ -41,7 +41,6 @@
 	'purpleaccountpresence.c',
 	'purpleaccountusersplit.c',
 	'purpleattachment.c',
-	'purpleattentiontype.c',
 	'purplebuddypresence.c',
 	'purplechatconversation.c',
 	'purplechatuser.c',
@@ -63,7 +62,6 @@
 	'purpleplugininfo.c',
 	'purplepresence.c',
 	'purpleprotocol.c',
-	'purpleprotocolattention.c',
 	'purpleprotocolchat.c',
 	'purpleprotocolclient.c',
 	'purpleprotocolfactory.c',
@@ -135,7 +133,6 @@
 	'purpleaccountoption.h',
 	'purpleaccountpresence.h',
 	'purpleaccountusersplit.h',
-	'purpleattentiontype.h',
 	'purplebuddypresence.h',
 	'purplechatconversation.h',
 	'purplechatuser.h',
@@ -158,7 +155,6 @@
 	'purpleplugininfo.h',
 	'purplepresence.h',
 	'purpleprotocol.h',
-	'purpleprotocolattention.h',
 	'purpleprotocolchat.h',
 	'purpleprotocolclient.h',
 	'purpleprotocolfactory.h',
diff --git a/libpurple/protocols.h b/libpurple/protocols.h
--- a/libpurple/protocols.h
+++ b/libpurple/protocols.h
@@ -228,49 +228,6 @@
                                     PurplePresence *presence);
 
 /**
- * purple_protocol_send_attention:
- * @gc: The connection to send the message on.
- * @who: Whose attention to request.
- * @type_code: An index into the protocol's attention_types list determining the type
- *        of the attention request command to send. 0 if protocol only defines one
- *        (for example, Yahoo and MSN), but protocols are allowed to define more.
- *
- * Send an attention request message.
- *
- * Note that you can't send arbitrary PurpleAttentionType's, because there is
- * only a fixed set of attention commands.
- */
-void purple_protocol_send_attention(PurpleConnection *gc, const char *who,
-                                    guint type_code);
-
-/**
- * purple_protocol_got_attention:
- * @gc: The connection that received the attention message.
- * @who: Who requested your attention.
- * @type_code: An index into the protocol's attention_types list
- *                  determining the type of the attention request command to
- *                  send.
- *
- * Process an incoming attention message.
- */
-void purple_protocol_got_attention(PurpleConnection *gc, const char *who,
-                                   guint type_code);
-
-/**
- * purple_protocol_got_attention_in_chat:
- * @gc: The connection that received the attention message.
- * @id: The chat id.
- * @who: Who requested your attention.
- * @type_code: An index into the protocol's attention_types list
- *                  determining the type of the attention request command to
- *                  send.
- *
- * Process an incoming attention message in a chat.
- */
-void purple_protocol_got_attention_in_chat(PurpleConnection *gc, int id,
-                                           const char *who, guint type_code);
-
-/**
  * purple_protocol_get_media_caps:
  * @account: The account the user is on.
  * @who: The name of the contact to check capabilities for.
diff --git a/libpurple/protocols.c b/libpurple/protocols.c
--- a/libpurple/protocols.c
+++ b/libpurple/protocols.c
@@ -32,7 +32,6 @@
 #include "purpleconversationmanager.h"
 #include "purplecredentialmanager.h"
 #include "purpleprotocol.h"
-#include "purpleprotocolattention.h"
 #include "purpleprotocolmanager.h"
 #include "purpleprotocolmedia.h"
 #include "purpleprotocolserver.h"
@@ -349,130 +348,6 @@
 	                        (GCopyFunc)purple_status_new, presence);
 }
 
-static void
-purple_protocol_attention(PurpleConversation *conv, const char *who,
-	guint type, PurpleMessageFlags flags, time_t mtime)
-{
-	PurpleAccount *account = purple_conversation_get_account(conv);
-	purple_signal_emit(purple_conversations_get_handle(),
-		flags == PURPLE_MESSAGE_SEND ? "sent-attention" : "got-attention",
-		account, who, conv, type);
-}
-
-void
-purple_protocol_send_attention(PurpleConnection *gc, const char *who, guint type_code)
-{
-	PurpleAttentionType *attn;
-	PurpleProtocol *protocol;
-	PurpleProtocolManager *manager;
-	PurpleConversation *im;
-	PurpleBuddy *buddy;
-	const char *alias;
-	gchar *description;
-
-	g_return_if_fail(gc != NULL);
-	g_return_if_fail(who != NULL);
-
-	manager = purple_protocol_manager_get_default();
-	protocol = purple_protocol_manager_find(manager,
-	                                        purple_account_get_protocol_id(purple_connection_get_account(gc)));
-	g_return_if_fail(PURPLE_IS_PROTOCOL_ATTENTION(protocol));
-
-	attn = purple_get_attention_type_from_code(purple_connection_get_account(gc), type_code);
-
-	if ((buddy = purple_blist_find_buddy(purple_connection_get_account(gc), who)) != NULL) {
-		alias = purple_buddy_get_contact_alias(buddy);
-	} else {
-		alias = who;
-	}
-
-	if (attn && purple_attention_type_get_outgoing_desc(attn)) {
-		description = g_strdup_printf(purple_attention_type_get_outgoing_desc(attn), alias);
-	} else {
-		description = g_strdup_printf(_("Requesting %s's attention..."), alias);
-	}
-
-	purple_debug_info("server", "serv_send_attention: sending '%s' to %s\n",
-			description, who);
-
-	if (!purple_protocol_attention_send_attention(PURPLE_PROTOCOL_ATTENTION(protocol), gc, who, type_code)) {
-		return;
-	}
-
-	im = purple_im_conversation_new(purple_connection_get_account(gc), who);
-	purple_conversation_write_system_message(PURPLE_CONVERSATION(im), description, 0);
-	purple_protocol_attention(PURPLE_CONVERSATION(im), who, type_code, PURPLE_MESSAGE_SEND, time(NULL));
-
-	g_free(description);
-}
-
-static void
-got_attention(PurpleConnection *gc, int id, const char *who, guint type_code)
-{
-	PurpleMessageFlags flags;
-	PurpleAttentionType *attn;
-	PurpleBuddy *buddy;
-	const char *alias;
-	gchar *description;
-	time_t mtime;
-
-	mtime = time(NULL);
-
-	attn = purple_get_attention_type_from_code(purple_connection_get_account(gc), type_code);
-
-	/* PURPLE_MESSAGE_NOTIFY is for attention messages. */
-	flags = PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NOTIFY | PURPLE_MESSAGE_RECV;
-
-	/* TODO: if (attn->icon_name) is non-null, use it to lookup an emoticon and display
-	 * it next to the attention command. And if it is null, display a generic icon. */
-
-	if ((buddy = purple_blist_find_buddy(purple_connection_get_account(gc), who)) != NULL)
-		alias = purple_buddy_get_contact_alias(buddy);
-	else
-		alias = who;
-
-	if (attn && purple_attention_type_get_incoming_desc(attn)) {
-		description = g_strdup_printf(purple_attention_type_get_incoming_desc(attn), alias);
-	} else {
-		description = g_strdup_printf(_("%s has requested your attention!"), alias);
-	}
-
-	purple_debug_info("server", "got_attention: got '%s' from %s\n",
-			description, who);
-
-	if (id == -1)
-		purple_serv_got_im(gc, who, description, flags, mtime);
-	else
-		purple_serv_got_chat_in(gc, id, who, flags, description, mtime);
-
-	/* TODO: sounds (depending on PurpleAttentionType), shaking, etc. */
-
-	g_free(description);
-}
-
-void
-purple_protocol_got_attention(PurpleConnection *gc, const char *who, guint type_code)
-{
-	PurpleConversation *conv = NULL;
-	PurpleConversationManager *manager = NULL;
-	PurpleAccount *account = purple_connection_get_account(gc);
-
-	got_attention(gc, -1, who, type_code);
-
-	manager = purple_conversation_manager_get_default();
-	conv = purple_conversation_manager_find(manager, account, who);
-	if(PURPLE_IS_CONVERSATION(conv)) {
-		purple_protocol_attention(conv, who, type_code, PURPLE_MESSAGE_RECV,
-		                          time(NULL));
-	}
-}
-
-void
-purple_protocol_got_attention_in_chat(PurpleConnection *gc, int id, const char *who, guint type_code)
-{
-	got_attention(gc, id, who, type_code);
-}
-
 gboolean
 purple_protocol_initiate_media(PurpleAccount *account,
 			   const char *who,
diff --git a/libpurple/protocols/jabber/jabber.h b/libpurple/protocols/jabber/jabber.h
--- a/libpurple/protocols/jabber/jabber.h
+++ b/libpurple/protocols/jabber/jabber.h
@@ -389,8 +389,6 @@
 void jabber_register_gateway(JabberStream *js, const char *gateway);
 void jabber_register_account(PurpleProtocolServer *protocol_server, PurpleAccount *account);
 void jabber_unregister_account(PurpleProtocolServer *protocol_server, PurpleAccount *account, PurpleAccountUnregistrationCb cb, void *user_data);
-gboolean jabber_send_attention(PurpleProtocolAttention *attn, PurpleConnection *gc, const char *username, guint code);
-GList *jabber_attention_types(PurpleProtocolAttention *attn, PurpleAccount *account);
 void jabber_convo_closed(PurpleProtocolClient *client, PurpleConnection *gc, const char *who);
 PurpleChat *jabber_find_blist_chat(PurpleProtocolClient *client, PurpleAccount *account, const char *name);
 gboolean jabber_offline_message(PurpleProtocolClient *client, PurpleBuddy *buddy);
diff --git a/libpurple/protocols/jabber/jabber.c b/libpurple/protocols/jabber/jabber.c
--- a/libpurple/protocols/jabber/jabber.c
+++ b/libpurple/protocols/jabber/jabber.c
@@ -3120,135 +3120,6 @@
 	return PURPLE_CMD_RET_OK;
 }
 
-static gboolean _jabber_send_buzz(JabberStream *js, const char *username, char **error) {
-
-	JabberBuddy *jb;
-	JabberBuddyResource *jbr;
-	PurpleConnection *gc = js->gc;
-	PurpleBuddy *buddy =
-		purple_blist_find_buddy(purple_connection_get_account(gc), username);
-	const gchar *alias =
-		buddy ? purple_buddy_get_contact_alias(buddy) : username;
-
-	if(!username)
-		return FALSE;
-
-	jb = jabber_buddy_find(js, username, FALSE);
-	if(!jb) {
-		*error = g_strdup_printf(_("Unable to buzz, because there is nothing "
-			"known about %s."), alias);
-		return FALSE;
-	}
-
-	jbr = jabber_buddy_find_resource(jb, NULL);
-	if (!jbr) {
-		*error = g_strdup_printf(_("Unable to buzz, because %s might be offline."),
-			alias);
-		return FALSE;
-	}
-
-	if (jabber_resource_has_capability(jbr, NS_ATTENTION)) {
-		PurpleXmlNode *buzz, *msg = purple_xmlnode_new("message");
-		gchar *to;
-
-		to = g_strdup_printf("%s/%s", username, jbr->name);
-		purple_xmlnode_set_attrib(msg, "to", to);
-		g_free(to);
-
-		/* avoid offline storage */
-		purple_xmlnode_set_attrib(msg, "type", "headline");
-
-		buzz = purple_xmlnode_new_child(msg, "attention");
-		purple_xmlnode_set_namespace(buzz, NS_ATTENTION);
-
-		jabber_send(js, msg);
-		purple_xmlnode_free(msg);
-
-		return TRUE;
-	} else {
-		*error = g_strdup_printf(_("Unable to buzz, because %s does "
-			"not support it or does not wish to receive buzzes now."), alias);
-		return FALSE;
-	}
-}
-
-static PurpleCmdRet jabber_cmd_buzz(PurpleConversation *conv,
-		const char *cmd, char **args, char **error, void *data)
-{
-	PurpleAccount *account = purple_conversation_get_account(conv);
-	JabberStream *js = purple_connection_get_protocol_data(purple_account_get_connection(account));
-	const gchar *who;
-	gchar *description;
-	PurpleBuddy *buddy;
-	const char *alias;
-	PurpleAttentionType *attn =
-		purple_get_attention_type_from_code(account, 0);
-
-	if (!args || !args[0]) {
-		/* use the buddy from conversation, if it's a one-to-one conversation */
-		if (PURPLE_IS_IM_CONVERSATION(conv)) {
-			who = purple_conversation_get_name(conv);
-		} else {
-			return PURPLE_CMD_RET_FAILED;
-		}
-	} else {
-		who = args[0];
-	}
-
-	buddy = purple_blist_find_buddy(account, who);
-	if (buddy != NULL)
-		alias = purple_buddy_get_contact_alias(buddy);
-	else
-		alias = who;
-
-	description =
-		g_strdup_printf(purple_attention_type_get_outgoing_desc(attn), alias);
-	purple_conversation_write_system_message(conv, description,
-		PURPLE_MESSAGE_NOTIFY);
-	g_free(description);
-	return _jabber_send_buzz(js, who, error)  ? PURPLE_CMD_RET_OK : PURPLE_CMD_RET_FAILED;
-}
-
-GList *jabber_attention_types(PurpleProtocolAttention *attn, PurpleAccount *account)
-{
-	static GList *types = NULL;
-
-	if (!types) {
-		types = g_list_append(types, purple_attention_type_new("Buzz", _("Buzz"),
-				_("%s has buzzed you!"), _("Buzzing %s...")));
-	}
-
-	return types;
-}
-
-gboolean jabber_send_attention(PurpleProtocolAttention *attn, PurpleConnection *gc, const char *username, guint code)
-{
-	JabberStream *js = purple_connection_get_protocol_data(gc);
-	gchar *error = NULL;
-
-	if (!_jabber_send_buzz(js, username, &error)) {
-		PurpleAccount *account = purple_connection_get_account(gc);
-		PurpleConversation *conv;
-		PurpleConversationManager *manager;
-
-		manager = purple_conversation_manager_get_default();
-		conv = purple_conversation_manager_find(manager, account, username);
-
-		purple_debug_error("jabber", "jabber_send_attention: jabber_cmd_buzz failed with error: %s\n", error ? error : "(NULL)");
-
-		if (conv) {
-			purple_conversation_write_system_message(conv,
-				error, PURPLE_MESSAGE_ERROR);
-		}
-
-		g_free(error);
-		return FALSE;
-	}
-
-	return TRUE;
-}
-
-
 gboolean
 jabber_offline_message(PurpleProtocolClient *client, PurpleBuddy *buddy) {
 	return TRUE;
@@ -3725,12 +3596,6 @@
 		_("ping &lt;jid&gt;:  Ping a user/component/server."), NULL);
 	commands = g_slist_prepend(commands, GUINT_TO_POINTER(id));
 
-	id = purple_cmd_register("buzz", "w", PURPLE_CMD_P_PROTOCOL,
-		PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_PROTOCOL_ONLY |
-		PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, proto_id, jabber_cmd_buzz,
-		_("buzz: Buzz a user to get their attention."), NULL);
-	commands = g_slist_prepend(commands, GUINT_TO_POINTER(id));
-
 	id = purple_cmd_register("mood", "ws", PURPLE_CMD_P_PROTOCOL,
 		PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM |
 		PURPLE_CMD_FLAG_PROTOCOL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS,
@@ -3912,9 +3777,6 @@
 	jabber_add_feature(NS_XHTML_IM, NULL);
 	jabber_add_feature(NS_PING, NULL);
 
-	/* Buzz/Attention */
-	jabber_add_feature(NS_ATTENTION, jabber_buzz_isenabled);
-
 	/* Bits Of Binary */
 	jabber_add_feature(NS_BOB, NULL);
 
@@ -4204,13 +4066,6 @@
 }
 
 static void
-jabber_protocol_attention_iface_init(PurpleProtocolAttentionInterface *iface)
-{
-	iface->send_attention = jabber_send_attention;
-	iface->get_types = jabber_attention_types;
-}
-
-static void
 jabber_protocol_media_iface_init(PurpleProtocolMediaInterface *media_iface)
 {
 	media_iface->initiate_session = jabber_initiate_media;
@@ -4247,9 +4102,6 @@
         G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_ROOMLIST,
                                       jabber_protocol_roomlist_iface_init)
 
-        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_ATTENTION,
-                                      jabber_protocol_attention_iface_init)
-
         G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_MEDIA,
                                       jabber_protocol_media_iface_init)
 
diff --git a/libpurple/protocols/jabber/message.h b/libpurple/protocols/jabber/message.h
--- a/libpurple/protocols/jabber/message.h
+++ b/libpurple/protocols/jabber/message.h
@@ -44,7 +44,6 @@
 	time_t sent;
 	gboolean delayed;
 	gboolean forwarded;
-	gboolean hasBuzz;
 	gboolean outgoing;
 	char *id;
 	char *from;
@@ -77,6 +76,4 @@
 
 unsigned int jabber_send_typing(PurpleProtocolIM *pim, PurpleConnection *gc, const char *who, PurpleIMTypingState state);
 
-gboolean jabber_buzz_isenabled(JabberStream *js, const gchar *namespace);
-
 #endif /* PURPLE_JABBER_MESSAGE_H */
diff --git a/libpurple/protocols/jabber/message.c b/libpurple/protocols/jabber/message.c
--- a/libpurple/protocols/jabber/message.c
+++ b/libpurple/protocols/jabber/message.c
@@ -314,26 +314,6 @@
 	g_free(buf);
 }
 
-static void handle_buzz(JabberMessage *jm) {
-	PurpleAccount *account;
-
-	/* Delayed buzz MUST NOT be accepted */
-	if(jm->delayed)
-		return;
-
-	/* Reject buzz when it's not enabled */
-	if(!jm->js->allowBuzz)
-		return;
-
-	account = purple_connection_get_account(jm->js->gc);
-
-	if (purple_blist_find_buddy(account, jm->from) == NULL)
-		return; /* Do not accept buzzes from unknown people */
-
-	/* xmpp only has 1 attention type, so index is 0 */
-	purple_protocol_got_attention(jm->js->gc, jm->from, 0);
-}
-
 static gchar *
 jabber_message_xml_to_string_strip_img_smileys(PurpleXmlNode *xhtml)
 {
@@ -603,8 +583,6 @@
 			jm->type = JABBER_MESSAGE_EVENT;
 			for(items = purple_xmlnode_get_child(child,"items"); items; items = items->next)
 				jm->eventitems = g_list_append(jm->eventitems, items);
-		} else if(purple_strequal(child->name, "attention") && purple_strequal(xmlns, NS_ATTENTION)) {
-			jm->hasBuzz = TRUE;
 		} else if(purple_strequal(child->name, "delay") && purple_strequal(xmlns, NS_DELAYED_DELIVERY)) {
 			const char *timestamp = purple_xmlnode_get_attrib(child, "stamp");
 			jm->delayed = TRUE;
@@ -670,9 +648,6 @@
 		}
 	}
 
-	if(jm->hasBuzz)
-		handle_buzz(jm);
-
 	switch(jm->type) {
 		case JABBER_MESSAGE_OTHER:
 			purple_debug_info("jabber",
@@ -983,7 +958,3 @@
 
 	return 0;
 }
-
-gboolean jabber_buzz_isenabled(JabberStream *js, const gchar *namespace) {
-	return js->allowBuzz;
-}
diff --git a/libpurple/protocols/jabber/namespaces.h b/libpurple/protocols/jabber/namespaces.h
--- a/libpurple/protocols/jabber/namespaces.h
+++ b/libpurple/protocols/jabber/namespaces.h
@@ -79,9 +79,6 @@
 /* XEP-0206 XMPP over BOSH */
 #define NS_XMPP_BOSH "urn:xmpp:xbosh"
 
-/* XEP-0224 Attention */
-#define NS_ATTENTION "urn:xmpp:attention:0"
-
 /* XEP-0231 BoB (Bits of Binary) */
 #define NS_BOB "urn:xmpp:bob"
 
diff --git a/libpurple/purpleattentiontype.h b/libpurple/purpleattentiontype.h
deleted file mode 100644
--- a/libpurple/purpleattentiontype.h
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * purple
- * Copyright (C) Pidgin Developers <devel@pidgin.im>
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <https://www.gnu.org/licenses/>.
- */
-
-#if !defined(PURPLE_GLOBAL_HEADER_INSIDE) && !defined(PURPLE_COMPILATION)
-# error "only <purple.h> may be included directly"
-#endif
-
-#ifndef PURPLE_ATTENTION_TYPE_H
-#define PURPLE_ATTENTION_TYPE_H
-
-#include <glib.h>
-#include <glib-object.h>
-
-/**
- * SECTION:purpleattentiontype
- * @section_id: libpurple-purpleattentiontype
- * @title: Attention Types
- */
-
-#define PURPLE_TYPE_ATTENTION_TYPE (purple_attention_type_get_type())
-
-/**
- * PurpleAttentionType:
- *
- * Represents "nudges" and "buzzes" that you may send to a buddy to attract
- * their attention (or vice-versa).
- */
-typedef struct _PurpleAttentionType PurpleAttentionType;
-
-G_BEGIN_DECLS
-
-/**
- * purple_attention_type_get_type:
- *
- * Returns: The #GType for the #PurpleAttentionType boxed structure.
- */
-GType purple_attention_type_get_type(void);
-
-PurpleAttentionType *purple_attention_type_copy(PurpleAttentionType *attn);
-
-/**
- * purple_attention_type_new:
- * @unlocalized_name: A non-localized string that can be used by UIs in need of such
- *               non-localized strings.  This should be the same as @name,
- *               without localization.
- * @name: A localized string that the UI may display for the event. This
- *             should be the same string as @unlocalized_name, with localization.
- * @incoming_description: A localized description shown when the event is received.
- * @outgoing_description: A localized description shown when the event is sent.
- *
- * Creates a new #PurpleAttentionType object and sets its mandatory parameters.
- *
- * Returns: A pointer to the new object.
- */
-PurpleAttentionType *purple_attention_type_new(const gchar *unlocalized_name, const gchar *name,
-								const gchar *incoming_description, const gchar *outgoing_description);
-
-/**
- * purple_attention_type_get_name:
- * @type: The attention type.
- *
- * Get the attention type's name as displayed by the UI.
- *
- * Returns: The name.
- */
-const gchar *purple_attention_type_get_name(const PurpleAttentionType *type);
-
-/**
- * purple_attention_type_set_name:
- * @type: The attention type.
- * @name: The localized name that will be displayed by UIs. This should be
- *             the same string given as the unlocalized name, but with
- *             localization.
- *
- * Sets the displayed name of the attention-demanding event.
- */
-void purple_attention_type_set_name(PurpleAttentionType *type, const gchar *name);
-
-/**
- * purple_attention_type_get_incoming_desc:
- * @type: The attention type.
- *
- * Get the attention type's description shown when the event is received.
- *
- * Returns: The description.
- */
-const gchar *purple_attention_type_get_incoming_desc(const PurpleAttentionType *type);
-
-/**
- * purple_attention_type_set_incoming_desc:
- * @type: The attention type.
- * @desc: The localized description for incoming events.
- *
- * Sets the description of the attention-demanding event shown in conversations
- * when the event is received.
- */
-void purple_attention_type_set_incoming_desc(PurpleAttentionType *type, const gchar *desc);
-
-/**
- * purple_attention_type_get_outgoing_desc:
- * @type: The attention type.
- *
- * Get the attention type's description shown when the event is sent.
- *
- * Returns: The description.
- */
-const gchar *purple_attention_type_get_outgoing_desc(const PurpleAttentionType *type);
-
-/**
- * purple_attention_type_set_outgoing_desc:
- * @type: The attention type.
- * @desc: The localized description for outgoing events.
- *
- * Sets the description of the attention-demanding event shown in conversations
- * when the event is sent.
- */
-void purple_attention_type_set_outgoing_desc(PurpleAttentionType *type, const gchar *desc);
-
-/**
- * purple_attention_type_get_icon_name:
- * @type: The attention type.
- *
- * Get the attention type's icon name.
- *
- * Note: Icons are optional for attention events.
- *
- * Returns: The icon name or %NULL if unset/empty.
- */
-const gchar *purple_attention_type_get_icon_name(const PurpleAttentionType *type);
-
-/**
- * purple_attention_type_set_icon_name:
- * @type: The attention type.
- * @name: The icon's name.
- *
- * Sets the name of the icon to display for the attention event; this is optional.
- *
- * Note: Icons are optional for attention events.
- */
-void purple_attention_type_set_icon_name(PurpleAttentionType *type, const gchar *name);
-
-/**
- * purple_attention_type_get_unlocalized_name:
- * @type: The attention type
- *
- * Get the attention type's unlocalized name; this is useful for some UIs.
- *
- * Returns: The unlocalized name.
- */
-const gchar *purple_attention_type_get_unlocalized_name(const PurpleAttentionType *type);
-
-/**
- * purple_attention_type_set_unlocalized_name:
- * @type: The attention type.
- * @ulname: The unlocalized name.  This should be the same string given as
- *               the localized name, but without localization.
- *
- * Sets the unlocalized name of the attention event; some UIs may need this,
- * thus it is required.
- */
-void purple_attention_type_set_unlocalized_name(PurpleAttentionType *type, const gchar *ulname);
-
-G_END_DECLS
-
-#endif /* PURPLE_ATTENTION_TYPE_H */
diff --git a/libpurple/purpleattentiontype.c b/libpurple/purpleattentiontype.c
deleted file mode 100644
--- a/libpurple/purpleattentiontype.c
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * purple
- * Copyright (C) Pidgin Developers <devel@pidgin.im>
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <https://www.gnu.org/licenses/>.
- */
-
-#include "purpleattentiontype.h"
-
-struct _PurpleAttentionType {
-	/* The name to show in GUI elements. */
-	const gchar *name;
-	/* Shown when received. */
-	const gchar *incoming_description;
-	/* Shown when sent. */
-	const gchar *outgoing_description;
-	/* Optional name of the icon to display. */
-	const gchar *icon_name;
-	/* An unlocalized name for UIs that would rather use that. */
-	const gchar *unlocalized_name;
-};
-
-G_DEFINE_BOXED_TYPE(
-	PurpleAttentionType,
-	purple_attention_type,
-	purple_attention_type_copy,
-	g_free
-);
-
-/******************************************************************************
- * Public API
- *****************************************************************************/
-PurpleAttentionType *
-purple_attention_type_new(const gchar *unlocalized_name,
-                          const gchar *name,
-                          const gchar *incoming_description,
-                          const gchar *outgoing_description)
-{
-	PurpleAttentionType *attn = g_new0(PurpleAttentionType, 1);
-
-	attn->unlocalized_name = unlocalized_name;
-	attn->name = name;
-	attn->incoming_description = incoming_description;
-	attn->outgoing_description = outgoing_description;
-
-	return attn;
-}
-
-PurpleAttentionType *
-purple_attention_type_copy(PurpleAttentionType *attn) {
-	PurpleAttentionType *attn_copy = NULL;
-
-	g_return_val_if_fail(attn != NULL, NULL);
-
-	attn_copy  = g_new(PurpleAttentionType, 1);
-	*attn_copy = *attn;
-
-	return attn_copy;
-}
-
-const gchar *
-purple_attention_type_get_name(const PurpleAttentionType *type) {
-	g_return_val_if_fail(type, NULL);
-
-	return type->name;
-}
-
-void
-purple_attention_type_set_name(PurpleAttentionType *type, const gchar *name) {
-	g_return_if_fail(type);
-
-	type->name = name;
-}
-
-const gchar *
-purple_attention_type_get_incoming_desc(const PurpleAttentionType *type) {
-	g_return_val_if_fail(type, NULL);
-
-	return type->incoming_description;
-}
-
-void
-purple_attention_type_set_incoming_desc(PurpleAttentionType *type, const gchar *desc) {
-	g_return_if_fail(type);
-
-	type->incoming_description = desc;
-}
-
-const gchar *
-purple_attention_type_get_outgoing_desc(const PurpleAttentionType *type) {
-	g_return_val_if_fail(type, NULL);
-
-	return type->outgoing_description;
-}
-
-void
-purple_attention_type_set_outgoing_desc(PurpleAttentionType *type, const gchar *desc) {
-	g_return_if_fail(type != NULL);
-
-	type->outgoing_description = desc;
-}
-
-const gchar *
-purple_attention_type_get_icon_name(const PurpleAttentionType *type) {
-	g_return_val_if_fail(type, NULL);
-
-	if(type->icon_name == NULL || *(type->icon_name) == '\0')
-		return NULL;
-
-	return type->icon_name;
-}
-
-void
-purple_attention_type_set_icon_name(PurpleAttentionType *type, const gchar *name) {
-	g_return_if_fail(type);
-
-	type->icon_name = name;
-}
-
-const gchar *
-purple_attention_type_get_unlocalized_name(const PurpleAttentionType *type) {
-	g_return_val_if_fail(type, NULL);
-
-	return type->unlocalized_name;
-}
-
-void
-purple_attention_type_set_unlocalized_name(PurpleAttentionType *type, const gchar *ulname) {
-	g_return_if_fail(type);
-
-	type->unlocalized_name = ulname;
-}
diff --git a/libpurple/purpleprotocolattention.h b/libpurple/purpleprotocolattention.h
deleted file mode 100644
--- a/libpurple/purpleprotocolattention.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * purple
- * Copyright (C) Pidgin Developers <devel@pidgin.im>
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <https://www.gnu.org/licenses/>.
- */
-
-#if !defined(PURPLE_GLOBAL_HEADER_INSIDE) && !defined(PURPLE_COMPILATION)
-# error "only <purple.h> may be included directly"
-#endif
-
-#ifndef PURPLE_ATTENTION_H
-#define PURPLE_ATTENTION_H
-
-#include <glib.h>
-#include <glib-object.h>
-
-/**
- * SECTION:purpleprotocolattention
- * @section_id: libpurple-purpleprotocolattention
- * @title: Protocol Attention Interface
- * @short_description: Protocol interface for attention.
- *
- * @PurpleProtocolAttention is an interface that PurpleProtocols can implement
- * to support getting a contact's attention.
- */
-
-#include <libpurple/account.h>
-#include <libpurple/connection.h>
-#include <libpurple/purpleprotocol.h>
-
-G_BEGIN_DECLS
-
-/**
- * PURPLE_TYPE_PROTOCOL_ATTENTION:
- *
- * The standard _get_type macro for #PurpleProtocolAttention.
- *
- * Since: 3.0.0
- */
-#define PURPLE_TYPE_PROTOCOL_ATTENTION (purple_protocol_attention_get_type())
-
-/**
- * purple_protocol_attention_get_type:
- *
- * Gets the #GType for #PurpleProtocolAttentionInterface.
- *
- * Returns: The #GType for the protocol attention interface.
- *
- * Since: 3.0.0
- */
-
-/**
- * PurpleProtocolAttention:
- *
- * An opaque data structure used to represent an object that implements the
- * #PurpleProtocolAttention interface.
- *
- * Since: 3.0.0
- */
-G_DECLARE_INTERFACE(PurpleProtocolAttention, purple_protocol_attention, PURPLE,
-                    PROTOCOL_ATTENTION, PurpleProtocol)
-
-/**
- * PurpleProtocolAttentionInterface:
- * @send_attention: Called to send an attention message. See
- *                  purple_protocol_attention_send_attention().
- * @get_types: Called to list the protocol's attention types. See
- *             purple_protocol_attention_get_types().
- *
- * The protocol attention interface.
- *
- * This interface provides attention API for sending and receiving
- * zaps/nudges/buzzes etc.
- *
- * Since: 3.0.0
- */
-struct _PurpleProtocolAttentionInterface {
-	/*< private >*/
-	GTypeInterface parent;
-
-	/*< public >*/
-	gboolean (*send_attention)(PurpleProtocolAttention *attention,
-	                           PurpleConnection *pc, const gchar *username,
-	                           guint type);
-
-	GList *(*get_types)(PurpleProtocolAttention *attention,
-	                    PurpleAccount *account);
-
-	/*< private >*/
-	gpointer reserved[4];
-};
-
-/**
- * purple_protocol_attention_get_types:
- * @attention: The #PurpleProtocolAttention.
- * @account: The #PurpleAccount whose attention types to get.
- *
- * Returns a list of #PurpleAttentionType's for @attention.
- *
- * Returns: (transfer container) (element-type PurpleAttentionType): The list of
- *          #PurpleAttentionType's.
- *
- * Since: 3.0.0
- */
-GList *purple_protocol_attention_get_types(PurpleProtocolAttention *attention, PurpleAccount *account);
-
-/**
- * purple_protocol_attention_send_attention:
- * @attention: The #PurpleProtocolAttention instance.
- * @pc: The #PurpleConnection to send on
- * @username: The name of the user to send the attention to.
- * @type: The type of attention to send.
- *
- * Sends an attention message of @type to @username.
- *
- * Returns: %TRUE on success, %FALSE otherwise.
- *
- * Since: 3.0.0
- */
-gboolean purple_protocol_attention_send_attention(PurpleProtocolAttention *attention, PurpleConnection *pc, const gchar *username, guint type);
-
-G_END_DECLS
-
-#endif /* PURPLE_PROTOCOL_ATTENTION_H */
diff --git a/libpurple/purpleprotocolattention.c b/libpurple/purpleprotocolattention.c
deleted file mode 100644
--- a/libpurple/purpleprotocolattention.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * purple
- * Copyright (C) Pidgin Developers <devel@pidgin.im>
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <https://www.gnu.org/licenses/>.
- */
-
-#include "purpleprotocolattention.h"
-
-G_DEFINE_INTERFACE(PurpleProtocolAttention, purple_protocol_attention,
-                   PURPLE_TYPE_PROTOCOL)
-
-/******************************************************************************
- * GInterface Implementation
- *****************************************************************************/
-static void
-purple_protocol_attention_default_init(PurpleProtocolAttentionInterface *iface) {
-}
-
-/******************************************************************************
- * Public API
- *****************************************************************************/
-gboolean
-purple_protocol_attention_send_attention(PurpleProtocolAttention *attention,
-                                         PurpleConnection *gc,
-                                         const gchar *username, guint type)
-{
-	PurpleProtocolAttentionInterface *iface = NULL;
-
-	g_return_val_if_fail(PURPLE_IS_PROTOCOL_ATTENTION(attention), FALSE);
-
-	iface = PURPLE_PROTOCOL_ATTENTION_GET_IFACE(attention);
-	if(iface && iface->send_attention) {
-		return iface->send_attention(attention, gc, username, type);
-	}
-
-	return FALSE;
-}
-
-GList *
-purple_protocol_attention_get_types(PurpleProtocolAttention *attention,
-                                    PurpleAccount *account)
-{
-	PurpleProtocolAttentionInterface *iface = NULL;
-
-	g_return_val_if_fail(PURPLE_IS_PROTOCOL_ATTENTION(attention), NULL);
-
-	iface = PURPLE_PROTOCOL_ATTENTION_GET_IFACE(attention);
-	if(iface && iface->get_types) {
-		return iface->get_types(attention, account);
-	}
-
-	return NULL;
-}
-
diff --git a/libpurple/server.h b/libpurple/server.h
--- a/libpurple/server.h
+++ b/libpurple/server.h
@@ -41,7 +41,6 @@
 #include "conversations.h"
 #include "group.h"
 #include "protocols.h"
-#include "purpleattentiontype.h"
 #include "purpleimconversation.h"
 #include "purplemessage.h"
 
@@ -88,17 +87,6 @@
 int  purple_serv_send_im(PurpleConnection *gc, PurpleMessage *msg);
 
 /**
- * purple_get_attention_type_from_code:
- * @account: The #PurpleAccount
- * @type_code: The protocol specific attention type code to convert
- *
- * Get information about an account's attention commands, from the protocol.
- *
- * Returns: The attention command numbered 'code' from the protocol's attention_types, or NULL.
- */
-PurpleAttentionType *purple_get_attention_type_from_code(PurpleAccount *account, guint type_code);
-
-/**
  * purple_serv_get_info:
  * @gc:     The connection over which to send the typing notification.
  * @name:   The name of the buddy we were asking information from.
diff --git a/libpurple/server.c b/libpurple/server.c
--- a/libpurple/server.c
+++ b/libpurple/server.c
@@ -34,7 +34,6 @@
 #include "purpleconversationmanager.h"
 #include "purpleprivate.h"
 #include "purpleprotocol.h"
-#include "purpleprotocolattention.h"
 #include "purpleprotocolchat.h"
 #include "purpleprotocolim.h"
 #include "purpleprotocolprivacy.h"
@@ -309,31 +308,6 @@
 	}
 }
 
-
-PurpleAttentionType *purple_get_attention_type_from_code(PurpleAccount *account, guint type_code)
-{
-	PurpleProtocol *protocol;
-	PurpleAttentionType* attn;
-
-	g_return_val_if_fail(account != NULL, NULL);
-
-	protocol = purple_account_get_protocol(account);
-
-	/* Lookup the attention type in the protocol's attention_types list, if any. */
-	if (PURPLE_IS_PROTOCOL_ATTENTION(protocol)) {
-		GList *attention_types;
-
-		attention_types = purple_protocol_attention_get_types(
-				PURPLE_PROTOCOL_ATTENTION(protocol), account);
-		attn = (PurpleAttentionType *)g_list_nth_data(attention_types, type_code);
-	} else {
-		attn = NULL;
-	}
-
-	return attn;
-}
-
-
 /*
  * Move a buddy from one group to another on server.
  *
diff --git a/libpurple/tests/meson.build b/libpurple/tests/meson.build
--- a/libpurple/tests/meson.build
+++ b/libpurple/tests/meson.build
@@ -1,6 +1,5 @@
 PROGS = [
     'account_option',
-    'attention_type',
     'circular_buffer',
     'credential_manager',
     'credential_provider',
@@ -10,7 +9,6 @@
     'keyvaluepair',
     'markup',
     'protocol_action',
-    'protocol_attention',
     'protocol_xfer',
     'queued_output_stream',
     'trie',
diff --git a/libpurple/tests/test_attention_type.c b/libpurple/tests/test_attention_type.c
deleted file mode 100644
--- a/libpurple/tests/test_attention_type.c
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * purple
- * Copyright (C) Pidgin Developers <devel@pidgin.im>
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <https://www.gnu.org/licenses/>.
- */
-
-#include <glib.h>
-#include <string.h>
-
-#include <purple.h>
-
-/******************************************************************************
- * Tests
- *****************************************************************************/
-static void
-test_purple_attention_type_new(void) {
-	PurpleAttentionType *type = NULL;
-
-	type = purple_attention_type_new("id", "name", "incoming", "outgoing");
-
-	/* check the values new sets */
-	g_assert_cmpstr(purple_attention_type_get_unlocalized_name(type), ==, "id");
-	g_assert_cmpstr(purple_attention_type_get_name(type), ==, "name");
-	g_assert_cmpstr(purple_attention_type_get_incoming_desc(type), ==, "incoming");
-	g_assert_cmpstr(purple_attention_type_get_outgoing_desc(type), ==, "outgoing");
-
-	/* check that default values are correct */
-	g_assert_cmpstr(purple_attention_type_get_icon_name(type), ==, NULL);
-
-	g_free(type);
-}
-
-static void
-test_purple_attention_type_copy(void) {
-	PurpleAttentionType *type1 = NULL, *type2 = NULL;
-
-	type1 = purple_attention_type_new("id", "name", "incoming", "outgoing");
-
-	type2 = purple_attention_type_copy(type1);
-
-	/* check the values new sets */
-	g_assert_cmpstr(purple_attention_type_get_unlocalized_name(type2), ==, "id");
-	g_assert_cmpstr(purple_attention_type_get_name(type2), ==, "name");
-	g_assert_cmpstr(purple_attention_type_get_incoming_desc(type2), ==, "incoming");
-	g_assert_cmpstr(purple_attention_type_get_outgoing_desc(type2), ==, "outgoing");
-
-	/* check that default values are correct */
-	g_assert_cmpstr(purple_attention_type_get_icon_name(type2), ==, NULL);
-
-	g_free(type1);
-	g_free(type2);
-}
-
-static void
-test_purple_attention_type_set_unlocalized_name(void) {
-	PurpleAttentionType *type = NULL;
-
-	type = purple_attention_type_new("id", "name", "incoming", "outgoing");
-
-	purple_attention_type_set_unlocalized_name(type, "this-is-my-id");
-	g_assert_cmpstr(purple_attention_type_get_unlocalized_name(type), ==, "this-is-my-id");
-
-	g_free(type);
-}
-
-static void
-test_purple_attention_type_set_name(void) {
-	PurpleAttentionType *type = NULL;
-
-	type = purple_attention_type_new("id", "name", "incoming", "outgoing");
-
-	purple_attention_type_set_name(type, "this-is-my-name");
-	g_assert_cmpstr(purple_attention_type_get_name(type), ==, "this-is-my-name");
-
-	g_free(type);
-}
-
-static void
-test_purple_attention_type_set_incoming_desc(void) {
-	PurpleAttentionType *type = NULL;
-
-	type = purple_attention_type_new("id", "name", "incoming", "outgoing");
-
-	purple_attention_type_set_incoming_desc(type, "this-is-my-incoming-desc");
-	g_assert_cmpstr(purple_attention_type_get_incoming_desc(type), ==, "this-is-my-incoming-desc");
-
-	g_free(type);
-}
-
-static void
-test_purple_attention_type_set_outgoing_desc(void) {
-	PurpleAttentionType *type = NULL;
-
-	type = purple_attention_type_new("id", "name", "incoming", "outgoing");
-
-	purple_attention_type_set_outgoing_desc(type, "this-is-my-outgoing-desc");
-	g_assert_cmpstr(purple_attention_type_get_outgoing_desc(type), ==, "this-is-my-outgoing-desc");
-
-	g_free(type);
-}
-
-static void
-test_purple_attention_type_set_icon_name(void) {
-	PurpleAttentionType *type = NULL;
-
-	type = purple_attention_type_new("id", "name", "incoming", "outgoing");
-
-	purple_attention_type_set_icon_name(type, "this-is-my-icon-name");
-	g_assert_cmpstr(purple_attention_type_get_icon_name(type), ==, "this-is-my-icon-name");
-
-	g_free(type);
-}
-
-/******************************************************************************
- * Main
- *****************************************************************************/
-gint
-main(gint argc, gchar **argv) {
-	gint res = 0;
-
-	g_test_init(&argc, &argv, NULL);
-
-	g_test_set_nonfatal_assertions();
-
-	g_test_add_func(
-		"/attention-type/new",
-		test_purple_attention_type_new
-	);
-
-	g_test_add_func(
-		"/attention-type/copy",
-		test_purple_attention_type_copy
-	);
-
-	g_test_add_func(
-		"/attention-type/set-unlocalized-name",
-		test_purple_attention_type_set_unlocalized_name
-	);
-
-	g_test_add_func(
-		"/attention-type/set-name",
-		test_purple_attention_type_set_name
-	);
-
-	g_test_add_func(
-		"/attention-type/set-incoming-desc",
-		test_purple_attention_type_set_incoming_desc
-	);
-
-	g_test_add_func(
-		"/attention-type/set-outgoing-desc",
-		test_purple_attention_type_set_outgoing_desc
-	);
-
-	g_test_add_func(
-		"/attention-type/set-icon-name",
-		test_purple_attention_type_set_icon_name
-	);
-
-	res = g_test_run();
-
-	return res;
-}
diff --git a/libpurple/tests/test_protocol_attention.c b/libpurple/tests/test_protocol_attention.c
deleted file mode 100644
--- a/libpurple/tests/test_protocol_attention.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * purple
- * Copyright (C) Pidgin Developers <devel@pidgin.im>
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <https://www.gnu.org/licenses/>.
- */
-
-#include <glib.h>
-#include <string.h>
-
-#include <purple.h>
-
-#include "test_ui.h"
-
-/******************************************************************************
- * PurpleProtcolAttention Implementations
- *****************************************************************************/
-static GType test_purple_protocol_attention_get_type(void);
-
-typedef struct {
-	PurpleProtocol parent;
-
-	gboolean send_called;
-} TestPurpleProtocolAttention;
-
-typedef struct {
-	PurpleProtocolClass parent;
-} TestPurpleProtocolAttentionClass;
-
-
-static gboolean
-test_purple_protocol_attention_send(PurpleProtocolAttention *attn, PurpleConnection *c, const gchar *username, guint type) {
-	TestPurpleProtocolAttention *test_attn = (TestPurpleProtocolAttention *)attn;
-
-	test_attn->send_called = TRUE;
-
-	return TRUE;
-}
-
-static GList *
-test_purple_protocol_attention_get_types(PurpleProtocolAttention *attn, PurpleAccount *acct) {
-	GList *types = NULL;
-
-	types = g_list_append(types, purple_attention_type_new("id", "name", "incoming", "outgoing"));
-
-	return types;
-}
-
-static void
-test_purple_protocol_attention_iface_init(PurpleProtocolAttentionInterface *iface) {
-	iface->send_attention = test_purple_protocol_attention_send;
-	iface->get_types = test_purple_protocol_attention_get_types;
-}
-
-G_DEFINE_TYPE_WITH_CODE(
-	TestPurpleProtocolAttention,
-	test_purple_protocol_attention,
-	PURPLE_TYPE_PROTOCOL,
-	G_IMPLEMENT_INTERFACE(
-		PURPLE_TYPE_PROTOCOL_ATTENTION,
-		test_purple_protocol_attention_iface_init
-	)
-);
-
-static void
-test_purple_protocol_attention_init(TestPurpleProtocolAttention *prplattn) {
-}
-
-static void
-test_purple_protocol_attention_class_init(TestPurpleProtocolAttentionClass *klass) {
-}
-
-static TestPurpleProtocolAttention *
-test_purple_protocol_attention_new(void) {
-	return (TestPurpleProtocolAttention *)g_object_new(
-		test_purple_protocol_attention_get_type(),
-		"id", "prpl-attention",
-		NULL);
-}
-
-/******************************************************************************
- * Tests
- *****************************************************************************/
-static void
-test_purple_protocol_attention_can_send(void) {
-	TestPurpleProtocolAttention *attn = test_purple_protocol_attention_new();
-	PurpleAccount *a = purple_account_new("prpl-attn-can-send", "prpl-attn");
-	PurpleConnection *c = g_object_new(PURPLE_TYPE_CONNECTION, "account", a, NULL);
-	gboolean actual = FALSE;
-
-	attn->send_called = FALSE;
-	actual = purple_protocol_attention_send_attention(PURPLE_PROTOCOL_ATTENTION(attn), c, "someguy", 0);
-	g_assert_true(actual);
-
-	g_assert_true(attn->send_called);
-}
-
-static void
-test_purple_protocol_attention_can_get_types(void) {
-	TestPurpleProtocolAttention *attn = g_object_new(test_purple_protocol_attention_get_type(), NULL);
-	PurpleAccount *a = purple_account_new("prpl-attn-can-get-types", "prpl-attn");
-	GList *types = NULL;
-	PurpleAttentionType *type = NULL;
-
-	types = purple_protocol_attention_get_types(PURPLE_PROTOCOL_ATTENTION(attn), a);
-	g_assert_true(g_list_length(types) == 1);
-
-	/* take the first item and cast it into type */
-	type = (PurpleAttentionType *)(types->data);
-	g_assert(type);
-
-	g_assert_cmpstr(purple_attention_type_get_unlocalized_name(type), ==, "id");
-	g_assert_cmpstr(purple_attention_type_get_name(type), ==, "name");
-	g_assert_cmpstr(purple_attention_type_get_incoming_desc(type), ==, "incoming");
-	g_assert_cmpstr(purple_attention_type_get_outgoing_desc(type), ==, "outgoing");
-}
-
-/******************************************************************************
- * Main
- *****************************************************************************/
-gint
-main(gint argc, gchar **argv) {
-	gint res = 0;
-
-	g_test_init(&argc, &argv, NULL);
-
-	g_test_set_nonfatal_assertions();
-
-	test_ui_purple_init();
-
-	g_test_add_func(
-		"/protocol-attention/send",
-		test_purple_protocol_attention_can_send
-	);
-
-	g_test_add_func(
-		"/protocol-attention/get-types",
-		test_purple_protocol_attention_can_get_types
-	);
-
-	res = g_test_run();
-
-	return res;
-}
diff --git a/pidgin/gtkconv.c b/pidgin/gtkconv.c
--- a/pidgin/gtkconv.c
+++ b/pidgin/gtkconv.c
@@ -604,23 +604,6 @@
 }
 
 static void
-menu_get_attention_cb(GObject *obj, gpointer data)
-{
-	PidginConvWindow *win = data;
-	PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win);
-
-	if (PURPLE_IS_IM_CONVERSATION(conv)) {
-		int index;
-		if ((GtkAction *)obj == win->menu->get_attention)
-			index = 0;
-		else
-			index = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(obj), "index"));
-		purple_protocol_send_attention(purple_conversation_get_connection(conv),
-			purple_conversation_get_name(conv), index);
-	}
-}
-
-static void
 menu_alias_cb(GtkAction *action, gpointer data)
 {
 	PidginConvWindow *win = data;
@@ -1563,7 +1546,6 @@
 #endif
 
 	{ "SendFile", NULL, N_("Se_nd File..."), NULL, NULL, G_CALLBACK(menu_send_file_cb) },
-	{ "GetAttention", NULL, N_("Get _Attention"), NULL, NULL, G_CALLBACK(menu_get_attention_cb) },
 	{ "GetInfo", NULL, N_("_Get Info"), "<control>O", NULL, G_CALLBACK(menu_get_info_cb) },
 	{ "Invite", NULL, N_("In_vite..."), NULL, NULL, G_CALLBACK(menu_invite_cb) },
 	{ "MoreMenu", NULL, N_("M_ore"), NULL, NULL, NULL },
@@ -1591,7 +1573,6 @@
 			"</menu>"
 #endif
 			"<menuitem action='SendFile'/>"
-			"<menuitem action='GetAttention'/>"
 			"<menuitem action='GetInfo'/>"
 			"<menuitem action='Invite'/>"
 			"<separator/>"
@@ -1688,10 +1669,6 @@
 		gtk_ui_manager_get_action(win->menu->ui,
 		                          "/Conversation/ConversationMenu/SendFile");
 
-	win->menu->get_attention =
-		gtk_ui_manager_get_action(win->menu->ui,
-		                          "/Conversation/ConversationMenu/GetAttention");
-
 	/* --- */
 
 	win->menu->get_info =
@@ -2968,7 +2945,6 @@
 		/* Deal with menu items */
 		gtk_action_set_visible(win->menu->view_log, TRUE);
 		gtk_action_set_visible(win->menu->send_file, TRUE);
-		gtk_action_set_visible(win->menu->get_attention, TRUE);
 		gtk_action_set_visible(win->menu->get_info, TRUE);
 		gtk_action_set_visible(win->menu->invite, FALSE);
 		gtk_action_set_visible(win->menu->alias, TRUE);
@@ -2996,7 +2972,6 @@
 		/* Deal with menu items */
 		gtk_action_set_visible(win->menu->view_log, TRUE);
 		gtk_action_set_visible(win->menu->send_file, FALSE);
-		gtk_action_set_visible(win->menu->get_attention, FALSE);
 		gtk_action_set_visible(win->menu->get_info, FALSE);
 		gtk_action_set_visible(win->menu->invite, TRUE);
 		gtk_action_set_visible(win->menu->alias, TRUE);
@@ -3049,7 +3024,6 @@
 			gtk_action_set_sensitive(win->menu->add, (PURPLE_PROTOCOL_IMPLEMENTS(protocol, SERVER, add_buddy)));
 			gtk_action_set_sensitive(win->menu->remove, (PURPLE_PROTOCOL_IMPLEMENTS(protocol, SERVER, remove_buddy)));
 			gtk_action_set_sensitive(win->menu->send_file, can_send_file);
-			gtk_action_set_sensitive(win->menu->get_attention, (PURPLE_IS_PROTOCOL_ATTENTION(protocol)));
 			gtk_action_set_sensitive(win->menu->alias,
 									 (account != NULL) &&
 									 (purple_blist_find_buddy(account, purple_conversation_get_name(conv)) != NULL));
@@ -3070,7 +3044,6 @@
 		/* Then deal with menu items */
 		gtk_action_set_sensitive(win->menu->view_log, TRUE);
 		gtk_action_set_sensitive(win->menu->send_file, FALSE);
-		gtk_action_set_sensitive(win->menu->get_attention, FALSE);
 		gtk_action_set_sensitive(win->menu->get_info, FALSE);
 		gtk_action_set_sensitive(win->menu->invite, FALSE);
 		gtk_action_set_sensitive(win->menu->alias, FALSE);
diff --git a/pidgin/resources/Conversations/menu.ui b/pidgin/resources/Conversations/menu.ui
--- a/pidgin/resources/Conversations/menu.ui
+++ b/pidgin/resources/Conversations/menu.ui
@@ -80,10 +80,6 @@
           <attribute name="action">win.send-file</attribute>
         </item>
         <item>
-          <attribute name="label" translatable="yes">Get _Attention</attribute>
-          <attribute name="action">win.get-attention</attribute>
-        </item>
-        <item>
           <attribute name="label" translatable="yes">_Get Info</attribute>
           <attribute name="action">win.clear-history</attribute>
           <attribute name="accel">&lt;Primary&gt;O</attribute>
diff --git a/po/POTFILES.in b/po/POTFILES.in
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -233,7 +233,6 @@
 libpurple/purpleaccountpresence.c
 libpurple/purpleaccountusersplit.c
 libpurple/purpleattachment.c
-libpurple/purpleattentiontype.c
 libpurple/purplebuddypresence.c
 libpurple/purplechatconversation.c
 libpurple/purplechatuser.c
@@ -255,7 +254,6 @@
 libpurple/purplepresence.c
 libpurple/purpleplugininfo.c
 libpurple/purpleprotocol.c
-libpurple/purpleprotocolattention.c
 libpurple/purpleprotocolchat.c
 libpurple/purpleprotocolclient.c
 libpurple/purpleprotocolfactory.c
@@ -280,7 +278,6 @@
 libpurple/status.c
 libpurple/stun.c
 libpurple/tests/test_account_option.c
-libpurple/tests/test_attention_type.c
 libpurple/tests/test_circular_buffer.c
 libpurple/tests/test_credential_manager.c
 libpurple/tests/test_credential_provider.c
@@ -288,7 +285,6 @@
 libpurple/tests/test_keyvaluepair.c
 libpurple/tests/test_markup.c
 libpurple/tests/test_protocol_action.c
-libpurple/tests/test_protocol_attention.c
 libpurple/tests/test_protocol_xfer.c
 libpurple/tests/test_queued_output_stream.c
 libpurple/tests/test_trie.c
