Display authors name on hover for supported emotes (FFZ only for now) (#1721)

Co-authored-by: Paweł <44851575+zneix@users.noreply.github.com>
This commit is contained in:
Roger Chavez 2020-06-13 05:15:22 -07:00 committed by GitHub
parent f3f8b2d024
commit 1eeb09a78e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 24 additions and 9 deletions

View file

@ -34,3 +34,4 @@ QStringAlias(Url);
QStringAlias(Tooltip); QStringAlias(Tooltip);
QStringAlias(EmoteId); QStringAlias(EmoteId);
QStringAlias(EmoteName); QStringAlias(EmoteName);
QStringAlias(EmoteAuthor);

View file

@ -65,11 +65,12 @@ namespace {
return {Success, std::move(emotes)}; return {Success, std::move(emotes)};
} }
std::pair<Outcome, EmoteMap> parseChannelEmotes(const QJsonObject &jsonRoot) std::pair<Outcome, EmoteMap> parseChannelEmotes(const QJsonObject &jsonRoot,
const QString &userName)
{ {
auto emotes = EmoteMap(); auto emotes = EmoteMap();
auto innerParse = [&jsonRoot, &emotes](const char *key) { auto innerParse = [&jsonRoot, &emotes, &userName](const char *key) {
auto jsonEmotes = jsonRoot.value(key).toArray(); auto jsonEmotes = jsonRoot.value(key).toArray();
for (auto jsonEmote_ : jsonEmotes) for (auto jsonEmote_ : jsonEmotes)
{ {
@ -77,6 +78,10 @@ namespace {
auto id = EmoteId{jsonEmote.value("id").toString()}; auto id = EmoteId{jsonEmote.value("id").toString()};
auto name = EmoteName{jsonEmote.value("code").toString()}; auto name = EmoteName{jsonEmote.value("code").toString()};
auto author = EmoteAuthor{jsonEmote.value("user")
.toObject()
.value("name")
.toString()};
// emoteObject.value("imageType").toString(); // emoteObject.value("imageType").toString();
auto emote = Emote({ auto emote = Emote({
@ -86,7 +91,10 @@ namespace {
Image::fromUrl(getEmoteLinkV3(id, "2x"), 0.5), Image::fromUrl(getEmoteLinkV3(id, "2x"), 0.5),
Image::fromUrl(getEmoteLinkV3(id, "3x"), 0.25), Image::fromUrl(getEmoteLinkV3(id, "3x"), 0.25),
}, },
Tooltip{name.string + "<br />Channel BetterTTV Emote"}, Tooltip{name.string + "<br>Channel BetterTTV Emote" +
((author.string.isEmpty())
? "<br>By: " + userName.toUtf8()
: "<br>By: " + author.string)},
Url{emoteLinkFormat.arg(id.string)}, Url{emoteLinkFormat.arg(id.string)},
}); });
@ -140,15 +148,15 @@ void BttvEmotes::loadEmotes()
} }
void BttvEmotes::loadChannel(std::weak_ptr<Channel> channel, void BttvEmotes::loadChannel(std::weak_ptr<Channel> channel,
const QString &channelId, const QString &channelId, const QString &userName,
std::function<void(EmoteMap &&)> callback, std::function<void(EmoteMap &&)> callback,
bool manualRefresh) bool manualRefresh)
{ {
NetworkRequest(QString(bttvChannelEmoteApiUrl) + channelId) NetworkRequest(QString(bttvChannelEmoteApiUrl) + channelId)
.timeout(3000) .timeout(3000)
.onSuccess([callback = std::move(callback), channel, .onSuccess([callback = std::move(callback), channel, &userName,
manualRefresh](auto result) -> Outcome { manualRefresh](auto result) -> Outcome {
auto pair = parseChannelEmotes(result.parseJson()); auto pair = parseChannelEmotes(result.parseJson(), userName);
if (pair.first) if (pair.first)
callback(std::move(pair.second)); callback(std::move(pair.second));
if (auto shared = channel.lock(); manualRefresh) if (auto shared = channel.lock(); manualRefresh)

View file

@ -26,7 +26,7 @@ public:
boost::optional<EmotePtr> emote(const EmoteName &name) const; boost::optional<EmotePtr> emote(const EmoteName &name) const;
void loadEmotes(); void loadEmotes();
static void loadChannel(std::weak_ptr<Channel> channel, static void loadChannel(std::weak_ptr<Channel> channel,
const QString &channelId, const QString &channelId, const QString &userName,
std::function<void(EmoteMap &&)> callback, std::function<void(EmoteMap &&)> callback,
bool manualRefresh); bool manualRefresh);

View file

@ -128,11 +128,17 @@ namespace {
auto id = auto id =
EmoteId{QString::number(jsonEmote.value("id").toInt())}; EmoteId{QString::number(jsonEmote.value("id").toInt())};
auto name = EmoteName{jsonEmote.value("name").toString()}; auto name = EmoteName{jsonEmote.value("name").toString()};
auto author = EmoteAuthor{jsonEmote.value("owner")
.toObject()
.value("display_name")
.toString()};
auto urls = jsonEmote.value("urls").toObject(); auto urls = jsonEmote.value("urls").toObject();
Emote emote; Emote emote;
fillInEmoteData(urls, name, fillInEmoteData(urls, name,
name.string + "<br/>Channel FFZ Emote", emote); name.string + "<br/>Channel FFZ Emote" +
"<br />By: " + author.string,
emote);
emote.homePage = emote.homePage =
Url{QString("https://www.frankerfacez.com/emoticon/%1-%2") Url{QString("https://www.frankerfacez.com/emoticon/%1-%2")
.arg(id.string) .arg(id.string)

View file

@ -159,7 +159,7 @@ bool TwitchChannel::canSendMessage() const
void TwitchChannel::refreshBTTVChannelEmotes(bool manualRefresh) void TwitchChannel::refreshBTTVChannelEmotes(bool manualRefresh)
{ {
BttvEmotes::loadChannel( BttvEmotes::loadChannel(
weakOf<Channel>(this), this->roomId(), weakOf<Channel>(this), this->roomId(), this->getName(),
[this, weak = weakOf<Channel>(this)](auto &&emoteMap) { [this, weak = weakOf<Channel>(this)](auto &&emoteMap) {
if (auto shared = weak.lock()) if (auto shared = weak.lock())
this->bttvEmotes_.set( this->bttvEmotes_.set(