Add a new method of loading values from config.ini

- Centralizes the loading of values from config.ini, loading them all in at server start and holding them in memory.
- Removes all other methods of loading config.ini values and replaces them with references to these central values.
- Removes getServerName() and getDiceValue()
This commit is contained in:
MangosArentLiterature 2021-04-09 19:18:46 -05:00
parent cff51674bb
commit 86c25555b2
9 changed files with 103 additions and 94 deletions

View File

@ -1399,6 +1399,13 @@ class AOClient : public QObject {
*/
void cmd8Ball(int argc, QStringList argv);
/**
* @brief Reloads all server configuration files.
*
* @details No arguments.
*/
void cmdReload(int argc, QStringList argv);
///@}
/**

View File

@ -282,6 +282,11 @@ class AreaData : public QObject {
* @brief The last IC packet sent in an area.
*/
QStringList last_ic_message;
/**
* @brief The value of logger in config.ini.
*/
QString log_type;
};
#endif // AREA_DATA_H

View File

@ -125,24 +125,6 @@ class Server : public QObject {
*/
void broadcast(AOPacket packet);
/**
* @brief Returns the server's name according to the configuration file.
*
* @return See brief description.
*/
QString getServerName();
/**
* @brief Returns some value regarding the @ref AOClient::diceThrower "dice thrower commands".
*
* @param value_type `max_value` for the maximum amount of faces a die may have,
* `max_dice` for the maximum amount of dice that may be thrown at once.
*
* @return The associated value if it is found in the configuration file under the "Dice" section,
* or `100` if not.
*/
int getDiceValue(QString value_type);
/**
* @brief Returns the character's character ID (= their index in the character list).
*
@ -199,6 +181,10 @@ class Server : public QObject {
*/
DBManager* db_manager;
/**
* @brief The max amount of players on the server.
*/
QString max_players;
/**
* @brief The user-facing server name.
*
@ -211,11 +197,43 @@ class Server : public QObject {
*/
QString MOTD;
/**
* @brief The authorization type of the server.
*
* @details In simple mode, the modpass stored in config.ini is used for moderator logins. In advanced mode, logins found in the database are used.
*/
QString auth_type;
/**
* @brief The modpass for moderator login with simple auth_type.
*/
QString modpass;
/**
* @brief The amount of subscripts zalgo is stripped by.
*/
int zalgo_tolerance;
/**
* @brief The highest value dice can have.
*/
uint dice_value;
/**
* @brief The max amount of dice that can be rolled at once.
*/
int max_dice;
/**
* @brief The server-wide global timer.
*/
QTimer* timer;
/**
* @brief Loads values from config.ini.
*/
void loadServerConfig();
/**
* @brief Loads the configuration files for commands into stringlists.
*/

View File

@ -276,17 +276,17 @@ void AOClient::calculateIpid()
void AOClient::sendServerMessage(QString message)
{
sendPacket("CT", {server->getServerName(), message, "1"});
sendPacket("CT", {server->server_name, message, "1"});
}
void AOClient::sendServerMessageArea(QString message)
{
server->broadcast(AOPacket("CT", {server->getServerName(), message, "1"}), current_area);
server->broadcast(AOPacket("CT", {server->server_name, message, "1"}), current_area);
}
void AOClient::sendServerBroadcast(QString message)
{
server->broadcast(AOPacket("CT", {server->getServerName(), message, "1"}));
server->broadcast(AOPacket("CT", {server->server_name, message, "1"}));
}
bool AOClient::checkAuth(unsigned long long acl_mask)
@ -300,14 +300,11 @@ bool AOClient::checkAuth(unsigned long long acl_mask)
else if (!authenticated) {
return false;
}
QSettings settings("config/config.ini", QSettings::IniFormat);
settings.beginGroup("Options");
QString auth_type = settings.value("auth", "simple").toString();
if (auth_type == "advanced") {
if (server->auth_type == "advanced") {
unsigned long long user_acl = server->db_manager->getACL(moderator_name);
return (user_acl & acl_mask) != 0;
}
else if (auth_type == "simple") {
else if (server->auth_type == "simple") {
return authenticated;
}
}

View File

@ -42,6 +42,7 @@ AreaData::AreaData(QString p_name, int p_index) :
QSettings config_ini("config/config.ini", QSettings::IniFormat);
config_ini.beginGroup("Options");
int log_size = config_ini.value("logbuffer", 50).toInt();
log_type = config_ini.value("logger","modcall").toString();
config_ini.endGroup();
if (log_size == 0)
log_size = 500;

View File

@ -27,21 +27,16 @@ void AOClient::cmdDefault(int argc, QStringList argv)
void AOClient::cmdLogin(int argc, QStringList argv)
{
QSettings config("config/config.ini", QSettings::IniFormat);
config.beginGroup("Options");
QString modpass = config.value("modpass", "default").toString();
QString auth_type = config.value("auth", "simple").toString();
if (authenticated) {
sendServerMessage("You are already logged in!");
return;
}
if (auth_type == "simple") {
if (modpass == "") {
if (server->auth_type == "simple") {
if (server->modpass == "") {
sendServerMessage("No modpass is set! Please set a modpass before authenticating.");
}
else if(argv[0] == modpass) {
else if(argv[0] == server->modpass) {
sendPacket("AUTH", {"1"}); // Client: "You were granted the Disable Modcalls button."
sendServerMessage("Logged in as a moderator."); // pre-2.9.1 clients are hardcoded to display the mod UI when this string is sent in OOC
authenticated = true;
@ -52,7 +47,7 @@ void AOClient::cmdLogin(int argc, QStringList argv)
}
server->areas.value(current_area)->logger->logLogin(this, authenticated, "moderator");
}
else if (auth_type == "advanced") {
else if (server->auth_type == "advanced") {
if (argc < 2) {
sendServerMessage("You must specify a username and a password");
return;
@ -194,11 +189,7 @@ void AOClient::cmdKick(int argc, QStringList argv)
void AOClient::cmdChangeAuth(int argc, QStringList argv)
{
QSettings settings("config/config.ini", QSettings::IniFormat);
settings.beginGroup("Options");
QString auth_type = settings.value("auth", "simple").toString();
if (auth_type == "simple") {
if (server->auth_type == "simple") {
change_auth_started = true;
sendServerMessage("WARNING!\nThis command will change how logging in as a moderator works.\nOnly proceed if you know what you are doing\nUse the command /rootpass to set the password for your root account.");
}
@ -214,6 +205,7 @@ void AOClient::cmdSetRootPass(int argc, QStringList argv)
QSettings settings("config/config.ini", QSettings::IniFormat);
settings.beginGroup("Options");
settings.setValue("auth", "advanced");
server->auth_type = "advanced";
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
qsrand(QDateTime::currentMSecsSinceEpoch());
@ -828,14 +820,11 @@ void AOClient::cmdToggleGlobal(int argc, QStringList argv)
void AOClient::cmdMods(int argc, QStringList argv)
{
QStringList entries;
QSettings config("config/config.ini", QSettings::IniFormat);
config.beginGroup("Options");
QString auth_type = config.value("auth", "simple").toString();
int online_count = 0;
for (AOClient* client : server->clients) {
if (client->authenticated) {
entries << "---";
if (auth_type != "simple")
if (server->auth_type != "simple")
entries << "Moderator: " + client->moderator_name;
entries << "OOC name: " + client->ooc_name;
entries << "ID: " + QString::number(client->id);
@ -1325,8 +1314,8 @@ int AOClient::genRand(int min, int max)
void AOClient::diceThrower(int argc, QStringList argv, RollType type)
{
QString sender_name = ooc_name;
int max_value = server->getDiceValue("max_value");
int max_dice = server->getDiceValue("max_dice");
int max_value = server->dice_value;
int max_dice = server->max_dice;
int bounded_value;
int bounded_amount;
QString dice_results;

View File

@ -77,13 +77,10 @@ QString Logger::buildEntry(AOClient *client, QString type, QString message)
void Logger::addEntry(QString entry)
{
QSettings config("config/config.ini", QSettings::IniFormat);
config.beginGroup("Options");
QString log_type = config.value("logging", "modcall").toString();
if (buffer.length() < max_length) {
buffer.enqueue(entry);
if (log_type == "full") {
flush();
if (area->log_type == "full") {
flush();
}
}
else {
@ -99,20 +96,20 @@ void Logger::flush()
dir.mkpath(".");
}
QSettings config("config/config.ini", QSettings::IniFormat);
config.beginGroup("Options");
QString log_type = config.value("logging", "modcall").toString();
QFile logfile;
if (log_type == "modcall") {
if (area->log_type == "modcall") {
logfile.setFileName(QString("logs/report_%1_%2.log").arg((area->name), (QDateTime::currentDateTime().toString("yyyy-MM-dd_hhmmss"))));
}
else if (log_type == "full") {
else if (area->log_type == "full") {
logfile.setFileName(QString("logs/%1.log").arg(QDate::currentDate().toString("yyyy-MM-dd")));
}
if (logfile.open(QIODevice::WriteOnly | QIODevice::Append)) {
QTextStream file_stream(&logfile);
while (!buffer.isEmpty())
file_stream << buffer.dequeue();
else {
qCritical("Invalid logger set!");
}
if (logfile.open(QIODevice::WriteOnly | QIODevice::Append)) {
QTextStream file_stream(&logfile);
while (!buffer.isEmpty())
file_stream << buffer.dequeue();
}
logfile.close();
}

View File

@ -37,10 +37,7 @@ void AOClient::pktHardwareId(AreaData* area, int argc, QStringList argv, AOPacke
void AOClient::pktSoftwareId(AreaData* area, int argc, QStringList argv, AOPacket packet)
{
QSettings config("config/config.ini", QSettings::IniFormat);
config.beginGroup("Options");
QString max_players = config.value("max_players").toString();
config.endGroup();
// Full feature list as of AO 2.8.5
// The only ones that are critical to ensuring the server works are
@ -64,7 +61,7 @@ void AOClient::pktSoftwareId(AreaData* area, int argc, QStringList argv, AOPacke
version.minor = match.captured(3).toInt();
}
sendPacket("PN", {QString::number(server->player_count), max_players});
sendPacket("PN", {QString::number(server->player_count), server->max_players});
sendPacket("FL", feature_list);
}
@ -181,7 +178,7 @@ void AOClient::pktOocChat(AreaData* area, int argc, QStringList argv, AOPacket p
}
ooc_name = dezalgo(argv[0]).replace(QRegExp("\\[|\\]|\\{|\\}|\\#|\\$|\\%|\\&"), ""); // no fucky wucky shit here
if (ooc_name.isEmpty() || ooc_name == server->getServerName()) // impersonation & empty name protection
if (ooc_name.isEmpty() || ooc_name == server->server_name) // impersonation & empty name protection
return;
QString message = dezalgo(argv[1]);
@ -629,14 +626,7 @@ AOPacket AOClient::validateIcPacket(AOPacket packet)
QString AOClient::dezalgo(QString p_text)
{
QSettings config("config/config.ini", QSettings::IniFormat);
config.beginGroup("Options");
bool zalgo_tolerance_conversion_success;
int zalgo_tolerance = config.value("zalgo_tolerance", "3").toInt(&zalgo_tolerance_conversion_success);
if (!zalgo_tolerance_conversion_success)
zalgo_tolerance = 3;
QRegExp rxp("([\u0300-\u036f\u1ab0-\u1aff\u1dc0-\u1dff\u20d0-\u20ff\ufe20-\ufe2f\u115f\u1160\u3164]{" + QRegExp::escape(QString::number(zalgo_tolerance)) + ",})");
QRegExp rxp("([\u0300-\u036f\u1ab0-\u1aff\u1dc0-\u1dff\u20d0-\u20ff\ufe20-\ufe2f\u115f\u1160\u3164]{" + QRegExp::escape(QString::number(server->zalgo_tolerance)) + ",})");
QString filtered = p_text.replace(rxp, "");
return filtered;
}

View File

@ -51,7 +51,8 @@ void Server::start()
qDebug() << "Server listening on" << port;
}
MOTD = config.value("motd","MOTD is not set.").toString();
loadServerConfig();
loadCommandConfig();
proxy = new WSProxy(port, ws_port, this);
if(ws_port != -1)
@ -96,7 +97,6 @@ void Server::start()
QString area_name = raw_area_names[i];
areas.insert(i, new AreaData(area_name, i));
}
loadCommandConfig();
}
void Server::clientConnected()
@ -169,24 +169,6 @@ void Server::broadcast(AOPacket packet)
}
}
QString Server::getServerName()
{
QSettings settings("config/config.ini", QSettings::IniFormat);
settings.beginGroup("Options");
QString server_name = settings.value("server_name", "Akashi").toString();
return server_name;
}
int Server::getDiceValue(QString value_type)
{
QSettings settings("config/config.ini", QSettings::IniFormat);
settings.beginGroup("Dice");
int value = settings.value(value_type, "100").toUInt();
settings.endGroup();
return value;
}
QList<AOClient*> Server::getClientsByIpid(QString ipid)
{
QList<AOClient*> return_clients;
@ -235,6 +217,29 @@ QStringList Server::loadConfigFile(QString filename)
return stringlist;
}
void Server::loadServerConfig()
{
QSettings config("config/config.ini", QSettings::IniFormat);
config.beginGroup("Options");
//Load config.ini values
max_players = config.value("max_players","100").toString();
server_name = config.value("server_name","An Unnamed Server").toString();
MOTD = config.value("motd","MOTD is not set.").toString();
auth_type = config.value("auth","simple").toString();
modpass = config.value("modpass","").toString();
bool zalgo_tolerance_conversion_success;
zalgo_tolerance = config.value("zalgo_tolerance", "3").toInt(&zalgo_tolerance_conversion_success);
if (!zalgo_tolerance_conversion_success)
zalgo_tolerance = 3;
config.endGroup();
//Load dice values
config.beginGroup("Dice");
dice_value = config.value("value_type", "100").toUInt();
max_dice = config.value("max_dice","100").toInt();
config.endGroup();
}
Server::~Server()
{
for (AOClient* client : clients) {