diff --git a/src/common/ctcp.c b/src/common/ctcp.c index bf0a8e7f..15ab5a2d 100644 --- a/src/common/ctcp.c +++ b/src/common/ctcp.c @@ -93,6 +93,7 @@ ctcp_handle (session *sess, char *to, char *nick, char *ip, server *serv = sess->server; char outbuf[1024]; int ctcp_offset = 2; + gboolean fromme = FALSE; if (serv->have_idmsg && (word[4][1] == '+' || word[4][1] == '-') ) ctcp_offset = 3; @@ -129,7 +130,10 @@ ctcp_handle (session *sess, char *to, char *nick, char *ip, if (ctcp_check (sess, nick, word, word_eol, word[4] + ctcp_offset)) goto generic; - inbound_action (sess, to, nick, ip, msg + 7, FALSE, id, tags_data); + if (!serv->p_cmp (nick, serv->nick)) + fromme = TRUE; + + inbound_action (sess, to, nick, ip, msg + 7, fromme, FALSE, id, tags_data); return; } diff --git a/src/common/dcc.c b/src/common/dcc.c index 6c5b117e..ec6a94fd 100644 --- a/src/common/dcc.c +++ b/src/common/dcc.c @@ -549,10 +549,10 @@ dcc_chat_line (struct DCC *dcc, char *line) if (po) po[0] = 0; inbound_action (sess, dcc->serv->nick, dcc->nick, "", line + 8, FALSE, - FALSE, &no_tags); + TRUE, FALSE, &no_tags); } else { - inbound_privmsg (dcc->serv, dcc->nick, "", line, FALSE, &no_tags); + inbound_privmsg (dcc->serv, dcc->nick, NULL, "", line, FALSE, &no_tags); } g_free (line); return 0; diff --git a/src/common/inbound.c b/src/common/inbound.c index 9566e4b6..8b4d7b49 100644 --- a/src/common/inbound.c +++ b/src/common/inbound.c @@ -163,17 +163,24 @@ inbound_make_idtext (server *serv, char *idtext, int max, int id) } void -inbound_privmsg (server *serv, char *from, char *ip, char *text, int id, +inbound_privmsg (server *serv, char *from, char *to, char *ip, char *text, int id, const message_tags_data *tags_data) { session *sess; struct User *user; char idtext[64]; - gboolean nodiag = FALSE; + char *destsess = from; + gboolean nodiag = FALSE, fromme = FALSE; + + if (to && !serv->p_cmp (from, serv->nick)) + { + fromme = TRUE; + destsess = to; + } sess = find_dialog (serv, from); - if (sess || prefs.hex_gui_autoopen_dialog) + if (!fromme && (sess || prefs.hex_gui_autoopen_dialog)) { /*0=ctcp 1=priv will set hex_gui_autoopen_dialog=0 here is flud detected */ if (!sess) @@ -196,8 +203,15 @@ inbound_privmsg (server *serv, char *from, char *ip, char *text, int id, sess = find_dialog (serv, destsess); if (!sess) { - sess = serv->front_session; - nodiag = TRUE; /* We don't want it to look like a normal message in front sess */ + if (fromme && prefs.hex_gui_autoopen_dialog) + { + sess = inbound_open_dialog (serv, destsess, tags_data); + } + else + { + sess = serv->front_session; + nodiag = TRUE; /* We don't want it to look like a normal message in front sess */ + } } user = userlist_find (sess, from); @@ -210,7 +224,16 @@ inbound_privmsg (server *serv, char *from, char *ip, char *text, int id, inbound_make_idtext (serv, idtext, sizeof (idtext), id); - if (sess->type == SESS_DIALOG && !nodiag) + if (fromme) + { + if (sess->type == SESS_DIALOG) + EMIT_SIGNAL_TIMESTAMP (XP_TE_UCHANMSG, sess, from, text, NULL, idtext, 0, + tags_data->timestamp); + else + EMIT_SIGNAL_TIMESTAMP (XP_TE_MSGSEND, sess, to, text, NULL, NULL, 0, + tags_data->timestamp); + } + else if (sess->type == SESS_DIALOG && !nodiag) EMIT_SIGNAL_TIMESTAMP (XP_TE_DPRIVMSG, sess, from, text, idtext, NULL, 0, tags_data->timestamp); else @@ -329,15 +352,19 @@ is_hilight (char *from, char *text, session *sess, server *serv) void inbound_action (session *sess, char *chan, char *from, char *ip, char *text, - int fromme, int id, const message_tags_data *tags_data) + int fromme, gboolean fake, int id, const message_tags_data *tags_data) { server *serv = sess->server; struct User *user; char nickchar[2] = "\000"; char idtext[64]; int privaction = FALSE; + char *destsess = from; - if (!fromme) + if (fromme) + destsess = chan; + + if (!fake) /* Fake events start in the correct sess. */ { if (is_channel (serv, chan)) { @@ -352,13 +379,13 @@ inbound_action (session *sess, char *chan, char *from, char *ip, char *text, /* it's a private action! */ privaction = TRUE; /* find a dialog tab for it */ - sess = find_dialog (serv, from); + sess = find_dialog (serv, destsess); /* if non found, open a new one */ if (!sess && prefs.hex_gui_autoopen_dialog) { /* but only if it wouldn't flood */ - if (flood_check (from, ip, serv, current_sess, 1)) - sess = inbound_open_dialog (serv, from, tags_data); + if (flood_check (destsess, ip, serv, current_sess, 1)) + sess = inbound_open_dialog (serv, destsess, tags_data); else sess = serv->server_session; } @@ -383,7 +410,7 @@ inbound_action (session *sess, char *chan, char *from, char *ip, char *text, lastact_update (sess); } - user = userlist_find (sess, from); + user = userlist_find (sess, destsess); if (user) { nickchar[0] = user->prefix[0]; @@ -407,8 +434,19 @@ inbound_action (session *sess, char *chan, char *from, char *ip, char *text, } if (fromme) - EMIT_SIGNAL_TIMESTAMP (XP_TE_UACTION, sess, from, text, nickchar, idtext, + { + if (fake || sess->type == SESS_DIALOG || + !serv->p_cmp (sess->channel, destsess)) /* Show normally if in correct sess */ + EMIT_SIGNAL_TIMESTAMP (XP_TE_UACTION, sess, from, text, nickchar, idtext, 0, tags_data->timestamp); + else /* There is no Action Send event, so we will just show it as CTCP.. */ + { + char *new_text = g_strconcat ("ACTION ", text, NULL); + EMIT_SIGNAL_TIMESTAMP (XP_TE_CTCPSEND, sess, destsess, new_text, NULL, NULL, + 0, tags_data->timestamp); + g_free (new_text); + } + } else if (!privaction) EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANACTION, sess, from, text, nickchar, idtext, 0, tags_data->timestamp); @@ -1732,6 +1770,7 @@ static const char * const supported_caps[] = { /* ZNC */ "znc.in/server-time-iso", "znc.in/server-time", + "znc.in/self-message", /* Twitch */ "twitch.tv/membership", diff --git a/src/common/inbound.h b/src/common/inbound.h index 83e78d5d..d4606d57 100644 --- a/src/common/inbound.h +++ b/src/common/inbound.h @@ -80,10 +80,10 @@ void inbound_chanmsg (server *serv, session *sess, char *chan, char *from, const message_tags_data *tags_data); void clear_channel (session *sess); void set_topic (session *sess, char *topic, char *stripped_topic); -void inbound_privmsg (server *serv, char *from, char *ip, char *text, int id, +void inbound_privmsg (server *serv, char *from, char *to, char *ip, char *text, int id, const message_tags_data *tags_data); void inbound_action (session *sess, char *chan, char *from, char *ip, - char *text, int fromme, int id, + char *text, int fromme, gboolean fake, int id, const message_tags_data *tags_data); void inbound_newnick (server *serv, char *nick, char *newnick, int quiet, const message_tags_data *tags_data); diff --git a/src/common/outbound.c b/src/common/outbound.c index 5ca8b783..0a42ef7a 100644 --- a/src/common/outbound.c +++ b/src/common/outbound.c @@ -2642,7 +2642,7 @@ cmd_me (struct session *sess, char *tbuf, char *word[], char *word_eol[]) if (dcc_write_chat (sess->channel, tbuf)) { /* print it to screen */ - inbound_action (sess, sess->channel, sess->server->nick, "", act, TRUE, FALSE, + inbound_action (sess, sess->channel, sess->server->nick, "", act, TRUE, TRUE, FALSE, &no_tags); } else { @@ -2654,7 +2654,7 @@ cmd_me (struct session *sess, char *tbuf, char *word[], char *word_eol[]) sess->server->p_action (sess->server, sess->channel, split_text); /* print it to screen */ inbound_action (sess, sess->channel, sess->server->nick, "", - split_text, TRUE, FALSE, + split_text, TRUE, TRUE, FALSE, &no_tags); if (*split_text) @@ -2666,7 +2666,7 @@ cmd_me (struct session *sess, char *tbuf, char *word[], char *word_eol[]) sess->server->p_action (sess->server, sess->channel, act + offset); /* print it to screen */ inbound_action (sess, sess->channel, sess->server->nick, "", - act + offset, TRUE, FALSE, &no_tags); + act + offset, TRUE, TRUE, FALSE, &no_tags); } else { notc_msg (sess); diff --git a/src/common/proto-irc.c b/src/common/proto-irc.c index a565dbb6..86f7532c 100644 --- a/src/common/proto-irc.c +++ b/src/common/proto-irc.c @@ -1256,7 +1256,7 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[], { if (ignore_check (word[1], IG_PRIV)) return; - inbound_privmsg (serv, nick, ip, text, id, tags_data); + inbound_privmsg (serv, nick, to, ip, text, id, tags_data); } } }