Implement +I (private channel list on whois)
Implements enhancement requested in issue #179
This commit is contained in:
parent
c5da483685
commit
21767c968d
|
@ -177,7 +177,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** Supported user modes. */
|
/** Supported user modes. */
|
||||||
#define USERMODES "abBcCFioqrRswx"
|
#define USERMODES "abBcCFiIoqrRswx"
|
||||||
|
|
||||||
/** Supported channel modes. */
|
/** Supported channel modes. */
|
||||||
#define CHANMODES "abehiIklmMnoOPqQrRstvVz"
|
#define CHANMODES "abehiIklmMnoOPqQrRstvVz"
|
||||||
|
|
|
@ -313,48 +313,50 @@ IRC_WHOIS_SendReply(CLIENT *Client, CLIENT *from, CLIENT *c)
|
||||||
Client_Info(Client_Introducer(c))))
|
Client_Info(Client_Introducer(c))))
|
||||||
return DISCONNECTED;
|
return DISCONNECTED;
|
||||||
|
|
||||||
/* Channels */
|
/* Channels, show only if client has no +I or if from is oper */
|
||||||
snprintf(str, sizeof(str), RPL_WHOISCHANNELS_MSG,
|
if(!(Client_HasMode(c, 'I')) || Client_HasMode(from, 'o')) {
|
||||||
Client_ID(from), Client_ID(c));
|
snprintf(str, sizeof(str), RPL_WHOISCHANNELS_MSG,
|
||||||
cl2chan = Channel_FirstChannelOf(c);
|
Client_ID(from), Client_ID(c));
|
||||||
while (cl2chan) {
|
cl2chan = Channel_FirstChannelOf(c);
|
||||||
chan = Channel_GetChannel(cl2chan);
|
while (cl2chan) {
|
||||||
assert(chan != NULL);
|
chan = Channel_GetChannel(cl2chan);
|
||||||
|
assert(chan != NULL);
|
||||||
|
|
||||||
/* next */
|
/* next */
|
||||||
cl2chan = Channel_NextChannelOf(c, cl2chan);
|
cl2chan = Channel_NextChannelOf(c, cl2chan);
|
||||||
|
|
||||||
/* Secret channel? */
|
/* Secret channel? */
|
||||||
if (Channel_HasMode(chan, 's')
|
if (Channel_HasMode(chan, 's')
|
||||||
&& !Channel_IsMemberOf(chan, Client))
|
&& !Channel_IsMemberOf(chan, Client))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Local channel and request is not from a user? */
|
/* Local channel and request is not from a user? */
|
||||||
if (Client_Type(Client) == CLIENT_SERVER
|
if (Client_Type(Client) == CLIENT_SERVER
|
||||||
&& Channel_IsLocal(chan))
|
&& Channel_IsLocal(chan))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Concatenate channel names */
|
/* Concatenate channel names */
|
||||||
if (str[strlen(str) - 1] != ':')
|
if (str[strlen(str) - 1] != ':')
|
||||||
strlcat(str, " ", sizeof(str));
|
strlcat(str, " ", sizeof(str));
|
||||||
|
|
||||||
who_flags_qualifier(Client, Channel_UserModes(chan, c),
|
who_flags_qualifier(Client, Channel_UserModes(chan, c),
|
||||||
str, sizeof(str));
|
str, sizeof(str));
|
||||||
strlcat(str, Channel_Name(chan), sizeof(str));
|
strlcat(str, Channel_Name(chan), sizeof(str));
|
||||||
|
|
||||||
if (strlen(str) > (COMMAND_LEN - CHANNEL_NAME_LEN - 4)) {
|
if (strlen(str) > (COMMAND_LEN - CHANNEL_NAME_LEN - 4)) {
|
||||||
/* Line becomes too long: send it! */
|
/* Line becomes too long: send it! */
|
||||||
|
if (!IRC_WriteStrClient(Client, "%s", str))
|
||||||
|
return DISCONNECTED;
|
||||||
|
snprintf(str, sizeof(str), RPL_WHOISCHANNELS_MSG,
|
||||||
|
Client_ID(from), Client_ID(c));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(str[strlen(str) - 1] != ':') {
|
||||||
|
/* There is data left to send: */
|
||||||
if (!IRC_WriteStrClient(Client, "%s", str))
|
if (!IRC_WriteStrClient(Client, "%s", str))
|
||||||
return DISCONNECTED;
|
return DISCONNECTED;
|
||||||
snprintf(str, sizeof(str), RPL_WHOISCHANNELS_MSG,
|
|
||||||
Client_ID(from), Client_ID(c));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(str[strlen(str) - 1] != ':') {
|
|
||||||
/* There is data left to send: */
|
|
||||||
if (!IRC_WriteStrClient(Client, "%s", str))
|
|
||||||
return DISCONNECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* IRC-Services? */
|
/* IRC-Services? */
|
||||||
if (Client_Type(c) == CLIENT_SERVICE &&
|
if (Client_Type(c) == CLIENT_SERVICE &&
|
||||||
|
|
|
@ -206,6 +206,7 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
|
||||||
case 'b': /* Block private msgs */
|
case 'b': /* Block private msgs */
|
||||||
case 'C': /* Only messages from clients sharing a channel */
|
case 'C': /* Only messages from clients sharing a channel */
|
||||||
case 'i': /* Invisible */
|
case 'i': /* Invisible */
|
||||||
|
case 'I': /* Hide channel list from WHOIS */
|
||||||
case 's': /* Server messages */
|
case 's': /* Server messages */
|
||||||
case 'w': /* Wallops messages */
|
case 'w': /* Wallops messages */
|
||||||
x[0] = *mode_ptr;
|
x[0] = *mode_ptr;
|
||||||
|
|
Loading…
Reference in New Issue