Merge pull request #656 from orium/server-time

Closes #499
This commit is contained in:
TingPing 2013-06-28 11:59:33 -04:00
commit ad926e9b07
21 changed files with 923 additions and 458 deletions

View file

@ -507,6 +507,7 @@ const struct prefs vars[] =
{"irc_auto_rejoin", P_OFFINT (hex_irc_auto_rejoin), TYPE_BOOL}, {"irc_auto_rejoin", P_OFFINT (hex_irc_auto_rejoin), TYPE_BOOL},
{"irc_ban_type", P_OFFINT (hex_irc_ban_type), TYPE_INT}, {"irc_ban_type", P_OFFINT (hex_irc_ban_type), TYPE_INT},
{"irc_cap_server_time", P_OFFINT (hex_irc_cap_server_time), TYPE_BOOL},
{"irc_conf_mode", P_OFFINT (hex_irc_conf_mode), TYPE_BOOL}, {"irc_conf_mode", P_OFFINT (hex_irc_conf_mode), TYPE_BOOL},
{"irc_extra_hilight", P_OFFSET (hex_irc_extra_hilight), TYPE_STR}, {"irc_extra_hilight", P_OFFSET (hex_irc_extra_hilight), TYPE_STR},
{"irc_hide_version", P_OFFINT (hex_irc_hide_version), TYPE_BOOL}, {"irc_hide_version", P_OFFINT (hex_irc_hide_version), TYPE_BOOL},
@ -748,6 +749,7 @@ load_default_config(void)
prefs.hex_text_thin_sep = 1; prefs.hex_text_thin_sep = 1;
prefs.hex_text_wordwrap = 1; prefs.hex_text_wordwrap = 1;
prefs.hex_url_grabber = 1; prefs.hex_url_grabber = 1;
prefs.hex_irc_cap_server_time = 0;
/* NUMBERS */ /* NUMBERS */
prefs.hex_away_size_max = 300; prefs.hex_away_size_max = 300;

View file

@ -85,7 +85,8 @@ ctcp_check (session *sess, char *nick, char *word[], char *word_eol[],
void void
ctcp_handle (session *sess, char *to, char *nick, char *ip, ctcp_handle (session *sess, char *to, char *nick, char *ip,
char *msg, char *word[], char *word_eol[], int id) char *msg, char *word[], char *word_eol[], int id,
const message_tags_data *tags_data)
{ {
char *po; char *po;
session *chansess; session *chansess;
@ -103,7 +104,7 @@ ctcp_handle (session *sess, char *to, char *nick, char *ip,
if (!ctcp_check (sess, nick, word, word_eol, word[4] + ctcp_offset)) if (!ctcp_check (sess, nick, word, word_eol, word[4] + ctcp_offset))
{ {
if (!ignore_check (word[1], IG_DCC)) if (!ignore_check (word[1], IG_DCC))
handle_dcc (sess, nick, word, word_eol); handle_dcc (sess, nick, word, word_eol, tags_data);
} }
return; return;
} }
@ -128,7 +129,7 @@ ctcp_handle (session *sess, char *to, char *nick, char *ip,
if (ctcp_check (sess, nick, word, word_eol, word[4] + ctcp_offset)) if (ctcp_check (sess, nick, word, word_eol, word[4] + ctcp_offset))
goto generic; goto generic;
inbound_action (sess, to, nick, ip, msg + 7, FALSE, id); inbound_action (sess, to, nick, ip, msg + 7, FALSE, id, tags_data);
return; return;
} }
@ -161,12 +162,13 @@ ctcp_handle (session *sess, char *to, char *nick, char *ip,
if (!chansess) if (!chansess)
chansess = sess; chansess = sess;
EMIT_SIGNAL (XP_TE_CTCPSNDC, chansess, word[5], EMIT_SIGNAL_TIMESTAMP (XP_TE_CTCPSNDC, chansess, word[5],
nick, to, NULL, 0); nick, to, NULL, 0, tags_data->timestamp);
} else } else
{ {
EMIT_SIGNAL (XP_TE_CTCPSND, sess->server->front_session, word[5], EMIT_SIGNAL_TIMESTAMP (XP_TE_CTCPSND, sess->server->front_session,
nick, NULL, NULL, 0); word[5], nick, NULL, NULL, 0,
tags_data->timestamp);
} }
/* don't let IRCers specify path */ /* don't let IRCers specify path */
@ -187,13 +189,14 @@ generic:
if (!is_channel (sess->server, to)) if (!is_channel (sess->server, to))
{ {
EMIT_SIGNAL (XP_TE_CTCPGEN, sess->server->front_session, msg, nick, EMIT_SIGNAL_TIMESTAMP (XP_TE_CTCPGEN, sess->server->front_session, msg,
NULL, NULL, 0); nick, NULL, NULL, 0, tags_data->timestamp);
} else } else
{ {
chansess = find_channel (sess->server, to); chansess = find_channel (sess->server, to);
if (!chansess) if (!chansess)
chansess = sess; chansess = sess;
EMIT_SIGNAL (XP_TE_CTCPGENC, chansess, msg, nick, to, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CTCPGENC, chansess, msg, nick, to, NULL, 0,
tags_data->timestamp);
} }
} }

View file

@ -20,6 +20,8 @@
#ifndef HEXCHAT_CTCP_H #ifndef HEXCHAT_CTCP_H
#define HEXCHAT_CTCP_H #define HEXCHAT_CTCP_H
void ctcp_handle (session *sess, char *to, char *nick, char *ip, char *msg, char *word[], char *word_eol[], int id); void ctcp_handle (session *sess, char *to, char *nick, char *ip, char *msg,
char *word[], char *word_eol[], int id,
const message_tags_data *tags_data);
#endif #endif

View file

@ -509,6 +509,7 @@ dcc_chat_line (struct DCC *dcc, char *line)
int len; int len;
gsize utf_len; gsize utf_len;
char portbuf[32]; char portbuf[32];
message_tags_data no_tags = MESSAGE_TAGS_DATA_INIT;
len = strlen (line); len = strlen (line);
if (dcc->serv->using_cp1255) if (dcc->serv->using_cp1255)
@ -576,10 +577,11 @@ dcc_chat_line (struct DCC *dcc, char *line)
po = strchr (line + 8, '\001'); po = strchr (line + 8, '\001');
if (po) if (po)
po[0] = 0; po[0] = 0;
inbound_action (sess, dcc->serv->nick, dcc->nick, "", line + 8, FALSE, FALSE); inbound_action (sess, dcc->serv->nick, dcc->nick, "", line + 8, FALSE,
FALSE, &no_tags);
} else } else
{ {
inbound_privmsg (dcc->serv, dcc->nick, "", line, FALSE); inbound_privmsg (dcc->serv, dcc->nick, "", line, FALSE, &no_tags);
} }
if (utf) if (utf)
g_free (utf); g_free (utf);
@ -2375,8 +2377,8 @@ dcc_add_file (session *sess, char *file, DCC_SIZE size, int port, char *nick, gu
} }
void void
handle_dcc (struct session *sess, char *nick, char *word[], handle_dcc (struct session *sess, char *nick, char *word[], char *word_eol[],
char *word_eol[]) const message_tags_data *tags_data)
{ {
char tbuf[512]; char tbuf[512];
struct DCC *dcc; struct DCC *dcc;
@ -2472,8 +2474,9 @@ handle_dcc (struct session *sess, char *nick, char *word[],
dcc->serv->p_ctcp (dcc->serv, dcc->nick, tbuf); dcc->serv->p_ctcp (dcc->serv, dcc->nick, tbuf);
} }
sprintf (tbuf, "%"DCC_SFMT, dcc->pos); sprintf (tbuf, "%"DCC_SFMT, dcc->pos);
EMIT_SIGNAL (XP_TE_DCCRESUMEREQUEST, sess, nick, EMIT_SIGNAL_TIMESTAMP (XP_TE_DCCRESUMEREQUEST, sess, nick,
file_part (dcc->file), tbuf, NULL, 0); file_part (dcc->file), tbuf, NULL, 0,
tags_data->timestamp);
} }
return; return;
} }
@ -2543,8 +2546,9 @@ handle_dcc (struct session *sess, char *nick, char *word[],
} else } else
{ {
EMIT_SIGNAL (XP_TE_DCCGENERICOFFER, sess->server->front_session, EMIT_SIGNAL_TIMESTAMP (XP_TE_DCCGENERICOFFER, sess->server->front_session,
word_eol[4] + 2, nick, NULL, NULL, 0); word_eol[4] + 2, nick, NULL, NULL, 0,
tags_data->timestamp);
} }
} }

View file

