Thu, 25 Apr 2024 21:09:01 -0500
Remove libpurple commands
This API needs some rethinking and is in the way of things at the moment.
Testing Done:
Ran with the turtles.
Reviewed at https://reviews.imfreedom.org/r/3141/
| ChangeLog.API | file | annotate | diff | comparison | revisions | |
| libpurple/cmds.c | file | annotate | diff | comparison | revisions | |
| libpurple/cmds.h | file | annotate | diff | comparison | revisions | |
| libpurple/core.c | file | annotate | diff | comparison | revisions | |
| libpurple/meson.build | file | annotate | diff | comparison | revisions | |
| po/POTFILES.in | file | annotate | diff | comparison | revisions |
--- a/ChangeLog.API Thu Apr 25 21:07:46 2024 -0500 +++ b/ChangeLog.API Thu Apr 25 21:09:01 2024 -0500 @@ -458,9 +458,24 @@ * purple_chat_conversation_unignore * Purple Cipher API (PurpleCipherContext and friends). Use GLib's GHmac or GChecksum instead. + * PurpleCmdFlag + * PurpleCmdFunc + * PurpleCmdId + * PurpleCmdPriority + * PurpleCmdRet + * PurpleCmdStatus * PurpleCommandsUiOps + * purple_cmd_do_command + * purple_cmd_execute + * purple_cmd_help + * purple_cmd_list + * purple_cmd_register + * purple_cmd_unregister + * purple_cmds_get_handle * purple_cmds_get_ui_ops + * purple_cmds_init * purple_cmds_set_ui_ops + * purple_cmds_uninit * PURPLE_CMD_FUNC * purple_connection_error_reason * PURPLE_CONNECTION_FLAG_ALLOW_CUSTOM_SMILEY
--- a/libpurple/cmds.c Thu Apr 25 21:07:46 2024 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,403 +0,0 @@ -/* - * Purple - Internet Messaging Library - * 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 library 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 library 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 library; if not, see <https://www.gnu.org/licenses/>. - */ - -#include "cmds.h" -#include "purpleaccount.h" -#include "purplemarkup.h" -#include "signals.h" -#include "util.h" - -static GList *cmds = NULL; -static guint next_id = 1; - -typedef struct { - PurpleCmdId id; - gchar *cmd; - gchar *args; - PurpleCmdPriority priority; - PurpleCmdFlag flags; - gchar *protocol_id; - PurpleCmdFunc func; - gchar *help; - void *data; -} PurpleCmd; - - -static gint cmds_compare_func(const PurpleCmd *a, const PurpleCmd *b) -{ - return b->priority - a->priority; -} - -PurpleCmdId purple_cmd_register(const gchar *cmd, const gchar *args, - PurpleCmdPriority p, PurpleCmdFlag f, - const gchar *protocol_id, PurpleCmdFunc func, - const gchar *helpstr, void *data) -{ - PurpleCmdId id; - PurpleCmd *c; - - g_return_val_if_fail(cmd != NULL && *cmd != '\0', 0); - g_return_val_if_fail(args != NULL, 0); - g_return_val_if_fail(func != NULL, 0); - - id = next_id++; - - c = g_new0(PurpleCmd, 1); - c->id = id; - c->cmd = g_strdup(cmd); - c->args = g_strdup(args); - c->priority = p; - c->flags = f; - c->protocol_id = g_strdup(protocol_id); - c->func = func; - c->help = g_strdup(helpstr); - c->data = data; - - cmds = g_list_insert_sorted(cmds, c, (GCompareFunc)cmds_compare_func); - - purple_signal_emit(purple_cmds_get_handle(), "cmd-added", cmd, p, f); - - return id; -} - -static void purple_cmd_free(PurpleCmd *c) -{ - g_free(c->cmd); - g_free(c->args); - g_free(c->protocol_id); - g_free(c->help); - g_free(c); -} - -static gint -purple_cmd_cmp_id(gconstpointer cmd, gconstpointer id) -{ - return ((PurpleCmd *)cmd)->id - GPOINTER_TO_UINT(id); -} - -void purple_cmd_unregister(PurpleCmdId id) -{ - PurpleCmd *c; - GList *l; - - l = g_list_find_custom(cmds, GUINT_TO_POINTER(id), purple_cmd_cmp_id); - if (!l) { - return; - } - - c = l->data; - - cmds = g_list_delete_link(cmds, l); - purple_signal_emit(purple_cmds_get_handle(), "cmd-removed", c->cmd); - purple_cmd_free(c); -} - -/* - * This sets args to a NULL-terminated array of strings. It should - * be freed using g_strfreev(). - */ -static gboolean purple_cmd_parse_args(PurpleCmd *cmd, const gchar *s, const gchar *m, gchar ***args) -{ - int i; - const char *end, *cur; - - *args = g_new0(char *, strlen(cmd->args) + 1); - - cur = s; - - for (i = 0; cmd->args[i]; i++) { - if (!*cur) - return (cmd->flags & PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS); - - switch (cmd->args[i]) { - case 'w': - if (!(end = strchr(cur, ' '))) { - end = cur + strlen(cur); - (*args)[i] = g_strndup(cur, end - cur); - cur = end; - } else { - (*args)[i] = g_strndup(cur, end - cur); - cur = end + 1; - } - break; - case 'W': - if (!(end = strchr(cur, ' '))) { - end = cur + strlen(cur); - (*args)[i] = purple_markup_slice(m, g_utf8_pointer_to_offset(s, cur), g_utf8_pointer_to_offset(s, end)); - cur = end; - } else { - (*args)[i] = purple_markup_slice(m, g_utf8_pointer_to_offset(s, cur), g_utf8_pointer_to_offset(s, end)); - cur = end +1; - } - break; - case 's': - (*args)[i] = g_strdup(cur); - cur = cur + strlen(cur); - break; - case 'S': - (*args)[i] = purple_markup_slice(m, g_utf8_pointer_to_offset(s, cur), g_utf8_strlen(cur, -1) + 1); - cur = cur + strlen(cur); - break; - } - } - - if (*cur) - return (cmd->flags & PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS); - - return TRUE; -} - -static void purple_cmd_strip_current_char(gunichar c, char *s, guint len) -{ - int bytes; - - bytes = g_unichar_to_utf8(c, NULL); - memmove(s, s + bytes, len + 1 - bytes); -} - -static void purple_cmd_strip_cmd_from_markup(char *markup) -{ - guint len = strlen(markup); - char *s = markup; - - while (*s) { - gunichar c = g_utf8_get_char(s); - - if (c == '<') { - s = strchr(s, '>'); - if (!s) - return; - } else if (g_unichar_isspace(c)) { - purple_cmd_strip_current_char(c, s, len - (s - markup)); - return; - } else { - purple_cmd_strip_current_char(c, s, len - (s - markup)); - continue; - } - s = g_utf8_next_char(s); - } -} - -static gboolean -is_right_type(G_GNUC_UNUSED PurpleCmd *cmd, - G_GNUC_UNUSED PurpleConversation *conv) -{ - return FALSE; -} - -static gboolean -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) -{ - gchar *err = NULL; - gboolean found = FALSE, tried_cmd = FALSE, right_type = FALSE, right_protocol = FALSE; - gchar *cmd, *rest, *mrest; - PurpleCmdRet ret = PURPLE_CMD_RET_CONTINUE; - - *error = NULL; - - rest = strchr(cmdline, ' '); - if (rest) { - cmd = g_strndup(cmdline, rest - cmdline); - rest++; - } else { - cmd = g_strdup(cmdline); - rest = ""; - } - - mrest = g_strdup(markup); - purple_cmd_strip_cmd_from_markup(mrest); - - for (GList *l = cmds; l; l = l->next) { - PurpleCmd *c = l->data; - gchar **args = NULL; - - if (!purple_strequal(c->cmd, cmd)) - continue; - - found = TRUE; - - if (!is_right_type(c, conv)) { - continue; - } - - right_type = TRUE; - - if (!is_right_protocol(c, conv)) { - continue; - } - - right_protocol = TRUE; - - /* this checks the allow bad args flag for us */ - if (!purple_cmd_parse_args(c, rest, mrest, &args)) { - g_strfreev(args); - continue; - } - - tried_cmd = TRUE; - ret = c->func(conv, cmd, args, &err, c->data); - g_strfreev(args); - if (ret == PURPLE_CMD_RET_CONTINUE) { - g_free(err); - err = NULL; - continue; - } - - break; - } - - g_free(cmd); - g_free(mrest); - - if (!found) - return PURPLE_CMD_STATUS_NOT_FOUND; - - if (!right_type) - return PURPLE_CMD_STATUS_WRONG_TYPE; - if (!right_protocol) - return PURPLE_CMD_STATUS_WRONG_PROTOCOL; - if (!tried_cmd) - return PURPLE_CMD_STATUS_WRONG_ARGS; - - if (ret != PURPLE_CMD_RET_OK) { - *error = err; - if (ret == PURPLE_CMD_RET_CONTINUE) - return PURPLE_CMD_STATUS_NOT_FOUND; - else - return PURPLE_CMD_STATUS_FAILED; - } - - return PURPLE_CMD_STATUS_OK; -} - -gboolean purple_cmd_execute(PurpleCmdId id, PurpleConversation *conv, - const gchar *cmdline) -{ - PurpleCmd *cmd = NULL; - PurpleCmdRet ret = PURPLE_CMD_RET_CONTINUE; - GList *l = NULL; - gchar *err = NULL; - gchar **args = NULL; - - l = g_list_find_custom(cmds, GUINT_TO_POINTER(id), purple_cmd_cmp_id); - if (!l) { - return FALSE; - } - - cmd = l->data; - - if (!is_right_type(cmd, conv)) { - return FALSE; - } - - /* XXX: Don't worry much about the markup version of the command - line, there's not a single use case... */ - /* this checks the allow bad args flag for us */ - if (!purple_cmd_parse_args(cmd, cmdline, cmdline, &args)) { - g_strfreev(args); - return FALSE; - } - - ret = cmd->func(conv, cmd->cmd, args, &err, cmd->data); - - g_free(err); - g_strfreev(args); - - return ret == PURPLE_CMD_RET_OK; -} - -GList *purple_cmd_list(PurpleConversation *conv) -{ - GList *ret = NULL; - - for (GList *l = cmds; l; l = l->next) { - PurpleCmd *c = l->data; - - if (conv && (!is_right_type(c, conv) || !is_right_protocol(c, conv))) { - continue; - } - - ret = g_list_append(ret, c->cmd); - } - - ret = g_list_sort(ret, (GCompareFunc)strcmp); - - return ret; -} - - -GList *purple_cmd_help(PurpleConversation *conv, const gchar *cmd) -{ - GList *ret = NULL; - - for (GList *l = cmds; l; l = l->next) { - PurpleCmd *c = l->data; - - if (cmd && !purple_strequal(cmd, c->cmd)) - continue; - - if (conv && (!is_right_type(c, conv) || !is_right_protocol(c, conv))) { - continue; - } - - ret = g_list_append(ret, c->help); - } - - ret = g_list_sort(ret, (GCompareFunc)strcmp); - - return ret; -} - -gpointer purple_cmds_get_handle(void) -{ - static int handle; - return &handle; -} - -void purple_cmds_init(void) -{ - gpointer handle = purple_cmds_get_handle(); - - purple_signal_register(handle, "cmd-added", - purple_marshal_VOID__POINTER_INT_INT, G_TYPE_NONE, 3, - G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT); - purple_signal_register(handle, "cmd-removed", - purple_marshal_VOID__POINTER, G_TYPE_NONE, 1, - G_TYPE_STRING); -} - -void purple_cmds_uninit(void) -{ - purple_signals_unregister_by_instance(purple_cmds_get_handle()); - - g_clear_list(&cmds, (GDestroyNotify)purple_cmd_free); -} -
--- a/libpurple/cmds.h Thu Apr 25 21:07:46 2024 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,357 +0,0 @@ -/* - * Purple - Internet Messaging Library - * 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 library 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 library 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 library; 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_CMDS_H -#define PURPLE_CMDS_H - -#include "purpleconversation.h" -#include "purpleversion.h" - -/****************************************************************************** - * Structures - *****************************************************************************/ - -/** - * PurpleCmdStatus: - * @PURPLE_CMD_STATUS_OK: The command executed successfully. - * @PURPLE_CMD_STATUS_FAILED: The command failed to execute. - * @PURPLE_CMD_STATUS_NOT_FOUND: The command was not found. - * @PURPLE_CMD_STATUS_WRONG_ARGS: The wrong number of arguments were passed. - * @PURPLE_CMD_STATUS_WRONG_PROTOCOL: The command was run with the wrong - * protocol. - * @PURPLE_CMD_STATUS_WRONG_TYPE: The Command was ran against the wrong type of - * conversation. - * - * The possible results of running a command with purple_cmd_do_command(). - * - * Since: 2.0 - */ -typedef enum { - PURPLE_CMD_STATUS_OK, - PURPLE_CMD_STATUS_FAILED, - PURPLE_CMD_STATUS_NOT_FOUND, - PURPLE_CMD_STATUS_WRONG_ARGS, - PURPLE_CMD_STATUS_WRONG_PROTOCOL, - PURPLE_CMD_STATUS_WRONG_TYPE -} PurpleCmdStatus; - -/** - * PurpleCmdRet: - * @PURPLE_CMD_RET_OK: Everything's okay; Don't look for another command to - * call. - * @PURPLE_CMD_RET_FAILED: The command failed, but stop looking. - * @PURPLE_CMD_RET_CONTINUE: Continue, looking for other commands with the same - * name to call. - * - * Commands registered with the core return one of these values when run. - * Normally, a command will want to return one of the first two; in some - * unusual cases, you might want to have several functions called for a - * particular command; in this case, they should return - * #PURPLE_CMD_RET_CONTINUE to cause the core to fall through to other - * commands with the same name. - * - * Since: 2.0 - */ -typedef enum { - PURPLE_CMD_RET_OK, - PURPLE_CMD_RET_FAILED, - PURPLE_CMD_RET_CONTINUE -} PurpleCmdRet; - -/** - * PurpleCmdFunc: - * @conversation: The #PurpleConversation where the command is being run. - * @cmd: The name of the command. - * @args: The arguments to the command. - * @error: (out): A return address for a #GError. - * @data: User data to pass to the function. - * - * A function implementing a command, as passed to purple_cmd_register(). - * - * Returns: The result of the command. - * - * Since: 2.0 - */ -typedef PurpleCmdRet (*PurpleCmdFunc)(PurpleConversation *conversation, const gchar *cmd, - gchar **args, gchar **error, void *data); -/** - * PurpleCmdId: - * - * A unique integer representing a command registered with - * purple_cmd_register(), which can subsequently be passed to - * purple_cmd_unregister() to unregister that command. - */ -typedef guint PurpleCmdId; - -/** - * PurpleCmdPriority: - * @PURPLE_CMD_P_VERY_LOW: Lowest priority. - * @PURPLE_CMD_P_LOW: Low priority. - * @PURPLE_CMD_P_DEFAULT: Default priority. - * @PURPLE_CMD_P_PROTOCOL: Priority for protocol plugins. - * @PURPLE_CMD_P_PLUGIN: Priority for plugins. - * @PURPLE_CMD_P_ALIAS: Priority for aliasing commands. - * @PURPLE_CMD_P_HIGH: High priority. - * @PURPLE_CMD_P_VERY_HIGH: Highest priority. - * - * Commands are registered from multiple locations which leads to name - * collisions. PurpleCmdPriority is used to determine which command will be - * run. - * - * Since: 2.0 - */ -typedef enum { - PURPLE_CMD_P_VERY_LOW = -1000, - PURPLE_CMD_P_LOW = 0, - PURPLE_CMD_P_DEFAULT = 1000, - PURPLE_CMD_P_PROTOCOL = 2000, - PURPLE_CMD_P_PLUGIN = 3000, - PURPLE_CMD_P_ALIAS = 4000, - PURPLE_CMD_P_HIGH = 5000, - PURPLE_CMD_P_VERY_HIGH = 6000 -} PurpleCmdPriority; - -/** - * PurpleCmdFlag: - * @PURPLE_CMD_FLAG_IM: Command is usable in IMs. - * @PURPLE_CMD_FLAG_CHAT: Command is usable in multi-user chats. - * @PURPLE_CMD_FLAG_PROTOCOL_ONLY: Command is usable only for a particular - * protocol. - * @PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS: Incorrect arguments to this command - * should be accepted anyway. - * - * Flags used to set various properties of commands. Every command should - * have at least one of #PURPLE_CMD_FLAG_IM and #PURPLE_CMD_FLAG_CHAT set in - * order to be even slightly useful. - * - * See purple_cmd_register(). - * - * Since: 2.0 - */ -typedef enum { - PURPLE_CMD_FLAG_IM = 0x01, - PURPLE_CMD_FLAG_CHAT = 0x02, - PURPLE_CMD_FLAG_PROTOCOL_ONLY = 0x04, - PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS = 0x08 -} PurpleCmdFlag; - -G_BEGIN_DECLS - -/**************************************************************************/ -/* Commands API */ -/**************************************************************************/ - -/** - * purple_cmd_register: - * @cmd: The command. This should be a UTF-8 (or ASCII) string, with no spaces - * or other white space. - * @args: A string of characters describing to libpurple how to parse this - * command's arguments. If what the user types doesn't match this - * pattern, libpurple will keep looking for another command, unless - * the flag #PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS is passed in @f. - * This string should contain no whitespace, and use a single - * character for each argument. The recognized characters are: - * <itemizedlist> - * <listitem><literal>'w'</literal>: Matches a single word.</listitem> - * <listitem><literal>'W'</literal>: Matches a single word, with - * formatting.</listitem> - * <listitem><literal>'s'</literal>: Matches the rest of the - * arguments after this point, - * as a single string.</listitem> - * <listitem><literal>'S'</literal>: Same as <literal>'s'</literal> - * but with formatting.</listitem> - * </itemizedlist> - * If args is the empty string, then the command accepts no - * arguments. The args passed to the callback @func will be a %NULL - * terminated array of %NULL terminated strings, and will always - * match the number of arguments asked for, unless - * #PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS is passed. - * @p: This is the priority. Higher priority commands will be run first, - * and usually the first command will stop any others from being - * called. - * @f: Flags specifying various options about this command, combined with - * <literal>|</literal> (bitwise OR). You need to at least pass one of - * #PURPLE_CMD_FLAG_IM or #PURPLE_CMD_FLAG_CHAT (you may pass both) in - * order for the command to ever actually be called. - * @protocol_id: If the #PURPLE_CMD_FLAG_PROTOCOL_ONLY flag is set, this is the id - * of the protocol to which the command applies (such as - * <literal>"prpl-msn"</literal>). If the flag is not set, this - * parameter is ignored; pass %NULL (or a humourous string of - * your choice!). - * @func: (scope call): This is the function to call when someone enters this - * command. - * @helpstr: a whitespace sensitive, UTF-8, HTML string describing how to - * use the command. The preferred format of this string is the - * command's name, followed by a space and any arguments it - * accepts (if it takes any arguments, otherwise no space), - * followed by a colon, two spaces, and a description of the - * command in sentence form. Do not include a slash before the - * command name. - * @data: User defined data to pass to the #PurpleCmdFunc @f. - * - * Register a new command with the core. - * - * The command will only happen if commands are enabled, - * which is a UI pref. UIs don't have to support commands at all. - * - * Returns: A #PurpleCmdId, which is only used for calling - * #purple_cmd_unregister, or 0 on failure. - * - * Since: 2.0 - */ -PURPLE_AVAILABLE_IN_ALL -PurpleCmdId purple_cmd_register(const gchar *cmd, const gchar *args, PurpleCmdPriority p, PurpleCmdFlag f, const gchar *protocol_id, PurpleCmdFunc func, const gchar *helpstr, void *data); - -/** - * purple_cmd_unregister: - * @id: The #PurpleCmdId to unregister, as returned by #purple_cmd_register. - * - * Unregister a command with the core. - * - * All registered commands must be unregistered, if they're registered by a plugin - * or something else that might go away. Normally this is called when the plugin - * unloads itself. - * - * Since: 2.0 - */ -PURPLE_AVAILABLE_IN_ALL -void purple_cmd_unregister(PurpleCmdId id); - -/** - * purple_cmd_do_command: - * @conv: The conversation the command was typed in. - * @cmdline: The command the user typed (including all arguments) as a single string. - * The caller doesn't have to do any parsing, except removing the command - * prefix, which the core has no knowledge of. cmd should not contain any - * formatting, and should be in plain text (no html entities). - * @markup: This is the same as cmd, but is the formatted version. It should be in - * HTML, with < > and &, at least, escaped to html entities, and should - * include both the default formatting and any extra manual formatting. - * @errormsg: If the command failed errormsg is filled in with the appropriate error - * message. It must be freed by the caller with g_free(). - * - * Do a command. - * - * Normally the UI calls this to perform a command. This might also be useful - * if aliases are ever implemented. - * - * Returns: A #PurpleCmdStatus indicating if the command succeeded or failed. - * - * Since: 2.0 - */ -PURPLE_AVAILABLE_IN_ALL -PurpleCmdStatus purple_cmd_do_command(PurpleConversation *conv, const gchar *cmdline, const gchar *markup, gchar **errormsg); - -/** - * purple_cmd_execute: - * @id: The command to execute. - * @conv: The conversation the command was typed in. - * @cmdline: The command the user typed (only the arguments). - * The caller should remove the prefix and the command name. - * It should not contain any formatting, and should be - * in plain text (no HTML entities). - * - * Execute a specific command. - * - * The UI calls this to execute a command, after parsing the - * command name. - * - * Returns: %TRUE if the command handled the @cmdline, %FALSE otherwise. - * - * Since: 2.11 - */ -PURPLE_AVAILABLE_IN_2_11 -gboolean purple_cmd_execute(PurpleCmdId id, PurpleConversation *conv, - const gchar *cmdline); - -/** - * purple_cmd_list: - * @conv: The conversation, or %NULL. - * - * List registered commands. - * - * Returns: (element-type utf8) (transfer container): All commands - * that are valid in the context of @conv, or all commands, if @conv is - * %NULL. Don't keep this list around past the main loop, or anything else that - * might unregister a command, as the <type>const char *</type>'s used get freed - * then. - * - * Since: 2.0 - */ -PURPLE_AVAILABLE_IN_ALL -GList *purple_cmd_list(PurpleConversation *conv); - -/** - * purple_cmd_help: - * @conv: The conversation, or %NULL for no context. - * @cmd: The command. No wildcards accepted, but returns help for all - * commands if %NULL. - * - * Get the help string for a command. - * - * Returns: (element-type utf8) (transfer container): the help strings for a - * given command, one node for each matching command. - * - * Since: 2.0 - */ -PURPLE_AVAILABLE_IN_ALL -GList *purple_cmd_help(PurpleConversation *conv, const gchar *cmd); - -/** - * purple_cmds_get_handle: - * - * Get the handle for the commands API - * - * Returns: The handle - * - * Since: 2.5 - */ -PURPLE_AVAILABLE_IN_2_5 -gpointer purple_cmds_get_handle(void); - -/** - * purple_cmds_init: - * - * Initialize the commands subsystem. - * - * Since: 2.5 - */ -PURPLE_AVAILABLE_IN_2_5 -void purple_cmds_init(void); - -/** - * purple_cmds_uninit: - * - * Uninitialize the commands subsystem. - * - * Since: 2.5 - */ -PURPLE_AVAILABLE_IN_2_5 -void purple_cmds_uninit(void); - -G_END_DECLS - -#endif /* PURPLE_CMDS_H */
--- a/libpurple/core.c Thu Apr 25 21:07:46 2024 -0500 +++ b/libpurple/core.c Thu Apr 25 21:09:01 2024 -0500 @@ -26,7 +26,6 @@ #define G_SETTINGS_ENABLE_BACKEND #include <gio/gsettingsbackend.h> -#include "cmds.h" #include "connection.h" #include "core.h" #include "debug.h" @@ -136,7 +135,6 @@ purple_notification_manager_startup(); - purple_cmds_init(); purple_protocol_manager_startup(); purple_credential_manager_startup(); /* before accounts */ @@ -241,7 +239,6 @@ purple_account_manager_shutdown(); purple_credential_manager_shutdown(); purple_protocol_manager_shutdown(); - purple_cmds_uninit(); purple_notification_manager_shutdown(); purple_history_manager_shutdown();
--- a/libpurple/meson.build Thu Apr 25 21:07:46 2024 -0500 +++ b/libpurple/meson.build Thu Apr 25 21:09:01 2024 -0500 @@ -2,7 +2,6 @@ 'accounts.c', 'action.c', 'circularbuffer.c', - 'cmds.c', 'connection.c', 'core.c', 'debug.c', @@ -101,7 +100,6 @@ 'accounts.h', 'action.h', 'circularbuffer.h', - 'cmds.h', 'connection.h', 'core.h', 'debug.h',