mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/PacketIO: Fixed chat packet building in CreatureTextMgr
Closes #14871
This commit is contained in:
@@ -48,7 +48,7 @@ namespace Trinity
|
||||
BattlegroundChatBuilder(ChatMsg msgtype, uint32 textId, Player const* source, va_list* args = NULL)
|
||||
: _msgtype(msgtype), _textId(textId), _source(source), _args(args) { }
|
||||
|
||||
void operator()(WorldPacket& data, LocaleConstant loc_idx)
|
||||
WorldPackets::Packet* operator()(LocaleConstant loc_idx)
|
||||
{
|
||||
char const* text = sObjectMgr->GetTrinityString(_textId, loc_idx);
|
||||
if (_args)
|
||||
@@ -61,19 +61,18 @@ namespace Trinity
|
||||
vsnprintf(str, 2048, text, ap);
|
||||
va_end(ap);
|
||||
|
||||
do_helper(data, &str[0]);
|
||||
return do_helper(&str[0]);
|
||||
}
|
||||
else
|
||||
do_helper(data, text);
|
||||
|
||||
return do_helper(text);
|
||||
}
|
||||
|
||||
private:
|
||||
void do_helper(WorldPacket& data, char const* text)
|
||||
WorldPackets::Packet* do_helper(char const* text)
|
||||
{
|
||||
WorldPackets::Chat::Chat packet;
|
||||
packet.Initialize(_msgtype, LANG_UNIVERSAL, _source, _source, text);
|
||||
packet.Write();
|
||||
data = packet.Move();
|
||||
WorldPackets::Chat::Chat* packet = new WorldPackets::Chat::Chat();
|
||||
packet->Initialize(_msgtype, LANG_UNIVERSAL, _source, _source, text);
|
||||
return packet;
|
||||
}
|
||||
|
||||
ChatMsg _msgtype;
|
||||
@@ -88,7 +87,7 @@ namespace Trinity
|
||||
Battleground2ChatBuilder(ChatMsg msgtype, uint32 textId, Player const* source, uint32 arg1, uint32 arg2)
|
||||
: _msgtype(msgtype), _textId(textId), _source(source), _arg1(arg1), _arg2(arg2) { }
|
||||
|
||||
void operator()(WorldPacket& data, LocaleConstant loc_idx)
|
||||
WorldPackets::Packet* operator()(LocaleConstant loc_idx)
|
||||
{
|
||||
char const* text = sObjectMgr->GetTrinityString(_textId, loc_idx);
|
||||
char const* arg1str = _arg1 ? sObjectMgr->GetTrinityString(_arg1, loc_idx) : "";
|
||||
@@ -97,10 +96,9 @@ namespace Trinity
|
||||
char str[2048];
|
||||
snprintf(str, 2048, text, arg1str, arg2str);
|
||||
|
||||
WorldPackets::Chat::Chat packet;
|
||||
packet.Initialize(_msgtype, LANG_UNIVERSAL, _source, _source, str);
|
||||
packet.Write();
|
||||
data = packet.Move();
|
||||
WorldPackets::Chat::Chat* packet = new WorldPackets::Chat::Chat();
|
||||
packet->Initialize(_msgtype, LANG_UNIVERSAL, _source, _source, str);
|
||||
return packet;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
#include "CreatureAI.h"
|
||||
#include "Spell.h"
|
||||
#include "WorldSession.h"
|
||||
#include "Packets/ChatPackets.h"
|
||||
#include "Packet.h"
|
||||
|
||||
class Player;
|
||||
//class Map;
|
||||
@@ -1411,7 +1411,7 @@ namespace Trinity
|
||||
|
||||
private:
|
||||
Builder& i_builder;
|
||||
std::vector<WorldPacket*> i_data_cache; // 0 = default, i => i-1 locale index
|
||||
std::vector<WorldPackets::Packet*> i_data_cache; // 0 = default, i => i-1 locale index
|
||||
};
|
||||
|
||||
// Prepare using Builder localized packets with caching and send to player
|
||||
@@ -1419,7 +1419,7 @@ namespace Trinity
|
||||
class LocalizedPacketListDo
|
||||
{
|
||||
public:
|
||||
typedef std::vector<WorldPacket*> WorldPacketList;
|
||||
typedef std::vector<WorldPackets::Packet*> WorldPacketList;
|
||||
explicit LocalizedPacketListDo(Builder& builder) : i_builder(builder) { }
|
||||
|
||||
~LocalizedPacketListDo()
|
||||
|
||||
@@ -563,7 +563,7 @@ void Trinity::LocalizedPacketDo<Builder>::operator()(Player* p)
|
||||
{
|
||||
LocaleConstant loc_idx = p->GetSession()->GetSessionDbLocaleIndex();
|
||||
uint32 cache_idx = loc_idx+1;
|
||||
WorldPacket* data;
|
||||
WorldPackets::Packet* data;
|
||||
|
||||
// create if not cached yet
|
||||
if (i_data_cache.size() < cache_idx + 1 || !i_data_cache[cache_idx])
|
||||
@@ -571,18 +571,18 @@ void Trinity::LocalizedPacketDo<Builder>::operator()(Player* p)
|
||||
if (i_data_cache.size() < cache_idx + 1)
|
||||
i_data_cache.resize(cache_idx + 1);
|
||||
|
||||
data = new WorldPacket();
|
||||
data = i_builder(loc_idx);
|
||||
|
||||
i_builder(*data, loc_idx);
|
||||
ASSERT(data->GetSize() == 0);
|
||||
|
||||
ASSERT(data->GetOpcode() != NULL_OPCODE);
|
||||
data->Write();
|
||||
|
||||
i_data_cache[cache_idx] = data;
|
||||
}
|
||||
else
|
||||
data = i_data_cache[cache_idx];
|
||||
|
||||
p->SendDirectMessage(data);
|
||||
p->SendDirectMessage(data->GetRawPacket());
|
||||
}
|
||||
|
||||
template<class Builder>
|
||||
@@ -606,7 +606,7 @@ void Trinity::LocalizedPacketListDo<Builder>::operator()(Player* p)
|
||||
data_list = &i_data_cache[cache_idx];
|
||||
|
||||
for (size_t i = 0; i < data_list->size(); ++i)
|
||||
p->SendDirectMessage((*data_list)[i]);
|
||||
p->SendDirectMessage((*data_list)[i]->GetRawPacket());
|
||||
}
|
||||
|
||||
#endif // TRINITY_GRIDNOTIFIERSIMPL_H
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "GridNotifiers.h"
|
||||
#include "GridNotifiersImpl.h"
|
||||
#include "CellImpl.h"
|
||||
#include "Packets/ChatPackets.h"
|
||||
|
||||
class DefenseMessageBuilder
|
||||
{
|
||||
@@ -33,14 +34,14 @@ class DefenseMessageBuilder
|
||||
DefenseMessageBuilder(uint32 zoneId, uint32 id)
|
||||
: _zoneId(zoneId), _id(id) { }
|
||||
|
||||
void operator()(WorldPacket& data, LocaleConstant locale) const
|
||||
WorldPackets::Chat::DefenseMessage* operator()(LocaleConstant locale) const
|
||||
{
|
||||
std::string text = sOutdoorPvPMgr->GetDefenseMessage(_zoneId, _id, locale);
|
||||
|
||||
data.Initialize(SMSG_DEFENSE_MESSAGE, 4 + 4 + text.length());
|
||||
data.append<uint32>(_zoneId);
|
||||
data.append<uint32>(text.length());
|
||||
data << text;
|
||||
WorldPackets::Chat::DefenseMessage* defenseMessage = new WorldPackets::Chat::DefenseMessage();
|
||||
defenseMessage->ZoneID = _zoneId;
|
||||
defenseMessage->MessageText = text;
|
||||
return defenseMessage;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -799,7 +799,6 @@ void Map::ScriptsProcess()
|
||||
}
|
||||
|
||||
Creature* cTarget = NULL;
|
||||
WorldObject* wSource = dynamic_cast<WorldObject*>(source);
|
||||
auto creatureBounds = _creatureBySpawnIdStore.equal_range(step.script->CallScript.CreatureEntry);
|
||||
if (creatureBounds.first != creatureBounds.second)
|
||||
{
|
||||
|
||||
@@ -35,6 +35,7 @@ namespace WorldPackets
|
||||
virtual WorldPacket const* Write() = 0;
|
||||
virtual void Read() = 0;
|
||||
|
||||
WorldPacket const* GetRawPacket() const { return &_worldPacket; }
|
||||
size_t GetSize() const { return _worldPacket.size(); }
|
||||
ConnectionType GetConnection() const { return _worldPacket.GetConnection(); }
|
||||
|
||||
|
||||
@@ -92,6 +92,15 @@ void WorldPackets::Chat::ChatMessageEmote::Read()
|
||||
Text = _worldPacket.ReadString(len);
|
||||
}
|
||||
|
||||
WorldPackets::Chat::Chat::Chat(Chat const& chat) : ServerPacket(SMSG_CHAT, chat._worldPacket.size()),
|
||||
SlashCmd(chat.SlashCmd), _Language(chat._Language), SenderGUID(chat.SenderGUID),
|
||||
SenderGuildGUID(chat.SenderGuildGUID), SenderAccountGUID(chat.SenderAccountGUID), TargetGUID(chat.TargetGUID), PartyGUID(chat.PartyGUID),
|
||||
SenderVirtualAddress(chat.SenderVirtualAddress), TargetVirtualAddress(chat.TargetVirtualAddress), SenderName(chat.SenderName), TargetName(chat.TargetName),
|
||||
Prefix(chat.Prefix), _Channel(chat._Channel), ChatText(chat.ChatText), AchievementID(chat.AchievementID), _ChatFlags(chat._ChatFlags),
|
||||
DisplayTime(chat.DisplayTime), HideChatLog(chat.HideChatLog), FakeSenderName(chat.FakeSenderName)
|
||||
{
|
||||
}
|
||||
|
||||
void WorldPackets::Chat::Chat::Initialize(ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string message,
|
||||
uint32 achievementId /*= 0*/, std::string channelName /*= ""*/, LocaleConstant locale /*= DEFAULT_LOCALE*/, std::string addonPrefix /*= ""*/)
|
||||
{
|
||||
@@ -111,30 +120,10 @@ void WorldPackets::Chat::Chat::Initialize(ChatMsg chatType, Language language, W
|
||||
_Language = language;
|
||||
|
||||
if (sender)
|
||||
{
|
||||
SenderGUID = sender->GetGUID();
|
||||
|
||||
if (Creature const* creatureSender = sender->ToCreature())
|
||||
SenderName = creatureSender->GetNameForLocaleIdx(locale);
|
||||
|
||||
if (Player const* playerSender = sender->ToPlayer())
|
||||
{
|
||||
SenderAccountGUID = playerSender->GetSession()->GetAccountGUID();
|
||||
_ChatFlags = playerSender->GetChatFlags();
|
||||
|
||||
SenderGuildGUID = ObjectGuid::Create<HighGuid::Guild>(playerSender->GetGuildId());
|
||||
|
||||
if (Group const* group = playerSender->GetGroup())
|
||||
PartyGUID = group->GetGUID();
|
||||
}
|
||||
}
|
||||
SetSender(sender, locale);
|
||||
|
||||
if (receiver)
|
||||
{
|
||||
TargetGUID = receiver->GetGUID();
|
||||
if (Creature const* creatureReceiver = receiver->ToCreature())
|
||||
TargetName = creatureReceiver->GetNameForLocaleIdx(locale);
|
||||
}
|
||||
SetReceiver(receiver, locale);
|
||||
|
||||
SenderVirtualAddress = GetVirtualRealmAddress();
|
||||
TargetVirtualAddress = GetVirtualRealmAddress();
|
||||
@@ -144,6 +133,32 @@ void WorldPackets::Chat::Chat::Initialize(ChatMsg chatType, Language language, W
|
||||
ChatText = std::move(message);
|
||||
}
|
||||
|
||||
void WorldPackets::Chat::Chat::SetSender(WorldObject const* sender, LocaleConstant locale)
|
||||
{
|
||||
SenderGUID = sender->GetGUID();
|
||||
|
||||
if (Creature const* creatureSender = sender->ToCreature())
|
||||
SenderName = creatureSender->GetNameForLocaleIdx(locale);
|
||||
|
||||
if (Player const* playerSender = sender->ToPlayer())
|
||||
{
|
||||
SenderAccountGUID = playerSender->GetSession()->GetAccountGUID();
|
||||
_ChatFlags = playerSender->GetChatFlags();
|
||||
|
||||
SenderGuildGUID = ObjectGuid::Create<HighGuid::Guild>(playerSender->GetGuildId());
|
||||
|
||||
if (Group const* group = playerSender->GetGroup())
|
||||
PartyGUID = group->GetGUID();
|
||||
}
|
||||
}
|
||||
|
||||
void WorldPackets::Chat::Chat::SetReceiver(WorldObject const* receiver, LocaleConstant locale)
|
||||
{
|
||||
TargetGUID = receiver->GetGUID();
|
||||
if (Creature const* creatureReceiver = receiver->ToCreature())
|
||||
TargetName = creatureReceiver->GetNameForLocaleIdx(locale);
|
||||
}
|
||||
|
||||
WorldPacket const* WorldPackets::Chat::Chat::Write()
|
||||
{
|
||||
_worldPacket << SlashCmd;
|
||||
@@ -245,3 +260,13 @@ void WorldPackets::Chat::ChatRegisterAddonPrefixes::Read()
|
||||
Prefixes.push_back(_worldPacket.ReadString(lenghts));
|
||||
}
|
||||
}
|
||||
|
||||
WorldPacket const* WorldPackets::Chat::DefenseMessage::Write()
|
||||
{
|
||||
_worldPacket << int32(ZoneID);
|
||||
_worldPacket.WriteBits(MessageText.length(), 12);
|
||||
_worldPacket.FlushBits();
|
||||
_worldPacket.WriteString(MessageText);
|
||||
|
||||
return &_worldPacket;
|
||||
}
|
||||
|
||||
@@ -150,8 +150,12 @@ namespace WorldPackets
|
||||
{
|
||||
public:
|
||||
Chat() : ServerPacket(SMSG_CHAT, 100) { }
|
||||
Chat(Chat const& chat);
|
||||
|
||||
void Initialize(ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string message, uint32 achievementId = 0, std::string channelName = "", LocaleConstant locale = DEFAULT_LOCALE, std::string addonPrefix = "");
|
||||
void SetSender(WorldObject const* sender, LocaleConstant locale);
|
||||
void SetReceiver(WorldObject const* receiver, LocaleConstant locale);
|
||||
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
uint8 SlashCmd = 0; ///< @see enum ChatMsg
|
||||
@@ -268,6 +272,17 @@ namespace WorldPackets
|
||||
|
||||
void Read() override { }
|
||||
};
|
||||
|
||||
class DefenseMessage final : public ServerPacket
|
||||
{
|
||||
public:
|
||||
DefenseMessage() : ServerPacket(SMSG_DEFENSE_MESSAGE) { }
|
||||
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
int32 ZoneID = 0;
|
||||
std::string MessageText;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1055,7 +1055,7 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DANCE_STUDIO_CREATE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DB_REPLY, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEATH_RELEASE_LOC, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEFENSE_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEFENSE_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DELETE_CHAR, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DESTROY_ARENA_UNIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DESTRUCTIBLE_BUILDING_DAMAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
|
||||
@@ -30,13 +30,12 @@ namespace Trinity
|
||||
BroadcastTextBuilder(Unit const* obj, ChatMsg msgType, uint32 textId, WorldObject const* target = nullptr, uint32 achievementId = 0)
|
||||
: _source(obj), _msgType(msgType), _textId(textId), _target(target), _achievementId(achievementId) { }
|
||||
|
||||
void operator()(WorldPacket& data, LocaleConstant locale)
|
||||
WorldPackets::Chat::Chat* operator()(LocaleConstant locale) const
|
||||
{
|
||||
BroadcastTextEntry const* bct = sBroadcastTextStore.LookupEntry(_textId);
|
||||
WorldPackets::Chat::Chat packet;
|
||||
packet.Initialize(_msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _source, _target, bct ? DB2Manager::GetBroadcastTextValue(bct, locale, _source->getGender()) : "", _achievementId, "", locale);
|
||||
packet.Write();
|
||||
data = packet.Move();
|
||||
WorldPackets::Chat::Chat* chat = new WorldPackets::Chat::Chat();
|
||||
chat->Initialize(_msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _source, _target, bct ? DB2Manager::GetBroadcastTextValue(bct, locale, _source->getGender()) : "", _achievementId, "", locale);
|
||||
return chat;
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -53,12 +52,11 @@ namespace Trinity
|
||||
CustomChatTextBuilder(WorldObject const* obj, ChatMsg msgType, std::string const& text, Language language = LANG_UNIVERSAL, WorldObject const* target = nullptr)
|
||||
: _source(obj), _msgType(msgType), _text(text), _language(language), _target(target) { }
|
||||
|
||||
void operator()(WorldPacket& data, LocaleConstant locale)
|
||||
WorldPackets::Chat::Chat* operator()(LocaleConstant locale) const
|
||||
{
|
||||
WorldPackets::Chat::Chat packet;
|
||||
packet.Initialize(_msgType, _language, _source, _target, _text, 0, "", locale);
|
||||
packet.Write();
|
||||
data = packet.Move();
|
||||
WorldPackets::Chat::Chat* chat = new WorldPackets::Chat::Chat();
|
||||
chat->Initialize(_msgType, _language, _source, _target, _text, 0, "", locale);
|
||||
return chat;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -33,13 +33,12 @@ class CreatureTextBuilder
|
||||
CreatureTextBuilder(WorldObject const* obj, uint8 gender, ChatMsg msgtype, uint8 textGroup, uint32 id, uint32 language, WorldObject const* target)
|
||||
: _source(obj), _gender(gender), _msgType(msgtype), _textGroup(textGroup), _textId(id), _language(language), _target(target) { }
|
||||
|
||||
void operator()(WorldPacket& data, LocaleConstant locale) const
|
||||
WorldPackets::Chat::Chat* operator()(LocaleConstant locale) const
|
||||
{
|
||||
std::string const& text = sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _gender, _textGroup, _textId, locale);
|
||||
WorldPackets::Chat::Chat packet;
|
||||
packet.Initialize(_msgType, Language(_language), _source, _target, text, 0, "", locale);
|
||||
packet.Write();
|
||||
data = packet.Move();
|
||||
WorldPackets::Chat::Chat* chat = new WorldPackets::Chat::Chat();
|
||||
chat->Initialize(_msgType, Language(_language), _source, _target, text, 0, "", locale);
|
||||
return chat;
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -58,13 +57,12 @@ class PlayerTextBuilder
|
||||
PlayerTextBuilder(WorldObject const* obj, WorldObject const* speaker, uint8 gender, ChatMsg msgtype, uint8 textGroup, uint32 id, uint32 language, WorldObject const* target)
|
||||
: _source(obj), _talker(speaker), _gender(gender), _msgType(msgtype), _textGroup(textGroup), _textId(id), _language(language), _target(target) { }
|
||||
|
||||
void operator()(WorldPacket& data, LocaleConstant locale) const
|
||||
WorldPackets::Chat::Chat* operator()(LocaleConstant locale) const
|
||||
{
|
||||
std::string const& text = sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _gender, _textGroup, _textId, locale);
|
||||
WorldPackets::Chat::Chat packet;
|
||||
packet.Initialize(_msgType, Language(_language), _talker, _target, text, 0, "", locale);
|
||||
packet.Write();
|
||||
data = packet.Move();
|
||||
WorldPackets::Chat::Chat* chat = new WorldPackets::Chat::Chat();
|
||||
chat->Initialize(_msgType, Language(_language), _talker, _target, text, 0, "", locale);
|
||||
return chat;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -145,23 +145,25 @@ class CreatureTextLocalizer
|
||||
// create if not cached yet
|
||||
if (!_packetCache[loc_idx])
|
||||
{
|
||||
messageTemplate = new WorldPackets::Chat::Chat();
|
||||
messageTemplate = _builder(loc_idx);
|
||||
_packetCache[loc_idx] = messageTemplate;
|
||||
}
|
||||
else
|
||||
messageTemplate = _packetCache[loc_idx];
|
||||
|
||||
WorldPackets::Chat::Chat message(*messageTemplate);
|
||||
|
||||
switch (_msgType)
|
||||
{
|
||||
case CHAT_MSG_MONSTER_WHISPER:
|
||||
case CHAT_MSG_RAID_BOSS_WHISPER:
|
||||
messageTemplate->TargetGUID = player->GetGUID();
|
||||
message.SetReceiver(player, loc_idx);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
player->SendDirectMessage(messageTemplate->Write());
|
||||
player->SendDirectMessage(message.Write());
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -2351,7 +2351,7 @@ namespace Trinity
|
||||
class WorldWorldTextBuilder
|
||||
{
|
||||
public:
|
||||
typedef std::vector<WorldPacket*> WorldPacketList;
|
||||
typedef std::vector<WorldPackets::Packet*> WorldPacketList;
|
||||
static size_t const BufferSize = 2048;
|
||||
|
||||
explicit WorldWorldTextBuilder(uint32 textId, va_list* args = NULL) : i_textId(textId), i_args(args) { }
|
||||
@@ -2383,10 +2383,10 @@ namespace Trinity
|
||||
{
|
||||
while (char* line = ChatHandler::LineFromMessage(text))
|
||||
{
|
||||
WorldPackets::Chat::Chat packet;
|
||||
packet.Initialize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line);
|
||||
packet.Write();
|
||||
dataList.emplace_back(new WorldPacket(packet.Move()));
|
||||
WorldPackets::Chat::Chat* packet = new WorldPackets::Chat::Chat();
|
||||
packet->Initialize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line);
|
||||
packet->Write();
|
||||
dataList.push_back(packet);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user