Support *mask* and !*mask* in LIST

This commit is contained in:
Ed Kellett 2021-10-18 18:26:05 +01:00
parent 08e57732b6
commit 1788e55713
2 changed files with 24 additions and 3 deletions

View file

@ -308,7 +308,7 @@ struct PreClient
struct ListClient
{
char *chname;
char *chname, *mask, *nomask;
unsigned int users_min, users_max;
time_t created_min, created_max, topic_min, topic_max;
int operspy;

View file

@ -100,7 +100,7 @@ static int _modinit(void)
* T = topic search (T> T<)
*/
add_isupport("SAFELIST", isupport_string, "");
add_isupport("ELIST", isupport_string, "CTU");
add_isupport("ELIST", isupport_string, "CMNTU");
return 0;
}
@ -191,7 +191,7 @@ mo_list(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_
}
/* Single channel. */
if (args && IsChannelName(args))
if (args && IsChannelName(args) && !strchr(args, ','))
{
safelist_channel_named(source_p, args, operspy);
return;
@ -205,6 +205,8 @@ mo_list(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_
params->operspy = operspy;
params->created_min = params->topic_min =
params->created_max = params->topic_max = 0;
params->mask = NULL;
params->nomask = NULL;
if (args && !EmptyString(args))
{
@ -280,6 +282,17 @@ mo_list(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_
}
}
}
else if (*args == '!')
{
args++;
rb_free(params->nomask);
params->nomask = rb_strdup(args);
}
else if (*args == '?' || *args == '*' || IsChanPrefix(*args))
{
rb_free(params->mask);
params->mask = rb_strdup(args);
}
if (EmptyString(p))
break;
@ -376,6 +389,8 @@ static void safelist_client_release(struct Client *client_p)
rb_dlinkFindDestroy(client_p, &safelisting_clients);
rb_free(client_p->localClient->safelist_data->chname);
rb_free(client_p->localClient->safelist_data->mask);
rb_free(client_p->localClient->safelist_data->nomask);
rb_free(client_p->localClient->safelist_data);
client_p->localClient->safelist_data = NULL;
@ -459,6 +474,12 @@ static void safelist_one_channel(struct Client *source_p, struct Channel *chptr,
if (params->created_max && chptr->channelts > params->created_max)
return;
if (params->mask && !match(params->mask, chptr->chname))
return;
if (params->nomask && match(params->nomask, chptr->chname))
return;
list_one_channel(source_p, chptr, visible);
}