[Quest API] Add ClearAccountFlag() and GetAccountFlags() to Perl/Lua (#3469)

* [Quest API] Add ClearAccountFlag() and GetAccountFlags() to Perl/Lua

# Perl
- Add `$client->ClearAccountFlag(flag)`.
- Add `$client->GetAccountFlags()`.

# Lua
- Add `client:ClearAccountFlag(flag)`.
- Add `client:GetAccountFlags()`.

# Notes
- Made use of repositories and cleaned up existing code.

* Update lua_client.cpp

* Don't use auto.
This commit is contained in:
Alex King 2023-07-03 02:19:48 -04:00 committed by GitHub
parent dc28c8d485
commit 2717fcc339
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 134 additions and 37 deletions

View File

@ -44,7 +44,35 @@ public:
*/ */
// Custom extended repository methods here // Custom extended repository methods here
static void ClearFlag(
Database& db,
AccountFlagsRepository::AccountFlags e
) {
AccountFlagsRepository::DeleteWhere(
database,
fmt::format(
"p_accid = {} AND p_flag = '{}'",
e.p_accid,
Strings::Escape(e.p_flag)
)
);
}
static void ReplaceFlag(
Database& db,
AccountFlagsRepository::AccountFlags e
) {
db.QueryDatabase(
fmt::format(
"REPLACE INTO {} ({}) VALUES ({}, '{}', '{}')",
TableName(),
ColumnsRaw(),
e.p_accid,
Strings::Escape(e.p_flag),
Strings::Escape(e.p_value)
)
);
}
}; };
#endif //EQEMU_ACCOUNT_FLAGS_REPOSITORY_H #endif //EQEMU_ACCOUNT_FLAGS_REPOSITORY_H

View File

