--- a/libpurple/cmds.c Sun May 16 12:29:20 2021 -0500
+++ b/libpurple/cmds.c Mon May 17 20:32:56 2021 -0500
@@ -41,11 +41,7 @@
static gint cmds_compare_func(const PurpleCmd *a, const PurpleCmd *b)
- if (a->priority > b->priority)
- else if (a->priority < b->priority)
+ return b->priority - a->priority; PurpleCmdId purple_cmd_register(const gchar *cmd, const gchar *args,
@@ -94,25 +90,33 @@
+purple_cmd_cmp_id(gconstpointer cmd, gconstpointer id) + return ((PurpleCmd *)cmd)->id - GPOINTER_TO_UINT(id); void purple_cmd_unregister(PurpleCmdId id)
+ PurpleCommandsUiOps *ops; - for (l = cmds; l; l = l->next) {
+ l = g_list_find_custom(cmds, GUINT_TO_POINTER(id), purple_cmd_cmp_id);
- PurpleCommandsUiOps *ops = purple_cmds_get_ui_ops();
- if (ops && ops->unregister_command)
- ops->unregister_command(c->cmd, c->protocol_id);
+ ops = purple_cmds_get_ui_ops(); + if (ops && ops->unregister_command) { + ops->unregister_command(c->cmd, c->protocol_id); - cmds = g_list_delete_link(cmds, l);
- purple_signal_emit(purple_cmds_get_handle(), "cmd-removed", c->cmd);
+ cmds = g_list_delete_link(cmds, l); + purple_signal_emit(purple_cmds_get_handle(), "cmd-removed", c->cmd); @@ -201,24 +205,31 @@
+is_right_type(PurpleCmd *cmd, PurpleConversation *conv) + return (PURPLE_IS_IM_CONVERSATION(conv) && (cmd->flags & PURPLE_CMD_FLAG_IM)) + || (PURPLE_IS_CHAT_CONVERSATION(conv) && (cmd->flags & PURPLE_CMD_FLAG_CHAT)); +is_right_protocol(PurpleCmd *cmd, PurpleConversation *conv) + const gchar *protocol_id = purple_account_get_protocol_id(purple_conversation_get_account(conv)); + return !(cmd->flags & PURPLE_CMD_FLAG_PROTOCOL_ONLY) + || purple_strequal(cmd->protocol_id, protocol_id); PurpleCmdStatus purple_cmd_do_command(PurpleConversation *conv, const gchar *cmdline,
const gchar *markup, gchar **error)
gboolean found = FALSE, tried_cmd = FALSE, right_type = FALSE, right_protocol = FALSE;
- const gchar *protocol_id;
gchar *cmd, *rest, *mrest;
PurpleCmdRet ret = PURPLE_CMD_RET_CONTINUE;
- protocol_id = purple_account_get_protocol_id(purple_conversation_get_account(conv));
- if (PURPLE_IS_CHAT_CONVERSATION(conv))
rest = strchr(cmdline, ' ');
@@ -232,51 +243,45 @@
mrest = g_strdup(markup);
purple_cmd_strip_cmd_from_markup(mrest);
- for (l = cmds; l; l = l->next) {
+ for (GList *l = cmds; l; l = l->next) { + PurpleCmd *c = l->data; if (!purple_strequal(c->cmd, cmd))
- if (!(c->flags & PURPLE_CMD_FLAG_IM))
- if (!(c->flags & PURPLE_CMD_FLAG_CHAT))
+ if (!is_right_type(c, conv)) { - if ((c->flags & PURPLE_CMD_FLAG_PROTOCOL_ONLY) &&
- !purple_strequal(c->protocol_id, protocol_id))
+ if (!is_right_protocol(c, conv)) { /* this checks the allow bad args flag for us */
if (!purple_cmd_parse_args(c, rest, mrest, &args)) {
ret = c->func(conv, cmd, args, &err, c->data);
if (ret == PURPLE_CMD_RET_CONTINUE) {
@@ -290,9 +295,7 @@
return PURPLE_CMD_STATUS_WRONG_ARGS;
- if (ret == PURPLE_CMD_RET_OK) {
- return PURPLE_CMD_STATUS_OK;
+ if (ret != PURPLE_CMD_RET_OK) { if (ret == PURPLE_CMD_RET_CONTINUE)
return PURPLE_CMD_STATUS_NOT_FOUND;
@@ -300,6 +303,7 @@
return PURPLE_CMD_STATUS_FAILED;
+ return PURPLE_CMD_STATUS_OK; gboolean purple_cmd_execute(PurpleCmdId id, PurpleConversation *conv,
@@ -311,28 +315,16 @@
- for(l = cmds; l; l = l->next) {
- cmd = (PurpleCmd*)l->data;
+ l = g_list_find_custom(cmds, GUINT_TO_POINTER(id), purple_cmd_cmp_id); - if (PURPLE_IS_IM_CONVERSATION(conv)) {
- if (!(cmd->flags & PURPLE_CMD_FLAG_IM))
+ if (!is_right_type(cmd, conv)) { - else if (PURPLE_IS_CHAT_CONVERSATION(conv)) {
- if (!(cmd->flags & PURPLE_CMD_FLAG_CHAT))
/* XXX: Don't worry much about the markup version of the command
line, there's not a single use case... */
@@ -353,22 +345,13 @@
GList *purple_cmd_list(PurpleConversation *conv)
- for (l = cmds; l; l = l->next) {
+ for (GList *l = cmds; l; l = l->next) { + PurpleCmd *c = l->data; - if (conv && PURPLE_IS_IM_CONVERSATION(conv))
- if (!(c->flags & PURPLE_CMD_FLAG_IM))
- if (conv && PURPLE_IS_CHAT_CONVERSATION(conv))
- if (!(c->flags & PURPLE_CMD_FLAG_CHAT))
- if (conv && (c->flags & PURPLE_CMD_FLAG_PROTOCOL_ONLY) &&
- !purple_strequal(c->protocol_id, purple_account_get_protocol_id(purple_conversation_get_account(conv))))
+ if (conv && (!is_right_type(c, conv) || !is_right_protocol(c, conv))) { ret = g_list_append(ret, c->cmd);
@@ -382,25 +365,16 @@
GList *purple_cmd_help(PurpleConversation *conv, const gchar *cmd)
- for (l = cmds; l; l = l->next) {
+ for (GList *l = cmds; l; l = l->next) { + PurpleCmd *c = l->data; if (cmd && !purple_strequal(cmd, c->cmd))
- if (conv && PURPLE_IS_IM_CONVERSATION(conv))
- if (!(c->flags & PURPLE_CMD_FLAG_IM))
- if (conv && PURPLE_IS_CHAT_CONVERSATION(conv))
- if (!(c->flags & PURPLE_CMD_FLAG_CHAT))
- if (conv && (c->flags & PURPLE_CMD_FLAG_PROTOCOL_ONLY) &&
- !purple_strequal(c->protocol_id, purple_account_get_protocol_id(purple_conversation_get_account(conv))))
+ if (conv && (!is_right_type(c, conv) || !is_right_protocol(c, conv))) { ret = g_list_append(ret, c->help);