mirror of
https://github.com/osmarks/ngircd.git
synced 2025-01-31 17:49:11 +00:00
Clean up and document IRC_JOIN() and join_allowed() functions
This commit is contained in:
parent
f58c8b94d9
commit
ecad9f32c8
@ -62,9 +62,18 @@ part_from_all_channels(CLIENT* client, CLIENT *target)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check weather a local client is allowed to join an already existing
|
||||
* channel or not.
|
||||
* @param Client Client that sent the JOIN command
|
||||
* @param chan Channel to check
|
||||
* @param channame Name of the channel
|
||||
* @param key Provided channel key (or NULL if none has been provided)
|
||||
* @return true if client is allowed to join channel, false otherwise
|
||||
*/
|
||||
static bool
|
||||
join_allowed(CLIENT *Client, CLIENT *target, CHANNEL *chan,
|
||||
const char *channame, const char *key)
|
||||
join_allowed(CLIENT *Client, CHANNEL *chan, const char *channame,
|
||||
const char *key)
|
||||
{
|
||||
bool is_invited, is_banned;
|
||||
const char *channel_modes;
|
||||
@ -73,32 +82,40 @@ join_allowed(CLIENT *Client, CLIENT *target, CHANNEL *chan,
|
||||
if (strchr(Client_Modes(Client), 'o'))
|
||||
return true;
|
||||
|
||||
is_banned = Lists_Check(Channel_GetListBans(chan), target);
|
||||
is_invited = Lists_Check(Channel_GetListInvites(chan), target);
|
||||
is_banned = Lists_Check(Channel_GetListBans(chan), Client);
|
||||
is_invited = Lists_Check(Channel_GetListInvites(chan), Client);
|
||||
|
||||
if (is_banned && !is_invited) {
|
||||
IRC_WriteStrClient(Client, ERR_BANNEDFROMCHAN_MSG, Client_ID(Client), channame);
|
||||
/* Client is banned from channel (and not on invite list) */
|
||||
IRC_WriteStrClient(Client, ERR_BANNEDFROMCHAN_MSG,
|
||||
Client_ID(Client), channame);
|
||||
return false;
|
||||
}
|
||||
|
||||
channel_modes = Channel_Modes(chan);
|
||||
if ((strchr(channel_modes, 'i')) && !is_invited) {
|
||||
/* Channel is "invite-only" (and Client wasn't invited) */
|
||||
IRC_WriteStrClient(Client, ERR_INVITEONLYCHAN_MSG, Client_ID(Client), channame);
|
||||
/* Channel is "invite-only" and client is not on invite list */
|
||||
IRC_WriteStrClient(Client, ERR_INVITEONLYCHAN_MSG,
|
||||
Client_ID(Client), channame);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Is the channel protected by a key? */
|
||||
if (!Channel_CheckKey(chan, target, key ? key : "")) {
|
||||
if (!Channel_CheckKey(chan, Client, key ? key : "")) {
|
||||
/* Channel is protected by a channel key and the client
|
||||
* didn't specify the correct one */
|
||||
IRC_WriteStrClient(Client, ERR_BADCHANNELKEY_MSG,
|
||||
Client_ID(Client), channame);
|
||||
return false;
|
||||
}
|
||||
/* Are there already too many members? */
|
||||
if ((strchr(channel_modes, 'l')) && (Channel_MaxUsers(chan) <= Channel_MemberCount(chan))) {
|
||||
IRC_WriteStrClient(Client, ERR_CHANNELISFULL_MSG, Client_ID(Client), channame);
|
||||
|
||||
if ((strchr(channel_modes, 'l')) &&
|
||||
(Channel_MaxUsers(chan) <= Channel_MemberCount(chan))) {
|
||||
/* There are more clints joined to this channel than allowed */
|
||||
IRC_WriteStrClient(Client, ERR_CHANNELISFULL_MSG,
|
||||
Client_ID(Client), channame);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -270,20 +287,23 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||
|
||||
/* Local client? */
|
||||
if (Client_Type(Client) == CLIENT_USER) {
|
||||
/* Test if the user has reached his maximum channel count */
|
||||
if ((Conf_MaxJoins > 0) && (Channel_CountForUser(Client) >= Conf_MaxJoins))
|
||||
return IRC_WriteStrClient(Client, ERR_TOOMANYCHANNELS_MSG,
|
||||
/* Test if the user has reached the channel limit */
|
||||
if ((Conf_MaxJoins > 0) &&
|
||||
(Channel_CountForUser(Client) >= Conf_MaxJoins))
|
||||
return IRC_WriteStrClient(Client,
|
||||
ERR_TOOMANYCHANNELS_MSG,
|
||||
Client_ID(Client), channame);
|
||||
if (!chan) {
|
||||
/*
|
||||
* New Channel: first user will be channel operator
|
||||
* unless this is a modeless channel.
|
||||
*/
|
||||
if (chan) {
|
||||
/* Already existing channel: check if the
|
||||
* client is allowed to join */
|
||||
if (!join_allowed(Client, chan, channame, key))
|
||||
break;
|
||||
} else {
|
||||
/* New channel: first user will become channel
|
||||
* operator unless this is a modeless channel */
|
||||
if (*channame != '+')
|
||||
flags = "o";
|
||||
} else
|
||||
if (!join_allowed(Client, target, chan, channame, key))
|
||||
break;
|
||||
}
|
||||
|
||||
/* Local client: update idle time */
|
||||
Conn_UpdateIdle(Client_Conn(Client));
|
||||
@ -293,7 +313,9 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||
* that the "one shot" entries (generated by INVITE
|
||||
* commands) in this list become deleted when a user
|
||||
* joins a channel this way. */
|
||||
if (chan) (void)Lists_Check(Channel_GetListInvites(chan), target);
|
||||
if (chan)
|
||||
(void)Lists_Check(Channel_GetListInvites(chan),
|
||||
target);
|
||||
}
|
||||
|
||||
/* Join channel (and create channel if it doesn't exist) */
|
||||
|
Loading…
Reference in New Issue
Block a user