mirror of
https://github.com/unrealircd/unrealircd.git
synced 2026-06-12 17:14:46 +02:00
Expose more WHOWAS fields in JSON-RPC and change add_history() to take a reason
for the add, like: nick-change, quit, server terminating. Add logon time. I also think i will move from user.get_whowas to a whowas.XXX since the returned object is not a user object and getting more different each commit :D.
This commit is contained in:
+2
-1
@@ -417,7 +417,7 @@ extern void del_whowas_from_clist(WhoWas **, WhoWas *);
|
|||||||
extern void add_whowas_to_list(WhoWas **, WhoWas *);
|
extern void add_whowas_to_list(WhoWas **, WhoWas *);
|
||||||
extern void del_whowas_from_list(WhoWas **, WhoWas *);
|
extern void del_whowas_from_list(WhoWas **, WhoWas *);
|
||||||
extern uint64_t hash_whowas_name(const char *name);
|
extern uint64_t hash_whowas_name(const char *name);
|
||||||
extern void create_whowas_entry(Client *client, WhoWas *e);
|
extern void create_whowas_entry(Client *client, WhoWas *e, WhoWasEvent event);
|
||||||
extern void free_whowas_fields(WhoWas *e);
|
extern void free_whowas_fields(WhoWas *e);
|
||||||
extern int add_to_client_hash_table(const char *, Client *);
|
extern int add_to_client_hash_table(const char *, Client *);
|
||||||
extern int del_from_client_hash_table(const char *, Client *);
|
extern int del_from_client_hash_table(const char *, Client *);
|
||||||
@@ -1348,6 +1348,7 @@ extern void procio_post_rehash(int failure);
|
|||||||
/* end of proc i/o */
|
/* end of proc i/o */
|
||||||
extern int minimum_msec_since_last_run(struct timeval *tv_old, long minimum);
|
extern int minimum_msec_since_last_run(struct timeval *tv_old, long minimum);
|
||||||
extern long get_connected_time(Client *client);
|
extern long get_connected_time(Client *client);
|
||||||
|
extern time_t get_creationtime(Client *client);
|
||||||
extern const char *StripControlCodes(const char *text);
|
extern const char *StripControlCodes(const char *text);
|
||||||
extern const char *StripControlCodesEx(const char *text, char *output, size_t outputlen, int strip_flags);
|
extern const char *StripControlCodesEx(const char *text, char *output, size_t outputlen, int strip_flags);
|
||||||
extern MODVAR Module *Modules;
|
extern MODVAR Module *Modules;
|
||||||
|
|||||||
+3
-1
@@ -859,7 +859,9 @@ typedef struct Whowas {
|
|||||||
char *realname;
|
char *realname;
|
||||||
char *account;
|
char *account;
|
||||||
long umodes;
|
long umodes;
|
||||||
time_t logoff;
|
time_t logon;
|
||||||
|
time_t logoff;
|
||||||
|
WhoWasEvent event;
|
||||||
struct Client *online; /* Pointer to new nickname for chasing or NULL */
|
struct Client *online; /* Pointer to new nickname for chasing or NULL */
|
||||||
struct Whowas *next; /* for hash table... */
|
struct Whowas *next; /* for hash table... */
|
||||||
struct Whowas *prev; /* for hash table... */
|
struct Whowas *prev; /* for hash table... */
|
||||||
|
|||||||
+10
-1
@@ -35,6 +35,15 @@
|
|||||||
#ifndef __whowas_include__
|
#ifndef __whowas_include__
|
||||||
#define __whowas_include__
|
#define __whowas_include__
|
||||||
|
|
||||||
|
/* NOTE: Don't reorder values of these, as they are used in whowasdb */
|
||||||
|
typedef enum WhoWasEvent {
|
||||||
|
WHOWAS_EVENT_QUIT=0,
|
||||||
|
WHOWAS_EVENT_NICK_CHANGE=1,
|
||||||
|
WHOWAS_EVENT_SERVER_TERMINATING=2
|
||||||
|
} WhoWasEvent;
|
||||||
|
#define WHOWAS_LOWEST_EVENT 0
|
||||||
|
#define WHOWAS_HIGHEST_EVENT 2
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** add_history
|
** add_history
|
||||||
** Add the currently defined name of the client to history.
|
** Add the currently defined name of the client to history.
|
||||||
@@ -42,7 +51,7 @@
|
|||||||
** Client must be a fully registered user (specifically,
|
** Client must be a fully registered user (specifically,
|
||||||
** the user structure must have been allocated).
|
** the user structure must have been allocated).
|
||||||
*/
|
*/
|
||||||
void add_history(Client *, int);
|
void add_history(Client *, int, WhoWasEvent);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** off_history
|
** off_history
|
||||||
|
|||||||
+1
-1
@@ -344,7 +344,7 @@ void remove_client_from_list(Client *client)
|
|||||||
|
|
||||||
if (IsUser(client)) /* Only persons can have been added before */
|
if (IsUser(client)) /* Only persons can have been added before */
|
||||||
{
|
{
|
||||||
add_history(client, 0);
|
add_history(client, 0, WHOWAS_EVENT_QUIT);
|
||||||
off_history(client); /* Remove all pointers to client */
|
off_history(client); /* Remove all pointers to client */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -205,7 +205,7 @@ CMD_FUNC(cmd_nick_remote)
|
|||||||
new_message(client, recv_mtags, &mtags);
|
new_message(client, recv_mtags, &mtags);
|
||||||
RunHook(HOOKTYPE_REMOTE_NICKCHANGE, client, mtags, nick);
|
RunHook(HOOKTYPE_REMOTE_NICKCHANGE, client, mtags, nick);
|
||||||
client->lastnick = lastnick ? lastnick : TStime();
|
client->lastnick = lastnick ? lastnick : TStime();
|
||||||
add_history(client, 1);
|
add_history(client, 1, WHOWAS_EVENT_NICK_CHANGE);
|
||||||
sendto_server(client, 0, 0, mtags, ":%s NICK %s %lld",
|
sendto_server(client, 0, 0, mtags, ":%s NICK %s %lld",
|
||||||
client->id, nick, (long long)client->lastnick);
|
client->id, nick, (long long)client->lastnick);
|
||||||
sendto_local_common_channels(client, client, 0, mtags, ":%s NICK :%s", client->name, nick);
|
sendto_local_common_channels(client, client, 0, mtags, ":%s NICK :%s", client->name, nick);
|
||||||
@@ -433,8 +433,8 @@ CMD_FUNC(cmd_nick_local)
|
|||||||
|
|
||||||
new_message(client, recv_mtags, &mtags);
|
new_message(client, recv_mtags, &mtags);
|
||||||
RunHook(HOOKTYPE_LOCAL_NICKCHANGE, client, mtags, nick);
|
RunHook(HOOKTYPE_LOCAL_NICKCHANGE, client, mtags, nick);
|
||||||
client->lastnick = TStime();
|
add_history(client, 1, WHOWAS_EVENT_NICK_CHANGE);
|
||||||
add_history(client, 1);
|
client->lastnick = TStime(); /* needs to be done AFTER add_history() */
|
||||||
sendto_server(client, 0, 0, mtags, ":%s NICK %s %lld",
|
sendto_server(client, 0, 0, mtags, ":%s NICK %s %lld",
|
||||||
client->id, nick, (long long)client->lastnick);
|
client->id, nick, (long long)client->lastnick);
|
||||||
sendto_local_common_channels(client, client, 0, mtags, ":%s NICK :%s", client->name, nick);
|
sendto_local_common_channels(client, client, 0, mtags, ":%s NICK :%s", client->name, nick);
|
||||||
|
|||||||
@@ -708,6 +708,17 @@ RPC_CALL_FUNC(rpc_user_part)
|
|||||||
|
|
||||||
extern WhoWas MODVAR WHOWAS[NICKNAMEHISTORYLENGTH];
|
extern WhoWas MODVAR WHOWAS[NICKNAMEHISTORYLENGTH];
|
||||||
|
|
||||||
|
const char *whowas_event_to_string(WhoWasEvent event)
|
||||||
|
{
|
||||||
|
if (event == WHOWAS_EVENT_QUIT)
|
||||||
|
return "quit";
|
||||||
|
if (event == WHOWAS_EVENT_NICK_CHANGE)
|
||||||
|
return "nick-change";
|
||||||
|
if (event == WHOWAS_EVENT_SERVER_TERMINATING)
|
||||||
|
return "server-terminating";
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
void json_expand_whowas(json_t *j, const char *key, WhoWas *e, int detail)
|
void json_expand_whowas(json_t *j, const char *key, WhoWas *e, int detail)
|
||||||
{
|
{
|
||||||
json_t *child;
|
json_t *child;
|
||||||
@@ -736,6 +747,8 @@ void json_expand_whowas(json_t *j, const char *key, WhoWas *e, int detail)
|
|||||||
if (detail < 2)
|
if (detail < 2)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
json_object_set_new(child, "event", json_string_unreal(whowas_event_to_string(e->event)));
|
||||||
|
json_object_set_new(child, "logon_time", json_timestamp(e->logon));
|
||||||
json_object_set_new(child, "logoff_time", json_timestamp(e->logoff));
|
json_object_set_new(child, "logoff_time", json_timestamp(e->logoff));
|
||||||
|
|
||||||
/* client.user */
|
/* client.user */
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ CMD_FUNC(cmd_svsnick)
|
|||||||
MessageTag *mtags = NULL;
|
MessageTag *mtags = NULL;
|
||||||
char nickname[NICKLEN+1];
|
char nickname[NICKLEN+1];
|
||||||
char oldnickname[NICKLEN+1];
|
char oldnickname[NICKLEN+1];
|
||||||
|
time_t ts;
|
||||||
|
|
||||||
if (!IsSvsCmdOk(client) || parc < 4 || (strlen(parv[2]) > NICKLEN))
|
if (!IsSvsCmdOk(client) || parc < 4 || (strlen(parv[2]) > NICKLEN))
|
||||||
return; /* This looks like an error anyway -Studded */
|
return; /* This looks like an error anyway -Studded */
|
||||||
@@ -96,7 +97,7 @@ CMD_FUNC(cmd_svsnick)
|
|||||||
|
|
||||||
if (acptr != ocptr)
|
if (acptr != ocptr)
|
||||||
acptr->umodes &= ~UMODE_REGNICK;
|
acptr->umodes &= ~UMODE_REGNICK;
|
||||||
acptr->lastnick = atol(parv[3]);
|
ts = atol(parv[3]);
|
||||||
|
|
||||||
/* no 'recv_mtags' here, we do not inherit from SVSNICK but generate a new NICK event */
|
/* no 'recv_mtags' here, we do not inherit from SVSNICK but generate a new NICK event */
|
||||||
new_message(acptr, NULL, &mtags);
|
new_message(acptr, NULL, &mtags);
|
||||||
@@ -104,9 +105,10 @@ CMD_FUNC(cmd_svsnick)
|
|||||||
RunHook(HOOKTYPE_LOCAL_NICKCHANGE, acptr, mtags, nickname);
|
RunHook(HOOKTYPE_LOCAL_NICKCHANGE, acptr, mtags, nickname);
|
||||||
sendto_local_common_channels(acptr, acptr, 0, mtags, ":%s NICK :%s", acptr->name, nickname);
|
sendto_local_common_channels(acptr, acptr, 0, mtags, ":%s NICK :%s", acptr->name, nickname);
|
||||||
sendto_one(acptr, mtags, ":%s NICK :%s", acptr->name, nickname);
|
sendto_one(acptr, mtags, ":%s NICK :%s", acptr->name, nickname);
|
||||||
sendto_server(NULL, 0, 0, mtags, ":%s NICK %s :%lld", acptr->id, nickname, (long long)acptr->lastnick);
|
sendto_server(NULL, 0, 0, mtags, ":%s NICK %s :%lld", acptr->id, nickname, (long long)ts);
|
||||||
|
|
||||||
add_history(acptr, 1);
|
add_history(acptr, 1, WHOWAS_EVENT_NICK_CHANGE);
|
||||||
|
acptr->lastnick = ts; /* needs to be done AFTER add_history() */
|
||||||
del_from_client_hash_table(acptr->name, acptr);
|
del_from_client_hash_table(acptr->name, acptr);
|
||||||
|
|
||||||
unreal_log(ULOG_INFO, "nick", "FORCED_NICK_CHANGE", acptr,
|
unreal_log(ULOG_INFO, "nick", "FORCED_NICK_CHANGE", acptr,
|
||||||
|
|||||||
+53
-12
@@ -327,7 +327,7 @@ int write_whowasdb(void)
|
|||||||
WhoWas *e = safe_alloc(sizeof(WhoWas));
|
WhoWas *e = safe_alloc(sizeof(WhoWas));
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
create_whowas_entry(client, e);
|
create_whowas_entry(client, e, WHOWAS_EVENT_SERVER_TERMINATING);
|
||||||
ret = write_whowas_entry(db, tmpfname, e);
|
ret = write_whowas_entry(db, tmpfname, e);
|
||||||
free_whowas_fields(e);
|
free_whowas_fields(e);
|
||||||
safe_free(e);
|
safe_free(e);
|
||||||
@@ -364,13 +364,19 @@ int write_whowasdb(void)
|
|||||||
|
|
||||||
int write_whowas_entry(UnrealDB *db, const char *tmpfname, WhoWas *e)
|
int write_whowas_entry(UnrealDB *db, const char *tmpfname, WhoWas *e)
|
||||||
{
|
{
|
||||||
|
char logontime[64];
|
||||||
char logofftime[64];
|
char logofftime[64];
|
||||||
|
char event[16];
|
||||||
|
|
||||||
|
snprintf(logontime, sizeof(logontime), "%lld", (long long)e->logon);
|
||||||
snprintf(logofftime, sizeof(logofftime), "%lld", (long long)e->logoff);
|
snprintf(logofftime, sizeof(logofftime), "%lld", (long long)e->logoff);
|
||||||
|
snprintf(event, sizeof(event), "%d", e->event);
|
||||||
|
|
||||||
W_SAFE(unrealdb_write_int32(db, MAGIC_WHOWASDB_START));
|
W_SAFE(unrealdb_write_int32(db, MAGIC_WHOWASDB_START));
|
||||||
W_SAFE_PROPERTY(db, "nick", e->name);
|
W_SAFE_PROPERTY(db, "nick", e->name);
|
||||||
|
W_SAFE_PROPERTY(db, "logontime", logontime);
|
||||||
W_SAFE_PROPERTY(db, "logofftime", logofftime);
|
W_SAFE_PROPERTY(db, "logofftime", logofftime);
|
||||||
|
W_SAFE_PROPERTY(db, "event", event);
|
||||||
W_SAFE_PROPERTY(db, "username", e->username);
|
W_SAFE_PROPERTY(db, "username", e->username);
|
||||||
W_SAFE_PROPERTY(db, "hostname", e->hostname);
|
W_SAFE_PROPERTY(db, "hostname", e->hostname);
|
||||||
W_SAFE_PROPERTY(db, "ip", e->ip);
|
W_SAFE_PROPERTY(db, "ip", e->ip);
|
||||||
@@ -393,7 +399,8 @@ int write_whowas_entry(UnrealDB *db, const char *tmpfname, WhoWas *e)
|
|||||||
safe_free(hostname); \
|
safe_free(hostname); \
|
||||||
safe_free(ip); \
|
safe_free(ip); \
|
||||||
safe_free(realname); \
|
safe_free(realname); \
|
||||||
logofftime = 0; \
|
logontime = logofftime = 0; \
|
||||||
|
event = 0; \
|
||||||
safe_free(server); \
|
safe_free(server); \
|
||||||
safe_free(virthost); \
|
safe_free(virthost); \
|
||||||
safe_free(account); \
|
safe_free(account); \
|
||||||
@@ -424,7 +431,9 @@ int read_whowasdb(void)
|
|||||||
char *hostname = NULL;
|
char *hostname = NULL;
|
||||||
char *ip = NULL;
|
char *ip = NULL;
|
||||||
char *realname = NULL;
|
char *realname = NULL;
|
||||||
|
long long logontime = 0;
|
||||||
long long logofftime = 0;
|
long long logofftime = 0;
|
||||||
|
int event = 0;
|
||||||
char *server = NULL;
|
char *server = NULL;
|
||||||
char *virthost = NULL;
|
char *virthost = NULL;
|
||||||
char *account = NULL;
|
char *account = NULL;
|
||||||
@@ -482,7 +491,8 @@ int read_whowasdb(void)
|
|||||||
// Variables
|
// Variables
|
||||||
key = value = NULL;
|
key = value = NULL;
|
||||||
nick = username = hostname = ip = realname = virthost = account = server = NULL;
|
nick = username = hostname = ip = realname = virthost = account = server = NULL;
|
||||||
logofftime = 0;
|
logontime = logofftime = 0;
|
||||||
|
event = 0;
|
||||||
|
|
||||||
R_SAFE(unrealdb_read_int32(db, &magic));
|
R_SAFE(unrealdb_read_int32(db, &magic));
|
||||||
if (magic != MAGIC_WHOWASDB_START)
|
if (magic != MAGIC_WHOWASDB_START)
|
||||||
@@ -495,26 +505,55 @@ int read_whowasdb(void)
|
|||||||
R_SAFE(unrealdb_read_str(db, &key));
|
R_SAFE(unrealdb_read_str(db, &key));
|
||||||
R_SAFE(unrealdb_read_str(db, &value));
|
R_SAFE(unrealdb_read_str(db, &value));
|
||||||
if (!strcmp(key, "nick"))
|
if (!strcmp(key, "nick"))
|
||||||
|
{
|
||||||
nick = value;
|
nick = value;
|
||||||
else if (!strcmp(key, "username"))
|
} else
|
||||||
|
if (!strcmp(key, "username"))
|
||||||
|
{
|
||||||
username = value;
|
username = value;
|
||||||
else if (!strcmp(key, "hostname"))
|
} else
|
||||||
|
if (!strcmp(key, "hostname"))
|
||||||
|
{
|
||||||
hostname = value;
|
hostname = value;
|
||||||
else if (!strcmp(key, "ip"))
|
} else
|
||||||
|
if (!strcmp(key, "ip"))
|
||||||
|
{
|
||||||
ip = value;
|
ip = value;
|
||||||
else if (!strcmp(key, "realname"))
|
} else
|
||||||
|
if (!strcmp(key, "realname"))
|
||||||
|
{
|
||||||
realname = value;
|
realname = value;
|
||||||
else if (!strcmp(key, "logofftime"))
|
} else
|
||||||
|
if (!strcmp(key, "logontime"))
|
||||||
|
{
|
||||||
|
logontime = atoll(value);
|
||||||
|
safe_free(value);
|
||||||
|
} else
|
||||||
|
if (!strcmp(key, "logofftime"))
|
||||||
{
|
{
|
||||||
logofftime = atoll(value);
|
logofftime = atoll(value);
|
||||||
safe_free(value);
|
safe_free(value);
|
||||||
} else if (!strcmp(key, "server"))
|
} else
|
||||||
|
if (!strcmp(key, "event"))
|
||||||
|
{
|
||||||
|
event = atoi(value);
|
||||||
|
if ((event < WHOWAS_LOWEST_EVENT) || (event > WHOWAS_HIGHEST_EVENT))
|
||||||
|
event = WHOWAS_EVENT_QUIT; /* safety */
|
||||||
|
safe_free(value);
|
||||||
|
} else
|
||||||
|
if (!strcmp(key, "server"))
|
||||||
|
{
|
||||||
server = value;
|
server = value;
|
||||||
else if (!strcmp(key, "virthost"))
|
} else
|
||||||
|
if (!strcmp(key, "virthost"))
|
||||||
|
{
|
||||||
virthost = value;
|
virthost = value;
|
||||||
else if (!strcmp(key, "account"))
|
} else
|
||||||
|
if (!strcmp(key, "account"))
|
||||||
|
{
|
||||||
account = value;
|
account = value;
|
||||||
else if (!strcmp(key, "end"))
|
} else
|
||||||
|
if (!strcmp(key, "end"))
|
||||||
{
|
{
|
||||||
safe_free(key);
|
safe_free(key);
|
||||||
safe_free(value);
|
safe_free(value);
|
||||||
@@ -546,7 +585,9 @@ int read_whowasdb(void)
|
|||||||
"[whowasdb] Adding '$nick'...",
|
"[whowasdb] Adding '$nick'...",
|
||||||
log_data_string("nick", nick));
|
log_data_string("nick", nick));
|
||||||
e->hashv = hash_whowas_name(nick);
|
e->hashv = hash_whowas_name(nick);
|
||||||
|
e->logon = logontime;
|
||||||
e->logoff = logofftime;
|
e->logoff = logofftime;
|
||||||
|
e->event = event;
|
||||||
safe_strdup(e->name, nick);
|
safe_strdup(e->name, nick);
|
||||||
safe_strdup(e->username, username);
|
safe_strdup(e->username, username);
|
||||||
safe_strdup(e->hostname, hostname);
|
safe_strdup(e->hostname, hostname);
|
||||||
|
|||||||
+19
@@ -737,6 +737,25 @@ int hide_idle_time(Client *client, Client *target)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Get creation time of a client.
|
||||||
|
* @param client The client to check (user, server, anything)
|
||||||
|
* @returns the time when the client first connected to IRC, or 0 for unknown.
|
||||||
|
*/
|
||||||
|
time_t get_creationtime(Client *client)
|
||||||
|
{
|
||||||
|
const char *str;
|
||||||
|
|
||||||
|
/* Shortcut for local clients */
|
||||||
|
if (client->local)
|
||||||
|
return client->local->creationtime;
|
||||||
|
|
||||||
|
/* Otherwise, hopefully available through this... */
|
||||||
|
str = moddata_client_get(client, "creationtime");
|
||||||
|
if (!BadPtr(str) && (*str != '0'))
|
||||||
|
return atoll(str);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/** Get how long a client is connected to IRC.
|
/** Get how long a client is connected to IRC.
|
||||||
* @param client The client to check
|
* @param client The client to check
|
||||||
* @returns how long the client is connected to IRC (number of seconds)
|
* @returns how long the client is connected to IRC (number of seconds)
|
||||||
|
|||||||
+11
-3
@@ -43,15 +43,21 @@ void free_whowas_fields(WhoWas *e)
|
|||||||
safe_free(e->account);
|
safe_free(e->account);
|
||||||
safe_free(e->ip);
|
safe_free(e->ip);
|
||||||
e->servername = NULL;
|
e->servername = NULL;
|
||||||
|
e->event = 0;
|
||||||
|
e->logon = 0;
|
||||||
|
e->logoff = 0;
|
||||||
|
|
||||||
|
/* Remove from lists and reset hashv */
|
||||||
if (e->online)
|
if (e->online)
|
||||||
del_whowas_from_clist(&(e->online->user->whowas), e);
|
del_whowas_from_clist(&(e->online->user->whowas), e);
|
||||||
del_whowas_from_list(&WHOWASHASH[e->hashv], e);
|
del_whowas_from_list(&WHOWASHASH[e->hashv], e);
|
||||||
|
e->hashv = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void create_whowas_entry(Client *client, WhoWas *e)
|
void create_whowas_entry(Client *client, WhoWas *e, WhoWasEvent event)
|
||||||
{
|
{
|
||||||
e->hashv = hash_whowas_name(client->name);
|
e->hashv = hash_whowas_name(client->name);
|
||||||
|
e->logon = client->lastnick;
|
||||||
e->logoff = TStime();
|
e->logoff = TStime();
|
||||||
e->umodes = client->umodes;
|
e->umodes = client->umodes;
|
||||||
safe_strdup(e->name, client->name);
|
safe_strdup(e->name, client->name);
|
||||||
@@ -72,9 +78,11 @@ void create_whowas_entry(Client *client, WhoWas *e)
|
|||||||
*/
|
*/
|
||||||
/* strlcpy(e->servername, client->user->server,HOSTLEN); */
|
/* strlcpy(e->servername, client->user->server,HOSTLEN); */
|
||||||
e->servername = client->user->server;
|
e->servername = client->user->server;
|
||||||
|
|
||||||
|
e->event = event;
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_history(Client *client, int online)
|
void add_history(Client *client, int online, WhoWasEvent event)
|
||||||
{
|
{
|
||||||
WhoWas *new;
|
WhoWas *new;
|
||||||
|
|
||||||
@@ -83,7 +91,7 @@ void add_history(Client *client, int online)
|
|||||||
if (new->hashv != -1)
|
if (new->hashv != -1)
|
||||||
free_whowas_fields(new);
|
free_whowas_fields(new);
|
||||||
|
|
||||||
create_whowas_entry(client, new);
|
create_whowas_entry(client, new, event);
|
||||||
|
|
||||||
if (online)
|
if (online)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user