-/* Copyright (C) 2009-2012, Martin Johansson <martin@fatbob.nu>
- Copyright (C) 2005-2012, Thorvald Natvig <thorvald@natvig.com>
+/* Copyright (C) 2009-2014, Martin Johansson <martin@fatbob.nu>
+ Copyright (C) 2005-2014, Thorvald Natvig <thorvald@natvig.com>
All rights reserved.
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);
}
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;
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;
}
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)
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;
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);
while (Client_codec_iterate(target, &codec_itr) != NULL)
sendmsg->payload.userStats->celt_versions[i++] = codec_itr->codec;
+ sendmsg->payload.userStats->has_opus = true;
sendmsg->payload.userStats->opus = target->bOpus;
/* Address */