Changes
This commit is contained in:
@@ -7550,6 +7550,74 @@ CommandResult ConnectedClient::handleCommandConversationFetch(ts::Command &cmd)
|
||||
}
|
||||
|
||||
|
||||
CommandResult ConnectedClient::handleCommandConversationMessageDelete(ts::Command &cmd) {
|
||||
CMD_REF_SERVER(ref_server);
|
||||
CMD_CHK_AND_INC_FLOOD_POINTS(25);
|
||||
|
||||
auto conversation_manager = ref_server->conversation_manager();
|
||||
std::shared_ptr<conversation::Conversation> current_conversation;
|
||||
ChannelId current_conversation_id = 0;
|
||||
|
||||
for(size_t index = 0; index < cmd.bulkCount(); index++) {
|
||||
auto &bulk = cmd[index];
|
||||
|
||||
if(!bulk.has("cid") || !bulk["cid"].castable<ChannelId>())
|
||||
continue;
|
||||
|
||||
/* test if we have access to the conversation */
|
||||
if(current_conversation_id != bulk["cid"].as<ChannelId>()) {
|
||||
current_conversation_id = bulk["cid"].as<ChannelId>();
|
||||
|
||||
/* test if we're able to see the channel */
|
||||
{
|
||||
shared_lock channel_view_lock(this->channel_lock);
|
||||
auto channel = this->channel_view()->find_channel(current_conversation_id);
|
||||
if(!channel)
|
||||
return findError("conversation_invalid_id");
|
||||
}
|
||||
|
||||
/* test if there is a channel password or join power which denies that we see the conversation */
|
||||
{
|
||||
shared_lock channel_view_lock(ref_server->channel_tree_lock);
|
||||
auto channel = ref_server->getChannelTree()->findChannel(current_conversation_id);
|
||||
if(!channel)
|
||||
return findError("conversation_invalid_id");
|
||||
|
||||
if(!bulk.has("cpw"))
|
||||
bulk["cpw"] = "";
|
||||
|
||||
if (!channel->passwordMatch(bulk["cpw"], true))
|
||||
if (!this->permissionGranted(permission::PERMTEST_ORDERED, permission::b_channel_join_ignore_password, 1, channel, true))
|
||||
return findError("channel_invalid_password");
|
||||
|
||||
if (!this->permissionGranted(permission::PERMTEST_ORDERED, permission::b_channel_conversation_message_delete, 1, channel))
|
||||
return CommandResultPermissionError{permission::b_channel_conversation_message_delete};
|
||||
|
||||
if(!this->permissionGranted(permission::PERMTEST_ORDERED, permission::b_channel_ignore_join_power, 1, channel, true)) {
|
||||
auto permission_granted = this->calculate_permission_value(permission::i_channel_join_power, channel->channelId());
|
||||
if(!channel->permission_granted(permission::i_channel_needed_join_power, permission_granted, false))
|
||||
return CommandResultPermissionError{permission::i_channel_needed_join_power};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
current_conversation = conversation_manager->get(current_conversation_id);
|
||||
if(!current_conversation) continue;
|
||||
|
||||
auto timestamp_begin = system_clock::time_point{} + milliseconds{bulk["timestamp_begin"]};
|
||||
auto timestamp_end = system_clock::time_point{} + milliseconds{bulk.has("timestamp_begin") ? bulk["timestamp_begin"].as<uint64_t>() : 0};
|
||||
auto limit = bulk.has("limit") ? bulk["limit"].as<uint64_t>() : 1;
|
||||
if(limit > 100)
|
||||
limit = 100;
|
||||
auto delete_count = current_conversation->delete_messages(timestamp_begin, limit, timestamp_end, bulk["cldbid"]);
|
||||
if(delete_count > 0) {
|
||||
//TODO: Notify
|
||||
}
|
||||
}
|
||||
|
||||
return CommandResult::Success;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user