Files
chatterino2/src/providers/seventv/eventapi/Subscription.hpp
pajlada e327ed4166 Update magic_enum from v0.9.3 to v0.9.5 (#4992)
* Fix include path for magic enum
* Update .clang-format to ensure magic enum is caught as a third party library
2023-12-01 15:03:04 +01:00

161 lines
4.2 KiB
C++

#pragma once
#include <magic_enum/magic_enum.hpp>
#include <QByteArray>
#include <QHash>
#include <QJsonObject>
#include <QString>
#include <variant>
namespace chatterino::seventv::eventapi {
// https://github.com/SevenTV/EventAPI/tree/ca4ff15cc42b89560fa661a76c5849047763d334#subscription-types
enum class SubscriptionType {
AnyEmoteSet,
CreateEmoteSet,
UpdateEmoteSet,
UpdateUser,
AnyCosmetic,
CreateCosmetic,
UpdateCosmetic,
DeleteCosmetic,
AnyEntitlement,
CreateEntitlement,
UpdateEntitlement,
DeleteEntitlement,
INVALID,
};
// https://github.com/SevenTV/EventAPI/tree/ca4ff15cc42b89560fa661a76c5849047763d334#opcodes
enum class Opcode {
Dispatch = 0,
Hello = 1,
Heartbeat = 2,
Reconnect = 4,
Ack = 5,
Error = 6,
EndOfStream = 7,
Identify = 33,
Resume = 34,
Subscribe = 35,
Unsubscribe = 36,
Signal = 37,
};
struct ObjectIDCondition {
ObjectIDCondition(QString objectID);
QString objectID;
QJsonObject encode() const;
friend QDebug &operator<<(QDebug &dbg, const ObjectIDCondition &condition);
bool operator==(const ObjectIDCondition &rhs) const;
bool operator!=(const ObjectIDCondition &rhs) const;
};
struct ChannelCondition {
ChannelCondition(QString twitchID);
QString twitchID;
QJsonObject encode() const;
friend QDebug &operator<<(QDebug &dbg, const ChannelCondition &condition);
bool operator==(const ChannelCondition &rhs) const;
bool operator!=(const ChannelCondition &rhs) const;
};
using Condition = std::variant<ObjectIDCondition, ChannelCondition>;
struct Subscription {
bool operator==(const Subscription &rhs) const;
bool operator!=(const Subscription &rhs) const;
Condition condition;
SubscriptionType type;
QByteArray encodeSubscribe() const;
QByteArray encodeUnsubscribe() const;
friend QDebug &operator<<(QDebug &dbg, const Subscription &subscription);
};
} // namespace chatterino::seventv::eventapi
template <>
constexpr magic_enum::customize::customize_t magic_enum::customize::enum_name<
chatterino::seventv::eventapi::SubscriptionType>(
chatterino::seventv::eventapi::SubscriptionType value) noexcept
{
using chatterino::seventv::eventapi::SubscriptionType;
switch (value)
{
case SubscriptionType::AnyEmoteSet:
return "emote_set.*";
case SubscriptionType::CreateEmoteSet:
return "emote_set.create";
case SubscriptionType::UpdateEmoteSet:
return "emote_set.update";
case SubscriptionType::UpdateUser:
return "user.update";
case SubscriptionType::AnyCosmetic:
return "cosmetic.*";
case SubscriptionType::CreateCosmetic:
return "cosmetic.create";
case SubscriptionType::UpdateCosmetic:
return "cosmetic.update";
case SubscriptionType::DeleteCosmetic:
return "cosmetic.delete";
case SubscriptionType::AnyEntitlement:
return "entitlement.*";
case SubscriptionType::CreateEntitlement:
return "entitlement.create";
case SubscriptionType::UpdateEntitlement:
return "entitlement.update";
case SubscriptionType::DeleteEntitlement:
return "entitlement.delete";
default:
return default_tag;
}
}
namespace std {
template <>
struct hash<chatterino::seventv::eventapi::ObjectIDCondition> {
size_t operator()(
const chatterino::seventv::eventapi::ObjectIDCondition &c) const
{
return (size_t)qHash(c.objectID);
}
};
template <>
struct hash<chatterino::seventv::eventapi::ChannelCondition> {
size_t operator()(
const chatterino::seventv::eventapi::ChannelCondition &c) const
{
return qHash(c.twitchID);
}
};
template <>
struct hash<chatterino::seventv::eventapi::Subscription> {
size_t operator()(
const chatterino::seventv::eventapi::Subscription &sub) const
{
const size_t conditionHash =
std::hash<chatterino::seventv::eventapi::Condition>{}(
sub.condition);
return (size_t)qHash(conditionHash, qHash((int)sub.type));
}
};
} // namespace std