55#include <boost/circular_buffer.hpp>
59std::string
const DefaultPlayerName =
"<none>";
108 std::shared_ptr<WorldSocket>&& sock,
AccountTypes sec,
uint8 expansion, time_t mute_time, std::string&& os,
Minutes timezoneOffset,
110 m_muteTime(mute_time),
115 m_Socket({ std::move(sock),
nullptr }),
118 _accountName(std::move(name)),
119 _battlenetAccount(
new Battlenet::Account(
this, ObjectGuid::Create<HighGuid::BNetAccount>(battlenetAccountId), std::move(battlenetAccountEmail))),
120 m_accountExpansion(expansion),
124 _clientBuildVariant(clientBuildVariant),
126 _battlenetRequestToken(0),
129 m_playerLogout(
false),
130 m_playerRecentlyLogout(
false),
132 m_sessionDbcLocale(
sWorld->GetAvailableDbcLocale(locale)),
133 m_sessionDbLocaleIndex(locale),
134 _timezoneOffset(timezoneOffset),
138 _filterAddonMessages(
false),
139 recruiterId(recruiter),
140 isRecruiter(isARecruiter),
144 _timeSyncClockDeltaQueue(std::make_unique<boost::circular_buffer<std::pair<int64, uint32>>>(6)),
145 _timeSyncClockDelta(0),
146 _pendingTimeSyncRequests(),
147 _timeSyncNextCounter(0),
149 _calendarEventCreationCooldown(0),
150 _battlePetMgr(std::make_unique<BattlePets::BattlePetMgr>(
this)),
151 _collectionMgr(std::make_unique<CollectionMgr>(
this))
156 ResetTimeOutTime(
false);
157 LoginDatabase.PExecute(
"UPDATE account SET online = 1 WHERE id = {};", GetAccountId());
160 _instanceConnectKey.Raw =
UI64LIT(0);
171 for (
uint8 i = 0; i < 2; ++i)
271 static uint64 sendPacketCount = 0;
272 static uint64 sendPacketBytes = 0;
275 static time_t lastTime = firstTime;
277 static uint64 sendLastPacketCount = 0;
278 static uint64 sendLastPacketBytes = 0;
282 if ((cur_time - lastTime) < 60)
284 sendPacketCount += 1;
285 sendPacketBytes += packet->
size();
287 sendLastPacketCount += 1;
288 sendLastPacketBytes += packet->
size();
294 TC_LOG_DEBUG(
"misc",
"Send all time packets count: {} bytes: {} avr.count/sec: {} avr.bytes/sec: {} time: {}", sendPacketCount, sendPacketBytes,
float(sendPacketCount)/fullTime,
float(sendPacketBytes)/fullTime,
uint32(fullTime));
295 TC_LOG_DEBUG(
"misc",
"Send last min packets count: {} bytes: {} avr.count/sec: {} avr.bytes/sec: {}", sendLastPacketCount, sendLastPacketBytes,
float(sendLastPacketCount)/minTime,
float(sendLastPacketBytes)/minTime);
298 sendLastPacketCount = 1;
299 sendLastPacketBytes = packet->
wpos();
306 m_Socket[conIdx]->SendPacket(*packet);
311 std::shared_ptr<WorldSocket> socket = sockRef.lock();
312 if (!socket || !socket->IsOpen())
318 socket->DelayedCloseSocket();
322 socket->SetWorldSession(session);
336 TC_LOG_ERROR(
"network.opcode",
"Received unexpected opcode {} Status: {} Reason: {} from {}",
346 TC_LOG_TRACE(
"network.opcode",
"Unprocessed tail data (read stop at {} from {}) Opcode {} from {}",
364 bool deletePacket =
true;
365 std::vector<WorldPacket*> requeuePackets;
366 uint32 processedPackets = 0;
369 constexpr uint32 MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE = 100;
389 requeuePackets.push_back(packet);
390 deletePacket =
false;
391 TC_LOG_DEBUG(
"network",
"Re-enqueueing packet with opcode {} with with status STATUS_LOGGEDIN. "
400 opHandle->
Call(
this, *packet);
403 processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE;
410 "the player has not logged in yet and not recently logout");
415 opHandle->
Call(
this, *packet);
418 processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE;
428 opHandle->
Call(
this, *packet);
431 processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE;
449 opHandle->
Call(
this, *packet);
452 processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE;
468 TC_LOG_ERROR(
"network",
"WorldSession::Update ByteBufferException {} occured while parsing a packet (opcode: {}) from {} address {}. Skipped packet.",
476 KickPlayer(
"WorldSession::Update Invalid chat link");
479 KickPlayer(
"WorldSession::Update Illegal chat link");
488 TC_LOG_ERROR(
"network",
"WorldSession::Update ByteBufferException {} occured while parsing a packet (opcode: {}) from {} address {}. Skipped packet.",
502 if (processedPackets > MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE)
533 if (std::ranges::any_of(
m_Socket, [](std::shared_ptr<WorldSocket>
const& s) {
return s && !s->IsOpen(); }))
538 for (std::shared_ptr<WorldSocket>& socket :
m_Socket)
542 socket->CloseSocket();
594 bg->EventPlayerLoggedOut(
_player);
616 guild->HandleMemberLogout(
this);
659 group->StartLeaderOfflineTimer();
677 TC_LOG_INFO(
"entities.player.character",
"Account: {} (IP: {}) Logout Character:[{}] {} Level: {}, XP: {}/{} ({} left)",
682 _map->RemovePlayerFromMap(
_player,
true);
689 TC_LOG_DEBUG(
"network",
"SESSION: Sent SMSG_LOGOUT_COMPLETE Message");
714 for (std::shared_ptr<WorldSocket>
const& socket :
m_Socket)
718 socket->CloseSocket();
729 TC_LOG_ERROR(
"network",
"Player {}{} sent a message with an invalid link:\n{}",
GetPlayer()->GetName(),
733 KickPlayer(
"WorldSession::ValidateHyperlinksAndMaybeKick Invalid chat link");
740 if (str.find(
'|') == std::string::npos)
743 TC_LOG_ERROR(
"network",
"Player {} {} sent a message which illegally contained a hyperlink:\n{}",
GetPlayer()->GetName(),
747 KickPlayer(
"WorldSession::DisallowHyperlinksAndMaybeKick Illegal chat link");
759 va_start(ap, format);
760 vsnprintf(szStr, 1024, format, ap);
775 va_start(ap, stringId);
776 vsnprintf(szStr, 1024, format, ap);
797 else if (!onlyActive)
813 TC_LOG_ERROR(
"network.opcode",
"Received opcode {} that must be processed in WorldSocket::ReadDataHandler from {}"
819 boost::system::error_code ignored_error;
820 boost::asio::ip::address instanceAddress;
821 if (std::shared_ptr<Realm const> currentRealm =
sRealmList->GetCurrentRealm())
822 instanceAddress = currentRealm->GetAddressForClient(Trinity::Net::make_address(
GetRemoteAddress(), ignored_error));
831 connectTo.
Serial = serial;
835 if (instanceAddress.is_v4())
837 memcpy(payload.
Address.
Address.
V4.data(), instanceAddress.to_v4().to_bytes().data(), 4);
843 boost::asio::ip::address_v6 v6 = instanceAddress.to_v6();
844 if (v6.is_loopback())
846 memcpy(payload.
Address.
Address.
V4.data(), boost::asio::ip::address_v4::loopback().to_bytes().data(), 4);
849 else if (v6.is_v4_mapped())
851 memcpy(payload.
Address.
Address.
V4.data(), Trinity::Net::make_address_v4(Trinity::Net::v4_mapped, v6).to_bytes().data(), 4);
876 Field* fields = result->Fetch();
880 TC_LOG_ERROR(
"misc",
"Table `{}` have invalid account data type ({}), ignore.",
885 if ((mask & (1 << type)) == 0)
887 TC_LOG_ERROR(
"misc",
"Table `{}` have non appropriate for table account data type ({}), ignore.",
895 while (result->NextRow());
973 if (!hasTutorialsInDB)
987 Field* fields = result->Fetch();
988 SystemTimePoint restrictionExpireTime = SystemTimePoint::clock::from_time_t(fields[1].GetUInt64());
989 if (restrictionExpireTime > now)
991 }
while (result->NextRow());
1001 trans->Append(stmt);
1008 stmt->
setUInt64(2, SystemTimePoint::clock::to_time_t(restrictionExpireTime));
1009 trans->Append(stmt);
1020 if (instanceId == 0)
1035 return value.second < now;
1052 element.
Id = entry->
ID;
1058 element.
Int64Value = fields.int64Value().GetInt64();
1061 element.
FloatValue = fields.floatValue().GetFloat();
1066 }
while (elementsResult->NextRow());
1076 }
while (flagsResult->NextRow());
1085 if (!element.NeedSave)
1091 transaction->Append(stmt);
1093 element.NeedSave =
false;
1102 if (!element.Int64Value)
1108 stmt->
setInt64(3, element.Int64Value);
1109 transaction->Append(stmt);
1112 if (!element.FloatValue)
1117 stmt->
setFloat(2, element.FloatValue);
1119 transaction->Append(stmt);
1133 transaction->Append(stmt);
1144 transaction->Append(stmt);
1154 elementItr->Id = dataElementId;
1157 elementItr->NeedSave =
true;
1158 elementItr->FloatValue = value;
1167 elementItr->Id = dataElementId;
1170 elementItr->NeedSave =
true;
1171 elementItr->Int64Value = value;
1185 flag.
Value |= flagValue;
1187 flag.
Value &= ~flagValue;
1254 TC_LOG_DEBUG(
"rbac",
"WorldSession::LoadPermissions [AccountId: {}, Name: {}, realmId: {}, secLevel: {}]",
1266 TC_LOG_DEBUG(
"rbac",
"WorldSession::LoadPermissions [AccountId: {}, Name: {}, realmId: {}, secLevel: {}]",
1394 std::shared_ptr<AccountInfoQueryHolderPerRealm> realmHolder = std::make_shared<AccountInfoQueryHolderPerRealm>();
1401 std::shared_ptr<AccountInfoQueryHolder> holder = std::make_shared<AccountInfoQueryHolder>();
1408 struct ForkJoinState
1410 std::shared_ptr<AccountInfoQueryHolderPerRealm>
Character;
1411 std::shared_ptr<AccountInfoQueryHolder>
Login;
1414 std::shared_ptr<ForkJoinState> state = std::make_shared<ForkJoinState>();
1418 state->Character = realmHolder;
1419 if (state->Login && state->Character)
1425 state->Login = holder;
1426 if (state->Login && state->Character)
1464 Field* fields = characterCountsResult->Fetch();
1467 }
while (characterCountsResult->NextRow());
1471 bnetConnected.
State = 1;
1489 TC_LOG_DEBUG(
"rbac",
"WorldSession::HasPermission [AccountId: {}, Name: {}, realmId: {}]",
1492 return hasPermission;
1497 TC_LOG_DEBUG(
"rbac",
"WorldSession::Invalidaterbac::RBACData [AccountId: {}, Name: {}, realmId: {}]",
1508 if (!maxPacketCounterAllowed)
1519 if (++packetCounter.
amountCounter <= maxPacketCounterAllowed)
1522 TC_LOG_WARN(
"network",
"AntiDOS: Account {}, IP: {}, Ping: {}, Character: {}, flooding packet (opc: {} (0x{:X}), count: {})",
1532 TC_LOG_WARN(
"network",
"AntiDOS: Player kicked!");
1540 std::string nameOrIp =
"";
1547 sWorld->BanAccount(bm, nameOrIp, duration,
"DOS (Packet Flooding/Spoofing",
"Server: AutoDOS");
1548 TC_LOG_WARN(
"network",
"AntiDOS: Player automatically banned for {} seconds.", duration);
1559 uint32 maxPacketCounterAllowed;
1659 maxPacketCounterAllowed = 0;
1673 maxPacketCounterAllowed = 200;
1686 maxPacketCounterAllowed = 50;
1699 maxPacketCounterAllowed = 20;
1729 maxPacketCounterAllowed = 10;
1772 maxPacketCounterAllowed = 3;
1787 maxPacketCounterAllowed = 1;
1798 maxPacketCounterAllowed = 100;
1803 return maxPacketCounterAllowed;
@ CHAR_SEL_ACCOUNT_INSTANCELOCKTIMES
@ CHAR_UPD_ACCOUNT_ONLINE
@ CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES
@ CHAR_REP_PLAYER_ACCOUNT_DATA
@ CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES
DB2Storage< PlayerDataElementAccountEntry > sPlayerDataElementAccountStore("PlayerDataElementAccount.db2", &PlayerDataElementAccountLoadInfo::Instance)
DB2Storage< AdventureMapPOIEntry > sAdventureMapPOIStore("AdventureMapPOI.db2", &AdventureMapPoiLoadInfo::Instance)
DB2Storage< PlayerDataFlagAccountEntry > sPlayerDataFlagAccountStore("PlayerDataFlagAccount.db2", &PlayerDataFlagAccountLoadInfo::Instance)
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
SQLTransaction< LoginDatabaseConnection > LoginDatabaseTransaction
std::shared_ptr< PreparedResultSet > PreparedQueryResult
DatabaseWorkerPool< LoginDatabaseConnection > LoginDatabase
Accessor to the realm/login database.
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
std::chrono::system_clock::time_point SystemTimePoint
std::chrono::minutes Minutes
Minutes shorthand typedef.
#define TC_LOG_DEBUG(filterType__, message__,...)
#define TC_LOG_ERROR(filterType__, message__,...)
#define TC_LOG_INFO(filterType__, message__,...)
#define TC_LOG_WARN(filterType__, message__,...)
#define TC_LOG_TRACE(filterType__, message__,...)
@ LOGIN_SEL_BNET_ITEM_FAVORITE_APPEARANCES
@ LOGIN_INS_BNET_PLAYER_DATA_ELEMENTS_ACCOUNT
@ LOGIN_SEL_BNET_PLAYER_DATA_FLAGS_ACCOUNT
@ LOGIN_SEL_ACCOUNT_MOUNTS
@ LOGIN_SEL_BNET_CHARACTER_COUNTS_BY_ACCOUNT_ID
@ LOGIN_SEL_BNET_TRANSMOG_OUTFITS
@ LOGIN_DEL_BNET_PLAYER_DATA_ELEMENTS_ACCOUNT
@ LOGIN_SEL_ACCOUNT_HEIRLOOMS
@ LOGIN_SEL_BNET_TRANSMOG_ILLUSIONS
@ LOGIN_DEL_BNET_PLAYER_DATA_FLAGS_ACCOUNT
@ LOGIN_SEL_BNET_WARBAND_SCENES
@ LOGIN_INS_BNET_PLAYER_DATA_FLAGS_ACCOUNT
@ LOGIN_SEL_BATTLE_PET_SLOTS
@ LOGIN_SEL_BNET_ITEM_APPEARANCES
@ LOGIN_SEL_BNET_PLAYER_DATA_ELEMENTS_ACCOUNT
#define TC_METRIC_DETAILED_TIMER(category,...)
#define TC_METRIC_VALUE(category, value,...)
#define TC_METRIC_EVENT(category, title, description)
#define TC_METRIC_TAG(name, value)
constexpr uint32 UNKNOWN_OPCODE
@ CONNECTION_TYPE_INSTANCE
@ CONNECTION_TYPE_DEFAULT
constexpr bool IsInstanceOnlyOpcode(uint32 opcode)
constexpr FormattedOpcodeName< OpcodeClient > GetOpcodeNameForLogging(OpcodeClient opcode)
Lookup opcode name for human understandable logging.
@ STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT
@ CMSG_TIME_SYNC_RESPONSE
@ CMSG_CALENDAR_ADD_EVENT
@ CMSG_CHAT_MESSAGE_WHISPER
@ CMSG_GUILD_SET_RANK_PERMISSIONS
@ CMSG_CHAT_ADDON_MESSAGE_TARGETED
@ CMSG_CHAT_MESSAGE_EMOTE
@ CMSG_REQUEST_VEHICLE_SWITCH_SEAT
@ CMSG_CHAT_MESSAGE_CHANNEL
@ CMSG_QUEST_CONFIRM_ACCEPT
@ CMSG_DELETE_EQUIPMENT_SET
@ CMSG_GUILD_BANK_DEPOSIT_MONEY
@ CMSG_SUBMIT_USER_FEEDBACK
@ CMSG_CHAT_MESSAGE_GUILD
@ CMSG_GUILD_SET_GUILD_MASTER
@ CMSG_GUILD_BANK_WITHDRAW_MONEY
@ CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK
@ CMSG_CALENDAR_REMOVE_INVITE
@ CMSG_SET_ACTION_BAR_TOGGLES
@ CMSG_CALENDAR_EVENT_SIGN_UP
@ CMSG_SAVE_EQUIPMENT_SET
@ CMSG_MOVE_DISMISS_VEHICLE
@ CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT
@ CMSG_MOVE_FORCE_GRAVITY_MODIFIER_CHANGE_ACK
@ CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK
@ CMSG_QUEST_GIVER_QUERY_QUEST
@ CMSG_COMPLETE_CINEMATIC
@ CMSG_QUEST_GIVER_REQUEST_REWARD
@ CMSG_REQUEST_VEHICLE_NEXT_SEAT
@ CMSG_REQUEST_VEHICLE_PREV_SEAT
@ CMSG_REQUEST_VEHICLE_EXIT
@ CMSG_SET_ASSISTANT_LEADER
@ CMSG_CHAT_MESSAGE_RAID_WARNING
@ CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK
@ CMSG_ACCEPT_GUILD_INVITE
@ CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK
@ CMSG_AUTOSTORE_BANK_ITEM
@ CMSG_QUEST_GIVER_COMPLETE_QUEST
@ CMSG_CHAR_RACE_OR_FACTION_CHANGE
@ CMSG_STAND_STATE_CHANGE
@ CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT
@ CMSG_CONFIRM_RESPEC_WIPE
@ CMSG_CHARACTER_RENAME_REQUEST
@ CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK
@ CMSG_CALENDAR_COPY_EVENT
@ CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK
@ CMSG_QUERY_INSPECT_ACHIEVEMENTS
@ CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK
@ CMSG_CALENDAR_MODERATOR_STATUS
@ CMSG_TAXI_NODE_STATUS_QUERY
@ CMSG_QUEST_GIVER_CHOOSE_REWARD
@ CMSG_GUILD_UPDATE_MOTD_TEXT
@ CMSG_GUILD_DECLINE_INVITATION
@ CMSG_RIDE_VEHICLE_INTERACT
@ CMSG_MOVE_CHANGE_VEHICLE_SEATS
@ CMSG_GET_ITEM_PURCHASE_DATA
@ CMSG_QUEST_GIVER_ACCEPT_QUEST
@ CMSG_GAME_OBJ_REPORT_USE
@ CMSG_SET_DUNGEON_DIFFICULTY
@ CMSG_GUILD_BANK_LOG_QUERY
@ CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK
@ CMSG_QUEST_GIVER_STATUS_QUERY
@ CMSG_AREA_SPIRIT_HEALER_QUERY
@ CMSG_SET_PARTY_ASSIGNMENT
@ CMSG_GUILD_BANK_TEXT_QUERY
@ CMSG_TAXI_QUERY_AVAILABLE_NODES
@ CMSG_QUEST_LOG_REMOVE_QUEST
@ CMSG_QUERY_NEXT_MAIL_TIME
@ CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY
@ CMSG_GUILD_EVENT_LOG_QUERY
@ CMSG_CHECK_IS_ADVENTURE_MAP_POI_VALID
@ CMSG_CHAT_ADDON_MESSAGE
@ CMSG_CHAT_MESSAGE_OFFICER
@ CMSG_PARTY_INVITE_RESPONSE
@ CMSG_SET_RAID_DIFFICULTY
@ CMSG_MOVE_SET_FACING_HEARTBEAT
@ CMSG_GUILD_BANK_SET_TAB_TEXT
@ CMSG_PETITION_RENAME_GUILD
@ CMSG_BATTLEMASTER_JOIN_ARENA
@ CMSG_GUILD_INVITE_BY_NAME
@ CMSG_HEARTH_AND_RESURRECT
@ CMSG_GUILD_UPDATE_INFO_TEXT
@ CMSG_CALENDAR_UPDATE_EVENT
@ CMSG_CHAT_MESSAGE_PARTY
@ CMSG_GUILD_SET_MEMBER_NOTE
@ CMSG_BUY_ACCOUNT_BANK_TAB
@ CMSG_ITEM_PURCHASE_REFUND
@ CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT
@ CMSG_QUERY_PLAYER_NAMES
@ CMSG_CALENDAR_REMOVE_EVENT
@ CMSG_UPDATE_RAID_TARGET
@ CMSG_REPORT_PVP_PLAYER_AFK
@ CMSG_GUILD_BANK_BUY_TAB
@ CMSG_QUERY_CORPSE_TRANSPORT
@ CMSG_GUILD_BANK_QUERY_TAB
@ CMSG_REQUEST_PARTY_MEMBER_STATS
@ CMSG_GUILD_BANK_UPDATE_TAB
@ CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK
@ INVENTORY_SLOT_BAG_START
@ ACCOUNT_BANK_SLOT_BAG_END
@ ACCOUNT_BANK_SLOT_BAG_START
@ PLAYER_DATA_FLAG_VALUE_BITS
#define DEFINE_FIELD_ACCESSOR_CACHE_ANONYMOUS(result_type, fields_list)
#define MAX_QUEST_LOG_SIZE
@ QUEST_FLAGS_FAIL_ON_LOGOUT
Role Based Access Control related classes definition.
uint32 urand(uint32 min, uint32 max)
constexpr BattlegroundQueueTypeId BATTLEGROUND_QUEUE_NONE
static constexpr uint8 PLAYER_MAX_BATTLEGROUND_QUEUES
@ EXPANSION_BATTLE_FOR_AZEROTH
#define MAX_ACCOUNT_TUTORIAL_VALUES
BanMode
Ban function modes.
@ SPELL_AURA_MOD_SHAPESHIFT
@ SPELL_AURA_SPIRIT_OF_REDEMPTION
@ TUTORIALS_FLAG_LOADED_FROM_DB
#define GLOBAL_CACHE_MASK
#define NUM_ACCOUNT_DATA_TYPES
bool Initialize(uint32 accountId, uint32)
AccountInfoQueryHolderPerRealm()
@ GLOBAL_REALM_CHARACTER_COUNTS
@ GLOBAL_ACCOUNT_HEIRLOOMS
@ PLAYER_DATA_ELEMENTS_ACCOUNT
@ ITEM_FAVORITE_APPEARANCES
@ PLAYER_DATA_FLAGS_ACCOUNT
bool Initialize(uint32 accountId, uint32 battlenetAccountId)
T & AddCallback(T &&query)
void ProcessReadyCallbacks()
ObjectGuid const & GetGUID() const
void SetDestroyedObject(bool destroyed)
void RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount)
char const * what() const noexcept override
void print_storage() const
Class used to access individual fields of database query result.
uint32 GetUInt32() const noexcept
uint8 GetUInt8() const noexcept
std::string GetString() const noexcept
int64 GetInt64() const noexcept
void add(T const &item)
Adds an item to the queue.
void readd(Iterator begin, Iterator end)
Adds items back to front of the queue.
bool next(T &result)
Gets the next result in the queue, if any.
virtual bool Process(WorldPacket *packet) override
LowType GetCounter() const
static ObjectGuid const Empty
std::string ToString() const
bool IsValid(OpcodeClient index) const
virtual bool ProcessUnsafe() const
WorldSession *const m_pSession
bool IsBeingTeleportedFar() const
void SetInvSlot(uint32 slot, ObjectGuid guid)
void FailQuestsWithFlag(QuestFlags flag)
void CleanupsBeforeDelete(bool finalCleanup=true) override
uint32 GetDeathTimer() const
ObjectGuid const & GetLootGUID() const
bool HasPendingBind() const
void RemoveBattlegroundQueueId(BattlegroundQueueTypeId val)
void ClearWhisperWhiteList()
void RemovePet(Pet *pet, PetSaveMode mode, bool returnreagent=false)
Battleground * GetBattleground() const
ObjectGuid::LowType GetGuildId() const
void SetPendingBind(uint32 instanceId, uint32 bindTimer)
uint32 GetXPForNextLevel() const
void SaveToDB(bool create=false)
void SetBuybackTimestamp(uint32 slot, time_t timestamp)
Group * GetGroup(Optional< uint8 > partyIndex)
void SetBuybackPrice(uint32 slot, uint32 price)
BattlegroundQueueTypeId GetBattlegroundQueueTypeId(uint32 index) const
void setString(uint8 index, std::string &&value)
void setUInt32(uint8 index, uint32 value)
void setInt64(uint8 index, int64 value)
void setFloat(uint8 index, float value)
void setUInt64(uint8 index, uint64 value)
void setInt32(uint8 index, int32 value)
void setUInt8(uint8 index, uint8 value)
void setNull(uint8 index)
void SetSize(size_t size)
PreparedQueryResult GetPreparedResult(size_t index) const
void AfterComplete(std::function< void(SQLQueryHolderBase const &)> callback) &
bool SetPreparedQuery(size_t index, PreparedStatement< T > *stmt)
void RemoveAurasByType(AuraType auraType, std::function< bool(AuraApplication const *)> const &check, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
void CombatStop(bool includingCast=false, bool mutualPvP=true, bool(*unitFilter)(Unit const *otherUnit)=nullptr)
void ExitAllAreaTriggers()
bool HasAuraType(AuraType auraType) const
std::string const & GetName() const
ConnectionType GetConnection() const
WorldPacket const * Write() override
std::vector< ConnectPayload > Payload
uint32 NativeRealmAddress
WorldPacket const * Write() override
Array< std::string, MAX_PREFIXES > Prefixes
std::array< Timestamp<>, NUM_ACCOUNT_DATA_TYPES > AccountTimes
WorldPacket const * Write() override
OpcodeClient GetOpcode() const
WorldPacket const * Write() override
WorldPacket const * Write() override
std::array< uint32, MAX_ACCOUNT_TUTORIAL_VALUES > TutorialData
bool Process(WorldPacket *packet) override
bool EvaluateOpcode(WorldPacket &p, time_t time) const
uint32 GetMaxPacketCounterAllowed(uint32 opcode) const
DosProtection(WorldSession *s)
PacketThrottlingMap _PacketThrottlingMap
Player session in the World.
void HandleUnregisterAllAddonPrefixesOpcode(WorldPackets::Chat::ChatUnregisterAllAddonPrefixes &packet)
void SetPlayer(Player *player)
bool m_playerRecentlyLogout
bool Update(uint32 diff, PacketFilter &updater)
Update the WorldSession (triggered by World update)
std::unique_ptr< Battlenet::Account > _battlenetAccount
void LogoutPlayer(bool save)
Log the player out
AccountData _accountData[NUM_ACCOUNT_DATA_TYPES]
char const * GetTrinityString(uint32 entry) const
ObjectGuid GetBattlenetAccountGUID() const
void LoadTutorialsData(PreparedQueryResult result)
void UpdateInstanceEnterTimes()
void SendClientCacheVersion(uint32 version)
void SetPlayerDataFlagAccount(uint32 dataFlagId, bool on)
void SendConnectToInstance(WorldPackets::Auth::ConnectToSerial serial)
void HandleMoveWorldportAck()
void SendNotification(char const *format,...) ATTR_PRINTF(2
std::array< std::shared_ptr< WorldSocket >, MAX_CONNECTION_TYPES > m_Socket
bool CanAccessAlliedRaces() const
AsyncCallbackProcessor< SQLQueryHolderCallback > _queryHolderProcessor
void SendAuthResponse(uint32 code, bool queued, uint32 queuePos=0)
void LoadPlayerDataAccount(PreparedQueryResult const &elementsResult, PreparedQueryResult const &flagsResult)
QueryCallbackProcessor _queryProcessor
std::array< uint32, MAX_ACCOUNT_TUTORIAL_VALUES > _tutorials
AccountTypes GetSecurity() const
LocaleConstant GetSessionDbLocaleIndex() const
rbac::RBACData * GetRBACData() const
bool PlayerDisconnected() const
bool DisallowHyperlinksAndMaybeKick(std::string const &str)
class WorldSession::DosProtection AntiDOS
void LoadAccountData(PreparedQueryResult result, uint32 mask)
std::atomic< time_t > m_timeOutTime
uint64 GetConnectToInstanceKey() const
std::unordered_map< uint32, uint8 > _realmCharacterCounts
WorldSession(uint32 id, std::string &&name, uint32 battlenetAccountId, std::string &&battlenetAccountEmail, std::shared_ptr< WorldSocket > &&sock, AccountTypes sec, uint8 expansion, time_t mute_time, std::string &&os, Minutes timezoneOffset, uint32 build, ClientBuild::VariantId clientBuildVariant, LocaleConstant locale, uint32 recruiter, bool isARecruiter)
WorldSession constructor.
std::string GetPlayerInfo() const
Player * GetPlayer() const
rbac::RBACData * _RBACData
std::unique_ptr< CollectionMgr > _collectionMgr
void SendAuthWaitQueue(uint32 position)
Handle the authentication waiting queue (to be completed)
void Handle_EarlyProccess(WorldPackets::Null &null)
~WorldSession()
WorldSession destructor.
void SetLogoutStartTime(time_t requestTime)
Engage the logout process for the user.
void SendSetTimeZoneInformation()
void LogUnexpectedOpcode(WorldPacket *packet, char const *status, const char *reason)
Logging helper for unexpected opcodes.
void RegisterTimeSync(uint32 counter)
AccountData const * GetAccountData(AccountDataType type) const
TransactionCallback & AddTransactionCallback(TransactionCallback &&callback)
uint32 _timeSyncNextCounter
void SavePlayerDataAccount(LoginDatabaseTransaction const &transaction)
void Handle_NULL(WorldPackets::Null &null)
ObjectGuid m_playerLoading
SQLQueryHolderCallback & AddQueryHolderCallback(SQLQueryHolderCallback &&callback)
QueryCallback LoadPermissionsAsync()
void SaveInstanceTimeRestrictions(CharacterDatabaseTransaction trans)
std::string const & GetRemoteAddress() const
void SetInQueue(bool state)
Session in auth.queue currently.
ObjectGuid::LowType m_GUIDLow
bool HasPermission(uint32 permissionId)
void LoadInstanceTimeRestrictions(PreparedQueryResult result)
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
uint32 GetBattlenetAccountId() const
PlayerDataAccount _playerDataAccount
uint32 GetAccountId() const
uint8 GetAccountExpansion() const
ConnectToKey _instanceConnectKey
std::unordered_map< uint32, SystemTimePoint > _instanceResetTimes
void QueuePacket(WorldPacket &&new_packet)
Add an incoming packet to the queue.
void SetPlayerDataElementAccount(uint32 dataElementId, float value)
bool UpdateAndCheckInstanceCount(uint32 instanceId)
uint32 GetLatency() const
void ProcessQueryCallbacks()
void InitializeSessionCallback(LoginDatabaseQueryHolder const &holder, CharacterDatabaseQueryHolder const &realmHolder)
void HandleAddonRegisteredPrefixesOpcode(WorldPackets::Chat::ChatRegisterAddonPrefixes &packet)
std::vector< std::string > _registeredAddonPrefixes
void SendAccountDataTimes(ObjectGuid playerGuid, uint32 mask)
bool IsAddonRegistered(std::string_view prefix) const
void HandleContinuePlayerLogin()
void SaveTutorialsData(CharacterDatabaseTransaction trans)
LockedQueue< WorldPacket * > _recvQueue
std::string const & GetPlayerName() const
void ResetTimeOutTime(bool onlyActive)
void KickPlayer(std::string_view reason)
Kick a player out of the World.
void InvalidateRBACData()
static void AddInstanceConnection(WorldSession *session, std::weak_ptr< WorldSocket > sockRef, ConnectToKey key)
void SetAccountData(AccountDataType type, time_t time, std::string const &data)
void SendFeatureSystemStatusGlueScreen()
void LogUnprocessedTail(WorldPacket const *packet)
Logging helper for unexpected opcodes.
bool ShouldLogOut(time_t currTime) const
Is logout cooldown expired?
bool ValidateHyperlinksAndMaybeKick(std::string const &str)
AsyncCallbackProcessor< TransactionCallback > _transactionCallbacks
void SendAvailableHotfixes()
bool IsConnectionIdle() const
std::unique_ptr< BattlePets::BattlePetMgr > _battlePetMgr
void AddInstanceEnterTime(uint32 instanceId, SystemTimePoint enterTime)
bool _filterAddonMessages
std::map< uint32, int64 > _pendingTimeSyncRequests
uint32 GetId() const
Gets the Id of the Object.
QueryCallback LoadFromDBAsync()
std::string const & GetName() const
Gets the Name of the Object.
void LoadFromDB()
Loads all permissions assigned to current account.
bool HasPermission(uint32 permission) const
uint32 GetVirtualRealmAddress()
@ CONFIG_MAX_INSTANCES_PER_HOUR
@ CONFIG_SOCKET_TIMEOUTTIME
@ CONFIG_CLIENTCACHE_VERSION
@ CONFIG_PACKET_SPOOF_BANDURATION
@ CONFIG_SOCKET_TIMEOUTTIME_ACTIVE
@ CONFIG_PACKET_SPOOF_POLICY
@ CONFIG_CHAT_STRICT_LINK_CHECKING_KICK
@ CONFIG_PACKET_SPOOF_BANMODE
SystemTimePoint GetSystemTime()
Current chrono system_clock time point.
constexpr void EraseIf(Container &c, Predicate p)
constexpr decltype(auto) EnsureWritableVectorIndex(std::vector< T > &vec, typename std::vector< T >::size_type i)
bool TC_GAME_API CheckAllLinks(std::string_view str)
std::string StringFormat(FormatString< Args... > fmt, Args &&... args) noexcept
Default TC string format function.
struct advstd::ranges::Contains contains
@ RBAC_PERM_IGNORE_IDLE_CONNECTION
PacketProcessing ProcessingPlace
PlayerDataElementType GetType() const
ConnectionType ConnectionIndex
union WorldPackets::Auth::ConnectTo::SocketAddress::@312 Address
std::array< uint8, 4 > V4
std::array< uint8, 16 > V6
std::vector< Element > Elements
std::vector< Flag > Flags
struct WorldSession::ConnectToKey::@320 Fields