mirror-chatterino2/src/providers/twitch/TwitchEmotes.cpp

75 lines
2.2 KiB
C++
Raw Normal View History

2018-06-26 14:09:39 +02:00
#include "providers/twitch/TwitchEmotes.hpp"
2018-07-15 14:11:46 +02:00
#include "common/NetworkRequest.hpp"
2018-06-26 17:06:17 +02:00
#include "debug/Benchmark.hpp"
2018-06-26 14:09:39 +02:00
#include "debug/Log.hpp"
#include "messages/Emote.hpp"
2018-06-26 14:09:39 +02:00
#include "messages/Image.hpp"
#include "util/RapidjsonHelpers.hpp"
namespace chatterino {
TwitchEmotes::TwitchEmotes()
{
}
// id is used for lookup
// emoteName is used for giving a name to the emote in case it doesn't exist
2018-08-06 21:17:03 +02:00
EmotePtr TwitchEmotes::getOrCreateEmote(const EmoteId &id,
const EmoteName &name_)
{
2018-08-02 14:23:27 +02:00
static QMap<QString, QString> replacements{
2018-08-06 21:17:03 +02:00
{"[oO](_|\\.)[oO]", "O_o"}, {"\\&gt\\;\\(", "&gt;("},
{"\\&lt\\;3", "&lt;3"}, {"\\:-?(o|O)", ":O"},
{"\\:-?(p|P)", ":P"}, {"\\:-?[\\\\/]", ":/"},
{"\\:-?[z|Z|\\|]", ":Z"}, {"\\:-?\\(", ":("},
{"\\:-?\\)", ":)"}, {"\\:-?D", ":D"},
{"\\;-?(p|P)", ";P"}, {"\\;-?\\)", ";)"},
{"R-?\\)", "R)"}, {"B-?\\)", "B)"},
};
2018-08-02 14:23:27 +02:00
auto name = name_.string;
name.detach();
2018-08-02 14:23:27 +02:00
// replace < >
name.replace("<", "&lt;");
name.replace(">", "&gt;");
2018-08-02 14:23:27 +02:00
// replace regexes
auto it = replacements.find(name);
if (it != replacements.end()) {
name = it.value();
}
2018-08-02 14:23:27 +02:00
// search in cache or create new emote
auto cache = this->twitchEmotesCache_.access();
auto shared = (*cache)[id].lock();
if (!shared) {
2018-08-06 21:17:03 +02:00
(*cache)[id] = shared = std::make_shared<Emote>(
Emote{EmoteName{name},
ImageSet{
Image::fromUrl(getEmoteLink(id, "1.0"), 1),
Image::fromUrl(getEmoteLink(id, "2.0"), 0.5),
Image::fromUrl(getEmoteLink(id, "3.0"), 0.25),
},
Tooltip{name + "<br>Twitch Emote"}, Url{}});
2018-08-02 14:23:27 +02:00
}
2018-08-02 14:23:27 +02:00
return shared;
}
2018-08-02 14:23:27 +02:00
Url TwitchEmotes::getEmoteLink(const EmoteId &id, const QString &emoteScale)
{
2018-08-06 21:17:03 +02:00
return {QString(TWITCH_EMOTE_TEMPLATE)
.replace("{id}", id.string)
.replace("{scale}", emoteScale)};
}
2018-08-02 14:23:27 +02:00
AccessGuard<std::unordered_map<EmoteName, EmotePtr>> TwitchEmotes::accessAll()
{
2018-08-02 14:23:27 +02:00
return this->twitchEmotes_.access();
}
} // namespace chatterino