Skip to content

Commit

Permalink
Implement +I (private channel list on whois)
Browse files Browse the repository at this point in the history
Implements enhancement requested in issue #179
  • Loading branch information
LucentW committed Apr 29, 2015
1 parent c5da483 commit 21767c9
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 35 deletions.
2 changes: 1 addition & 1 deletion src/ngircd/defines.h
Expand Up @@ -177,7 +177,7 @@
#endif

/** Supported user modes. */
#define USERMODES "abBcCFioqrRswx"
#define USERMODES "abBcCFiIoqrRswx"

/** Supported channel modes. */
#define CHANMODES "abehiIklmMnoOPqQrRstvVz"
Expand Down
70 changes: 36 additions & 34 deletions src/ngircd/irc-info.c
Expand Up @@ -313,48 +313,50 @@ IRC_WHOIS_SendReply(CLIENT *Client, CLIENT *from, CLIENT *c)
Client_Info(Client_Introducer(c))))
return DISCONNECTED;

/* Channels */
snprintf(str, sizeof(str), RPL_WHOISCHANNELS_MSG,
Client_ID(from), Client_ID(c));
cl2chan = Channel_FirstChannelOf(c);
while (cl2chan) {
chan = Channel_GetChannel(cl2chan);
assert(chan != NULL);

/* next */
cl2chan = Channel_NextChannelOf(c, cl2chan);

/* Secret channel? */
if (Channel_HasMode(chan, 's')
&& !Channel_IsMemberOf(chan, Client))
continue;
/* Channels, show only if client has no +I or if from is oper */
if(!(Client_HasMode(c, 'I')) || Client_HasMode(from, 'o')) {
snprintf(str, sizeof(str), RPL_WHOISCHANNELS_MSG,
Client_ID(from), Client_ID(c));
cl2chan = Channel_FirstChannelOf(c);
while (cl2chan) {
chan = Channel_GetChannel(cl2chan);
assert(chan != NULL);

/* next */
cl2chan = Channel_NextChannelOf(c, cl2chan);

/* Secret channel? */
if (Channel_HasMode(chan, 's')
&& !Channel_IsMemberOf(chan, Client))
continue;

/* Local channel and request is not from a user? */
if (Client_Type(Client) == CLIENT_SERVER
&& Channel_IsLocal(chan))
continue;
/* Local channel and request is not from a user? */
if (Client_Type(Client) == CLIENT_SERVER
&& Channel_IsLocal(chan))
continue;

/* Concatenate channel names */
if (str[strlen(str) - 1] != ':')
strlcat(str, " ", sizeof(str));
/* Concatenate channel names */
if (str[strlen(str) - 1] != ':')
strlcat(str, " ", sizeof(str));

who_flags_qualifier(Client, Channel_UserModes(chan, c),
str, sizeof(str));
strlcat(str, Channel_Name(chan), sizeof(str));
who_flags_qualifier(Client, Channel_UserModes(chan, c),
str, sizeof(str));
strlcat(str, Channel_Name(chan), sizeof(str));

if (strlen(str) > (COMMAND_LEN - CHANNEL_NAME_LEN - 4)) {
/* Line becomes too long: send it! */
if (strlen(str) > (COMMAND_LEN - CHANNEL_NAME_LEN - 4)) {
/* 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))
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? */
if (Client_Type(c) == CLIENT_SERVICE &&
Expand Down
1 change: 1 addition & 0 deletions src/ngircd/irc-mode.c
Expand Up @@ -206,6 +206,7 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
case 'b': /* Block private msgs */
case 'C': /* Only messages from clients sharing a channel */
case 'i': /* Invisible */
case 'I': /* Hide channel list from WHOIS */
case 's': /* Server messages */
case 'w': /* Wallops messages */
x[0] = *mode_ptr;
Expand Down

0 comments on commit 21767c9

Please sign in to comment.