diff --git a/src/core/commands.c b/src/core/commands.c index b82364b7..1b17ac4b 100644 --- a/src/core/commands.c +++ b/src/core/commands.c @@ -419,41 +419,17 @@ void cmd_get_remove_func(CMD_GET_FUNC func) cmdget_funcs = g_slist_prepend(cmdget_funcs, (void *) func); } -static void parse_outgoing(const char *line, SERVER_REC *server, void *item) +static void parse_command(const char *command, int expand_aliases, SERVER_REC *server, void *item) { const char *alias; - char *cmd, *str, *args, *oldcmd, *cmdchar; - int use_alias = TRUE; + char *cmd, *str, *args, *oldcmd; - g_return_if_fail(line != NULL); - - if (*line == '\0') { - /* empty line, forget it. */ - signal_stop(); - return; - } - - cmdchar = strchr(settings_get_str("cmdchars"), *line); - if (cmdchar == NULL) - return; /* handle only /commands here */ - line++; - if (*line == ' ') { - /* "/ text" = same as sending "text" to active channel. */ - return; - } - - /* same cmdchar twice ignores aliases ignores aliases */ - if (*line == *cmdchar) { - line++; - use_alias = FALSE; - } - - cmd = str = g_strconcat("command ", line, NULL); + cmd = str = g_strconcat("command ", command, NULL); args = strchr(cmd+8, ' '); if (args != NULL) *args++ = '\0'; else args = ""; /* check if there's an alias for command */ - alias = use_alias ? alias_find(cmd+8) : NULL; + alias = expand_aliases ? alias_find(cmd+8) : NULL; if (alias != NULL) eval_special_string(alias, args, server, item); else { @@ -464,13 +440,48 @@ static void parse_outgoing(const char *line, SERVER_REC *server, void *item) oldcmd = current_command; current_command = cmd+8; if (!signal_emit(cmd, 3, args, server, item)) - signal_emit_id(signal_default_command, 3, line, server, item); + signal_emit_id(signal_default_command, 3, command, server, item); current_command = oldcmd; } g_free(str); } +static void event_command(const char *line, SERVER_REC *server, void *item) +{ + char *cmdchar; + int expand_aliases = TRUE; + + g_return_if_fail(line != NULL); + + if (*line == '\0') { + /* empty line, forget it. */ + signal_stop(); + return; + } + + cmdchar = strchr(settings_get_str("cmdchars"), *line); + if (cmdchar != NULL && line[1] == ' ') { + /* "/ text" = same as sending "text" to active channel. */ + line += 2; + cmdchar = NULL; + } + if (cmdchar == NULL) { + /* non-command - let someone else handle this */ + signal_emit("send text", 3, line, server, item); + return; + } + + /* same cmdchar twice ignores aliases ignores aliases */ + line++; + if (*line == *cmdchar) { + line++; + expand_aliases = FALSE; + } + + parse_command(line, expand_aliases, server, item); +} + static void cmd_eval(const char *data, SERVER_REC *server, void *item) { g_return_if_fail(data != NULL); @@ -514,7 +525,7 @@ void commands_init(void) signal_default_command = module_get_uniq_id_str("signals", "default command"); settings_add_str("misc", "cmdchars", "/"); - signal_add("send command", (SIGNAL_FUNC) parse_outgoing); + signal_add("send command", (SIGNAL_FUNC) event_command); command_bind("eval", NULL, (SIGNAL_FUNC) cmd_eval); command_bind("cd", NULL, (SIGNAL_FUNC) cmd_cd); @@ -527,7 +538,7 @@ void commands_deinit(void) g_free_not_null(current_command); g_slist_free(cmdget_funcs); - signal_remove("send command", (SIGNAL_FUNC) parse_outgoing); + signal_remove("send command", (SIGNAL_FUNC) event_command); command_unbind("eval", (SIGNAL_FUNC) cmd_eval); command_unbind("cd", (SIGNAL_FUNC) cmd_cd); diff --git a/src/fe-common/irc/completion.c b/src/fe-common/irc/completion.c index 140bdd1f..0e98c729 100644 --- a/src/fe-common/irc/completion.c +++ b/src/fe-common/irc/completion.c @@ -269,7 +269,7 @@ static GList *completion_getmsglist(IRC_SERVER_REC *server, gchar *nick) return list; } -static void event_command(gchar *line, IRC_SERVER_REC *server, WI_IRC_REC *item) +static void event_text(gchar *line, IRC_SERVER_REC *server, WI_IRC_REC *item) { CHANNEL_REC *channel; GList *comp; @@ -280,14 +280,6 @@ static void event_command(gchar *line, IRC_SERVER_REC *server, WI_IRC_REC *item) if (!irc_item_check(item)) return; - if (strchr(settings_get_str("cmdchars"), *line) != NULL) { - if (line[1] != ' ') - return; - - /* "/ text" = same as sending "text" to active channel. */ - line += 2; - } - line = g_strdup(line); /* check for nick completion */ @@ -584,7 +576,7 @@ void completion_init(void) settings_add_int("completion", "completion_keep_privates", 10); signal_add("event privmsg", (SIGNAL_FUNC) event_privmsg); - signal_add("send command", (SIGNAL_FUNC) event_command); + signal_add("send text", (SIGNAL_FUNC) event_text); signal_add("server disconnected", (SIGNAL_FUNC) completion_deinit_server); signal_add("channel destroyed", (SIGNAL_FUNC) completion_deinit_channel); command_bind("msg", NULL, (SIGNAL_FUNC) cmd_msg); @@ -601,7 +593,7 @@ void completion_deinit(void) g_source_remove(comptag); signal_remove("event privmsg", (SIGNAL_FUNC) event_privmsg); - signal_remove("send command", (SIGNAL_FUNC) event_command); + signal_remove("send text", (SIGNAL_FUNC) event_text); signal_remove("server disconnected", (SIGNAL_FUNC) completion_deinit_server); signal_remove("channel destroyed", (SIGNAL_FUNC) completion_deinit_channel); command_unbind("msg", (SIGNAL_FUNC) cmd_msg);