From 789ed916cda8823f2765278f52ff723f73ddbe52 Mon Sep 17 00:00:00 2001 From: Kevin Easton Date: Sat, 26 Jun 2010 08:18:34 +0000 Subject: [PATCH] Backport changes from epic5 to make recv_nick, sent_nick and sent_body per-server, and apply new version of do_oops from flewid (the BX2 version). This means that /oops, "/query .", "/query ,", "/msg ." and "/msg ," are now per-server, along with the $. $, and $B aliases. git-svn-id: svn://svn.code.sf.net/p/bitchx/code/trunk@87 13b04d17-f746-0410-82c6-800466cd88b0 --- Changelog | 7 +++++- include/module.h | 4 ++-- include/modval.h | 2 -- include/server.h | 13 +++++++++++ source/commands.c | 35 +++++++++++----------------- source/functions.c | 6 ++--- source/modules.c | 5 ++-- source/parse.c | 3 +-- source/server.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++ source/window.c | 4 ++-- 10 files changed, 100 insertions(+), 37 deletions(-) diff --git a/Changelog b/Changelog index 74e4bd9..d59f7bf 100644 --- a/Changelog +++ b/Changelog @@ -1,6 +1,11 @@ [Changes 1.2c01] -* Handle error return from getcwd() in /cd (caf). +* Backport changes from epic5 to make recv_nick, sent_nick and sent_body + per-server, and apply new version of do_oops from flewid. This means + that /oops, "/query .", "/query ,", "/msg ." and "/msg ," are per-server, + along with the $. $, and $B aliases. (caf) + +* Handle error return from getcwd() in /cd. (caf) * Fix alloca warnings on freebsd. (caf) diff --git a/include/module.h b/include/module.h index 85b5467..fcb1028 100644 --- a/include/module.h +++ b/include/module.h @@ -616,8 +616,8 @@ enum FUNCTION_VALUE SCREEN_LIST, IRCLOG_FP, DOING_NOTICE, - LAST_SENT_MSG_BODY, - SENT_NICK, + LAST_SENT_MSG_BODY, /* NO LONGER USED */ + SENT_NICK, /* NO LONGER USED */ DLL_FUNCTIONS, DLL_NUMERIC, diff --git a/include/modval.h b/include/modval.h index cfcf5b9..93affe5 100644 --- a/include/modval.h +++ b/include/modval.h @@ -678,8 +678,6 @@ extern Function_ptr *global; #define autoreply_array (*((NickTab *)global[AUTOREPLY_ARRAY])) #define identd (*((int *)global[IDENTD_SOCKET])) #define doing_notice ((int) *((int *)global[DOING_NOTICE])) -#define last_sent_msg_body (*((char **)global[LAST_SENT_MSG_BODY])) -#define sent_nick (*((char **)global[SENT_NICK])) #define default_output_function (*(void (**)(char *))global[DEFAULT_OUTPUT_FUNCTION]) diff --git a/include/server.h b/include/server.h index 08110f0..a1012fd 100644 --- a/include/server.h +++ b/include/server.h @@ -165,6 +165,12 @@ typedef struct int ssl_error; SSL* ssl_fd; #endif + +/* recv_nick: the nickname of the last person to send you a privmsg */ + char *recv_nick; +/* sent_nick: the nickname of the last person to whom you sent a privmsg */ + char *sent_nick; + char *sent_body; } Server; typedef struct ser_group_list @@ -251,6 +257,13 @@ extern SGroup *server_group_list; time_t get_server_awaytime (int); void set_server_awaytime (int, time_t); + void set_server_recv_nick(int server, const char *nick); + char *get_server_recv_nick(int server); + void set_server_sent_nick(int server, const char *nick); + char *get_server_sent_nick(int server); + void set_server_sent_body(int server, const char *msg_body); + char *get_server_sent_body(int server); + void server_redirect (int, char *); int BX_check_server_redirect (char *); char * BX_get_server_network (int); diff --git a/source/commands.c b/source/commands.c index 3ea620c..905916b 100644 --- a/source/commands.c +++ b/source/commands.c @@ -119,7 +119,6 @@ extern int doing_notice; static void oper_password_received (char *, char *); int no_hook_notify = 0; -char *last_sent_msg_body = NULL; int load_depth = -1; extern char cx_function[]; @@ -139,13 +138,6 @@ extern char cx_function[]; /* The maximum number of recursive LOAD levels allowed */ #define MAX_LOAD_DEPTH 10 -/* recv_nick: the nickname of the last person to send you a privmsg */ - char *recv_nick = NULL; - -/* sent_nick: the nickname of the last person to whom you sent a privmsg */ - char *sent_nick = NULL; - char *sent_body = NULL; - int interactive = 0; @@ -1085,18 +1077,18 @@ BUILT_IN_COMMAND(blesscmd) BUILT_IN_COMMAND(do_oops) { - char *newmsg; + const char *to = next_arg(args, &args); + const char *sent_nick = get_server_sent_nick(from_server); + const char *sent_body = get_server_sent_body(from_server); - - if (args && *args && last_sent_msg_body) + if (sent_nick && sent_body && to && *to) { - newmsg = next_arg(args, &args); send_to_server("PRIVMSG %s :Oops, that /msg wasn't for you", sent_nick); - send_to_server("PRIVMSG %s :%s", newmsg, last_sent_msg_body); - if (window_display && do_hook(SEND_MSG_LIST, "%s %s", newmsg, last_sent_msg_body)) - put_it("%s", convert_output_format(fget_string_var(FORMAT_SEND_MSG_FSET),"%s %s %s %s", update_clock(GET_TIME), newmsg, get_server_nickname(from_server), last_sent_msg_body)); + send_to_server("PRIVMSG %s :%s", to, sent_body); + if (window_display && do_hook(SEND_MSG_LIST, "%s %s", to, sent_body)) + put_it("%s", convert_output_format(fget_string_var(FORMAT_SEND_MSG_FSET), "%s %s %s %s", update_clock(GET_TIME), + to, get_server_nickname(from_server), sent_body)); } - return; } /* @@ -1640,7 +1632,7 @@ BUILT_IN_COMMAND(my_whois) { char *nick = NULL; if (!strcmp(command, "WILM")) - nick = recv_nick; + nick = get_server_recv_nick(from_server); else if (!strcmp(command, "WILN")) nick = last_notice[0].to; else if (!strcmp(command, "WILC")) @@ -3312,7 +3304,7 @@ BUILT_IN_COMMAND(e_privmsg) { if (!strcmp(nick, ".")) { - if (!(nick = sent_nick)) + if (!(nick = get_server_sent_nick(from_server))) { bitchsay("You have not sent a message to anyone yet"); return; @@ -3320,7 +3312,7 @@ BUILT_IN_COMMAND(e_privmsg) } else if (!strcmp(nick, ",")) { - if (!(nick = recv_nick)) + if (!(nick = get_server_recv_nick(from_server))) { bitchsay("You have not received a message from anyone yet"); return; @@ -4004,8 +3996,6 @@ struct target_type target[4] = logmsg(LOG_SEND_MSG, target[i].nick_list, 0, "%s", copy); /* save this for /oops */ - malloc_strcpy(&last_sent_msg_body, copy); - if (i == 1 || i == 3) { char *channel; @@ -4040,7 +4030,8 @@ struct target_type target[4] = if ((i == 0)) { - malloc_strcpy(&sent_nick, target[0].nick_list); + set_server_sent_nick(from_server, target[0].nick_list); + set_server_sent_body(from_server, copy); add_last_type(&last_sent_msg[0], MAX_LAST_MSG, NULL, NULL, target[i].nick_list, copy); } else if ((i == 2) || (i == 3)) diff --git a/source/functions.c b/source/functions.c index d21da5c..8dc6ef3 100644 --- a/source/functions.c +++ b/source/functions.c @@ -1084,9 +1084,9 @@ static char *alias_dollar (void) { return m_strdup("$"); } static char *alias_detected (void) { return m_strdup(last_notify_nick); } static char *alias_nick (void) { return m_strdup((current_window->server != -1? get_server_nickname(current_window->server) : empty_string)); } char *alias_away (void) { return m_strdup(get_server_away(from_server)); } -static char *alias_sent_nick (void) { return m_strdup((sent_nick) ? sent_nick : empty_string); } -static char *alias_recv_nick (void) { return m_strdup((recv_nick) ? recv_nick : empty_string); } -static char *alias_msg_body (void) { return m_strdup((sent_body) ? sent_body : empty_string); } +static char *alias_sent_nick (void) { return m_strdup(get_server_sent_nick(from_server)); } +static char *alias_recv_nick (void) { return m_strdup(get_server_recv_nick(from_server)); } +static char *alias_msg_body (void) { return m_strdup(get_server_sent_body(from_server)); } static char *alias_joined_nick (void) { return m_strdup((joined_nick) ? joined_nick : empty_string); } static char *alias_public_nick (void) { return m_strdup((public_nick) ? public_nick : empty_string); } static char *alias_show_realname (void) { return m_strdup(realname); } diff --git a/source/modules.c b/source/modules.c index a6633f5..4bdb5ec 100644 --- a/source/modules.c +++ b/source/modules.c @@ -77,7 +77,6 @@ Packages *install_pack = NULL; extern int BX_read_sockets(); extern int identd; extern int doing_notice; -extern char *sent_nick, *last_sent_msg_body; extern int (*dcc_open_func) (int, int, unsigned long, int); extern int (*dcc_output_func) (int, int, char *, int); @@ -661,8 +660,8 @@ static int already_done = 0; global_table[OUTPUT_SCREEN] = (Function_ptr) &output_screen; global_table[SCREEN_LIST] = (Function_ptr) &screen_list; global_table[DOING_NOTICE] = (Function_ptr) &doing_notice; - global_table[SENT_NICK] = (Function_ptr) &sent_nick; - global_table[LAST_SENT_MSG_BODY] = (Function_ptr) &last_sent_msg_body; + global_table[SENT_NICK] = 0; /* No longer used */ + global_table[LAST_SENT_MSG_BODY] = 0; /* No longer used */ global_table[IRCLOG_FP] = (Function_ptr) &irclog_fp; #ifdef WANT_DLL diff --git a/source/parse.c b/source/parse.c index de36baf..35cefde 100644 --- a/source/parse.c +++ b/source/parse.c @@ -627,7 +627,7 @@ static void p_privmsg(char *from, char **Args) { if (!no_flood) break; - malloc_strcpy(&recv_nick, from); + set_server_recv_nick(from_server, from); #ifdef WANT_CDCC if ((msgcdcc(from, to, ptr)) == NULL) break; @@ -1179,7 +1179,6 @@ static void p_invite(char *from, char **ArgList) } if (!(chan = lookup_channel(invite_channel, from_server, 0))) check_auto_join(from_server, from, invite_channel, ArgList[2]); - malloc_strcpy(&recv_nick, from); add_last_type(&last_invite_channel[0], 1, from, FromUserHost, ArgList[1], ArgList[2]?ArgList[2]:empty_string); reset_display_target(); } diff --git a/source/server.c b/source/server.c index 0b0a1c1..b5f090c 100644 --- a/source/server.c +++ b/source/server.c @@ -143,6 +143,10 @@ void BX_close_server (int cs_index, char *message) server_list[cs_index].awaytime = 0; new_free(&server_list[cs_index].away); + new_free(&server_list[cs_index].recv_nick); + new_free(&server_list[cs_index].sent_nick); + new_free(&server_list[cs_index].sent_body); + if (server_list[cs_index].write > -1) { if (message && *message && !server_list[cs_index].closing) @@ -830,6 +834,9 @@ void remove_from_server_list (int i) new_free(&server_list[i].s_nickname); new_free(&server_list[i].d_nickname); new_free(&server_list[i].umodes); + new_free(&server_list[i].recv_nick); + new_free(&server_list[i].sent_nick); + new_free(&server_list[i].sent_body); #ifdef HAVE_SSL SSL_CTX_free(server_list[i].ctx); #endif @@ -3071,6 +3078,57 @@ unsigned short port = 113; #endif } +void set_server_recv_nick(int server, const char *nick) +{ + if (server <= -1 || server >= number_of_servers) + return; + if (nick) + malloc_strcpy(&server_list[server].recv_nick, nick); + else + new_free(&server_list[server].recv_nick); +} + +char *get_server_recv_nick(int server) +{ + if (server <= -1 || server >= number_of_servers) + return NULL; + return server_list[server].recv_nick; +} + +void set_server_sent_nick(int server, const char *nick) +{ + if (server <= -1 || server >= number_of_servers) + return; + if (nick) + malloc_strcpy(&server_list[server].sent_nick, nick); + else + new_free(&server_list[server].sent_nick); +} + +char *get_server_sent_nick(int server) +{ + if (server <= -1 || server >= number_of_servers) + return NULL; + return server_list[server].sent_nick; +} + +void set_server_sent_body(int server, const char *msg_body) +{ + if (server <= -1 || server >= number_of_servers) + return; + if (msg_body) + malloc_strcpy(&server_list[server].sent_body, msg_body); + else + new_free(&server_list[server].sent_body); +} + +char *get_server_sent_body(int server) +{ + if (server <= -1 || server >= number_of_servers) + return NULL; + return server_list[server].sent_body; +} + Sping *get_server_sping(int server, char *sname) { if (server <= -1) diff --git a/source/window.c b/source/window.c index ddd8a52..31e30ce 100644 --- a/source/window.c +++ b/source/window.c @@ -3744,12 +3744,12 @@ Window *window_query (Window *window, char **args, char *usage) host = *args; if (!strcmp(nick, ".")) { - if (!(nick = sent_nick)) + if (!(nick = get_server_sent_nick(window->server))) say("You have not messaged anyone yet"); } else if (!strcmp(nick, ",")) { - if (!(nick = recv_nick)) + if (!(nick = get_server_recv_nick(window->server))) say("You have not recieved a message yet"); } else if (!strcmp(nick, "*") &&