Phase C / §5.5: so the site's moderation log is complete regardless of origin, in-game uses of the write-plane verbs are forwarded as admin.audit (origin:"in-game"). - patches/commandlogging-event.patch: adds CommandLogging.OnWrite, raised in WriteLine before the m_Enabled guard so it fires even when file logging is off. Scripts-layer file -> dynamic build, no core rebuild. - patches/BridgeModerationAudit.cs: subscriber. Taps OnWrite for resolved ban/kick (parsing the target from the log line) and EventSink.Command for [bcast. Lives in patches/ (not overlay/) because it references OnWrite, which only exists post-patch — same rule as BridgeVendorSale.cs. - tools/scaffolding/BridgeAuditProbe.cs: gated headless verification. Verified live: a genuine [bcast plus simulated ban/kick log lines produced admin.audit frames with origin=in-game, actor, and the target parsed (seed_010); a non-moderation line was correctly ignored. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0114TpmrNW4wNXsHq5CR72jQ
34 lines
1.0 KiB
Diff
34 lines
1.0 KiB
Diff
--- a/Scripts/Commands/Logging.cs
|
|
+++ b/Scripts/Commands/Logging.cs
|
|
@@ -75,16 +75,27 @@
|
|
return o;
|
|
}
|
|
|
|
+ /// <summary>
|
|
+ /// Raised for every staff command log line — even when file logging is disabled — so an
|
|
+ /// out-of-process consumer sees resolved staff actions. The uo-link bridge subscribes to
|
|
+ /// forward moderation actions (ban/kick, with the resolved target) to the website.
|
|
+ /// </summary>
|
|
+ public static event Action<Mobile, string> OnWrite;
|
|
+
|
|
public static void WriteLine(Mobile from, string format, params object[] args)
|
|
{
|
|
- if (!m_Enabled)
|
|
- return;
|
|
-
|
|
WriteLine(from, String.Format(format, args));
|
|
}
|
|
|
|
public static void WriteLine(Mobile from, string text)
|
|
{
|
|
+ var onWrite = OnWrite;
|
|
+ if (onWrite != null)
|
|
+ {
|
|
+ try { onWrite(from, text); }
|
|
+ catch { }
|
|
+ }
|
|
+
|
|
if (!m_Enabled)
|
|
return;
|
|
|