+ HTTPRequest* http = (HTTPRequest*)event->GetData();
+
+ if ((http->GetURI() == "/stats") || (http->GetURI() == "/stats/"))
+ {
+ log(DEBUG,"HTTP URL!");
+
+ data << "<HTML><HEAD>";
+ data << "<TITLE>InspIRCd server statisitics for " << Srv->GetServerName() << " (" << Srv->GetServerDescription() << ")</TITLE>";
+ data << "</HEAD><BODY>";
+ data << "<H1>InspIRCd server statisitics for " << Srv->GetServerName() << " (" << Srv->GetServerDescription() << ")</H1>";
+
+ 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>Count</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++)
+ {
+ data << "<TR><TD>" << a->first << "</TD><TD>" << a->second << "</TD></TR>";
+ }
+
+ data << "</TABLE>";
+ data << "</DIV>";
+
+
+ data << "</BODY>";
+ data << "</HTML>";
+
+ /* Send the document back to m_httpd */
+ HTTPDocument response(http->sock, &data, 200, "X-Powered-By: m_http_stats.so\r\nContent-Type: text/html\r\n");
+ Request req((char*)&response, (Module*)this, event->GetSource());
+ req.Send();
+
+ log(DEBUG,"Sent");
+ }
+ }
+ }
+
+ void OnChannelDelete(chanrec* chan)
+ {
+ StatsIter a = sh->find(chan->name);
+ if (a != sh->end())
+ {
+ sh->erase(a);
+ }
+ this->changed = true;
+ }
+
+ void OnUserJoin(userrec* user, chanrec* channel)
+ {
+ StatsIter a = sh->find(channel->name);
+ if (a != sh->end())
+ {
+ a->second++;
+ }
+ else
+ {
+ irc::string name = channel->name;
+ sh->insert(std::pair<irc::string,int>(name,1));
+ }
+ this->changed = true;
+ }