@ -20,6 +20,7 @@
/* dcc.h */ /* dcc.h */
#include <time.h> /* for time_t */ #include <time.h> /* for time_t */
#include "proto-irc.h"
#ifndef HEXCHAT_DCC_H #ifndef HEXCHAT_DCC_H
#define HEXCHAT_DCC_H #define HEXCHAT_DCC_H
@ -127,7 +128,8 @@ void dcc_send (struct session *sess, char *to, char *file, int maxcps, int passi
struct DCC *find_dcc (char *nick, char *file, int type); struct DCC *find_dcc (char *nick, char *file, int type);
void dcc_get_nick (struct session *sess, char *nick); void dcc_get_nick (struct session *sess, char *nick);
void dcc_chat (session *sess, char *nick, int passive); void dcc_chat (session *sess, char *nick, int passive);
void handle_dcc (session *sess, char *nick, char *word[], char *word_eol[]); void handle_dcc (session *sess, char *nick, char *word[], char *word_eol[],
const message_tags_data *tags_data);
void dcc_show_list (session *sess); void dcc_show_list (session *sess);
guint32 dcc_get_my_address (void); guint32 dcc_get_my_address (void);
void dcc_get_with_destfile (struct DCC *dcc, char *utf8file); void dcc_get_with_destfile (struct DCC *dcc, char *utf8file);

View file

@ -215,6 +215,7 @@ struct hexchatprefs
unsigned int hex_irc_wallops; unsigned int hex_irc_wallops;
unsigned int hex_irc_who_join; unsigned int hex_irc_who_join;
unsigned int hex_irc_whois_front; unsigned int hex_irc_whois_front;
unsigned int hex_irc_cap_server_time;
unsigned int hex_net_auto_reconnect; unsigned int hex_net_auto_reconnect;
unsigned int hex_net_auto_reconnectonfail; unsigned int hex_net_auto_reconnectonfail;
unsigned int hex_net_proxy_auth; unsigned int hex_net_proxy_auth;
@ -593,6 +594,7 @@ typedef struct server
unsigned int have_idmsg:1; /* freenode's IDENTIFY-MSG */ unsigned int have_idmsg:1; /* freenode's IDENTIFY-MSG */
unsigned int have_accnotify:1; /* cap account-notify */ unsigned int have_accnotify:1; /* cap account-notify */
unsigned int have_extjoin:1; /* cap extended-join */ unsigned int have_extjoin:1; /* cap extended-join */
unsigned int have_server_time:1; /* cap server-time */
unsigned int have_sasl:1; /* SASL capability */ unsigned int have_sasl:1; /* SASL capability */
unsigned int have_except:1; /* ban exemptions +e */ unsigned int have_except:1; /* ban exemptions +e */
unsigned int have_invite:1; /* invite exemptions +I */ unsigned int have_invite:1; /* invite exemptions +I */

View file

@ -122,13 +122,15 @@ find_session_from_nick (char *nick, server *serv)
} }
static session * static session *
inbound_open_dialog (server *serv, char *from) inbound_open_dialog (server *serv, char *from,
const message_tags_data *tags_data)
{ {
session *sess; session *sess;
sess = new_ircwindow (serv, from, SESS_DIALOG, 0); sess = new_ircwindow (serv, from, SESS_DIALOG, 0);
/* for playing sounds */ /* for playing sounds */
EMIT_SIGNAL (XP_TE_OPENDIALOG, sess, NULL, NULL, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_OPENDIALOG, sess, NULL, NULL, NULL, NULL, 0,
tags_data->timestamp);
return sess; return sess;
} }
@ -152,7 +154,8 @@ inbound_make_idtext (server *serv, char *idtext, int max, int id)
} }
void void
inbound_privmsg (server *serv, char *from, char *ip, char *text, int id) inbound_privmsg (server *serv, char *from, char *ip, char *text, int id,
const message_tags_data *tags_data)
{ {
session *sess; session *sess;
struct User *user; struct User *user;
@ -168,7 +171,7 @@ inbound_privmsg (server *serv, char *from, char *ip, char *text, int id)
{ {
if (flood_check (from, ip, serv, current_sess, 1)) if (flood_check (from, ip, serv, current_sess, 1))
/* Create a dialog session */ /* Create a dialog session */
sess = inbound_open_dialog (serv, from); sess = inbound_open_dialog (serv, from, tags_data);
else else
sess = serv->server_session; sess = serv->server_session;
if (!sess) if (!sess)
@ -186,7 +189,7 @@ inbound_privmsg (server *serv, char *from, char *ip, char *text, int id)
} }
set_topic (sess, ip, ip); set_topic (sess, ip, ip);
} }
inbound_chanmsg (serv, NULL, NULL, from, text, FALSE, id); inbound_chanmsg (serv, NULL, NULL, from, text, FALSE, id, tags_data);
return; return;
} }
@ -208,9 +211,11 @@ inbound_privmsg (server *serv, char *from, char *ip, char *text, int id)
inbound_make_idtext (serv, idtext, sizeof (idtext), id); inbound_make_idtext (serv, idtext, sizeof (idtext), id);
if (sess->type == SESS_DIALOG && !nodiag) if (sess->type == SESS_DIALOG && !nodiag)
EMIT_SIGNAL (XP_TE_DPRIVMSG, sess, from, text, idtext, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_DPRIVMSG, sess, from, text, idtext, NULL, 0,
tags_data->timestamp);
else else
EMIT_SIGNAL (XP_TE_PRIVMSG, sess, from, text, idtext, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_PRIVMSG, sess, from, text, idtext, NULL, 0,
tags_data->timestamp);
} }
/* used for Alerts section. Masks can be separated by commas and spaces. */ /* used for Alerts section. Masks can be separated by commas and spaces. */
@ -323,7 +328,8 @@ is_hilight (char *from, char *text, session *sess, server *serv)
} }
void void
inbound_action (session *sess, char *chan, char *from, char *ip, char *text, int fromme, int id) inbound_action (session *sess, char *chan, char *from, char *ip, char *text,
int fromme, int id, const message_tags_data *tags_data)
{ {
session *def = sess; session *def = sess;
server *serv = sess->server; server *serv = sess->server;
@ -348,7 +354,7 @@ inbound_action (session *sess, char *chan, char *from, char *ip, char *text, int
{ {
/* but only if it wouldn't flood */ /* but only if it wouldn't flood */
if (flood_check (from, ip, serv, current_sess, 1)) if (flood_check (from, ip, serv, current_sess, 1))
sess = inbound_open_dialog (serv, from); sess = inbound_open_dialog (serv, from, tags_data);
else else
sess = serv->server_session; sess = serv->server_session;
} }
@ -394,23 +400,30 @@ inbound_action (session *sess, char *chan, char *from, char *ip, char *text, int
{ {
if (is_hilight (from, text, sess, serv)) if (is_hilight (from, text, sess, serv))
{ {
EMIT_SIGNAL (XP_TE_HCHANACTION, sess, from, text, nickchar, idtext, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_HCHANACTION, sess, from, text, nickchar,
idtext, 0, tags_data->timestamp);
return; return;
} }
} }
if (fromme) if (fromme)
EMIT_SIGNAL (XP_TE_UACTION, sess, from, text, nickchar, idtext, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_UACTION, sess, from, text, nickchar, idtext,
0, tags_data->timestamp);
else if (!privaction) else if (!privaction)
EMIT_SIGNAL (XP_TE_CHANACTION, sess, from, text, nickchar, idtext, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANACTION, sess, from, text, nickchar,
idtext, 0, tags_data->timestamp);
else if (sess->type == SESS_DIALOG) else if (sess->type == SESS_DIALOG)
EMIT_SIGNAL (XP_TE_DPRIVACTION, sess, from, text, idtext, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_DPRIVACTION, sess, from, text, idtext, NULL,
0, tags_data->timestamp);
else else
EMIT_SIGNAL (XP_TE_PRIVACTION, sess, from, text, idtext, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_PRIVACTION, sess, from, text, idtext, NULL, 0,
tags_data->timestamp);
} }
void void
inbound_chanmsg (server *serv, session *sess, char *chan, char *from, char *text, char fromme, int id) inbound_chanmsg (server *serv, session *sess, char *chan, char *from,
char *text, char fromme, int id,
const message_tags_data *tags_data)
{ {
struct User *user; struct User *user;
int hilight = FALSE; int hilight = FALSE;
@ -452,7 +465,8 @@ inbound_chanmsg (server *serv, session *sess, char *chan, char *from, char *text
{ {
if (prefs.hex_away_auto_unmark && serv->is_away) if (prefs.hex_away_auto_unmark && serv->is_away)
sess->server->p_set_back (sess->server); sess->server->p_set_back (sess->server);
EMIT_SIGNAL (XP_TE_UCHANMSG, sess, from, text, nickchar, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_UCHANMSG, sess, from, text, nickchar, NULL,
0, tags_data->timestamp);
return; return;
} }
@ -462,15 +476,19 @@ inbound_chanmsg (server *serv, session *sess, char *chan, char *from, char *text
hilight = TRUE; hilight = TRUE;
if (sess->type == SESS_DIALOG) if (sess->type == SESS_DIALOG)
EMIT_SIGNAL (XP_TE_DPRIVMSG, sess, from, text, idtext, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_DPRIVMSG, sess, from, text, idtext, NULL, 0,
tags_data->timestamp);
else if (hilight) else if (hilight)
EMIT_SIGNAL (XP_TE_HCHANMSG, sess, from, text, nickchar, idtext, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_HCHANMSG, sess, from, text, nickchar, idtext,
0, tags_data->timestamp);
else else
EMIT_SIGNAL (XP_TE_CHANMSG, sess, from, text, nickchar, idtext, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANMSG, sess, from, text, nickchar, idtext,
0, tags_data->timestamp);
} }
void void
inbound_newnick (server *serv, char *nick, char *newnick, int quiet) inbound_newnick (server *serv, char *nick, char *newnick, int quiet,
const message_tags_data *tags_data)
{ {
int me = FALSE; int me = FALSE;
session *sess; session *sess;
@ -492,11 +510,12 @@ inbound_newnick (server *serv, char *nick, char *newnick, int quiet)
if (!quiet) if (!quiet)
{ {
if (me) if (me)
EMIT_SIGNAL (XP_TE_UCHANGENICK, sess, nick, newnick, NULL, EMIT_SIGNAL_TIMESTAMP (XP_TE_UCHANGENICK, sess, nick,
NULL, 0); newnick, NULL, NULL, 0,
tags_data->timestamp);
else else
EMIT_SIGNAL (XP_TE_CHANGENICK, sess, nick, newnick, NULL, EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANGENICK, sess, nick,
NULL, 0); newnick, NULL, NULL, 0, tags_data->timestamp);
} }
} }
if (sess->type == SESS_DIALOG && !serv->p_cmp (sess->channel, nick)) if (sess->type == SESS_DIALOG && !serv->p_cmp (sess->channel, nick))
@ -554,7 +573,8 @@ find_session_from_waitchannel (char *chan, struct server *serv)
} }
void void
inbound_ujoin (server *serv, char *chan, char *nick, char *ip) inbound_ujoin (server *serv, char *chan, char *nick, char *ip,
const message_tags_data *tags_data)
{ {
session *sess; session *sess;
@ -592,7 +612,8 @@ inbound_ujoin (server *serv, char *chan, char *nick, char *ip)
/* sends a MODE */ /* sends a MODE */
serv->p_join_info (sess->server, chan); serv->p_join_info (sess->server, chan);
EMIT_SIGNAL (XP_TE_UJOIN, sess, nick, chan, ip, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_UJOIN, sess, nick, chan, ip, NULL, 0,
tags_data->timestamp);
if (prefs.hex_irc_who_join) if (prefs.hex_irc_who_join)
{ {
@ -603,12 +624,14 @@ inbound_ujoin (server *serv, char *chan, char *nick, char *ip)
} }
void void
inbound_ukick (server *serv, char *chan, char *kicker, char *reason) inbound_ukick (server *serv, char *chan, char *kicker, char *reason,
const message_tags_data *tags_data)
{ {
session *sess = find_channel (serv, chan); session *sess = find_channel (serv, chan);
if (sess) if (sess)
{ {
EMIT_SIGNAL (XP_TE_UKICK, sess, serv->nick, chan, kicker, reason, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_UKICK, sess, serv->nick, chan, kicker,
reason, 0, tags_data->timestamp);
clear_channel (sess); clear_channel (sess);
if (prefs.hex_irc_auto_rejoin) if (prefs.hex_irc_auto_rejoin)
{ {
@ -619,22 +642,25 @@ inbound_ukick (server *serv, char *chan, char *kicker, char *reason)
} }
void void
inbound_upart (server *serv, char *chan, char *ip, char *reason) inbound_upart (server *serv, char *chan, char *ip, char *reason,
const message_tags_data *tags_data)
{ {
session *sess = find_channel (serv, chan); session *sess = find_channel (serv, chan);
if (sess) if (sess)
{ {
if (*reason) if (*reason)
EMIT_SIGNAL (XP_TE_UPARTREASON, sess, serv->nick, ip, chan, reason, EMIT_SIGNAL_TIMESTAMP (XP_TE_UPARTREASON, sess, serv->nick, ip, chan,
0); reason, 0, tags_data->timestamp);
else else
EMIT_SIGNAL (XP_TE_UPART, sess, serv->nick, ip, chan, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_UPART, sess, serv->nick, ip, chan, NULL,
0, tags_data->timestamp);
clear_channel (sess); clear_channel (sess);
} }
} }
void void
inbound_nameslist (server *serv, char *chan, char *names) inbound_nameslist (server *serv, char *chan, char *names,
const message_tags_data *tags_data)
{ {
session *sess; session *sess;
char name[NICKLEN]; char name[NICKLEN];
@ -643,12 +669,13 @@ inbound_nameslist (server *serv, char *chan, char *names)
sess = find_channel (serv, chan); sess = find_channel (serv, chan);
if (!sess) if (!sess)
{ {
EMIT_SIGNAL (XP_TE_USERSONCHAN, serv->server_session, chan, names, NULL, EMIT_SIGNAL_TIMESTAMP (XP_TE_USERSONCHAN, serv->server_session, chan,
NULL, 0); names, NULL, NULL, 0, tags_data->timestamp);
return; return;
} }
if (!sess->ignore_names) if (!sess->ignore_names)
EMIT_SIGNAL (XP_TE_USERSONCHAN, sess, chan, names, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_USERSONCHAN, sess, chan, names, NULL, NULL,
0, tags_data->timestamp);
if (sess->end_of_names) if (sess->end_of_names)
{ {
@ -663,12 +690,12 @@ inbound_nameslist (server *serv, char *chan, char *names)
case 0: case 0:
name[pos] = 0; name[pos] = 0;
if (pos != 0) if (pos != 0)
userlist_add (sess, name, 0, NULL, NULL); userlist_add (sess, name, 0, NULL, NULL, tags_data);
return; return;
case ' ': case ' ':
name[pos] = 0; name[pos] = 0;
pos = 0; pos = 0;
userlist_add (sess, name, 0, NULL, NULL); userlist_add (sess, name, 0, NULL, NULL, tags_data);
break; break;
default: default:
name[pos] = *names; name[pos] = *names;
@ -680,7 +707,8 @@ inbound_nameslist (server *serv, char *chan, char *names)
} }
void void
inbound_topic (server *serv, char *chan, char *topic_text) inbound_topic (server *serv, char *chan, char *topic_text,
const message_tags_data *tags_data)
{ {
session *sess = find_channel (serv, chan); session *sess = find_channel (serv, chan);
char *stripped_topic; char *stripped_topic;
@ -693,11 +721,13 @@ inbound_topic (server *serv, char *chan, char *topic_text)
} else } else
sess = serv->server_session; sess = serv->server_session;
EMIT_SIGNAL (XP_TE_TOPIC, sess, chan, topic_text, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_TOPIC, sess, chan, topic_text, NULL, NULL, 0,
tags_data->timestamp);
} }
void void
inbound_topicnew (server *serv, char *nick, char *chan, char *topic) inbound_topicnew (server *serv, char *nick, char *chan, char *topic,
const message_tags_data *tags_data)
{ {
session *sess; session *sess;
char *stripped_topic; char *stripped_topic;
@ -705,7 +735,8 @@ inbound_topicnew (server *serv, char *nick, char *chan, char *topic)
sess = find_channel (serv, chan); sess = find_channel (serv, chan);
if (sess) if (sess)
{ {
EMIT_SIGNAL (XP_TE_NEWTOPIC, sess, nick, topic, chan, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_NEWTOPIC, sess, nick, topic, chan, NULL, 0,
tags_data->timestamp);
stripped_topic = strip_color (topic, -1, STRIP_ALL); stripped_topic = strip_color (topic, -1, STRIP_ALL);
set_topic (sess, topic, stripped_topic); set_topic (sess, topic, stripped_topic);
g_free (stripped_topic); g_free (stripped_topic);
@ -713,43 +744,51 @@ inbound_topicnew (server *serv, char *nick, char *chan, char *topic)
} }
void void
inbound_join (server *serv, char *chan, char *user, char *ip, char *account, char *realname) inbound_join (server *serv, char *chan, char *user, char *ip, char *account,
char *realname, const message_tags_data *tags_data)
{ {
session *sess = find_channel (serv, chan); session *sess = find_channel (serv, chan);
if (sess) if (sess)
{ {
EMIT_SIGNAL (XP_TE_JOIN, sess, user, chan, ip, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_JOIN, sess, user, chan, ip, NULL, 0,
userlist_add (sess, user, ip, account, realname); tags_data->timestamp);
userlist_add (sess, user, ip, account, realname, tags_data);
} }
} }
void void
inbound_kick (server *serv, char *chan, char *user, char *kicker, char *reason) inbound_kick (server *serv, char *chan, char *user, char *kicker, char *reason,
const message_tags_data *tags_data)
{ {
session *sess = find_channel (serv, chan); session *sess = find_channel (serv, chan);
if (sess) if (sess)
{ {
EMIT_SIGNAL (XP_TE_KICK, sess, kicker, user, chan, reason, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_KICK, sess, kicker, user, chan, reason, 0,
tags_data->timestamp);
userlist_remove (sess, user); userlist_remove (sess, user);
} }
} }
void void
inbound_part (server *serv, char *chan, char *user, char *ip, char *reason) inbound_part (server *serv, char *chan, char *user, char *ip, char *reason,
const message_tags_data *tags_data)
{ {
session *sess = find_channel (serv, chan); session *sess = find_channel (serv, chan);
if (sess) if (sess)
{ {
if (*reason) if (*reason)
EMIT_SIGNAL (XP_TE_PARTREASON, sess, user, ip, chan, reason, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_PARTREASON, sess, user, ip, chan, reason,
0, tags_data->timestamp);
else else
EMIT_SIGNAL (XP_TE_PART, sess, user, ip, chan, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_PART, sess, user, ip, chan, NULL, 0,
tags_data->timestamp);
userlist_remove (sess, user); userlist_remove (sess, user);
} }
} }
void void
inbound_topictime (server *serv, char *chan, char *nick, time_t stamp) inbound_topictime (server *serv, char *chan, char *nick, time_t stamp,
const message_tags_data *tags_data)
{ {
char *tim = ctime (&stamp); char *tim = ctime (&stamp);
session *sess = find_channel (serv, chan); session *sess = find_channel (serv, chan);
@ -758,11 +797,13 @@ inbound_topictime (server *serv, char *chan, char *nick, time_t stamp)
sess = serv->server_session; sess = serv->server_session;
tim[24] = 0; /* get rid of the \n */ tim[24] = 0; /* get rid of the \n */
EMIT_SIGNAL (XP_TE_TOPICDATE, sess, chan, nick, tim, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_TOPICDATE, sess, chan, nick, tim, NULL, 0,
tags_data->timestamp);
} }
void void
inbound_quit (server *serv, char *nick, char *ip, char *reason) inbound_quit (server *serv, char *nick, char *ip, char *reason,
const message_tags_data *tags_data)
{ {
GSList *list = sess_list; GSList *list = sess_list;
session *sess; session *sess;
@ -778,21 +819,24 @@ inbound_quit (server *serv, char *nick, char *ip, char *reason)
was_on_front_session = TRUE; was_on_front_session = TRUE;
if ((user = userlist_find (sess, nick))) if ((user = userlist_find (sess, nick)))
{ {
EMIT_SIGNAL (XP_TE_QUIT, sess, nick, reason, ip, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_QUIT, sess, nick, reason, ip, NULL, 0,
tags_data->timestamp);
userlist_remove_user (sess, user); userlist_remove_user (sess, user);
} else if (sess->type == SESS_DIALOG && !serv->p_cmp (sess->channel, nick)) } else if (sess->type == SESS_DIALOG && !serv->p_cmp (sess->channel, nick))
{ {
EMIT_SIGNAL (XP_TE_QUIT, sess, nick, reason, ip, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_QUIT, sess, nick, reason, ip, NULL, 0,
tags_data->timestamp);
} }
} }
list = list->next; list = list->next;
} }
notify_set_offline (serv, nick, was_on_front_session); notify_set_offline (serv, nick, was_on_front_session, tags_data);
} }
void void
inbound_account (server *serv, char *nick, char *account) inbound_account (server *serv, char *nick, char *account,
const message_tags_data *tags_data)
{ {
session *sess = NULL; session *sess = NULL;
GSList *list; GSList *list;
@ -808,7 +852,8 @@ inbound_account (server *serv, char *nick, char *account)
} }
void void
inbound_ping_reply (session *sess, char *timestring, char *from) inbound_ping_reply (session *sess, char *timestring, char *from,
const message_tags_data *tags_data)
{ {
unsigned long tim, nowtim, dif; unsigned long tim, nowtim, dif;
int lag = 0; int lag = 0;
@ -839,11 +884,13 @@ inbound_ping_reply (session *sess, char *timestring, char *from)
if (sess->server->lag_sent) if (sess->server->lag_sent)
sess->server->lag_sent = 0; sess->server->lag_sent = 0;
else else
EMIT_SIGNAL (XP_TE_PINGREP, sess, from, "?", NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_PINGREP, sess, from, "?", NULL, NULL, 0,
tags_data->timestamp);
} else } else
{ {
snprintf (outbuf, sizeof (outbuf), "%ld.%ld%ld", dif / 1000000, (dif / 100000) % 10, dif % 10); snprintf (outbuf, sizeof (outbuf), "%ld.%ld%ld", dif / 1000000, (dif / 100000) % 10, dif % 10);
EMIT_SIGNAL (XP_TE_PINGREP, sess, from, outbuf, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_PINGREP, sess, from, outbuf, NULL, NULL, 0,
tags_data->timestamp);
} }
} }
@ -863,7 +910,8 @@ find_session_from_type (int type, server *serv)
} }
void void
inbound_notice (server *serv, char *to, char *nick, char *msg, char *ip, int id) inbound_notice (server *serv, char *to, char *nick, char *msg, char *ip, int id,
const message_tags_data *tags_data)
{ {
char *po,*ptr=to; char *po,*ptr=to;
session *sess = 0; session *sess = 0;
@ -954,7 +1002,7 @@ inbound_notice (server *serv, char *to, char *nick, char *msg, char *ip, int id)
msg++; msg++;
if (!strncmp (msg, "PING", 4)) if (!strncmp (msg, "PING", 4))
{ {
inbound_ping_reply (sess, msg + 5, nick); inbound_ping_reply (sess, msg + 5, nick, tags_data);
return; return;
} }
} }
@ -963,15 +1011,19 @@ inbound_notice (server *serv, char *to, char *nick, char *msg, char *ip, int id)
po[0] = 0; po[0] = 0;
if (server_notice) if (server_notice)
EMIT_SIGNAL (XP_TE_SERVNOTICE, sess, msg, nick, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_SERVNOTICE, sess, msg, nick, NULL, NULL, 0,
tags_data->timestamp);
else if (ptr) else if (ptr)
EMIT_SIGNAL (XP_TE_CHANNOTICE, sess, nick, to, msg, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANNOTICE, sess, nick, to, msg, NULL, 0,
tags_data->timestamp);
else else
EMIT_SIGNAL (XP_TE_NOTICE, sess, nick, msg, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_NOTICE, sess, nick, msg, NULL, NULL, 0,
tags_data->timestamp);
} }
void void
inbound_away (server *serv, char *nick, char *msg) inbound_away (server *serv, char *nick, char *msg,
const message_tags_data *tags_data)
{ {
struct away_msg *away = server_away_find_message (serv, nick); struct away_msg *away = server_away_find_message (serv, nick);
session *sess = NULL; session *sess = NULL;
@ -998,7 +1050,8 @@ inbound_away (server *serv, char *nick, char *msg)
/* possibly hide the output */ /* possibly hide the output */
if (!serv->inside_whois || !serv->skip_next_whois) if (!serv->inside_whois || !serv->skip_next_whois)
EMIT_SIGNAL (XP_TE_WHOIS5, sess, nick, msg, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_WHOIS5, sess, nick, msg, NULL, NULL, 0,
tags_data->timestamp);
list = sess_list; list = sess_list;
while (list) while (list)
@ -1011,7 +1064,8 @@ inbound_away (server *serv, char *nick, char *msg)
} }
void void
inbound_away_notify (server *serv, char *nick, char *reason) inbound_away_notify (server *serv, char *nick, char *reason,
const message_tags_data *tags_data)
{ {
session *sess = NULL; session *sess = NULL;
GSList *list; GSList *list;
@ -1026,9 +1080,11 @@ inbound_away_notify (server *serv, char *nick, char *reason)
if (sess == serv->front_session && notify_is_in_list (serv, nick)) if (sess == serv->front_session && notify_is_in_list (serv, nick))
{ {
if (reason) if (reason)
EMIT_SIGNAL (XP_TE_NOTIFYAWAY, sess, nick, reason, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_NOTIFYAWAY, sess, nick, reason, NULL,
NULL, 0, tags_data->timestamp);
else else
EMIT_SIGNAL (XP_TE_NOTIFYBACK, sess, nick, NULL, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_NOTIFYBACK, sess, nick, NULL, NULL,
NULL, 0, tags_data->timestamp);
} }
} }
list = list->next; list = list->next;
@ -1036,7 +1092,8 @@ inbound_away_notify (server *serv, char *nick, char *reason)
} }
int int
inbound_nameslist_end (server *serv, char *chan) inbound_nameslist_end (server *serv, char *chan,
const message_tags_data *tags_data)
{ {
session *sess; session *sess;
GSList *list; GSList *list;
@ -1145,7 +1202,8 @@ check_autojoin_channels (server *serv)
} }
void void
inbound_next_nick (session *sess, char *nick, int error) inbound_next_nick (session *sess, char *nick, int error,
const message_tags_data *tags_data)
{ {
char *newnick; char *newnick;
server *serv = sess->server; server *serv = sess->server;
@ -1166,11 +1224,13 @@ inbound_next_nick (session *sess, char *nick, int error)
serv->p_change_nick (serv, newnick); serv->p_change_nick (serv, newnick);
if (error) if (error)
{ {
EMIT_SIGNAL (XP_TE_NICKERROR, sess, nick, newnick, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_NICKERROR, sess, nick, newnick, NULL, NULL,
0, tags_data->timestamp);
} }
else else
{ {
EMIT_SIGNAL (XP_TE_NICKCLASH, sess, nick, newnick, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_NICKCLASH, sess, nick, newnick, NULL, NULL,
0, tags_data->timestamp);
} }
break; break;
@ -1178,21 +1238,25 @@ inbound_next_nick (session *sess, char *nick, int error)
serv->p_change_nick (serv, prefs.hex_irc_nick3); serv->p_change_nick (serv, prefs.hex_irc_nick3);
if (error) if (error)
{ {
EMIT_SIGNAL (XP_TE_NICKERROR, sess, nick, prefs.hex_irc_nick3, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_NICKERROR, sess, nick, prefs.hex_irc_nick3,
NULL, NULL, 0, tags_data->timestamp);
} }
else else
{ {
EMIT_SIGNAL (XP_TE_NICKCLASH, sess, nick, prefs.hex_irc_nick3, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_NICKCLASH, sess, nick, prefs.hex_irc_nick3,
NULL, NULL, 0, tags_data->timestamp);
} }
break; break;
default: default:
EMIT_SIGNAL (XP_TE_NICKFAIL, sess, NULL, NULL, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_NICKFAIL, sess, NULL, NULL, NULL, NULL, 0,
tags_data->timestamp);
} }
} }
void void
do_dns (session *sess, char *nick, char *host) do_dns (session *sess, char *nick, char *host,
const message_tags_data *tags_data)
{ {
char *po; char *po;
char tbuf[1024]; char tbuf[1024];
@ -1200,7 +1264,8 @@ do_dns (session *sess, char *nick, char *host)
po = strrchr (host, '@'); po = strrchr (host, '@');
if (po) if (po)
host = po + 1; host = po + 1;
EMIT_SIGNAL (XP_TE_RESOLVINGUSER, sess, nick, host, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_RESOLVINGUSER, sess, nick, host, NULL, NULL, 0,
tags_data->timestamp);
snprintf (tbuf, sizeof (tbuf), "exec -d %s %s", prefs.hex_dnsprogram, host); snprintf (tbuf, sizeof (tbuf), "exec -d %s %s", prefs.hex_dnsprogram, host);
handle_command (sess, tbuf, FALSE); handle_command (sess, tbuf, FALSE);
} }
@ -1227,9 +1292,10 @@ set_default_modes (server *serv)
} }
void void
inbound_login_start (session *sess, char *nick, char *servname) inbound_login_start (session *sess, char *nick, char *servname,
const message_tags_data *tags_data)
{ {
inbound_newnick (sess->server, sess->server->nick, nick, TRUE); inbound_newnick (sess->server, sess->server->nick, nick, TRUE, tags_data);
server_set_name (sess->server, servname); server_set_name (sess->server, servname);
if (sess->type == SESS_SERVER) if (sess->type == SESS_SERVER)
log_open_or_close (sess); log_open_or_close (sess);
@ -1258,7 +1324,7 @@ inbound_set_all_away_status (server *serv, char *nick, unsigned int status)
} }
void void
inbound_uaway (server *serv) inbound_uaway (server *serv, const message_tags_data *tags_data)
{ {
serv->is_away = TRUE; serv->is_away = TRUE;
serv->away_time = time (NULL); serv->away_time = time (NULL);
@ -1268,7 +1334,7 @@ inbound_uaway (server *serv)
} }
void void
inbound_uback (server *serv) inbound_uback (server *serv, const message_tags_data *tags_data)
{ {
serv->is_away = FALSE; serv->is_away = FALSE;
serv->reconnect_away = FALSE; serv->reconnect_away = FALSE;
@ -1278,7 +1344,7 @@ inbound_uback (server *serv)
} }
void void
inbound_foundip (session *sess, char *ip) inbound_foundip (session *sess, char *ip, const message_tags_data *tags_data)
{ {
struct hostent *HostAddr; struct hostent *HostAddr;
@ -1286,14 +1352,15 @@ inbound_foundip (session *sess, char *ip)
if (HostAddr) if (HostAddr)
{ {
prefs.dcc_ip = ((struct in_addr *) HostAddr->h_addr)->s_addr; prefs.dcc_ip = ((struct in_addr *) HostAddr->h_addr)->s_addr;
EMIT_SIGNAL (XP_TE_FOUNDIP, sess->server->server_session, EMIT_SIGNAL_TIMESTAMP (XP_TE_FOUNDIP, sess->server->server_session,
inet_ntoa (*((struct in_addr *) HostAddr->h_addr)), inet_ntoa (*((struct in_addr *) HostAddr->h_addr)),
NULL, NULL, NULL, 0); NULL, NULL, NULL, 0, tags_data->timestamp);
} }
} }
void void
inbound_user_info_start (session *sess, char *nick) inbound_user_info_start (session *sess, char *nick,
const message_tags_data *tags_data)
{ {
/* set away to FALSE now, 301 may turn it back on */ /* set away to FALSE now, 301 may turn it back on */
inbound_set_all_away_status (sess->server, nick, 0); inbound_set_all_away_status (sess->server, nick, 0);
@ -1305,7 +1372,8 @@ inbound_user_info_start (session *sess, char *nick)
void void
inbound_user_info (session *sess, char *chan, char *user, char *host, inbound_user_info (session *sess, char *chan, char *user, char *host,
char *servname, char *nick, char *realname, char *servname, char *nick, char *realname,
char *account, unsigned int away) char *account, unsigned int away,
const message_tags_data *tags_data)
{ {
server *serv = sess->server; server *serv = sess->server;
session *who_sess; session *who_sess;
@ -1326,7 +1394,7 @@ inbound_user_info (session *sess, char *chan, char *user, char *host,
else else
{ {
if (serv->doing_dns && nick && host) if (serv->doing_dns && nick && host)
do_dns (sess, nick, host); do_dns (sess, nick, host, tags_data);
} }
} }
else else
@ -1346,7 +1414,8 @@ inbound_user_info (session *sess, char *chan, char *user, char *host,
} }
int int
inbound_banlist (session *sess, time_t stamp, char *chan, char *mask, char *banner, int rplcode) inbound_banlist (session *sess, time_t stamp, char *chan, char *mask,
char *banner, int rplcode, const message_tags_data *tags_data)
{ {
char *time_str = ctime (&stamp); char *time_str = ctime (&stamp);
server *serv = sess->server; server *serv = sess->server;
@ -1368,7 +1437,8 @@ inbound_banlist (session *sess, time_t stamp, char *chan, char *mask, char *bann
{ {
nowindow: nowindow:
EMIT_SIGNAL (XP_TE_BANLIST, sess, chan, mask, banner, time_str, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_BANLIST, sess, chan, mask, banner, time_str,
0, tags_data->timestamp);
return TRUE; return TRUE;
} }
@ -1405,7 +1475,7 @@ inbound_nickserv_login (server *serv)
} }
void void
inbound_login_end (session *sess, char *text) inbound_login_end (session *sess, char *text, const message_tags_data *tags_data)
{ {
GSList *cmdlist; GSList *cmdlist;
commandentry *cmd; commandentry *cmd;
@ -1462,11 +1532,13 @@ inbound_login_end (session *sess, char *text)
if (prefs.hex_irc_skip_motd && !serv->motd_skipped) if (prefs.hex_irc_skip_motd && !serv->motd_skipped)
{ {
serv->motd_skipped = TRUE; serv->motd_skipped = TRUE;
EMIT_SIGNAL (XP_TE_MOTDSKIP, serv->server_session, NULL, NULL, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_MOTDSKIP, serv->server_session, NULL, NULL,
NULL, NULL, 0, tags_data->timestamp);
return; return;
} }
EMIT_SIGNAL (XP_TE_MOTD, serv->server_session, text, NULL, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_MOTD, serv->server_session, text, NULL, NULL,
NULL, 0, tags_data->timestamp);
} }
void void
@ -1480,3 +1552,165 @@ inbound_identified (server *serv) /* 'MODE +e MYSELF' on freenode */
check_autojoin_channels (serv); check_autojoin_channels (serv);
} }
} }
void
inbound_cap_ack (server *serv, char *nick, char *extensions,
const message_tags_data *tags_data)
{
char *pass; /* buffer for SASL password */
EMIT_SIGNAL_TIMESTAMP (XP_TE_CAPACK, serv->server_session, nick, extensions,
NULL, NULL, 0, tags_data->timestamp);
if (strstr (extensions, "identify-msg") != NULL)
{
serv->have_idmsg = TRUE;
}
if (strstr (extensions, "multi-prefix") != NULL)
{
serv->have_namesx = TRUE;
}
if (strstr (extensions, "away-notify") != NULL)
{
serv->have_awaynotify = TRUE;
}
if (strstr (extensions, "account-notify") != NULL)
{
serv->have_accnotify = TRUE;
}
if (strstr (extensions, "extended-join") != NULL)
{
serv->have_extjoin = TRUE;
}
if (strstr (extensions, "server-time") != NULL)
{
serv->have_server_time = TRUE;
}
if (strstr (extensions, "sasl") != NULL)
{
char *user;
serv->have_sasl = TRUE;
user = (((ircnet *)serv->network)->user)
? (((ircnet *)serv->network)->user) : prefs.hex_irc_user_name;
EMIT_SIGNAL_TIMESTAMP (XP_TE_SASLAUTH, serv->server_session, user, NULL,
NULL, NULL, 0, tags_data->timestamp);
tcp_send_len (serv, "AUTHENTICATE PLAIN\r\n", 20);
pass = encode_sasl_pass (user, serv->password);
tcp_sendf (serv, "AUTHENTICATE %s\r\n", pass);
free (pass);
}
}
void
inbound_cap_ls (server *serv, char *nick, char *extensions_str,
const message_tags_data *tags_data)
{
char buffer[256]; /* buffer for requesting capabilities and emitting the signal */
guint32 want_cap; /* format the CAP REQ string based on previous capabilities being requested or not */
guint32 want_sasl; /* CAP END shouldn't be sent when SASL is requested, it needs further responses */
char **extensions;
int i;
EMIT_SIGNAL_TIMESTAMP (XP_TE_CAPLIST, serv->server_session, nick,
extensions_str, NULL, NULL, 0, tags_data->timestamp);
want_cap = 0;
want_sasl = 0;
extensions = g_strsplit (extensions_str, " ", 0);
strcpy (buffer, "CAP REQ :");
for (i=0; extensions[i]; i++)
{
const char *extension = extensions[i];
if (!strcmp (extension, "identify-msg"))
{
strcat (buffer, "identify-msg ");
want_cap = 1;
}
if (!strcmp (extension, "multi-prefix"))
{
strcat (buffer, "multi-prefix ");
want_cap = 1;
}
if (!strcmp (extension, "away-notify"))
{
strcat (buffer, "away-notify ");
want_cap = 1;
}
if (!strcmp (extension, "account-notify"))
{
strcat (buffer, "account-notify ");
want_cap = 1;
}
if (!strcmp (extension, "extended-join"))
{
strcat (buffer, "extended-join ");
want_cap = 1;
}
/* bouncers can prefix a name space to the extension so we should use.
* znc uses "znc.in/server-time".
*/
if (!strcmp (extension, "znc.in/server-time"))
{
strcat (buffer, "znc.in/server-time ");
}
if (prefs.hex_irc_cap_server_time
&& !strcmp (extension, "server-time"))
{
strcat (buffer, "server-time ");
}
/* if the SASL password is set AND auth mode is set to SASL, request SASL auth */
if (serv->loginmethod == LOGIN_SASL
&& strcmp (extension, "sasl") != 0
&& strlen (serv->password) != 0)
{
strcat (buffer, "sasl ");
want_cap = 1;
want_sasl = 1;
}
}
g_strfreev (extensions);
if (want_cap)
{
/* buffer + 9 = emit buffer without "CAP REQ :" */
EMIT_SIGNAL_TIMESTAMP (XP_TE_CAPREQ, serv->server_session,
buffer + 9, NULL, NULL, NULL, 0,
tags_data->timestamp);
tcp_sendf (serv, "%s\r\n", buffer);
}
if (!want_sasl)
{
/* if we use SASL, CAP END is dealt via raw numerics */
tcp_send_len (serv, "CAP END\r\n", 9);
}
}
void
inbound_cap_nak (server *serv, const message_tags_data *tags_data)
{
tcp_send_len (serv, "CAP END\r\n", 9);
}
void
inbound_cap_list (server *serv, char *nick, char *extensions,
const message_tags_data *tags_data)
{
EMIT_SIGNAL_TIMESTAMP (XP_TE_CAPACK, serv->server_session, nick, extensions,
NULL, NULL, 0, tags_data->timestamp);
}

