!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:") + htmlTable2(map(dm_allRulesFromRulesModuleWithCommentsAndIDs(), func(T3 t) -> SS { S ruleID = t.c; ret litorderedmap( "Rule ID" := ruleID, "Rule Text" := t.a, "Comments" := withoutLine("discord", t.b), "Feedback" := rawSelfLink("feedback/" + ruleID, toInt(feedbackStats.get(ruleID)))); }), htmlEncode := true, useBr := true, paramsByColName := litmap("Feedback" := litobjectarray(align := 'center))))); } }