Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/master' into chatterino7
Browse files Browse the repository at this point in the history
  • Loading branch information
Nerixyz committed Jun 6, 2024
2 parents ea47c0b + d2316af commit c5e3da2
Show file tree
Hide file tree
Showing 7 changed files with 90 additions and 2 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
- Minor: Added `flags.action` filter variable, allowing you to filter on `/me` messages. (#5397)
- Minor: The size of the emote popup is now saved. (#5415)
- Minor: Added the ability to duplicate tabs. (#5277)
- Minor: Moderators can now see when users are warned. (#5441)
- Bugfix: Fixed tab move animation occasionally failing to start after closing a tab. (#5426)
- Bugfix: If a network request errors with 200 OK, Qt's error code is now reported instead of the HTTP status. (#5378)
- Bugfix: Fixed restricted users usernames not being clickable. (#5405)
Expand Down
18 changes: 18 additions & 0 deletions src/Application.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -691,6 +691,24 @@ void Application::initPubSub()
chan->addOrReplaceTimeout(msg.release());
});
});

std::ignore = this->twitchPubSub->moderation.userWarned.connect(
[&](const auto &action) {
auto chan = this->twitch->getChannelOrEmptyByID(action.roomID);

if (chan->isEmpty())
{
return;
}

// TODO: Resolve the moderator's user ID into a full user here, so message can look better
postToThread([chan, action] {
MessageBuilder msg(action);
msg->flags.set(MessageFlag::PubSub);
chan->addMessage(msg.release());
});
});

std::ignore = this->twitchPubSub->moderation.messageDeleted.connect(
[&](const auto &action) {
auto chan = this->twitch->getChannelOrEmptyByID(action.roomID);
Expand Down
25 changes: 25 additions & 0 deletions src/messages/MessageBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,31 @@ MessageBuilder::MessageBuilder(const UnbanAction &action)
this->message().searchText = text;
}

MessageBuilder::MessageBuilder(const WarnAction &action)
: MessageBuilder()
{
this->emplace<TimestampElement>();
this->message().flags.set(MessageFlag::System);

QString text;

// TODO: Use MentionElement here, once WarnAction includes username/displayname
this->emplaceSystemTextAndUpdate("A moderator", text)
->setLink({Link::UserInfo, "id:" + action.source.id});
this->emplaceSystemTextAndUpdate("warned", text);
this->emplaceSystemTextAndUpdate(
action.target.login + (action.reasons.isEmpty() ? "." : ":"), text)
->setLink({Link::UserInfo, action.target.login});

if (!action.reasons.isEmpty())
{
this->emplaceSystemTextAndUpdate(action.reasons.join(", "), text);
}

this->message().messageText = text;
this->message().searchText = text;
}

MessageBuilder::MessageBuilder(const AutomodUserAction &action)
: MessageBuilder()
{
Expand Down
2 changes: 2 additions & 0 deletions src/messages/MessageBuilder.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
namespace chatterino {
struct BanAction;
struct UnbanAction;
struct WarnAction;
struct AutomodAction;
struct AutomodUserAction;
struct AutomodInfoAction;
Expand Down Expand Up @@ -78,6 +79,7 @@ class MessageBuilder
const QTime &time = QTime::currentTime());
MessageBuilder(const BanAction &action, uint32_t count = 1);
MessageBuilder(const UnbanAction &action);
MessageBuilder(const WarnAction &action);
MessageBuilder(const AutomodUserAction &action);

MessageBuilder(LiveUpdatesAddEmoteMessageTag, const QString &platform,
Expand Down
9 changes: 9 additions & 0 deletions src/providers/twitch/PubSubActions.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include <QDebug>
#include <QJsonObject>
#include <QString>
#include <QStringList>

#include <chrono>
#include <cinttypes>
Expand Down Expand Up @@ -171,4 +172,12 @@ struct AutomodInfoAction : PubSubAction {
} type;
};

struct WarnAction : PubSubAction {
using PubSubAction::PubSubAction;

ActionUser target;

QStringList reasons;
};

} // namespace chatterino
35 changes: 33 additions & 2 deletions src/providers/twitch/PubSubManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,37 @@ PubSub::PubSub(const QString &host, std::chrono::seconds pingInterval)
this->moderation.userUnbanned.invoke(action);
};

this->moderationActionHandlers["warn"] = [this](const auto &data,
const auto &roomID) {
WarnAction action(data, roomID);

action.source.id = data.value("created_by_user_id").toString();
action.source.login =
data.value("created_by").toString(); // currently always empty

action.target.id = data.value("target_user_id").toString();
action.target.login = data.value("target_user_login").toString();

const auto reasons = data.value("args").toArray();
bool firstArg = true;
for (const auto &reasonValue : reasons)
{
if (firstArg)
{
// Skip first arg in the reasons array since it's not a reason
firstArg = false;
continue;
}
const auto &reason = reasonValue.toString();
if (!reason.isEmpty())
{
action.reasons.append(reason);
}
}

this->moderation.userWarned.invoke(action);
};

/*
// This handler is no longer required as we use the automod-queue topic now
this->moderationActionHandlers["automod_rejected"] =
Expand Down Expand Up @@ -1131,8 +1162,8 @@ void PubSub::handleMessageResponse(const PubSubMessageMessage &message)

case PubSubChatModeratorActionMessage::Type::INVALID:
default: {
qCDebug(chatterinoPubSub)
<< "Invalid whisper type:" << innerMessage.typeString;
qCDebug(chatterinoPubSub) << "Invalid moderator action type:"
<< innerMessage.typeString;
}
break;
}
Expand Down
2 changes: 2 additions & 0 deletions src/providers/twitch/PubSubManager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ struct PubSubAutoModQueueMessage;
struct AutomodAction;
struct AutomodUserAction;
struct AutomodInfoAction;
struct WarnAction;
struct PubSubLowTrustUsersMessage;
struct PubSubWhisperMessage;

Expand Down Expand Up @@ -97,6 +98,7 @@ class PubSub

Signal<BanAction> userBanned;
Signal<UnbanAction> userUnbanned;
Signal<WarnAction> userWarned;

Signal<PubSubLowTrustUsersMessage> suspiciousMessageReceived;
Signal<PubSubLowTrustUsersMessage> suspiciousTreatmentUpdated;
Expand Down

0 comments on commit c5e3da2

Please sign in to comment.