@ -58,6 +58,7 @@ extern volatile bool RunLoops;
#include "mob_movement_manager.h" #include "mob_movement_manager.h"
#include "cheat_manager.h" #include "cheat_manager.h"
#include "../common/repositories/account_flags_repository.h"
#include "../common/repositories/bug_reports_repository.h" #include "../common/repositories/bug_reports_repository.h"
#include "../common/repositories/char_recipe_list_repository.h" #include "../common/repositories/char_recipe_list_repository.h"
#include "../common/repositories/character_spells_repository.h" #include "../common/repositories/character_spells_repository.h"
@ -7480,36 +7481,57 @@ void Client::SendFactionMessage(int32 tmpvalue, int32 faction_id, int32 faction_
void Client::LoadAccountFlags() void Client::LoadAccountFlags()
{ {
accountflags.clear(); accountflags.clear();
std::string query = StringFormat("SELECT p_flag, p_value "
"FROM account_flags WHERE p_accid = '%d'", const auto& l = AccountFlagsRepository::GetWhere(database, fmt::format("p_accid = {}", account_id));
account_id); if (l.empty()) {
auto results = database.QueryDatabase(query);
if (!results.Success()) {
return; return;
} }
for (auto row = results.begin(); row != results.end(); ++row) for (const auto& e : l) {
accountflags[row[0]] = row[1]; accountflags[e.p_flag] = e.p_value;
}
void Client::SetAccountFlag(std::string flag, std::string val) {
std::string query = StringFormat("REPLACE INTO account_flags (p_accid, p_flag, p_value) "
"VALUES( '%d', '%s', '%s')",
account_id, flag.c_str(), val.c_str());
auto results = database.QueryDatabase(query);
if(!results.Success()) {
return;
} }
accountflags[flag] = val;
} }
std::string Client::GetAccountFlag(std::string flag) void Client::ClearAccountFlag(const std::string& flag)
{ {
return(accountflags[flag]); auto e = AccountFlagsRepository::NewEntity();
e.p_accid = account_id;
e.p_flag = flag;
AccountFlagsRepository::ClearFlag(database, e);
}
void Client::SetAccountFlag(const std::string& flag, const std::string& value)
{
auto e = AccountFlagsRepository::NewEntity();
e.p_accid = account_id;
e.p_flag = flag;
e.p_value = value;
AccountFlagsRepository::ReplaceFlag(database, e);
accountflags[flag] = value;
}
std::string Client::GetAccountFlag(const std::string& flag)
{
return accountflags[flag];
}
std::vector<std::string> Client::GetAccountFlags()
{
std::vector<std::string> l;
l.reserve(accountflags.size());
for (const auto& e : accountflags) {
l.emplace_back(e.first);
}
return l;
} }
void Client::TickItemCheck() void Client::TickItemCheck()

View File

@ -1581,8 +1581,10 @@ public:
int32 GetActWIS() { return( std::min(GetMaxWIS(), GetWIS()) ); } int32 GetActWIS() { return( std::min(GetMaxWIS(), GetWIS()) ); }
int32 GetActCHA() { return( std::min(GetMaxCHA(), GetCHA()) ); } int32 GetActCHA() { return( std::min(GetMaxCHA(), GetCHA()) ); }
void LoadAccountFlags(); void LoadAccountFlags();
void SetAccountFlag(std::string flag, std::string val); void ClearAccountFlag(const std::string& flag);
std::string GetAccountFlag(std::string flag); void SetAccountFlag(const std::string& flag, const std::string& value);
std::string GetAccountFlag(const std::string& flag);
std::vector<std::string> GetAccountFlags();
void SetGMStatus(int16 new_status); void SetGMStatus(int16 new_status);
void Consume(const EQ::ItemData *item, uint8 type, int16 slot, bool auto_consume); void Consume(const EQ::ItemData *item, uint8 type, int16 slot, bool auto_consume);
void PlayMP3(const char* fname); void PlayMP3(const char* fname);

View File

@ -1509,16 +1509,36 @@ bool Lua_Client::HasSpellScribed(int spell_id) {
return self->HasSpellScribed(spell_id); return self->HasSpellScribed(spell_id);
} }
void Lua_Client::SetAccountFlag(std::string flag, std::string val) { void Lua_Client::ClearAccountFlag(const std::string& flag) {
Lua_Safe_Call_Void(); Lua_Safe_Call_Void();
self->SetAccountFlag(flag, val); self->ClearAccountFlag(flag);
} }
std::string Lua_Client::GetAccountFlag(std::string flag) { void Lua_Client::SetAccountFlag(const std::string& flag, const std::string& value) {
Lua_Safe_Call_Void();
self->SetAccountFlag(flag, value);
}
std::string Lua_Client::GetAccountFlag(const std::string& flag) {
Lua_Safe_Call_String(); Lua_Safe_Call_String();
return self->GetAccountFlag(flag); return self->GetAccountFlag(flag);
} }
luabind::object Lua_Client::GetAccountFlags(lua_State* L) {
auto t = luabind::newtable(L);
if (d_) {
auto self = reinterpret_cast<NativeType*>(d_);
auto l = self->GetAccountFlags();
int i = 1;
for (const auto& e : l) {
t[i] = e;
i++;
}
}
return t;
}
Lua_Group Lua_Client::GetGroup() { Lua_Group Lua_Client::GetGroup() {
Lua_Safe_Call_Class(Lua_Group); Lua_Safe_Call_Class(Lua_Group);
return self->GetGroup(); return self->GetGroup();
@ -2831,7 +2851,7 @@ luabind::object Lua_Client::GetPEQZoneFlags(lua_State* L) {
if (d_) { if (d_) {
auto self = reinterpret_cast<NativeType*>(d_); auto self = reinterpret_cast<NativeType*>(d_);
auto l = self->GetPEQZoneFlags(); auto l = self->GetPEQZoneFlags();
auto i = 1; int i = 1;
for (const auto& f : l) { for (const auto& f : l) {
t[i] = f; t[i] = f;
i++; i++;
@ -2846,7 +2866,7 @@ luabind::object Lua_Client::GetZoneFlags(lua_State* L) {
if (d_) { if (d_) {
auto self = reinterpret_cast<NativeType*>(d_); auto self = reinterpret_cast<NativeType*>(d_);
auto l = self->GetZoneFlags(); auto l = self->GetZoneFlags();
auto i = 1; int i = 1;
for (const auto& f : l) { for (const auto& f : l) {
t[i] = f; t[i] = f;
i++; i++;
@ -3136,6 +3156,7 @@ luabind::scope lua_register_client() {
.def("CheckIncreaseSkill", (void(Lua_Client::*)(int,Lua_Mob,int))&Lua_Client::CheckIncreaseSkill) .def("CheckIncreaseSkill", (void(Lua_Client::*)(int,Lua_Mob,int))&Lua_Client::CheckIncreaseSkill)
.def("CheckSpecializeIncrease", (void(Lua_Client::*)(int))&Lua_Client::CheckSpecializeIncrease) .def("CheckSpecializeIncrease", (void(Lua_Client::*)(int))&Lua_Client::CheckSpecializeIncrease)
.def("ClearCompassMark",(void(Lua_Client::*)(void))&Lua_Client::ClearCompassMark) .def("ClearCompassMark",(void(Lua_Client::*)(void))&Lua_Client::ClearCompassMark)
.def("ClearAccountFlag", (void(Lua_Client::*)(const std::string&))&Lua_Client::ClearAccountFlag)
.def("ClearPEQZoneFlag", (void(Lua_Client::*)(uint32))&Lua_Client::ClearPEQZoneFlag) .def("ClearPEQZoneFlag", (void(Lua_Client::*)(uint32))&Lua_Client::ClearPEQZoneFlag)
.def("ClearZoneFlag", (void(Lua_Client::*)(uint32))&Lua_Client::ClearZoneFlag) .def("ClearZoneFlag", (void(Lua_Client::*)(uint32))&Lua_Client::ClearZoneFlag)
.def("Connected", (bool(Lua_Client::*)(void))&Lua_Client::Connected) .def("Connected", (bool(Lua_Client::*)(void))&Lua_Client::Connected)
@ -3190,7 +3211,8 @@ luabind::scope lua_register_client() {
.def("GetAAPoints", (int(Lua_Client::*)(void))&Lua_Client::GetAAPoints) .def("GetAAPoints", (int(Lua_Client::*)(void))&Lua_Client::GetAAPoints)
.def("GetAFK", (int(Lua_Client::*)(void))&Lua_Client::GetAFK) .def("GetAFK", (int(Lua_Client::*)(void))&Lua_Client::GetAFK)
.def("GetAccountAge", (int(Lua_Client::*)(void))&Lua_Client::GetAccountAge) .def("GetAccountAge", (int(Lua_Client::*)(void))&Lua_Client::GetAccountAge)
.def("GetAccountFlag", (std::string(Lua_Client::*)(std::string))&Lua_Client::GetAccountFlag) .def("GetAccountFlag", (std::string(Lua_Client::*)(const std::string&))&Lua_Client::GetAccountFlag)
.def("GetAccountFlags", (luabind::object(Lua_Client::*)(lua_State*))&Lua_Client::GetAccountFlags)
.def("GetAggroCount", (uint32(Lua_Client::*)(void))&Lua_Client::GetAggroCount) .def("GetAggroCount", (uint32(Lua_Client::*)(void))&Lua_Client::GetAggroCount)
.def("GetAllMoney", (uint64(Lua_Client::*)(void))&Lua_Client::GetAllMoney) .def("GetAllMoney", (uint64(Lua_Client::*)(void))&Lua_Client::GetAllMoney)
.def("GetAlternateCurrencyValue", (int(Lua_Client::*)(uint32))&Lua_Client::GetAlternateCurrencyValue) .def("GetAlternateCurrencyValue", (int(Lua_Client::*)(uint32))&Lua_Client::GetAlternateCurrencyValue)
@ -3470,8 +3492,7 @@ luabind::scope lua_register_client() {
.def("SetAATitle", (void(Lua_Client::*)(std::string))&Lua_Client::SetAATitle) .def("SetAATitle", (void(Lua_Client::*)(std::string))&Lua_Client::SetAATitle)
.def("SetAATitle", (void(Lua_Client::*)(std::string,bool))&Lua_Client::SetAATitle) .def("SetAATitle", (void(Lua_Client::*)(std::string,bool))&Lua_Client::SetAATitle)
.def("SetAFK", (void(Lua_Client::*)(uint8))&Lua_Client::SetAFK) .def("SetAFK", (void(Lua_Client::*)(uint8))&Lua_Client::SetAFK)
.def("SetAccountFlag", (void(Lua_Client::*)(std::string,std::string))&Lua_Client::SetAccountFlag) .def("SetAccountFlag", (void(Lua_Client::*)(const std::string&,const std::string&))&Lua_Client::SetAccountFlag)
.def("SetAccountFlag", (void(Lua_Client::*)(std::string,std::string))&Lua_Client::SetAccountFlag)
.def("SetAlternateCurrencyValue", (void(Lua_Client::*)(uint32,int))&Lua_Client::SetAlternateCurrencyValue) .def("SetAlternateCurrencyValue", (void(Lua_Client::*)(uint32,int))&Lua_Client::SetAlternateCurrencyValue)
.def("SetAnon", (void(Lua_Client::*)(uint8))&Lua_Client::SetAnon) .def("SetAnon", (void(Lua_Client::*)(uint8))&Lua_Client::SetAnon)
.def("SetBaseClass", (void(Lua_Client::*)(int))&Lua_Client::SetBaseClass) .def("SetBaseClass", (void(Lua_Client::*)(int))&Lua_Client::SetBaseClass)

View File

@ -380,8 +380,10 @@ public:
int GetAlternateCurrencyValue(uint32 currency); int GetAlternateCurrencyValue(uint32 currency);
void SendWebLink(const char *site); void SendWebLink(const char *site);
bool HasSpellScribed(int spell_id); bool HasSpellScribed(int spell_id);
void SetAccountFlag(std::string flag, std::string val); void ClearAccountFlag(const std::string& flag);
std::string GetAccountFlag(std::string flag); void SetAccountFlag(const std::string& flag, const std::string& value);
std::string GetAccountFlag(const std::string& flag);
luabind::object GetAccountFlags(lua_State* L);
int GetAccountAge(); int GetAccountAge();
Lua_Group GetGroup(); Lua_Group GetGroup();
Lua_Raid GetRaid(); Lua_Raid GetRaid();

View File

@ -2753,7 +2753,7 @@ luabind::object Lua_Mob::GetEntityVariables(lua_State* L) {
if (d_) { if (d_) {
auto self = reinterpret_cast<NativeType*>(d_); auto self = reinterpret_cast<NativeType*>(d_);
auto l = self->GetEntityVariables(); auto l = self->GetEntityVariables();
auto i = 1; int i = 1;
for (const auto& v : l) { for (const auto& v : l) {
t[i] = v; t[i] = v;
i++; i++;
@ -3044,7 +3044,7 @@ luabind::object Lua_Mob::GetBuffSpellIDs(lua_State* L) {
if (d_) { if (d_) {
auto self = reinterpret_cast<NativeType*>(d_); auto self = reinterpret_cast<NativeType*>(d_);
auto l = self->GetBuffSpellIDs(); auto l = self->GetBuffSpellIDs();
auto i = 1; int i = 1;
for (const auto& v : l) { for (const auto& v : l) {
t[i] = v; t[i] = v;
i++; i++;

View File

@ -173,7 +173,7 @@ luabind::object Lua_Object::GetEntityVariables(lua_State* L) {
if (d_) { if (d_) {
auto self = reinterpret_cast<NativeType*>(d_); auto self = reinterpret_cast<NativeType*>(d_);
auto l = self->GetEntityVariables(); auto l = self->GetEntityVariables();
auto i = 1; int i = 1;
for (const auto& v : l) { for (const auto& v : l) {
t[i] = v; t[i] = v;
i++; i++;

View File

@ -1502,6 +1502,11 @@ bool Perl_Client_HasSpellScribed(Client* self, int spell_id) // @categories Spel
return self->HasSpellScribed(spell_id); return self->HasSpellScribed(spell_id);
} }
void Perl_Client_ClearAccountFlag(Client* self, std::string flag) // @categories Account and Character
{
self->ClearAccountFlag(flag);
}
void Perl_Client_SetAccountFlag(Client* self, std::string flag, std::string value) // @categories Account and Character void Perl_Client_SetAccountFlag(Client* self, std::string flag, std::string value) // @categories Account and Character
{ {
self->SetAccountFlag(flag, value); self->SetAccountFlag(flag, value);
@ -1512,6 +1517,21 @@ std::string Perl_Client_GetAccountFlag(Client* self, std::string flag) // @categ
return self->GetAccountFlag(flag); return self->GetAccountFlag(flag);
} }
perl::array Perl_Client_GetAccountFlags(Client* self)
{
perl::array result;
const auto& l = self->GetAccountFlags();
result.reserve(l.size());
for (const auto& e : l) {
result.push_back(e);
}
return result;
}
int Perl_Client_GetHunger(Client* self) // @categories Account and Character, Stats and Attributes int Perl_Client_GetHunger(Client* self) // @categories Account and Character, Stats and Attributes
{ {
return self->GetHunger(); return self->GetHunger();
@ -2994,6 +3014,7 @@ void perl_register_client()
package.add("CheckIncreaseSkill", (bool(*)(Client*, int, int))&Perl_Client_CheckIncreaseSkill); package.add("CheckIncreaseSkill", (bool(*)(Client*, int, int))&Perl_Client_CheckIncreaseSkill);
package.add("CheckSpecializeIncrease", &Perl_Client_CheckSpecializeIncrease); package.add("CheckSpecializeIncrease", &Perl_Client_CheckSpecializeIncrease);
package.add("ClearCompassMark", &Perl_Client_ClearCompassMark); package.add("ClearCompassMark", &Perl_Client_ClearCompassMark);
package.add("ClearAccountFlag", &Perl_Client_ClearAccountFlag);
package.add("ClearPEQZoneFlag", &Perl_Client_ClearPEQZoneFlag); package.add("ClearPEQZoneFlag", &Perl_Client_ClearPEQZoneFlag);
package.add("ClearZoneFlag", &Perl_Client_ClearZoneFlag); package.add("ClearZoneFlag", &Perl_Client_ClearZoneFlag);
package.add("Connected", &Perl_Client_Connected); package.add("Connected", &Perl_Client_Connected);
@ -3042,6 +3063,7 @@ void perl_register_client()
package.add("GetAFK", &Perl_Client_GetAFK); package.add("GetAFK", &Perl_Client_GetAFK);
package.add("GetAccountAge", &Perl_Client_GetAccountAge); package.add("GetAccountAge", &Perl_Client_GetAccountAge);
package.add("GetAccountFlag", &Perl_Client_GetAccountFlag); package.add("GetAccountFlag", &Perl_Client_GetAccountFlag);
package.add("GetAccountFlags", &Perl_Client_GetAccountFlags);
package.add("GetAggroCount", &Perl_Client_GetAggroCount); package.add("GetAggroCount", &Perl_Client_GetAggroCount);
package.add("GetAllMoney", &Perl_Client_GetAllMoney); package.add("GetAllMoney", &Perl_Client_GetAllMoney);
package.add("GetAlternateCurrencyValue", &Perl_Client_GetAlternateCurrencyValue); package.add("GetAlternateCurrencyValue", &Perl_Client_GetAlternateCurrencyValue);