diff --git a/server/src/client/ConnectedClient.cpp b/server/src/client/ConnectedClient.cpp index db366cc..74b5cc5 100644 --- a/server/src/client/ConnectedClient.cpp +++ b/server/src/client/ConnectedClient.cpp @@ -127,9 +127,7 @@ void ConnectedClient::updateChannelClientProperties(bool lock_channel_tree, bool permission_talk_power{0, false}, permission_ignore_antiflood{0, false}, permission_channel_view_power{0, false}, - permission_channel_ignore_view_power{0, false}, - permission_icon_id{0, false}, - permission_client_is_priority_speaker{0, false}; + permission_channel_ignore_view_power{0, false}; for(const auto& perm : permissions) { if(perm.first == permission::i_client_talk_power) { @@ -140,10 +138,6 @@ void ConnectedClient::updateChannelClientProperties(bool lock_channel_tree, bool permission_channel_view_power = perm.second; } else if(perm.first == permission::b_channel_ignore_view_power) { permission_channel_ignore_view_power = perm.second; - } else if(perm.first == permission::i_icon_id) { - permission_icon_id = perm.second; - } else if(perm.first == permission::b_client_is_priority_speaker) { - permission_client_is_priority_speaker = perm.second; } else { sassert(false); } @@ -182,16 +176,43 @@ void ConnectedClient::updateChannelClientProperties(bool lock_channel_tree, bool { IconId current_icon_id = this->properties()[property::CLIENT_ICON_ID].as_save(); - IconId new_icon_id{permission_icon_id.has_value ? (IconId) permission_icon_id.value : 0}; + IconId new_icon_id{ 0}; + + auto local_permissions = this->clientPermissions; + if(local_permissions) { + permission::v2::PermissionFlaggedValue value{0, false}; + auto permission_flags = local_permissions->permission_flags(permission::i_icon_id); + if(permission_flags.channel_specific && this->currentChannel) { + auto val = local_permissions->channel_permission(permission::i_icon_id, this->currentChannel->channelId()); + value = { val.values.value, val.flags.value_set }; + } + + if(!value.has_value) { + value = local_permissions->permission_value_flagged(permission::i_icon_id); + } + + if(value.has_value) { + new_icon_id = value.value; + } + } + + if(this->properties()[property::CLIENT_ICON_ID].update_value(new_icon_id)) { logTrace(this->getServerId(), "{} Updating client icon from {} to {}", CLIENT_STR_LOG_PREFIX, current_icon_id, new_icon_id); updated_client_properties.emplace_back(property::CLIENT_ICON_ID); } } - auto pSpeakerGranted = permission::v2::permission_granted(1, permission_client_is_priority_speaker); - if(properties()[property::CLIENT_IS_PRIORITY_SPEAKER].update_value(pSpeakerGranted)){ - updated_client_properties.emplace_back(property::CLIENT_IS_PRIORITY_SPEAKER); + { + auto local_permissions = this->clientPermissions; + auto permission_speaker = local_permissions ? + local_permissions->channel_permission(permission::b_client_is_priority_speaker, channel ? channel->channelId() : 0) : + permission::v2::empty_channel_permission; + + auto speaker_granted = permission::v2::permission_granted(1, { permission_speaker.values.value, permission_speaker.flags.value_set }); + if(properties()[property::CLIENT_IS_PRIORITY_SPEAKER].update_value(speaker_granted)){ + updated_client_properties.emplace_back(property::CLIENT_IS_PRIORITY_SPEAKER); + } } block_flood = !permission::v2::permission_granted(1, permission_ignore_antiflood);