From 31bbcbe18c345c8dffce9fe5fda49159dd807c8f Mon Sep 17 00:00:00 2001 From: cyan <> Date: Thu, 10 Aug 2006 05:56:06 +0000 Subject: [PATCH] * This is a complete redesign of WHOWAS that is *much* more efficient. --- exec/ircd.js | 9 +++--- exec/load/ircd_user.js | 62 +++++++++++++++++++++--------------------- 2 files changed, 36 insertions(+), 35 deletions(-) diff --git a/exec/ircd.js b/exec/ircd.js index 1748333c12..4b3ce89f9d 100644 --- a/exec/ircd.js +++ b/exec/ircd.js @@ -112,10 +112,11 @@ hcc_users = 0; hcc_counter = 0; server_uptime = time(); -WhoWasHistory = new Object; +WhoWas = new Object; /* Stores uppercase nicks */ +WhoWasMap = new Array; /* A true push/pop array pointing to WhoWas entries */ +WhoWas_Buffer = 1000; /* Maximum number of WhoWas entries to keep track of */ + NickHistory = new Array; /* A true array using push and pop */ -whowas_buffer = 1000; -whowas_pointer = 0; nick_buffer = 1000; nick_pointer = 0; @@ -2922,7 +2923,7 @@ function ZLine(ipmask,reason) { this.reason = reason; } -function WhoWas(nick,uprefix,host,realname,server,serverdesc) { +function WhoWasObj(nick,uprefix,host,realname,server,serverdesc) { this.nick = nick; this.uprefix = uprefix; this.host = host; diff --git a/exec/load/ircd_user.js b/exec/load/ircd_user.js index 62bfa9934d..fd3fdc62d8 100644 --- a/exec/load/ircd_user.js +++ b/exec/load/ircd_user.js @@ -1346,29 +1346,16 @@ function User_Work() { this.numeric(431, ":No nickname given."); break; } - var firstnick=""; - var aWhoWas; - var ww_nick_uc = cmd[1].toUpperCase(); - for (aWhoWas=whowas_pointer;aWhoWas>=0;aWhoWas--) { - var wwh = WhoWasHistory[aWhoWas]; - if (wwh && (wwh.ucnick == ww_nick_uc)) { - this.numeric(314,wwh.nick + " " + wwh.uprefix + " " + wwh.host - + " * :" + wwh.realname); - this.numeric(312,wwh.nick + " " + wwh.server + " :" - + wwh.serverdesc); - if (!firstnick) - firstnick = wwh.nick; - } - } - for (aWhoWas=whowas_buffer;aWhoWas>=whowas_pointer;aWhoWas--) { - var wwh = WhoWasHistory[aWhoWas]; - if (wwh && (wwh.ucnick == ww_nick_uc)) { - this.numeric(314,wwh.nick + " " + wwh.uprefix + " " + wwh.host - + " * :" + wwh.realname); - this.numeric(312,wwh.nick + " " + wwh.server + " :" - + wwh.serverdesc); - if (!firstnick) - firstnick = wwh.nick; + var ww = WhoWas[cmd[1].toUpperCase()]; + var firstnick; + if (ww) { + for (e in ww) { + this.numeric(314,ww[e].nick + " " + ww[e].uprefix + " " + + ww[e].host + " * :" + ww[e].realname); + this.numeric(312,ww[e].nick + " " + ww[e].server + " :" + + ww[e].serverdesc); + if(!firstnick) + firstnick = ww[e].nick; } } if (!firstnick) { @@ -1476,15 +1463,28 @@ function User_Quit(str,suppress_bcast,is_netsplit,origin) { for(thisChannel in this.channels) { this.rmchan(this.channels[thisChannel]); } - if (whowas_pointer >= whowas_buffer) - whowas_pointer = 0; - if (!this.parent) - ww_serverdesc = serverdesc; - else + + var ww_serverdesc = serverdesc; + if (this.parent) ww_serverdesc = Servers[this.parent.toLowerCase()].info; - WhoWasHistory[whowas_pointer] = new WhoWas(this.nick,this.uprefix, - this.hostname,this.realname,this.servername,ww_serverdesc); - whowas_pointer++; + + var nick_uc = this.nick.toUpperCase(); + if (!WhoWas[nick_uc]) + WhoWas[nick_uc] = new Array; + var ww = WhoWas[nick_uc]; + + var ptr = ww.unshift(new WhoWasObj(this.nick, this.uprefix, this.hostname, + this.realname, this.servername, ww_serverdesc)) - 1; + WhoWasMap.unshift(ww[ptr]); + + if (WhoWasMap.length > WhoWas_Buffer) { + var ww_pop = WhoWasMap.pop(); + var ww_obj = WhoWas[ww_pop.nick.toUpperCase()]; + ww_obj.pop(); + if (!ww_obj.length) + delete WhoWas[ww_pop.nick.toUpperCase()]; + } + if (!suppress_bcast) this.bcast_to_servers(tmp); -- GitLab