+
+ data << "<DIV ID='TOTALS'>";
+ data << "<H2>Totals</H2>";
+ data << "<TABLE>";
+ data << "<TR><TD>Users</TD><TD>" << clientlist.size() << "</TD></TR>";
+ data << "<TR><TD>Channels</TD><TD>" << chanlist.size() << "</TD></TR>";
+ data << "<TR><TD>Opers</TD><TD>" << all_opers.size() << "</TD></TR>";
+ data << "<TR><TD>Sockets</TD><TD>" << (ServerInstance->SE->GetMaxFds() - ServerInstance->SE->GetRemainingFds()) << " (Max: " << ServerInstance->SE->GetMaxFds() << " via socket engine '" << ServerInstance->SE->GetName() << "')</TD></TR>";
+ data << "</TABLE>";
+ data << "</DIV>";
+
+ data << "<DIV ID='MODULES'>";
+ data << "<H2>Modules</H2>";
+ data << "<TABLE>";
+ for (int i = 0; i <= MODCOUNT; i++)
+ {
+ if (Config->module_names[i] != "")
+ data << "<TR><TD>" << Config->module_names[i] << "</TD></TR>";
+ }
+ data << "</TABLE>";
+ data << "</DIV>";
+
+ data << "<DIV ID='CHANNELS'>";
+ data << "<H2>Channels</H2>";
+ data << "<TABLE>";
+ data << "<TR><TH>Users</TH><TH>Name</TH><TH>@</TH><TH>%</TH><TH>+</TH></TR>";
+
+ /* If the list has changed since last time it was displayed, re-sort it
+ * this time only (not every time, as this would be moronic)
+ */
+ if (this->changed)
+ this->SortList();
+
+ int n = 0;
+ for (SortedIter a = so->begin(); ((a != so->end()) && (n < 25)); a++, n++)
+ {
+ chanrec* c = Srv->FindChannel(a->second.c_str());
+ if (c)
+ {
+ data << "<TR><TD>" << a->first << "</TD><TD>" << a->second << "</TD>";
+ data << "<TD>" << c->GetOppedUsers()->size() << "</TD>";
+ data << "<TD>" << c->GetHalfoppedUsers()->size() << "</TD>";
+ data << "<TD>" << c->GetVoicedUsers()->size() << "</TD>";
+ data << "</TR>";
+ }
+ }
+
+ data << "</TABLE>";
+ data << "</DIV>";
+