mirror of
https://github.com/Chatterino/chatterino2.git
synced 2024-11-13 19:49:51 +01:00
add replaced emotes into twitchEmotes
This commit is contained in:
parent
a63454f00d
commit
e8e059f847
|
@ -42,10 +42,15 @@ public:
|
|||
QRegularExpression::UseUnicodePropertiesOption);
|
||||
}
|
||||
|
||||
/*const auto &accvec = getApp()->accounts->twitch.accounts.getVector();
|
||||
const auto &accvec = getApp()->accounts->twitch.accounts.getVector();
|
||||
for (const auto &acc : accvec) {
|
||||
//
|
||||
}*/
|
||||
const auto &accemotes = *acc->accessEmotes();
|
||||
for (const auto &emote : accemotes.emotes) {
|
||||
if (this->replace_.contains(emote.first.string, Qt::CaseSensitive)) {
|
||||
this->emotes_.emplace(emote.first, emote.second);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const QString &getPattern() const
|
||||
|
@ -95,6 +100,16 @@ public:
|
|||
return this->isCaseSensitive_ ? Qt::CaseSensitive : Qt::CaseInsensitive;
|
||||
}
|
||||
|
||||
const std::unordered_map<EmoteName, EmotePtr> &getEmotes() const
|
||||
{
|
||||
return this->emotes_;
|
||||
}
|
||||
|
||||
bool containsEmote() const
|
||||
{
|
||||
return !this->emotes_.empty();
|
||||
}
|
||||
|
||||
private:
|
||||
QString pattern_;
|
||||
bool isRegex_;
|
||||
|
@ -102,7 +117,7 @@ private:
|
|||
bool isBlock_;
|
||||
QString replace_;
|
||||
bool isCaseSensitive_;
|
||||
std::map<QString, EmotePtr> emotes;
|
||||
std::unordered_map<EmoteName, EmotePtr> emotes_;
|
||||
};
|
||||
} // namespace chatterino
|
||||
|
||||
|
|
|
@ -167,7 +167,11 @@ MessagePtr TwitchMessageBuilder::build()
|
|||
twitchEmotes.begin(), twitchEmotes.end(), [&pos, &len](const auto &item) {
|
||||
return ((std::get<0>(item) >= pos) && std::get<0>(item) < (pos + len));
|
||||
});
|
||||
|
||||
for (; it != twitchEmotes.end(); ++it) {
|
||||
if (std::get<1>(*it) == nullptr) {
|
||||
log("remem nullptr {}", std::get<2>(*it).string);
|
||||
}
|
||||
}
|
||||
std::vector<std::tuple<int, EmotePtr, EmoteName>> v(it, twitchEmotes.end());
|
||||
twitchEmotes.erase(it, twitchEmotes.end());
|
||||
return v;
|
||||
|
@ -182,6 +186,27 @@ MessagePtr TwitchMessageBuilder::build()
|
|||
}
|
||||
};
|
||||
|
||||
auto addReplEmotes = [&twitchEmotes](const IgnorePhrase &phrase, const QString &midrepl,
|
||||
int startIndex) mutable {
|
||||
if (!phrase.containsEmote()) {
|
||||
return;
|
||||
}
|
||||
QStringList words = midrepl.split(' ');
|
||||
int pos = 0;
|
||||
for (const auto &word : words) {
|
||||
for (const auto &emote : phrase.getEmotes()) {
|
||||
if (word == emote.first.string) {
|
||||
if (emote.second == nullptr) {
|
||||
log("emote null {}", emote.first.string);
|
||||
}
|
||||
twitchEmotes.push_back(std::tuple<int, EmotePtr, EmoteName>{
|
||||
startIndex + pos, emote.second, emote.first});
|
||||
}
|
||||
}
|
||||
pos += word.length() + 1;
|
||||
}
|
||||
};
|
||||
|
||||
for (const auto &phrase : phrases) {
|
||||
if (phrase.isBlock()) {
|
||||
continue;
|
||||
|
@ -204,6 +229,9 @@ MessagePtr TwitchMessageBuilder::build()
|
|||
// mb in IgnoredPhrase ??
|
||||
|
||||
for (auto &tup : vret) {
|
||||
if (std::get<1>(tup) == nullptr) {
|
||||
log("v nullptr {}", std::get<2>(tup).string);
|
||||
}
|
||||
int index = 0;
|
||||
const auto &emote = std::get<2>(tup);
|
||||
while ((index = mid.indexOf(emote.string, index)) != -1) {
|
||||
|
@ -212,6 +240,9 @@ MessagePtr TwitchMessageBuilder::build()
|
|||
twitchEmotes.push_back(tup);
|
||||
}
|
||||
}
|
||||
|
||||
addReplEmotes(phrase, mid, from);
|
||||
|
||||
this->originalMessage_.replace(from, len, mid);
|
||||
int midsize = mid.size();
|
||||
from += midsize;
|
||||
|
@ -234,6 +265,9 @@ MessagePtr TwitchMessageBuilder::build()
|
|||
// mb in IgnoredPhrase ??
|
||||
|
||||
for (auto &tup : vret) {
|
||||
if (std::get<1>(tup) == nullptr) {
|
||||
log("v nullptr {}", std::get<2>(tup).string);
|
||||
}
|
||||
int index = 0;
|
||||
const auto &emote = std::get<2>(tup);
|
||||
while ((index = replace.indexOf(emote.string, index)) != -1) {
|
||||
|
@ -242,6 +276,9 @@ MessagePtr TwitchMessageBuilder::build()
|
|||
twitchEmotes.push_back(tup);
|
||||
}
|
||||
}
|
||||
|
||||
addReplEmotes(phrase, replace, from);
|
||||
|
||||
this->originalMessage_.replace(from, len, replace);
|
||||
int replacesize = replace.size();
|
||||
from += replacesize;
|
||||
|
@ -252,6 +289,11 @@ MessagePtr TwitchMessageBuilder::build()
|
|||
|
||||
std::sort(twitchEmotes.begin(), twitchEmotes.end(),
|
||||
[](const auto &a, const auto &b) { return std::get<0>(a) < std::get<0>(b); });
|
||||
twitchEmotes.erase(std::unique(twitchEmotes.begin(), twitchEmotes.end(),
|
||||
[](const auto &first, const auto &second) {
|
||||
return std::get<0>(first) == std::get<0>(second);
|
||||
}),
|
||||
twitchEmotes.end());
|
||||
auto currentTwitchEmote = twitchEmotes.begin();
|
||||
|
||||
// words
|
||||
|
@ -274,6 +316,9 @@ void TwitchMessageBuilder::addWords(
|
|||
// check if it's a twitch emote twitch emote
|
||||
if (currentTwitchEmote != twitchEmotes.end() && std::get<0>(*currentTwitchEmote) == i) {
|
||||
auto emoteImage = std::get<1>(*currentTwitchEmote);
|
||||
if (emoteImage == nullptr) {
|
||||
log("emoteImage nullptr {}", std::get<2>(*currentTwitchEmote).string);
|
||||
}
|
||||
this->emplace<EmoteElement>(emoteImage, MessageElementFlag::TwitchEmote);
|
||||
|
||||
i += word.length() + 1;
|
||||
|
@ -689,9 +734,12 @@ void TwitchMessageBuilder::appendTwitchEmote(const Communi::IrcMessage *ircMessa
|
|||
}
|
||||
|
||||
auto name = EmoteName{this->originalMessage_.mid(start, end - start + 1)};
|
||||
|
||||
vec.push_back(std::tuple<int, EmotePtr, EmoteName>{
|
||||
start, app->emotes->twitch.getOrCreateEmote(id, name), name});
|
||||
auto tup = std::tuple<int, EmotePtr, EmoteName>{
|
||||
start, app->emotes->twitch.getOrCreateEmote(id, name), name};
|
||||
if (std::get<1>(tup) == nullptr) {
|
||||
log("nullptr {}", std::get<2>(tup).string);
|
||||
}
|
||||
vec.push_back(std::move(tup));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue