diff --git a/Changelog b/Changelog index bcf9842..ca29ddb 100644 --- a/Changelog +++ b/Changelog @@ -1,5 +1,8 @@ [Changes 1.2c01] +* Add /FSET USERMODE_OTHER to correctly format user mode changes where the + source isn't the same as the target, reported by gauze. (caf) + * Improve country() and add several new TLDs, suggested by gauze. (caf) * Apply fixes from darkfires removing non-standard use of arithmetic on diff --git a/include/color.h b/include/color.h index 327d807..c806931 100644 --- a/include/color.h +++ b/include/color.h @@ -271,6 +271,7 @@ #define DEFAULT_FORMAT_USAGE_FSET "$G Usage: /$0 $1-" #define DEFAULT_FORMAT_USERMODE_FSET "$G %nMode change %K[%W$4-%K]%n for user %c$3" +#define DEFAULT_FORMAT_USERMODE_OTHER_FSET "$G %nMode change %K[%W$4-%K]%n for user %c$3%n by %W$1" #define DEFAULT_FORMAT_USERLIST_FSET "$[16]0 $[10]1 $[-10]2 $[-25]3 $[10]4" @@ -695,6 +696,7 @@ #define DEFAULT_FORMAT_USAGE_FSET "$G Usage: /$0 $1-" #define DEFAULT_FORMAT_USERMODE_FSET "$G %nMode change %K[%W$4-%K]%n for user %c$3" +#define DEFAULT_FORMAT_USERMODE_OTHER_FSET "$G %nMode change %K[%W$4-%K]%n for user %c$3%n by %W$1" #define DEFAULT_FORMAT_USERLIST_FSET "$[16]0 $[10]1 $[-10]2 $[-25]3 $[10]4" diff --git a/include/cset.h b/include/cset.h index 82e9d55..e766182 100644 --- a/include/cset.h +++ b/include/cset.h @@ -347,6 +347,7 @@ FORMAT_USERLIST_FOOTER_FSET, FORMAT_USERLIST_HEADER_FSET, FORMAT_USERMODE_FSET, +FORMAT_USERMODE_OTHER_FSET, FORMAT_USERS_FSET, FORMAT_USERS_HEADER_FSET, FORMAT_USERS_SHIT_FSET, diff --git a/source/fset.c b/source/fset.c index d245702..b3a305c 100644 --- a/source/fset.c +++ b/source/fset.c @@ -729,6 +729,7 @@ void create_fsets(Window *win, int ansi) fset_string_var(FORMAT_TOPIC_UNSET_FSET, DEFAULT_FORMAT_TOPIC_UNSET_FSET); fset_string_var(FORMAT_USAGE_FSET, DEFAULT_FORMAT_USAGE_FSET); fset_string_var(FORMAT_USERMODE_FSET, DEFAULT_FORMAT_USERMODE_FSET); + fset_string_var(FORMAT_USERMODE_OTHER_FSET, DEFAULT_FORMAT_USERMODE_OTHER_FSET); fset_string_var(FORMAT_USERLIST_FSET, DEFAULT_FORMAT_USERLIST_FSET); fset_string_var(FORMAT_USERLIST_FOOTER_FSET, DEFAULT_FORMAT_USERLIST_FOOTER_FSET); fset_string_var(FORMAT_USERLIST_HEADER_FSET, DEFAULT_FORMAT_USERLIST_HEADER_FSET); diff --git a/source/parse.c b/source/parse.c index 35cefde..b01da27 100644 --- a/source/parse.c +++ b/source/parse.c @@ -1419,39 +1419,40 @@ time_t right_now; static void p_mode(char *from, char **ArgList) { - char *channel; - char *line; + char *target; + char *line; int flag; ChannelList *chan = NULL; ChannelList *chan2 = get_server_channels(from_server); char buffer[BIG_BUFFER_SIZE+1]; char *smode; + char *display_uh = FromUserHost[0] ? FromUserHost : "*"; #ifdef COMPRESS_MODES char *tmpbuf = NULL; #endif PasteArgs(ArgList, 1); - channel = ArgList[0]; + target = ArgList[0]; line = ArgList[1]; smode = strchr(from, '.'); - flag = check_ignore(from, FromUserHost, channel, (smode?IGNORE_SMODES : IGNORE_MODES) | IGNORE_CRAP, NULL); + flag = check_ignore(from, FromUserHost, target, (smode?IGNORE_SMODES : IGNORE_MODES) | IGNORE_CRAP, NULL); - set_display_target(channel, LOG_CRAP); - if (channel && line) + set_display_target(target, LOG_CRAP); + if (target && line) { strcpy(buffer, line); if (get_int_var(MODE_STRIPPER_VAR)) - strip_modes(from,channel,line); - if (is_channel(channel)) + strip_modes(from, target, line); + if (is_channel(target)) { #ifdef COMPRESS_MODES if (chan2) - chan = (ChannelList *)find_in_list((List **)&chan2, channel, 0); + chan = (ChannelList *)find_in_list((List **)&chan2, target, 0); if (chan && get_cset_int_var(chan->csets, COMPRESS_MODES_CSET)) { - tmpbuf = do_compress_modes(chan, from_server, channel, line); + tmpbuf = do_compress_modes(chan, from_server, target, line); if (tmpbuf) strcpy(line, tmpbuf); else @@ -1459,45 +1460,41 @@ static void p_mode(char *from, char **ArgList) } #endif /* CDE handle mode protection here instead of later */ - update_channel_mode(from, channel, from_server, buffer, chan); + update_channel_mode(from, target, from_server, buffer, chan); #ifdef WANT_TCL - check_tcl_mode(from, FromUserHost, from, channel, line); + check_tcl_mode(from, FromUserHost, from, target, line); #endif if (my_stricmp(from, get_server_nickname(from_server))) { - check_mode_lock(channel, line, from_server); - check_bitch_mode(from, FromUserHost, channel, line, chan); + check_mode_lock(target, line, from_server); + check_bitch_mode(from, FromUserHost, target, line, chan); } - - if (flag != IGNORED && do_hook(MODE_LIST, "%s %s %s", from, channel, line)) - put_it("%s",convert_output_format(fget_string_var(smode?FORMAT_SMODE_FSET:FORMAT_MODE_FSET), "%s %s %s %s %s",update_clock(GET_TIME), from, smode?"*":FromUserHost, channel, line)); - logmsg(LOG_MODE_CHAN, from, 0, "%s %s", channel, line); - do_logchannel(LOG_MODE_CHAN, chan, "%s %s, %s", from, channel, line); + if (flag != IGNORED && do_hook(MODE_LIST, "%s %s %s", from, target, line)) + { + enum FSET_TYPES fset = smode ? FORMAT_SMODE_FSET : FORMAT_MODE_FSET; + put_it("%s", convert_output_format(fget_string_var(fset), "%s %s %s %s %s", update_clock(GET_TIME), from, display_uh, target, line)); + } + logmsg(LOG_MODE_CHAN, from, 0, "%s %s", target, line); + do_logchannel(LOG_MODE_CHAN, chan, "%s %s, %s", from, target, line); } else { - chan = (ChannelList *)find_in_list((List **)&chan2, channel, 0); - if (flag != IGNORED && do_hook(MODE_LIST, "%s %s %s", from, channel, line)) + if (flag != IGNORED && do_hook(MODE_LIST, "%s %s %s", from, target, line)) { - if (!my_stricmp(from, channel)) - { - if (!my_stricmp(from, get_server_nickname(from_server))) - put_it("%s",convert_output_format(fget_string_var(FORMAT_USERMODE_FSET), "%s %s %s %s %s",update_clock(GET_TIME), from, "*", channel, line)); - else - put_it("%s",convert_output_format(fget_string_var(FORMAT_USERMODE_FSET), "%s %s %s %s %s",update_clock(GET_TIME), from, smode?"*":FromUserHost, channel, line)); - } - else - put_it("%s",convert_output_format(fget_string_var(FORMAT_MODE_FSET), "%s %s %s %s %s",update_clock(GET_TIME), from, smode?"*":FromUserHost, channel, line)); + /* User mode changes where from != target don't occur on + * standard servers, but are used by services on some networks. */ + enum FSET_TYPES fset = my_stricmp(from, target) ? FORMAT_USERMODE_OTHER_FSET : FORMAT_USERMODE_FSET; + put_it("%s", convert_output_format(fget_string_var(fset), "%s %s %s %s %s", update_clock(GET_TIME), from, display_uh, target, line)); } - update_user_mode(line); - logmsg(LOG_MODE_USER, from, 0, "%s %s", channel, line); - do_logchannel(LOG_MODE_USER, chan, "%s %s %s", from, channel, line); + if (!my_stricmp(target, get_server_nickname(from_server))) + update_user_mode(line); + logmsg(LOG_MODE_USER, from, 0, "%s %s", target, line); } update_all_status(current_window, NULL, 0); } #ifdef GUI - gui_update_nicklist(channel); + gui_update_nicklist(target); #endif reset_display_target(); }