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
2021-12-05 17:54:36 +00:00
//sql::PreparedStatement* stmt = Database::CreatePreppedStmt("SELECT id, gmlevel, mute_expire FROM accounts WHERE name=? LIMIT 1;");
sql : : PreparedStatement * stmt = Database : : CreatePreppedStmt ( " SELECT id, gm_level FROM accounts WHERE name=? LIMIT 1; " ) ;
stmt - > setString ( 1 , username . c_str ( ) ) ;
2022-07-25 02:26:51 +00:00
2021-12-05 17:54:36 +00:00
sql : : ResultSet * res = stmt - > executeQuery ( ) ;
while ( res - > next ( ) ) {
m_AccountID = res - > getUInt ( 1 ) ;
2023-03-24 23:16:45 +00:00
m_MaxGMLevel = static_cast < eGameMasterLevel > ( res - > getInt ( 2 ) ) ;
2021-12-05 17:54:36 +00:00
m_MuteExpire = 0 ; //res->getUInt64(3);
}
2022-07-25 02:26:51 +00:00
2021-12-05 17:54:36 +00:00
delete res ;
delete stmt ;
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 ) {
sql : : PreparedStatement * stmt = Database : : CreatePreppedStmt ( " SELECT id FROM charinfo WHERE account_id=? ORDER BY last_login DESC LIMIT 1; " ) ;
stmt - > setUInt ( 1 , m_AccountID ) ;
2022-07-28 13:39:57 +00:00
2021-12-05 17:54:36 +00:00
sql : : ResultSet * res = stmt - > executeQuery ( ) ;
if ( res - > rowsCount ( ) > 0 ) {
while ( res - > next ( ) ) {
LWOOBJID objID = res - > getUInt64 ( 1 ) ;
Character * character = new Character ( uint32_t ( objID ) , this ) ;
m_Characters . push_back ( character ) ;
2022-07-25 02:26:51 +00:00
Game : : logger - > Log ( " User " , " Loaded %llu as it is the last used char " , objID ) ;
2021-12-05 17:54:36 +00:00
}
}
2022-07-28 13:39:57 +00:00
2021-12-05 17:54:36 +00:00
delete res ;
delete stmt ;
}
}
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
}
}