!7 cmodule GazelleWebServer > DynPrintLogAndEnabled { transient MyHTTPD server; void start() ctex { super.start(); if (!enabled) ret; server = new MyHTTPD(80); server.serveFunction = func(S uri, SS parms) { serve(uri, parms) }; server.start(); print("HTTP server started on port " + server.getPort()); } void cleanMeUp { server.stop(); server = null; } O serve(S uri, SS parms) { if (!eq(uri, "/")) ret serve404(); final Map feedbackStats = dm_gazelle_feedbackStats(); ret hhtml_head_title_body("Gazelle!", hcenter( p("Hello! " + targetBlank("https://discordapp.com/invite/SEAjPqk", "Join my Discord server!") + " Here are my rules:") + htmlTable(map(dm_allRulesFromRulesModuleWithCommentsAndIDs(), func(T3 t) -> SS { ret litorderedmap( "Rule ID" := t.c, "Rule Text" := t.a, "Comments" := withoutLine("discord", t.b), "Feedback" := toInt(feedbackStats.get(t.c))); }), true, true))); } }