Alex King f25e37d0c5
[Commands] Consolidate #set-like commands into a singular #set command (#3486)
* First push

* Final push.

* Consolidate zone commands in to one.

* Update command.cpp

* Remove debug messages.

* Test

* Add support for sub command status levels.

* Update command.cpp

* Update client.cpp

* Update database_update_manifest.cpp

* Update version.h

* Update item.cpp

* Update version.h

* Update database_update_manifest.cpp

* Fix command arguments.

* Help message.

* Update command.cpp

* Do DB injection/deletion

* Indent

* Update server_locked.cpp

* Update set.cpp

* Lock aliases

* Update command_subsettings_repository.h

* Update set.cpp

* Fix

---------

Co-authored-by: Akkadius <akkadius1@gmail.com>
2023-07-15 00:37:51 -05:00

133 lines
2.7 KiB
C++

#include "../../client.h"
#include "../../common/content/world_content_service.h"
void FindZone(Client *c, const Seperator *sep)
{
std::string query = "SELECT zoneidnumber, short_name, long_name, version FROM zone WHERE ";
const auto is_expansion_search = !strcasecmp(sep->arg[2], "expansion");
const auto is_id_search = Strings::IsNumber(sep->arg[2]);
const auto is_short_name_search = !is_expansion_search && !is_id_search;
std::string search_string;
std::string search_type;
if (is_expansion_search) {
query += fmt::format(
"expansion = {}",
Strings::ToInt(sep->arg[3])
);
search_string = Expansion::ExpansionName[Strings::ToInt(sep->arg[3])];
search_type = "expansion";
} else if (is_id_search) {
query += fmt::format(
"zoneidnumber = {}",
Strings::ToUnsignedInt(sep->arg[2])
);
search_string = sep->arg[2];
search_type = "ID";
} else if (is_short_name_search) {
query += fmt::format(
"LOWER(`long_name`) LIKE '%%{}%%' OR LOWER(`short_name`) LIKE '%%{}%%'",
Strings::Escape(Strings::ToLower(sep->argplus[2])),
Strings::Escape(Strings::ToLower(sep->argplus[2]))
);
search_string = sep->argplus[2];
search_type = "name";
}
query += " ORDER BY `zoneidnumber` ASC LIMIT 50";
auto results = content_db.QueryDatabase(query);
if (!results.Success() || !results.RowCount()) {
c->Message(Chat::White, "No zones were found matching your search criteria.");
c->Message(Chat::White, query.c_str());
return;
}
auto found_count = 0;
for (auto row : results) {
const auto zone_id = Strings::ToUnsignedInt(row[0]);
const std::string& short_name = row[1];
const std::string& long_name = row[2];
const auto version = Strings::ToInt(row[3]);
c->Message(
Chat::White,
fmt::format(
"{}{} {} ({}) (ID {}){}",
(
version == 0 ?
fmt::format(
"{} | ",
Saylink::Silent(
fmt::format(
"#zone {}",
short_name
),
"Zone"
)
) :
""
),
fmt::format(
"{} |",
Saylink::Silent(
fmt::format(
"#gmzone {} {}",
short_name,
version
),
"GM Zone"
)
),
long_name,
short_name,
zone_id,
(
version != 0 ?
fmt::format(
" (Version {})",
version
) :
""
)
).c_str()
);
found_count++;
if (found_count == 50) {
break;
}
}
if (found_count == 50) {
c->Message(
Chat::White,
fmt::format(
"50 Zones found matching '{}' of '{}'.",
search_type,
search_string
).c_str()
);
return;
}
c->Message(
Chat::White,
fmt::format(
"{} Zone{} found matching '{}' of '{}'.",
found_count,
found_count != 1 ? "s" : "",
search_type,
search_string
).c_str()
);
}