diff options
-rw-r--r-- | src/core/levels.c | 1 | ||||
-rw-r--r-- | src/core/levels.h | 11 | ||||
-rw-r--r-- | src/fe-common/core/hilight-text.c | 6 | ||||
-rw-r--r-- | src/fe-common/irc/dcc/fe-dcc.c | 14 | ||||
-rw-r--r-- | src/fe-common/irc/fe-events.c | 11 | ||||
-rw-r--r-- | src/fe-common/irc/fe-irc-commands.c | 22 | ||||
-rw-r--r-- | src/irc/dcc/dcc-chat.c | 8 | ||||
-rw-r--r-- | src/irc/dcc/dcc-files.c | 11 | ||||
-rw-r--r-- | src/irc/dcc/dcc.c | 3 | ||||
-rw-r--r-- | src/irc/dcc/dcc.h | 2 |
10 files changed, 54 insertions, 35 deletions
diff --git a/src/core/levels.c b/src/core/levels.c index 8618f340..e5b64887 100644 --- a/src/core/levels.c +++ b/src/core/levels.c @@ -40,6 +40,7 @@ static const char *levels[] = "INVITES", "NICKS", "DCC", + "DCCMSGS", "CLIENTNOTICES", "CLIENTCRAP", "CLIENTERRORS", diff --git a/src/core/levels.h b/src/core/levels.h index ccaf6daa..ad4bcf05 100644 --- a/src/core/levels.h +++ b/src/core/levels.h @@ -24,12 +24,13 @@ #define MSGLEVEL_INVITES 0x0004000 #define MSGLEVEL_NICKS 0x0008000 #define MSGLEVEL_DCC 0x0010000 -#define MSGLEVEL_CLIENTNOTICE 0x0020000 -#define MSGLEVEL_CLIENTCRAP 0x0040000 -#define MSGLEVEL_CLIENTERROR 0x0080000 -#define MSGLEVEL_HILIGHT 0x0100000 +#define MSGLEVEL_DCCMSGS 0x0020000 +#define MSGLEVEL_CLIENTNOTICE 0x0040000 +#define MSGLEVEL_CLIENTCRAP 0x0080000 +#define MSGLEVEL_CLIENTERROR 0x0100000 +#define MSGLEVEL_HILIGHT 0x0200000 -#define MSGLEVEL_ALL 0x01fffff +#define MSGLEVEL_ALL 0x03fffff #define MSGLEVEL_NOHILIGHT 0x1000000 /* Don't try to hilight words in this message */ #define MSGLEVEL_NO_ACT 0x2000000 /* Don't trigger channel activity */ diff --git a/src/fe-common/core/hilight-text.c b/src/fe-common/core/hilight-text.c index b3a3a356..9e4ac883 100644 --- a/src/fe-common/core/hilight-text.c +++ b/src/fe-common/core/hilight-text.c @@ -32,7 +32,8 @@ #include "hilight-text.h" #define DEFAULT_HILIGHT_LEVEL \ - (MSGLEVEL_PUBLIC | MSGLEVEL_MSGS | MSGLEVEL_NOTICES | MSGLEVEL_ACTIONS) + (MSGLEVEL_PUBLIC | MSGLEVEL_MSGS | MSGLEVEL_NOTICES | \ + MSGLEVEL_ACTIONS | MSGLEVEL_DCCMSGS) static int hilight_next; GSList *hilights; @@ -201,8 +202,7 @@ char *hilight_match(const char *channel, const char *nickmask, int level, const if ((level & (rec->level > 0 ? rec->level : DEFAULT_HILIGHT_LEVEL)) == 0) continue; - if ((rec->nick && nickmask == NULL) || - (!rec->nick && nickmask != NULL)) + if (!rec->nick && nickmask != NULL) continue; if (rec->channels != NULL && (channel == NULL || strarray_find(rec->channels, channel) == -1)) continue; diff --git a/src/fe-common/irc/dcc/fe-dcc.c b/src/fe-common/irc/dcc/fe-dcc.c index cd6f1414..3e2b140a 100644 --- a/src/fe-common/irc/dcc/fe-dcc.c +++ b/src/fe-common/irc/dcc/fe-dcc.c @@ -118,7 +118,7 @@ static void dcc_chat_action(const char *msg, DCC_REC *dcc) g_return_if_fail(msg != NULL); sender = g_strconcat("=", dcc->nick, NULL); - printformat(NULL, sender, MSGLEVEL_DCC | MSGLEVEL_MSGS, + printformat(NULL, sender, MSGLEVEL_DCCMSGS, IRCTXT_ACTION_DCC, dcc->nick, msg); g_free(sender); } @@ -131,7 +131,7 @@ static void dcc_chat_ctcp(const char *msg, DCC_REC *dcc) g_return_if_fail(msg != NULL); sender = g_strconcat("=", dcc->nick, NULL); - printformat(NULL, sender, MSGLEVEL_DCC | MSGLEVEL_CTCPS, IRCTXT_DCC_CTCP, dcc->nick, msg); + printformat(NULL, sender, MSGLEVEL_DCC, IRCTXT_DCC_CTCP, dcc->nick, msg); g_free(sender); } @@ -143,7 +143,7 @@ static void dcc_chat_msg(DCC_REC *dcc, const char *msg) g_return_if_fail(msg != NULL); sender = g_strconcat("=", dcc->nick, NULL); - printformat(NULL, sender, MSGLEVEL_DCC | MSGLEVEL_MSGS, + printformat(NULL, sender, MSGLEVEL_DCCMSGS, query_find(NULL, sender) ? IRCTXT_DCC_MSG_QUERY : IRCTXT_DCC_MSG, dcc->nick, msg); g_free(sender); @@ -310,7 +310,7 @@ static void cmd_msg(const char *data) printformat(NULL, NULL, MSGLEVEL_CLIENTERROR, IRCTXT_DCC_CHAT_NOT_FOUND, target+1); } else { - printformat(NULL, target, MSGLEVEL_DCC | MSGLEVEL_MSGS | MSGLEVEL_NOHILIGHT, + printformat(NULL, target, MSGLEVEL_DCCMSGS | MSGLEVEL_NOHILIGHT, query_find(NULL, target) ? IRCTXT_OWN_DCC_QUERY : IRCTXT_OWN_DCC, dcc->mynick, text); } @@ -327,7 +327,7 @@ static void cmd_me(const char *data, SERVER_REC *server, WI_IRC_REC *item) dcc = item_get_dcc(item); if (dcc == NULL) return; - printformat(NULL, item->name, MSGLEVEL_DCC | MSGLEVEL_ACTIONS | MSGLEVEL_NOHILIGHT, + printformat(NULL, item->name, MSGLEVEL_DCCMSGS | MSGLEVEL_NOHILIGHT, IRCTXT_OWN_DCC_ME, dcc->mynick, data); } @@ -353,7 +353,7 @@ static void cmd_action(const char *data, SERVER_REC *server, WI_IRC_REC *item) printformat(NULL, NULL, MSGLEVEL_CLIENTERROR, IRCTXT_DCC_CHAT_NOT_FOUND, target+1); } else { - printformat(NULL, target, MSGLEVEL_DCC | MSGLEVEL_ACTIONS, + printformat(NULL, target, MSGLEVEL_DCCMSGS | MSGLEVEL_NOHILIGHT, IRCTXT_OWN_DCC_ME, dcc->mynick, text); } cmd_params_free(free_arg); @@ -384,7 +384,7 @@ static void cmd_ctcp(const char *data, SERVER_REC *server) IRCTXT_DCC_CHAT_NOT_FOUND, target+1); } else { g_strup(ctcpcmd); - printformat(server, target, MSGLEVEL_DCC | MSGLEVEL_CTCPS, IRCTXT_OWN_DCC_CTCP, + printformat(server, target, MSGLEVEL_DCC, IRCTXT_OWN_DCC_CTCP, target, ctcpcmd, ctcpdata); } diff --git a/src/fe-common/irc/fe-events.c b/src/fe-common/irc/fe-events.c index 7b82f365..24a1c0c3 100644 --- a/src/fe-common/irc/fe-events.c +++ b/src/fe-common/irc/fe-events.c @@ -129,6 +129,7 @@ static void event_privmsg(const char *data, IRC_SERVER_REC *server, const char * static void ctcp_msg_check_action(gchar *data, IRC_SERVER_REC *server, gchar *nick, gchar *addr, gchar *target) { WI_ITEM_REC *item; + int level; g_return_if_fail(data != NULL); @@ -136,7 +137,9 @@ static void ctcp_msg_check_action(gchar *data, IRC_SERVER_REC *server, gchar *ni return; data += 7; - if (ignore_check(server, nick, addr, target, data, MSGLEVEL_ACTIONS)) + level = MSGLEVEL_ACTIONS | + (ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); + if (ignore_check(server, nick, addr, target, data, level)) return; if (ischannel(*target)) { @@ -145,17 +148,17 @@ static void ctcp_msg_check_action(gchar *data, IRC_SERVER_REC *server, gchar *ni if (window_item_is_active(item)) { /* message to active channel in window */ - printformat(server, target, MSGLEVEL_ACTIONS, + printformat(server, target, level, IRCTXT_ACTION_PUBLIC, nick, data); } else { /* message to not existing/active channel */ - printformat(server, target, MSGLEVEL_ACTIONS, + printformat(server, target, level, IRCTXT_ACTION_PUBLIC_CHANNEL, nick, target, data); } } else { /* private action */ item = (WI_ITEM_REC *) privmsg_get_query(server, nick, FALSE); - printformat(server, nick, MSGLEVEL_ACTIONS, + printformat(server, nick, level, item == NULL ? IRCTXT_ACTION_PRIVATE : IRCTXT_ACTION_PRIVATE_QUERY, nick, addr == NULL ? "" : addr, data); } diff --git a/src/fe-common/irc/fe-irc-commands.c b/src/fe-common/irc/fe-irc-commands.c index 19243c0d..f390c6b0 100644 --- a/src/fe-common/irc/fe-irc-commands.c +++ b/src/fe-common/irc/fe-irc-commands.c @@ -178,9 +178,11 @@ static void cmd_me(gchar *data, IRC_SERVER_REC *server, WI_IRC_REC *item) if (!irc_item_check(item)) return; - if (server == NULL || !server->connected) cmd_return_error(CMDERR_NOT_CONNECTED); + if (server == NULL || !server->connected) + cmd_return_error(CMDERR_NOT_CONNECTED); - printformat(server, item->name, MSGLEVEL_ACTIONS, + printformat(server, item->name, MSGLEVEL_ACTIONS | MSGLEVEL_NOHILIGHT | + (ischannel(*item->name) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS), IRCTXT_OWN_ME, server->nick, data); irc_send_cmdv(server, "PRIVMSG %s :\001ACTION %s\001", item->name, data); @@ -192,13 +194,17 @@ static void cmd_action(const char *data, IRC_SERVER_REC *server) void *free_arg; g_return_if_fail(data != NULL); - if (server == NULL || !server->connected) cmd_return_error(CMDERR_NOT_CONNECTED); + if (server == NULL || !server->connected) + cmd_return_error(CMDERR_NOT_CONNECTED); if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST, &target, &text)) return; - if (*target == '\0' || *text == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); + if (*target == '\0' || *text == '\0') + cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); - printformat(server, target, MSGLEVEL_ACTIONS, IRCTXT_OWN_ME, server->nick, text); + printformat(server, target, MSGLEVEL_ACTIONS | MSGLEVEL_NOHILIGHT | + (ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS), + IRCTXT_OWN_ME, server->nick, text); irc_send_cmdv(server, "PRIVMSG %s :\001ACTION %s\001", target, text); cmd_params_free(free_arg); } @@ -236,6 +242,12 @@ static void cmd_ctcp(const char *data, IRC_SERVER_REC *server) return; if (*target == '\0' || *ctcpcmd == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); + if (*target == '=') { + /* don't handle DCC CTCPs */ + cmd_params_free(free_arg); + return; + } + if (*target == '@' && ischannel(target[1])) target++; /* Hybrid 6 feature, send ctcp to all ops in channel */ diff --git a/src/irc/dcc/dcc-chat.c b/src/irc/dcc/dcc-chat.c index e984d594..83330c6a 100644 --- a/src/irc/dcc/dcc-chat.c +++ b/src/irc/dcc/dcc-chat.c @@ -198,7 +198,7 @@ static void dcc_chat_listen(DCC_REC *dcc) /* TODO: add paranoia check - see dcc-files.c */ - g_source_remove(dcc->tagread); + g_source_remove(dcc->tagconn); close(dcc->handle); dcc->starttime = time(NULL); @@ -217,7 +217,6 @@ static void sig_chat_connected(DCC_REC *dcc) { g_return_if_fail(dcc != NULL); - g_source_remove(dcc->tagread); if (net_geterror(dcc->handle) != 0) { /* error connecting */ signal_emit("dcc error connect", 1, dcc); @@ -226,6 +225,7 @@ static void sig_chat_connected(DCC_REC *dcc) } /* connect ok. */ + g_source_remove(dcc->tagconn); dcc->starttime = time(NULL); dcc->tagread = g_input_add(dcc->handle, G_INPUT_READ, (GInputFunction) dcc_chat_input, dcc); @@ -245,7 +245,7 @@ static void dcc_chat_connect(DCC_REC *dcc) dcc->handle = net_connect_ip(&dcc->addr, dcc->port, source_host_ok ? source_host_ip : NULL); if (dcc->handle != -1) { - dcc->tagread = g_input_add(dcc->handle, G_INPUT_WRITE|G_INPUT_READ|G_INPUT_EXCEPTION, + dcc->tagconn = g_input_add(dcc->handle, G_INPUT_WRITE|G_INPUT_READ|G_INPUT_EXCEPTION, (GInputFunction) sig_chat_connected, dcc); } else { /* error connecting */ @@ -290,7 +290,7 @@ static void cmd_dcc_chat(const char *data, IRC_SERVER_REC *server) cmd_param_error(CMDERR_ERRNO); dcc = dcc_create(DCC_TYPE_CHAT, handle, nick, "chat", server, NULL); - dcc->tagread = g_input_add(dcc->handle, G_INPUT_READ, + dcc->tagconn = g_input_add(dcc->handle, G_INPUT_READ, (GInputFunction) dcc_chat_listen, dcc); /* send the request */ diff --git a/src/irc/dcc/dcc-files.c b/src/irc/dcc/dcc-files.c index 3d17af01..68df8033 100644 --- a/src/irc/dcc/dcc-files.c +++ b/src/irc/dcc/dcc-files.c @@ -61,7 +61,7 @@ void dcc_get_send_received(DCC_REC *dcc) count_buf should be re-sent.. also, if it's 1, 2 or 3, the last 1-3 bytes should be sent later. these happen probably never, but I just want to do it right.. :) */ - if (dcc->tagwrite != -1) { + if (dcc->tagwrite == -1) { dcc->tagwrite = g_input_add(dcc->handle, G_INPUT_WRITE, (GInputFunction) sig_dccget_send, dcc); } @@ -151,7 +151,6 @@ static void sig_dccget_connected(DCC_REC *dcc) g_return_if_fail(dcc != NULL); - g_source_remove(dcc->tagread); if (net_geterror(dcc->handle) != 0) { /* error connecting */ signal_emit("dcc error connect", 1, dcc); @@ -159,6 +158,8 @@ static void sig_dccget_connected(DCC_REC *dcc) return; } + g_source_remove(dcc->tagconn); + g_free_not_null(dcc->file); dcc->file = dcc_get_download_path(dcc->arg); @@ -196,7 +197,7 @@ static void dcc_get_connect(DCC_REC *dcc) dcc->handle = net_connect_ip(&dcc->addr, dcc->port, source_host_ok ? source_host_ip : NULL); if (dcc->handle != -1) { - dcc->tagread = g_input_add(dcc->handle, G_INPUT_WRITE|G_INPUT_READ|G_INPUT_EXCEPTION, + dcc->tagconn = g_input_add(dcc->handle, G_INPUT_WRITE|G_INPUT_READ|G_INPUT_EXCEPTION, (GInputFunction) sig_dccget_connected, dcc); } else { /* error connecting */ @@ -458,7 +459,7 @@ static void dcc_send_init(DCC_REC *dcc) that the host of the nick who we sent the request matches the address who connected us. */ - g_source_remove(dcc->tagread); + g_source_remove(dcc->tagconn); close(dcc->handle); dcc->starttime = time(NULL); @@ -562,7 +563,7 @@ static void cmd_dcc_send(const char *data, IRC_SERVER_REC *server, WI_IRC_REC *i dcc->port = port; dcc->size = fsize; dcc->fhandle = hfile; - dcc->tagread = g_input_add(hlisten, G_INPUT_READ, + dcc->tagconn = g_input_add(hlisten, G_INPUT_READ, (GInputFunction) dcc_send_init, dcc); /* send DCC request */ diff --git a/src/irc/dcc/dcc.c b/src/irc/dcc/dcc.c index 8986a6fb..eca81507 100644 --- a/src/irc/dcc/dcc.c +++ b/src/irc/dcc/dcc.c @@ -68,7 +68,7 @@ DCC_REC *dcc_create(int type, int handle, const char *nick, const char *arg, dcc->nick = g_strdup(nick); dcc->handle = handle; dcc->fhandle = -1; - dcc->tagread = dcc->tagwrite = -1; + dcc->tagconn = dcc->tagread = dcc->tagwrite = -1; dcc->server = server; dcc->mynick = g_strdup(server != NULL ? server->nick : chat != NULL ? chat->nick : "??"); @@ -110,6 +110,7 @@ void dcc_destroy(DCC_REC *dcc) if (dcc->fhandle != -1) close(dcc->fhandle); if (dcc->handle != -1) net_disconnect(dcc->handle); + if (dcc->tagconn != -1) g_source_remove(dcc->tagconn); if (dcc->tagread != -1) g_source_remove(dcc->tagread); if (dcc->tagwrite != -1) g_source_remove(dcc->tagwrite); diff --git a/src/irc/dcc/dcc.h b/src/irc/dcc/dcc.h index f05f294b..91694a24 100644 --- a/src/irc/dcc/dcc.h +++ b/src/irc/dcc/dcc.h @@ -41,7 +41,7 @@ typedef struct DCC_REC { long size, transfd, skipped; /* file size / bytes transferred / skipped at start */ int handle; /* socket handle */ - int tagread, tagwrite; + int tagconn, tagread, tagwrite; int fhandle; /* file handle */ time_t starttime; /* transfer start time */ int trans_bytes; |