From 01cf8c281d39af07c42fb58b0f46019291874a10 Mon Sep 17 00:00:00 2001 From: pajlada Date: Thu, 6 Mar 2025 13:08:06 +0100 Subject: [PATCH] fix: Qt 6.4.3 build (#6032) Also enables Qt 6.4.3 build in CI --- .github/workflows/test-macos.yml | 2 +- CHANGELOG.md | 1 + lib/twitch-eventsub-ws/tests/src/string.cpp | 17 ++++ src/messages/MessageBuilder.cpp | 4 +- .../twitch/eventsub/MessageBuilder.cpp | 83 +++++++++---------- .../twitch/eventsub/MessageBuilder.hpp | 2 + .../twitch/eventsub/MessageHandlers.cpp | 3 +- src/util/Helpers.cpp | 18 ++++ src/util/Helpers.hpp | 10 +++ 9 files changed, 91 insertions(+), 49 deletions(-) diff --git a/.github/workflows/test-macos.yml b/.github/workflows/test-macos.yml index 28034908..09a5dd3f 100644 --- a/.github/workflows/test-macos.yml +++ b/.github/workflows/test-macos.yml @@ -24,7 +24,7 @@ jobs: strategy: matrix: os: [macos-14] - qt-version: [6.7.1] + qt-version: [6.4.3, 6.7.1] plugins: [true] fail-fast: false env: diff --git a/CHANGELOG.md b/CHANGELOG.md index 09e3f0f9..bec44ce9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,7 @@ - Dev: Fixed duplicate CMake configure in clean builds. (#5940) - Dev: BTTV emotes are now loaded as WEBP. (#5957) - Dev: Reduced time we wait for PubSub connections to cleanly exit from 1s to 100ms. (#6019) +- Dev: Build with Qt 6.4.3 in CI. (#6032) - Dev: Refactored some settings styles/APIs. (#6023) - Dev: Added snapshot tests for EventSub. (#5965) - Dev: Updated crashpad. (#6026) diff --git a/lib/twitch-eventsub-ws/tests/src/string.cpp b/lib/twitch-eventsub-ws/tests/src/string.cpp index b1f23c49..448798b6 100644 --- a/lib/twitch-eventsub-ws/tests/src/string.cpp +++ b/lib/twitch-eventsub-ws/tests/src/string.cpp @@ -1,11 +1,13 @@ #include #include +#include #include #include namespace { +constexpr const char *MINI = "mini"; constexpr const char *LONGEST_SSO = "mylongstringyesitslongwo"; constexpr const char *TOO_LONG = "mylongstringyesitslongwow"; @@ -567,3 +569,18 @@ TEST(String, Equals) ASSERT_TRUE(reallyLong == String(REALLY_LONG)); ASSERT_TRUE(reallyLongQt == String(REALLY_LONG)); } + +TEST(String, QStringBuilder) +{ + String s(MINI); + + ASSERT_EQ("foo" % s.qt() % "bar", "foominibar"); + ASSERT_EQ(u"foo" % s.qt() % "bar", "foominibar"); + ASSERT_EQ("foo" % s.qt() % u"bar", "foominibar"); + ASSERT_EQ(u"foo" % s.qt() % u"bar", "foominibar"); + + // the code below breaks on qt 6.4.3, but i think it's unrelated to our String stuff + // auto text2 = u"a" % s.qt() % u"b"; + // QString messageText = text2; + // QString searchText = text2; +} diff --git a/src/messages/MessageBuilder.cpp b/src/messages/MessageBuilder.cpp index a6fb5f0d..2adf5d06 100644 --- a/src/messages/MessageBuilder.cpp +++ b/src/messages/MessageBuilder.cpp @@ -658,12 +658,12 @@ MessageBuilder::MessageBuilder(TimeoutMessageTag, const QString &timeoutUser, ->setLink({Link::UserInfo, name}); if (remainder.startsWith(' ')) { - remainder.removeFirst(); + removeFirstQS(remainder); } else { assert(messageText.endsWith(' ')); - messageText.removeLast(); + removeLastQS(messageText); el->setTrailingSpace(false); } } diff --git a/src/providers/twitch/eventsub/MessageBuilder.cpp b/src/providers/twitch/eventsub/MessageBuilder.cpp index 06735a9e..057a6801 100644 --- a/src/providers/twitch/eventsub/MessageBuilder.cpp +++ b/src/providers/twitch/eventsub/MessageBuilder.cpp @@ -10,6 +10,8 @@ #include "singletons/StreamerMode.hpp" #include "util/Helpers.hpp" +#include + namespace { using namespace chatterino; @@ -35,8 +37,7 @@ void makeModeMessage(EventSubMessageBuilder &builder, builder.emplaceSystemTextAndUpdate(duration, text); } - builder.message().messageText = text; - builder.message().searchText = text; + builder.setMessageAndSearchText(text); } QString stringifyAutomodReason(const lib::automod::AutomodReason &reason, @@ -174,6 +175,15 @@ void EventSubMessageBuilder::appendUser(const lib::String &userName, } } +void EventSubMessageBuilder::setMessageAndSearchText(const QString &text) +{ + assert(this->message().messageText.isNull()); + assert(this->message().searchText.isNull()); + + this->message().messageText = text; + this->message().searchText = text; +} + void makeModerateMessage(EventSubMessageBuilder &builder, const lib::payload::channel_moderate::v2::Event &event, const lib::payload::channel_moderate::v2::Vip &action) @@ -185,8 +195,7 @@ void makeModerateMessage(EventSubMessageBuilder &builder, builder.appendUser(action.userName, action.userLogin, text); builder.emplaceSystemTextAndUpdate("as a VIP of this channel.", text); - builder.message().messageText = text; - builder.message().searchText = text; + builder.setMessageAndSearchText(text); } void makeModerateMessage( @@ -201,8 +210,7 @@ void makeModerateMessage( builder.appendUser(action.userName, action.userLogin, text); builder.emplaceSystemTextAndUpdate("as a VIP of this channel.", text); - builder.message().messageText = text; - builder.message().searchText = text; + builder.setMessageAndSearchText(text); } void makeModerateMessage(EventSubMessageBuilder &builder, @@ -240,8 +248,7 @@ void makeModerateMessage(EventSubMessageBuilder &builder, builder.emplaceSystemTextAndUpdate(reasons.join(", "), text); } - builder.message().messageText = text; - builder.message().searchText = text; + builder.setMessageAndSearchText(text); } void makeModerateMessage(EventSubMessageBuilder &builder, @@ -272,8 +279,7 @@ void makeModerateMessage(EventSubMessageBuilder &builder, builder.emplaceSystemTextAndUpdate(action.reason.qt(), text); } - builder->messageText = text; - builder->searchText = text; + builder.setMessageAndSearchText(text); builder->timeoutUser = action.userLogin.qt(); } @@ -298,8 +304,7 @@ void makeModerateMessage( builder.emplaceSystemTextAndUpdate(".", text); - builder->messageText = text; - builder->searchText = text; + builder.setMessageAndSearchText(text); builder->timeoutUser = action.userLogin.qt(); } @@ -325,8 +330,7 @@ void makeModerateMessage( builder.emplaceSystemTextAndUpdate(".", text); - builder->messageText = text; - builder->searchText = text; + builder.setMessageAndSearchText(text); builder->timeoutUser = action.userLogin.qt(); } @@ -372,8 +376,7 @@ void makeModerateMessage( text.append(action.messageBody.qt()); } - builder->messageText = text; - builder->searchText = text; + builder.setMessageAndSearchText(text); builder->timeoutUser = action.userLogin.qt(); } @@ -516,8 +519,7 @@ void makeModerateMessage( } builder.emplaceSystemTextAndUpdate(u"on AutoMod."_s, text); - builder.message().messageText = text; - builder.message().searchText = text; + builder.setMessageAndSearchText(text); } void makeModerateMessage(EventSubMessageBuilder &builder, @@ -531,8 +533,7 @@ void makeModerateMessage(EventSubMessageBuilder &builder, builder.appendUser(action.userName, action.userLogin, text, false); builder.emplaceSystemTextAndUpdate(u"."_s, text); - builder.message().messageText = text; - builder.message().searchText = text; + builder.setMessageAndSearchText(text); } void makeModerateMessage( @@ -547,8 +548,7 @@ void makeModerateMessage( builder.appendUser(action.userName, action.userLogin, text, false); builder.emplaceSystemTextAndUpdate(u"."_s, text); - builder.message().messageText = text; - builder.message().searchText = text; + builder.setMessageAndSearchText(text); } void makeModerateMessage(EventSubMessageBuilder &builder, @@ -562,8 +562,7 @@ void makeModerateMessage(EventSubMessageBuilder &builder, builder.appendUser(action.userName, action.userLogin, text, false); builder.emplaceSystemTextAndUpdate(".", text); - builder.message().messageText = text; - builder.message().searchText = text; + builder.setMessageAndSearchText(text); } void makeModerateMessage( @@ -578,8 +577,7 @@ void makeModerateMessage( builder.appendUser(action.userName, action.userLogin, text, false); builder.emplaceSystemTextAndUpdate(".", text); - builder.message().messageText = text; - builder.message().searchText = text; + builder.setMessageAndSearchText(text); } MessagePtr makeAutomodHoldMessageHeader( @@ -625,11 +623,10 @@ MessagePtr makeAutomodHoldMessageHeader( MessageColor(QColor(255, 0, 0)), FontStyle::ChatMediumBold) ->setLink({Link::AutoModDeny, event.messageID.qt()}); - auto text = u"AutoMod: Held a message for reason: " % reason % - u". Allow will post " - "it in chat. Allow Deny"; - builder->messageText = text; - builder->searchText = text; + + builder.setMessageAndSearchText( + u"AutoMod: Held a message for reason: " % reason % + u". Allow will post it in chat. Allow Deny"); return builder.release(); } @@ -667,9 +664,9 @@ MessagePtr makeAutomodHoldMessageBody( // XXX: add the structured message here builder.emplace(event.message.text.qt(), MessageElementFlag::Text, MessageColor::Text); - auto text = displayName % u": " % event.message.text.qt(); - builder->messageText = text; - builder->searchText = text; + + builder.setMessageAndSearchText(displayName % u": " % + event.message.text.qt()); return builder.release(); } @@ -734,8 +731,8 @@ MessagePtr makeSuspiciousUserMessageHeader( builder.emplace(headerMessage, MessageElementFlag::Text, MessageColor::Text); - builder->messageText = prefix % u" " % headerMessage; - builder->searchText = prefix % u" " % headerMessage; + + builder.setMessageAndSearchText(prefix % u" " % headerMessage); return builder.release(); } @@ -776,9 +773,8 @@ MessagePtr makeSuspiciousUserMessageBody( builder.emplace(event.message.text.qt(), MessageElementFlag::Text, MessageColor::Text); - auto text = event.userName.qt() % u": " % event.message.text.qt(); - builder.message().messageText = text; - builder.message().searchText = text; + builder.setMessageAndSearchText(event.userName.qt() % u": " % + event.message.text.qt()); return builder.release(); } @@ -821,8 +817,7 @@ MessagePtr makeSuspiciousUserUpdate( break; } - builder->messageText = text; - builder->searchText = text; + builder.setMessageAndSearchText(text); return builder.release(); } @@ -851,8 +846,7 @@ MessagePtr makeUserMessageHeldMessage( "Hey! Your message is being checked by mods and has not been sent.", MessageElementFlag::Text, MessageColor::Text); - builder->messageText = text; - builder->searchText = text; + builder.setMessageAndSearchText(text); return builder.release(); } @@ -903,8 +897,7 @@ MessagePtr makeUserMessageUpdateMessage( break; } - builder->messageText = text; - builder->searchText = text; + builder.setMessageAndSearchText(text); return builder.release(); } diff --git a/src/providers/twitch/eventsub/MessageBuilder.hpp b/src/providers/twitch/eventsub/MessageBuilder.hpp index 4531121a..eb0d37d7 100644 --- a/src/providers/twitch/eventsub/MessageBuilder.hpp +++ b/src/providers/twitch/eventsub/MessageBuilder.hpp @@ -38,6 +38,8 @@ public: void appendUser(const lib::String &userName, const lib::String &userLogin, QString &text, bool trailingSpace = true); + void setMessageAndSearchText(const QString &text); + private: TwitchChannel *channel; }; diff --git a/src/providers/twitch/eventsub/MessageHandlers.cpp b/src/providers/twitch/eventsub/MessageHandlers.cpp index f601b4b6..1af73ec0 100644 --- a/src/providers/twitch/eventsub/MessageHandlers.cpp +++ b/src/providers/twitch/eventsub/MessageHandlers.cpp @@ -8,6 +8,7 @@ #include "singletons/Settings.hpp" #include "singletons/WindowManager.hpp" #include "util/FormatTime.hpp" +#include "util/Helpers.hpp" #include "util/PostToThread.hpp" namespace chatterino::eventsub { @@ -78,7 +79,7 @@ void handleModerateMessage( } assert(text.endsWith(' ')); - text.removeLast(); // trailing space + removeLastQS(text); // trailing space if (action.reason.view().empty()) { diff --git a/src/util/Helpers.cpp b/src/util/Helpers.cpp index e61b7036..8d8ba63b 100644 --- a/src/util/Helpers.cpp +++ b/src/util/Helpers.cpp @@ -368,4 +368,22 @@ QStringView codepointSlice(QStringView str, qsizetype begin, qsizetype end) return {sliceBegin, pos}; } +void removeFirstQS(QString &str) +{ +#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) + str.removeFirst(); +#else + str.remove(0, 1); +#endif +} + +void removeLastQS(QString &str) +{ +#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) + str.removeLast(); +#else + str.chop(1); +#endif +} + } // namespace chatterino diff --git a/src/util/Helpers.hpp b/src/util/Helpers.hpp index 91674eed..27c15d7f 100644 --- a/src/util/Helpers.hpp +++ b/src/util/Helpers.hpp @@ -208,4 +208,14 @@ QDateTime chronoToQDateTime(std::chrono::system_clock::time_point time); /// @param end End index (exclusive, in codepoints) QStringView codepointSlice(QStringView str, qsizetype begin, qsizetype end); +/// Uses str.removeFirst if Qt >= 6.5, otherwise str.remove(0, 1) +/// +/// @param str The Qt string we want to remove 1 character from +void removeFirstQS(QString &str); + +/// Uses str.removeLast if Qt >= 6.5, otherwise str.chop(1) +/// +/// @param str The Qt string we want to remove 1 character from +void removeLastQS(QString &str); + } // namespace chatterino