View file

@ -17,43 +17,86 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/ */
#include "proto-irc.h"
#ifndef HEXCHAT_INBOUND_H #ifndef HEXCHAT_INBOUND_H
#define HEXCHAT_INBOUND_H #define HEXCHAT_INBOUND_H
void inbound_next_nick (session *sess, char *nick, int error); void inbound_next_nick (session *sess, char *nick, int error,
void inbound_uback (server *serv); const message_tags_data *tags_data);
void inbound_uaway (server *serv); void inbound_uback (server *serv, const message_tags_data *tags_data);
void inbound_account (server *serv, char *nick, char *account); void inbound_uaway (server *serv, const message_tags_data *tags_data);
void inbound_part (server *serv, char *chan, char *user, char *ip, char *reason); void inbound_account (server *serv, char *nick, char *account,
void inbound_upart (server *serv, char *chan, char *ip, char *reason); const message_tags_data *tags_data);
void inbound_ukick (server *serv, char *chan, char *kicker, char *reason); void inbound_part (server *serv, char *chan, char *user, char *ip, char *reason,
void inbound_kick (server *serv, char *chan, char *user, char *kicker, char *reason); const message_tags_data *tags_data);
void inbound_notice (server *serv, char *to, char *nick, char *msg, char *ip, int id); void inbound_upart (server *serv, char *chan, char *ip, char *reason,
void inbound_quit (server *serv, char *nick, char *ip, char *reason); const message_tags_data *tags_data);
void inbound_topicnew (server *serv, char *nick, char *chan, char *topic); void inbound_ukick (server *serv, char *chan, char *kicker, char *reason,
void inbound_join (server *serv, char *chan, char *user, char *ip, char *account, char *realname); const message_tags_data *tags_data);
void inbound_ujoin (server *serv, char *chan, char *nick, char *ip); void inbound_kick (server *serv, char *chan, char *user, char *kicker,
void inbound_topictime (server *serv, char *chan, char *nick, time_t stamp); char *reason, const message_tags_data *tags_data);
void inbound_topic (server *serv, char *chan, char *topic_text); void inbound_notice (server *serv, char *to, char *nick, char *msg, char *ip,
void inbound_user_info_start (session *sess, char *nick); int id, const message_tags_data *tags_data);
void inbound_user_info (session *sess, char *chan, char *user, char *host, char *servname, char *nick, char *realname, char *account, unsigned int away); void inbound_quit (server *serv, char *nick, char *ip, char *reason,
void inbound_foundip (session *sess, char *ip); const message_tags_data *tags_data);
int inbound_banlist (session *sess, time_t stamp, char *chan, char *mask, char *banner, int is_exemption); void inbound_topicnew (server *serv, char *nick, char *chan, char *topic,
void inbound_ping_reply (session *sess, char *timestring, char *from); const message_tags_data *tags_data);
void inbound_nameslist (server *serv, char *chan, char *names); void inbound_join (server *serv, char *chan, char *user, char *ip,
int inbound_nameslist_end (server *serv, char *chan); char *account, char *realname,
void inbound_away (server *serv, char *nick, char *msg); const message_tags_data *tags_data);
void inbound_away_notify (server *serv, char *nick, char *reason); void inbound_ujoin (server *serv, char *chan, char *nick, char *ip,
void inbound_login_start (session *sess, char *nick, char *servname); const message_tags_data *tags_data);
void inbound_login_end (session *sess, char *text); void inbound_topictime (server *serv, char *chan, char *nick, time_t stamp,
void inbound_chanmsg (server *serv, session *sess, char *chan, char *from, char *text, char fromme, int id); const message_tags_data *tags_data);
void inbound_topic (server *serv, char *chan, char *topic_text,
const message_tags_data *tags_data);
void inbound_user_info_start (session *sess, char *nick,
const message_tags_data *tags_data);
void inbound_user_info (session *sess, char *chan, char *user, char *host,
char *servname, char *nick, char *realname, char *account,
unsigned int away, const message_tags_data *tags_data);
void inbound_foundip (session *sess, char *ip,
const message_tags_data *tags_data);
int inbound_banlist (session *sess, time_t stamp, char *chan, char *mask,
char *banner, int is_exemption,
const message_tags_data *tags_data);
void inbound_ping_reply (session *sess, char *timestring, char *from,
const message_tags_data *tags_data);
void inbound_nameslist (server *serv, char *chan, char *names,
const message_tags_data *tags_data);
int inbound_nameslist_end (server *serv, char *chan,
const message_tags_data *tags_data);
void inbound_away (server *serv, char *nick, char *msg,
const message_tags_data *tags_data);
void inbound_away_notify (server *serv, char *nick, char *reason,
const message_tags_data *tags_data);
void inbound_login_start (session *sess, char *nick, char *servname,
const message_tags_data *tags_data);
void inbound_login_end (session *sess, char *text,
const message_tags_data *tags_data);
void inbound_chanmsg (server *serv, session *sess, char *chan, char *from,
char *text, char fromme, int id,
const message_tags_data *tags_data);
void clear_channel (session *sess); void clear_channel (session *sess);
void set_topic (session *sess, char *topic, char *stripped_topic); 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 *ip, char *text, int id,
void inbound_action (session *sess, char *chan, char *from, char *ip, char *text, int fromme, int id); const message_tags_data *tags_data);
void inbound_newnick (server *serv, char *nick, char *newnick, int quiet); void inbound_action (session *sess, char *chan, char *from, char *ip,
void do_dns (session *sess, char *nick, char *host); char *text, int fromme, 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);
void inbound_identified (server *serv); void inbound_identified (server *serv);
void inbound_cap_ack (server *serv, char *nick, char *extensions,
const message_tags_data *tags_data);
void inbound_cap_ls (server *serv, char *nick, char *extensions,
const message_tags_data *tags_data);
void inbound_cap_nak (server *serv, const message_tags_data *tags_data);
void inbound_cap_list (server *serv, char *nick, char *extensions,
const message_tags_data *tags_data);
void do_dns (session *sess, char *nick, char *host,
const message_tags_data *tags_data);
gboolean alert_match_word (char *word, char *masks); gboolean alert_match_word (char *word, char *masks);
gboolean alert_match_text (char *text, char *masks); gboolean alert_match_text (char *text, char *masks);

