summaryrefslogtreecommitdiff
path: root/src/fe-common/irc
diff options
context:
space:
mode:
Diffstat (limited to 'src/fe-common/irc')
-rw-r--r--src/fe-common/irc/Makefile.am1
-rw-r--r--src/fe-common/irc/completion.c7
-rw-r--r--src/fe-common/irc/fe-events.c310
-rw-r--r--src/fe-common/irc/fe-irc-commands.c7
-rw-r--r--src/fe-common/irc/fe-query.c12
-rw-r--r--src/fe-common/irc/fe-query.h7
-rw-r--r--src/fe-common/irc/irc-window-activity.c6
-rw-r--r--src/fe-common/irc/module-formats.c2
8 files changed, 158 insertions, 194 deletions
diff --git a/src/fe-common/irc/Makefile.am b/src/fe-common/irc/Makefile.am
index 64841cf8..ce3b1f5d 100644
--- a/src/fe-common/irc/Makefile.am
+++ b/src/fe-common/irc/Makefile.am
@@ -32,6 +32,7 @@ libfe_common_irc_la_SOURCES = \
noinst_HEADERS = \
completion.h \
fe-common-irc.h \
+ fe-query.h \
irc-hilight-text.h \
module.h \
module-formats.h
diff --git a/src/fe-common/irc/completion.c b/src/fe-common/irc/completion.c
index b53f40f5..969403b7 100644
--- a/src/fe-common/irc/completion.c
+++ b/src/fe-common/irc/completion.c
@@ -158,13 +158,6 @@ static void event_privmsg(gchar *data, IRC_SERVER_REC *server, gchar *nick)
params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg);
- if (*msg == 1)
- {
- /* ignore ctcp messages */
- g_free(params);
- return;
- }
-
if (ischannel(*target))
{
/* channel message */
diff --git a/src/fe-common/irc/fe-events.c b/src/fe-common/irc/fe-events.c
index bf2266ce..cc1d00d3 100644
--- a/src/fe-common/irc/fe-events.c
+++ b/src/fe-common/irc/fe-events.c
@@ -34,11 +34,15 @@
#include "ignore.h"
#include "netsplit.h"
+#include "fe-query.h"
#include "irc-hilight-text.h"
#include "windows.h"
#include "completion.h"
+#define target_level(target) \
+ (ischannel((target)[0]) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS)
+
static int beep_msg_level, beep_when_away;
static void msg_beep_check(IRC_SERVER_REC *server, int level)
@@ -49,195 +53,150 @@ static void msg_beep_check(IRC_SERVER_REC *server, int level)
}
}
-static void event_privmsg(gchar *data, IRC_SERVER_REC *server, gchar *nick, gchar *addr)
+static void print_channel_msg(IRC_SERVER_REC *server, const char *msg, const char *nick, const char *addr, const char *target)
{
- CHANNEL_REC *chanrec;
- WI_ITEM_REC *item;
- gchar *params, *target, *msg, *nickmode;
- int level;
-
- g_return_if_fail(data != NULL);
-
- params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg);
- if (nick == NULL) nick = server->real_address;
-
- level = 0;
- if (*msg == 1)
- {
- /* ctcp message, handled in fe-ctcp.c */
- }
- else if (ignore_check(server, nick, addr, target, msg,
- ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS))
- {
- /* ignored */
- }
- else if (ischannel(*target))
- {
- /* message to some channel */
- WINDOW_REC *window;
+ CHANNEL_REC *chanrec;
NICK_REC *nickrec;
- gboolean toyou;
- gchar *color;
+ int for_me;
+ char *color, *nickmode;
chanrec = channel_find(server, target);
- toyou = irc_nick_match(server->nick, msg);
+ for_me = irc_nick_match(server->nick, msg);
color = irc_hilight_find_nick(target, nick, addr);
nickrec = chanrec == NULL ? NULL : nicklist_find(chanrec, nick);
- nickmode = !settings_get_bool("show_nickmode") || nickrec == NULL ? "" :
- nickrec->op ? "@" : nickrec->voice ? "+" : " ";
-
- window = chanrec == NULL ? NULL : window_item_window((WI_ITEM_REC *) chanrec);
- if (window != NULL && window->active == (WI_ITEM_REC *) chanrec)
- {
- /* message to active channel in window */
- if (color != NULL)
- {
- /* highlighted nick */
- printformat(server, target, MSGLEVEL_PUBLIC | MSGLEVEL_NOHILIGHT,
- IRCTXT_PUBMSG_HILIGHT, color, nick, msg, nickmode);
- }
- else
- {
- printformat(server, target, MSGLEVEL_PUBLIC | (toyou ? MSGLEVEL_NOHILIGHT : 0),
- toyou ? IRCTXT_PUBMSG_ME : IRCTXT_PUBMSG, nick, msg, nickmode);
- }
- }
- else
- {
- /* message to not existing/active channel */
- if (color != NULL)
- {
- /* highlighted nick */
- printformat(server, target, MSGLEVEL_PUBLIC | MSGLEVEL_NOHILIGHT,
- IRCTXT_PUBMSG_HILIGHT_CHANNEL, color, nick, target, msg, nickmode);
- }
- else
- {
- printformat(server, target, MSGLEVEL_PUBLIC | (toyou ? MSGLEVEL_NOHILIGHT : 0),
- toyou ? IRCTXT_PUBMSG_ME_CHANNEL : IRCTXT_PUBMSG_CHANNEL,
- nick, target, msg, nickmode);
- }
+ nickmode = (!settings_get_bool("show_nickmode") || nickrec == NULL) ? "" :
+ (nickrec->op ? "@" : nickrec->voice ? "+" : " ");
+
+ if (window_item_is_active((WI_ITEM_REC *) chanrec)) {
+ /* message to active channel in window */
+ if (color != NULL) {
+ /* highlighted nick */
+ printformat(server, target, MSGLEVEL_PUBLIC | MSGLEVEL_NOHILIGHT,
+ IRCTXT_PUBMSG_HILIGHT, color, nick, msg, nickmode);
+ } else {
+ printformat(server, target, MSGLEVEL_PUBLIC | (for_me ? MSGLEVEL_NOHILIGHT : 0),
+ for_me ? IRCTXT_PUBMSG_ME : IRCTXT_PUBMSG, nick, msg, nickmode);
+ }
+ } else {
+ /* message to not existing/active channel */
+ if (color != NULL) {
+ /* highlighted nick */
+ printformat(server, target, MSGLEVEL_PUBLIC | MSGLEVEL_NOHILIGHT,
+ IRCTXT_PUBMSG_HILIGHT_CHANNEL, color, nick, target, msg, nickmode);
+ } else {
+ printformat(server, target, MSGLEVEL_PUBLIC | (for_me ? MSGLEVEL_NOHILIGHT : 0),
+ for_me ? IRCTXT_PUBMSG_ME_CHANNEL : IRCTXT_PUBMSG_CHANNEL,
+ nick, target, msg, nickmode);
+ }
}
g_free_not_null(color);
- level = MSGLEVEL_PUBLIC;
- }
- else
- {
- /* private message */
- if (settings_get_bool("autocreate_query") && query_find(server, nick) == NULL)
- item = (WI_ITEM_REC *) query_create(server, nick, TRUE);
- else
- item = (WI_ITEM_REC *) query_find(server, nick);
+}
- printformat(server, nick, MSGLEVEL_MSGS,
- item == NULL ? IRCTXT_MSG_PRIVATE : IRCTXT_MSG_PRIVATE_QUERY, nick, addr == NULL ? "" : addr, msg);
- level = MSGLEVEL_MSGS;
- }
+static void event_privmsg(const char *data, IRC_SERVER_REC *server, const char *nick, const char *addr)
+{
+ WI_ITEM_REC *item;
+ char *params, *target, *msg;
- msg_beep_check(server, level);
+ g_return_if_fail(data != NULL);
- g_free(params);
+ params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg);
+ if (nick == NULL) nick = server->real_address;
+ if (addr == NULL) addr = "";
+
+ if (!ignore_check(server, nick, addr, target, msg, target_level(target))) {
+ if (ischannel(*target)) {
+ /* message to channel */
+ print_channel_msg(server, nick, addr, target, msg);
+ } else {
+ /* private message */
+ item = (WI_ITEM_REC *) privmsg_get_query(server, nick);
+ printformat(server, nick, MSGLEVEL_MSGS,
+ item == NULL ? IRCTXT_MSG_PRIVATE : IRCTXT_MSG_PRIVATE_QUERY, nick, addr, msg);
+ }
+ msg_beep_check(server, target_level(target));
+ }
+
+ g_free(params);
}
/* we use "ctcp msg" here because "ctcp msg action" can be ignored with
- /IGNORE * CTCPS */
-static void ctcp_action_msg(gchar *data, IRC_SERVER_REC *server, gchar *nick, gchar *addr, gchar *target)
+ /IGNORE * CTCPS, and we don't want that.. */
+static void ctcp_msg_check_action(gchar *data, IRC_SERVER_REC *server, gchar *nick, gchar *addr, gchar *target)
{
- WINDOW_REC *window;
- CHANNEL_REC *channel;
- WI_ITEM_REC *item;
- int level;
-
- g_return_if_fail(data != NULL);
-
- if (g_strncasecmp(data, "ACTION ", 7) != 0)
- return;
- data += 7;
-
- level = 0;
- if (ignore_check(server, nick, addr, target, data, MSGLEVEL_ACTIONS))
- {
- /* ignored */
- }
- else if (ischannel(*target))
- {
- /* channel action */
- channel = channel_find(server, target);
-
- window = channel == NULL ? NULL : window_item_window((WI_ITEM_REC *) channel);
- if (window != NULL && window->active == (WI_ITEM_REC *) channel)
- {
- /* message to active channel in window */
- printformat(server, target, MSGLEVEL_ACTIONS,
- IRCTXT_ACTION_PUBLIC, nick, data);
- }
- else
- {
- /* message to not existing/active channel */
- printformat(server, target, MSGLEVEL_ACTIONS,
- IRCTXT_ACTION_PUBLIC_CHANNEL, nick, target, data);
- }
- level = MSGLEVEL_PUBLIC;
- }
- else
- {
- /* private action */
- if (settings_get_bool("autocreate_query") && query_find(server, nick) == NULL)
- item = (WI_ITEM_REC *) query_create(server, nick, TRUE);
- else
- item = (WI_ITEM_REC *) channel_find(server, nick);
+ WI_ITEM_REC *item;
+
+ g_return_if_fail(data != NULL);
- printformat(server, nick, MSGLEVEL_ACTIONS,
- item == NULL ? IRCTXT_ACTION_PRIVATE : IRCTXT_ACTION_PRIVATE_QUERY, nick, addr == NULL ? "" : addr, data);
- level = MSGLEVEL_MSGS;
- }
+ if (g_strncasecmp(data, "ACTION ", 7) != 0)
+ return;
+ data += 7;
+
+ if (ignore_check(server, nick, addr, target, data, MSGLEVEL_ACTIONS))
+ return;
- msg_beep_check(server, level);
+ if (ischannel(*target)) {
+ /* channel action */
+ item = (WI_ITEM_REC *) channel_find(server, target);
+
+ if (window_item_is_active(item)) {
+ /* message to active channel in window */
+ printformat(server, target, MSGLEVEL_ACTIONS,
+ IRCTXT_ACTION_PUBLIC, nick, data);
+ } else {
+ /* message to not existing/active channel */
+ printformat(server, target, MSGLEVEL_ACTIONS,
+ IRCTXT_ACTION_PUBLIC_CHANNEL, nick, target, data);
+ }
+ } else {
+ /* private action */
+ item = (WI_ITEM_REC *) privmsg_get_query(server, nick);
+ printformat(server, nick, MSGLEVEL_ACTIONS,
+ item == NULL ? IRCTXT_ACTION_PRIVATE : IRCTXT_ACTION_PRIVATE_QUERY,
+ nick, addr == NULL ? "" : addr, data);
+ }
+
+ msg_beep_check(server, target_level(target));
}
-static void event_notice(gchar *data, IRC_SERVER_REC *server, gchar *nick, gchar *addr)
+static void event_notice(const char *data, IRC_SERVER_REC *server, const char *nick, const char *addr)
{
- char *params, *target, *msg;
- int level;
-
- g_return_if_fail(data != NULL);
-
- params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg);
- if (nick == NULL) nick = server->real_address;
-
- level = 0;
- if (*msg == 1)
- {
- /* ctcp reply */
- }
- else if (addr == NULL)
- {
- /* notice from server */
- if (nick == NULL || !ignore_check(server, nick, "", target, msg, MSGLEVEL_SNOTES))
- printformat(server, target, MSGLEVEL_SNOTES, IRCTXT_NOTICE_SERVER, nick == NULL ? "" : nick, msg);
- }
- else if (ischannel(*target) || (*target == '@' && ischannel(target[1])))
- {
- /* notice in some channel */
- if (!ignore_check(server, nick, addr, target, msg, MSGLEVEL_NOTICES))
- printformat(server, target, MSGLEVEL_NOTICES,
- *target == '@' ? IRCTXT_NOTICE_PUBLIC_OPS : IRCTXT_NOTICE_PUBLIC,
- nick, *target == '@' ? target+1 : target, msg);
- level = MSGLEVEL_NOTICES;
- }
- else
- {
- /* private notice */
- if (!ignore_check(server, nick, addr, NULL, msg, MSGLEVEL_NOTICES))
- printformat(server, nick, MSGLEVEL_NOTICES, IRCTXT_NOTICE_PRIVATE, nick, addr, msg);
- level = MSGLEVEL_NOTICES;
- }
-
- msg_beep_check(server, level);
-
- g_free(params);
+ char *params, *target, *msg;
+ int op_notice;
+
+ g_return_if_fail(data != NULL);
+
+ params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg);
+ if (nick == NULL) {
+ nick = server->real_address == NULL ?
+ server->connrec->address :
+ server->real_address;
+ }
+
+ if (addr == NULL) {
+ /* notice from server */
+ if (*msg != 1 && !ignore_check(server, nick, "", target, msg, MSGLEVEL_SNOTES))
+ printformat(server, target, MSGLEVEL_SNOTES, IRCTXT_NOTICE_SERVER, nick, msg);
+ } else {
+ op_notice = *target == '@' && ischannel(target[1]);
+ if (op_notice) target++;
+
+ if (ischannel(*target)) {
+ /* notice in some channel */
+ if (!ignore_check(server, nick, addr, target, msg, MSGLEVEL_NOTICES))
+ printformat(server, target, MSGLEVEL_NOTICES,
+ op_notice ? IRCTXT_NOTICE_PUBLIC_OPS : IRCTXT_NOTICE_PUBLIC,
+ nick, target, msg);
+ } else {
+ /* private notice */
+ if (!ignore_check(server, nick, addr, NULL, msg, MSGLEVEL_NOTICES))
+ printformat(server, nick, MSGLEVEL_NOTICES, IRCTXT_NOTICE_PRIVATE, nick, addr, msg);
+ }
+ }
+
+ msg_beep_check(server, addr == NULL ? MSGLEVEL_SNOTES : MSGLEVEL_NOTICES);
+ g_free(params);
}
static void event_join(const char *data, IRC_SERVER_REC *server, const char *nick, const char *addr)
@@ -468,12 +427,13 @@ static void event_wallops(const char *data, IRC_SERVER_REC *server, const char *
else {
/* Action in WALLOP */
int len;
+ char *tmp;
- data = g_strdup(data);
- len = strlen(data);
- if (data[len-1] == 1) data[len-1] = '\0';
- printformat(server, NULL, MSGLEVEL_WALLOPS, IRCTXT_ACTION_WALLOPS, nick, data);
- g_free(data);
+ tmp = g_strdup(data);
+ len = strlen(tmp);
+ if (tmp[len-1] == 1) tmp[len-1] = '\0';
+ printformat(server, NULL, MSGLEVEL_WALLOPS, IRCTXT_ACTION_WALLOPS, nick, tmp);
+ g_free(tmp);
}
msg_beep_check(server, MSGLEVEL_WALLOPS);
}
@@ -488,7 +448,7 @@ static void channel_sync(CHANNEL_REC *channel)
static void event_connected(IRC_SERVER_REC *server)
{
- char *nick;
+ const char *nick;
g_return_if_fail(server != NULL);
@@ -632,7 +592,7 @@ void fe_events_init(void)
read_settings();
signal_add("event privmsg", (SIGNAL_FUNC) event_privmsg);
- signal_add("ctcp msg", (SIGNAL_FUNC) ctcp_action_msg);
+ signal_add("ctcp msg", (SIGNAL_FUNC) ctcp_msg_check_action);
signal_add("ctcp msg action", (SIGNAL_FUNC) sig_empty);
signal_add("event notice", (SIGNAL_FUNC) event_notice);
signal_add("event join", (SIGNAL_FUNC) event_join);
@@ -665,7 +625,7 @@ void fe_events_init(void)
void fe_events_deinit(void)
{
signal_remove("event privmsg", (SIGNAL_FUNC) event_privmsg);
- signal_remove("ctcp msg", (SIGNAL_FUNC) ctcp_action_msg);
+ signal_remove("ctcp msg", (SIGNAL_FUNC) ctcp_msg_check_action);
signal_remove("ctcp msg action", (SIGNAL_FUNC) sig_empty);
signal_remove("event notice", (SIGNAL_FUNC) event_notice);
signal_remove("event join", (SIGNAL_FUNC) event_join);
diff --git a/src/fe-common/irc/fe-irc-commands.c b/src/fe-common/irc/fe-irc-commands.c
index 429186f5..669daf19 100644
--- a/src/fe-common/irc/fe-irc-commands.c
+++ b/src/fe-common/irc/fe-irc-commands.c
@@ -33,6 +33,7 @@
#include "channels.h"
#include "query.h"
+#include "fe-query.h"
#include "windows.h"
#include "window-items.h"
@@ -153,11 +154,7 @@ static void cmd_msg(gchar *data, IRC_SERVER_REC *server, WI_ITEM_REC *item)
else
{
/* private message */
- if (settings_get_bool("autocreate_query") && query_find(server, target) == NULL)
- item = (WI_ITEM_REC *) query_create(server, target, FALSE);
- else
- item = (WI_ITEM_REC *) query_find(server, target);
-
+ item = (WI_ITEM_REC *) privmsg_get_query(server, target);
printformat(server, target, MSGLEVEL_MSGS | MSGLEVEL_NOHILIGHT,
item == NULL ? IRCTXT_OWN_MSG_PRIVATE : IRCTXT_OWN_MSG_PRIVATE_QUERY, target, msg, server->nick);
}
diff --git a/src/fe-common/irc/fe-query.c b/src/fe-common/irc/fe-query.c
index 69b6a683..189a0a35 100644
--- a/src/fe-common/irc/fe-query.c
+++ b/src/fe-common/irc/fe-query.c
@@ -34,6 +34,18 @@
static int queryclose_tag, query_auto_close;
+/* Return query where to put the private message. */
+QUERY_REC *privmsg_get_query(IRC_SERVER_REC *server, const char *nick)
+{
+ QUERY_REC *query;
+
+ query = query_find(server, nick);
+ if (query == NULL && settings_get_bool("autocreate_query"))
+ query = query_create(server, nick, TRUE);
+
+ return query;
+}
+
static void signal_query_created(QUERY_REC *query, gpointer automatic)
{
window_item_create((WI_ITEM_REC *) query, GPOINTER_TO_INT(automatic));
diff --git a/src/fe-common/irc/fe-query.h b/src/fe-common/irc/fe-query.h
new file mode 100644
index 00000000..da13bba7
--- /dev/null
+++ b/src/fe-common/irc/fe-query.h
@@ -0,0 +1,7 @@
+#ifndef __FE_QUERY_H
+#define __FE_QUERY_H
+
+/* Return query where to put the private message. */
+QUERY_REC *privmsg_get_query(IRC_SERVER_REC *server, const char *nick);
+
+#endif
diff --git a/src/fe-common/irc/irc-window-activity.c b/src/fe-common/irc/irc-window-activity.c
index 13417f02..765939ff 100644
--- a/src/fe-common/irc/irc-window-activity.c
+++ b/src/fe-common/irc/irc-window-activity.c
@@ -42,12 +42,6 @@ static void event_privmsg(const char *data, IRC_SERVER_REC *server, const char *
params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg);
- if (*msg == 1) {
- /* don't hilight CTCPs */
- g_free(params);
- return;
- }
-
/* get window and window item */
level = ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS;
item = window_item_find(server, ischannel(*target) ? target : nick);
diff --git a/src/fe-common/irc/module-formats.c b/src/fe-common/irc/module-formats.c
index 28e12633..088e02e1 100644
--- a/src/fe-common/irc/module-formats.c
+++ b/src/fe-common/irc/module-formats.c
@@ -171,7 +171,7 @@ FORMAT_REC fecommon_irc_formats[] = {
{ NULL, "CTCPs", 0 },
{ "ctcp_reply", "CTCP %_$0%_ reply from %_$1%_%K:%n $2", 3, { 0, 0, 0 } },
- { "ctcp_reply_channel", "CTCP %_$0%_ reply from %_$1%_ in channel %_$4%_%K:%n $2", 4, { 0, 0, 0, 0 } },
+ { "ctcp_reply_channel", "CTCP %_$0%_ reply from %_$1%_ in channel %_$3%_%K:%n $2", 4, { 0, 0, 0, 0 } },
{ "ctcp_ping_reply", "CTCP %_PING%_ reply from %_$0%_: $1.$2 seconds", 3, { 0, 2, 2 } },
{ "ctcp_requested", "%g>>> %_$0%_ %K[%g$1%K] %grequested %_$2%_ from %_$3", 4, { 0, 0, 0, 0 } },