summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrobbeh <robbeh@5417fbe8-f217-4b02-8779-1006273d7864>2009-03-07 17:45:11 +0000
committerrobbeh <robbeh@5417fbe8-f217-4b02-8779-1006273d7864>2009-03-07 17:45:11 +0000
commitf98a3a85d688c40640c4821ae50a6728037a43a8 (patch)
tree1255d89a9ab2e48ae65e74d9c99ede5105185b04 /src
parentef83568646877868ebdda2a20409fe14b97959f7 (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
Diffstat (limited to 'src')
-rw-r--r--src/core/cs_access.c40
-rw-r--r--src/core/cs_xop.c25
2 files changed, 65 insertions, 0 deletions
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);