From 8185b9cbe7cb505277d4d775b202892393b61cc0 Mon Sep 17 00:00:00 2001 From: brain Date: Tue, 11 Jul 2006 19:55:17 +0000 Subject: Channel size sorting with a tricksy sort that converts it on the fly from std::map to std::vector for displaying git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@4344 e03df62e-2008-0410-955e-edbf42e46eb7 --- src/modules/m_httpd_stats.cpp | 53 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/src/modules/m_httpd_stats.cpp b/src/modules/m_httpd_stats.cpp index 6367e02de..d8d71f78d 100644 --- a/src/modules/m_httpd_stats.cpp +++ b/src/modules/m_httpd_stats.cpp @@ -38,12 +38,18 @@ extern int MODCOUNT; typedef std::map StatsHash; typedef StatsHash::iterator StatsIter; + +typedef std::vector > SortedList; +typedef SortedList::iterator SortedIter; + static StatsHash* sh = new StatsHash(); +static SortedList* so = new SortedList(); class ModuleHttpStats : public Module { Server* Srv; std::string stylesheet; + bool changed; public: @@ -57,6 +63,36 @@ class ModuleHttpStats : public Module { Srv = Me; ReadConfig(); + this->changed = false; + } + + void InsertOrder(irc::string channel, int count) + { + /* This function figures out where in the sorted list to put an item from the hash */ + SortedIter a; + for (a = so->begin(); a != so->end(); a++) + { + /* Found an item equal to or less than, we insert our item before it */ + if (a->first <= count) + { + so->insert(a,std::pair(count,channel)); + return; + } + } + /* There are no items in the list yet, insert something at the beginning */ + so->insert(so->begin(), std::pair(count,channel)); + } + + void SortList() + { + /* Sorts the hash into the sorted list using an insertion sort */ + so->clear(); + for (StatsIter a = sh->begin(); a != sh->end(); a++) + { + log(DEBUG, "InsertOrder on %d %s",a->second,a->first.c_str()); + InsertOrder(a->first, a->second); + } + this->changed = false; } void OnEvent(Event* event) @@ -101,10 +137,19 @@ class ModuleHttpStats : public Module data << "

Channels

"; data << ""; data << ""; - for (StatsIter a = sh->begin(); a != sh->end(); a++) + + /* 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 << ""; + data << ""; } + data << "
UsersCount
" << a->second << "" << a->first << "
" << a->first << "" << a->second << "
"; data << ""; @@ -129,6 +174,7 @@ class ModuleHttpStats : public Module { sh->erase(a); } + this->changed = true; } void OnUserJoin(userrec* user, chanrec* channel) @@ -143,6 +189,7 @@ class ModuleHttpStats : public Module irc::string name = channel->name; sh->insert(std::pair(name,1)); } + this->changed = true; } void OnUserPart(userrec* user, chanrec* channel, const std::string &partmessage) @@ -152,6 +199,7 @@ class ModuleHttpStats : public Module { a->second--; } + this->changed = true; } void OnUserQuit(userrec* user, const std::string &message) @@ -168,6 +216,7 @@ class ModuleHttpStats : public Module } } } + this->changed = true; } char* OnRequest(Request* request) -- cgit v1.2.3