[srvx-commits] CVS: services/src chanserv.c,1.385,1.386
Brought to you by:
entrope
From: Entrope <en...@us...> - 2003-10-10 02:53:02
|
Update of /cvsroot/srvx/services/src In directory sc8-pr-cvs1:/tmp/cvs-serv11285/src Modified Files: chanserv.c Log Message: rewrite user list code: include vacation/suspend/neither status, use table_send(), sort account names in each section Index: chanserv.c =================================================================== RCS file: /cvsroot/srvx/services/src/chanserv.c,v retrieving revision 1.385 retrieving revision 1.386 diff -C2 -r1.385 -r1.386 *** chanserv.c 8 Oct 2003 04:46:14 -0000 1.385 --- chanserv.c 10 Oct 2003 02:52:58 -0000 1.386 *************** *** 258,263 **** #define CSMSG_ACCESS_SEARCH_HDR "%s $b%ss$b matching %s:" #define CSMSG_ACCESS_HEADER "%s $b%ss$b:" - #define CSMSG_USER_HEADER "$b%-*s%-*s%s$b" - #define CSMSG_USER_DATA "$b%-*s%-*s$b%s" /* Channel banlist */ --- 258,261 ---- *************** *** 464,474 **** struct listData { ! struct userData **users; ! unsigned int matches; ! ! enum userLevel lowest; ! enum userLevel highest; ! ! unsigned int handleLength; }; --- 462,472 ---- struct listData { ! struct userNode *user; ! struct chanNode *channel; ! const char *search; ! enum userLevel lowest; ! enum userLevel highest; ! struct userData **users; ! struct helpfile_table table; }; *************** *** 3563,3719 **** static void ! zoot_list(char *search, struct userNode *user, struct chanNode *channel, struct listData *list) { ! struct userData **users, *found; ! enum userLevel display; ! char buf[INTERVALLEN], *seen; ! unsigned int i; ! users = list->users; ! for(display = list->highest; display >= list->lowest; display--) { ! found = NULL; ! ! for(i = 0; i < list->matches; i++) ! { ! if(users[i]->access == display) ! { ! found = users[i]; ! break; ! } ! } ! ! if(!found) ! { ! if(list->highest == list->lowest) ! { ! if(search) ! { ! chanserv_notice(user, CSMSG_ACCESS_SEARCH_HDR, channel->name, accessNames[display], search); ! } ! else ! { ! chanserv_notice(user, CSMSG_ACCESS_HEADER, channel->name, accessNames[display]); ! } ! chanserv_notice(user, "$bNone.$b"); ! return; ! } ! continue; ! } ! ! if(search) ! { ! chanserv_notice(user, CSMSG_ACCESS_SEARCH_HDR, channel->name, accessNames[display], search); ! } else { ! chanserv_notice(user, CSMSG_ACCESS_HEADER, channel->name, accessNames[display]); } - chanserv_notice(user, CSMSG_USER_HEADER, 0, "", list->handleLength+2, "Account:", "Last Seen:"); - - while(i < list->matches) - { - if(users[i]->access != display) - { - i++; - continue; - } - - if(!users[i]->present) - { - if(users[i]->seen) - { - intervalString(buf, now - users[i]->seen); - seen = buf; - } - else - { - seen = "Never."; - } - } - else - { - seen = "Here."; - } - - chanserv_notice(user, CSMSG_USER_DATA, 2, "", list->handleLength, users[i]->handle->handle, seen); - - i++; - } } } static void ! def_list(char *search, struct userNode *user, struct chanNode *channel, struct listData *list) { ! struct userData **users, *found; ! enum userLevel display; ! char buf[INTERVALLEN], *seen; ! unsigned int i; ! ! if(search) ! { ! chanserv_notice(user, CSMSG_ACCESS_SEARCH_HDR, channel->name, list->highest == list->lowest ? accessNames[list->lowest] : "user", search); ! } else ! { ! chanserv_notice(user, CSMSG_ACCESS_HEADER, channel->name, list->highest == list->lowest ? accessNames[list->lowest] : "user"); ! } ! chanserv_notice(user, CSMSG_USER_HEADER, ACCESSLEN, "Access:", list->handleLength, "Account:", "Last Seen:"); ! ! users = list->users; ! for(display = list->highest; display >= list->lowest; display--) ! { ! found = NULL; ! ! for(i = 0; i < list->matches; i++) ! { ! if(users[i]->access == display) ! { ! found = users[i]; ! break; ! } ! } ! ! if(!found) ! { ! if(list->highest == list->lowest) ! { ! chanserv_notice(user, "$bNone.$b"); ! return; ! } ! continue; ! } ! ! while(i < list->matches) ! { ! if(users[i]->access != display) ! { ! i++; ! continue; ! } ! ! if(!users[i]->present) ! { ! if(users[i]->seen) ! { ! intervalString(buf, now - users[i]->seen); ! seen = buf; ! } ! else ! { ! seen = "Never."; ! } ! } ! else ! { ! seen = "Here."; ! } ! ! chanserv_notice(user, CSMSG_USER_DATA, ACCESSLEN, accessTitles[users[i]->access], list->handleLength, users[i]->handle->handle, seen); ! i++; ! } ! } } --- 3561,3627 ---- static void ! zoot_list(struct listData *list) { ! enum userLevel lvl = list->highest; ! struct userData *uData; ! unsigned int start, curr; ! struct helpfile_table tmp_table; ! const char **temp; ! if(list->table.length == 1) { ! if(list->search) ! chanserv_notice(list->user, CSMSG_ACCESS_SEARCH_HDR, list->channel->name, list->highest == list->lowest ? accessNames[list->lowest] : "user", list->search); else + chanserv_notice(list->user, CSMSG_ACCESS_HEADER, list->channel->name, list->highest == list->lowest ? accessNames[list->lowest] : "user"); + chanserv_notice(list->user, " None"); + } + tmp_table.width = list->table.width; + tmp_table.flags = list->table.flags; + for(start = curr = 1; curr < list->table.length; ++curr) + { + uData = list->users[curr-1]; + list->table.contents[curr][0] = " "; + if((start != curr) && ((uData->access != lvl) || (curr+1 == list->table.length))) { ! if(list->search) ! chanserv_notice(list->user, CSMSG_ACCESS_SEARCH_HDR, list->channel->name, accessNames[lvl], list->search); ! else ! chanserv_notice(list->user, CSMSG_ACCESS_HEADER, list->channel->name, accessNames[lvl]); ! temp = list->table.contents[--start]; ! list->table.contents[start] = list->table.contents[0]; ! tmp_table.contents = list->table.contents + start; ! tmp_table.length = curr - start; ! table_send(chanserv, list->user->nick, 0, NULL, tmp_table); ! list->table.contents[start] = temp; ! start = curr; ! lvl = uData->access; } } } static void ! def_list(struct listData *list) { ! if(list->search) ! chanserv_notice(list->user, CSMSG_ACCESS_SEARCH_HDR, list->channel->name, list->highest == list->lowest ? accessNames[list->lowest] : "user", list->search); else ! chanserv_notice(list->user, CSMSG_ACCESS_HEADER, list->channel->name, list->highest == list->lowest ? accessNames[list->lowest] : "user"); ! table_send(chanserv, list->user->nick, 0, NULL, list->table); ! if(list->table.length == 1) ! chanserv_notice(list->user, " None"); ! } ! static int ! userData_access_comp(const void *arg_a, const void *arg_b) ! { ! const struct userData *a = *(struct userData**)arg_a; ! const struct userData *b = *(struct userData**)arg_b; ! int res; ! if(a->access != b->access) ! res = b->access - a->access; ! else ! res = irccasecmp(a->handle->handle, b->handle->handle); ! return res; } *************** *** 3721,3733 **** cmd_list_users(struct userNode *user, struct chanNode *channel, unsigned int argc, unsigned char *argv[], UNUSED_ARG(struct svccmd *cmd), enum userLevel display_lowest, enum userLevel display_highest) { ! void (*send_list)(char *, struct userNode *, struct chanNode *, struct listData *); ! struct userData *uData, **users; ! struct chanData *cData; struct listData lData; enum userLevel display; ! unsigned int handleLength = 0, matches = 0; ! char *search = NULL; ! if(argc > 1) search = argv[1]; send_list = zoot_list; --- 3629,3644 ---- cmd_list_users(struct userNode *user, struct chanNode *channel, unsigned int argc, unsigned char *argv[], UNUSED_ARG(struct svccmd *cmd), enum userLevel display_lowest, enum userLevel display_highest) { ! void (*send_list)(struct listData *); ! struct userData *uData; struct listData lData; enum userLevel display; ! unsigned int matches; ! const char **ary; ! lData.user = user; ! lData.channel = channel; ! lData.lowest = display_lowest; ! lData.highest = display_highest; ! lData.search = (argc > 1) ? argv[1] : NULL; send_list = zoot_list; *************** *** 3737,3775 **** { case HI_STYLE_DEF: send_list = def_list; break; } } ! cData = channel->channel_info; for(display = display_highest; display >= display_lowest; display--) ! { ! matches += cData->userCount[display]; ! } ! users = alloca(matches * sizeof(struct userData *)); matches = 0; ! ! for(uData = cData->users; uData; uData = uData->next) { ! if(uData->access < display_lowest || uData->access > display_highest) continue; ! ! if(search && !match_ircglob(uData->handle->handle, search)) ! continue; ! ! users[matches++] = uData; ! ! if((unsigned int)strlen(uData->handle->handle) > handleLength) ! handleLength = strlen(uData->handle->handle); } ! lData.users = users; ! lData.matches = matches; ! lData.lowest = display_lowest; ! lData.highest = display_highest; ! /* Must be at least strlen("Account:")+3 */ ! lData.handleLength = handleLength < 11 ? 11 : handleLength + 3; ! ! send_list(search, user, channel, &lData); ! return 1; } --- 3648,3712 ---- { case HI_STYLE_DEF: send_list = def_list; break; + case HI_STYLE_ZOOT: send_list = zoot_list; break; } } ! matches = 0; for(display = display_highest; display >= display_lowest; display--) ! matches += channel->channel_info->userCount[display]; ! lData.users = alloca(matches * sizeof(struct userData *)); matches = 0; ! for(uData = channel->channel_info->users; uData; uData = uData->next) { ! if((uData->access < display_lowest) ! || (uData->access > display_highest) ! || (lData.search && !match_ircglob(uData->handle->handle, lData.search))) continue; ! lData.users[matches++] = uData; } + qsort(lData.users, matches, sizeof(lData.users[0]), userData_access_comp); ! lData.table.length = matches+1; ! lData.table.width = 4; ! lData.table.flags = TABLE_NO_FREE; ! lData.table.contents = malloc(lData.table.length*sizeof(*lData.table.contents)); ! ary = malloc(lData.table.width*sizeof(**lData.table.contents)); ! lData.table.contents[0] = ary; ! ary[0] = " "; ! ary[1] = "Account"; ! ary[2] = "Last Seen"; ! ary[3] = "Status"; ! for(matches = 1; matches < lData.table.length; ++matches) ! { ! struct userData *uData = lData.users[matches-1]; ! char seen[INTERVALLEN]; ! ! ary = malloc(lData.table.width*sizeof(**lData.table.contents)); ! lData.table.contents[matches] = ary; ! ary[0] = accessNames[uData->access]; ! ary[1] = uData->handle->handle; ! if(uData->present) ! ary[2] = "Here"; ! else if(!uData->seen) ! ary[2] = "Never"; ! else ! ary[2] = intervalString(seen, now - uData->seen); ! ary[2] = strdup(ary[2]); ! if(IsUserSuspended(uData)) ! ary[3] = "Suspended"; ! else if(HANDLE_FLAGGED(uData->handle, FROZEN)) ! ary[3] = "Vacation"; ! else ! ary[3] = "Normal"; ! } ! send_list(&lData); ! for(matches = 1; matches < lData.table.length; ++matches) ! { ! free((char*)lData.table.contents[matches][2]); ! free(lData.table.contents[matches]); ! } ! free(lData.table.contents[0]); ! free(lData.table.contents); return 1; } |