Skip to content

Commit

Permalink
Refactor recent messages API (Chatterino#4763)
Browse files Browse the repository at this point in the history
This exposes internal functions for testing by splitting the implementation & internal API into separate files
  • Loading branch information
pajlada authored and Nerixyz committed Aug 12, 2023
1 parent 30bd88c commit 70b9660
Show file tree
Hide file tree
Showing 9 changed files with 332 additions and 278 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
- Dev: Replace our QObjectRef class with Qt's QPointer class. (#4666)
- Dev: Fixed warnings about QWidgets already having a QLayout. (#4672)
- Dev: Fixed undefined behavior when loading non-existant credentials. (#4673)
- Dev: Small refactor of the recent-messages API, splitting its internal API and its internal implementation up into separate files. (#4763)
- Dev: Added support for compiling with `sccache`. (#4678)
- Dev: Added `sccache` in Windows CI. (#4678)
- Dev: Moved preprocessor Git and date definitions to executables only. (#4681)
Expand Down
7 changes: 5 additions & 2 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -238,8 +238,6 @@ set(SOURCE_FILES
providers/LinkResolver.hpp
providers/NetworkConfigurationProvider.cpp
providers/NetworkConfigurationProvider.hpp
providers/RecentMessagesApi.cpp
providers/RecentMessagesApi.hpp

providers/seventv/SeventvBadges.cpp
providers/seventv/SeventvBadges.hpp
Expand Down Expand Up @@ -305,6 +303,11 @@ set(SOURCE_FILES
providers/liveupdates/BasicPubSubManager.hpp
providers/liveupdates/BasicPubSubWebsocket.hpp

providers/recentmessages/Api.cpp
providers/recentmessages/Api.hpp
providers/recentmessages/Impl.cpp
providers/recentmessages/Impl.hpp

providers/seventv/SeventvAPI.cpp
providers/seventv/SeventvAPI.hpp
providers/seventv/SeventvBadges.cpp
Expand Down
240 changes: 0 additions & 240 deletions src/providers/RecentMessagesApi.cpp

This file was deleted.

33 changes: 0 additions & 33 deletions src/providers/RecentMessagesApi.hpp

This file was deleted.

91 changes: 91 additions & 0 deletions src/providers/recentmessages/Api.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
#include "providers/recentmessages/Api.hpp"

#include "common/NetworkRequest.hpp"
#include "common/NetworkResult.hpp"
#include "common/QLogging.hpp"
#include "providers/recentmessages/Impl.hpp"
#include "providers/twitch/TwitchMessageBuilder.hpp"
#include "util/PostToThread.hpp"

namespace {

// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
const auto &LOG = chatterinoRecentMessages;

} // namespace

namespace chatterino::recentmessages {

using namespace recentmessages::detail;

void load(const QString &channelName, std::weak_ptr<Channel> channelPtr,
ResultCallback onLoaded, ErrorCallback onError)
{
qCDebug(LOG) << "Loading recent messages for" << channelName;

const auto url = constructRecentMessagesUrl(channelName);

NetworkRequest(url)
.onSuccess([channelPtr, onLoaded](const auto &result) -> Outcome {
auto shared = channelPtr.lock();
if (!shared)
{
return Failure;
}

qCDebug(LOG) << "Successfully loaded recent messages for"
<< shared->getName();

auto root = result.parseJson();
auto parsedMessages = parseRecentMessages(root);

// build the Communi messages into chatterino messages
auto builtMessages =
buildRecentMessages(parsedMessages, shared.get());

postToThread([shared = std::move(shared), root = std::move(root),
messages = std::move(builtMessages),
onLoaded]() mutable {
// Notify user about a possible gap in logs if it returned some messages
// but isn't currently joined to a channel
const auto errorCode = root.value("error_code").toString();
if (!errorCode.isEmpty())
{
qCDebug(LOG)
<< QString("Got error from API: error_code=%1, "
"channel=%2")
.arg(errorCode, shared->getName());
if (errorCode == "channel_not_joined" && !messages.empty())
{
shared->addMessage(makeSystemMessage(
"Message history service recovering, there may "
"be gaps in the message history."));
}
}

onLoaded(messages);
});

return Success;
})
.onError([channelPtr, onError](const NetworkResult &result) {
auto shared = channelPtr.lock();
if (!shared)
{
return;
}

qCDebug(LOG) << "Failed to load recent messages for"
<< shared->getName();

shared->addMessage(makeSystemMessage(
QStringLiteral(
"Message history service unavailable (Error: %1)")
.arg(result.formatError())));

onError();
})
.execute();
}

} // namespace chatterino::recentmessages
Loading

0 comments on commit 70b9660

Please sign in to comment.