chore(eventsub): simplify building for system messages (#5980)
This commit is contained in:
+1
-1
@@ -29,7 +29,7 @@
|
|||||||
- Bugfix: Fixed channel point redemptions with messages not showing up if PubSub is disconnected. (#5948)
|
- Bugfix: Fixed channel point redemptions with messages not showing up if PubSub is disconnected. (#5948)
|
||||||
- Bugfix: Fixed the input font not immediately updating when zooming in/out. (#5960)
|
- Bugfix: Fixed the input font not immediately updating when zooming in/out. (#5960)
|
||||||
- Dev: Subscriptions to PubSub channel points redemption topics now use no auth token, making it continue to work during PubSub shutdown. (#5947)
|
- Dev: Subscriptions to PubSub channel points redemption topics now use no auth token, making it continue to work during PubSub shutdown. (#5947)
|
||||||
- Dev: Add initial experimental EventSub support. (#5837, #5895, #5897, #5904, #5910, #5903, #5915, #5916, #5930, #5935, #5932, #5943, #5952, #5953, #5968, #5973, #5974)
|
- Dev: Add initial experimental EventSub support. (#5837, #5895, #5897, #5904, #5910, #5903, #5915, #5916, #5930, #5935, #5932, #5943, #5952, #5953, #5968, #5973, #5974, #5980)
|
||||||
- Dev: Remove unneeded platform specifier for toasts. (#5914)
|
- Dev: Remove unneeded platform specifier for toasts. (#5914)
|
||||||
- Dev: Highlight checks now use non-capturing groups for the boundaries. (#5784)
|
- Dev: Highlight checks now use non-capturing groups for the boundaries. (#5784)
|
||||||
- Dev: Removed unused PubSub whisper code. (#5898)
|
- Dev: Removed unused PubSub whisper code. (#5898)
|
||||||
|
|||||||
@@ -20,9 +20,20 @@
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
using namespace chatterino;
|
||||||
|
using namespace chatterino::eventsub;
|
||||||
|
|
||||||
// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
|
// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
|
||||||
const auto &LOG = chatterinoTwitchEventSub;
|
const auto &LOG = chatterinoTwitchEventSub;
|
||||||
|
|
||||||
|
template <typename Action>
|
||||||
|
concept CanMakeModMessage =
|
||||||
|
requires(EventSubMessageBuilder &builder,
|
||||||
|
const lib::payload::channel_moderate::v2::Event &event,
|
||||||
|
const std::remove_cvref_t<Action> &action) {
|
||||||
|
makeModerateMessage(builder, event, action);
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
namespace chatterino::eventsub {
|
namespace chatterino::eventsub {
|
||||||
@@ -178,29 +189,12 @@ void Connection::onChannelModerate(
|
|||||||
std::visit(
|
std::visit(
|
||||||
[&](auto &&action) {
|
[&](auto &&action) {
|
||||||
using Action = std::remove_cvref_t<decltype(action)>;
|
using Action = std::remove_cvref_t<decltype(action)>;
|
||||||
if constexpr (std::is_same_v<
|
if constexpr (CanMakeModMessage<Action>)
|
||||||
Action, lib::payload::channel_moderate::v2::Vip>)
|
|
||||||
{
|
{
|
||||||
auto msg = makeVipMessage(channel, now, payload.event, action);
|
EventSubMessageBuilder builder(channel, now);
|
||||||
runInGuiThread([channel, msg] {
|
builder->loginName = payload.event.moderatorUserLogin.qt();
|
||||||
channel->addMessage(msg, MessageContext::Original);
|
makeModerateMessage(builder, payload.event, action);
|
||||||
});
|
auto msg = builder.release();
|
||||||
}
|
|
||||||
else if constexpr (std::is_same_v<
|
|
||||||
Action,
|
|
||||||
lib::payload::channel_moderate::v2::Unvip>)
|
|
||||||
{
|
|
||||||
auto msg =
|
|
||||||
makeUnvipMessage(channel, now, payload.event, action);
|
|
||||||
runInGuiThread([channel, msg] {
|
|
||||||
channel->addMessage(msg, MessageContext::Original);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else if constexpr (std::is_same_v<
|
|
||||||
Action,
|
|
||||||
lib::payload::channel_moderate::v2::Warn>)
|
|
||||||
{
|
|
||||||
auto msg = makeWarnMessage(channel, now, payload.event, action);
|
|
||||||
runInGuiThread([channel, msg] {
|
runInGuiThread([channel, msg] {
|
||||||
channel->addMessage(msg, MessageContext::Original);
|
channel->addMessage(msg, MessageContext::Original);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,111 +1,82 @@
|
|||||||
#include "providers/twitch/eventsub/MessageBuilder.hpp"
|
#include "providers/twitch/eventsub/MessageBuilder.hpp"
|
||||||
|
|
||||||
|
#include "messages/Message.hpp"
|
||||||
#include "messages/MessageBuilder.hpp"
|
#include "messages/MessageBuilder.hpp"
|
||||||
|
|
||||||
namespace chatterino::eventsub {
|
namespace chatterino::eventsub {
|
||||||
|
|
||||||
MessagePtr makeVipMessage(
|
EventSubMessageBuilder::EventSubMessageBuilder(TwitchChannel *channel,
|
||||||
TwitchChannel *channel, const QDateTime &time,
|
const QDateTime &time)
|
||||||
const lib::payload::channel_moderate::v2::Event &event,
|
: channel(channel)
|
||||||
const lib::payload::channel_moderate::v2::Vip &action)
|
|
||||||
{
|
{
|
||||||
MessageBuilder builder;
|
this->emplace<TimestampElement>();
|
||||||
|
this->message().flags.set(MessageFlag::System);
|
||||||
|
this->message().flags.set(MessageFlag::Timeout); // do we need this?
|
||||||
|
this->message().serverReceivedTime = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
EventSubMessageBuilder::~EventSubMessageBuilder() = default;
|
||||||
|
|
||||||
|
void EventSubMessageBuilder::appendUser(const lib::String &userName,
|
||||||
|
const lib::String &userLogin,
|
||||||
|
QString &text, bool trailingSpace)
|
||||||
|
{
|
||||||
|
auto login = userLogin.qt();
|
||||||
|
auto *el = this->emplace<MentionElement>(userName.qt(), login,
|
||||||
|
MessageColor::System,
|
||||||
|
channel->getUserColor(login));
|
||||||
|
text.append(login);
|
||||||
|
|
||||||
|
if (trailingSpace)
|
||||||
|
{
|
||||||
|
text.append(u' ');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
el->setTrailingSpace(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void makeModerateMessage(EventSubMessageBuilder &builder,
|
||||||
|
const lib::payload::channel_moderate::v2::Event &event,
|
||||||
|
const lib::payload::channel_moderate::v2::Vip &action)
|
||||||
|
{
|
||||||
QString text;
|
QString text;
|
||||||
|
|
||||||
builder.emplace<TimestampElement>();
|
builder.appendUser(event.moderatorUserName, event.moderatorUserLogin, text);
|
||||||
builder->flags.set(MessageFlag::System);
|
|
||||||
builder->flags.set(MessageFlag::Timeout);
|
|
||||||
builder->loginName = event.moderatorUserLogin.qt();
|
|
||||||
|
|
||||||
builder.emplace<MentionElement>(
|
|
||||||
event.moderatorUserName.qt(), event.moderatorUserLogin.qt(),
|
|
||||||
MessageColor::System,
|
|
||||||
channel->getUserColor(event.moderatorUserLogin.qt()));
|
|
||||||
text.append(event.moderatorUserLogin.qt() + " ");
|
|
||||||
|
|
||||||
builder.emplaceSystemTextAndUpdate("has added", text);
|
builder.emplaceSystemTextAndUpdate("has added", text);
|
||||||
|
builder.appendUser(action.userName, action.userLogin, text);
|
||||||
builder.emplace<MentionElement>(
|
|
||||||
action.userName.qt(), action.userLogin.qt(), MessageColor::System,
|
|
||||||
channel->getUserColor(action.userLogin.qt()));
|
|
||||||
text.append(action.userLogin.qt() + " ");
|
|
||||||
|
|
||||||
builder.emplaceSystemTextAndUpdate("as a VIP of this channel.", text);
|
builder.emplaceSystemTextAndUpdate("as a VIP of this channel.", text);
|
||||||
|
|
||||||
builder.message().messageText = text;
|
builder.message().messageText = text;
|
||||||
builder.message().searchText = text;
|
builder.message().searchText = text;
|
||||||
|
|
||||||
builder.message().serverReceivedTime = time;
|
|
||||||
|
|
||||||
return builder.release();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MessagePtr makeUnvipMessage(
|
void makeModerateMessage(
|
||||||
TwitchChannel *channel, const QDateTime &time,
|
EventSubMessageBuilder &builder,
|
||||||
const lib::payload::channel_moderate::v2::Event &event,
|
const lib::payload::channel_moderate::v2::Event &event,
|
||||||
const lib::payload::channel_moderate::v2::Unvip &action)
|
const lib::payload::channel_moderate::v2::Unvip &action)
|
||||||
{
|
{
|
||||||
MessageBuilder builder;
|
|
||||||
|
|
||||||
QString text;
|
QString text;
|
||||||
|
|
||||||
builder.emplace<TimestampElement>();
|
builder.appendUser(event.moderatorUserName, event.moderatorUserLogin, text);
|
||||||
builder->flags.set(MessageFlag::System);
|
|
||||||
builder->flags.set(MessageFlag::Timeout);
|
|
||||||
builder->loginName = event.moderatorUserLogin.qt();
|
|
||||||
|
|
||||||
builder.emplace<MentionElement>(
|
|
||||||
event.moderatorUserName.qt(), event.moderatorUserLogin.qt(),
|
|
||||||
MessageColor::System,
|
|
||||||
channel->getUserColor(event.moderatorUserLogin.qt()));
|
|
||||||
text.append(event.moderatorUserLogin.qt() + " ");
|
|
||||||
|
|
||||||
builder.emplaceSystemTextAndUpdate("has removed", text);
|
builder.emplaceSystemTextAndUpdate("has removed", text);
|
||||||
|
builder.appendUser(action.userName, action.userLogin, text);
|
||||||
builder.emplace<MentionElement>(
|
|
||||||
action.userName.qt(), action.userLogin.qt(), MessageColor::System,
|
|
||||||
channel->getUserColor(action.userLogin.qt()));
|
|
||||||
text.append(action.userLogin.qt() + " ");
|
|
||||||
|
|
||||||
builder.emplaceSystemTextAndUpdate("as a VIP of this channel.", text);
|
builder.emplaceSystemTextAndUpdate("as a VIP of this channel.", text);
|
||||||
|
|
||||||
builder.message().messageText = text;
|
builder.message().messageText = text;
|
||||||
builder.message().searchText = text;
|
builder.message().searchText = text;
|
||||||
|
|
||||||
builder.message().serverReceivedTime = time;
|
|
||||||
|
|
||||||
return builder.release();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MessagePtr makeWarnMessage(
|
void makeModerateMessage(EventSubMessageBuilder &builder,
|
||||||
TwitchChannel *channel, const QDateTime &time,
|
const lib::payload::channel_moderate::v2::Event &event,
|
||||||
const lib::payload::channel_moderate::v2::Event &event,
|
const lib::payload::channel_moderate::v2::Warn &action)
|
||||||
const lib::payload::channel_moderate::v2::Warn &action)
|
|
||||||
{
|
{
|
||||||
MessageBuilder builder;
|
|
||||||
|
|
||||||
QString text;
|
QString text;
|
||||||
|
|
||||||
builder.emplace<TimestampElement>();
|
builder.appendUser(event.moderatorUserName, event.moderatorUserLogin, text);
|
||||||
builder->flags.set(MessageFlag::System);
|
|
||||||
builder->flags.set(MessageFlag::Timeout);
|
|
||||||
builder->loginName = event.moderatorUserLogin.qt();
|
|
||||||
|
|
||||||
builder.emplace<MentionElement>(
|
|
||||||
event.moderatorUserName.qt(), event.moderatorUserLogin.qt(),
|
|
||||||
MessageColor::System,
|
|
||||||
channel->getUserColor(event.moderatorUserLogin.qt()));
|
|
||||||
text.append(event.moderatorUserLogin.qt() + " ");
|
|
||||||
|
|
||||||
builder.emplaceSystemTextAndUpdate("has warned", text);
|
builder.emplaceSystemTextAndUpdate("has warned", text);
|
||||||
|
builder.appendUser(action.userName, action.userLogin, text, false);
|
||||||
builder
|
|
||||||
.emplace<MentionElement>(action.userName.qt(), action.userLogin.qt(),
|
|
||||||
MessageColor::System,
|
|
||||||
channel->getUserColor(action.userLogin.qt()))
|
|
||||||
->setTrailingSpace(false);
|
|
||||||
text.append(action.userLogin.qt());
|
|
||||||
|
|
||||||
QStringList reasons;
|
QStringList reasons;
|
||||||
|
|
||||||
@@ -134,10 +105,6 @@ MessagePtr makeWarnMessage(
|
|||||||
|
|
||||||
builder.message().messageText = text;
|
builder.message().messageText = text;
|
||||||
builder.message().searchText = text;
|
builder.message().searchText = text;
|
||||||
|
|
||||||
builder.message().serverReceivedTime = time;
|
|
||||||
|
|
||||||
return builder.release();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace chatterino::eventsub
|
} // namespace chatterino::eventsub
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "messages/Message.hpp"
|
#include "messages/MessageBuilder.hpp"
|
||||||
#include "providers/twitch/TwitchChannel.hpp"
|
#include "providers/twitch/TwitchChannel.hpp"
|
||||||
#include "twitch-eventsub-ws/payloads/channel-moderate-v2.hpp"
|
#include "twitch-eventsub-ws/payloads/channel-moderate-v2.hpp"
|
||||||
|
|
||||||
@@ -8,21 +8,38 @@
|
|||||||
|
|
||||||
namespace chatterino::eventsub {
|
namespace chatterino::eventsub {
|
||||||
|
|
||||||
|
class EventSubMessageBuilder : public MessageBuilder
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EventSubMessageBuilder(TwitchChannel *channel, const QDateTime &time);
|
||||||
|
~EventSubMessageBuilder();
|
||||||
|
|
||||||
|
EventSubMessageBuilder(const EventSubMessageBuilder &) = delete;
|
||||||
|
EventSubMessageBuilder(EventSubMessageBuilder &&) = delete;
|
||||||
|
EventSubMessageBuilder &operator=(const EventSubMessageBuilder &) = delete;
|
||||||
|
EventSubMessageBuilder &operator=(EventSubMessageBuilder &&) = delete;
|
||||||
|
|
||||||
|
void appendUser(const lib::String &userName, const lib::String &userLogin,
|
||||||
|
QString &text, bool trailingSpace = true);
|
||||||
|
|
||||||
|
private:
|
||||||
|
TwitchChannel *channel;
|
||||||
|
};
|
||||||
|
|
||||||
/// <BROADCASTER> has added <USER> as a VIP of this channel.
|
/// <BROADCASTER> has added <USER> as a VIP of this channel.
|
||||||
MessagePtr makeVipMessage(
|
void makeModerateMessage(EventSubMessageBuilder &builder,
|
||||||
TwitchChannel *channel, const QDateTime &time,
|
const lib::payload::channel_moderate::v2::Event &event,
|
||||||
const lib::payload::channel_moderate::v2::Event &event,
|
const lib::payload::channel_moderate::v2::Vip &action);
|
||||||
const lib::payload::channel_moderate::v2::Vip &action);
|
|
||||||
|
|
||||||
/// <BROADCASTER> has removed <USER> as a VIP of this channel.
|
/// <BROADCASTER> has removed <USER> as a VIP of this channel.
|
||||||
MessagePtr makeUnvipMessage(
|
void makeModerateMessage(
|
||||||
TwitchChannel *channel, const QDateTime &time,
|
EventSubMessageBuilder &builder,
|
||||||
const lib::payload::channel_moderate::v2::Event &event,
|
const lib::payload::channel_moderate::v2::Event &event,
|
||||||
const lib::payload::channel_moderate::v2::Unvip &action);
|
const lib::payload::channel_moderate::v2::Unvip &action);
|
||||||
|
|
||||||
/// <MODERATOR> has warned <USER>: <REASON>
|
/// <MODERATOR> has warned <USER>: <REASON>
|
||||||
MessagePtr makeWarnMessage(
|
void makeModerateMessage(
|
||||||
TwitchChannel *channel, const QDateTime &time,
|
EventSubMessageBuilder &builder,
|
||||||
const lib::payload::channel_moderate::v2::Event &event,
|
const lib::payload::channel_moderate::v2::Event &event,
|
||||||
const lib::payload::channel_moderate::v2::Warn &action);
|
const lib::payload::channel_moderate::v2::Warn &action);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user