diff options
author | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2007-01-09 00:25:18 +0000 |
---|---|---|
committer | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2007-01-09 00:25:18 +0000 |
commit | be70931a50f23c68e055602facce5736775f3fab (patch) | |
tree | 5ab53e604456abb30bcb06185bd09414117d4943 /src/channels.cpp | |
parent | 7a9d31a46328de9c12e09c6f5620d39251efdf34 (diff) |
Cache channel max bans value to save an O(n) loop of match() on every ban (etc) add
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@6267 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/channels.cpp')
-rw-r--r-- | src/channels.cpp | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/channels.cpp b/src/channels.cpp index 4aea42ac8..4b1bc5309 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -22,7 +22,7 @@ chanrec::chanrec(InspIRCd* Instance) : ServerInstance(Instance) { *name = *topic = *setby = *key = 0; - created = topicset = limit = 0; + maxbans = created = topicset = limit = 0; memset(&modes,0,64); age = ServerInstance->Time(true); } @@ -870,16 +870,29 @@ void chanrec::UserList(userrec *user) long chanrec::GetMaxBans() { + /* Return the cached value if there is one */ + if (this->maxbans) + return this->maxbans; + + /* If there isnt one, we have to do some O(n) hax to find it the first time. (ick) */ for (std::map<std::string,int>::iterator n = ServerInstance->Config->maxbans.begin(); n != ServerInstance->Config->maxbans.end(); n++) { if (match(this->name,n->first.c_str())) { + this->maxbans = n->second; return n->second; } } - return 64; + + /* Screw it, just return the default of 64 */ + this->maxbans = 64; + return this->maxbans; } +void chanrec::ResetMaxBans() +{ + this->maxbans = 0; +} /* returns the status character for a given user on a channel, e.g. @ for op, * % for halfop etc. If the user has several modes set, the highest mode |