Add td_api::BlockList.

This commit is contained in:
levlam 2023-07-28 17:33:47 +03:00
parent f0e59da1ff
commit 3794e65b76
9 changed files with 195 additions and 58 deletions

View File

@ -542,6 +542,7 @@ set(TDLIB_SOURCE
td/telegram/BackgroundInfo.h
td/telegram/BackgroundManager.h
td/telegram/BackgroundType.h
td/telegram/BlockListId.h
td/telegram/BotCommand.h
td/telegram/BotCommandScope.h
td/telegram/BotInfoManager.h

View File

@ -746,7 +746,7 @@ botInfo short_description:string description:string photo:photo animation:animat
//-If non-null and personal_photo is null, then it is the same photo as in user.profile_photo and chat.photo
//@public_photo User profile photo visible if the main photo is hidden by privacy settings; may be null. If null and user.profile_photo is null, then the photo is empty; otherwise, it is unknown.
//-If non-null and both photo and personal_photo are null, then it is the same photo as in user.profile_photo and chat.photo. This photo isn't returned in the list of user photos
//@is_blocked True, if the user is blocked by the current user
//@block_list Block list to which the user is added; may be null if none
//@can_be_called True, if the user can be called
//@supports_video_calls True, if a video call can be created with the user
//@has_private_calls True, if the user can't be called due to their privacy settings
@ -758,7 +758,7 @@ botInfo short_description:string description:string photo:photo animation:animat
//@premium_gift_options The list of available options for gifting Telegram Premium to the user
//@group_in_common_count Number of group chats where both the other user and the current user are a member; 0 for the current user
//@bot_info For bots, information about the bot; may be null if the user isn't a bot
userFullInfo personal_photo:chatPhoto photo:chatPhoto public_photo:chatPhoto is_blocked:Bool can_be_called:Bool supports_video_calls:Bool has_private_calls:Bool has_private_forwards:Bool has_restricted_voice_and_video_note_messages:Bool has_pinned_stories:Bool need_phone_number_privacy_exception:Bool bio:formattedText premium_gift_options:vector<premiumPaymentOption> group_in_common_count:int32 bot_info:botInfo = UserFullInfo;
userFullInfo personal_photo:chatPhoto photo:chatPhoto public_photo:chatPhoto block_list:BlockList can_be_called:Bool supports_video_calls:Bool has_private_calls:Bool has_private_forwards:Bool has_restricted_voice_and_video_note_messages:Bool has_pinned_stories:Bool need_phone_number_privacy_exception:Bool bio:formattedText premium_gift_options:vector<premiumPaymentOption> group_in_common_count:int32 bot_info:botInfo = UserFullInfo;
//@description Represents a list of users @total_count Approximate total number of users found @user_ids A list of user identifiers
users total_count:int32 user_ids:vector<int53> = Users;
@ -1473,10 +1473,10 @@ videoChat group_call_id:int32 has_participants:Bool default_participant_id:Messa
//@last_message Last message in the chat; may be null if none or unknown
//@positions Positions of the chat in chat lists
//@message_sender_id Identifier of a user or chat that is selected to send messages in the chat; may be null if the user can't change message sender
//@block_list Block list to which the chat is added; may be null if none
//@has_protected_content True, if chat content can't be saved locally, forwarded, or copied
//@is_translatable True, if translation of all messages in the chat must be suggested to the user
//@is_marked_as_unread True, if the chat is marked as unread
//@is_blocked True, if the chat is blocked by the current user and private messages from the chat can't be received
//@has_scheduled_messages True, if the chat has scheduled messages
//@can_be_deleted_only_for_self True, if the chat messages can be deleted only for the current user while other users will continue to see the messages
//@can_be_deleted_for_all_users True, if the chat messages can be deleted for all users
@ -1498,7 +1498,7 @@ videoChat group_call_id:int32 has_participants:Bool default_participant_id:Messa
//@reply_markup_message_id Identifier of the message from which reply markup needs to be used; 0 if there is no default custom reply markup in the chat
//@draft_message A draft of a message in the chat; may be null if none
//@client_data Application-specific data associated with the chat. (For example, the chat scroll position or local chat notification settings can be stored here.) Persistent if the message database is used
chat id:int53 type:ChatType title:string photo:chatPhotoInfo permissions:chatPermissions last_message:message positions:vector<chatPosition> message_sender_id:MessageSender has_protected_content:Bool is_translatable:Bool is_marked_as_unread:Bool is_blocked:Bool has_scheduled_messages:Bool can_be_deleted_only_for_self:Bool can_be_deleted_for_all_users:Bool can_be_reported:Bool default_disable_notification:Bool unread_count:int32 last_read_inbox_message_id:int53 last_read_outbox_message_id:int53 unread_mention_count:int32 unread_reaction_count:int32 notification_settings:chatNotificationSettings available_reactions:ChatAvailableReactions message_auto_delete_time:int32 background:chatBackground theme_name:string action_bar:ChatActionBar video_chat:videoChat pending_join_requests:chatJoinRequestsInfo reply_markup_message_id:int53 draft_message:draftMessage client_data:string = Chat;
chat id:int53 type:ChatType title:string photo:chatPhotoInfo permissions:chatPermissions last_message:message positions:vector<chatPosition> message_sender_id:MessageSender block_list:BlockList has_protected_content:Bool is_translatable:Bool is_marked_as_unread:Bool has_scheduled_messages:Bool can_be_deleted_only_for_self:Bool can_be_deleted_for_all_users:Bool can_be_reported:Bool default_disable_notification:Bool unread_count:int32 last_read_inbox_message_id:int53 last_read_outbox_message_id:int53 unread_mention_count:int32 unread_reaction_count:int32 notification_settings:chatNotificationSettings available_reactions:ChatAvailableReactions message_auto_delete_time:int32 background:chatBackground theme_name:string action_bar:ChatActionBar video_chat:videoChat pending_join_requests:chatJoinRequestsInfo reply_markup_message_id:int53 draft_message:draftMessage client_data:string = Chat;
//@description Represents a list of chats @total_count Approximate total number of chats found @chat_ids List of chat identifiers
chats total_count:int32 chat_ids:vector<int53> = Chats;
@ -1532,7 +1532,7 @@ chatActionBarReportUnrelatedLocation = ChatActionBar;
//@description The chat is a recently created group chat to which new members can be invited
chatActionBarInviteMembers = ChatActionBar;
//@description The chat is a private or secret chat, which can be reported using the method reportChat, or the other user can be blocked using the method toggleMessageSenderIsBlocked,
//@description The chat is a private or secret chat, which can be reported using the method reportChat, or the other user can be blocked using the method setMessageSenderBlockList,
//-or the other user can be added to the contact list using the method addContact. If the chat is a private chat with a user with an emoji status, then a notice about emoji status usage must be shown
//@can_unarchive If true, the chat was automatically archived and can be moved back to the main chat list using addChatToList simultaneously with setting chat notification settings to default using setChatNotificationSettings
//@distance If non-negative, the current user was found by the peer through searchChatsNearby and this is the distance between the users
@ -4994,6 +4994,15 @@ storyInfo story_id:int32 date:int32 is_for_close_friends:Bool = StoryInfo;
chatActiveStories chat_id:int53 list:StoryList order:int53 max_read_story_id:int32 stories:vector<storyInfo> = ChatActiveStories;
//@class BlockList @description Describes a type of a block list
//@description The main block list that disallows writing messages to the current user, receiving their status and photo, viewing of stories, and some other actions
blockListMain = BlockList;
//@description The block list that disallows viewing of stories of the current user
blockListStories = BlockList;
//@description Contains a part of a file @data File bytes
filePart data:bytes = FilePart;
@ -5605,8 +5614,8 @@ updateChatIsTranslatable chat_id:int53 is_translatable:Bool = Update;
//@description A chat was marked as unread or was read @chat_id Chat identifier @is_marked_as_unread New value of is_marked_as_unread
updateChatIsMarkedAsUnread chat_id:int53 is_marked_as_unread:Bool = Update;
//@description A chat was blocked or unblocked @chat_id Chat identifier @is_blocked New value of is_blocked
updateChatIsBlocked chat_id:int53 is_blocked:Bool = Update;
//@description A chat was blocked or unblocked @chat_id Chat identifier @block_list Block list to which the chat is added; may be null if none
updateChatBlockList chat_id:int53 block_list:BlockList = Update;
//@description A chat's has_scheduled_messages field has changed @chat_id Chat identifier @has_scheduled_messages New value of has_scheduled_messages
updateChatHasScheduledMessages chat_id:int53 has_scheduled_messages:Bool = Update;
@ -7758,8 +7767,10 @@ getGroupCallStreams group_call_id:int32 = GroupCallStreams;
getGroupCallStreamSegment group_call_id:int32 time_offset:int53 scale:int32 channel_id:int32 video_quality:GroupCallVideoQuality = FilePart;
//@description Changes the block state of a message sender. Currently, only users and supergroup chats can be blocked @sender_id Identifier of a message sender to block/unblock @is_blocked New value of is_blocked
toggleMessageSenderIsBlocked sender_id:MessageSender is_blocked:Bool = Ok;
//@description Changes the block list of a message sender. Currently, only users and supergroup chats can be blocked
//@sender_id Identifier of a message sender to block/unblock
//@block_list New block list for the message sender; pass null to unblock the message sender
setMessageSenderBlockList sender_id:MessageSender block_list:BlockList = Ok;
//@description Blocks an original sender of a message in the Replies chat
//@message_id The identifier of an incoming message in the Replies chat

99
td/telegram/BlockListId.h Normal file
View File

@ -0,0 +1,99 @@
//
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2023
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
#pragma once
#include "td/telegram/td_api.h"
#include "td/utils/common.h"
#include "td/utils/HashTableUtils.h"
#include "td/utils/StringBuilder.h"
namespace td {
class BlockListId {
enum class Type : int32 { None = -1, Main, Stories };
Type type_ = Type::None;
friend struct BlockListIdHash;
explicit BlockListId(Type type) : type_(type) {
}
public:
BlockListId() = default;
BlockListId(bool is_blocked, bool is_blocked_for_stories)
: type_(is_blocked ? Type::Main : (is_blocked_for_stories ? Type::Stories : Type::None)) {
}
explicit BlockListId(const td_api::object_ptr<td_api::BlockList> &block_list) {
if (block_list == nullptr) {
return;
}
switch (block_list->get_id()) {
case td_api::blockListMain::ID:
type_ = Type::Main;
break;
case td_api::blockListStories::ID:
type_ = Type::Stories;
break;
default:
UNREACHABLE();
}
}
static BlockListId main() {
return BlockListId(Type::Main);
}
static BlockListId stories() {
return BlockListId(Type::Stories);
}
td_api::object_ptr<td_api::BlockList> get_block_list_object() const {
switch (type_) {
case Type::None:
return nullptr;
case Type::Main:
return td_api::make_object<td_api::blockListMain>();
case Type::Stories:
return td_api::make_object<td_api::blockListStories>();
default:
UNREACHABLE();
}
}
bool is_valid() const {
return type_ == Type::Main || type_ == Type::Stories;
}
bool operator==(const BlockListId &other) const {
return type_ == other.type_;
}
bool operator!=(const BlockListId &other) const {
return type_ != other.type_;
}
};
struct BlockListIdHash {
uint32 operator()(BlockListId block_list_id) const {
return Hash<int32>()(static_cast<int32>(block_list_id.type_));
}
};
inline StringBuilder &operator<<(StringBuilder &string_builder, BlockListId block_list_id) {
if (block_list_id == BlockListId::main()) {
return string_builder << "MainBlockList";
}
if (block_list_id == BlockListId::stories()) {
return string_builder << "StoriesBlockList";
}
return string_builder << "InvalidBlockList";
}
} // namespace td

View File

@ -9,6 +9,7 @@
#include "td/telegram/Account.h"
#include "td/telegram/AnimationsManager.h"
#include "td/telegram/AuthManager.h"
#include "td/telegram/BlockListId.h"
#include "td/telegram/BotMenuButton.h"
#include "td/telegram/ChannelParticipantFilter.h"
#include "td/telegram/ConfigManager.h"
@ -19222,10 +19223,11 @@ tl_object_ptr<td_api::userFullInfo> ContactsManager::get_user_full_info_object(U
bio_object = get_formatted_text_object(bio, true, 0);
}
auto voice_messages_forbidden = is_premium ? user_full->voice_messages_forbidden : false;
return make_tl_object<td_api::userFullInfo>(
auto block_list_id = BlockListId(user_full->is_blocked, user_full->is_blocked_for_stories);
return td_api::make_object<td_api::userFullInfo>(
get_chat_photo_object(td_->file_manager_.get(), user_full->personal_photo),
get_chat_photo_object(td_->file_manager_.get(), user_full->photo),
get_chat_photo_object(td_->file_manager_.get(), user_full->fallback_photo), user_full->is_blocked,
get_chat_photo_object(td_->file_manager_.get(), user_full->fallback_photo), block_list_id.get_block_list_object(),
user_full->can_be_called, user_full->supports_video_calls, user_full->has_private_calls,
!user_full->private_forward_name.empty(), voice_messages_forbidden, user_full->has_pinned_stories,
user_full->need_phone_number_privacy_exception, std::move(bio_object),

View File

@ -9,6 +9,7 @@
#include "td/telegram/Account.h"
#include "td/telegram/AuthManager.h"
#include "td/telegram/BackgroundInfo.hpp"
#include "td/telegram/BlockListId.h"
#include "td/telegram/ChainId.h"
#include "td/telegram/ChannelType.h"
#include "td/telegram/ChatId.h"
@ -1617,28 +1618,29 @@ class ToggleDialogTranslationsQuery final : public Td::ResultHandler {
class ToggleDialogIsBlockedQuery final : public Td::ResultHandler {
Promise<Unit> promise_;
DialogId dialog_id_;
bool is_blocked_;
public:
explicit ToggleDialogIsBlockedQuery(Promise<Unit> &&promise) : promise_(std::move(promise)) {
}
void send(DialogId dialog_id, bool is_blocked) {
void send(DialogId dialog_id, bool is_blocked, bool is_blocked_for_stories) {
dialog_id_ = dialog_id;
is_blocked_ = is_blocked;
auto input_peer = td_->messages_manager_->get_input_peer(dialog_id, AccessRights::Know);
CHECK(input_peer != nullptr && input_peer->get_id() != telegram_api::inputPeerEmpty::ID);
int32 flags = 0;
if (is_blocked_for_stories) {
flags |= telegram_api::contacts_block::MY_STORIES_FROM_MASK;
}
vector<ChainId> chain_ids{{dialog_id, MessageContentType::Photo}, {dialog_id, MessageContentType::Text}};
auto query = is_blocked ? G()->net_query_creator().create(
telegram_api::contacts_block(flags, false /*ignored*/, std::move(input_peer)),
std::move(chain_ids))
: G()->net_query_creator().create(
telegram_api::contacts_unblock(flags, false /*ignored*/, std::move(input_peer)),
std::move(chain_ids));
auto query =
is_blocked || is_blocked_for_stories
? G()->net_query_creator().create(
telegram_api::contacts_block(flags, false /*ignored*/, std::move(input_peer)), std::move(chain_ids))
: G()->net_query_creator().create(
telegram_api::contacts_unblock(flags, false /*ignored*/, std::move(input_peer)),
std::move(chain_ids));
send_query(std::move(query));
}
@ -1661,7 +1663,6 @@ class ToggleDialogIsBlockedQuery final : public Td::ResultHandler {
LOG(ERROR) << "Receive error for ToggleDialogIsBlockedQuery: " << status;
}
if (!G()->close_flag()) {
td_->messages_manager_->on_update_dialog_is_blocked(dialog_id_, !is_blocked_, false);
td_->messages_manager_->get_dialog_info_full(dialog_id_, Auto(), "ToggleDialogIsBlockedQuery");
td_->messages_manager_->reget_dialog_action_bar(dialog_id_, "ToggleDialogIsBlockedQuery");
}
@ -19547,13 +19548,17 @@ void MessagesManager::toggle_dialog_is_translatable_on_server(DialogId dialog_id
->send(dialog_id, is_translatable);
}
Status MessagesManager::toggle_message_sender_is_blocked(const td_api::object_ptr<td_api::MessageSender> &sender,
bool is_blocked) {
Status MessagesManager::set_message_sender_block_list(const td_api::object_ptr<td_api::MessageSender> &sender,
const td_api::object_ptr<td_api::BlockList> &block_list) {
TRY_RESULT(dialog_id, get_message_sender_dialog_id(td_, sender, true, false));
BlockListId block_list_id(block_list);
bool is_blocked = block_list_id == BlockListId::main();
bool is_blocked_for_stories = block_list_id == BlockListId::stories();
switch (dialog_id.get_type()) {
case DialogType::User:
if (dialog_id == get_my_dialog_id()) {
return Status::Error(400, is_blocked ? Slice("Can't block self") : Slice("Can't unblock self"));
return Status::Error(
400, is_blocked || is_blocked_for_stories ? Slice("Can't block self") : Slice("Can't unblock self"));
}
break;
case DialogType::Chat:
@ -19563,8 +19568,7 @@ Status MessagesManager::toggle_message_sender_is_blocked(const td_api::object_pt
break;
case DialogType::SecretChat: {
auto user_id = td_->contacts_manager_->get_secret_chat_user_id(dialog_id.get_secret_chat_id());
if (!user_id.is_valid() ||
!td_->contacts_manager_->have_user_force(user_id, "toggle_message_sender_is_blocked")) {
if (!user_id.is_valid() || !td_->contacts_manager_->have_user_force(user_id, "set_message_sender_block_list")) {
return Status::Error(400, "The secret chat can't be blocked");
}
dialog_id = DialogId(user_id);
@ -19575,22 +19579,21 @@ Status MessagesManager::toggle_message_sender_is_blocked(const td_api::object_pt
UNREACHABLE();
}
Dialog *d = get_dialog_force(dialog_id, "toggle_message_sender_is_blocked");
Dialog *d = get_dialog_force(dialog_id, "set_message_sender_block_list");
if (!have_input_peer(dialog_id, AccessRights::Know)) {
return Status::Error(400, "Message sender isn't accessible");
}
if (d != nullptr) {
if (is_blocked == d->is_blocked) {
if (is_blocked == d->is_blocked && is_blocked_for_stories == d->is_blocked_for_stories) {
return Status::OK();
}
set_dialog_is_blocked(d, is_blocked, is_blocked ? false : d->is_blocked_for_stories);
set_dialog_is_blocked(d, is_blocked, is_blocked_for_stories);
} else {
CHECK(dialog_id.get_type() == DialogType::User);
td_->contacts_manager_->on_update_user_is_blocked(dialog_id.get_user_id(), is_blocked,
is_blocked ? false : d->is_blocked_for_stories);
td_->contacts_manager_->on_update_user_is_blocked(dialog_id.get_user_id(), is_blocked, is_blocked_for_stories);
}
toggle_dialog_is_blocked_on_server(dialog_id, is_blocked, 0);
toggle_dialog_is_blocked_on_server(dialog_id, is_blocked, is_blocked_for_stories, 0);
return Status::OK();
}
@ -19598,11 +19601,13 @@ class MessagesManager::ToggleDialogIsBlockedOnServerLogEvent {
public:
DialogId dialog_id_;
bool is_blocked_;
bool is_blocked_for_stories_;
template <class StorerT>
void store(StorerT &storer) const {
BEGIN_STORE_FLAGS();
STORE_FLAG(is_blocked_);
STORE_FLAG(is_blocked_for_stories_);
END_STORE_FLAGS();
td::store(dialog_id_, storer);
@ -19612,25 +19617,28 @@ class MessagesManager::ToggleDialogIsBlockedOnServerLogEvent {
void parse(ParserT &parser) {
BEGIN_PARSE_FLAGS();
PARSE_FLAG(is_blocked_);
PARSE_FLAG(is_blocked_for_stories_);
END_PARSE_FLAGS();
td::parse(dialog_id_, parser);
}
};
uint64 MessagesManager::save_toggle_dialog_is_blocked_on_server_log_event(DialogId dialog_id, bool is_blocked) {
ToggleDialogIsBlockedOnServerLogEvent log_event{dialog_id, is_blocked};
uint64 MessagesManager::save_toggle_dialog_is_blocked_on_server_log_event(DialogId dialog_id, bool is_blocked,
bool is_blocked_for_stories) {
ToggleDialogIsBlockedOnServerLogEvent log_event{dialog_id, is_blocked, is_blocked_for_stories};
return binlog_add(G()->td_db()->get_binlog(), LogEvent::HandlerType::ToggleDialogIsBlockedOnServer,
get_log_event_storer(log_event));
}
void MessagesManager::toggle_dialog_is_blocked_on_server(DialogId dialog_id, bool is_blocked, uint64 log_event_id) {
void MessagesManager::toggle_dialog_is_blocked_on_server(DialogId dialog_id, bool is_blocked,
bool is_blocked_for_stories, uint64 log_event_id) {
if (log_event_id == 0 && G()->use_message_database()) {
log_event_id = save_toggle_dialog_is_blocked_on_server_log_event(dialog_id, is_blocked);
log_event_id = save_toggle_dialog_is_blocked_on_server_log_event(dialog_id, is_blocked, is_blocked_for_stories);
}
td_->create_handler<ToggleDialogIsBlockedQuery>(get_erase_log_event_promise(log_event_id))
->send(dialog_id, is_blocked);
->send(dialog_id, is_blocked, is_blocked_for_stories);
}
Status MessagesManager::toggle_dialog_silent_send_message(DialogId dialog_id, bool silent_send_message) {
@ -20822,13 +20830,14 @@ td_api::object_ptr<td_api::chat> MessagesManager::get_chat_object(const Dialog *
!need_hide_dialog_draft_message(d->dialog_id) ? get_draft_message_object(d->draft_message) : nullptr;
auto available_reactions = get_dialog_active_reactions(d).get_chat_available_reactions_object();
auto is_translatable = d->is_translatable && is_premium;
auto block_list_id = BlockListId(d->is_blocked, d->is_blocked_for_stories);
return make_tl_object<td_api::chat>(
d->dialog_id.get(), get_chat_type_object(d->dialog_id), get_dialog_title(d->dialog_id),
get_chat_photo_info_object(td_->file_manager_.get(), get_dialog_photo(d->dialog_id)),
get_dialog_default_permissions(d->dialog_id).get_chat_permissions_object(),
get_message_object(d->dialog_id, get_message(d, d->last_message_id), "get_chat_object"),
get_chat_positions_object(d), get_default_message_sender_object(d),
get_dialog_has_protected_content(d->dialog_id), is_translatable, d->is_marked_as_unread, d->is_blocked,
get_chat_positions_object(d), get_default_message_sender_object(d), block_list_id.get_block_list_object(),
get_dialog_has_protected_content(d->dialog_id), is_translatable, d->is_marked_as_unread,
get_dialog_has_scheduled_messages(d), can_delete.for_self_, can_delete.for_all_users_,
can_report_dialog(d->dialog_id), d->notification_settings.silent_send_message,
d->server_unread_count + d->local_unread_count, d->last_read_inbox_message_id.get(),
@ -31765,9 +31774,10 @@ void MessagesManager::set_dialog_is_blocked(Dialog *d, bool is_blocked, bool is_
LOG(INFO) << "Set " << d->dialog_id << " is_blocked to " << is_blocked << '/' << is_blocked_for_stories;
LOG_CHECK(d->is_update_new_chat_sent) << "Wrong " << d->dialog_id << " in set_dialog_is_blocked";
auto block_list_id = BlockListId(d->is_blocked, d->is_blocked_for_stories);
send_closure(G()->td(), &Td::send_update,
td_api::make_object<td_api::updateChatIsBlocked>(get_chat_id_object(d->dialog_id, "updateChatIsBlocked"),
is_blocked));
td_api::make_object<td_api::updateChatBlockList>(get_chat_id_object(d->dialog_id, "updateChatBlockList"),
block_list_id.get_block_list_object()));
if (d->dialog_id.get_type() == DialogType::User) {
td_->contacts_manager_->on_update_user_is_blocked(d->dialog_id.get_user_id(), is_blocked, is_blocked_for_stories);
@ -39916,7 +39926,8 @@ void MessagesManager::on_binlog_events(vector<BinlogEvent> &&events) {
break;
}
toggle_dialog_is_blocked_on_server(dialog_id, log_event.is_blocked_, event.id_);
toggle_dialog_is_blocked_on_server(dialog_id, log_event.is_blocked_, log_event.is_blocked_for_stories_,
event.id_);
break;
}
case LogEvent::HandlerType::SaveDialogDraftMessageOnServer: {

View File

@ -711,8 +711,8 @@ class MessagesManager final : public Actor {
Status toggle_dialog_is_translatable(DialogId dialog_id, bool is_translatable) TD_WARN_UNUSED_RESULT;
Status toggle_message_sender_is_blocked(const td_api::object_ptr<td_api::MessageSender> &sender,
bool is_blocked) TD_WARN_UNUSED_RESULT;
Status set_message_sender_block_list(const td_api::object_ptr<td_api::MessageSender> &sender,
const td_api::object_ptr<td_api::BlockList> &block_list) TD_WARN_UNUSED_RESULT;
Status toggle_dialog_silent_send_message(DialogId dialog_id, bool silent_send_message) TD_WARN_UNUSED_RESULT;
@ -2636,7 +2636,8 @@ class MessagesManager final : public Actor {
void toggle_dialog_is_translatable_on_server(DialogId dialog_id, bool is_translatable, uint64 log_event_id);
void toggle_dialog_is_blocked_on_server(DialogId dialog_id, bool is_blocked, uint64 log_event_id);
void toggle_dialog_is_blocked_on_server(DialogId dialog_id, bool is_blocked, bool is_blocked_for_stories,
uint64 log_event_id);
void reorder_pinned_dialogs_on_server(FolderId folder_id, const vector<DialogId> &dialog_ids, uint64 log_event_id);
@ -3241,7 +3242,8 @@ class MessagesManager final : public Actor {
static uint64 save_toggle_dialog_is_translatable_on_server_log_event(DialogId dialog_id, bool is_translatable);
static uint64 save_toggle_dialog_is_blocked_on_server_log_event(DialogId dialog_id, bool is_blocked);
static uint64 save_toggle_dialog_is_blocked_on_server_log_event(DialogId dialog_id, bool is_blocked,
bool is_blocked_for_stories);
static uint64 save_read_message_contents_on_server_log_event(DialogId dialog_id,
const vector<MessageId> &message_ids);

View File

@ -6424,9 +6424,9 @@ void Td::on_request(uint64 id, const td_api::toggleChatIsMarkedAsUnread &request
request.is_marked_as_unread_));
}
void Td::on_request(uint64 id, const td_api::toggleMessageSenderIsBlocked &request) {
void Td::on_request(uint64 id, const td_api::setMessageSenderBlockList &request) {
CHECK_IS_USER();
answer_ok_query(id, messages_manager_->toggle_message_sender_is_blocked(request.sender_id_, request.is_blocked_));
answer_ok_query(id, messages_manager_->set_message_sender_block_list(request.sender_id_, request.block_list_));
}
void Td::on_request(uint64 id, const td_api::toggleChatDefaultDisableNotification &request) {

View File

@ -1001,7 +1001,7 @@ class Td final : public Actor {
void on_request(uint64 id, const td_api::toggleChatIsMarkedAsUnread &request);
void on_request(uint64 id, const td_api::toggleMessageSenderIsBlocked &request);
void on_request(uint64 id, const td_api::setMessageSenderBlockList &request);
void on_request(uint64 id, const td_api::toggleChatDefaultDisableNotification &request);

View File

@ -505,15 +505,25 @@ class CliClient final : public Actor {
}
static td_api::object_ptr<td_api::StoryList> as_story_list(string story_list) {
if (!story_list.empty() && story_list.back() == 'a') {
return td_api::make_object<td_api::storyListArchive>();
}
if (!story_list.empty() && story_list.back() == 'e') {
if (story_list.empty() || story_list.back() == 'e') {
return nullptr;
}
if (story_list.back() == 'a') {
return td_api::make_object<td_api::storyListArchive>();
}
return td_api::make_object<td_api::storyListMain>();
}
static td_api::object_ptr<td_api::BlockList> as_block_list(string block_list) {
if (block_list.empty()) {
return nullptr;
}
if (block_list.back() == 's') {
return td_api::make_object<td_api::blockListStories>();
}
return td_api::make_object<td_api::blockListMain>();
}
vector<int64> as_chat_ids(Slice chat_ids) const {
return transform(autosplit(chat_ids), [this](Slice str) { return as_chat_id(str); });
}
@ -3996,11 +4006,12 @@ class CliClient final : public Actor {
bool is_translatable;
get_args(args, chat_id, is_translatable);
send_request(td_api::make_object<td_api::toggleChatIsTranslatable>(chat_id, is_translatable));
} else if (op == "tmsib") {
} else if (op == "smsbl") {
string sender_id;
bool is_blocked;
get_args(args, sender_id, is_blocked);
send_request(td_api::make_object<td_api::toggleMessageSenderIsBlocked>(as_message_sender(sender_id), is_blocked));
string block_list;
get_args(args, sender_id, block_list);
send_request(td_api::make_object<td_api::setMessageSenderBlockList>(as_message_sender(sender_id),
as_block_list(block_list)));
} else if (op == "bmsfr") {
MessageId message_id;
bool delete_message;