273 lines
7.9 KiB
Go
273 lines
7.9 KiB
Go
package messages
|
|
|
|
import (
|
|
"encoding/json"
|
|
|
|
"github.com/mitchellh/mapstructure"
|
|
"go.fifitido.net/twitch/eventsub/events"
|
|
)
|
|
|
|
func decode[T any](input map[string]any) (T, error) {
|
|
var result T
|
|
|
|
decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
|
|
Metadata: nil,
|
|
Result: &result,
|
|
TagName: "json",
|
|
})
|
|
if err != nil {
|
|
return result, err
|
|
}
|
|
|
|
if err := decoder.Decode(input); err != nil {
|
|
return result, err
|
|
}
|
|
|
|
return result, nil
|
|
}
|
|
|
|
var _ json.Unmarshaler = (*Notification)(nil)
|
|
|
|
func (m *Notification) UnmarshalJSON(data []byte) error {
|
|
var payload Notification
|
|
if err := json.Unmarshal(data, &payload); err != nil {
|
|
return err
|
|
}
|
|
|
|
m.Subscription = payload.Subscription
|
|
event := payload.Event.(map[string]any)
|
|
|
|
switch payload.Subscription.Type {
|
|
case "channel.update":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelUpdateEvent](event)
|
|
return err
|
|
case "channel.follow":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelFollowEvent](event)
|
|
return err
|
|
case "channel.ad_break.begin":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelAdBreakBeginEvent](event)
|
|
return err
|
|
case "channel.chat.clear":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelChatClearEvent](event)
|
|
return err
|
|
case "channel.chat.clear_user_messages":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelChatClearUserMessagesEvent](event)
|
|
return err
|
|
case "channel.chat.message":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelChatMessageEvent](event)
|
|
return err
|
|
case "channel.chat.message_delete":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelChatMessageDeleteEvent](event)
|
|
return err
|
|
case "channel.chat.notification":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelChatNotificationEvent](event)
|
|
return err
|
|
case "channel.chat_settings.update":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelChatSettingsUpdateEvent](event)
|
|
return err
|
|
case "channel.subscribe":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelSubscribeEvent](event)
|
|
return err
|
|
case "channel.subscription.end":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelSubscriptionEndEvent](event)
|
|
return err
|
|
case "channel.subscription.gift":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelSubscriptionGiftEvent](event)
|
|
return err
|
|
case "channel.subscription.message":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelSubscriptionMessageEvent](event)
|
|
return err
|
|
case "channel.cheer":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelCheerEvent](event)
|
|
return err
|
|
case "channel.raid":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelRaidEvent](event)
|
|
return err
|
|
case "channel.ban":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelBanEvent](event)
|
|
return err
|
|
case "channel.unban":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelUnbanEvent](event)
|
|
return err
|
|
case "channel.moderator.add":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelModeratorAddEvent](event)
|
|
return err
|
|
case "channel.moderator.remove":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelModeratorRemoveEvent](event)
|
|
return err
|
|
case "channel.guest_star_session.begin":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelGuestStarSessionBeginEvent](event)
|
|
return err
|
|
case "channel.guest_star_session.end":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelGuestStarSessionEndEvent](event)
|
|
return err
|
|
case "channel.guest_star_guest.update":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelGuestStarGuestUpdateEvent](event)
|
|
return err
|
|
case "channel.guest_star_settings.update":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelGuestStarSettingsUpdateEvent](event)
|
|
return err
|
|
case "channel.channel_points_custom_reward.add":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelPointsCustomRewardAddEvent](event)
|
|
return err
|
|
case "channel.channel_points_custom_reward.update":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelPointsCustomRewardUpdateEvent](event)
|
|
return err
|
|
case "channel.channel_points_custom_reward.remove":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelPointsCustomRewardRemoveEvent](event)
|
|
return err
|
|
case "channel.channel_points_custom_reward_redemption.add":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelPointsCustomRewardRedemptionAddEvent](event)
|
|
return err
|
|
case "channel.channel_points_custom_reward_redemption.update":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelPointsCustomRewardRedemptionUpdateEvent](event)
|
|
return err
|
|
case "channel.poll.begin":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelPollBeginEvent](event)
|
|
return err
|
|
case "channel.poll.progress":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelPollProgressEvent](event)
|
|
return err
|
|
case "channel.poll.end":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelPollEndEvent](event)
|
|
return err
|
|
case "channel.prediction.begin":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelPredictionBeginEvent](event)
|
|
return err
|
|
case "channel.prediction.progress":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelPredictionProgressEvent](event)
|
|
return err
|
|
case "channel.prediction.lock":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelPredictionLockEvent](event)
|
|
return err
|
|
case "channel.prediction.end":
|
|
var err error
|
|
m.Event, err = decode[events.ChannelPredictionEndEvent](event)
|
|
return err
|
|
case "channel.hype_train.begin":
|
|
var err error
|
|
m.Event, err = decode[events.HypeTrainBeginEvent](event)
|
|
return err
|
|
case "channel.hype_train.progress":
|
|
var err error
|
|
m.Event, err = decode[events.HypeTrainProgressEvent](event)
|
|
return err
|
|
case "channel.hype_train.end":
|
|
var err error
|
|
m.Event, err = decode[events.HypeTrainEndEvent](event)
|
|
return err
|
|
case "channel.charity_campaign.donate":
|
|
var err error
|
|
m.Event, err = decode[events.CharityDonationEvent](event)
|
|
return err
|
|
case "channel.charity_campaign.start":
|
|
var err error
|
|
m.Event, err = decode[events.CharityCampaignStartEvent](event)
|
|
return err
|
|
case "channel.charity_campaign.progress":
|
|
var err error
|
|
m.Event, err = decode[events.CharityCampaignProgressEvent](event)
|
|
return err
|
|
case "channel.charity_campaign.stop":
|
|
var err error
|
|
m.Event, err = decode[events.CharityCampaignStopEvent](event)
|
|
return err
|
|
case "channel.shield_mode.begin":
|
|
var err error
|
|
m.Event, err = decode[events.ShieldModeEvent](event)
|
|
return err
|
|
case "channel.shield_mode.end":
|
|
var err error
|
|
m.Event, err = decode[events.ShieldModeEvent](event)
|
|
return err
|
|
case "channel.shoutout.create":
|
|
var err error
|
|
m.Event, err = decode[events.ShoutoutCreateEvent](event)
|
|
return err
|
|
case "channel.shoutout.receive":
|
|
var err error
|
|
m.Event, err = decode[events.ShoutoutReceivedEvent](event)
|
|
return err
|
|
case "conduit.shard.disabled":
|
|
var err error
|
|
m.Event, err = decode[events.ConduitShardDisabledEvent](event)
|
|
return err
|
|
case "drop.entitlement.grant":
|
|
var err error
|
|
m.Event, err = decode[events.DropEntitlementGrantEvent](event)
|
|
return err
|
|
case "extension.bits_transaction.create":
|
|
var err error
|
|
m.Event, err = decode[events.ExtensionBitsTransactionCreateEvent](event)
|
|
return err
|
|
case "channel.goal.begin":
|
|
var err error
|
|
m.Event, err = decode[events.GoalsEvent](event)
|
|
return err
|
|
case "channel.goal.progress":
|
|
var err error
|
|
m.Event, err = decode[events.GoalsEvent](event)
|
|
return err
|
|
case "channel.goal.end":
|
|
var err error
|
|
m.Event, err = decode[events.GoalsEvent](event)
|
|
return err
|
|
case "stream.online":
|
|
var err error
|
|
m.Event, err = decode[events.StreamOnlineEvent](event)
|
|
return err
|
|
case "stream.offline":
|
|
var err error
|
|
m.Event, err = decode[events.StreamOfflineEvent](event)
|
|
return err
|
|
case "user.authorization.grant":
|
|
var err error
|
|
m.Event, err = decode[events.UserAuthorizationGrantEvent](event)
|
|
return err
|
|
case "user.authorization.revoke":
|
|
var err error
|
|
m.Event, err = decode[events.UserAuthorizationRevokeEvent](event)
|
|
return err
|
|
case "user.update":
|
|
var err error
|
|
m.Event, err = decode[events.UserUpdateEvent](event)
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|