Clean up twitch message parsing
This commit is contained in:
@@ -194,6 +194,8 @@ void EmoteManager::loadEmojis()
|
|||||||
this->emojiShortCodeToEmoji.insert(shortCode, emojiData);
|
this->emojiShortCodeToEmoji.insert(shortCode, emojiData);
|
||||||
|
|
||||||
this->emojiFirstByte[emojiData.value.at(0)].append(emojiData);
|
this->emojiFirstByte[emojiData.value.at(0)].append(emojiData);
|
||||||
|
|
||||||
|
// TODO(pajlada): The vectors in emojiFirstByte need to be sorted by emojiData.code.length()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+9
-5
@@ -263,12 +263,16 @@ void IrcManager::privateMessageReceived(Communi::IrcPrivateMessage *message)
|
|||||||
this->onPrivateMessage.invoke(message);
|
this->onPrivateMessage.invoke(message);
|
||||||
auto c = this->channelManager.getChannel(message->target().mid(1));
|
auto c = this->channelManager.getChannel(message->target().mid(1));
|
||||||
|
|
||||||
if (c != nullptr) {
|
if (!c) {
|
||||||
messages::MessageParseArgs args;
|
return;
|
||||||
|
|
||||||
c->addMessage(twitch::TwitchMessageBuilder::parse(message, c.get(), args, this->resources,
|
|
||||||
this->emoteManager, this->windowManager));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
messages::MessageParseArgs args;
|
||||||
|
|
||||||
|
twitch::TwitchMessageBuilder builder(c.get(), this->resources, this->emoteManager,
|
||||||
|
this->windowManager, message, args);
|
||||||
|
|
||||||
|
c->addMessage(builder.parse());
|
||||||
}
|
}
|
||||||
|
|
||||||
void IrcManager::messageReceived(Communi::IrcMessage *message)
|
void IrcManager::messageReceived(Communi::IrcMessage *message)
|
||||||
|
|||||||
+177
-171
@@ -10,121 +10,42 @@ using namespace chatterino::messages;
|
|||||||
namespace chatterino {
|
namespace chatterino {
|
||||||
namespace twitch {
|
namespace twitch {
|
||||||
|
|
||||||
TwitchMessageBuilder::TwitchMessageBuilder()
|
TwitchMessageBuilder::TwitchMessageBuilder(Channel *_channel, Resources &_resources,
|
||||||
: MessageBuilder()
|
EmoteManager &_emoteManager,
|
||||||
, messageId()
|
WindowManager &_windowManager,
|
||||||
, userName()
|
const Communi::IrcPrivateMessage *_ircMessage,
|
||||||
|
const messages::MessageParseArgs &_args)
|
||||||
|
: channel(_channel)
|
||||||
|
, resources(_resources)
|
||||||
|
, windowManager(_windowManager)
|
||||||
|
, colorScheme(this->windowManager.colorScheme)
|
||||||
|
, emoteManager(_emoteManager)
|
||||||
|
, ircMessage(_ircMessage)
|
||||||
|
, args(_args)
|
||||||
|
, tags(this->ircMessage->tags())
|
||||||
|
, usernameColor(this->colorScheme.SystemMessageColor)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
// When a twitch message is being parsed it makes sense for the builder to have access to:
|
SharedMessage TwitchMessageBuilder::parse()
|
||||||
// - The IRC Message
|
|
||||||
// - Message-specific parsing arguments (i.e. if ping sounds are disabled)
|
|
||||||
// - The Channel that the message originated from
|
|
||||||
// - The resources class for Badges, Moderation buttons
|
|
||||||
// - The Emote Manager for all different kinds of emotes
|
|
||||||
SharedMessage TwitchMessageBuilder::parse(const Communi::IrcPrivateMessage *ircMessage, //
|
|
||||||
Channel *channel, //
|
|
||||||
const MessageParseArgs &args, //
|
|
||||||
Resources &resources, //
|
|
||||||
EmoteManager &emoteManager, //
|
|
||||||
WindowManager &windowManager)
|
|
||||||
{
|
{
|
||||||
TwitchMessageBuilder b;
|
|
||||||
|
|
||||||
// The timestamp is always appended to the builder
|
// The timestamp is always appended to the builder
|
||||||
// Whether or not will be rendered is decided/checked later
|
// Whether or not will be rendered is decided/checked later
|
||||||
b.appendTimestamp();
|
this->appendTimestamp();
|
||||||
|
|
||||||
auto tags = ircMessage->tags();
|
this->parseMessageID();
|
||||||
|
|
||||||
auto iterator = tags.find("id");
|
this->parseRoomID();
|
||||||
|
|
||||||
if (iterator != tags.end()) {
|
this->appendModerationButtons();
|
||||||
b.messageId = iterator.value().toString();
|
|
||||||
|
this->parseTwitchBadges();
|
||||||
|
|
||||||
|
if (this->args.includeChannelName) {
|
||||||
|
this->parseChannelName();
|
||||||
}
|
}
|
||||||
|
|
||||||
// room id
|
this->parseUsername();
|
||||||
iterator = tags.find("room-id");
|
|
||||||
std::string roomID;
|
|
||||||
if (iterator != std::end(tags)) {
|
|
||||||
roomID = iterator.value().toString().toStdString();
|
|
||||||
|
|
||||||
if (channel->roomID.empty()) {
|
|
||||||
channel->roomID = roomID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// timestamps
|
|
||||||
iterator = tags.find("tmi-sent-ts");
|
|
||||||
|
|
||||||
b.appendModerationWords(ircMessage, resources);
|
|
||||||
|
|
||||||
// badges
|
|
||||||
iterator = tags.find("badges");
|
|
||||||
|
|
||||||
ColorScheme &colorScheme = windowManager.colorScheme;
|
|
||||||
|
|
||||||
const auto &channelResources = resources.channels[roomID];
|
|
||||||
|
|
||||||
if (iterator != tags.end()) {
|
|
||||||
QStringList badges = iterator.value().toString().split(',');
|
|
||||||
|
|
||||||
b.appendTwitchBadges(badges, resources, emoteManager, channelResources);
|
|
||||||
}
|
|
||||||
|
|
||||||
// color
|
|
||||||
QColor &usernameColor = colorScheme.SystemMessageColor;
|
|
||||||
|
|
||||||
iterator = tags.find("color");
|
|
||||||
if (iterator != tags.end()) {
|
|
||||||
usernameColor = QColor(iterator.value().toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// channel name
|
|
||||||
if (args.includeChannelName) {
|
|
||||||
QString channelName("#" + channel->getName());
|
|
||||||
b.appendWord(Word(channelName, Word::Misc, colorScheme.SystemMessageColor,
|
|
||||||
QString(channelName), QString(),
|
|
||||||
Link(Link::Url, channel->getName() + "\n" + b.messageId)));
|
|
||||||
}
|
|
||||||
|
|
||||||
// username
|
|
||||||
b.userName = ircMessage->nick();
|
|
||||||
|
|
||||||
if (b.userName.isEmpty()) {
|
|
||||||
b.userName = tags.value(QLatin1String("login")).toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString displayName;
|
|
||||||
|
|
||||||
iterator = tags.find("display-name");
|
|
||||||
if (iterator == tags.end()) {
|
|
||||||
displayName = b.userName;
|
|
||||||
} else {
|
|
||||||
displayName = iterator.value().toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool hasLocalizedName = QString::compare(displayName, ircMessage->account()) == 0;
|
|
||||||
QString userDisplayString =
|
|
||||||
displayName + (hasLocalizedName ? (" (" + ircMessage->account() + ")") : QString());
|
|
||||||
|
|
||||||
if (args.isSentWhisper) {
|
|
||||||
// TODO(pajlada): Re-implement
|
|
||||||
// userDisplayString += IrcManager::getInstance().getUser().getUserName();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.isReceivedWhisper) {
|
|
||||||
// TODO(pajlada): Re-implement
|
|
||||||
// userDisplayString += " -> " + IrcManager::getInstance().getUser().getUserName();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ircMessage->isAction()) {
|
|
||||||
userDisplayString += ": ";
|
|
||||||
}
|
|
||||||
|
|
||||||
b.appendWord(Word(userDisplayString, Word::Username, usernameColor, userDisplayString,
|
|
||||||
QString(), Link(Link::UserInfo, b.userName)));
|
|
||||||
|
|
||||||
// highlights
|
// highlights
|
||||||
// TODO: implement this xD
|
// TODO: implement this xD
|
||||||
@@ -132,27 +53,27 @@ SharedMessage TwitchMessageBuilder::parse(const Communi::IrcPrivateMessage *ircM
|
|||||||
// bits
|
// bits
|
||||||
QString bits = "";
|
QString bits = "";
|
||||||
|
|
||||||
iterator = tags.find("bits");
|
auto iterator = this->tags.find("bits");
|
||||||
if (iterator != tags.end()) {
|
if (iterator != this->tags.end()) {
|
||||||
bits = iterator.value().toString();
|
bits = iterator.value().toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
// twitch emotes
|
// twitch emotes
|
||||||
std::vector<std::pair<long int, LazyLoadedImage *>> twitchEmotes;
|
std::vector<std::pair<long int, LazyLoadedImage *>> twitchEmotes;
|
||||||
|
|
||||||
iterator = tags.find("emotes");
|
iterator = this->tags.find("emotes");
|
||||||
if (iterator != tags.end()) {
|
if (iterator != this->tags.end()) {
|
||||||
QStringList emoteString = iterator.value().toString().split('/');
|
QStringList emoteString = iterator.value().toString().split('/');
|
||||||
|
|
||||||
for (QString emote : emoteString) {
|
for (QString emote : emoteString) {
|
||||||
b.appendTwitchEmote(ircMessage, emote, twitchEmotes, emoteManager);
|
this->appendTwitchEmote(ircMessage, emote, twitchEmotes, emoteManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
bool operator()(const std::pair<long int, messages::LazyLoadedImage *> &a,
|
bool operator()(const std::pair<long int, messages::LazyLoadedImage *> &lhs,
|
||||||
const std::pair<long int, messages::LazyLoadedImage *> &b)
|
const std::pair<long int, messages::LazyLoadedImage *> &rhs)
|
||||||
{
|
{
|
||||||
return a.first < b.first;
|
return lhs.first < rhs.first;
|
||||||
}
|
}
|
||||||
} customLess;
|
} customLess;
|
||||||
|
|
||||||
@@ -162,10 +83,10 @@ SharedMessage TwitchMessageBuilder::parse(const Communi::IrcPrivateMessage *ircM
|
|||||||
auto currentTwitchEmote = twitchEmotes.begin();
|
auto currentTwitchEmote = twitchEmotes.begin();
|
||||||
|
|
||||||
// words
|
// words
|
||||||
QColor textColor = ircMessage->isAction() ? usernameColor : colorScheme.Text;
|
QColor textColor = ircMessage->isAction() ? this->usernameColor : this->colorScheme.Text;
|
||||||
|
|
||||||
const QString &originalMessage = ircMessage->content();
|
const QString &originalMessage = ircMessage->content();
|
||||||
b.originalMessage = originalMessage;
|
this->originalMessage = originalMessage;
|
||||||
QStringList splits = originalMessage.split(' ');
|
QStringList splits = originalMessage.split(' ');
|
||||||
|
|
||||||
long int i = 0;
|
long int i = 0;
|
||||||
@@ -173,12 +94,14 @@ SharedMessage TwitchMessageBuilder::parse(const Communi::IrcPrivateMessage *ircM
|
|||||||
for (QString split : splits) {
|
for (QString split : splits) {
|
||||||
// twitch emote
|
// twitch emote
|
||||||
if (currentTwitchEmote != twitchEmotes.end() && currentTwitchEmote->first == i) {
|
if (currentTwitchEmote != twitchEmotes.end() && currentTwitchEmote->first == i) {
|
||||||
b.appendWord(Word(currentTwitchEmote->second, Word::TwitchEmoteImage,
|
this->appendWord(
|
||||||
currentTwitchEmote->second->getName(),
|
Word(currentTwitchEmote->second, Word::TwitchEmoteImage,
|
||||||
currentTwitchEmote->second->getName() + QString("\nTwitch Emote")));
|
currentTwitchEmote->second->getName(),
|
||||||
b.appendWord(Word(currentTwitchEmote->second->getName(), Word::TwitchEmoteText,
|
currentTwitchEmote->second->getName() + QString("\nTwitch Emote")));
|
||||||
textColor, currentTwitchEmote->second->getName(),
|
this->appendWord(
|
||||||
currentTwitchEmote->second->getName() + QString("\nTwitch Emote")));
|
Word(currentTwitchEmote->second->getName(), Word::TwitchEmoteText, textColor,
|
||||||
|
currentTwitchEmote->second->getName(),
|
||||||
|
currentTwitchEmote->second->getName() + QString("\nTwitch Emote")));
|
||||||
|
|
||||||
i += split.length() + 1;
|
i += split.length() + 1;
|
||||||
currentTwitchEmote = std::next(currentTwitchEmote);
|
currentTwitchEmote = std::next(currentTwitchEmote);
|
||||||
@@ -231,31 +154,32 @@ SharedMessage TwitchMessageBuilder::parse(const Communi::IrcPrivateMessage *ircM
|
|||||||
QString("http://static-cdn.jtvnw.net/bits/dark/static/" + color + "/1");
|
QString("http://static-cdn.jtvnw.net/bits/dark/static/" + color + "/1");
|
||||||
|
|
||||||
LazyLoadedImage *imageAnimated = emoteManager.getMiscImageFromCache().getOrAdd(
|
LazyLoadedImage *imageAnimated = emoteManager.getMiscImageFromCache().getOrAdd(
|
||||||
bitsLinkAnimated, [&emoteManager, &windowManager, &bitsLinkAnimated] {
|
bitsLinkAnimated, [this, &bitsLinkAnimated] {
|
||||||
return new LazyLoadedImage(emoteManager, windowManager,
|
return new LazyLoadedImage(this->emoteManager, this->windowManager,
|
||||||
bitsLinkAnimated);
|
bitsLinkAnimated);
|
||||||
});
|
});
|
||||||
LazyLoadedImage *image = emoteManager.getMiscImageFromCache().getOrAdd(
|
LazyLoadedImage *image =
|
||||||
bitsLink, [&emoteManager, &windowManager, &bitsLink] {
|
emoteManager.getMiscImageFromCache().getOrAdd(bitsLink, [this, &bitsLink] {
|
||||||
return new LazyLoadedImage(emoteManager, windowManager, bitsLink);
|
return new LazyLoadedImage(this->emoteManager, this->windowManager,
|
||||||
|
bitsLink);
|
||||||
});
|
});
|
||||||
|
|
||||||
b.appendWord(Word(imageAnimated, Word::BitsAnimated, QString("cheer"),
|
this->appendWord(Word(imageAnimated, Word::BitsAnimated, QString("cheer"),
|
||||||
QString("Twitch Cheer"),
|
QString("Twitch Cheer"),
|
||||||
Link(Link::Url, QString("https://blog.twitch.tv/"
|
Link(Link::Url, QString("https://blog.twitch.tv/"
|
||||||
"introducing-cheering-celebrate-"
|
"introducing-cheering-celebrate-"
|
||||||
"together-da62af41fac6"))));
|
"together-da62af41fac6"))));
|
||||||
b.appendWord(Word(image, Word::BitsStatic, QString("cheer"),
|
this->appendWord(Word(image, Word::BitsStatic, QString("cheer"),
|
||||||
QString("Twitch Cheer"),
|
QString("Twitch Cheer"),
|
||||||
Link(Link::Url, QString("https://blog.twitch.tv/"
|
Link(Link::Url, QString("https://blog.twitch.tv/"
|
||||||
"introducing-cheering-celebrate-"
|
"introducing-cheering-celebrate-"
|
||||||
"together-da62af41fac6"))));
|
"together-da62af41fac6"))));
|
||||||
|
|
||||||
b.appendWord(Word(QString("x" + string.mid(5)), Word::BitsAmount, bitsColor,
|
this->appendWord(Word(QString("x" + string.mid(5)), Word::BitsAmount, bitsColor,
|
||||||
QString(string.mid(5)), QString("Twitch Cheer"),
|
QString(string.mid(5)), QString("Twitch Cheer"),
|
||||||
Link(Link::Url, QString("https://blog.twitch.tv/"
|
Link(Link::Url, QString("https://blog.twitch.tv/"
|
||||||
"introducing-cheering-celebrate-"
|
"introducing-cheering-celebrate-"
|
||||||
"together-da62af41fac6"))));
|
"together-da62af41fac6"))));
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -269,26 +193,26 @@ SharedMessage TwitchMessageBuilder::parse(const Communi::IrcPrivateMessage *ircM
|
|||||||
// Will match emote regardless of source (i.e. bttv, ffz)
|
// Will match emote regardless of source (i.e. bttv, ffz)
|
||||||
// Emote source + name: "bttv:nyanPls"
|
// Emote source + name: "bttv:nyanPls"
|
||||||
if (emoteManager.getBTTVEmotes().tryGet(string, bttvEmote) ||
|
if (emoteManager.getBTTVEmotes().tryGet(string, bttvEmote) ||
|
||||||
channel->getBttvChannelEmotes().tryGet(string, bttvEmote) ||
|
this->channel->getBttvChannelEmotes().tryGet(string, bttvEmote) ||
|
||||||
emoteManager.getFFZEmotes().tryGet(string, bttvEmote) ||
|
emoteManager.getFFZEmotes().tryGet(string, bttvEmote) ||
|
||||||
channel->getFfzChannelEmotes().tryGet(string, bttvEmote) ||
|
this->channel->getFfzChannelEmotes().tryGet(string, bttvEmote) ||
|
||||||
emoteManager.getChatterinoEmotes().tryGet(string, bttvEmote)) {
|
emoteManager.getChatterinoEmotes().tryGet(string, bttvEmote)) {
|
||||||
b.appendWord(Word(bttvEmote, Word::BttvEmoteImage, bttvEmote->getName(),
|
this->appendWord(Word(bttvEmote, Word::BttvEmoteImage, bttvEmote->getName(),
|
||||||
bttvEmote->getTooltip(),
|
bttvEmote->getTooltip(),
|
||||||
Link(Link::Url, bttvEmote->getUrl())));
|
Link(Link::Url, bttvEmote->getUrl())));
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// actually just a word
|
// actually just a word
|
||||||
QString link = b.matchLink(string);
|
QString link = this->matchLink(string);
|
||||||
|
|
||||||
b.appendWord(Word(string, Word::Text, textColor, string, QString(),
|
this->appendWord(Word(string, Word::Text, textColor, string, QString(),
|
||||||
link.isEmpty() ? Link() : Link(Link::Url, link)));
|
link.isEmpty() ? Link() : Link(Link::Url, link)));
|
||||||
} else { // is emoji
|
} else { // is emoji
|
||||||
static QString emojiTooltip("Emoji");
|
static QString emojiTooltip("Emoji");
|
||||||
|
|
||||||
b.appendWord(Word(image, Word::EmojiImage, image->getName(), emojiTooltip));
|
this->appendWord(Word(image, Word::EmojiImage, image->getName(), emojiTooltip));
|
||||||
Word(image->getName(), Word::EmojiText, textColor, image->getName(), emojiTooltip);
|
Word(image->getName(), Word::EmojiText, textColor, image->getName(), emojiTooltip);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -303,19 +227,92 @@ SharedMessage TwitchMessageBuilder::parse(const Communi::IrcPrivateMessage *ircM
|
|||||||
// HighlightTab = false;
|
// HighlightTab = false;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
return b.build();
|
return this->build();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TwitchMessageBuilder::appendModerationWords(const Communi::IrcPrivateMessage *ircMessage,
|
void TwitchMessageBuilder::parseMessageID()
|
||||||
const Resources &resources)
|
{
|
||||||
|
auto iterator = this->tags.find("id");
|
||||||
|
|
||||||
|
if (iterator != this->tags.end()) {
|
||||||
|
this->messageID = iterator.value().toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TwitchMessageBuilder::parseRoomID()
|
||||||
|
{
|
||||||
|
auto iterator = this->tags.find("room-id");
|
||||||
|
if (iterator != std::end(this->tags)) {
|
||||||
|
this->roomID = iterator.value().toString().toStdString();
|
||||||
|
|
||||||
|
if (this->channel->roomID.empty()) {
|
||||||
|
this->channel->roomID = this->roomID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TwitchMessageBuilder::parseChannelName()
|
||||||
|
{
|
||||||
|
QString channelName("#" + this->channel->getName());
|
||||||
|
this->appendWord(Word(channelName, Word::Misc, this->colorScheme.SystemMessageColor,
|
||||||
|
QString(channelName), QString(),
|
||||||
|
Link(Link::Url, this->channel->getName() + "\n" + this->messageID)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void TwitchMessageBuilder::parseUsername()
|
||||||
|
{
|
||||||
|
auto iterator = this->tags.find("color");
|
||||||
|
if (iterator != this->tags.end()) {
|
||||||
|
this->usernameColor = QColor(iterator.value().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
// username
|
||||||
|
this->userName = ircMessage->nick();
|
||||||
|
|
||||||
|
if (this->userName.isEmpty()) {
|
||||||
|
this->userName = this->tags.value(QLatin1String("login")).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString displayName;
|
||||||
|
|
||||||
|
iterator = this->tags.find("display-name");
|
||||||
|
if (iterator == this->tags.end()) {
|
||||||
|
displayName = this->userName;
|
||||||
|
} else {
|
||||||
|
displayName = iterator.value().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool hasLocalizedName = QString::compare(displayName, ircMessage->account()) == 0;
|
||||||
|
QString userDisplayString =
|
||||||
|
displayName + (hasLocalizedName ? (" (" + ircMessage->account() + ")") : QString());
|
||||||
|
|
||||||
|
if (this->args.isSentWhisper) {
|
||||||
|
// TODO(pajlada): Re-implement
|
||||||
|
// userDisplayString += IrcManager::getInstance().getUser().getUserName();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this->args.isReceivedWhisper) {
|
||||||
|
// TODO(pajlada): Re-implement
|
||||||
|
// userDisplayString += " -> " + IrcManager::getInstance().getUser().getUserName();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ircMessage->isAction()) {
|
||||||
|
userDisplayString += ": ";
|
||||||
|
}
|
||||||
|
|
||||||
|
this->appendWord(Word(userDisplayString, Word::Username, this->usernameColor, userDisplayString,
|
||||||
|
QString(), Link(Link::UserInfo, this->userName)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void TwitchMessageBuilder::appendModerationButtons()
|
||||||
{
|
{
|
||||||
// mod buttons
|
// mod buttons
|
||||||
static QString buttonBanTooltip("Ban user");
|
static QString buttonBanTooltip("Ban user");
|
||||||
static QString buttonTimeoutTooltip("Timeout user");
|
static QString buttonTimeoutTooltip("Timeout user");
|
||||||
|
|
||||||
this->appendWord(Word(resources.buttonBan, Word::ButtonBan, QString(), buttonBanTooltip,
|
this->appendWord(Word(this->resources.buttonBan, Word::ButtonBan, QString(), buttonBanTooltip,
|
||||||
Link(Link::UserBan, ircMessage->account())));
|
Link(Link::UserBan, ircMessage->account())));
|
||||||
this->appendWord(Word(resources.buttonTimeout, Word::ButtonTimeout, QString(),
|
this->appendWord(Word(this->resources.buttonTimeout, Word::ButtonTimeout, QString(),
|
||||||
buttonTimeoutTooltip, Link(Link::UserTimeout, ircMessage->account())));
|
buttonTimeoutTooltip, Link(Link::UserTimeout, ircMessage->account())));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,17 +355,26 @@ void TwitchMessageBuilder::appendTwitchEmote(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TwitchMessageBuilder::appendTwitchBadges(const QStringList &badges, Resources &resources,
|
void TwitchMessageBuilder::parseTwitchBadges()
|
||||||
EmoteManager &emoteManager,
|
|
||||||
const Resources::Channel &channelResources)
|
|
||||||
{
|
{
|
||||||
|
const auto &channelResources = this->resources.channels[this->roomID];
|
||||||
|
|
||||||
|
auto iterator = this->tags.find("badges");
|
||||||
|
|
||||||
|
if (iterator == this->tags.end()) {
|
||||||
|
// No badges in this message
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList badges = iterator.value().toString().split(',');
|
||||||
|
|
||||||
for (QString badge : badges) {
|
for (QString badge : badges) {
|
||||||
if (badge.isEmpty()) {
|
if (badge.isEmpty()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (badge.startsWith("bits/")) {
|
if (badge.startsWith("bits/")) {
|
||||||
if (!resources.dynamicBadgesLoaded) {
|
if (!this->resources.dynamicBadgesLoaded) {
|
||||||
// Do nothing
|
// Do nothing
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -377,7 +383,7 @@ void TwitchMessageBuilder::appendTwitchBadges(const QStringList &badges, Resourc
|
|||||||
std::string versionKey = cheerAmountQS.toStdString();
|
std::string versionKey = cheerAmountQS.toStdString();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
auto &badgeSet = resources.badgeSets.at("bits");
|
auto &badgeSet = this->resources.badgeSets.at("bits");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
auto &badgeVersion = badgeSet.versions.at(versionKey);
|
auto &badgeVersion = badgeSet.versions.at(versionKey);
|
||||||
@@ -395,33 +401,33 @@ void TwitchMessageBuilder::appendTwitchBadges(const QStringList &badges, Resourc
|
|||||||
<< ". Exception: " << e.what();
|
<< ". Exception: " << e.what();
|
||||||
}
|
}
|
||||||
} else if (badge == "staff/1") {
|
} else if (badge == "staff/1") {
|
||||||
appendWord(Word(resources.badgeStaff, Word::BadgeGlobalAuthority, QString(),
|
appendWord(Word(this->resources.badgeStaff, Word::BadgeGlobalAuthority, QString(),
|
||||||
QString("Twitch Staff")));
|
QString("Twitch Staff")));
|
||||||
} else if (badge == "admin/1") {
|
} else if (badge == "admin/1") {
|
||||||
appendWord(Word(resources.badgeAdmin, Word::BadgeGlobalAuthority, QString(),
|
appendWord(Word(this->resources.badgeAdmin, Word::BadgeGlobalAuthority, QString(),
|
||||||
QString("Twitch Admin")));
|
QString("Twitch Admin")));
|
||||||
} else if (badge == "global_mod/1") {
|
} else if (badge == "global_mod/1") {
|
||||||
appendWord(Word(resources.badgeGlobalModerator, Word::BadgeGlobalAuthority, QString(),
|
appendWord(Word(this->resources.badgeGlobalModerator, Word::BadgeGlobalAuthority,
|
||||||
QString("Global Moderator")));
|
QString(), QString("Global Moderator")));
|
||||||
} else if (badge == "moderator/1") {
|
} else if (badge == "moderator/1") {
|
||||||
// TODO: Implement custom FFZ moderator badge
|
// TODO: Implement custom FFZ moderator badge
|
||||||
appendWord(Word(resources.badgeModerator, Word::BadgeChannelAuthority, QString(),
|
appendWord(Word(this->resources.badgeModerator, Word::BadgeChannelAuthority, QString(),
|
||||||
QString("Channel Moderator"))); // custom badge
|
QString("Channel Moderator"))); // custom badge
|
||||||
} else if (badge == "turbo/1") {
|
} else if (badge == "turbo/1") {
|
||||||
appendWord(Word(resources.badgeTurbo, Word::BadgeVanity, QString(),
|
appendWord(Word(this->resources.badgeTurbo, Word::BadgeVanity, QString(),
|
||||||
QString("Turbo Subscriber")));
|
QString("Turbo Subscriber")));
|
||||||
} else if (badge == "broadcaster/1") {
|
} else if (badge == "broadcaster/1") {
|
||||||
appendWord(Word(resources.badgeBroadcaster, Word::BadgeChannelAuthority, QString(),
|
appendWord(Word(this->resources.badgeBroadcaster, Word::BadgeChannelAuthority,
|
||||||
QString("Channel Broadcaster")));
|
QString(), QString("Channel Broadcaster")));
|
||||||
} else if (badge == "premium/1") {
|
} else if (badge == "premium/1") {
|
||||||
appendWord(Word(resources.badgePremium, Word::BadgeVanity, QString(),
|
appendWord(Word(this->resources.badgePremium, Word::BadgeVanity, QString(),
|
||||||
QString("Twitch Prime")));
|
QString("Twitch Prime")));
|
||||||
|
|
||||||
} else if (badge.startsWith("partner/")) {
|
} else if (badge.startsWith("partner/")) {
|
||||||
int index = badge.midRef(8).toInt();
|
int index = badge.midRef(8).toInt();
|
||||||
switch (index) {
|
switch (index) {
|
||||||
case 1: {
|
case 1: {
|
||||||
appendWord(Word(resources.badgeVerified, Word::BadgeVanity, QString(),
|
appendWord(Word(this->resources.badgeVerified, Word::BadgeVanity, QString(),
|
||||||
"Twitch Verified"));
|
"Twitch Verified"));
|
||||||
} break;
|
} break;
|
||||||
default: {
|
default: {
|
||||||
@@ -454,7 +460,7 @@ void TwitchMessageBuilder::appendTwitchBadges(const QStringList &badges, Resourc
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (!resources.dynamicBadgesLoaded) {
|
if (!this->resources.dynamicBadgesLoaded) {
|
||||||
// Do nothing
|
// Do nothing
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -472,7 +478,7 @@ void TwitchMessageBuilder::appendTwitchBadges(const QStringList &badges, Resourc
|
|||||||
std::string versionKey = parts[1].toStdString();
|
std::string versionKey = parts[1].toStdString();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
auto &badgeSet = resources.badgeSets.at(badgeSetKey);
|
auto &badgeSet = this->resources.badgeSets.at(badgeSetKey);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
auto &badgeVersion = badgeSet.versions.at(versionKey);
|
auto &badgeVersion = badgeSet.versions.at(versionKey);
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "channel.hpp"
|
|
||||||
#include "messages/messagebuilder.hpp"
|
#include "messages/messagebuilder.hpp"
|
||||||
#include "resources.hpp"
|
#include "resources.hpp"
|
||||||
|
|
||||||
@@ -11,34 +10,55 @@ namespace chatterino {
|
|||||||
|
|
||||||
class EmoteManager;
|
class EmoteManager;
|
||||||
class WindowManager;
|
class WindowManager;
|
||||||
|
class Channel;
|
||||||
|
class ColorScheme;
|
||||||
|
|
||||||
namespace twitch {
|
namespace twitch {
|
||||||
|
|
||||||
class TwitchMessageBuilder : public messages::MessageBuilder
|
class TwitchMessageBuilder : public messages::MessageBuilder
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TwitchMessageBuilder();
|
TwitchMessageBuilder() = delete;
|
||||||
|
|
||||||
QString messageId;
|
explicit TwitchMessageBuilder(Channel *_channel, Resources &_resources,
|
||||||
|
EmoteManager &_emoteManager, WindowManager &_windowManager,
|
||||||
|
const Communi::IrcPrivateMessage *_ircMessage,
|
||||||
|
const messages::MessageParseArgs &_args);
|
||||||
|
|
||||||
|
Channel *channel;
|
||||||
|
Resources &resources;
|
||||||
|
WindowManager &windowManager;
|
||||||
|
ColorScheme &colorScheme;
|
||||||
|
EmoteManager &emoteManager;
|
||||||
|
const Communi::IrcPrivateMessage *ircMessage;
|
||||||
|
messages::MessageParseArgs args;
|
||||||
|
const QVariantMap tags;
|
||||||
|
|
||||||
|
QString messageID;
|
||||||
QString userName;
|
QString userName;
|
||||||
|
|
||||||
static messages::SharedMessage parse(const Communi::IrcPrivateMessage *ircMessage,
|
messages::SharedMessage parse();
|
||||||
Channel *channel, const messages::MessageParseArgs &args,
|
|
||||||
Resources &resources, EmoteManager &emoteManager,
|
|
||||||
WindowManager &windowManager);
|
|
||||||
|
|
||||||
// static bool sortTwitchEmotes(
|
// static bool sortTwitchEmotes(
|
||||||
// const std::pair<long int, messages::LazyLoadedImage *> &a,
|
// const std::pair<long int, messages::LazyLoadedImage *> &a,
|
||||||
// const std::pair<long int, messages::LazyLoadedImage *> &b);
|
// const std::pair<long int, messages::LazyLoadedImage *> &b);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void appendModerationWords(const Communi::IrcPrivateMessage *ircMessage,
|
std::string roomID;
|
||||||
const Resources &resources);
|
|
||||||
|
QColor usernameColor;
|
||||||
|
|
||||||
|
void parseMessageID();
|
||||||
|
void parseRoomID();
|
||||||
|
void parseChannelName();
|
||||||
|
void parseUsername();
|
||||||
|
|
||||||
|
void appendModerationButtons();
|
||||||
void appendTwitchEmote(const Communi::IrcPrivateMessage *ircMessage, const QString &emote,
|
void appendTwitchEmote(const Communi::IrcPrivateMessage *ircMessage, const QString &emote,
|
||||||
std::vector<std::pair<long int, messages::LazyLoadedImage *>> &vec,
|
std::vector<std::pair<long int, messages::LazyLoadedImage *>> &vec,
|
||||||
EmoteManager &emoteManager);
|
EmoteManager &emoteManager);
|
||||||
void appendTwitchBadges(const QStringList &badges, Resources &resources,
|
|
||||||
EmoteManager &emoteManager, const Resources::Channel &channelResources);
|
void parseTwitchBadges();
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace twitch
|
} // namespace twitch
|
||||||
|
|||||||
Reference in New Issue
Block a user