Hello, I believe to have found some bugs with GroupLimits.
In OnTurretAuthorize, after clearing/removing entries from turret.authorizedPlayers, the method never calls turret.SendNetworkUpdate(). Both OnCupboardAuthorize and OnCodeEntered call the equivalent sync method right after their mutations.
Fix. Add this after the removal block but before Notify ()
turret.SendNetworkUpdate();
NotifyDiscord builds the embed by .Replace()-ing placeholder tokens directly into an already-serialized JSON template string (_webhookBodyCached). Since the substituted values (player display names, config strings) are inserted after serialization, any name/string containing ", \, or a newline produces invalid JSON, and the webhook silently fails (only visible via the console warning). Rust display names are player-controlled, so this is easy to trigger unintentionally.
Fix build the values first as plain strings, then construct the payload as a real anonymous object and call JsonConvert.SerializeObject once, so Newtonsoft handles escaping:
{
embeds = new[]
{
new
{
title = discord.Title,
color = discord.Color,
fields = new[]
{
new { name = discord.PlayerTitle, value = playerValue, inline = discord.Inline },
new { name = discord.AuthedTitle, value = authedValue, inline = discord.Inline },
new { name = discord.EntityTitle, value = entityValue, inline = discord.Inline },
new { name = discord.PositionTitle, value = positionValue, inline = discord.Inline }
}
}
}
};
var body = JsonConvert.SerializeObject(payload, Formatting.None);