View file

@ -46,9 +46,12 @@ typedef struct
static int is_prefix_char (server * serv, char c); static int is_prefix_char (server * serv, char c);
static void record_chan_mode (session *sess, char sign, char mode, char *arg); static void record_chan_mode (session *sess, char sign, char mode, char *arg);
static char *mode_cat (char *str, char *addition); static char *mode_cat (char *str, char *addition);
static void handle_single_mode (mode_run *mr, char sign, char mode, char *nick, char *chan, char *arg, int quiet, int is_324); static void handle_single_mode (mode_run *mr, char sign, char mode, char *nick,
char *chan, char *arg, int quiet, int is_324,
const message_tags_data *tags_data);
static int mode_has_arg (server *serv, char sign, char mode); static int mode_has_arg (server *serv, char sign, char mode);
static void mode_print_grouped (session *sess, char *nick, mode_run *mr); static void mode_print_grouped (session *sess, char *nick, mode_run *mr,
const message_tags_data *tags_data);
static int mode_chanmode_type (server * serv, char mode); static int mode_chanmode_type (server * serv, char mode);
@ -387,7 +390,8 @@ mode_cat (char *str, char *addition)
static void static void
handle_single_mode (mode_run *mr, char sign, char mode, char *nick, handle_single_mode (mode_run *mr, char sign, char mode, char *nick,
char *chan, char *arg, int quiet, int is_324) char *chan, char *arg, int quiet, int is_324,
const message_tags_data *tags_data)
{ {
session *sess; session *sess;
server *serv = mr->serv; server *serv = mr->serv;
@ -440,14 +444,16 @@ handle_single_mode (mode_run *mr, char sign, char mode, char *nick,
fe_update_channel_key (sess); fe_update_channel_key (sess);
fe_update_mode_buttons (sess, mode, sign); fe_update_mode_buttons (sess, mode, sign);
if (!quiet) if (!quiet)
EMIT_SIGNAL (XP_TE_CHANSETKEY, sess, nick, arg, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANSETKEY, sess, nick, arg, NULL,
NULL, 0, tags_data->timestamp);
return; return;
case 'l': case 'l':
sess->limit = atoi (arg); sess->limit = atoi (arg);
fe_update_channel_limit (sess); fe_update_channel_limit (sess);
fe_update_mode_buttons (sess, mode, sign); fe_update_mode_buttons (sess, mode, sign);
if (!quiet) if (!quiet)
EMIT_SIGNAL (XP_TE_CHANSETLIMIT, sess, nick, arg, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANSETLIMIT, sess, nick, arg, NULL,
NULL, 0, tags_data->timestamp);
return; return;
case 'o': case 'o':
if (!quiet) if (!quiet)
@ -455,7 +461,8 @@ handle_single_mode (mode_run *mr, char sign, char mode, char *nick,
return; return;
case 'h': case 'h':
if (!quiet) if (!quiet)
EMIT_SIGNAL (XP_TE_CHANHOP, sess, nick, arg, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANHOP, sess, nick, arg, NULL, NULL,
0, tags_data->timestamp);
return; return;
case 'v': case 'v':
if (!quiet) if (!quiet)
@ -463,21 +470,25 @@ handle_single_mode (mode_run *mr, char sign, char mode, char *nick,
return; return;
case 'b': case 'b':
if (!quiet) if (!quiet)
EMIT_SIGNAL (XP_TE_CHANBAN, sess, nick, arg, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANBAN, sess, nick, arg, NULL, NULL,
0, tags_data->timestamp);
return; return;
case 'e': case 'e':
if (!quiet) if (!quiet)
EMIT_SIGNAL (XP_TE_CHANEXEMPT, sess, nick, arg, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANEXEMPT, sess, nick, arg, NULL,
NULL, 0, tags_data->timestamp);
return; return;
case 'I': case 'I':
if (!quiet) if (!quiet)
EMIT_SIGNAL (XP_TE_CHANINVITE, sess, nick, arg, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANINVITE, sess, nick, arg, NULL, NULL,
0, tags_data->timestamp);
return; return;
case 'q': case 'q':
if (!supportsq) if (!supportsq)
break; /* +q is owner on this server */ break; /* +q is owner on this server */
if (!quiet) if (!quiet)
EMIT_SIGNAL (XP_TE_CHANQUIET, sess, nick, arg, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANQUIET, sess, nick, arg, NULL, NULL, 0,
tags_data->timestamp);
return; return;
} }
break; break;
@ -489,14 +500,16 @@ handle_single_mode (mode_run *mr, char sign, char mode, char *nick,
fe_update_channel_key (sess); fe_update_channel_key (sess);
fe_update_mode_buttons (sess, mode, sign); fe_update_mode_buttons (sess, mode, sign);
if (!quiet) if (!quiet)
EMIT_SIGNAL (XP_TE_CHANRMKEY, sess, nick, NULL, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANRMKEY, sess, nick, NULL, NULL,
NULL, 0, tags_data->timestamp);
return; return;
case 'l': case 'l':
sess->limit = 0; sess->limit = 0;
fe_update_channel_limit (sess); fe_update_channel_limit (sess);
fe_update_mode_buttons (sess, mode, sign); fe_update_mode_buttons (sess, mode, sign);
if (!quiet) if (!quiet)
EMIT_SIGNAL (XP_TE_CHANRMLIMIT, sess, nick, NULL, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANRMLIMIT, sess, nick, NULL, NULL,
NULL, 0, tags_data->timestamp);
return; return;
case 'o': case 'o':
if (!quiet) if (!quiet)
@ -504,7 +517,8 @@ handle_single_mode (mode_run *mr, char sign, char mode, char *nick,
return; return;
case 'h': case 'h':
if (!quiet) if (!quiet)
EMIT_SIGNAL (XP_TE_CHANDEHOP, sess, nick, arg, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANDEHOP, sess, nick, arg, NULL,
NULL, 0, tags_data->timestamp);
return; return;
case 'v': case 'v':
if (!quiet) if (!quiet)
@ -512,21 +526,25 @@ handle_single_mode (mode_run *mr, char sign, char mode, char *nick,
return; return;
case 'b': case 'b':
if (!quiet) if (!quiet)
EMIT_SIGNAL (XP_TE_CHANUNBAN, sess, nick, arg, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANUNBAN, sess, nick, arg, NULL, NULL,
0, tags_data->timestamp);
return; return;
case 'e': case 'e':
if (!quiet) if (!quiet)
EMIT_SIGNAL (XP_TE_CHANRMEXEMPT, sess, nick, arg, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANRMEXEMPT, sess, nick, arg, NULL,
NULL, 0, tags_data->timestamp);
return; return;
case 'I': case 'I':
if (!quiet) if (!quiet)
EMIT_SIGNAL (XP_TE_CHANRMINVITE, sess, nick, arg, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANRMINVITE, sess, nick, arg, NULL,
NULL, 0, tags_data->timestamp);
return; return;
case 'q': case 'q':
if (!supportsq) if (!supportsq)
break; /* -q is owner on this server */ break; /* -q is owner on this server */
if (!quiet) if (!quiet)
EMIT_SIGNAL (XP_TE_CHANUNQUIET, sess, nick, arg, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANUNQUIET, sess, nick, arg, NULL,
NULL, 0, tags_data->timestamp);
return; return;
} }
} }
@ -544,10 +562,12 @@ handle_single_mode (mode_run *mr, char sign, char mode, char *nick,
{ {
char *buf = malloc (strlen (chan) + strlen (arg) + 2); char *buf = malloc (strlen (chan) + strlen (arg) + 2);
sprintf (buf, "%s %s", chan, arg); sprintf (buf, "%s %s", chan, arg);
EMIT_SIGNAL (XP_TE_CHANMODEGEN, sess, nick, outbuf, outbuf + 2, buf, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANMODEGEN, sess, nick, outbuf,
outbuf + 2, buf, 0, tags_data->timestamp);
free (buf); free (buf);
} else } else
EMIT_SIGNAL (XP_TE_CHANMODEGEN, sess, nick, outbuf, outbuf + 2, chan, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANMODEGEN, sess, nick, outbuf,
outbuf + 2, chan, 0, tags_data->timestamp);
} }
} }
@ -607,33 +627,38 @@ mode_chanmode_type (server * serv, char mode)
} }
static void static void
mode_print_grouped (session *sess, char *nick, mode_run *mr) mode_print_grouped (session *sess, char *nick, mode_run *mr,
const message_tags_data *tags_data)
{ {
/* print all the grouped Op/Deops */ /* print all the grouped Op/Deops */
if (mr->op) if (mr->op)
{ {
EMIT_SIGNAL (XP_TE_CHANOP, sess, nick, mr->op, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANOP, sess, nick, mr->op, NULL, NULL, 0,
tags_data->timestamp);
free (mr->op); free (mr->op);
mr->op = NULL; mr->op = NULL;
} }
if (mr->deop) if (mr->deop)
{ {
EMIT_SIGNAL (XP_TE_CHANDEOP, sess, nick, mr->deop, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANDEOP, sess, nick, mr->deop, NULL, NULL,
0, tags_data->timestamp);
free (mr->deop); free (mr->deop);
mr->deop = NULL; mr->deop = NULL;
} }
if (mr->voice) if (mr->voice)
{ {
EMIT_SIGNAL (XP_TE_CHANVOICE, sess, nick, mr->voice, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANVOICE, sess, nick, mr->voice, NULL, NULL,
0, tags_data->timestamp);
free (mr->voice); free (mr->voice);
mr->voice = NULL; mr->voice = NULL;
} }
if (mr->devoice) if (mr->devoice)
{ {
EMIT_SIGNAL (XP_TE_CHANDEVOICE, sess, nick, mr->devoice, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANDEVOICE, sess, nick, mr->devoice, NULL,
NULL, 0, tags_data->timestamp);
free (mr->devoice); free (mr->devoice);
mr->devoice = NULL; mr->devoice = NULL;
} }
@ -644,7 +669,7 @@ mode_print_grouped (session *sess, char *nick, mode_run *mr)
void void
handle_mode (server * serv, char *word[], char *word_eol[], handle_mode (server * serv, char *word[], char *word_eol[],
char *nick, int numeric_324) char *nick, int numeric_324, const message_tags_data *tags_data)
{ {
session *sess; session *sess;
char *chan; char *chan;
@ -687,7 +712,8 @@ handle_mode (server * serv, char *word[], char *word_eol[],
word_eol[offset][len] = 0; word_eol[offset][len] = 0;
if (prefs.hex_irc_raw_modes && !numeric_324) if (prefs.hex_irc_raw_modes && !numeric_324)
EMIT_SIGNAL (XP_TE_RAWMODES, sess, nick, word_eol[offset], 0, 0, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_RAWMODES, sess, nick, word_eol[offset], 0, 0, 0,
tags_data->timestamp);
if (numeric_324 && !using_front_tab) if (numeric_324 && !using_front_tab)
{ {
@ -731,7 +757,7 @@ handle_mode (server * serv, char *word[], char *word_eol[],
case '-': case '-':
case '+': case '+':
/* print all the grouped Op/Deops */ /* print all the grouped Op/Deops */
mode_print_grouped (sess, nick, &mr); mode_print_grouped (sess, nick, &mr, tags_data);
sign = *modes; sign = *modes;
break; break;
default: default:
@ -743,7 +769,7 @@ handle_mode (server * serv, char *word[], char *word_eol[],
} }
handle_single_mode (&mr, sign, *modes, nick, chan, handle_single_mode (&mr, sign, *modes, nick, chan,
argstr, numeric_324 || prefs.hex_irc_raw_modes, argstr, numeric_324 || prefs.hex_irc_raw_modes,
numeric_324); numeric_324, tags_data);
} }
modes++; modes++;
@ -754,13 +780,13 @@ handle_mode (server * serv, char *word[], char *word_eol[],
fe_set_title (sess); fe_set_title (sess);
/* print all the grouped Op/Deops */ /* print all the grouped Op/Deops */
mode_print_grouped (sess, nick, &mr); mode_print_grouped (sess, nick, &mr, tags_data);
} }
/* handle the 005 numeric */ /* handle the 005 numeric */
void void
inbound_005 (server * serv, char *word[]) inbound_005 (server * serv, char *word[], const message_tags_data *tags_data)
{ {
int w; int w;
char *pre; char *pre;

View file

@ -17,6 +17,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/ */
#include "proto-irc.h"
#ifndef HEXCHAT_MODES_H #ifndef HEXCHAT_MODES_H
#define HEXCHAT_MODES_H #define HEXCHAT_MODES_H
@ -24,8 +26,9 @@ int is_channel (server *serv, char *chan);
char get_nick_prefix (server *serv, unsigned int access); char get_nick_prefix (server *serv, unsigned int access);
unsigned int nick_access (server *serv, char *nick, int *modechars); unsigned int nick_access (server *serv, char *nick, int *modechars);
int mode_access (server *serv, char mode, char *prefix); int mode_access (server *serv, char mode, char *prefix);
void inbound_005 (server *serv, char *word[]); void inbound_005 (server *serv, char *word[], const message_tags_data *tags_data);
void handle_mode (server *serv, char *word[], char *word_eol[], char *nick, int numeric_324); void handle_mode (server *serv, char *word[], char *word_eol[], char *nick,
int numeric_324, const message_tags_data *tags_data);
void send_channel_modes (session *sess, char *tbuf, char *word[], int start, int end, char sign, char mode, int modes_per_line); void send_channel_modes (session *sess, char *tbuf, char *word[], int start, int end, char sign, char mode, int modes_per_line);
#endif #endif

View file

@ -205,7 +205,8 @@ notify_find (server *serv, char *nick)
static void static void
notify_announce_offline (server * serv, struct notify_per_server *servnot, notify_announce_offline (server * serv, struct notify_per_server *servnot,
char *nick, int quiet) char *nick, int quiet,
const message_tags_data *tags_data)
{ {
session *sess; session *sess;
@ -214,15 +215,16 @@ notify_announce_offline (server * serv, struct notify_per_server *servnot,
servnot->ison = FALSE; servnot->ison = FALSE;
servnot->lastoff = time (0); servnot->lastoff = time (0);
if (!quiet) if (!quiet)
EMIT_SIGNAL (XP_TE_NOTIFYOFFLINE, sess, nick, serv->servername, EMIT_SIGNAL_TIMESTAMP (XP_TE_NOTIFYOFFLINE, sess, nick, serv->servername,
server_get_network (serv, TRUE), NULL, 0); server_get_network (serv, TRUE), NULL, 0,
tags_data->timestamp);
fe_notify_update (nick); fe_notify_update (nick);
fe_notify_update (0); fe_notify_update (0);
} }
static void static void
notify_announce_online (server * serv, struct notify_per_server *servnot, notify_announce_online (server * serv, struct notify_per_server *servnot,
char *nick) char *nick, const message_tags_data *tags_data)
{ {
session *sess; session *sess;
@ -234,8 +236,9 @@ notify_announce_online (server * serv, struct notify_per_server *servnot,
servnot->ison = TRUE; servnot->ison = TRUE;
servnot->laston = time (0); servnot->laston = time (0);
EMIT_SIGNAL (XP_TE_NOTIFYONLINE, sess, nick, serv->servername, EMIT_SIGNAL_TIMESTAMP (XP_TE_NOTIFYONLINE, sess, nick, serv->servername,
server_get_network (serv, TRUE), NULL, 0); server_get_network (serv, TRUE), NULL, 0,
tags_data->timestamp);
fe_notify_update (nick); fe_notify_update (nick);
fe_notify_update (0); fe_notify_update (0);
@ -254,7 +257,8 @@ notify_announce_online (server * serv, struct notify_per_server *servnot,
/* handles numeric 601 */ /* handles numeric 601 */
void void
notify_set_offline (server * serv, char *nick, int quiet) notify_set_offline (server * serv, char *nick, int quiet,
const message_tags_data *tags_data)
{ {
struct notify_per_server *servnot; struct notify_per_server *servnot;
@ -262,13 +266,14 @@ notify_set_offline (server * serv, char *nick, int quiet)
if (!servnot) if (!servnot)
return; return;
notify_announce_offline (serv, servnot, nick, quiet); notify_announce_offline (serv, servnot, nick, quiet, tags_data);
} }
/* handles numeric 604 and 600 */ /* handles numeric 604 and 600 */
void void
notify_set_online (server * serv, char *nick) notify_set_online (server * serv, char *nick,
const message_tags_data *tags_data)
{ {
struct notify_per_server *servnot; struct notify_per_server *servnot;
@ -276,7 +281,7 @@ notify_set_online (server * serv, char *nick)
if (!servnot) if (!servnot)
return; return;
notify_announce_online (serv, servnot, nick); notify_announce_online (serv, servnot, nick, tags_data);
} }
static void static void
@ -369,7 +374,7 @@ notify_send_watches (server * serv)
/* called when receiving a ISON 303 - should this func go? */ /* called when receiving a ISON 303 - should this func go? */
void void
notify_markonline (server *serv, char *word[]) notify_markonline (server *serv, char *word[], const message_tags_data *tags_data)
{ {
struct notify *notify; struct notify *notify;
struct notify_per_server *servnot; struct notify_per_server *servnot;
@ -392,7 +397,7 @@ notify_markonline (server *serv, char *word[])
if (!serv->p_cmp (notify->name, word[i])) if (!serv->p_cmp (notify->name, word[i]))
{ {
seen = TRUE; seen = TRUE;
notify_announce_online (serv, servnot, notify->name); notify_announce_online (serv, servnot, notify->name, tags_data);
break; break;
} }
i++; i++;
@ -406,7 +411,7 @@ notify_markonline (server *serv, char *word[])
} }
if (!seen && servnot->ison) if (!seen && servnot->ison)
{ {
notify_announce_offline (serv, servnot, notify->name, FALSE); notify_announce_offline (serv, servnot, notify->name, FALSE, tags_data);
} }
list = list->next; list = list->next;
} }
@ -467,7 +472,7 @@ notify_checklist (void) /* check ISON list */
} }
void void
notify_showlist (struct session *sess) notify_showlist (struct session *sess, const message_tags_data *tags_data)
{ {
char outbuf[256]; char outbuf[256];
struct notify *notify; struct notify *notify;
@ -475,7 +480,8 @@ notify_showlist (struct session *sess)
struct notify_per_server *servnot; struct notify_per_server *servnot;
int i = 0; int i = 0;
EMIT_SIGNAL (XP_TE_NOTIFYHEAD, sess, NULL, NULL, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_NOTIFYHEAD, sess, NULL, NULL, NULL, NULL, 0,
tags_data->timestamp);
while (list) while (list)
{ {
i++; i++;
@ -485,15 +491,17 @@ notify_showlist (struct session *sess)
snprintf (outbuf, sizeof (outbuf), _(" %-20s online\n"), notify->name); snprintf (outbuf, sizeof (outbuf), _(" %-20s online\n"), notify->name);
else else
snprintf (outbuf, sizeof (outbuf), _(" %-20s offline\n"), notify->name); snprintf (outbuf, sizeof (outbuf), _(" %-20s offline\n"), notify->name);
PrintText (sess, outbuf); PrintTextTimeStamp (sess, outbuf, tags_data->timestamp);
list = list->next; list = list->next;
} }
if (i) if (i)
{ {
sprintf (outbuf, "%d", i); sprintf (outbuf, "%d", i);
EMIT_SIGNAL (XP_TE_NOTIFYNUMBER, sess, outbuf, NULL, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_NOTIFYNUMBER, sess, outbuf, NULL, NULL, NULL,
0, tags_data->timestamp);
} else } else
EMIT_SIGNAL (XP_TE_NOTIFYEMPTY, sess, NULL, NULL, NULL, NULL, 0); EMIT_SIGNAL_TIMESTAMP (XP_TE_NOTIFYEMPTY, sess, NULL, NULL, NULL, NULL, 0,
tags_data->timestamp);
} }
int int

View file

@ -17,6 +17,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/ */
#include "proto-irc.h"
#ifndef HEXCHAT_NOTIFY_H #ifndef HEXCHAT_NOTIFY_H
#define HEXCHAT_NOTIFY_H #define HEXCHAT_NOTIFY_H
@ -41,8 +43,10 @@ extern GSList *notify_list;
extern int notify_tag; extern int notify_tag;
/* the WATCH stuff */ /* the WATCH stuff */
void notify_set_online (server * serv, char *nick); void notify_set_online (server * serv, char *nick,
void notify_set_offline (server * serv, char *nick, int quiet); const message_tags_data *tags_data);
void notify_set_offline (server * serv, char *nick, int quiet,
const message_tags_data *tags_data);
void notify_send_watches (server * serv); void notify_send_watches (server * serv);
/* the general stuff */ /* the general stuff */
@ -51,13 +55,14 @@ int notify_deluser (char *name);
void notify_cleanup (void); void notify_cleanup (void);
void notify_load (void); void notify_load (void);
void notify_save (void); void notify_save (void);
void notify_showlist (session *sess); void notify_showlist (session *sess, const message_tags_data *tags_data);
gboolean notify_is_in_list (server *serv, char *name); gboolean notify_is_in_list (server *serv, char *name);
int notify_isnotify (session *sess, char *name); int notify_isnotify (session *sess, char *name);
struct notify_per_server *notify_find_server_entry (struct notify *notify, struct server *serv); struct notify_per_server *notify_find_server_entry (struct notify *notify, struct server *serv);
/* the old ISON stuff - remove me? */ /* the old ISON stuff - remove me? */
void notify_markonline (server *serv, char *word[]); void notify_markonline (server *serv, char *word[],
const message_tags_data *tags_data);
int notify_checklist (void); int notify_checklist (void);
#endif #endif

View file

@ -1419,7 +1419,8 @@ cmd_dns (struct session *sess, char *tbuf, char *word[], char *word_eol[])
user = userlist_find (sess, nick); user = userlist_find (sess, nick);
if (user && user->hostname) if (user && user->hostname)
{ {
do_dns (sess, user->nick, user->hostname); message_tags_data no_tags = MESSAGE_TAGS_DATA_INIT;
do_dns (sess, user->nick, user->hostname, &no_tags);
} else } else
{ {
sess->server->p_get_ip (sess->server, nick); sess->server->p_get_ip (sess->server, nick);
@ -2606,6 +2607,7 @@ cmd_me (struct session *sess, char *tbuf, char *word[], char *word_eol[])
char *split_text = NULL; char *split_text = NULL;
int cmd_length = 22; /* " PRIVMSG ", " ", :, \001ACTION, " ", \001, \r, \n */ int cmd_length = 22; /* " PRIVMSG ", " ", :, \001ACTION, " ", \001, \r, \n */
int offset = 0; int offset = 0;
message_tags_data no_tags = MESSAGE_TAGS_DATA_INIT;
if (!(*act)) if (!(*act))
return FALSE; return FALSE;
@ -2621,7 +2623,8 @@ cmd_me (struct session *sess, char *tbuf, char *word[], char *word_eol[])
if (dcc_write_chat (sess->channel, tbuf)) if (dcc_write_chat (sess->channel, tbuf))
{ {
/* print it to screen */ /* 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, FALSE,
&no_tags);
} else } else
{ {
/* DCC CHAT failed, try through server */ /* DCC CHAT failed, try through server */
@ -2631,7 +2634,9 @@ cmd_me (struct session *sess, char *tbuf, char *word[], char *word_eol[])
{ {
sess->server->p_action (sess->server, sess->channel, split_text); sess->server->p_action (sess->server, sess->channel, split_text);
/* print it to screen */ /* print it to screen */
inbound_action (sess, sess->channel, sess->server->nick, "", split_text, TRUE, FALSE); inbound_action (sess, sess->channel, sess->server->nick, "",
split_text, TRUE, FALSE,
&no_tags);
if (*split_text) if (*split_text)
offset += strlen(split_text); offset += strlen(split_text);
@ -2641,7 +2646,8 @@ cmd_me (struct session *sess, char *tbuf, char *word[], char *word_eol[])
sess->server->p_action (sess->server, sess->channel, act + offset); sess->server->p_action (sess->server, sess->channel, act + offset);
/* print it to screen */ /* print it to screen */
inbound_action (sess, sess->channel, sess->server->nick, "", act + offset, TRUE, FALSE); inbound_action (sess, sess->channel, sess->server->nick, "",
act + offset, TRUE, FALSE, &no_tags);
} else } else
{ {
notc_msg (sess); notc_msg (sess);
@ -2701,7 +2707,6 @@ cmd_msg (struct session *sess, char *tbuf, char *word[], char *word_eol[])
char *nick = word[2]; char *nick = word[2];
char *msg = word_eol[3]; char *msg = word_eol[3];
struct session *newsess; struct session *newsess;
char *split_text = NULL; char *split_text = NULL;
int cmd_length = 13; /* " PRIVMSG ", " ", :, \r, \n */ int cmd_length = 13; /* " PRIVMSG ", " ", :, \r, \n */
int offset = 0; int offset = 0;
@ -2752,10 +2757,13 @@ cmd_msg (struct session *sess, char *tbuf, char *word[], char *word_eol[])
newsess = find_channel (sess->server, nick); newsess = find_channel (sess->server, nick);
if (newsess) if (newsess)
{ {
message_tags_data no_tags = MESSAGE_TAGS_DATA_INIT;
while ((split_text = split_up_text (sess, msg + offset, cmd_length, split_text))) while ((split_text = split_up_text (sess, msg + offset, cmd_length, split_text)))
{ {
inbound_chanmsg (newsess->server, NULL, newsess->channel, inbound_chanmsg (newsess->server, NULL, newsess->channel,
newsess->server->nick, split_text, TRUE, FALSE); newsess->server->nick, split_text, TRUE, FALSE,
&no_tags);
if (*split_text) if (*split_text)
offset += strlen(split_text); offset += strlen(split_text);
@ -2763,7 +2771,8 @@ cmd_msg (struct session *sess, char *tbuf, char *word[], char *word_eol[])
g_free(split_text); g_free(split_text);
} }
inbound_chanmsg (newsess->server, NULL, newsess->channel, inbound_chanmsg (newsess->server, NULL, newsess->channel,
newsess->server->nick, msg + offset, TRUE, FALSE); newsess->server->nick, msg + offset, TRUE, FALSE,
&no_tags);
} }
else else
{ {
@ -2825,7 +2834,11 @@ cmd_nick (struct session *sess, char *tbuf, char *word[], char *word_eol[])
if (sess->server->connected) if (sess->server->connected)
sess->server->p_change_nick (sess->server, nick); sess->server->p_change_nick (sess->server, nick);
else else
inbound_newnick (sess->server, sess->server->nick, nick, TRUE); {
message_tags_data no_tags = MESSAGE_TAGS_DATA_INIT;
inbound_newnick (sess->server, sess->server->nick, nick, TRUE,
&no_tags);
}
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
@ -2894,7 +2907,10 @@ cmd_notify (struct session *sess, char *tbuf, char *word[], char *word_eol[])
} }
} }
} else } else
notify_showlist (sess); {
message_tags_data no_tags = MESSAGE_TAGS_DATA_INIT;
notify_showlist (sess, &no_tags);
}
return TRUE; return TRUE;
} }
@ -3699,8 +3715,11 @@ cmd_wallchan (struct session *sess, char *tbuf, char *word[],
sess = list->data; sess = list->data;
if (sess->type == SESS_CHANNEL) if (sess->type == SESS_CHANNEL)
{ {
message_tags_data no_tags = MESSAGE_TAGS_DATA_INIT;
inbound_chanmsg (sess->server, NULL, sess->channel, inbound_chanmsg (sess->server, NULL, sess->channel,
sess->server->nick, word_eol[2], TRUE, FALSE); sess->server->nick, word_eol[2], TRUE, FALSE,
&no_tags);
sess->server->p_message (sess->server, sess->channel, word_eol[2]); sess->server->p_message (sess->server, sess->channel, word_eol[2]);
} }
list = list->next; list = list->next;
@ -4344,6 +4363,7 @@ handle_say (session *sess, char *text, int check_spch)
char *newcmd = newcmd_static; char *newcmd = newcmd_static;
int len; int len;
int newcmdlen = sizeof newcmd_static; int newcmdlen = sizeof newcmd_static;
message_tags_data no_tags = MESSAGE_TAGS_DATA_INIT;
if (strcmp (sess->channel, "(lastlog)") == 0) if (strcmp (sess->channel, "(lastlog)") == 0)
{ {
@ -4396,7 +4416,7 @@ handle_say (session *sess, char *text, int check_spch)
if (dcc) if (dcc)
{ {
inbound_chanmsg (sess->server, NULL, sess->channel, inbound_chanmsg (sess->server, NULL, sess->channel,
sess->server->nick, text, TRUE, FALSE); sess->server->nick, text, TRUE, FALSE, &no_tags);
set_topic (sess, net_ip (dcc->addr), net_ip (dcc->addr)); set_topic (sess, net_ip (dcc->addr), net_ip (dcc->addr));
goto xit; goto xit;
} }
@ -4411,7 +4431,7 @@ handle_say (session *sess, char *text, int check_spch)
while ((split_text = split_up_text (sess, text + offset, cmd_length, split_text))) while ((split_text = split_up_text (sess, text + offset, cmd_length, split_text)))
{ {
inbound_chanmsg (sess->server, sess, sess->channel, sess->server->nick, inbound_chanmsg (sess->server, sess, sess->channel, sess->server->nick,
split_text, TRUE, FALSE); split_text, TRUE, FALSE, &no_tags);
sess->server->p_message (sess->server, sess->channel, split_text); sess->server->p_message (sess->server, sess->channel, split_text);
if (*split_text) if (*split_text)
@ -4421,7 +4441,7 @@ handle_say (session *sess, char *text, int check_spch)
} }
inbound_chanmsg (sess->server, sess, sess->channel, sess->server->nick, inbound_chanmsg (sess->server, sess, sess->channel, sess->server->nick,
text + offset, TRUE, FALSE); text + offset, TRUE, FALSE, &no_tags);
sess->server->p_message (sess->server, sess->channel, text + offset); sess->server->p_message (sess->server, sess->channel, text + offset);
} else } else
{ {

File diff suppressed because it is too large Load diff

View file

@ -17,9 +17,26 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/ */
#include <time.h>
#include "hexchat.h"
#ifndef HEXCHAT_PROTO_H #ifndef HEXCHAT_PROTO_H
#define HEXCHAT_PROTO_H #define HEXCHAT_PROTO_H
#define MESSAGE_TAGS_DATA_INIT \
{ \
(time_t)0, /* timestamp */ \
}
/* Message tag information that might be passed along with a server message
*
* See http://ircv3.atheme.org/specification/capability-negotiation-3.1
*/
typedef struct
{
time_t timestamp;
} message_tags_data;
void proto_fill_her_up (server *serv); void proto_fill_her_up (server *serv);
#endif #endif

View file

@ -1895,6 +1895,7 @@ server_set_defaults (server *serv)
serv->have_idmsg = FALSE; serv->have_idmsg = FALSE;
serv->have_accnotify = FALSE; serv->have_accnotify = FALSE;
serv->have_extjoin = FALSE; serv->have_extjoin = FALSE;
serv->have_server_time = FALSE;
serv->have_sasl = FALSE; serv->have_sasl = FALSE;
serv->have_except = FALSE; serv->have_except = FALSE;
serv->have_invite = FALSE; serv->have_invite = FALSE;

View file

@ -866,7 +866,7 @@ text_validate (char **text, int *len)
} }
void void
PrintText (session *sess, char *text) PrintTextTimeStamp (session *sess, char *text, time_t timestamp)
{ {
char *conv; char *conv;
@ -890,12 +890,18 @@ PrintText (session *sess, char *text)
log_write (sess, text); log_write (sess, text);
scrollback_save (sess, text); scrollback_save (sess, text);
fe_print_text (sess, text, 0); fe_print_text (sess, text, timestamp);
if (conv) if (conv)
g_free (conv); g_free (conv);
} }
void
PrintText (session *sess, char *text)
{
PrintTextTimeStamp (sess, text, 0);
}
void void
PrintTextf (session *sess, char *format, ...) PrintTextf (session *sess, char *format, ...)
{ {
@ -910,6 +916,20 @@ PrintTextf (session *sess, char *format, ...)
g_free (buf); g_free (buf);
} }
void
PrintTextTimeStampf (session *sess, time_t timestamp, char *format, ...)
{
va_list args;
char *buf;
va_start (args, format);
buf = g_strdup_vprintf (format, args);
va_end (args);
PrintTextTimeStamp (sess, buf, timestamp);
g_free (buf);
}
/* Print Events stuff here --AGL */ /* Print Events stuff here --AGL */
/* Consider the following a NOTES file: /* Consider the following a NOTES file:
@ -1836,12 +1856,13 @@ format_event (session *sess, int index, char **args, char *o, int sizeofo, unsig
} }
static void static void
display_event (session *sess, int event, char **args, unsigned int stripcolor_args) display_event (session *sess, int event, char **args,
unsigned int stripcolor_args, time_t timestamp)
{ {
char o[4096]; char o[4096];
format_event (sess, event, args, o, sizeof (o), stripcolor_args); format_event (sess, event, args, o, sizeof (o), stripcolor_args);
if (o[0]) if (o[0])
PrintText (sess, o); PrintTextTimeStamp (sess, o, timestamp);
} }
int int
@ -2042,7 +2063,8 @@ text_color_of (char *name)
/* called by EMIT_SIGNAL macro */ /* called by EMIT_SIGNAL macro */
void void
text_emit (int index, session *sess, char *a, char *b, char *c, char *d) text_emit (int index, session *sess, char *a, char *b, char *c, char *d,
time_t timestamp)
{ {
char *word[PDIWORDS]; char *word[PDIWORDS];
int i; int i;
@ -2120,7 +2142,7 @@ text_emit (int index, session *sess, char *a, char *b, char *c, char *d)
} }
sound_play_event (index); sound_play_event (index);
display_event (sess, index, word, stripcolor_args); display_event (sess, index, word, stripcolor_args, timestamp);
} }
char * char *
@ -2143,7 +2165,7 @@ text_emit_by_name (char *name, session *sess, char *a, char *b, char *c, char *d
i = pevent_find (name, &i); i = pevent_find (name, &i);
if (i >= 0) if (i >= 0)
{ {
text_emit (i, sess, a, b, c, d); text_emit (i, sess, a, b, c, d, 0);
return 1; return 1;
} }

View file

@ -17,12 +17,17 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/ */
#include <time.h>
#include "textenums.h" #include "textenums.h"
#ifndef HEXCHAT_TEXT_H #ifndef HEXCHAT_TEXT_H
#define HEXCHAT_TEXT_H #define HEXCHAT_TEXT_H
#define EMIT_SIGNAL(i, sess, a, b, c, d, e) text_emit(i, sess, a, b, c, d) /* timestamp is non-zero if we are using server-time */
#define EMIT_SIGNAL_TIMESTAMP(i, sess, a, b, c, d, e, timestamp) \
text_emit(i, sess, a, b, c, d, timestamp)
#define EMIT_SIGNAL(i, sess, a, b, c, d, e) \
text_emit(i, sess, a, b, c, d, 0)
struct text_event struct text_event
{ {
@ -37,7 +42,9 @@ void scrollback_load (session *sess);
int text_word_check (char *word, int len); int text_word_check (char *word, int len);
void PrintText (session *sess, char *text); void PrintText (session *sess, char *text);
void PrintTextTimeStamp (session *sess, char *text, time_t timestamp);
void PrintTextf (session *sess, char *format, ...); void PrintTextf (session *sess, char *format, ...);
void PrintTextTimeStampf (session *sess, time_t timestamp, char *format, ...);
void log_close (session *sess); void log_close (session *sess);
void log_open_or_close (session *sess); void log_open_or_close (session *sess);
void load_text_events (void); void load_text_events (void);
@ -46,7 +53,8 @@ int pevt_build_string (const char *input, char **output, int *max_arg);
int pevent_load (char *filename); int pevent_load (char *filename);
void pevent_make_pntevts (void); void pevent_make_pntevts (void);
int text_color_of (char *name); int text_color_of (char *name);
void text_emit (int index, session *sess, char *a, char *b, char *c, char *d); void text_emit (int index, session *sess, char *a, char *b, char *c, char *d,
time_t timestamp);
int text_emit_by_name (char *name, session *sess, char *a, char *b, char *c, char *d); int text_emit_by_name (char *name, session *sess, char *a, char *b, char *c, char *d);
char *text_validate (char **text, int *len); char *text_validate (char **text, int *len);
int get_stamp_str (char *fmt, time_t tim, char **ret); int get_stamp_str (char *fmt, time_t tim, char **ret);

View file

@ -383,7 +383,8 @@ userlist_remove_user (struct session *sess, struct User *user)
} }
void void
userlist_add (struct session *sess, char *name, char *hostname, char *account, char *realname) userlist_add (struct session *sess, char *name, char *hostname,
char *account, char *realname, const message_tags_data *tags_data)
{ {
struct User *user; struct User *user;
int row, prefix_chars; int row, prefix_chars;
@ -391,7 +392,7 @@ userlist_add (struct session *sess, char *name, char *hostname, char *account, c
acc = nick_access (sess->server, name, &prefix_chars); acc = nick_access (sess->server, name, &prefix_chars);
notify_set_online (sess->server, name + prefix_chars); notify_set_online (sess->server, name + prefix_chars, tags_data);
user = malloc (sizeof (struct User)); user = malloc (sizeof (struct User));
memset (user, 0, sizeof (struct User)); memset (user, 0, sizeof (struct User));

View file

@ -18,6 +18,7 @@
*/ */
#include <time.h> #include <time.h>
#include "proto-irc.h"
#ifndef HEXCHAT_USERLIST_H #ifndef HEXCHAT_USERLIST_H
#define HEXCHAT_USERLIST_H #define HEXCHAT_USERLIST_H
@ -51,7 +52,8 @@ struct User *userlist_find (session *sess, const char *name);
struct User *userlist_find_global (server *serv, char *name); struct User *userlist_find_global (server *serv, char *name);
void userlist_clear (session *sess); void userlist_clear (session *sess);
void userlist_free (session *sess); void userlist_free (session *sess);
void userlist_add (session *sess, char *name, char *hostname, char *account, char *realname); void userlist_add (session *sess, char *name, char *hostname, char *account,
char *realname, const message_tags_data *tags_data);
int userlist_remove (session *sess, char *name); int userlist_remove (session *sess, char *name);
void userlist_remove_user (session *sess, struct User *user); void userlist_remove_user (session *sess, struct User *user);
int userlist_change (session *sess, char *oldname, char *newname); int userlist_change (session *sess, char *oldname, char *newname);

View file

@ -522,12 +522,13 @@ static const setting advanced_settings[] =
"Otherwise, include color information if the CONTROL key is held down " "Otherwise, include color information if the CONTROL key is held down "
"while selecting."), 0, 0}, "while selecting."), 0, 0},
{ST_HEADER, N_("Miscellaneous"),0,0,0}, {ST_HEADER, N_("Miscellaneous"), 0, 0, 0},
{ST_ENTRY, N_("Real name:"), P_OFFSETNL(hex_irc_real_name), 0, 0, sizeof prefs.hex_irc_real_name}, {ST_ENTRY, N_("Real name:"), P_OFFSETNL(hex_irc_real_name), 0, 0, sizeof prefs.hex_irc_real_name},
#ifdef WIN32 #ifdef WIN32
{ST_ENTRY, N_("Alternative fonts:"), P_OFFSETNL(hex_text_font_alternative), "Separate multiple entries with commas without spaces before or after.", 0, sizeof prefs.hex_text_font_alternative}, {ST_ENTRY, N_("Alternative fonts:"), P_OFFSETNL(hex_text_font_alternative), N_("Separate multiple entries with commas without spaces before or after."), 0, sizeof prefs.hex_text_font_alternative},
#endif #endif
{ST_TOGGLE, N_("Display lists in compact mode"), P_OFFINTNL(hex_gui_compact), N_("Use less spacing between user list/channel tree rows."), 0, 0}, {ST_TOGGLE, N_("Display lists in compact mode"), P_OFFINTNL(hex_gui_compact), N_("Use less spacing between user list/channel tree rows."), 0, 0},
{ST_TOGGLE, N_("Use server time if supported"), P_OFFINTNL(hex_irc_cap_server_time), N_("Display timestamps obtained from server if it supports the time-server extension."), 0, 0},
{ST_TOGGLE, N_("Automatically reconnect to servers on disconnect"), P_OFFINTNL(hex_net_auto_reconnect), 0, 0, 1}, {ST_TOGGLE, N_("Automatically reconnect to servers on disconnect"), P_OFFINTNL(hex_net_auto_reconnect), 0, 0, 1},
{ST_NUMBER, N_("Auto reconnect delay:"), P_OFFINTNL(hex_net_reconnect_delay), 0, 0, 9999}, {ST_NUMBER, N_("Auto reconnect delay:"), P_OFFINTNL(hex_net_reconnect_delay), 0, 0, 9999},
{ST_NUMBER, N_("Auto join delay:"), P_OFFINTNL(hex_irc_join_delay), 0, 0, 9999}, {ST_NUMBER, N_("Auto join delay:"), P_OFFINTNL(hex_irc_join_delay), 0, 0, 9999},