refactor(eventsub): use variants for sum types (#5930)

This commit is contained in:
nerix
2025-02-08 14:33:29 +01:00
committed by GitHub
parent 0d02a6344b
commit 992f9195a7
25 changed files with 925 additions and 684 deletions
@@ -0,0 +1,20 @@
#pragma once
#include <string_view>
namespace chatterino::eventsub::lib::detail {
template <typename T>
consteval std::string_view fieldFor()
{
return T::TAG;
}
template <typename T>
consteval std::string_view fieldFor()
requires requires { T::FIELD; }
{
return T::FIELD;
}
} // namespace chatterino::eventsub::lib::detail
@@ -13,7 +13,8 @@ enum class Kind : int {
ExpectedString,
UnknownEnumValue,
InnerRootMissing,
NoMessageHandler
NoMessageHandler,
UnknownVariant,
};
class ApplicationErrorCategory final : public boost::system::error_category
@@ -44,12 +44,16 @@ struct MessageFragment {
};
struct Subcription {
static constexpr std::string_view TAG = "sub";
std::string subTier;
bool isPrime;
int durationMonths;
};
struct Resubscription {
static constexpr std::string_view TAG = "resub";
int cumulativeMonths;
int durationMonths;
std::optional<int> streakMonths;
@@ -63,6 +67,8 @@ struct Resubscription {
};
struct GiftSubscription {
static constexpr std::string_view TAG = "sub_gift";
int durationMonths;
std::optional<int> cumulativeTotal;
std::optional<int> streakMonths;
@@ -74,6 +80,8 @@ struct GiftSubscription {
};
struct CommunityGiftSubscription {
static constexpr std::string_view TAG = "community_sub_gift";
std::string id;
int total;
std::string subTier;
@@ -81,6 +89,8 @@ struct CommunityGiftSubscription {
};
struct GiftPaidUpgrade {
static constexpr std::string_view TAG = "gift_paid_upgrade";
bool gifterIsAnonymous;
std::optional<std::string> gifterUserID;
std::optional<std::string> gifterUserName;
@@ -88,10 +98,14 @@ struct GiftPaidUpgrade {
};
struct PrimePaidUpgrade {
static constexpr std::string_view TAG = "prime_paid_upgrade";
std::string subTier;
};
struct Raid {
static constexpr std::string_view TAG = "raid";
std::string userID;
std::string userName;
std::string userLogin;
@@ -100,9 +114,12 @@ struct Raid {
};
struct Unraid {
static constexpr std::string_view TAG = "unraid";
};
struct PayItForward {
static constexpr std::string_view TAG = "pay_it_forward";
bool gifterIsAnonymous;
std::optional<std::string> gifterUserID;
std::optional<std::string> gifterUserName;
@@ -110,21 +127,29 @@ struct PayItForward {
};
struct Announcement {
static constexpr std::string_view TAG = "announcement";
std::string color;
};
struct CharityDonationAmount {
static constexpr std::string_view TAG = "charity_donation_amount";
int value;
int decimalPlaces;
std::string currency;
};
struct CharityDonation {
static constexpr std::string_view TAG = "charity_donation";
std::string charityName;
CharityDonationAmount amount;
};
struct BitsBadgeTier {
static constexpr std::string_view TAG = "bits_badge_tier";
int tier;
};
@@ -146,19 +171,22 @@ struct Event {
std::string systemMessage;
std::string messageID;
Message message;
std::string noticeType;
std::optional<Subcription> sub;
std::optional<Resubscription> resub;
std::optional<GiftSubscription> subGift;
std::optional<CommunityGiftSubscription> communitySubGift;
std::optional<GiftPaidUpgrade> giftPaidUpgrade;
std::optional<PrimePaidUpgrade> primePaidUpgrade;
std::optional<Raid> raid;
std::optional<Unraid> unraid;
std::optional<PayItForward> payItForward;
std::optional<Announcement> announcement;
std::optional<CharityDonation> charityDonation;
std::optional<BitsBadgeTier> bitsBadgeTier;
/// json_tag=notice_type
std::variant<Subcription, //
Resubscription, //
GiftSubscription, //
CommunityGiftSubscription, //
GiftPaidUpgrade, //
PrimePaidUpgrade, //
Raid, //
Unraid, //
PayItForward, //
Announcement, //
CharityDonation, //
BitsBadgeTier, //
std::string //
>
inner;
};
struct Payload {
@@ -22,9 +22,15 @@ namespace chatterino::eventsub::lib::payload::channel_moderate::v2 {
*/
struct Followers {
static constexpr std::string_view TAG = "followers";
int followDurationMinutes;
};
struct FollowersOff {
static constexpr std::string_view TAG = "followersoff";
};
/* slow mode set to 30s
{"subscription":{"id":"86d99e53-2837-40cf-bc6e-c6e00698919c","status":"enabled","type":"channel.moderate","version":"2","condition":{"broadcaster_user_id":"11148817","moderator_user_id":"117166826"},"transport":{"method":"websocket","session_id":"AgoQZgfnyKxXQ32hpzCWF4aCGBIGY2VsbC1j"},"created_at":"2025-02-01T12:02:16.005321321Z","cost":0},"event":{"broadcaster_user_id":"11148817","broadcaster_user_login":"pajlada","broadcaster_user_name":"pajlada","source_broadcaster_user_id":null,"source_broadcaster_user_login":null,"source_broadcaster_user_name":null,"moderator_user_id":"11148817","moderator_user_login":"pajlada","moderator_user_name":"pajlada","action":"slow","followers":null,"slow":{"wait_time_seconds":30},"vip":null,"unvip":null,"mod":null,"unmod":null,"ban":null,"unban":null,"timeout":null,"untimeout":null,"raid":null,"unraid":null,"delete":null,"automod_terms":null,"unban_request":null,"warn":null,"shared_chat_ban":null,"shared_chat_unban":null,"shared_chat_timeout":null,"shared_chat_untimeout":null,"shared_chat_delete":null}}
*/
@@ -34,9 +40,15 @@ struct Followers {
*/
struct Slow {
static constexpr std::string_view TAG = "slow";
int waitTimeSeconds;
};
struct SlowOff {
static constexpr std::string_view TAG = "slowoff";
};
/* User is VIP'ed
{
"subscription": {
@@ -96,6 +108,8 @@ struct Slow {
*/
struct Vip {
static constexpr std::string_view TAG = "vip";
String userID;
String userLogin;
String userName;
@@ -106,6 +120,8 @@ struct Vip {
*/
struct Unvip {
static constexpr std::string_view TAG = "unvip";
String userID;
String userLogin;
String userName;
@@ -116,6 +132,8 @@ struct Unvip {
*/
struct Mod {
static constexpr std::string_view TAG = "mod";
std::string userID;
std::string userLogin;
std::string userName;
@@ -126,6 +144,8 @@ struct Mod {
*/
struct Unmod {
static constexpr std::string_view TAG = "unmod";
std::string userID;
std::string userLogin;
std::string userName;
@@ -140,22 +160,34 @@ struct Unmod {
*/
struct Ban {
static constexpr std::string_view TAG = "ban";
static constexpr std::string_view FIELD = "ban";
std::string userID;
std::string userLogin;
std::string userName;
// TODO: Verify that we handle null here
std::string reason;
};
struct SharedChatBan : public Ban {
static constexpr std::string_view TAG = "shared_chat_ban";
};
/* user is unbanned
{"subscription":{"id":"86d99e53-2837-40cf-bc6e-c6e00698919c","status":"enabled","type":"channel.moderate","version":"2","condition":{"broadcaster_user_id":"11148817","moderator_user_id":"117166826"},"transport":{"method":"websocket","session_id":"AgoQZgfnyKxXQ32hpzCWF4aCGBIGY2VsbC1j"},"created_at":"2025-02-01T12:02:16.005321321Z","cost":0},"event":{"broadcaster_user_id":"11148817","broadcaster_user_login":"pajlada","broadcaster_user_name":"pajlada","source_broadcaster_user_id":null,"source_broadcaster_user_login":null,"source_broadcaster_user_name":null,"moderator_user_id":"11148817","moderator_user_login":"pajlada","moderator_user_name":"pajlada","action":"unban","followers":null,"slow":null,"vip":null,"unvip":null,"mod":null,"unmod":null,"ban":null,"unban":{"user_id":"70948394","user_login":"weeb123","user_name":"WEEB123"},"timeout":null,"untimeout":null,"raid":null,"unraid":null,"delete":null,"automod_terms":null,"unban_request":null,"warn":null,"shared_chat_ban":null,"shared_chat_unban":null,"shared_chat_timeout":null,"shared_chat_untimeout":null,"shared_chat_delete":null}}
*/
struct Unban {
static constexpr std::string_view TAG = "unban";
static constexpr std::string_view FIELD = "unban";
std::string userID;
std::string userLogin;
std::string userName;
};
struct SharedChatUnban : public Ban {
static constexpr std::string_view TAG = "shared_chat_unban";
};
/* user is timed out without reason
{"subscription":{"id":"86d99e53-2837-40cf-bc6e-c6e00698919c","status":"enabled","type":"channel.moderate","version":"2","condition":{"broadcaster_user_id":"11148817","moderator_user_id":"117166826"},"transport":{"method":"websocket","session_id":"AgoQZgfnyKxXQ32hpzCWF4aCGBIGY2VsbC1j"},"created_at":"2025-02-01T12:02:16.005321321Z","cost":0},"event":{"broadcaster_user_id":"11148817","broadcaster_user_login":"pajlada","broadcaster_user_name":"pajlada","source_broadcaster_user_id":null,"source_broadcaster_user_login":null,"source_broadcaster_user_name":null,"moderator_user_id":"11148817","moderator_user_login":"pajlada","moderator_user_name":"pajlada","action":"timeout","followers":null,"slow":null,"vip":null,"unvip":null,"mod":null,"unmod":null,"ban":null,"unban":null,"timeout":{"user_id":"70948394","user_login":"weeb123","user_name":"WEEB123","reason":"","expires_at":"2025-02-01T12:11:02.684499409Z"},"untimeout":null,"raid":null,"unraid":null,"delete":null,"automod_terms":null,"unban_request":null,"warn":null,"shared_chat_ban":null,"shared_chat_unban":null,"shared_chat_timeout":null,"shared_chat_untimeout":null,"shared_chat_delete":null}}
@@ -166,6 +198,9 @@ struct Unban {
*/
struct Timeout {
static constexpr std::string_view TAG = "timeout";
static constexpr std::string_view FIELD = "timeout";
std::string userID;
std::string userLogin;
std::string userName;
@@ -174,22 +209,33 @@ struct Timeout {
// TODO: This should be a timestamp?
std::string expiresAt;
};
struct SharedChatTimeout : public Ban {
static constexpr std::string_view TAG = "shared_chat_timeout";
};
/* user is untimeouted
{"subscription":{"id":"86d99e53-2837-40cf-bc6e-c6e00698919c","status":"enabled","type":"channel.moderate","version":"2","condition":{"broadcaster_user_id":"11148817","moderator_user_id":"117166826"},"transport":{"method":"websocket","session_id":"AgoQZgfnyKxXQ32hpzCWF4aCGBIGY2VsbC1j"},"created_at":"2025-02-01T12:02:16.005321321Z","cost":0},"event":{"broadcaster_user_id":"11148817","broadcaster_user_login":"pajlada","broadcaster_user_name":"pajlada","source_broadcaster_user_id":null,"source_broadcaster_user_login":null,"source_broadcaster_user_name":null,"moderator_user_id":"11148817","moderator_user_login":"pajlada","moderator_user_name":"pajlada","action":"untimeout","followers":null,"slow":null,"vip":null,"unvip":null,"mod":null,"unmod":null,"ban":null,"unban":null,"timeout":null,"untimeout":{"user_id":"70948394","user_login":"weeb123","user_name":"WEEB123"},"raid":null,"unraid":null,"delete":null,"automod_terms":null,"unban_request":null,"warn":null,"shared_chat_ban":null,"shared_chat_unban":null,"shared_chat_timeout":null,"shared_chat_untimeout":null,"shared_chat_delete":null}}
*/
struct Untimeout {
static constexpr std::string_view TAG = "untimeout";
static constexpr std::string_view FIELD = "untimeout";
std::string userID;
std::string userLogin;
std::string userName;
};
struct SharedChatUntimeout : public Ban {
static constexpr std::string_view TAG = "shared_chat_untimeout";
};
/* channel is raided (from bajlada to pajlada)
{"subscription":{"id":"e7b45c7a-9b4d-4101-8d7d-92e8945c26fa","status":"enabled","type":"channel.moderate","version":"2","condition":{"broadcaster_user_id":"159849156","moderator_user_id":"159849156"},"transport":{"method":"websocket","session_id":"AgoQEPRIfB3SQTCSkJM2zznvNxIGY2VsbC1j"},"created_at":"2025-02-01T12:12:45.685831769Z","cost":0},"event":{"broadcaster_user_id":"159849156","broadcaster_user_login":"bajlada","broadcaster_user_name":"BajLada","source_broadcaster_user_id":null,"source_broadcaster_user_login":null,"source_broadcaster_user_name":null,"moderator_user_id":"159849156","moderator_user_login":"bajlada","moderator_user_name":"BajLada","action":"raid","followers":null,"slow":null,"vip":null,"unvip":null,"mod":null,"unmod":null,"ban":null,"unban":null,"timeout":null,"untimeout":null,"raid":{"user_id":"11148817","user_login":"pajlada","user_name":"pajlada","viewer_count":0},"unraid":null,"delete":null,"automod_terms":null,"unban_request":null,"warn":null,"shared_chat_ban":null,"shared_chat_unban":null,"shared_chat_timeout":null,"shared_chat_untimeout":null,"shared_chat_delete":null}}
*/
struct Raid {
static constexpr std::string_view TAG = "raid";
std::string userID;
std::string userLogin;
std::string userName;
@@ -202,6 +248,8 @@ struct Raid {
*/
struct Unraid {
static constexpr std::string_view TAG = "unraid";
std::string userID;
std::string userLogin;
std::string userName;
@@ -212,12 +260,18 @@ struct Unraid {
*/
struct Delete {
static constexpr std::string_view TAG = "delete";
static constexpr std::string_view FIELD = "delete";
std::string userID;
std::string userLogin;
std::string userName;
std::string messageID;
std::string messageBody;
};
struct SharedChatDelete : public Ban {
static constexpr std::string_view TAG = "shared_chat_delete";
};
/* automodded message approved
{"subscription":{"id":"0ccc8f11-7e77-40cf-84a9-25ab934c30fb","status":"enabled","type":"channel.moderate","version":"2","condition":{"broadcaster_user_id":"117166826","moderator_user_id":"117166826"},"transport":{"method":"websocket","session_id":"AgoQfS3RYz3MSqOophais4HEjxIGY2VsbC1j"},"created_at":"2025-02-01T12:15:13.092673205Z","cost":0},"event":{"broadcaster_user_id":"117166826","broadcaster_user_login":"testaccount_420","broadcaster_user_name":"테스트계정420","source_broadcaster_user_id":null,"source_broadcaster_user_login":null,"source_broadcaster_user_name":null,"moderator_user_id":"117166826","moderator_user_login":"testaccount_420","moderator_user_name":"테스트계정420","action":"add_permitted_term","followers":null,"slow":null,"vip":null,"unvip":null,"mod":null,"unmod":null,"ban":null,"unban":null,"timeout":null,"untimeout":null,"raid":null,"unraid":null,"delete":null,"automod_terms":{"action":"add","list":"permitted","terms":["cock cock cock penis sex cock"],"from_automod":true},"unban_request":null,"warn":null,"shared_chat_ban":null,"shared_chat_unban":null,"shared_chat_timeout":null,"shared_chat_untimeout":null,"shared_chat_delete":null}}
@@ -230,6 +284,8 @@ struct Delete {
*/
struct AutomodTerms {
static constexpr std::string_view FIELD = "automod_terms";
// either add or remove
std::string action;
// either blocked or permitted
@@ -239,6 +295,19 @@ struct AutomodTerms {
bool fromAutomod;
};
struct AddBlockedTerm : public AutomodTerms {
static constexpr std::string_view TAG = "add_blocked_term";
};
struct AddPermittedTerm : public AutomodTerms {
static constexpr std::string_view TAG = "add_permitted_term";
};
struct RemoveBlockedTerm : public AutomodTerms {
static constexpr std::string_view TAG = "remove_blocked_term";
};
struct RemovePermittedTerm : public AutomodTerms {
static constexpr std::string_view TAG = "remove_permitted_term";
};
/* unban request approved
{"subscription":{"id":"4284c08c-402a-43a8-8537-1e75f38f562c","status":"enabled","type":"channel.moderate","version":"2","condition":{"broadcaster_user_id":"11148817","moderator_user_id":"117166826"},"transport":{"method":"websocket","session_id":"AgoQfS3RYz3MSqOophais4HEjxIGY2VsbC1j"},"created_at":"2025-02-01T12:15:13.083098352Z","cost":0},"event":{"broadcaster_user_id":"11148817","broadcaster_user_login":"pajlada","broadcaster_user_name":"pajlada","source_broadcaster_user_id":null,"source_broadcaster_user_login":null,"source_broadcaster_user_name":null,"moderator_user_id":"11148817","moderator_user_login":"pajlada","moderator_user_name":"pajlada","action":"approve_unban_request","followers":null,"slow":null,"vip":null,"unvip":null,"mod":null,"unmod":null,"ban":null,"unban":null,"timeout":null,"untimeout":null,"raid":null,"unraid":null,"delete":null,"automod_terms":null,"unban_request":{"is_approved":true,"user_id":"159849156","user_login":"bajlada","user_name":"BajLada","moderator_message":"you have been granted mercy"},"warn":null,"shared_chat_ban":null,"shared_chat_unban":null,"shared_chat_timeout":null,"shared_chat_untimeout":null,"shared_chat_delete":null}}
*/
@@ -248,6 +317,8 @@ struct AutomodTerms {
*/
struct UnbanRequest {
static constexpr std::string_view FIELD = "unban_request";
bool isApproved;
std::string userID;
@@ -257,6 +328,13 @@ struct UnbanRequest {
std::string moderatorMessage;
};
struct ApproveUnbanRequest : public UnbanRequest {
static constexpr std::string_view TAG = "approve_unban_request";
};
struct DenyUnbanRequest : public UnbanRequest {
static constexpr std::string_view TAG = "deny_unban_request";
};
/* freetext warn from chatterino
{"subscription":{"id":"4284c08c-402a-43a8-8537-1e75f38f562c","status":"enabled","type":"channel.moderate","version":"2","condition":{"broadcaster_user_id":"11148817","moderator_user_id":"117166826"},"transport":{"method":"websocket","session_id":"AgoQfS3RYz3MSqOophais4HEjxIGY2VsbC1j"},"created_at":"2025-02-01T12:15:13.083098352Z","cost":0},"event":{"broadcaster_user_id":"11148817","broadcaster_user_login":"pajlada","broadcaster_user_name":"pajlada","source_broadcaster_user_id":null,"source_broadcaster_user_login":null,"source_broadcaster_user_name":null,"moderator_user_id":"11148817","moderator_user_login":"pajlada","moderator_user_name":"pajlada","action":"warn","followers":null,"slow":null,"vip":null,"unvip":null,"mod":null,"unmod":null,"ban":null,"unban":null,"timeout":null,"untimeout":null,"raid":null,"unraid":null,"delete":null,"automod_terms":null,"unban_request":null,"warn":{"user_id":"159849156","user_login":"bajlada","user_name":"BajLada","reason":"this is a test warning from chatterino","chat_rules_cited":null},"shared_chat_ban":null,"shared_chat_unban":null,"shared_chat_timeout":null,"shared_chat_untimeout":null,"shared_chat_delete":null}}
*/
@@ -266,6 +344,8 @@ struct UnbanRequest {
*/
struct Warn {
static constexpr std::string_view TAG = "warn";
std::string userID;
std::string userLogin;
std::string userName;
@@ -275,44 +355,29 @@ struct Warn {
std::vector<std::string> chatRulesCited;
};
enum class Action : uint8_t {
Ban,
Timeout,
Unban,
Untimeout,
Clear,
Emoteonly,
Emoteonlyoff,
Followers,
Followersoff,
Uniquechat,
Uniquechatoff,
Slow,
Slowoff,
Subscribers,
Subscribersoff,
Unraid,
/// json_rename=delete
DeleteMessage,
/// clangd currently "inherits" all future comments to all future enum constants
/// so after using something like json_rename we need to ensure it doesn't spread
Unvip,
Vip,
Raid,
AddBlockedTerm,
AddPermittedTerm,
RemoveBlockedTerm,
RemovePermittedTerm,
Mod,
Unmod,
ApproveUnbanRequest,
DenyUnbanRequest,
Warn,
SharedChatBan,
SharedChatTimeout,
SharedChatUnban,
SharedChatUntimeout,
SharedChatDelete,
struct Clear {
static constexpr std::string_view TAG = "clear";
};
struct EmoteOnly {
static constexpr std::string_view TAG = "emoteonly";
};
struct EmoteOnlyOff {
static constexpr std::string_view TAG = "emoteonlyoff";
};
struct Uniquechat {
static constexpr std::string_view TAG = "uniquechat";
};
struct UniquechatOff {
static constexpr std::string_view TAG = "uniquechatoff";
};
struct Subscribers {
static constexpr std::string_view TAG = "subscribers";
};
struct SubscribersOff {
static constexpr std::string_view TAG = "subscribersoff";
};
struct Event {
@@ -337,31 +402,43 @@ struct Event {
/// User Name (e.g. 테스트계정420) of the user who took the action
String moderatorUserName;
// TODO: enum?
/// The action that took place (e.g. "warn" or "ban")
Action action;
std::optional<Followers> followers;
std::optional<Slow> slow;
std::optional<Vip> vip;
std::optional<Unvip> unvip;
std::optional<Unmod> unmod;
std::optional<Ban> ban;
std::optional<Unban> unban;
std::optional<Timeout> timeout;
std::optional<Untimeout> untimeout;
std::optional<Raid> raid;
std::optional<Unraid> unraid;
/// json_rename=delete
std::optional<Delete> deleteMessage;
std::optional<AutomodTerms> automodTerms;
std::optional<UnbanRequest> unbanRequest;
std::optional<Warn> warn;
std::optional<Ban> sharedChatBan;
std::optional<Unban> sharedChatUnban;
std::optional<Timeout> sharedChatTimeout;
std::optional<Untimeout> sharedChatUntimeout;
std::optional<Delete> sharedChatDelete;
/// json_tag=action
std::variant<Ban, //
Timeout, //
Unban, //
Untimeout, //
Clear, //
EmoteOnly, //
EmoteOnlyOff, //
Followers, //
FollowersOff, //
Uniquechat, //
UniquechatOff, //
Slow, //
SlowOff, //
Subscribers, //
SubscribersOff, //
Unraid, //
Delete, //
Unvip, //
Vip, //
Raid, //
AddBlockedTerm, //
AddPermittedTerm, //
RemoveBlockedTerm, //
RemovePermittedTerm, //
Mod, //
Unmod, //
ApproveUnbanRequest, //
DenyUnbanRequest, //
Warn, //
SharedChatBan, //
SharedChatTimeout, //
SharedChatUnban, //
SharedChatUntimeout, //
SharedChatDelete, //
std::string>
action;
};
struct Payload {
@@ -1,12 +1,16 @@
boost::json::result_for<Action, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<Action>, const boost::json::value &jvRoot);
boost::json::result_for<Followers, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<Followers>, const boost::json::value &jvRoot);
boost::json::result_for<FollowersOff, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<FollowersOff>,
const boost::json::value &jvRoot);
boost::json::result_for<Slow, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<Slow>, const boost::json::value &jvRoot);
boost::json::result_for<SlowOff, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<SlowOff>, const boost::json::value &jvRoot);
boost::json::result_for<Vip, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<Vip>, const boost::json::value &jvRoot);
@@ -22,15 +26,31 @@ boost::json::result_for<Unmod, boost::json::value>::type tag_invoke(
boost::json::result_for<Ban, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<Ban>, const boost::json::value &jvRoot);
boost::json::result_for<SharedChatBan, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<SharedChatBan>,
const boost::json::value &jvRoot);
boost::json::result_for<Unban, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<Unban>, const boost::json::value &jvRoot);
boost::json::result_for<SharedChatUnban, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<SharedChatUnban>,
const boost::json::value &jvRoot);
boost::json::result_for<Timeout, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<Timeout>, const boost::json::value &jvRoot);
boost::json::result_for<SharedChatTimeout, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<SharedChatTimeout>,
const boost::json::value &jvRoot);
boost::json::result_for<Untimeout, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<Untimeout>, const boost::json::value &jvRoot);
boost::json::result_for<SharedChatUntimeout, boost::json::value>::type
tag_invoke(boost::json::try_value_to_tag<SharedChatUntimeout>,
const boost::json::value &jvRoot);
boost::json::result_for<Raid, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<Raid>, const boost::json::value &jvRoot);
@@ -40,17 +60,71 @@ boost::json::result_for<Unraid, boost::json::value>::type tag_invoke(
boost::json::result_for<Delete, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<Delete>, const boost::json::value &jvRoot);
boost::json::result_for<SharedChatDelete, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<SharedChatDelete>,
const boost::json::value &jvRoot);
boost::json::result_for<AutomodTerms, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<AutomodTerms>,
const boost::json::value &jvRoot);
boost::json::result_for<AddBlockedTerm, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<AddBlockedTerm>,
const boost::json::value &jvRoot);
boost::json::result_for<AddPermittedTerm, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<AddPermittedTerm>,
const boost::json::value &jvRoot);
boost::json::result_for<RemoveBlockedTerm, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<RemoveBlockedTerm>,
const boost::json::value &jvRoot);
boost::json::result_for<RemovePermittedTerm, boost::json::value>::type
tag_invoke(boost::json::try_value_to_tag<RemovePermittedTerm>,
const boost::json::value &jvRoot);
boost::json::result_for<UnbanRequest, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<UnbanRequest>,
const boost::json::value &jvRoot);
boost::json::result_for<ApproveUnbanRequest, boost::json::value>::type
tag_invoke(boost::json::try_value_to_tag<ApproveUnbanRequest>,
const boost::json::value &jvRoot);
boost::json::result_for<DenyUnbanRequest, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<DenyUnbanRequest>,
const boost::json::value &jvRoot);
boost::json::result_for<Warn, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<Warn>, const boost::json::value &jvRoot);
boost::json::result_for<Clear, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<Clear>, const boost::json::value &jvRoot);
boost::json::result_for<EmoteOnly, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<EmoteOnly>, const boost::json::value &jvRoot);
boost::json::result_for<EmoteOnlyOff, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<EmoteOnlyOff>,
const boost::json::value &jvRoot);
boost::json::result_for<Uniquechat, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<Uniquechat>,
const boost::json::value &jvRoot);
boost::json::result_for<UniquechatOff, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<UniquechatOff>,
const boost::json::value &jvRoot);
boost::json::result_for<Subscribers, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<Subscribers>,
const boost::json::value &jvRoot);
boost::json::result_for<SubscribersOff, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<SubscribersOff>,
const boost::json::value &jvRoot);
boost::json::result_for<Event, boost::json::value>::type tag_invoke(
boost::json::try_value_to_tag<Event>, const boost::json::value &jvRoot);