}
void channel_join(struct client_data *client, const char *channel, const char *chankey)
{
- (void)chankey;
// TODO: check channel limit?
if (channel[0] != '#' && channel[0] != '&')
return; // FIXME: error
} else {
if (trie_get(&chan->members, client->key))
return;
- // TODO: check key
- // TODO: check limit
- // TODO: check ban
- // TODO: check ban exemption
- // TODO: check invite
- // TODO: check invite exemption
+ if (!(client->umode & UMODE_OPER)) {
+ if (chan->chankey && (!chankey || strcmp(chan->chankey, chankey) == 0))
+ return; // error 475
+ if (chan->member_limit != -1 && chan->member_count >= chan->member_limit)
+ return; // error 471
+ // TODO: check ban
+ // TODO: check ban exemption
+ // TODO: check invite
+ // TODO: check invite exemption
+ }
}
if (trie_set(&chan->members, client->key, client, NULL) == -1)
abort();