2021-12-05 17:54:36 +00:00
# include "User.h"
# include "Database.h"
# include "Character.h"
# include "dServer.h"
# include "dLogger.h"
# include "Game.h"
# include "dZoneManager.h"
2023-02-19 12:29:14 +00:00
# include "eServerDisconnectIdentifiers.h"
2023-03-24 23:16:45 +00:00
# include "eGameMasterLevel.h"
2021-12-05 17:54:36 +00:00
User : : User ( const SystemAddress & sysAddr , const std : : string & username , const std : : string & sessionKey ) {
m_AccountID = 0 ;
m_Username = " " ;
m_SessionKey = " " ;
2023-03-24 23:16:45 +00:00
m_MaxGMLevel = eGameMasterLevel : : CIVILIAN ; //The max GM level this account can assign to it's characters
2021-12-05 17:54:36 +00:00
m_LastCharID = 0 ;
m_SessionKey = sessionKey ;
m_SystemAddress = sysAddr ;
m_Username = username ;
m_LoggedInCharID = 0 ;
2022-07-17 08:40:34 +00:00
m_IsBestFriendMap = std : : unordered_map < std : : string , bool > ( ) ;
2022-07-25 02:26:51 +00:00
2021-12-05 17:54:36 +00:00
//HACK HACK HACK
//This needs to be re-enabled / updated whenever the mute stuff is moved to another table.
//This was only done because otherwise the website's account page dies and the website is waiting on a migration to wordpress.
2022-07-25 02:26:51 +00:00
2023-10-10 00:40:48 +00:00
auto account = Database : : Connection - > GetAccountByName ( username ) ;
2022-07-25 02:26:51 +00:00
2023-10-10 00:40:48 +00:00
m_AccountID = account . ID ;
m_MaxGMLevel = static_cast < eGameMasterLevel > ( account . MaxGMLevel ) ;
m_MuteExpire = 0 ;
2022-07-25 02:26:51 +00:00
2021-12-05 17:54:36 +00:00
//If we're loading a zone, we'll load the last used (aka current) character:
if ( Game : : server - > GetZoneID ( ) ! = 0 ) {
2023-10-10 00:40:48 +00:00
uint32_t characterId = Database : : Connection - > GetLatestCharacterOfAccount ( m_AccountID ) ;
2022-07-28 13:39:57 +00:00
2023-10-10 00:40:48 +00:00
if ( characterId ! = 0 ) {
Character * character = new Character ( characterId , this ) ;
m_Characters . push_back ( character ) ;
Game : : logger - > Log ( " User " , " Loaded %u as it is the last used char " , characterId ) ;
2021-12-05 17:54:36 +00:00
}
}
}
User : : User ( const User & other ) {
this - > m_AccountID = other . m_AccountID ;
this - > m_LastCharID = other . m_LastCharID ;
this - > m_MaxGMLevel = other . m_MaxGMLevel ;
this - > m_SessionKey = other . m_SessionKey ;
this - > m_SystemAddress = other . m_SystemAddress ;
this - > m_Username = other . m_Username ;
this - > m_LoggedInCharID = other . m_LoggedInCharID ;
}
User : : ~ User ( ) {
for ( Character * c : m_Characters ) {
if ( c ) {
delete c ;
c = nullptr ;
}
}
}
User & User : : operator = ( const User & other ) {
this - > m_AccountID = other . m_AccountID ;
this - > m_LastCharID = other . m_LastCharID ;
this - > m_MaxGMLevel = other . m_MaxGMLevel ;
this - > m_SessionKey = other . m_SessionKey ;
this - > m_SystemAddress = other . m_SystemAddress ;
this - > m_Username = other . m_Username ;
this - > m_LoggedInCharID = other . m_LoggedInCharID ;
return * this ;
}
bool User : : operator = = ( const User & other ) const {
if ( m_Username = = other . m_Username | | m_SessionKey = = other . m_SessionKey | | m_SystemAddress = = other . m_SystemAddress )
return true ;
2022-07-25 02:26:51 +00:00
2021-12-05 17:54:36 +00:00
return false ;
}
Character * User : : GetLastUsedChar ( ) {
if ( m_Characters . size ( ) = = 0 ) return nullptr ;
else if ( m_Characters . size ( ) = = 1 ) return m_Characters [ 0 ] ;
else {
Character * toReturn = m_Characters [ 0 ] ;
for ( size_t i = 0 ; i < m_Characters . size ( ) ; + + i ) {
if ( m_Characters [ i ] - > GetLastLogin ( ) > toReturn - > GetLastLogin ( ) ) toReturn = m_Characters [ i ] ;
}
2022-07-28 13:39:57 +00:00
2021-12-05 17:54:36 +00:00
return toReturn ;
}
}
bool User : : GetIsMuted ( ) const {
return m_MuteExpire = = 1 | | m_MuteExpire > time ( NULL ) ;
}
time_t User : : GetMuteExpire ( ) const {
return m_MuteExpire ;
}
2022-07-25 02:26:51 +00:00
void User : : SetMuteExpire ( time_t value ) {
2021-12-05 17:54:36 +00:00
m_MuteExpire = value ;
}
void User : : UserOutOfSync ( ) {
m_AmountOfTimesOutOfSync + + ;
if ( m_AmountOfTimesOutOfSync > m_MaxDesyncAllowed ) {
//YEET
2022-07-25 02:26:51 +00:00
Game : : logger - > Log ( " User " , " User %s was out of sync %i times out of %i, disconnecting for suspected speedhacking. " , m_Username . c_str ( ) , m_AmountOfTimesOutOfSync , m_MaxDesyncAllowed ) ;
2023-02-19 12:29:14 +00:00
Game : : server - > Disconnect ( this - > m_SystemAddress , eServerDisconnectIdentifiers : : PLAY_SCHEDULE_TIME_DONE ) ;
2021-12-05 17:54:36 +00:00
}
}