1
0
mirror of https://github.com/unrealircd/unrealircd.git synced 2026-07-08 11:03:13 +02:00

Make MODE #channel +F show the combined effective view of +f and +F.

Actually it accepts the following variations for this query:
MODE #test f
MODE #test +f
MODE #test F
MODE #test +F
As long as it is like that (with no parameter) we will show details.
Details are shown for all of the four possible combinations of having
or not having +f and +F.

For example "+F normal" and "+f [1k,20t]:10" result in this output:

Channel '#test' uses flood profile 'normal', without action(s) 'k' as they are overridden by +f.
Effective flood setting via +F: '[7c#C15,30j#R10,40m#M10,10n#N15]:15'
Plus flood setting via +f: '[1k,20t]:10'
-
List of available flood profiles for +F:
         none: []:0
 very-relaxed: [7c#C15,60j#R10,10k#K15,90m#M10,10n#N15]:15
      relaxed: [7c#C15,45j#R10,10k#K15,60m#M10,10n#N15]:15
       normal: [7c#C15,30j#R10,10k#K15,40m#M10,10n#N15]:15
       strict: [7c#C15,15j#R10,10k#K15,40m#M10,10n#N15]:15
  very-strict: [7c#C15,10j#R10,10k#K15,30m#M10,10n#N15]:15
See also https://www.unrealircd.org/docs/Channel_anti-flood_settings
This commit is contained in:
Bram Matthys
2023-03-26 17:16:14 +02:00
parent 67f61e7444
commit ccd9fc4b25
+48 -12
View File
@@ -903,6 +903,7 @@ void floodprot_show_profiles(Client *client)
fld->settings.profile,
buf);
}
sendnotice(client, "See also https://www.unrealircd.org/docs/Channel_anti-flood_settings");
}
int cmodef_profile_is_ok(Client *client, Channel *channel, char mode, const char *param, int type, int what)
@@ -1796,7 +1797,7 @@ CMD_OVERRIDE_FUNC(floodprot_override_mode)
{
/* Query (not set!) request for #channel */
Channel *channel = find_channel(parv[1]);
ChannelFloodProtection *fld;
ChannelFloodProtection *profile, *advanced;
char buf[512];
if (!channel)
@@ -1804,22 +1805,57 @@ CMD_OVERRIDE_FUNC(floodprot_override_mode)
sendnumeric(client, ERR_NOSUCHCHANNEL, parv[1]);
return;
}
#if 0
// FIXME: show both +f and +F if they are both set, on different lines as they have different 'per'
fld = get_channel_flood_settings(channel);
if (!fld)
advanced = (ChannelFloodProtection *)GETPARASTRUCT(channel, 'f');
profile = (ChannelFloodProtection *)GETPARASTRUCT(channel, 'F');
if (!advanced && !profile)
{
sendnotice(client, "No channel mode +f/+F is active on %s", channel->name);
} else
if (advanced && !profile)
{
channel_modef_string(advanced, buf);
sendnotice(client, "Channel '%s' has effective flood setting '%s' (custom settings via +f)",
channel->name, buf);
} else
if (profile && !advanced)
{
channel_modef_string(profile, buf);
sendnotice(client, "Channel '%s' has effective flood setting '%s' (flood profile '%s')",
channel->name, buf, profile->profile);
} else {
channel_modef_string(fld, buf);
if (fld->profile)
/* Both +f and +F are set */
int v;
ChannelFloodProtection mix;
FloodType *t;
char overridden[64];
*overridden = '\0';
memcpy(&mix, profile, sizeof(mix));
for (v=0; v < NUMFLD; v++)
{
if ((advanced->limit[v]>0) && (mix.limit[v]>0))
{
mix.limit[v] = 0;
mix.action[v] = 0;
t = find_floodprot_by_index(v);
if (t)
strlcat_letter(overridden, t->letter, sizeof(overridden));
}
}
channel_modef_string(&mix, buf);
if (*overridden)
{
sendnotice(client, "Channel '%s' uses flood profile '%s', without action(s) '%s' as they are overridden by +f.",
channel->name, profile->profile, overridden);
sendnotice(client, "Effective flood setting via +F: '%s'", buf);
} else {
sendnotice(client, "Channel '%s' has effective flood setting '%s' (flood profile '%s')",
channel->name, buf, fld->profile);
else
sendnotice(client, "Channel '%s' has effective flood setting '%s' (custom settings via +f)",
channel->name, buf);
channel->name, buf, profile->profile);
}
channel_modef_string(advanced, buf);
sendnotice(client, "Plus flood setting via +f: '%s'", buf);
}
#endif
sendnotice(client, "-");
floodprot_show_profiles(client);
return;
}