X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmessagehandler.c;h=47e05ac8357e6926bf255fbf7a15d49a63c5da98;hb=cac4b71f9ea600608b421127df1f80407182e405;hp=f075c469d76e0bf54bdf6d5b304352360832adc1;hpb=134ce814d444d90c229d0b1777d575bc1effa718;p=umurmur.git diff --git a/src/messagehandler.c b/src/messagehandler.c index f075c46..47e05ac 100644 --- a/src/messagehandler.c +++ b/src/messagehandler.c @@ -263,6 +263,10 @@ void Mh_handle_message(client_t *client, message_t *msg) sendmsg->payload.channelState->name = strdup(ch_itr->name); if (ch_itr->desc) sendmsg->payload.channelState->description = strdup(ch_itr->desc); + if (ch_itr->position != 0) { + sendmsg->payload.channelState->has_position = true; + sendmsg->payload.channelState->position = ch_itr->position; + } Log_debug("Send channel info: %s", sendmsg->payload.channelState->name); Client_send_message(client, sendmsg); } @@ -299,6 +303,11 @@ void Mh_handle_message(client_t *client, message_t *msg) sendmsg->payload.userState->has_channel_id = true; sendmsg->payload.userState->channel_id = ((channel_t *)client->channel)->id; + if (defaultChan->silent) { + sendmsg->payload.userState->has_suppress = true; + sendmsg->payload.userState->suppress = true; + } + Client_send_message_except(client, sendmsg); client_itr = NULL; @@ -311,6 +320,10 @@ void Mh_handle_message(client_t *client, message_t *msg) sendmsg->payload.userState->name = strdup(client_itr->username); sendmsg->payload.userState->has_channel_id = true; sendmsg->payload.userState->channel_id = ((channel_t *)client_itr->channel)->id; + sendmsg->payload.userState->has_suppress = ((channel_t *)client_itr->channel)->silent; + sendmsg->payload.userState->suppress = ((channel_t *)client_itr->channel)->silent; + + client_itr->isSuppressed = ((channel_t *)client_itr->channel)->silent; if (client_itr->self_deaf) { sendmsg->payload.userState->has_self_deaf = true; @@ -500,30 +513,44 @@ void Mh_handle_message(client_t *client, message_t *msg) } if (msg->payload.userState->has_channel_id) { int leave_id; - channelJoinResult_t chjoin_rc = Chan_userJoin_id_test(msg->payload.userState->channel_id, target); - - if (chjoin_rc != CHJOIN_OK) { - if (chjoin_rc == CHJOIN_WRONGPW) { - if (target == client && !client->isAdmin) { - sendPermissionDenied(client, "Wrong channel password"); - break; - } - /* Tricky one: if user hasn't the password, but is moved to the channel by admin then let - * the user in. Also let admin user in regardless of channel password. - * Take no action on other errors. - */ - else if (!client->isAdmin) - break; + + channelJoinResult_t result = Chan_userJoin_id_test(msg->payload.userState->channel_id, target); + + if (result.CHJOIN_NOENTER || result.CHJOIN_NOTFOUND) + break; + + if (result.CHJOIN_WRONGPW) { + if (target == client && !client->isAdmin) { + sendPermissionDenied(client, "Wrong channel password"); + break; } - else break; + /* Tricky one: if user hasn't the password, but is moved to the channel by admin then let + * the user in. Also let admin user in regardless of channel password. + * Take no action on other errors. + */ + else if (!client->isAdmin) + break; } - + leave_id = Chan_userJoin_id(msg->payload.userState->channel_id, target); if (leave_id > 0) { Log_debug("Removing channel ID %d", leave_id); sendmsg = Msg_create(ChannelRemove); sendmsg->payload.channelRemove->channel_id = leave_id; } + + if (result.CHJOIN_SILENT) { + if (!target->isSuppressed) { + msg->payload.userState->has_suppress = true; + msg->payload.userState->suppress = true; + target->isSuppressed = true; + } + } + else if (target->isSuppressed) { + msg->payload.userState->has_suppress = true; + msg->payload.userState->suppress = false; + target->isSuppressed = false; + } } if (msg->payload.userState->has_plugin_context) { if (client->context) @@ -728,6 +755,8 @@ void Mh_handle_message(client_t *client, message_t *msg) newchan = Chan_createChannel(msg->payload.channelState->name, msg->payload.channelState->description); newchan->temporary = true; + if (msg->payload.channelState->has_position) + newchan->position = msg->payload.channelState->position; Chan_addChannel(parent, newchan); msg->payload.channelState->has_channel_id = true; msg->payload.channelState->channel_id = newchan->id; @@ -740,8 +769,15 @@ void Mh_handle_message(client_t *client, message_t *msg) sendmsg->payload.userState->session = client->sessionId; sendmsg->payload.userState->has_channel_id = true; sendmsg->payload.userState->channel_id = newchan->id; + + if (client->isSuppressed) { + sendmsg->payload.userState->has_suppress = true; + sendmsg->payload.userState->suppress = false; + client->isSuppressed = false; + } + Client_send_message_except(NULL, sendmsg); - + leave_id = Chan_userJoin(newchan, client); if (leave_id > 0) { Log_debug("Removing channel ID %d", leave_id);