Skip to content

Commit

Permalink
Support using follower emotes outside of channel if subbed (#4922)
Browse files Browse the repository at this point in the history
If we also have a subscriber emote set for a channel, then don't treat
a follower emote set as local to that channel.

Co-authored-by: iProdigy <8106344+iProdigy@users.noreply.github.com>
  • Loading branch information
baines and iProdigy authored Nov 4, 2023
1 parent e4c4635 commit 879a63e
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 4 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

## Unversioned

- Major: Allow use of Twitch follower emotes in other channels if subscribed. (#4922)
- Minor: Migrate to the new Get Channel Followers Helix endpoint, fixing follower count not showing up in usercards. (#4809)
- Minor: The account switcher is now styled to match your theme. (#4817)
- Minor: Add an invisible resize handle to the bottom of frameless user info popups and reply thread popups. (#4795)
Expand Down
38 changes: 34 additions & 4 deletions src/providers/twitch/TwitchAccount.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -264,11 +264,32 @@ void TwitchAccount::loadUserstateEmotes(std::weak_ptr<Channel> weakChannel)
[this, weakChannel](QJsonArray emoteSetArray) {
auto emoteData = this->emotes_.access();
auto localEmoteData = this->localEmotes_.access();
for (auto emoteSet_ : emoteSetArray)

std::unordered_set<QString> subscriberChannelIDs;
std::vector<IvrEmoteSet> ivrEmoteSets;
ivrEmoteSets.reserve(emoteSetArray.size());

for (auto emoteSet : emoteSetArray)
{
auto emoteSet = std::make_shared<EmoteSet>();
IvrEmoteSet ivrEmoteSet(emoteSet.toObject());
if (!ivrEmoteSet.tier.isNull())
{
subscriberChannelIDs.insert(ivrEmoteSet.channelId);
}
ivrEmoteSets.emplace_back(ivrEmoteSet);
}

for (const auto &emoteSet : emoteData->emoteSets)
{
if (emoteSet->subscriber)
{
subscriberChannelIDs.insert(emoteSet->channelID);
}
}

IvrEmoteSet ivrEmoteSet(emoteSet_.toObject());
for (const auto &ivrEmoteSet : ivrEmoteSets)
{
auto emoteSet = std::make_shared<EmoteSet>();

QString setKey = ivrEmoteSet.setId;
emoteSet->key = setKey;
Expand All @@ -285,8 +306,15 @@ void TwitchAccount::loadUserstateEmotes(std::weak_ptr<Channel> weakChannel)
continue;
}

emoteSet->channelID = ivrEmoteSet.channelId;
emoteSet->channelName = ivrEmoteSet.login;
emoteSet->text = ivrEmoteSet.displayName;
emoteSet->subscriber = !ivrEmoteSet.tier.isNull();

// NOTE: If a user does not have a subscriber emote set, but a follower emote set, this logic will be wrong
// However, that's not a realistic problem.
bool haveSubscriberSetForChannel =
subscriberChannelIDs.contains(ivrEmoteSet.channelId);

for (const auto &emoteObj : ivrEmoteSet.emotes)
{
Expand All @@ -302,7 +330,9 @@ void TwitchAccount::loadUserstateEmotes(std::weak_ptr<Channel> weakChannel)
getApp()->emotes->twitch.getOrCreateEmote(id, code);

// Follower emotes can be only used in their origin channel
if (ivrEmote.emoteType == "FOLLOWER")
// unless the user is subscribed, then they can be used anywhere.
if (ivrEmote.emoteType == "FOLLOWER" &&
!haveSubscriberSetForChannel)
{
emoteSet->local = true;

Expand Down
2 changes: 2 additions & 0 deletions src/providers/twitch/TwitchAccount.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@ class TwitchAccount : public Account
struct EmoteSet {
QString key;
QString channelName;
QString channelID;
QString text;
bool subscriber{false};
bool local{false};
std::vector<TwitchEmote> emotes;
};
Expand Down

0 comments on commit 879a63e

Please sign in to comment.