MODE command: Always report channel creation time

Up to now when receiving a MODE command, ngIRCd only reported the channel
creation time to clients that were members of the channel. This patch
reports the channel creation time to all clients, regardless if they are
joined to that channel or not.

At least ircd-seven behaves like this.

This closes #188. Thanks Cahata!
This commit is contained in:
Alexander Barton 2015-04-12 19:35:39 +02:00
parent 52825cde29
commit 81b81c818c
1 changed files with 34 additions and 27 deletions

View File

@ -378,37 +378,44 @@ Channel_Mode_Answer_Request(CLIENT *Origin, CHANNEL *Channel)
char the_modes[COMMAND_LEN], the_args[COMMAND_LEN], argadd[CLIENT_PASS_LEN]; char the_modes[COMMAND_LEN], the_args[COMMAND_LEN], argadd[CLIENT_PASS_LEN];
const char *mode_ptr; const char *mode_ptr;
/* Member or not? -- That's the question! */ if (!Channel_IsMemberOf(Channel, Origin)) {
if (!Channel_IsMemberOf(Channel, Origin)) /* Not a member: "simple" mode reply */
return IRC_WriteStrClient(Origin, RPL_CHANNELMODEIS_MSG, if (!IRC_WriteStrClient(Origin, RPL_CHANNELMODEIS_MSG,
Client_ID(Origin), Channel_Name(Channel), Channel_Modes(Channel)); Client_ID(Origin), Channel_Name(Channel),
Channel_Modes(Channel)))
return DISCONNECTED;
} else {
/* The sender is a member: generate extended reply */
strlcpy(the_modes, Channel_Modes(Channel), sizeof(the_modes));
mode_ptr = the_modes;
the_args[0] = '\0';
/* The sender is a member: generate extended reply */ while(*mode_ptr) {
strlcpy(the_modes, Channel_Modes(Channel), sizeof(the_modes)); switch(*mode_ptr) {
mode_ptr = the_modes; case 'l':
the_args[0] = '\0'; snprintf(argadd, sizeof(argadd), " %lu",
Channel_MaxUsers(Channel));
while(*mode_ptr) { strlcat(the_args, argadd, sizeof(the_args));
switch(*mode_ptr) { break;
case 'l': case 'k':
snprintf(argadd, sizeof(argadd), " %lu", Channel_MaxUsers(Channel)); strlcat(the_args, " ", sizeof(the_args));
strlcat(the_args, argadd, sizeof(the_args)); strlcat(the_args, Channel_Key(Channel),
break; sizeof(the_args));
case 'k': break;
strlcat(the_args, " ", sizeof(the_args)); }
strlcat(the_args, Channel_Key(Channel), sizeof(the_args)); mode_ptr++;
break;
} }
mode_ptr++; if (the_args[0])
} strlcat(the_modes, the_args, sizeof(the_modes));
if (the_args[0])
strlcat(the_modes, the_args, sizeof(the_modes)); if (!IRC_WriteStrClient(Origin, RPL_CHANNELMODEIS_MSG,
Client_ID(Origin), Channel_Name(Channel),
the_modes))
return DISCONNECTED;
}
if (!IRC_WriteStrClient(Origin, RPL_CHANNELMODEIS_MSG,
Client_ID(Origin), Channel_Name(Channel),
the_modes))
return DISCONNECTED;
#ifndef STRICT_RFC #ifndef STRICT_RFC
/* Channel creation time */
if (!IRC_WriteStrClient(Origin, RPL_CREATIONTIME_MSG, if (!IRC_WriteStrClient(Origin, RPL_CREATIONTIME_MSG,
Client_ID(Origin), Channel_Name(Channel), Client_ID(Origin), Channel_Name(Channel),
Channel_CreationTime(Channel))) Channel_CreationTime(Channel)))