- int caccess = getChannelAccess(user, chan);
- int synced_user = 0;
- struct ChanUser *chanuser;
- int sort_nicklist[] = {
- CHANUSERFLAG_OPPED | CHANUSERFLAG_HALFOPPED | CHANUSERFLAG_VOICED,
- CHANUSERFLAG_OPPED | CHANUSERFLAG_HALFOPPED,
- CHANUSERFLAG_OPPED | CHANUSERFLAG_VOICED,
- CHANUSERFLAG_OPPED,
- CHANUSERFLAG_HALFOPPED | CHANUSERFLAG_VOICED,
- CHANUSERFLAG_HALFOPPED,
- CHANUSERFLAG_VOICED,
- CHANUSERFLAG_INVISIBLE,
- 0
- };
- int *sort_pos = sort_nicklist;
- int sort_flags;
- do {
- sort_flags = *(sort_pos++);
- char statebuf[5];
- char accessbuf[9];
- int uaccess;
- int stateset = 0;
- for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) {
- if((chanuser->flags & (CHANUSERFLAG_OPPED | CHANUSERFLAG_VOICED | CHANUSERFLAG_INVISIBLE)) != sort_flags) continue;
- if(nickmask && match(nickmask, chanuser->user->nick)) continue;
- if(!stateset) {
- if((chanuser->flags & CHANUSERFLAG_INVISIBLE)) statebuf[stateset++] = '<';
- if((chanuser->flags & CHANUSERFLAG_OPPED)) statebuf[stateset++] = '@';
- if((chanuser->flags & CHANUSERFLAG_HALFOPPED)) statebuf[stateset++] = '%';
- if((chanuser->flags & CHANUSERFLAG_VOICED)) statebuf[stateset++] = '+';
- statebuf[stateset++] = '\0';
- }
- content[0] = chanuser->user->nick;
- content[1] = statebuf;
- uaccess = 0;
- if(chanuser->user->flags & USERFLAG_ISAUTHED) {
- for(i = 0; i < userlistlen; i++) {
- if(!stricmp(chanuser->user->auth, userlist[i][1])) {
- uaccess = atoi(userlist[i][0]);
- if((((chanuser->flags & CHANUSERFLAG_OPPED) && uaccess < db_enfops) || ((chanuser->flags & CHANUSERFLAG_VOICED) && uaccess < db_enfvoice)) && !isNetworkService(chanuser->user)) {
- if(syncusers) {
- if((chanuser->flags & CHANUSERFLAG_OPPED) && (db_enfops < caccess || isGodMode(user))) {
- if(db_enfops >= caccess)
- event->flags |= CMDFLAG_OPLOG;
- uaccess = db_enfops;
- } else if((chanuser->flags & CHANUSERFLAG_VOICED) && (caccess < db_enfvoice || isGodMode(user))) {
- if(db_enfvoice >= caccess)
- event->flags |= CMDFLAG_OPLOG;
- uaccess = db_enfvoice;
- } else {
- //fail...
- sprintf(accessbuf, "\00307%d\003", uaccess);
- break;
- }
- neonserv_cmd_nicklist_synchronize_user(chan, chanuser->user, uaccess);
- sprintf(accessbuf, "\00309%d\003", uaccess);
- synced_user = 1;
+
+ chanuser_count = 0;
+ for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) {
+ if(nickmask && match(nickmask, chanuser->user->nick)) continue;
+ chanusers[chanuser_count++] = chanuser;
+ }
+ qsort(chanusers, chanuser_count, sizeof(struct ChanUser *), neonserv_cmd_nicklist_sort);
+
+ caccess = getChannelAccess(user, chan);
+ synced_user = 0;
+ for(i = 0; i < chanuser_count; i++) {
+ chanuser = chanusers[i];
+
+ content[0] = chanuser->user->nick;
+
+ j = 0;
+ if((chanuser->flags & CHANUSERFLAG_INVISIBLE)) statebuf[j++] = '<';
+ if((chanuser->flags & CHANUSERFLAG_OPPED)) statebuf[j++] = '@';
+ if((chanuser->flags & CHANUSERFLAG_HALFOPPED)) statebuf[j++] = '%';
+ if((chanuser->flags & CHANUSERFLAG_VOICED)) statebuf[j++] = '+';
+ statebuf[j++] = '\0';
+ content[1] = statebuf;
+
+ uaccess = 0;
+ if(chanuser->user->flags & USERFLAG_ISAUTHED) {
+ for(j = 0; j < userlistlen; j++) {
+ if(!stricmp(chanuser->user->auth, userlist[j][1])) {
+ uaccess = atoi(userlist[j][0]);
+ if((((chanuser->flags & CHANUSERFLAG_OPPED) && uaccess < db_enfops) || ((chanuser->flags & CHANUSERFLAG_VOICED) && uaccess < db_enfvoice)) && !isNetworkService(chanuser->user)) {
+ if(syncusers) {
+ if((chanuser->flags & CHANUSERFLAG_OPPED) && (db_enfops < caccess || isGodMode(user))) {
+ if(db_enfops >= caccess)
+ event->flags |= CMDFLAG_OPLOG;
+ uaccess = db_enfops;
+ } else if((chanuser->flags & CHANUSERFLAG_VOICED) && (caccess < db_enfvoice || isGodMode(user))) {
+ if(db_enfvoice >= caccess)
+ event->flags |= CMDFLAG_OPLOG;
+ uaccess = db_enfvoice;