pissircd/src/modules/creationtime.c

101 lines
2.2 KiB
C

/*
* Store creationtime in ModData
* (C) Copyright 2022-.. Syzop and The UnrealIRCd Team
* License: GPLv2 or later
*/
#include "unrealircd.h"
ModuleHeader MOD_HEADER
= {
"creationtime",
"6.1",
"Store and retrieve creation time of clients",
"UnrealIRCd Team",
"unrealircd-6",
};
/* Forward declarations */
void creationtime_free(ModData *m);
const char *creationtime_serialize(ModData *m);
void creationtime_unserialize(const char *str, ModData *m);
int creationtime_handshake(Client *client);
int creationtime_welcome_user(Client *client, int numeric);
int creationtime_whois(Client *client, Client *target);
ModDataInfo *creationtime_md; /* Module Data structure which we acquire */
#define SetCreationTime(x,y) do { moddata_client(x, creationtime_md).ll = y; } while(0)
MOD_INIT()
{
ModDataInfo mreq;
MARK_AS_OFFICIAL_MODULE(modinfo);
memset(&mreq, 0, sizeof(mreq));
mreq.name = "creationtime";
mreq.free = creationtime_free;
mreq.serialize = creationtime_serialize;
mreq.unserialize = creationtime_unserialize;
mreq.self_write = 1;
mreq.sync = MODDATA_SYNC_EARLY;
mreq.type = MODDATATYPE_CLIENT;
creationtime_md = ModDataAdd(modinfo->handle, mreq);
if (!creationtime_md)
abort();
/* This event sets creationtime very early: on handshake in and out */
HookAdd(modinfo->handle, HOOKTYPE_HANDSHAKE, 0, creationtime_handshake);
HookAdd(modinfo->handle, HOOKTYPE_SERVER_HANDSHAKE_OUT, 0, creationtime_handshake);
/* And this event (re)sets it because that also happens in
* welcome_user() in nick.c regarding #2174
*/
HookAdd(modinfo->handle, HOOKTYPE_WELCOME, 0, creationtime_welcome_user);
return MOD_SUCCESS;
}
MOD_LOAD()
{
return MOD_SUCCESS;
}
MOD_UNLOAD()
{
return MOD_SUCCESS;
}
int creationtime_handshake(Client *client)
{
SetCreationTime(client, client->local->creationtime);
return 0;
}
int creationtime_welcome_user(Client *client, int numeric)
{
if (numeric == 0)
SetCreationTime(client, client->local->creationtime);
return 0;
}
void creationtime_free(ModData *m)
{
m->ll = 0;
}
const char *creationtime_serialize(ModData *m)
{
static char buf[64];
snprintf(buf, sizeof(buf), "%lld", (long long)m->ll);
return buf;
}
void creationtime_unserialize(const char *str, ModData *m)
{
m->ll = atoll(str);
}