Add td_api::ReactionUnavailabilityReason.

This commit is contained in:
levlam 2024-01-24 17:11:41 +03:00
parent 33ec7a21a8
commit 9fe83feeeb
7 changed files with 66 additions and 13 deletions

View File

@ -786,6 +786,7 @@ set(TDLIB_SOURCE
td/telegram/ReactionListType.h
td/telegram/ReactionManager.h
td/telegram/ReactionType.h
td/telegram/ReactionUnavailabilityReason.h
td/telegram/RecentDialogList.h
td/telegram/RepliedMessageInfo.h
td/telegram/ReplyMarkup.h

View File

@ -4025,7 +4025,8 @@ availableReaction type:ReactionType needs_premium:Bool = AvailableReaction;
//@popular_reactions List of popular reactions
//@allow_custom_emoji True, if any custom emoji reaction can be added by Telegram Premium subscribers
//@are_tags True, if the reactions will be tags and the message can be found by them
availableReactions top_reactions:vector<availableReaction> recent_reactions:vector<availableReaction> popular_reactions:vector<availableReaction> allow_custom_emoji:Bool are_tags:Bool = AvailableReactions;
//@unavailability_reason The reason why the current user can't add reactions to the message, despite some other users can; null if none
availableReactions top_reactions:vector<availableReaction> recent_reactions:vector<availableReaction> popular_reactions:vector<availableReaction> allow_custom_emoji:Bool are_tags:Bool unavailability_reason:ReactionUnavailabilityReason = AvailableReactions;
//@description Contains information about an emoji reaction
//@emoji Text representation of the reaction
@ -4041,6 +4042,15 @@ availableReactions top_reactions:vector<availableReaction> recent_reactions:vect
emojiReaction emoji:string title:string is_active:Bool static_icon:sticker appear_animation:sticker select_animation:sticker activate_animation:sticker effect_animation:sticker around_animation:sticker center_animation:sticker = EmojiReaction;
//@class ReactionUnavailabilityReason @description Describes why the current user can't add reactions to the message, despite some other users can
//@description The user is an anonymous administrator in the supergroup, but isn't a creator of it, so they can't vote on behalf of the supergroup
reactionUnavailabilityReasonAnonymousAdministrator = ReactionUnavailabilityReason;
//@description The user isn't a member of the supergroup and can't send messages and reactions there without joining
reactionUnavailabilityReasonGuest = ReactionUnavailabilityReason;
//@description Represents a list of animations @animations List of animations
animations animations:vector<animation> = Animations;

View File

@ -22645,12 +22645,15 @@ Result<td_api::object_ptr<td_api::availableReactions>> MessagesManager::get_mess
}
bool is_tag = can_add_message_tag(dialog_id, m->reactions.get());
return td_->reaction_manager_->get_sorted_available_reactions(get_message_available_reactions(d, m, false),
get_message_active_reactions(d, m), row_size, is_tag);
ReactionUnavailabilityReason unavailability_reason = ReactionUnavailabilityReason::None;
auto available_reactions = get_message_available_reactions(d, m, false, &unavailability_reason);
return td_->reaction_manager_->get_sorted_available_reactions(
std::move(available_reactions), get_message_active_reactions(d, m), row_size, is_tag, unavailability_reason);
}
ChatReactions MessagesManager::get_message_available_reactions(const Dialog *d, const Message *m,
bool disallow_custom_for_non_premium) {
bool disallow_custom_for_non_premium,
ReactionUnavailabilityReason *unavailability_reason) {
CHECK(d != nullptr);
CHECK(m != nullptr);
auto active_reactions = get_message_active_reactions(d, m);
@ -22665,11 +22668,17 @@ ChatReactions MessagesManager::get_message_available_reactions(const Dialog *d,
!td_->contacts_manager_->get_channel_status(channel_id).is_member() &&
can_send_message(d->dialog_id).is_error()) {
// can't use reactions if can't send messages to the group without joining
if (unavailability_reason != nullptr) {
*unavailability_reason = ReactionUnavailabilityReason::Guest;
}
can_use_reactions = false;
} else if (td_->dialog_manager_->is_anonymous_administrator(d->dialog_id, nullptr) &&
!td_->dialog_manager_->is_broadcast_channel(d->dialog_id) &&
!td_->contacts_manager_->get_channel_status(channel_id).is_creator()) {
// only creator can react as the chat
if (unavailability_reason != nullptr) {
*unavailability_reason = ReactionUnavailabilityReason::AnonymousAdministrator;
}
can_use_reactions = false;
}
}
@ -22732,7 +22741,7 @@ void MessagesManager::add_message_reaction(MessageFullId message_full_id, Reacti
return promise.set_error(Status::Error(400, "Message not found"));
}
if (!get_message_available_reactions(d, m, true).is_allowed_reaction_type(reaction_type)) {
if (!get_message_available_reactions(d, m, true, nullptr).is_allowed_reaction_type(reaction_type)) {
return promise.set_error(Status::Error(400, "The reaction isn't available for the message"));
}

View File

@ -52,6 +52,7 @@
#include "td/telegram/NotificationSettingsScope.h"
#include "td/telegram/OrderedMessage.h"
#include "td/telegram/ReactionType.h"
#include "td/telegram/ReactionUnavailabilityReason.h"
#include "td/telegram/RecentDialogList.h"
#include "td/telegram/RepliedMessageInfo.h"
#include "td/telegram/ReplyMarkup.h"
@ -2522,8 +2523,8 @@ class MessagesManager final : public Actor {
bool can_add_message_tag(DialogId dialog_id, const MessageReactions *reactions) const;
ChatReactions get_message_available_reactions(const Dialog *d, const Message *m,
bool disallow_custom_for_non_premium);
ChatReactions get_message_available_reactions(const Dialog *d, const Message *m, bool disallow_custom_for_non_premium,
ReactionUnavailabilityReason *unavailability_reason);
DialogId get_my_reaction_dialog_id(const Dialog *d) const;

View File

@ -383,7 +383,8 @@ void ReactionManager::get_emoji_reaction(const string &emoji,
}
td_api::object_ptr<td_api::availableReactions> ReactionManager::get_sorted_available_reactions(
ChatReactions available_reactions, ChatReactions active_reactions, int32 row_size, bool is_tag) {
ChatReactions available_reactions, ChatReactions active_reactions, int32 row_size, bool is_tag,
ReactionUnavailabilityReason unavailability_reason) {
if (is_tag) {
load_reaction_list(ReactionListType::DefaultTag);
} else {
@ -490,16 +491,31 @@ td_api::object_ptr<td_api::availableReactions> ReactionManager::get_sorted_avail
CHECK(all_available_reaction_types.empty());
td_api::object_ptr<td_api::ReactionUnavailabilityReason> reason;
switch (unavailability_reason) {
case ReactionUnavailabilityReason::None:
break;
case ReactionUnavailabilityReason::AnonymousAdministrator:
reason = td_api::make_object<td_api::reactionUnavailabilityReasonAnonymousAdministrator>();
break;
case ReactionUnavailabilityReason::Guest:
reason = td_api::make_object<td_api::reactionUnavailabilityReasonGuest>();
break;
default:
UNREACHABLE();
}
return td_api::make_object<td_api::availableReactions>(
std::move(top_reaction_objects), std::move(recent_reaction_objects), std::move(popular_reaction_objects),
available_reactions.allow_all_custom_, is_tag);
available_reactions.allow_all_custom_, is_tag, std::move(reason));
}
td_api::object_ptr<td_api::availableReactions> ReactionManager::get_available_reactions(int32 row_size) {
ChatReactions available_reactions;
available_reactions.reaction_types_ = active_reaction_types_;
available_reactions.allow_all_custom_ = true;
return get_sorted_available_reactions(std::move(available_reactions), ChatReactions(true, true), row_size, false);
return get_sorted_available_reactions(std::move(available_reactions), ChatReactions(true, true), row_size, false,
ReactionUnavailabilityReason::None);
}
void ReactionManager::add_recent_reaction(const ReactionType &reaction_type) {

View File

@ -10,6 +10,7 @@
#include "td/telegram/files/FileId.h"
#include "td/telegram/ReactionListType.h"
#include "td/telegram/ReactionType.h"
#include "td/telegram/ReactionUnavailabilityReason.h"
#include "td/telegram/td_api.h"
#include "td/telegram/telegram_api.h"
@ -42,9 +43,9 @@ class ReactionManager final : public Actor {
void get_emoji_reaction(const string &emoji, Promise<td_api::object_ptr<td_api::emojiReaction>> &&promise);
td_api::object_ptr<td_api::availableReactions> get_sorted_available_reactions(ChatReactions available_reactions,
ChatReactions active_reactions,
int32 row_size, bool is_tag);
td_api::object_ptr<td_api::availableReactions> get_sorted_available_reactions(
ChatReactions available_reactions, ChatReactions active_reactions, int32 row_size, bool is_tag,
ReactionUnavailabilityReason unavailability_reason);
td_api::object_ptr<td_api::availableReactions> get_available_reactions(int32 row_size);

View File

@ -0,0 +1,15 @@
//
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2024
//
// 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/utils/common.h"
namespace td {
enum class ReactionUnavailabilityReason : int32 { None, AnonymousAdministrator, Guest };
} // namespace td