From: pk910 Date: Tue, 3 Jan 2012 20:06:04 +0000 (+0100) Subject: added possibility to set custom fields on cmd_search X-Git-Url: http://git.pk910.de/?p=srvx.git;a=commitdiff_plain;h=f627eb4a516acc82db9d8778da659953800bc85c added possibility to set custom fields on cmd_search --- diff --git a/src/main-common.c b/src/main-common.c index a00c4b4..85b9dd3 100644 --- a/src/main-common.c +++ b/src/main-common.c @@ -53,6 +53,7 @@ static const struct message_entry msgtab[] = { { "MSG_STUPID_ACCESS_CHANGE", "Please ask someone $belse$b to demote you." }, { "MSG_NO_SEARCH_ACCESS", "You do not have enough access to search based on $b%s$b." }, { "MSG_INVALID_CRITERIA", "$b%s$b is an invalid search criteria." }, + { "MSG_INVALID_FIELD", "$b%s$b is an invalid search field." }, { "MSG_MATCH_COUNT", "Found $b%u$b matches." }, { "MSG_NO_MATCHES", "Nothing matched the criteria of your search." }, { "MSG_TOPIC_UNKNOWN", "No help on that topic." }, diff --git a/src/nickserv.c b/src/nickserv.c index df37fd3..27dcddf 100644 --- a/src/nickserv.c +++ b/src/nickserv.c @@ -3432,7 +3432,22 @@ static NICKSERV_FUNC(cmd_merge) return 1; } +#define NICKSERV_DISCRIM_FIELDS_AUTH 0x01 +#define NICKSERV_DISCRIM_FIELDS_EMAIL 0x02 +#define NICKSERV_DISCRIM_FIELDS_SEEN 0x04 +#define NICKSERV_DISCRIM_FIELDS_ACCESS 0x08 +#define NICKSERV_DISCRIM_FIELDS_FAKEHOST 0x10 +#define NICKSERV_DISCRIM_FIELDS_WEBSITE 0x20 +#define NICKSERV_DISCRIM_FIELDS_DEVNULL 0x40 + +#define NICKSERV_DISCRIM_FIELD_COUNT 7 + struct nickserv_discrim { + unsigned int show_fields; + struct helpfile_table *output_table; + int output_table_pos; + unsigned int output_table_free_fields; + unsigned long flags_on, flags_off; unsigned long min_registered, max_registered; unsigned long lastseen; @@ -3450,7 +3465,7 @@ struct nickserv_discrim { const char *emailmask; }; -typedef void (*discrim_search_func)(struct userNode *source, struct handle_info *hi); +typedef void (*discrim_search_func)(struct userNode *source, struct handle_info *hi, struct nickserv_discrim *discrim); struct discrim_apply_info { struct nickserv_discrim *discrim; @@ -3485,6 +3500,40 @@ nickserv_discrim_create(struct userNode *user, unsigned int argc, char *argv[]) discrim->limit = strtoul(argv[++i], NULL, 0); } else if (!irccasecmp(argv[i], "flags")) { nickserv_modify_handle_flags(user, nickserv, argv[++i], &discrim->flags_on, &discrim->flags_off); + } else if (!irccasecmp(argv[i], "fields")) { + char *fields = argv[++i]; + char *delimiter = strstr(fields, ","); + while(1) { + if(delimiter) + *delimiter = '\0'; + if(!irccasecmp(fields, "auth")) + discrim->show_fields |= NICKSERV_DISCRIM_FIELDS_AUTH; + else if(!irccasecmp(fields, "email")) + discrim->show_fields |= NICKSERV_DISCRIM_FIELDS_EMAIL; + else if(!irccasecmp(fields, "seen")) + discrim->show_fields |= NICKSERV_DISCRIM_FIELDS_SEEN; + else if(!irccasecmp(fields, "access")) + discrim->show_fields |= NICKSERV_DISCRIM_FIELDS_ACCESS; + else if(!irccasecmp(fields, "fakehost")) + discrim->show_fields |= NICKSERV_DISCRIM_FIELDS_FAKEHOST; + else if(!irccasecmp(fields, "website") && IsBot(user)) + discrim->show_fields |= NICKSERV_DISCRIM_FIELDS_WEBSITE; + else if(!irccasecmp(fields, "devnull")) + discrim->show_fields |= NICKSERV_DISCRIM_FIELDS_DEVNULL; + else { + send_message(user, nickserv, "MSG_INVALID_FIELD", fields); + goto fail; + } + if(delimiter) { + *delimiter = ','; + fields = delimiter+1; + if(*fields) { + delimiter = strstr(fields, ","); + continue; + } + } + break; + } } else if (!irccasecmp(argv[i], "registered")) { const char *cmp = argv[++i]; if (cmp[0] == '<') { @@ -3686,7 +3735,7 @@ nickserv_discrim_search(struct nickserv_discrim *discrim, discrim_search_func ds it = next) { next = iter_next(it); if (nickserv_discrim_match(discrim, iter_data(it))) { - dsf(source, iter_data(it)); + dsf(source, iter_data(it), discrim); matched++; } } @@ -3694,18 +3743,51 @@ nickserv_discrim_search(struct nickserv_discrim *discrim, discrim_search_func ds } static void -search_print_func(struct userNode *source, struct handle_info *match) +search_print_func(struct userNode *source, struct handle_info *match, struct nickserv_discrim *discrim) { - send_message(source, nickserv, "NSMSG_SEARCH_MATCH", match->handle); + if(discrim->show_fields) { + //custom fields + if(discrim->output_table) { + discrim->output_table->contents[++discrim->output_table_pos] = malloc(discrim->output_table->width * sizeof(discrim->output_table->contents[0][0])); + int i = 0; + if(discrim->show_fields & NICKSERV_DISCRIM_FIELDS_AUTH) + discrim->output_table->contents[discrim->output_table_pos][i++] = match->handle; + if(discrim->show_fields & NICKSERV_DISCRIM_FIELDS_EMAIL) + discrim->output_table->contents[discrim->output_table_pos][i++] = (match->email_addr ? match->email_addr : "*"); + if(discrim->show_fields & NICKSERV_DISCRIM_FIELDS_SEEN) { + char *seen; + char seenBuf[INTERVALLEN]; + if(match->users) { + seen = "Here"; + } else if(match->lastseen == 0) { + seen = "Never"; + } else { + seen = intervalString(seenBuf, now - match->lastseen, source->handle_info); + } + discrim->output_table_free_fields |= 1 << i; + discrim->output_table->contents[discrim->output_table_pos][i++] = strdup(seen); + } + if(discrim->show_fields & NICKSERV_DISCRIM_FIELDS_ACCESS) + discrim->output_table->contents[discrim->output_table_pos][i++] = strtab(match->opserv_level); + if(discrim->show_fields & NICKSERV_DISCRIM_FIELDS_FAKEHOST) + discrim->output_table->contents[discrim->output_table_pos][i++] = (match->fakehost ? match->fakehost : "*"); + if(discrim->show_fields & NICKSERV_DISCRIM_FIELDS_WEBSITE) + discrim->output_table->contents[discrim->output_table_pos][i++] = (match->website ? match->website : "*"); + if(discrim->show_fields & NICKSERV_DISCRIM_FIELDS_DEVNULL) + discrim->output_table->contents[discrim->output_table_pos][i++] = (match->devnull ? match->devnull : "*"); + + } + } else + send_message(source, nickserv, "NSMSG_SEARCH_MATCH", match->handle); } static void -search_count_func(UNUSED_ARG(struct userNode *source), UNUSED_ARG(struct handle_info *match)) +search_count_func(UNUSED_ARG(struct userNode *source), UNUSED_ARG(struct handle_info *match), UNUSED_ARG(struct nickserv_discrim *discrim)) { } static void -search_unregister_func (struct userNode *source, struct handle_info *match) +search_unregister_func (struct userNode *source, struct handle_info *match, UNUSED_ARG(struct nickserv_discrim *discrim)) { if (oper_has_access(source, nickserv, match->opserv_level, 0)) nickserv_unregister_handle(match, source); @@ -3793,12 +3875,58 @@ static NICKSERV_FUNC(cmd_search) discrim->limit = INT_MAX; matches = nickserv_discrim_search(discrim, action, user); - + + if(discrim->show_fields) { + int width = 0; + int ii; + for(ii = 0; ii < NICKSERV_DISCRIM_FIELD_COUNT; ii++) { + if(discrim->show_fields & (1 << ii)) width++; + } + discrim->output_table = malloc(sizeof(discrim->output_table[0])); + discrim->output_table->length = matches+1; + discrim->output_table->width = width; + discrim->output_table->flags = TABLE_NO_FREE; + discrim->output_table->contents = malloc(discrim->output_table->length * sizeof(discrim->output_table->contents[0])); + discrim->output_table->contents[0] = malloc(discrim->output_table->width * sizeof(discrim->output_table->contents[0][0])); + + ii = 0; + if(discrim->show_fields & NICKSERV_DISCRIM_FIELDS_AUTH) + discrim->output_table->contents[0][ii++] = "Auth"; + if(discrim->show_fields & NICKSERV_DISCRIM_FIELDS_EMAIL) + discrim->output_table->contents[0][ii++] = "EMail"; + if(discrim->show_fields & NICKSERV_DISCRIM_FIELDS_SEEN) + discrim->output_table->contents[0][ii++] = "Seen"; + if(discrim->show_fields & NICKSERV_DISCRIM_FIELDS_ACCESS) + discrim->output_table->contents[0][ii++] = "Access"; + if(discrim->show_fields & NICKSERV_DISCRIM_FIELDS_FAKEHOST) + discrim->output_table->contents[0][ii++] = "Fakehost"; + if(discrim->show_fields & NICKSERV_DISCRIM_FIELDS_WEBSITE) + discrim->output_table->contents[0][ii++] = "Website"; + if(discrim->show_fields & NICKSERV_DISCRIM_FIELDS_DEVNULL) + discrim->output_table->contents[0][ii++] = "DevNull"; + + nickserv_discrim_search(discrim, action, user); + + table_send(nickserv, user->nick, 0, NULL, *discrim->output_table); + + for(ii = 1; ii < discrim->output_table->length; ++ii) { + int ij; + for(ij = 0; ij < NICKSERV_DISCRIM_FIELD_COUNT; ij++) { + if(discrim->output_table_free_fields & (1 << ij)) + free((char*)discrim->output_table->contents[ii][ij]); + } + free(discrim->output_table->contents[ii]); + } + free(discrim->output_table->contents[0]); + free(discrim->output_table->contents); + free(discrim->output_table); + } if (matches) reply("MSG_MATCH_COUNT", matches); else reply("MSG_NO_MATCHES"); + free(discrim); return 0; }