diff --git a/cockatrice/cockatrice.qrc b/cockatrice/cockatrice.qrc index 4ec3d2385..14cf15b2f 100644 --- a/cockatrice/cockatrice.qrc +++ b/cockatrice/cockatrice.qrc @@ -62,9 +62,9 @@ resources/icons/mana/U.svg resources/icons/mana/W.svg - resources/backgrounds/home.jpg - resources/backgrounds/home-dark.jpg - resources/backgrounds/home-light.jpg + resources/backgrounds/home.png + resources/backgrounds/home-dark.png + resources/backgrounds/home-light.png resources/backgrounds/card_triplet.svg resources/backgrounds/placeholder_printing_selector.svg diff --git a/cockatrice/resources/backgrounds/home-dark.jpg b/cockatrice/resources/backgrounds/home-dark.jpg deleted file mode 100644 index 53d3406dd..000000000 Binary files a/cockatrice/resources/backgrounds/home-dark.jpg and /dev/null differ diff --git a/cockatrice/resources/backgrounds/home-dark.png b/cockatrice/resources/backgrounds/home-dark.png new file mode 100644 index 000000000..68f48e2c2 Binary files /dev/null and b/cockatrice/resources/backgrounds/home-dark.png differ diff --git a/cockatrice/resources/backgrounds/home-light.jpg b/cockatrice/resources/backgrounds/home-light.jpg deleted file mode 100644 index 112146e4f..000000000 Binary files a/cockatrice/resources/backgrounds/home-light.jpg and /dev/null differ diff --git a/cockatrice/resources/backgrounds/home-light.png b/cockatrice/resources/backgrounds/home-light.png new file mode 100644 index 000000000..eaaaba932 Binary files /dev/null and b/cockatrice/resources/backgrounds/home-light.png differ diff --git a/cockatrice/resources/backgrounds/home.jpg b/cockatrice/resources/backgrounds/home.jpg deleted file mode 100644 index 112146e4f..000000000 Binary files a/cockatrice/resources/backgrounds/home.jpg and /dev/null differ diff --git a/cockatrice/resources/backgrounds/home.png b/cockatrice/resources/backgrounds/home.png new file mode 100644 index 000000000..eaaaba932 Binary files /dev/null and b/cockatrice/resources/backgrounds/home.png differ diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_report_user.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_report_user.cpp index 7b855af96..9519846e2 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_report_user.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_report_user.cpp @@ -15,7 +15,6 @@ #include #include #include -#include DlgReportUser::DlgReportUser(AbstractClient *_client, const QString &_reportedUser, @@ -57,14 +56,22 @@ DlgReportUser::DlgReportUser(AbstractClient *_client, auto *categoryGrid = new QGridLayout(categoryGroup); categoryBox = new QComboBox; - for (const QString &key : ReportCategories::keys()) { - const QString label = categoryLabel(key); - if (label.isEmpty()) { - continue; // skip keys without a dialog label - } - categoryBox->addItem(label, key); - categoryBox->setItemData(categoryBox->count() - 1, categoryToolTip(key), Qt::ToolTipRole); - } + categoryBox->addItem(tr("Cheating / Unsporting behavior"), "cheating"); + categoryBox->setItemData(categoryBox->count() - 1, + tr("Using external tools, card marked manipulation, or exploiting game bugs"), + Qt::ToolTipRole); + categoryBox->addItem(tr("Harassment / Abuse"), "harassment"); + categoryBox->setItemData(categoryBox->count() - 1, tr("Threatening, bullying, or persistent unwanted contact"), + Qt::ToolTipRole); + categoryBox->addItem(tr("Hate speech"), "hate_speech"); + categoryBox->setItemData(categoryBox->count() - 1, + tr("Discriminatory language targeting race, gender, religion, etc."), Qt::ToolTipRole); + categoryBox->addItem(tr("Spam"), "spam"); + categoryBox->setItemData(categoryBox->count() - 1, tr("Repeated unwanted messages or advertisements"), + Qt::ToolTipRole); + categoryBox->addItem(tr("Other"), "other"); + categoryBox->setItemData(categoryBox->count() - 1, tr("Any behavior not covered by the above categories"), + Qt::ToolTipRole); categoryGrid->addWidget(new QLabel(tr("Category:")), 0, 0); categoryGrid->addWidget(categoryBox, 0, 1); @@ -182,55 +189,3 @@ void DlgReportUser::reportResponse(const Response &response) QMessageBox::warning(this, tr("Submission Failed"), tr("Failed to submit report. Please try again.")); } } - -QString DlgReportUser::categoryLabel(const QString &key) -{ - if (key == QLatin1String("cheating")) { - return tr("Cheating / Unsporting behavior"); - } - if (key == QLatin1String("bug_abuse")) { - return tr("Bug Abuse"); - } - if (key == QLatin1String("harassment")) { - return tr("Harassment / Abuse"); - } - if (key == QLatin1String("verbal_abuse")) { - return tr("Verbal Abuse"); - } - if (key == QLatin1String("hate_speech")) { - return tr("Hate speech"); - } - if (key == QLatin1String("spam")) { - return tr("Spam"); - } - if (key == QLatin1String("other")) { - return tr("Other"); - } - return QString(); -} - -QString DlgReportUser::categoryToolTip(const QString &key) -{ - if (key == QLatin1String("cheating")) { - return tr("Using external tools, cheat programs, or exploiting game bugs"); - } - if (key == QLatin1String("bug_abuse")) { - return tr("Exploiting a bug or glitch to gain an unfair advantage"); - } - if (key == QLatin1String("harassment")) { - return tr("Threatening, bullying, or persistent unwanted contact"); - } - if (key == QLatin1String("verbal_abuse")) { - return tr("Abusive or offensive language directed at another player"); - } - if (key == QLatin1String("hate_speech")) { - return tr("Discriminatory language targeting race, gender, religion, etc."); - } - if (key == QLatin1String("spam")) { - return tr("Repeated unwanted messages or advertisements"); - } - if (key == QLatin1String("other")) { - return tr("Any behavior not covered by the above categories"); - } - return QString(); -} diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_report_user.h b/cockatrice/src/interface/widgets/dialogs/dlg_report_user.h index f8d5938ce..c59fc5084 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_report_user.h +++ b/cockatrice/src/interface/widgets/dialogs/dlg_report_user.h @@ -26,9 +26,6 @@ private slots: void reportResponse(const Response &response); private: - static QString categoryLabel(const QString &key); - static QString categoryToolTip(const QString &key); - AbstractClient *client; QString reportedUser; int gameId; diff --git a/cockatrice/src/interface/widgets/server/user/user_list_widget.cpp b/cockatrice/src/interface/widgets/server/user/user_list_widget.cpp index d9e1e1e7e..1bb7c5288 100644 --- a/cockatrice/src/interface/widgets/server/user/user_list_widget.cpp +++ b/cockatrice/src/interface/widgets/server/user/user_list_widget.cpp @@ -218,10 +218,9 @@ void UserListTWI::setOnline(bool online) * 2) Admins, judge/vip/donator status ignored * 3) Moderators, judge/vip/donator status ignored * 4) Judges - * 5) Developers - * 6) VIPs - * 7) Donators - * 8) Everyone else + * 5) VIPs + * 6) Donators + * 7) Everyone else * @param other RHS to compare to * @return Left is less than the Right */ @@ -235,10 +234,11 @@ bool UserListTWI::operator<(const QTreeWidgetItem &other) const const auto &lhsUserLevelFlags = UserLevelFlags(data(0, Qt::UserRole).toInt()); const auto &rhsUserLevelFlags = UserLevelFlags(other.data(0, Qt::UserRole).toInt()); - // Admins & Moderators need no additional comparison checks, just to see if they're an admin + // Admins, Developers & Mods need no additional comparison checks, just to see if they're an admin, a developer // or a moderator static const QList userLevelWithNoOtherPrefOrder = { - ServerInfo_User_UserLevelFlag_IsAdmin, ServerInfo_User_UserLevelFlag_IsModerator}; + ServerInfo_User_UserLevelFlag_IsAdmin, ServerInfo_User_UserLevelFlag_IsDeveloper, + ServerInfo_User_UserLevelFlag_IsModerator}; for (const auto &userLevelEntry : userLevelWithNoOtherPrefOrder) { if (lhsUserLevelFlags.testFlag(userLevelEntry) && lhsUserLevelFlags.testFlag(userLevelEntry) == rhsUserLevelFlags.testFlag(userLevelEntry)) { @@ -249,10 +249,10 @@ bool UserListTWI::operator<(const QTreeWidgetItem &other) const } } - // Judges and developers can be sorted by their additional ranks - static const QList userLevelOrder = { - ServerInfo_User_UserLevelFlag_IsJudge, ServerInfo_User_UserLevelFlag_IsDeveloper, - ServerInfo_User_UserLevelFlag_IsRegistered, ServerInfo_User_UserLevelFlag_IsUser}; + // Judges can be sorted by their additional ranks + static const QList userLevelOrder = {ServerInfo_User_UserLevelFlag_IsJudge, + ServerInfo_User_UserLevelFlag_IsRegistered, + ServerInfo_User_UserLevelFlag_IsUser}; for (const auto &userLevelEntry : userLevelOrder) { if (lhsUserLevelFlags.testFlag(userLevelEntry) != rhsUserLevelFlags.testFlag(userLevelEntry)) { return lhsUserLevelFlags.testFlag(userLevelEntry) > rhsUserLevelFlags.testFlag(userLevelEntry); diff --git a/cockatrice/themes/Fabric/backgrounds/home-dark.jpg b/cockatrice/themes/Fabric/backgrounds/home-dark.jpg deleted file mode 100644 index f69e5923e..000000000 Binary files a/cockatrice/themes/Fabric/backgrounds/home-dark.jpg and /dev/null differ diff --git a/cockatrice/themes/Fabric/backgrounds/home-dark.png b/cockatrice/themes/Fabric/backgrounds/home-dark.png new file mode 100644 index 000000000..8d9514626 Binary files /dev/null and b/cockatrice/themes/Fabric/backgrounds/home-dark.png differ diff --git a/cockatrice/themes/Fabric/backgrounds/home-light.jpg b/cockatrice/themes/Fabric/backgrounds/home-light.jpg deleted file mode 100644 index 800e369e7..000000000 Binary files a/cockatrice/themes/Fabric/backgrounds/home-light.jpg and /dev/null differ diff --git a/cockatrice/themes/Fabric/backgrounds/home-light.png b/cockatrice/themes/Fabric/backgrounds/home-light.png new file mode 100644 index 000000000..78f51a686 Binary files /dev/null and b/cockatrice/themes/Fabric/backgrounds/home-light.png differ diff --git a/cockatrice/themes/Leather/backgrounds/home-dark.jpg b/cockatrice/themes/Leather/backgrounds/home-dark.jpg deleted file mode 100644 index 8c2c3d1df..000000000 Binary files a/cockatrice/themes/Leather/backgrounds/home-dark.jpg and /dev/null differ diff --git a/cockatrice/themes/Leather/backgrounds/home-dark.png b/cockatrice/themes/Leather/backgrounds/home-dark.png new file mode 100644 index 000000000..20d16a27f Binary files /dev/null and b/cockatrice/themes/Leather/backgrounds/home-dark.png differ diff --git a/cockatrice/themes/Leather/backgrounds/home-light.jpg b/cockatrice/themes/Leather/backgrounds/home-light.jpg deleted file mode 100644 index 3fb49538a..000000000 Binary files a/cockatrice/themes/Leather/backgrounds/home-light.jpg and /dev/null differ diff --git a/cockatrice/themes/Leather/backgrounds/home-light.png b/cockatrice/themes/Leather/backgrounds/home-light.png new file mode 100644 index 000000000..ee1da361d Binary files /dev/null and b/cockatrice/themes/Leather/backgrounds/home-light.png differ diff --git a/cockatrice/themes/Plasma/backgrounds/home-dark.jpg b/cockatrice/themes/Plasma/backgrounds/home-dark.jpg deleted file mode 100644 index 230d78e8e..000000000 Binary files a/cockatrice/themes/Plasma/backgrounds/home-dark.jpg and /dev/null differ diff --git a/cockatrice/themes/Plasma/backgrounds/home-dark.png b/cockatrice/themes/Plasma/backgrounds/home-dark.png new file mode 100644 index 000000000..ce1469e2b Binary files /dev/null and b/cockatrice/themes/Plasma/backgrounds/home-dark.png differ diff --git a/cockatrice/themes/Plasma/backgrounds/home-light.jpg b/cockatrice/themes/Plasma/backgrounds/home-light.jpg deleted file mode 100644 index 2552325eb..000000000 Binary files a/cockatrice/themes/Plasma/backgrounds/home-light.jpg and /dev/null differ diff --git a/cockatrice/themes/Plasma/backgrounds/home-light.png b/cockatrice/themes/Plasma/backgrounds/home-light.png new file mode 100644 index 000000000..2e9000bd6 Binary files /dev/null and b/cockatrice/themes/Plasma/backgrounds/home-light.png differ diff --git a/cockatrice/themes/VelvetMarble/backgrounds/home-dark.jpg b/cockatrice/themes/VelvetMarble/backgrounds/home-dark.jpg deleted file mode 100644 index b55f2524e..000000000 Binary files a/cockatrice/themes/VelvetMarble/backgrounds/home-dark.jpg and /dev/null differ diff --git a/cockatrice/themes/VelvetMarble/backgrounds/home-dark.png b/cockatrice/themes/VelvetMarble/backgrounds/home-dark.png new file mode 100644 index 000000000..34738090f Binary files /dev/null and b/cockatrice/themes/VelvetMarble/backgrounds/home-dark.png differ diff --git a/cockatrice/themes/VelvetMarble/backgrounds/home-light.jpg b/cockatrice/themes/VelvetMarble/backgrounds/home-light.jpg deleted file mode 100644 index 12a2fd2cc..000000000 Binary files a/cockatrice/themes/VelvetMarble/backgrounds/home-light.jpg and /dev/null differ diff --git a/cockatrice/themes/VelvetMarble/backgrounds/home-light.png b/cockatrice/themes/VelvetMarble/backgrounds/home-light.png new file mode 100644 index 000000000..de783e086 Binary files /dev/null and b/cockatrice/themes/VelvetMarble/backgrounds/home-light.png differ diff --git a/libcockatrice_network/libcockatrice/network/client/remote/remote_client.cpp b/libcockatrice_network/libcockatrice/network/client/remote/remote_client.cpp index de2cc720f..53608db65 100644 --- a/libcockatrice_network/libcockatrice/network/client/remote/remote_client.cpp +++ b/libcockatrice_network/libcockatrice/network/client/remote/remote_client.cpp @@ -559,15 +559,6 @@ void RemoteClient::ping() PendingCommand *pend = i.next().value(); if (pend->tick() > maxTimeout) { i.remove(); - // Answer the command instead of dropping it silently: the connection may still - // be alive (other traffic keeps lastDataReceived fresh) while this single - // command stalled, and awaiters such as TabServer's room-join dedup can only - // release their in-flight markers when `finished` fires. A silent drop wedges - // them permanently - e.g. a room whose join timing never surfaces again. - Response response; - response.set_response_code(Response::RespNotConnected); - response.set_cmd_id(pend->getCommandContainer().cmd_id()); - pend->processResponse(response); pend->deleteLater(); } } diff --git a/libcockatrice_utility/CMakeLists.txt b/libcockatrice_utility/CMakeLists.txt index ab647258c..db23f7951 100644 --- a/libcockatrice_utility/CMakeLists.txt +++ b/libcockatrice_utility/CMakeLists.txt @@ -6,12 +6,8 @@ set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) set(UTILITY_SOURCES - libcockatrice/utility/cryptoutil.cpp - libcockatrice/utility/expression.cpp - libcockatrice/utility/levenshtein.cpp - libcockatrice/utility/passwordhasher.cpp - libcockatrice/utility/report_categories.cpp - libcockatrice/utility/server_rate_limiter.cpp + libcockatrice/utility/cryptoutil.cpp libcockatrice/utility/expression.cpp libcockatrice/utility/levenshtein.cpp + libcockatrice/utility/passwordhasher.cpp libcockatrice/utility/server_rate_limiter.cpp libcockatrice/utility/warning_categories.cpp ) @@ -24,7 +20,6 @@ set(UTILITY_HEADERS libcockatrice/utility/macros.h libcockatrice/utility/passwordhasher.h libcockatrice/utility/playmat_params.h - libcockatrice/utility/report_categories.h libcockatrice/utility/string_limits.h libcockatrice/utility/dice_limits.h libcockatrice/utility/counter_limits.h diff --git a/libcockatrice_utility/libcockatrice/utility/report_categories.cpp b/libcockatrice_utility/libcockatrice/utility/report_categories.cpp deleted file mode 100644 index 8551c1ca1..000000000 --- a/libcockatrice_utility/libcockatrice/utility/report_categories.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "report_categories.h" - -namespace ReportCategories -{ -const QStringList &keys() -{ - static const QStringList categories = {"cheating", "bug_abuse", "harassment", "verbal_abuse", - "hate_speech", "spam", "other"}; - return categories; -} - -bool isValid(const QString &key) -{ - return keys().contains(key, Qt::CaseInsensitive); -} -} // namespace ReportCategories \ No newline at end of file diff --git a/libcockatrice_utility/libcockatrice/utility/report_categories.h b/libcockatrice_utility/libcockatrice/utility/report_categories.h deleted file mode 100644 index 5758c3dcf..000000000 --- a/libcockatrice_utility/libcockatrice/utility/report_categories.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef REPORT_CATEGORIES_H -#define REPORT_CATEGORIES_H - -#include -#include - -/** - * Canonical report categories, shared by the client and the server. - * - * This is the single source of truth for the category keys exchanged over the - * wire (Command_Report.category) and stored in the reports table. The server - * only accepts keys from this list and the client report dialog only offers - * keys from this list, so the two sides cannot drift apart again. - */ -namespace ReportCategories -{ -/** @brief The complete list of valid category keys, in canonical order. */ -const QStringList &keys(); - -/** @brief Whether @a key is a valid report category (case-insensitive). */ -bool isValid(const QString &key); -} // namespace ReportCategories - -#endif // REPORT_CATEGORIES_H \ No newline at end of file diff --git a/servatrice/src/serversocketinterface.cpp b/servatrice/src/serversocketinterface.cpp index 9c78c48f3..c82a8dd73 100644 --- a/servatrice/src/serversocketinterface.cpp +++ b/servatrice/src/serversocketinterface.cpp @@ -128,7 +128,6 @@ #include #include #include -#include #include #include #include @@ -3776,7 +3775,8 @@ Response::ResponseCode AbstractServerSocketInterface::cmdReport(const Command_Re return Response::RespInvalidData; } - if (!ReportCategories::isValid(category)) { + static const QStringList validCategories = {"cheating", "bug_abuse", "verbal_abuse", "other"}; + if (!validCategories.contains(category.toLower())) { return Response::RespInvalidData; } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index d80995d26..d23d9ba04 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -14,7 +14,6 @@ add_test(NAME server_rate_limiter_test COMMAND server_rate_limiter_test) add_test(NAME server_developer_role_test COMMAND server_developer_role_test) add_test(NAME server_game_join_test COMMAND server_game_join_test) add_test(NAME warning_categories_test COMMAND warning_categories_test) -add_test(NAME report_categories_test COMMAND report_categories_test) add_test(NAME lag_monitor_test COMMAND lag_monitor_test) add_test(NAME latency_tracker_test COMMAND latency_tracker_test) add_test(NAME metrics_registry_test COMMAND metrics_registry_test) @@ -38,7 +37,6 @@ add_executable(server_rate_limiter_test server_rate_limiter_test.cpp) add_executable(server_developer_role_test server_developer_role_test.cpp) add_executable(server_game_join_test server_game_join_test.cpp) add_executable(warning_categories_test warning_categories_test.cpp) -add_executable(report_categories_test report_categories_test.cpp) add_executable(lag_monitor_test ${CMAKE_SOURCE_DIR}/cockatrice/src/client/lag_monitor.cpp lag_monitor_test.cpp) target_include_directories(lag_monitor_test PRIVATE ${CMAKE_SOURCE_DIR}/cockatrice/src) add_executable(latency_tracker_test latency_tracker_test.cpp) @@ -93,7 +91,6 @@ if(NOT GTEST_FOUND) add_dependencies(server_developer_role_test gtest) add_dependencies(server_game_join_test gtest) add_dependencies(warning_categories_test gtest) - add_dependencies(report_categories_test gtest) add_dependencies(lag_monitor_test gtest) add_dependencies(latency_tracker_test gtest) add_dependencies(metrics_registry_test gtest) @@ -140,9 +137,6 @@ target_link_libraries( target_link_libraries( warning_categories_test libcockatrice_utility Threads::Threads ${GTEST_BOTH_LIBRARIES} ${TEST_QT_MODULES} ) -target_link_libraries( - report_categories_test libcockatrice_utility Threads::Threads ${GTEST_BOTH_LIBRARIES} ${TEST_QT_MODULES} -) target_link_libraries(lag_monitor_test Threads::Threads ${GTEST_BOTH_LIBRARIES} ${TEST_QT_MODULES}) target_link_libraries( latency_tracker_test libcockatrice_network Threads::Threads ${GTEST_BOTH_LIBRARIES} ${TEST_QT_MODULES} diff --git a/tests/report_categories_test.cpp b/tests/report_categories_test.cpp deleted file mode 100644 index 790b2cff6..000000000 --- a/tests/report_categories_test.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#include "gtest/gtest.h" -#include -#include -#include -#include - -TEST(ReportCategoriesTest, CanonicalListIsNonEmptyAndStable) -{ - const QStringList categories = ReportCategories::keys(); - - ASSERT_FALSE(categories.isEmpty()); - EXPECT_EQ("cheating", categories.at(0)); - EXPECT_EQ("other", categories.last()); -} - -TEST(ReportCategoriesTest, CanonicalListContainsMergedClientAndServerCategories) -{ - const QStringList expected = {"cheating", "bug_abuse", "harassment", "verbal_abuse", - "hate_speech", "spam", "other"}; - EXPECT_EQ(expected, ReportCategories::keys()); - EXPECT_EQ(7, ReportCategories::keys().size()); -} - -TEST(ReportCategoriesTest, AllCanonicalKeysAreValid) -{ - for (const QString &category : ReportCategories::keys()) { - EXPECT_TRUE(ReportCategories::isValid(category)) << category.toStdString(); - } -} - -TEST(ReportCategoriesTest, LegacyCategoriesRemainValid) -{ - EXPECT_TRUE(ReportCategories::isValid("bug_abuse")); - EXPECT_TRUE(ReportCategories::isValid("verbal_abuse")); -} - -TEST(ReportCategoriesTest, ValidationIsCaseInsensitive) -{ - EXPECT_TRUE(ReportCategories::isValid("Cheating")); - EXPECT_TRUE(ReportCategories::isValid("HATE_SPEECH")); -} - -TEST(ReportCategoriesTest, UnknownAndEmptyCategoriesAreRejected) -{ - EXPECT_FALSE(ReportCategories::isValid(QString())); - EXPECT_FALSE(ReportCategories::isValid("hate speech")); - EXPECT_FALSE(ReportCategories::isValid("griefing")); -} - -int main(int argc, char **argv) -{ - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} \ No newline at end of file