diff --git a/include/misc.h b/include/misc.h index 3c50333..62332e1 100644 --- a/include/misc.h +++ b/include/misc.h @@ -102,7 +102,8 @@ ChannelList * BX_prepare_command (int *, char *, int); int are_you_opped (char *); void error_not_opped (const char *); -char *get_reason(const char *nick, const char *file); +char *get_reason(const char *target, const char *nick, const char *file); +char *get_kick_reason(const char *target, const char *nick); char *get_kill_reason(const char *target, const char *nick); char *get_realname(const char *nick); char *get_signoffreason(const char *nick); diff --git a/source/banlist.c b/source/banlist.c index bf879f1..52deded 100644 --- a/source/banlist.c +++ b/source/banlist.c @@ -443,13 +443,15 @@ BUILT_IN_COMMAND(multkick) reason = strchr(temp, ':'); if (reason) *reason++ = 0; - if (!reason || !*reason) - reason = get_reason(NULL, NULL); while (temp && *temp) { + const char *nick = next_arg(temp, &temp); + const char *this_reason = reason && *reason ? reason : + get_kick_reason(nick, get_server_nickname(server)); + my_send_to_server(server, "KICK %s %s :\002%s\002", chan->channel, - next_arg(temp, &temp), reason); + nick, this_reason); } } @@ -729,7 +731,9 @@ BUILT_IN_COMMAND(mknu) if (nicks->userlist || (nick_isop(nicks) && !kickops) || isme(nicks->nick)) continue; count++; - send_to_server("KICK %s %s :(non-users) \002%s\002", chan->channel, nicks->nick, rest ? rest : get_reason(nicks->nick, NULL)); + my_send_to_server(server, "KICK %s %s :(non-users) \002%s\002", + chan->channel, nicks->nick, rest ? rest : + get_kick_reason(nicks->nick, get_server_nickname(server))); } if (!count) say("No matches for masskick of non-users on %s", chan->channel); @@ -774,7 +778,7 @@ BUILT_IN_COMMAND(masskickban) else strcpy(tempbuf, spec); - send_to_server("MODE %s +b %s", chan->channel, tempbuf); + my_send_to_server(server, "MODE %s +b %s", chan->channel, tempbuf); for (nicks = next_nicklist(chan, NULL); nicks; nicks = next_nicklist(chan, nicks)) { *buffer = '\0'; @@ -783,7 +787,9 @@ BUILT_IN_COMMAND(masskickban) !isme(nicks->nick) && wild_match(tempbuf, buffer)) { count++; - send_to_server("KICK %s %s :(%s) \002%s\002", chan->channel, nicks->nick, spec, rest ? rest : get_reason(nicks->nick, NULL)); + my_send_to_server(server, "KICK %s %s :(%s) \002%s\002", chan->channel, + nicks->nick, spec, rest ? rest : + get_kick_reason(nicks->nick, get_server_nickname(server))); } } if (!count) @@ -968,10 +974,10 @@ BUILT_IN_COMMAND(dokick) if (args && *args) reason = args; else - reason = get_reason(spec, NULL); + reason = get_kick_reason(spec, get_server_nickname(server)); set_display_target(chan->channel, LOG_KICK); - send_to_server("KICK %s %s :%s", chan->channel, spec, reason); + my_send_to_server(server, "KICK %s %s :%s", chan->channel, spec, reason); reset_display_target(); } @@ -1043,13 +1049,13 @@ BUILT_IN_COMMAND(kickban) host = strchr(user, '@'); *host++ = 0; if (kick_first) - send_to_server("KICK %s %s :%s\r\nMODE %s +b %s", - chan->channel, nicks->nick, rest ? rest : get_reason(nicks->nick, NULL), + my_send_to_server(server, "KICK %s %s :%s\r\nMODE %s +b %s", + chan->channel, nicks->nick, rest ? rest : get_kick_reason(nicks->nick, get_server_nickname(server)), chan->channel, ban_it(nicks->nick, user, host, nicks->ip)); else - send_to_server("MODE %s -o+b %s %s\r\nKICK %s %s :%s", + my_send_to_server(server, "MODE %s -o+b %s %s\r\nKICK %s %s :%s", chan->channel, nicks->nick, ban_it(nicks->nick, user, host, nicks->ip), - chan->channel, nicks->nick, rest ? rest : get_reason(nicks->nick, NULL)); + chan->channel, nicks->nick, rest ? rest : get_kick_reason(nicks->nick, get_server_nickname(server))); count++; if (time >= 0) add_timer(0, empty_string, time * 1000.0, 1, timer_unban, diff --git a/source/commands.c b/source/commands.c index 12acb3a..1a9b53c 100644 --- a/source/commands.c +++ b/source/commands.c @@ -3669,25 +3669,22 @@ BUILT_IN_COMMAND(send_kill) BUILT_IN_COMMAND(send_kick) { - char *kickee, - *comment, - *channel = NULL; -ChannelList *chan; -int server = from_server; - + const char *kickee, *comment; + char *channel; + ChannelList *chan; + int server = from_server; - if (!(channel = next_arg(args, &args))) + if (!(channel = next_arg(args, &args))) return; - - if (!(kickee = next_arg(args, &args))) + + if (!(kickee = next_arg(args, &args))) return; - comment = args?args:get_reason(kickee, NULL); - reset_display_target(); - if (!(chan = prepare_command(&server, (channel && !strcmp(channel, "*"))?NULL:channel, NEED_OP))) + if (!(chan = prepare_command(&server, !strcmp(channel, "*") ? NULL : channel, NEED_OP))) return; + comment = args ? args : get_kick_reason(kickee, get_server_nickname(server)); my_send_to_server(server, "%s %s %s :%s", command, chan->channel, kickee, comment); } diff --git a/source/functions.c b/source/functions.c index 9768659..9aedc11 100644 --- a/source/functions.c +++ b/source/functions.c @@ -5081,9 +5081,9 @@ char *blah; BUILT_IN_FUNCTION(function_getreason, word) { -char *nick = NULL; + char *nick = NULL; GET_STR_ARG(nick, word); - RETURN_STR(get_reason(nick, word)); + RETURN_STR(get_reason(nick, get_server_nickname(from_server), word)); } BUILT_IN_FUNCTION(function_chmod, words) diff --git a/source/misc.c b/source/misc.c index f9d741a..3de799f 100644 --- a/source/misc.c +++ b/source/misc.c @@ -1786,7 +1786,8 @@ static char *fread_random(const char *filename, char *line, size_t len) /* Read a random text format from a file, convert it and strip it. A default format is supplied if a format cannot be read from the file. - arg0 and arg1 replace $0 and $1 in the format. */ + arg0 and arg1 replace $0 and $1 in the format. + */ static char *random_text(const char *filename, const char *arg0, const char *arg1, const char *default_format) { @@ -1799,24 +1800,40 @@ static char *random_text(const char *filename, const char *arg0, return stripansicodes(convert_output_format(format, "%s %s", arg0, arg1)); } -char *get_reason(const char *nick, const char *file) +/* Get a random reason from a specific reason file, defaulting to the kick + * file if none passed. Format it using target and nick to replace $0 and $1. + */ +char *get_reason(const char *target, const char *nick, const char *file) { if (!file || !*file) file = DEFAULT_BITCHX_KICK_FILE; - return random_text(file, nick ? nick : "error", get_server_nickname(from_server), get_string_var(DEFAULT_REASON_VAR)); + return random_text(file, target, nick, get_string_var(DEFAULT_REASON_VAR)); } +/* Get a random kick reason. Format it using target and nick to replace $0 + * and $1. + */ +char *get_kick_reason(const char *target, const char *nick) +{ + return get_reason(target, nick, NULL); +} + +/* Get a random kill reason. Format it using target and nick to replace $0 + * and $1. + */ char *get_kill_reason(const char *target, const char *nick) { return random_text(DEFAULT_BITCHX_KILL_FILE, target, nick, get_string_var(DEFAULT_REASON_VAR)); } +/* Get a random ircname. Format it using nick to replace $0 and $1. */ char *get_realname(const char *nick) { return random_text(DEFAULT_BITCHX_IRCNAME_FILE, nick, nick, "Who cares?"); } +/* Get a quit reason. Format it using nick to replace $0 and $1. */ char *get_signoffreason(const char *nick) { return random_text(DEFAULT_BITCHX_QUIT_FILE, nick, nick, "$0 has no reason");