mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-11 21:01:29 +00:00
* [Commands] Add #bugs Command. - Adds a #bugs command for viewing bug reports. - Remove unused bug related rules in favor of hard-coding the new system. * Cleanup. * Typo. * Push. * Lower status so it fits with message.
344 lines
7.0 KiB
C++
Executable File
344 lines
7.0 KiB
C++
Executable File
#include "../client.h"
|
|
#include "../../common/repositories/bug_reports_repository.h"
|
|
|
|
void command_bugs(Client *c, const Seperator *sep)
|
|
{
|
|
auto arguments = sep->argnum;
|
|
if (!arguments) {
|
|
c->Message(Chat::White, "Usage: #bugs close [Bug ID] - Close a Bug Report by ID");
|
|
c->Message(Chat::White, "Usage: #bugs delete [Bug ID] - Delete a Bug Report by ID");
|
|
c->Message(Chat::White, "Usage: #bugs review [Bug ID] [Review] - Review a Bug Report by ID");
|
|
c->Message(Chat::White, "Usage: #bugs search [Search Criteria] - Search for Bug Reports");
|
|
c->Message(Chat::White, "Usage: #bugs view [Bug ID] - View a Bug Report by ID");
|
|
return;
|
|
}
|
|
|
|
bool is_close = !strcasecmp(sep->arg[1], "close");
|
|
bool is_delete = !strcasecmp(sep->arg[1], "delete");
|
|
bool is_review = !strcasecmp(sep->arg[1], "review");
|
|
bool is_search = !strcasecmp(sep->arg[1], "search");
|
|
bool is_view = !strcasecmp(sep->arg[1], "view");
|
|
if (
|
|
!is_close &&
|
|
!is_delete &&
|
|
!is_review &&
|
|
!is_search &&
|
|
!is_view
|
|
) {
|
|
c->Message(Chat::White, "Usage: #bugs close [Bug ID] - Close a Bug Report by ID");
|
|
c->Message(Chat::White, "Usage: #bugs delete [Bug ID] - Delete a Bug Report by ID");
|
|
c->Message(Chat::White, "Usage: #bugs review [Bug ID] [Review] - Review a Bug Report by ID");
|
|
c->Message(Chat::White, "Usage: #bugs search [Search Criteria] - Search for Bug Reports");
|
|
c->Message(Chat::White, "Usage: #bugs view [Bug ID] - View a Bug Report by ID");
|
|
return;
|
|
}
|
|
|
|
if (is_close) {
|
|
if (!sep->IsNumber(2)) {
|
|
c->Message(Chat::White, "Usage: #bugs close [Bug ID] - Close a Bug Report by ID");
|
|
return;
|
|
}
|
|
|
|
auto bug_id = std::stoul(sep->arg[2]);
|
|
|
|
auto r = BugReportsRepository::FindOne(content_db, bug_id);
|
|
if (!r.id) {
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Bug ID {} does not exist or is invalid.",
|
|
bug_id
|
|
).c_str()
|
|
);
|
|
return;
|
|
}
|
|
|
|
r.bug_status = 1;
|
|
|
|
if (!BugReportsRepository::UpdateOne(content_db, r)) {
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Failed to close Bug ID {}.",
|
|
bug_id
|
|
).c_str()
|
|
);
|
|
return;
|
|
}
|
|
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Successfully closed Bug ID {}.",
|
|
bug_id
|
|
).c_str()
|
|
);
|
|
|
|
} else if (is_delete) {
|
|
if (!sep->IsNumber(2)) {
|
|
c->Message(Chat::White, "Usage: #bugs delete [Bug ID] - Delete a Bug Report by ID");
|
|
return;
|
|
}
|
|
|
|
auto bug_id = std::stoul(sep->arg[2]);
|
|
auto deleted_count = BugReportsRepository::DeleteOne(content_db, bug_id);
|
|
if (!deleted_count) {
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Bug ID {} does not exist or is invalid.",
|
|
bug_id
|
|
).c_str()
|
|
);
|
|
return;
|
|
}
|
|
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Bug ID {} successfully deleted.",
|
|
bug_id
|
|
).c_str()
|
|
);
|
|
} else if (is_review) {
|
|
if (
|
|
arguments < 3 ||
|
|
!sep->IsNumber(2)
|
|
) {
|
|
c->Message(Chat::White, "Usage: #bugs review [Bug ID] [Review] - Review a Bug Report by ID");
|
|
return;
|
|
}
|
|
|
|
auto bug_id = std::stoul(sep->arg[2]);
|
|
auto bug_review = sep->argplus[3];
|
|
|
|
auto r = BugReportsRepository::FindOne(content_db, bug_id);
|
|
if (!r.id) {
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Bug ID {} does not exist or is invalid.",
|
|
bug_id
|
|
).c_str()
|
|
);
|
|
return;
|
|
}
|
|
|
|
r.last_review = std::time(nullptr);
|
|
r.last_reviewer = c->GetCleanName();
|
|
r.reviewer_notes = bug_review;
|
|
|
|
if (!BugReportsRepository::UpdateOne(content_db, r)) {
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Failed to add a review on Bug ID {}.",
|
|
bug_id
|
|
).c_str()
|
|
);
|
|
return;
|
|
}
|
|
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Successfully added a review on Bug ID {}.",
|
|
bug_id
|
|
).c_str()
|
|
);
|
|
} else if (is_search) {
|
|
if (arguments < 2) {
|
|
c->Message(Chat::White, "Usage: #bugs search [Search Criteria] - Search for Bug Reports");
|
|
return;
|
|
}
|
|
|
|
auto search_criteria = sep->argplus[2];
|
|
auto l = BugReportsRepository::GetWhere(
|
|
content_db,
|
|
fmt::format(
|
|
"bug_status = 0 AND (character_name LIKE '%%{}%%' OR bug_report LIKE '%%{}%%')",
|
|
Strings::Escape(search_criteria),
|
|
Strings::Escape(search_criteria)
|
|
)
|
|
);
|
|
if (l.empty()) {
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"No Bug Reports were found matching '{}'.",
|
|
search_criteria
|
|
).c_str()
|
|
);
|
|
return;
|
|
}
|
|
|
|
for (const auto& r : l) {
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Bug ID {} | Character: {} Report: {} | {} | {}",
|
|
r.id,
|
|
r.character_name,
|
|
r.bug_report,
|
|
Saylink::Silent(
|
|
fmt::format(
|
|
"#bugs view {}",
|
|
r.id
|
|
),
|
|
"View"
|
|
),
|
|
Saylink::Silent(
|
|
fmt::format(
|
|
"#bugs close {}",
|
|
r.id
|
|
),
|
|
"Close"
|
|
)
|
|
).c_str()
|
|
);
|
|
}
|
|
} else if (is_view) {
|
|
if (!sep->IsNumber(2)) {
|
|
c->Message(Chat::White, "Usage: #bugs view [Bug ID] - View a Bug Report by ID");
|
|
return;
|
|
}
|
|
|
|
auto bug_id = std::stoul(sep->arg[2]);
|
|
|
|
auto r = BugReportsRepository::FindOne(content_db, bug_id);
|
|
if (!r.id) {
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Bug ID {} does not exist or is invalid.",
|
|
bug_id
|
|
).c_str()
|
|
);
|
|
return;
|
|
}
|
|
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Bug ID {} | Character: {} ({}) Category: {} ({})",
|
|
r.id,
|
|
r.character_name,
|
|
r.character_id,
|
|
r.category_name,
|
|
r.category_id
|
|
).c_str()
|
|
);
|
|
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Bug ID {} | Zone: {} ({})",
|
|
r.id,
|
|
ZoneLongName(ZoneID(r.zone)),
|
|
r.zone
|
|
).c_str()
|
|
);
|
|
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Bug ID {} | Position: {:.2f}, {:.2f}, {:.2f}, {}",
|
|
r.id,
|
|
r.pos_x,
|
|
r.pos_y,
|
|
r.pos_z,
|
|
r.heading
|
|
).c_str()
|
|
);
|
|
|
|
if (r._target_info) {
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Bug ID {} | Target: {} ({})",
|
|
r.id,
|
|
r.target_name,
|
|
r.target_id
|
|
).c_str()
|
|
);
|
|
}
|
|
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Bug ID {} | Can Duplicate: {} Crash Bug: {}",
|
|
r.id,
|
|
r._can_duplicate ? "Yes" : "No",
|
|
r._crash_bug ? "Yes" : "No"
|
|
).c_str()
|
|
);
|
|
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Bug ID {} | Character Flags: {} Unknown Value: {}",
|
|
r.id,
|
|
r._character_flags ? "Yes" : "No",
|
|
r._unknown_value ? "Yes" : "No"
|
|
).c_str()
|
|
);
|
|
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Bug ID {} | Report: {} Reported: {}",
|
|
r.id,
|
|
r.bug_report,
|
|
r.report_datetime
|
|
).c_str()
|
|
);
|
|
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Bug ID {} | Client: {} ({}) UI Path: {}",
|
|
r.id,
|
|
r.client_version_name,
|
|
r.client_version_id,
|
|
r.ui_path
|
|
).c_str()
|
|
);
|
|
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Bug ID {} | System Info: {}",
|
|
r.id,
|
|
r.system_info
|
|
).c_str()
|
|
);
|
|
|
|
if (r.last_reviewer != "None") {
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Bug ID {} | Last Reviewer: {} Last Reviewed: {} Reviewer Notes: {}",
|
|
r.id,
|
|
r.last_reviewer,
|
|
r.last_review,
|
|
r.reviewer_notes
|
|
).c_str()
|
|
);
|
|
}
|
|
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Would you like to {} this bug?",
|
|
Saylink::Silent(
|
|
fmt::format(
|
|
"#bugs close {}",
|
|
r.id
|
|
),
|
|
"close"
|
|
)
|
|
).c_str()
|
|
);
|
|
}
|
|
}
|