1
0
mirror of https://github.com/unrealircd/unrealircd.git synced 2026-06-12 17:14:46 +02:00

Pass the fake lag added msec in ClientContext and add subtract_fake_lag()

This commit is contained in:
Bram Matthys
2026-03-27 07:46:29 +01:00
parent f329a64991
commit eb798510fd
3 changed files with 38 additions and 4 deletions
+1
View File
@@ -1450,6 +1450,7 @@ extern void memory_log_add_message(time_t t, LogLevel loglevel, const char *subs
extern EVENT(memory_log_cleaner);
/* end of logging */
extern void add_fake_lag(Client *client, long msec);
extern void subtract_fake_lag(Client *client, long msec);
extern char *prefix_with_extban(const char *remainder, BanContext *b, Extban *extban, char *buf, size_t buflen);
extern GeoIPResult *geoip_client(Client *client);
extern GeoIPResult *geoip_lookup(const char *ip);
+1
View File
@@ -935,6 +935,7 @@ typedef struct TextAnalysis {
typedef struct ClientContext {
RealCommand *cmd; /**< Command handler (eg. cmd->command is the command name) */
TextAnalysis *textanalysis; /**< Analysis of text (can be NULL, eg for non-PRIVMSG/NOTICE or remote clients) */
long fake_lag_added_msec; /**< Fake lag (in msec) added by parse_addlag() for this command */
} ClientContext;
/** The command API - used by modules and the core to add commands, overrides, etc.
+36 -4
View File
@@ -33,7 +33,7 @@ static int do_numeric(int, Client *, MessageTag *, int, const char **);
static void cancel_clients(Client *, Client *, char *);
static void remove_unknown(Client *, char *);
static void parse2(Client *client, Client **fromptr, MessageTag *mtags, int mtags_bytes, char *ch);
static void parse_addlag(Client *client, int command_bytes, int mtags_bytes);
static long parse_addlag(Client *client, int command_bytes, int mtags_bytes);
static int client_lagged_up(Client *client);
static void ban_handshake_data_flooder(Client *client);
@@ -267,6 +267,7 @@ static void parse2(Client *cptr, Client **fromptr, MessageTag *mtags, int mtags_
ClientContext clictx;
TextAnalysis text_analysis_storage;
int bytes;
long lag_added = 0;
*fromptr = cptr; /* The default, unless a source is specified (and permitted) */
@@ -407,7 +408,7 @@ static void parse2(Client *cptr, Client **fromptr, MessageTag *mtags, int mtags_
if (!cmptr || !(cmptr->flags & CMD_NOLAG))
{
/* Add fake lag (doing this early in the code, so we don't forget) */
parse_addlag(cptr, bytes, mtags_bytes);
lag_added = parse_addlag(cptr, bytes, mtags_bytes);
}
if (!cmptr)
{
@@ -555,6 +556,7 @@ static void parse2(Client *cptr, Client **fromptr, MessageTag *mtags, int mtags_
/* Create client context */
memset(&clictx, 0, sizeof(clictx));
clictx.cmd = cmptr;
clictx.fake_lag_added_msec = lag_added;
if ((cmptr->flags & CMD_TEXTANALYSIS) && MyUser(from) && (i>1))
{
memset(&text_analysis_storage, 0, sizeof(text_analysis_storage));
@@ -634,7 +636,7 @@ static void ban_handshake_data_flooder(Client *client)
* @param command_bytes Command length in bytes (excluding message tagss)
* @param mtags_bytes Length of message tags in bytes
*/
void parse_addlag(Client *client, int command_bytes, int mtags_bytes)
long parse_addlag(Client *client, int command_bytes, int mtags_bytes)
{
if (!IsServer(client) && !IsNoFakeLag(client) &&
#ifdef FAKELAG_CONFIGURABLE
@@ -645,15 +647,19 @@ void parse_addlag(Client *client, int command_bytes, int mtags_bytes)
FloodSettings *settings = get_floodsettings_for_user(client, FLD_LAG_PENALTY);
int lag_penalty = settings->period[FLD_LAG_PENALTY];
int lag_penalty_bytes = settings->limit[FLD_LAG_PENALTY];
long msec = (1 + (command_bytes/lag_penalty_bytes) + (mtags_bytes/lag_penalty_bytes)) * lag_penalty;
client->local->fake_lag_msec += (1 + (command_bytes/lag_penalty_bytes) + (mtags_bytes/lag_penalty_bytes)) * lag_penalty;
client->local->fake_lag_msec += msec;
/* This code takes into account not only the msecs we just calculated
* but also any leftover msec from previous lagging up.
*/
client->local->fake_lag += (client->local->fake_lag_msec / 1000);
client->local->fake_lag_msec = client->local->fake_lag_msec % 1000;
return msec;
}
return 0;
}
/* Add extra fake lag to client, such as after a failed oper attempt.
@@ -668,6 +674,32 @@ void add_fake_lag(Client *client, long msec)
client->local->fake_lag_msec = client->local->fake_lag_msec % 1000;
}
/** Subtract fake lag from client.
* This is the counterpart to add_fake_lag() and is used by modules
* that need to undo fake lag that was added by parse_addlag(),
* for example when buffering lines in a multiline batch.
*/
void subtract_fake_lag(Client *client, long msec)
{
long total;
if (!MyConnect(client))
return;
total = client->local->fake_lag_msec - msec;
if (total >= 0)
{
client->local->fake_lag_msec = (int)total;
}
else
{
/* Readjust to whole seconds */
long secs = (-total + 999) / 1000;
client->local->fake_lag -= secs;
client->local->fake_lag_msec = (int)(total + secs * 1000);
}
}
/** Returns 1 if the client is lagged up and data should NOT be parsed.
* See also parse_addlag() for more information on "fake lag".
* @param client The client to check