Implement +I (private channel list on whois)

Implements enhancement requested in issue #179
This commit is contained in:
LucentW 2015-04-27 23:20:32 +02:00
parent c5da483685
commit 21767c968d
3 changed files with 36 additions and 33 deletions

View File

@ -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"

View File

@ -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 &&

View File

@ -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;