/* * safelist_one_channel() * * inputs - client pointer and channel pointer * outputs - none * side effects - a channel is listed if it meets the * requirements */ static void safelist_one_channel(struct Client *source_p, struct Channel *chptr) { struct ListClient *safelist_data = source_p->localClient->safelist_data; int visible; visible = !SecretChannel(chptr) || IsMember(source_p, chptr); if (!visible && !safelist_data->operspy) return; if ((unsigned int)chptr->members.length < safelist_data->users_min || (unsigned int)chptr->members.length > safelist_data->users_max) return; if (safelist_data->topic_min && chptr->topic_time < safelist_data->topic_min) return; /* If a topic TS is provided, don't show channels without a topic set. */ if (safelist_data->topic_max && (chptr->topic_time > safelist_data->topic_max || chptr->topic_time == 0)) return; if (safelist_data->created_min && chptr->channelts < safelist_data->created_min) return; if (safelist_data->created_max && chptr->channelts > safelist_data->created_max) return; list_one_channel(source_p, chptr, visible); }
/* * safelist_channel_named() * * inputs - client pointer, channel name, operspy * outputs - none * side effects - a named channel is listed */ static void safelist_channel_named(struct Client *source_p, const char *name, int operspy) { struct Channel *chptr; char *p; int visible; sendto_one(source_p, form_str(RPL_LISTSTART), me.name, source_p->name); if ((p = strchr(name, ','))) *p = '\0'; if (*name == '\0') { sendto_one_numeric(source_p, ERR_NOSUCHNICK, form_str(ERR_NOSUCHNICK), name); sendto_one(source_p, form_str(RPL_LISTEND), me.name, source_p->name); return; } chptr = find_channel(name); if (chptr == NULL) { sendto_one_numeric(source_p, ERR_NOSUCHNICK, form_str(ERR_NOSUCHNICK), name); sendto_one(source_p, form_str(RPL_LISTEND), me.name, source_p->name); return; } visible = !SecretChannel(chptr) || IsMember(source_p, chptr); if (visible || operspy) list_one_channel(source_p, chptr, visible); sendto_one(source_p, form_str(RPL_LISTEND), me.name, source_p->name); return; }
/* * list_all_channels * inputs - pointer to client requesting list * output - 0/1 * side effects - list all channels to source_p */ static int list_all_channels(struct Client *source_p) { struct Channel *chptr; sendto_one(source_p, form_str(source_p,RPL_LISTSTART), me.name, source_p->name); for ( chptr = GlobalChannelList; chptr; chptr = chptr->nextch ) { if ( !source_p->user || (SecretChannel(chptr) && !IsMember(source_p, chptr))) continue; list_one_channel(source_p,chptr); } sendto_one(source_p, form_str(source_p,RPL_LISTEND), me.name, source_p->name); return 0; }