Implemented new chat system
This commit is contained in:
@@ -966,4 +966,55 @@ permission::v2::PermissionFlaggedValue ConnectedClient::calculate_permission_val
|
||||
|
||||
auto value = this->permissionValue(permission::PERMTEST_ORDERED, permission, nullptr);
|
||||
return {value, value != permNotGranted};
|
||||
}
|
||||
|
||||
#define RESULT(flag) \
|
||||
do { \
|
||||
ventry->join_state_id = this->join_state_id; \
|
||||
ventry->joinable = (flag); \
|
||||
return flag; \
|
||||
} while(0)
|
||||
|
||||
bool ConnectedClient::calculate_and_get_join_state(const std::shared_ptr<BasicChannel>& channel) {
|
||||
shared_ptr<ViewEntry> ventry;
|
||||
{
|
||||
shared_lock view_lock(this->channel_lock);
|
||||
ventry = this->channel_view()->find_channel(channel);
|
||||
if(!ventry)
|
||||
return false;
|
||||
}
|
||||
if(ventry->join_state_id == this->join_state_id)
|
||||
return ventry->joinable;
|
||||
|
||||
auto permission_cache = make_shared<CalculateCache>();
|
||||
switch(channel->channelType()) {
|
||||
case ChannelType::permanent:
|
||||
if(!this->permissionGranted(permission::PERMTEST_ORDERED, permission::b_channel_join_permanent, 1, channel, true, permission_cache))
|
||||
RESULT(false);
|
||||
break;
|
||||
case ChannelType::semipermanent:
|
||||
if(!this->permissionGranted(permission::PERMTEST_ORDERED, permission::b_channel_join_semi_permanent, 1, channel, true, permission_cache))
|
||||
RESULT(false);
|
||||
break;
|
||||
case ChannelType::temporary:
|
||||
if(!this->permissionGranted(permission::PERMTEST_ORDERED, permission::b_channel_join_temporary, 1, channel, true, permission_cache))
|
||||
RESULT(false);
|
||||
break;
|
||||
}
|
||||
if(!this->permissionGranted(permission::PERMTEST_ORDERED, permission::b_channel_ignore_join_power, 1, channel, true, permission_cache)) {
|
||||
auto result = this->server->calculatePermissions2(this->getClientDatabaseId(), {permission::i_channel_join_power}, this->getType(), channel->channelId(), false, permission_cache);
|
||||
if(result.empty())
|
||||
RESULT(false);
|
||||
|
||||
if(!channel->permission_granted(permission::i_channel_needed_join_power, result.back().second, false))
|
||||
RESULT(false);
|
||||
}
|
||||
|
||||
auto val = this->permissionValue(permission::PERMTEST_ORDERED, permission::b_client_is_sticky, this->currentChannel, permission_cache);
|
||||
if (val != permNotGranted && val > 0) {
|
||||
auto st = this->permissionValue(permission::PERMTEST_ORDERED, permission::b_client_ignore_sticky, this->currentChannel, permission_cache);
|
||||
if (st != 1)
|
||||
RESULT(false);
|
||||
}
|
||||
RESULT(true);
|
||||
}
|
||||
Reference in New Issue
Block a user