diff options
author | robbeh <robbeh@5417fbe8-f217-4b02-8779-1006273d7864> | 2009-03-07 17:45:11 +0000 |
---|---|---|
committer | robbeh <robbeh@5417fbe8-f217-4b02-8779-1006273d7864> | 2009-03-07 17:45:11 +0000 |
commit | f98a3a85d688c40640c4821ae50a6728037a43a8 (patch) | |
tree | 1255d89a9ab2e48ae65e74d9c99ede5105185b04 | |
parent | ef83568646877868ebdda2a20409fe14b97959f7 (diff) |
Applied adams patch for re-ordering lists
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/stable@2145 5417fbe8-f217-4b02-8779-1006273d7864
-rw-r--r-- | Changes | 3 | ||||
-rw-r--r-- | src/core/cs_access.c | 40 | ||||
-rw-r--r-- | src/core/cs_xop.c | 25 |
3 files changed, 67 insertions, 1 deletions
@@ -12,7 +12,8 @@ Provided by mooncup <mooncup@anonnet.org> - 2009 02/04 F Automatically reapply vhost on hs off for unreal32. [ #00] Provided by Adam <Adam@SubZeroIRC.net> - 2009 -01/28 F Added internal support for +j channelmodes. [#1001] +07/03 F Channel list re-ordering. [#1024] +01/28 F Added internal support for +j channelmodes. [#1001] Anope Version 1.8.0 ------------------- diff --git a/src/core/cs_access.c b/src/core/cs_access.c index e8fe5f788..a06051c7a 100644 --- a/src/core/cs_access.c +++ b/src/core/cs_access.c @@ -279,6 +279,25 @@ int do_access(User * u) return MOD_CONT; } + for (b = 0; b < ci->accesscount; b++) { + if (ci->access[b].in_use) { + for (a = 0; a < ci->accesscount; a++) { + if (a > b) + break; + if (!ci->access[a].in_use) { + ci->access[a].in_use = 1; + ci->access[a].level = ci->access[b].level; + ci->access[a].nc = ci->access[b].nc; + ci->access[a].last_seen = + ci->access[b].last_seen; + ci->access[b].nc = NULL; + ci->access[b].in_use = 0; + break; + } + } + } + } + /* Special case: is it a number/list? Only do search if it isn't. */ if (isdigit(*nick) && strspn(nick, "1234567890,-") == strlen(nick)) { int count, last = -1, perm = 0; @@ -372,11 +391,32 @@ int do_access(User * u) } } else if (stricmp(cmd, "LIST") == 0) { int sent_header = 0; + int a, b; if (ci->accesscount == 0) { notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_EMPTY, chan); return MOD_CONT; } + + for (b = 0; b < ci->accesscount; b++) { + if (ci->access[b].in_use) { + for (a = 0; a < ci->accesscount; a++) { + if (a > b) + break; + if (!ci->access[a].in_use) { + ci->access[a].in_use = 1; + ci->access[a].level = ci->access[b].level; + ci->access[a].nc = ci->access[b].nc; + ci->access[a].last_seen = + ci->access[b].last_seen; + ci->access[b].nc = NULL; + ci->access[b].in_use = 0; + break; + } + } + } + } + if (nick && strspn(nick, "1234567890,-") == strlen(nick)) { process_numlist(nick, NULL, access_list_callback, u, ci, &sent_header); diff --git a/src/core/cs_xop.c b/src/core/cs_xop.c index 6b31cee5c..eb226c1bd 100644 --- a/src/core/cs_xop.c +++ b/src/core/cs_xop.c @@ -477,6 +477,9 @@ int do_xop(User * u, char *xname, int xlev, int *xmsgs) if (!sent_header) notice_lang(s_ChanServ, u, xmsgs[7], chan); } else if (stricmp(cmd, "CLEAR") == 0) { + uint16 j = 0; + int a, b; + if (readonly) { notice_lang(s_ChanServ, u, CHAN_ACCESS_DISABLED); return MOD_CONT; @@ -496,9 +499,31 @@ int do_xop(User * u, char *xname, int xlev, int *xmsgs) if (ci->access[i].in_use && ci->access[i].level == xlev) { ci->access[i].nc = NULL; ci->access[i].in_use = 0; + j++; } } + for (b = 0; b < ci->accesscount; b++) { + if (ci->access[b].in_use) { + for (a = 0; a < ci->accesscount; a++) { + if (a > b) + break; + if (!ci->access[a].in_use) { + ci->access[a].in_use = 1; + ci->access[a].level = ci->access[b].level; + ci->access[a].nc = ci->access[b].nc; + ci->access[a].last_seen = + ci->access[b].last_seen; + ci->access[b].nc = NULL; + ci->access[b].in_use = 0; + break; + } + } + } + } + + ci->accesscount = ci->accesscount - j; + send_event(EVENT_ACCESS_CLEAR, 2, ci->name, u->nick); notice_lang(s_ChanServ, u, xmsgs[13], ci->name); |