Add messageGroupCall and messageInviteToGroupCall.
This commit is contained in:
parent
8663c78702
commit
ce4054c5d4
@ -1627,6 +1627,12 @@ messageInvoice title:string description:string photo:photo currency:string total
|
|||||||
//@description A message with information about an ended call @is_video True, if the call was a video call @discard_reason Reason why the call was discarded @duration Call duration, in seconds
|
//@description A message with information about an ended call @is_video True, if the call was a video call @discard_reason Reason why the call was discarded @duration Call duration, in seconds
|
||||||
messageCall is_video:Bool discard_reason:CallDiscardReason duration:int32 = MessageContent;
|
messageCall is_video:Bool discard_reason:CallDiscardReason duration:int32 = MessageContent;
|
||||||
|
|
||||||
|
//@description A message with information about a group call
|
||||||
|
messageGroupCall = MessageContent;
|
||||||
|
|
||||||
|
//@description A message with information about an invite to a group call
|
||||||
|
messageInviteToGroupCall = MessageContent;
|
||||||
|
|
||||||
//@description A newly created basic group @title Title of the basic group @member_user_ids User identifiers of members in the basic group
|
//@description A newly created basic group @title Title of the basic group @member_user_ids User identifiers of members in the basic group
|
||||||
messageBasicGroupChatCreate title:string member_user_ids:vector<int32> = MessageContent;
|
messageBasicGroupChatCreate title:string member_user_ids:vector<int32> = MessageContent;
|
||||||
|
|
||||||
|
Binary file not shown.
@ -318,6 +318,8 @@ bool DialogAction::is_cancelled_by_message_of_type(MessageContentType message_co
|
|||||||
case MessageContentType::Poll:
|
case MessageContentType::Poll:
|
||||||
case MessageContentType::Dice:
|
case MessageContentType::Dice:
|
||||||
case MessageContentType::ProximityAlertTriggered:
|
case MessageContentType::ProximityAlertTriggered:
|
||||||
|
case MessageContentType::GroupCall:
|
||||||
|
case MessageContentType::InviteToGroupCall:
|
||||||
return false;
|
return false;
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include "td/telegram/Game.hpp"
|
#include "td/telegram/Game.hpp"
|
||||||
#include "td/telegram/Global.h"
|
#include "td/telegram/Global.h"
|
||||||
#include "td/telegram/HashtagHints.h"
|
#include "td/telegram/HashtagHints.h"
|
||||||
|
#include "td/telegram/InputGroupCallId.h"
|
||||||
#include "td/telegram/InputMessageText.h"
|
#include "td/telegram/InputMessageText.h"
|
||||||
#include "td/telegram/Location.h"
|
#include "td/telegram/Location.h"
|
||||||
#include "td/telegram/MessageEntity.h"
|
#include "td/telegram/MessageEntity.h"
|
||||||
@ -688,6 +689,8 @@ class MessageDice : public MessageContent {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
constexpr const char *MessageDice::DEFAULT_EMOJI;
|
||||||
|
|
||||||
class MessageProximityAlertTriggered : public MessageContent {
|
class MessageProximityAlertTriggered : public MessageContent {
|
||||||
public:
|
public:
|
||||||
DialogId traveler_dialog_id;
|
DialogId traveler_dialog_id;
|
||||||
@ -704,7 +707,34 @@ class MessageProximityAlertTriggered : public MessageContent {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr const char *MessageDice::DEFAULT_EMOJI;
|
class MessageGroupCall : public MessageContent {
|
||||||
|
public:
|
||||||
|
InputGroupCallId group_call_id;
|
||||||
|
int32 duration = -1;
|
||||||
|
|
||||||
|
MessageGroupCall() = default;
|
||||||
|
MessageGroupCall(InputGroupCallId group_call_id, int32 duration) : group_call_id(group_call_id), duration(duration) {
|
||||||
|
}
|
||||||
|
|
||||||
|
MessageContentType get_type() const override {
|
||||||
|
return MessageContentType::GroupCall;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class MessageInviteToGroupCall : public MessageContent {
|
||||||
|
public:
|
||||||
|
InputGroupCallId group_call_id;
|
||||||
|
UserId user_id;
|
||||||
|
|
||||||
|
MessageInviteToGroupCall() = default;
|
||||||
|
MessageInviteToGroupCall(InputGroupCallId group_call_id, UserId user_id)
|
||||||
|
: group_call_id(group_call_id), user_id(user_id) {
|
||||||
|
}
|
||||||
|
|
||||||
|
MessageContentType get_type() const override {
|
||||||
|
return MessageContentType::InviteToGroupCall;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
template <class StorerT>
|
template <class StorerT>
|
||||||
static void store(const MessageContent *content, StorerT &storer) {
|
static void store(const MessageContent *content, StorerT &storer) {
|
||||||
@ -978,6 +1008,24 @@ static void store(const MessageContent *content, StorerT &storer) {
|
|||||||
store(m->distance, storer);
|
store(m->distance, storer);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MessageContentType::GroupCall: {
|
||||||
|
auto m = static_cast<const MessageGroupCall *>(content);
|
||||||
|
bool has_duration = m->duration >= 0;
|
||||||
|
BEGIN_STORE_FLAGS();
|
||||||
|
STORE_FLAG(has_duration);
|
||||||
|
END_STORE_FLAGS();
|
||||||
|
store(m->group_call_id, storer);
|
||||||
|
if (has_duration) {
|
||||||
|
store(m->duration, storer);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MessageContentType::InviteToGroupCall: {
|
||||||
|
auto m = static_cast<const MessageInviteToGroupCall *>(content);
|
||||||
|
store(m->group_call_id, storer);
|
||||||
|
store(m->user_id, storer);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
}
|
}
|
||||||
@ -1352,6 +1400,26 @@ static void parse(unique_ptr<MessageContent> &content, ParserT &parser) {
|
|||||||
content = std::move(m);
|
content = std::move(m);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MessageContentType::GroupCall: {
|
||||||
|
auto m = make_unique<MessageGroupCall>();
|
||||||
|
bool has_duration;
|
||||||
|
BEGIN_PARSE_FLAGS();
|
||||||
|
PARSE_FLAG(has_duration);
|
||||||
|
END_PARSE_FLAGS();
|
||||||
|
parse(m->group_call_id, parser);
|
||||||
|
if (has_duration) {
|
||||||
|
parse(m->duration, parser);
|
||||||
|
}
|
||||||
|
content = std::move(m);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MessageContentType::InviteToGroupCall: {
|
||||||
|
auto m = make_unique<MessageInviteToGroupCall>();
|
||||||
|
parse(m->group_call_id, parser);
|
||||||
|
parse(m->user_id, parser);
|
||||||
|
content = std::move(m);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
LOG(FATAL) << "Have unknown message content type " << static_cast<int32>(content_type);
|
LOG(FATAL) << "Have unknown message content type " << static_cast<int32>(content_type);
|
||||||
}
|
}
|
||||||
@ -2048,6 +2116,8 @@ bool can_have_input_media(const Td *td, const MessageContent *content) {
|
|||||||
case MessageContentType::PassportDataSent:
|
case MessageContentType::PassportDataSent:
|
||||||
case MessageContentType::PassportDataReceived:
|
case MessageContentType::PassportDataReceived:
|
||||||
case MessageContentType::ProximityAlertTriggered:
|
case MessageContentType::ProximityAlertTriggered:
|
||||||
|
case MessageContentType::GroupCall:
|
||||||
|
case MessageContentType::InviteToGroupCall:
|
||||||
return false;
|
return false;
|
||||||
case MessageContentType::Animation:
|
case MessageContentType::Animation:
|
||||||
case MessageContentType::Audio:
|
case MessageContentType::Audio:
|
||||||
@ -2161,6 +2231,8 @@ SecretInputMedia get_secret_input_media(const MessageContent *content, Td *td,
|
|||||||
case MessageContentType::PassportDataSent:
|
case MessageContentType::PassportDataSent:
|
||||||
case MessageContentType::PassportDataReceived:
|
case MessageContentType::PassportDataReceived:
|
||||||
case MessageContentType::ProximityAlertTriggered:
|
case MessageContentType::ProximityAlertTriggered:
|
||||||
|
case MessageContentType::GroupCall:
|
||||||
|
case MessageContentType::InviteToGroupCall:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
@ -2351,6 +2423,8 @@ static tl_object_ptr<telegram_api::InputMedia> get_input_media_impl(
|
|||||||
case MessageContentType::PassportDataSent:
|
case MessageContentType::PassportDataSent:
|
||||||
case MessageContentType::PassportDataReceived:
|
case MessageContentType::PassportDataReceived:
|
||||||
case MessageContentType::ProximityAlertTriggered:
|
case MessageContentType::ProximityAlertTriggered:
|
||||||
|
case MessageContentType::GroupCall:
|
||||||
|
case MessageContentType::InviteToGroupCall:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
@ -2474,6 +2548,8 @@ void delete_message_content_thumbnail(MessageContent *content, Td *td) {
|
|||||||
case MessageContentType::PassportDataReceived:
|
case MessageContentType::PassportDataReceived:
|
||||||
case MessageContentType::Poll:
|
case MessageContentType::Poll:
|
||||||
case MessageContentType::ProximityAlertTriggered:
|
case MessageContentType::ProximityAlertTriggered:
|
||||||
|
case MessageContentType::GroupCall:
|
||||||
|
case MessageContentType::InviteToGroupCall:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
@ -2598,6 +2674,8 @@ static int32 get_message_content_media_index_mask(const MessageContent *content,
|
|||||||
case MessageContentType::Poll:
|
case MessageContentType::Poll:
|
||||||
case MessageContentType::Dice:
|
case MessageContentType::Dice:
|
||||||
case MessageContentType::ProximityAlertTriggered:
|
case MessageContentType::ProximityAlertTriggered:
|
||||||
|
case MessageContentType::GroupCall:
|
||||||
|
case MessageContentType::InviteToGroupCall:
|
||||||
return 0;
|
return 0;
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
@ -3219,6 +3297,22 @@ void merge_message_contents(Td *td, const MessageContent *old_content, MessageCo
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MessageContentType::GroupCall: {
|
||||||
|
auto old_ = static_cast<const MessageGroupCall *>(old_content);
|
||||||
|
auto new_ = static_cast<const MessageGroupCall *>(new_content);
|
||||||
|
if (old_->group_call_id != new_->group_call_id || old_->duration != new_->duration) {
|
||||||
|
need_update = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MessageContentType::InviteToGroupCall: {
|
||||||
|
auto old_ = static_cast<const MessageInviteToGroupCall *>(old_content);
|
||||||
|
auto new_ = static_cast<const MessageInviteToGroupCall *>(new_content);
|
||||||
|
if (old_->group_call_id != new_->group_call_id || old_->user_id != new_->user_id) {
|
||||||
|
need_update = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case MessageContentType::Unsupported: {
|
case MessageContentType::Unsupported: {
|
||||||
auto old_ = static_cast<const MessageUnsupported *>(old_content);
|
auto old_ = static_cast<const MessageUnsupported *>(old_content);
|
||||||
auto new_ = static_cast<const MessageUnsupported *>(new_content);
|
auto new_ = static_cast<const MessageUnsupported *>(new_content);
|
||||||
@ -3352,6 +3446,8 @@ bool merge_message_content_file_id(Td *td, MessageContent *message_content, File
|
|||||||
case MessageContentType::Poll:
|
case MessageContentType::Poll:
|
||||||
case MessageContentType::Dice:
|
case MessageContentType::Dice:
|
||||||
case MessageContentType::ProximityAlertTriggered:
|
case MessageContentType::ProximityAlertTriggered:
|
||||||
|
case MessageContentType::GroupCall:
|
||||||
|
case MessageContentType::InviteToGroupCall:
|
||||||
LOG(ERROR) << "Receive new file " << new_file_id << " in a sent message of the type " << content_type;
|
LOG(ERROR) << "Receive new file " << new_file_id << " in a sent message of the type " << content_type;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -4245,6 +4341,8 @@ unique_ptr<MessageContent> dup_message_content(Td *td, DialogId dialog_id, const
|
|||||||
case MessageContentType::PassportDataSent:
|
case MessageContentType::PassportDataSent:
|
||||||
case MessageContentType::PassportDataReceived:
|
case MessageContentType::PassportDataReceived:
|
||||||
case MessageContentType::ProximityAlertTriggered:
|
case MessageContentType::ProximityAlertTriggered:
|
||||||
|
case MessageContentType::GroupCall:
|
||||||
|
case MessageContentType::InviteToGroupCall:
|
||||||
return nullptr;
|
return nullptr;
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
@ -4439,6 +4537,28 @@ unique_ptr<MessageContent> get_action_message_content(Td *td, tl_object_ptr<tele
|
|||||||
|
|
||||||
return make_unique<MessageProximityAlertTriggered>(traveler_id, watcher_id, distance);
|
return make_unique<MessageProximityAlertTriggered>(traveler_id, watcher_id, distance);
|
||||||
}
|
}
|
||||||
|
case telegram_api::messageActionGroupCall::ID: {
|
||||||
|
auto group_call = move_tl_object_as<telegram_api::messageActionGroupCall>(action);
|
||||||
|
int32 duration = -1;
|
||||||
|
if ((group_call->flags_ & telegram_api::messageActionGroupCall::DURATION_MASK) != 0) {
|
||||||
|
duration = group_call->duration_;
|
||||||
|
if (duration < 0) {
|
||||||
|
LOG(ERROR) << "Receive invalid " << oneline(to_string(group_call));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return make_unique<MessageGroupCall>(InputGroupCallId(group_call->call_), duration);
|
||||||
|
}
|
||||||
|
case telegram_api::messageActionInviteToGroupCall::ID: {
|
||||||
|
auto invite_to_group_call = move_tl_object_as<telegram_api::messageActionInviteToGroupCall>(action);
|
||||||
|
UserId user_id(invite_to_group_call->user_id_);
|
||||||
|
if (!user_id.is_valid()) {
|
||||||
|
LOG(ERROR) << "Receive messageActionInviteToGroupCall with invalid " << user_id << " in " << owner_dialog_id;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return make_unique<MessageInviteToGroupCall>(InputGroupCallId(invite_to_group_call->call_), user_id);
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
}
|
}
|
||||||
@ -4648,6 +4768,10 @@ tl_object_ptr<td_api::MessageContent> get_message_content_object(const MessageCo
|
|||||||
td->messages_manager_->get_message_sender_object(m->traveler_dialog_id),
|
td->messages_manager_->get_message_sender_object(m->traveler_dialog_id),
|
||||||
td->messages_manager_->get_message_sender_object(m->watcher_dialog_id), m->distance);
|
td->messages_manager_->get_message_sender_object(m->watcher_dialog_id), m->distance);
|
||||||
}
|
}
|
||||||
|
case MessageContentType::GroupCall:
|
||||||
|
return make_tl_object<td_api::messageGroupCall>();
|
||||||
|
case MessageContentType::InviteToGroupCall:
|
||||||
|
return make_tl_object<td_api::messageInviteToGroupCall>();
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@ -4960,6 +5084,8 @@ string get_message_content_search_text(const Td *td, const MessageContent *conte
|
|||||||
case MessageContentType::PassportDataReceived:
|
case MessageContentType::PassportDataReceived:
|
||||||
case MessageContentType::Dice:
|
case MessageContentType::Dice:
|
||||||
case MessageContentType::ProximityAlertTriggered:
|
case MessageContentType::ProximityAlertTriggered:
|
||||||
|
case MessageContentType::GroupCall:
|
||||||
|
case MessageContentType::InviteToGroupCall:
|
||||||
return string();
|
return string();
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
@ -5159,6 +5285,13 @@ void add_message_content_dependencies(Dependencies &dependencies, const MessageC
|
|||||||
add_message_sender_dependencies(dependencies, content->watcher_dialog_id);
|
add_message_sender_dependencies(dependencies, content->watcher_dialog_id);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MessageContentType::GroupCall:
|
||||||
|
break;
|
||||||
|
case MessageContentType::InviteToGroupCall: {
|
||||||
|
auto content = static_cast<const MessageInviteToGroupCall *>(message_content);
|
||||||
|
dependencies.user_ids.insert(content->user_id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
break;
|
break;
|
||||||
|
@ -98,6 +98,10 @@ StringBuilder &operator<<(StringBuilder &string_builder, MessageContentType cont
|
|||||||
return string_builder << "Dice";
|
return string_builder << "Dice";
|
||||||
case MessageContentType::ProximityAlertTriggered:
|
case MessageContentType::ProximityAlertTriggered:
|
||||||
return string_builder << "ProximityAlertTriggered";
|
return string_builder << "ProximityAlertTriggered";
|
||||||
|
case MessageContentType::GroupCall:
|
||||||
|
return string_builder << "GroupCall";
|
||||||
|
case MessageContentType::InviteToGroupCall:
|
||||||
|
return string_builder << "InviteToGroupCall";
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
return string_builder;
|
return string_builder;
|
||||||
@ -150,6 +154,8 @@ bool is_allowed_media_group_content(MessageContentType content_type) {
|
|||||||
case MessageContentType::Poll:
|
case MessageContentType::Poll:
|
||||||
case MessageContentType::Dice:
|
case MessageContentType::Dice:
|
||||||
case MessageContentType::ProximityAlertTriggered:
|
case MessageContentType::ProximityAlertTriggered:
|
||||||
|
case MessageContentType::GroupCall:
|
||||||
|
case MessageContentType::InviteToGroupCall:
|
||||||
return false;
|
return false;
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
@ -210,6 +216,8 @@ bool is_secret_message_content(int32 ttl, MessageContentType content_type) {
|
|||||||
case MessageContentType::Poll:
|
case MessageContentType::Poll:
|
||||||
case MessageContentType::Dice:
|
case MessageContentType::Dice:
|
||||||
case MessageContentType::ProximityAlertTriggered:
|
case MessageContentType::ProximityAlertTriggered:
|
||||||
|
case MessageContentType::GroupCall:
|
||||||
|
case MessageContentType::InviteToGroupCall:
|
||||||
return false;
|
return false;
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
@ -263,6 +271,8 @@ bool is_service_message_content(MessageContentType content_type) {
|
|||||||
case MessageContentType::PassportDataSent:
|
case MessageContentType::PassportDataSent:
|
||||||
case MessageContentType::PassportDataReceived:
|
case MessageContentType::PassportDataReceived:
|
||||||
case MessageContentType::ProximityAlertTriggered:
|
case MessageContentType::ProximityAlertTriggered:
|
||||||
|
case MessageContentType::GroupCall:
|
||||||
|
case MessageContentType::InviteToGroupCall:
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
@ -316,6 +326,8 @@ bool can_have_message_content_caption(MessageContentType content_type) {
|
|||||||
case MessageContentType::Poll:
|
case MessageContentType::Poll:
|
||||||
case MessageContentType::Dice:
|
case MessageContentType::Dice:
|
||||||
case MessageContentType::ProximityAlertTriggered:
|
case MessageContentType::ProximityAlertTriggered:
|
||||||
|
case MessageContentType::GroupCall:
|
||||||
|
case MessageContentType::InviteToGroupCall:
|
||||||
return false;
|
return false;
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
|
@ -57,7 +57,9 @@ enum class MessageContentType : int32 {
|
|||||||
PassportDataReceived,
|
PassportDataReceived,
|
||||||
Poll,
|
Poll,
|
||||||
Dice,
|
Dice,
|
||||||
ProximityAlertTriggered
|
ProximityAlertTriggered,
|
||||||
|
GroupCall,
|
||||||
|
InviteToGroupCall
|
||||||
};
|
};
|
||||||
|
|
||||||
StringBuilder &operator<<(StringBuilder &string_builder, MessageContentType content_type);
|
StringBuilder &operator<<(StringBuilder &string_builder, MessageContentType content_type);
|
||||||
|
@ -22561,6 +22561,8 @@ Status MessagesManager::can_send_message_content(DialogId dialog_id, const Messa
|
|||||||
case MessageContentType::PassportDataSent:
|
case MessageContentType::PassportDataSent:
|
||||||
case MessageContentType::PassportDataReceived:
|
case MessageContentType::PassportDataReceived:
|
||||||
case MessageContentType::ProximityAlertTriggered:
|
case MessageContentType::ProximityAlertTriggered:
|
||||||
|
case MessageContentType::GroupCall:
|
||||||
|
case MessageContentType::InviteToGroupCall:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
}
|
}
|
||||||
return Status::OK();
|
return Status::OK();
|
||||||
@ -24122,6 +24124,8 @@ bool MessagesManager::can_edit_message(DialogId dialog_id, const Message *m, boo
|
|||||||
case MessageContentType::PassportDataSent:
|
case MessageContentType::PassportDataSent:
|
||||||
case MessageContentType::PassportDataReceived:
|
case MessageContentType::PassportDataReceived:
|
||||||
case MessageContentType::ProximityAlertTriggered:
|
case MessageContentType::ProximityAlertTriggered:
|
||||||
|
case MessageContentType::GroupCall:
|
||||||
|
case MessageContentType::InviteToGroupCall:
|
||||||
return false;
|
return false;
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
|
Loading…
Reference in New Issue
Block a user