27 #include <boost/algorithm/string.hpp>
37 sDatabase.RunQuery(res,
"SELECT ClientSeed FROM srvStatus WHERE AI = 1");
46 if (ccp.user_name.empty()) {
47 failMsg =
"Account Name is empty.";
50 if (ccp.user_name.length() < 3) {
51 failMsg =
"Account Name is too short.";
56 if (ccp.user_name.length() > 20) {
57 failMsg =
"Account Name is too long.";
63 failMsg =
"Account Name contains invalid characters.";
74 sDatabase.DoEscapeString(eLogin, ccp.user_name);
78 "SELECT accountID, clientID, password, hash, role, type, online, banned, logonCount, lastLogin"
79 " FROM account WHERE accountName = '%s'", eLogin.c_str() ) )
81 sLog.Error(
"ServiceDB",
"Error in query: %s.", res.
error.
c_str() );
82 failMsg =
"Error in DB Query";
83 failMsg +=
": Account not found for ";
92 if (
sConfig.account.autoAccountRole > 0) {
93 std::string ePass, ePassHash;
94 sDatabase.DoEscapeString(ePass, ccp.user_password);
95 sDatabase.DoEscapeString(ePassHash, ccp.user_password_hash);
97 if ( accountID > 0 ) {
101 failMsg =
"Failed to create a new account.";
105 failMsg =
"That account doesn't exist and AutoAccount is disabled.";
127 std::string eLogin, eHash;
128 sDatabase.DoEscapeString(eLogin, username);
132 if (!
sDatabase.RunQuery(err,
"UPDATE account SET hash='%s' WHERE accountName='%s'", eHash.
c_str(), eLogin.c_str())) {
133 sLog.Error(
"AccountDB",
"Unable to update account information for: %s.", username );
143 if (!
sDatabase.RunQuery(err,
"UPDATE account SET lastLogin=now(), logonCount=logonCount+1 WHERE accountID=%u", accountID)) {
144 sLog.Error(
"AccountDB",
"Unable to update account information for accountID %u.", accountID);
157 if ( !
sDatabase.RunQueryLID( err, accountID,
158 "INSERT INTO account ( accountName, password, hash, role, clientID )"
159 " VALUES ( '%s', '%s', '%s', %li, %u )",
160 login, pass, passHash, role, clientID ) )
162 sLog.Error(
"ServiceDB",
"Failed to create a new account '%s':'%s': %s.", login, pass, err.
c_str() );
166 sDatabase.RunQuery(err,
"UPDATE srvStatus SET ClientSeed = ClientSeed + 1 WHERE AI = 1");
173 sDatabase.RunQuery(err,
"UPDATE account SET password = '%s' WHERE accountID=%u", pass, accountID);
178 _log(CLIENT__TRACE,
"ServiceDB: Setting character %u %s.", char_id, online ?
"Online" :
"Offline");
180 sDatabase.RunQuery(err,
"UPDATE chrCharacters SET online = %u WHERE characterID = %u", (online?1:0), char_id);
183 sDatabase.RunQuery(err,
"UPDATE srvStatus SET Connections = Connections + 1");
189 "UPDATE srvStatus SET Online = %u, Connections = 0, startTime = %s WHERE AI = 1",
190 (online ? 1 : 0), (online ?
"UNIX_TIMESTAMP(CURRENT_TIMESTAMP)" :
"0"));
193 sDatabase.RunQuery(err,
"UPDATE chrCharacters SET online = 0 WHERE 1");
194 sDatabase.RunQuery(err,
"UPDATE account SET online = 0 WHERE 1");
195 sDatabase.RunQuery( err,
"DELETE FROM chrPausedSkillQueue WHERE 1");
200 if (!
sDatabase.RunQuery(err,
"UPDATE account SET online = %u WHERE accountID= %u ", (online?1:0), accountID)) {
201 codelog(DATABASE__ERROR,
"Error in query: %s", err.
c_str());
207 if (!
sDatabase.RunQuery(err,
"UPDATE account SET banned = %u WHERE accountID = %u", (banned?1:0), accountID)) {
208 codelog(DATABASE__ERROR,
"Error in query: %s", err.
c_str());
215 " INSERT INTO chrKillTable (solarSystemID, victimCharacterID, victimCorporationID, victimAllianceID, victimFactionID,"
216 "victimShipTypeID, victimDamageTaken, finalCharacterID, finalCorporationID, finalAllianceID, finalFactionID, finalShipTypeID,"
217 "finalWeaponTypeID, finalSecurityStatus, finalDamageDone, killBlob, killTime, moonID)"
218 " VALUES (%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%f,%u,'%s',%li,%u)",
229 if (!
sDatabase.RunQuery(res,
"SELECT corporationID FROM staStations WHERE stationID = %u", stationID)) {
230 codelog(DATABASE__ERROR,
"Failed to query info for station %u: %s.", stationID, res.
error.
c_str());
249 if (!
sDatabase.RunQuery(res,
"SELECT constantValue FROM eveConstants WHERE constantID='%s'", escaped.c_str() ))
257 _log(DATABASE__MESSAGE,
"Unable to find constant %s", name);
268 if (oldValue.compare(newValue) == 0)
276 std::string newEscValue;
277 sDatabase.DoEscapeString(newEscValue, newValue);
279 std::string qValue =
" ";
282 qValue += newEscValue.c_str();
284 dbQ.push_back(qValue);
289 if (oldValue == newValue)
297 int* nullInt(
nullptr);
298 std::string qValue(key);
300 qValue += fcvt(newValue, 2, nullInt, nullInt);
301 dbQ.push_back(qValue);
306 if (oldValue == newValue)
314 std::string qValue(key);
316 qValue += std::to_string(newValue);
317 dbQ.push_back(qValue);
322 if (oldValue == newValue)
330 std::string qValue(key);
332 qValue += std::to_string(newValue);
333 dbQ.push_back(qValue);
350 " updateTime = UNIX_TIMESTAMP(CURRENT_TIMESTAMP)"
354 _log(DATABASE__INFO,
"Server Stats Saved");
361 std::string matchEsc;
362 sDatabase.DoEscapeString(matchEsc, match);
363 if (matchEsc ==
"__ALL__") {
366 " characterID AS ownerID"
367 " FROM chrCharacters"
370 _log(DATABASE__ERROR,
"Error in LookupChars query: %s", res.
error.
c_str());
378 " WHERE itemName %s '%s'",
379 exact?
"=":
"LIKE", matchEsc.c_str()
382 _log(DATABASE__ERROR,
"Error in LookupChars query: %s", res.
error.
c_str());
394 std::string matchEsc;
395 sDatabase.DoEscapeString(matchEsc, match);
404 " characterID AS ownerID,"
405 " characterName AS ownerName,"
407 " FROM chrCharacters"
408 " WHERE characterName %s '%s'", (exact?
"=":
"LIKE"), matchEsc.c_str());
412 " corporationID AS ownerID,"
413 " corporationName AS ownerName,"
415 " FROM crpCorporation"
416 " WHERE corporationName %s '%s'", (exact?
"=":
"LIKE"), matchEsc.c_str());
420 " corporationID AS ownerID,"
421 " corporationName AS ownerName,"
423 " FROM crpCorporation"
424 " WHERE tickerName %s '%s'", (exact?
"=":
"LIKE"), matchEsc.c_str());
428 " allianceID AS ownerID,"
429 " allianceName AS ownerName,"
432 " WHERE allianceName %s '%s'", (exact?
"=":
"LIKE"), matchEsc.c_str());
436 " allianceID AS ownerID,"
437 " shortName AS ownerName,"
440 " WHERE shortName %s '%s'", (exact?
"=":
"LIKE"), matchEsc.c_str());
448 sDatabase.DoEscapeString(secure, search);
452 " corporationID, corporationName, corporationType "
453 " FROM crpCorporation "
454 " WHERE corporationName LIKE '%s'", secure.c_str()))
467 sDatabase.DoEscapeString(secure, search);
471 " factionID, factionName "
473 " WHERE factionName LIKE '%s'", secure.c_str()))
486 sDatabase.DoEscapeString(secure, search);
490 " corporationID, corporationName, tickerName "
491 " FROM crpCorporation "
492 " WHERE tickerName LIKE '%s'", secure.c_str()))
505 sDatabase.DoEscapeString(secure, search);
509 " stationID, stationName, stationTypeID "
511 " WHERE stationName LIKE '%s'", secure.c_str()))
524 sDatabase.DoEscapeString(secure, search);
528 " itemID, itemName, typeID "
530 " WHERE itemName LIKE '%s' AND typeID = %u", secure.c_str(), typeID))
545 for (
auto cur : itemIDs) {
547 sDatabase.RunQuery(res,
"SELECT characterID, characterName, typeID FROM chrCharacters WHERE characterID = %u", cur);
549 sDatabase.RunQuery(res,
"SELECT corporationID, corporationName, typeID FROM crpCorporation WHERE corporationID = %u", cur);
551 sDatabase.RunQuery(res,
"SELECT allianceID, allianceName, typeID FROM alnAlliance WHERE allianceID = %u", cur);
569 std::string table =
"crpWalletDivisons";
571 table =
"crpNPCWalletDivisons";
574 " SELECT division1,division2,division3,division4,division5,division6,division7"
576 " WHERE corporationID = %u", table.c_str(), corpID))
578 codelog(CORP__DB_ERROR,
"Error in retrieving corporation's data (%u)", corpID);
592 _log(CORP__DB_ERROR,
"CorpID %u has no division data.", corpID);
static bool IncrementLoginCount(uint32 accountID)
#define sConfig
A macro for easier access to the singleton.
static void SetCharacterOnlineStatus(uint32 char_id, bool online=false)
#define IsNPCCorp(itemID)
uint32 GetStationOwner(uint32 stationID)
uint32 finalCorporationID
void ProcessRealChange(const char *key, double oldValue, double newValue, PyDict *notif, std::vector< std::string > &dbQ)
const char * GetText(uint32 index) const
#define _log(type, fmt,...)
int32 GetInt(uint32 index) const
void ProcessIntChange(const char *key, uint32 oldValue, uint32 newValue, PyDict *notif, std::vector< std::string > &dbQ)
static PyRep * LookupCorporationTickers(const std::string &)
uint32 GetUInt(uint32 index) const
static const std::array< std::string, 18 > badChars
static PyRep * LookupOwners(const char *match, bool exact=false)
Python floating point number.
static void SaveKillOrLoss(CharKillData &data)
static uint32 CreateNewAccount(const char *login, const char *pass, const char *passHash, int64 role)
static void SetAccountBanStatus(uint32 accountID, bool banned=false)
static uint32 SetClientSeed()
static void SaveServerStats(double threads, float rss, float vm, float user, float kernel, uint32 items, uint32 bubbles)
static void GetCorpHangarNames(uint32 corpID, std::map< uint8, std::string > &hangarNames)
static bool GetConstant(const char *name, uint32 &into)
void ProcessStringChange(const char *key, const std::string &oldValue, std::string newValue, PyDict *notif, std::vector< std::string > &dbQ)
bool GetRow(DBResultRow &into)
static PyRep * LookupKnownLocationsByGroup(const std::string &, uint32)
#define sLog
Evaluates to a NewLog instance.
static PyRep * LookupCorporations(const std::string &)
const char * c_str() const
static void UpdatePassword(uint32 accountID, const char *pass)
#define codelog(type, fmt,...)
static void SetAccountOnlineStatus(uint32 accountID, bool online=false)
uint32 victimCorporationID
PyObject * DBResultToRowset(DBQueryResult &result)
bool IsNull(uint32 index) const
#define IsPlayerCorp(itemID)
#define IsCharacterID(itemID)
void ProcessLongChange(const char *key, int64 oldValue, int64 newValue, PyDict *notif, std::vector< std::string > &dbQ)
double finalSecurityStatus
static bool UpdateAccountHash(const char *username, std::string &hash)
static PyRep * PrimeOwners(std::vector< int32 > &itemIDs)
static PyRep * LookupChars(const char *match, bool exact=false)
static bool GetAccountInformation(CryptoChallengePacket &ccp, AccountData &aData, std::string &failMsg)
static void SetServerOnlineStatus(bool online=false)
static PyRep * LookupStations(const std::string &)
static bool ValidateAccountName(CryptoChallengePacket &ccp, std::string &failMsg)
#define IsAlliance(itemID)
typeID Spawn an NPC with the specified type text Search for items matching the specified query() type() key(value)-Send an OnRemoteMessage" ) COMMAND( setbpattr
static PyRep * LookupFactions(const std::string &)
int64 GetInt64(uint32 index) const
entityID heal the character with the entityID note giving you detailed ship status information gives a list of all dynamic entities and players and their destinyState in this bubble shows some current destiny variables save all items
void SetItem(PyRep *key, PyRep *value)
SetItem adds or sets a database entry.
void SetItemString(const char *key, PyRep *value)
SetItemString adds or sets a database entry.
bool icontains(std::string data, std::string toSearch, size_t pos=0)