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
|
static bool
|
||||||
join_allowed(CLIENT *Client, CLIENT *target, CHANNEL *chan,
|
join_allowed(CLIENT *Client, CHANNEL *chan, const char *channame,
|
||||||
const char *channame, const char *key)
|
const char *key)
|
||||||
{
|
{
|
||||||
bool is_invited, is_banned;
|
bool is_invited, is_banned;
|
||||||
const char *channel_modes;
|
const char *channel_modes;
|
||||||
@ -73,32 +82,40 @@ join_allowed(CLIENT *Client, CLIENT *target, CHANNEL *chan,
|
|||||||
if (strchr(Client_Modes(Client), 'o'))
|
if (strchr(Client_Modes(Client), 'o'))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
is_banned = Lists_Check(Channel_GetListBans(chan), target);
|
is_banned = Lists_Check(Channel_GetListBans(chan), Client);
|
||||||
is_invited = Lists_Check(Channel_GetListInvites(chan), target);
|
is_invited = Lists_Check(Channel_GetListInvites(chan), Client);
|
||||||
|
|
||||||
if (is_banned && !is_invited) {
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
channel_modes = Channel_Modes(chan);
|
channel_modes = Channel_Modes(chan);
|
||||||
if ((strchr(channel_modes, 'i')) && !is_invited) {
|
if ((strchr(channel_modes, 'i')) && !is_invited) {
|
||||||
/* Channel is "invite-only" (and Client wasn't invited) */
|
/* Channel is "invite-only" and client is not on invite list */
|
||||||
IRC_WriteStrClient(Client, ERR_INVITEONLYCHAN_MSG, Client_ID(Client), channame);
|
IRC_WriteStrClient(Client, ERR_INVITEONLYCHAN_MSG,
|
||||||
|
Client_ID(Client), channame);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Is the channel protected by a key? */
|
if (!Channel_CheckKey(chan, Client, key ? key : "")) {
|
||||||
if (!Channel_CheckKey(chan, target, key ? key : "")) {
|
/* Channel is protected by a channel key and the client
|
||||||
|
* didn't specify the correct one */
|
||||||
IRC_WriteStrClient(Client, ERR_BADCHANNELKEY_MSG,
|
IRC_WriteStrClient(Client, ERR_BADCHANNELKEY_MSG,
|
||||||
Client_ID(Client), channame);
|
Client_ID(Client), channame);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/* Are there already too many members? */
|
|
||||||
if ((strchr(channel_modes, 'l')) && (Channel_MaxUsers(chan) <= Channel_MemberCount(chan))) {
|
if ((strchr(channel_modes, 'l')) &&
|
||||||
IRC_WriteStrClient(Client, ERR_CHANNELISFULL_MSG, Client_ID(Client), channame);
|
(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 false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -270,20 +287,23 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
|||||||
|
|
||||||
/* Local client? */
|
/* Local client? */
|
||||||
if (Client_Type(Client) == CLIENT_USER) {
|
if (Client_Type(Client) == CLIENT_USER) {
|
||||||
/* Test if the user has reached his maximum channel count */
|
/* Test if the user has reached the channel limit */
|
||||||
if ((Conf_MaxJoins > 0) && (Channel_CountForUser(Client) >= Conf_MaxJoins))
|
if ((Conf_MaxJoins > 0) &&
|
||||||
return IRC_WriteStrClient(Client, ERR_TOOMANYCHANNELS_MSG,
|
(Channel_CountForUser(Client) >= Conf_MaxJoins))
|
||||||
Client_ID(Client), channame);
|
return IRC_WriteStrClient(Client,
|
||||||
if (!chan) {
|
ERR_TOOMANYCHANNELS_MSG,
|
||||||
/*
|
Client_ID(Client), channame);
|
||||||
* New Channel: first user will be channel operator
|
if (chan) {
|
||||||
* unless this is a modeless channel.
|
/* 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 != '+')
|
if (*channame != '+')
|
||||||
flags = "o";
|
flags = "o";
|
||||||
} else
|
}
|
||||||
if (!join_allowed(Client, target, chan, channame, key))
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* Local client: update idle time */
|
/* Local client: update idle time */
|
||||||
Conn_UpdateIdle(Client_Conn(Client));
|
Conn_UpdateIdle(Client_Conn(Client));
|
||||||
@ -293,7 +313,9 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
|||||||
* that the "one shot" entries (generated by INVITE
|
* that the "one shot" entries (generated by INVITE
|
||||||
* commands) in this list become deleted when a user
|
* commands) in this list become deleted when a user
|
||||||
* joins a channel this way. */
|
* 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) */
|
/* Join channel (and create channel if it doesn't exist) */
|
||||||
|
Loading…
Reference in New Issue
Block a user