Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CatCore/CatCore.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
<PackageReference Include="Serilog.Sinks.Async" Version="1.5.0" />
<PackageReference Include="System.Net.Http.Json" Version="7.0.0" />
<PackageReference Include="System.Reactive" Version="5.0.0" />
<PackageReference Include="System.Text.Json" Version="7.0.2" />
<PackageReference Include="System.Text.Json" Version="10.0.5" />
<PackageReference Include="WebsocketClientLite.PCL" Version="7.3.2" />
</ItemGroup>

Expand Down
6 changes: 3 additions & 3 deletions CatCore/CatCoreInstance.cs
Original file line number Diff line number Diff line change
Expand Up @@ -136,16 +136,16 @@ private void CreateContainer()

// Register Twitch-specific services
container.Register<ITwitchAuthService, TwitchAuthService>(Reuse.Singleton);
container.RegisterInitializer<ITwitchAuthService>((service, _) => service.Initialize());
container.Register<ITwitchChannelManagementService, TwitchChannelManagementService>(Reuse.Singleton, Made.Of(FactoryMethod.ConstructorWithResolvableArgumentsIncludingNonPublic));
container.Register<ITwitchHelixApiService, TwitchHelixApiService>(Reuse.Singleton, Made.Of(FactoryMethod.ConstructorWithResolvableArgumentsIncludingNonPublic));
container.Register<ITwitchPubSubServiceManager, TwitchPubSubServiceManager>(Reuse.Singleton);
container.RegisterMany(new[] { typeof(ITwitchHelixApiService), typeof(TwitchHelixApiService) }, typeof(TwitchHelixApiService), Reuse.Singleton, Made.Of(FactoryMethod.ConstructorWithResolvableArgumentsIncludingNonPublic));
container.RegisterMany(new[] { typeof(ITwitchIrcService), typeof(ITwitchPubSubServiceManager) }, typeof(TwitchEventSubChatService), Reuse.Singleton);
container.Register<ITwitchRoomStateTrackerService, TwitchRoomStateTrackerService>(Reuse.Singleton, Made.Of(FactoryMethod.ConstructorWithResolvableArgumentsIncludingNonPublic));
container.Register<ITwitchUserStateTrackerService, TwitchUserStateTrackerService>(Reuse.Singleton, Made.Of(FactoryMethod.ConstructorWithResolvableArgumentsIncludingNonPublic));
container.Register<TwitchBadgeDataProvider>(Reuse.Singleton);
container.Register<TwitchCheermoteDataProvider>(Reuse.Singleton);
container.Register<TwitchMediaDataProvider>(Reuse.Singleton);
container.Register<TwitchEmoteDetectionHelper>(Reuse.Singleton);
container.Register<ITwitchIrcService, TwitchIrcService>(Reuse.Singleton);

container.RegisterMany(new[] { typeof(IPlatformService<ITwitchService, TwitchChannel, TwitchMessage>), typeof(ITwitchService) }, typeof(TwitchService), Reuse.Singleton,
Made.Of(FactoryMethod.ConstructorWithResolvableArgumentsIncludingNonPublic));
Expand Down
11 changes: 11 additions & 0 deletions CatCore/Helpers/IsExternalInit.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace System.Runtime.CompilerServices
{
/// <summary>
/// Polyfill for IsExternalInit to support init accessors in .NET Standard 2.0+
/// </summary>
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct | System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
internal sealed class IsExternalInit : System.Attribute
{
}
}

44 changes: 44 additions & 0 deletions CatCore/Helpers/JSON/TwitchEventSubSerializerContext.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
using System.Text.Json.Serialization;
using CatCore.Models.Twitch.EventSub;

namespace CatCore.Helpers.JSON
{
[JsonSerializable(typeof(EventSubWebSocketMessage<EventSubSessionPayload>))]
[JsonSerializable(typeof(EventSubSessionPayload))]
[JsonSerializable(typeof(EventSubSessionInfo))]
[JsonSerializable(typeof(EventSubWebSocketMessage<EventSubChatMessagePayload>))]
[JsonSerializable(typeof(EventSubChatMessagePayload))]
[JsonSerializable(typeof(EventSubSubscription))]
[JsonSerializable(typeof(EventSubChatMessageEvent))]
[JsonSerializable(typeof(EventSubChatMessageContent))]
[JsonSerializable(typeof(EventSubFragment))]
[JsonSerializable(typeof(EventSubEmoteFragment))]
[JsonSerializable(typeof(EventSubCheermoteFragment))]
[JsonSerializable(typeof(EventSubMentionFragment))]
[JsonSerializable(typeof(EventSubBadge))]
[JsonSerializable(typeof(EventSubCheer))]
[JsonSerializable(typeof(EventSubReply))]
[JsonSerializable(typeof(EventSubWebSocketMessage<EventSubChatNotificationPayload>))]
[JsonSerializable(typeof(EventSubChatNotificationPayload))]
[JsonSerializable(typeof(EventSubChatNotificationEvent))]
[JsonSerializable(typeof(EventSubNotificationSub))]
[JsonSerializable(typeof(EventSubNotificationResub))]
[JsonSerializable(typeof(EventSubNotificationGiftSub))]
[JsonSerializable(typeof(EventSubNotificationRaid))]
[JsonSerializable(typeof(EventSubNotificationUnraid))]
[JsonSerializable(typeof(EventSubNotificationPayItForward))]
[JsonSerializable(typeof(EventSubNotificationAnnouncement))]
[JsonSerializable(typeof(EventSubNotificationBitsBadgeTier))]
[JsonSerializable(typeof(EventSubWebSocketMessage<EventSubChatMessageDeletePayload>))]
[JsonSerializable(typeof(EventSubChatMessageDeletePayload))]
[JsonSerializable(typeof(EventSubChatMessageDeleteEvent))]
[JsonSerializable(typeof(EventSubWebSocketMessage<EventSubChatClearPayload>))]
[JsonSerializable(typeof(EventSubChatClearPayload))]
[JsonSerializable(typeof(EventSubChatClearEvent))]
[JsonSerializable(typeof(EventSubWebSocketMessage<EventSubChatSettingsPayload>))]
[JsonSerializable(typeof(EventSubChatSettingsPayload))]
[JsonSerializable(typeof(EventSubChatSettingsEvent))]
internal partial class TwitchEventSubSerializerContext : JsonSerializerContext
{
}
}
5 changes: 5 additions & 0 deletions CatCore/Helpers/JSON/TwitchHelixSerializerContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ namespace CatCore.Helpers.JSON
[JsonSerializable(typeof(HelixRequests.SendChatAnnouncementRequestDto))]
[JsonSerializable(typeof(HelixResponses.ResponseBase<HelixResponses.UserChatColorData>))]
[JsonSerializable(typeof(HelixResponses.ResponseBase<HelixResponses.StartRaidData>))]
[JsonSerializable(typeof(HelixRequests.SendChatMessageRequestDto))]
[JsonSerializable(typeof(HelixRequests.EventSubSubscriptionRequestDto))]
[JsonSerializable(typeof(HelixRequests.EventSubTransportDto))]
[JsonSerializable(typeof(HelixResponses.EventSubSubscriptionResponseDto))]
[JsonSerializable(typeof(HelixResponses.EventSubSubscriptionInfoDto))]
internal partial class TwitchHelixSerializerContext : JsonSerializerContext
{
}
Expand Down
34 changes: 34 additions & 0 deletions CatCore/Models/Twitch/EventSub/EventSubChatClearPayload.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using System.Text.Json.Serialization;

namespace CatCore.Models.Twitch.EventSub
{
internal struct EventSubChatClearPayload
{
[JsonPropertyName("subscription")]
public EventSubSubscription Subscription { get; init; }

[JsonPropertyName("event")]
public EventSubChatClearEvent Event { get; init; }
}

public struct EventSubChatClearEvent
{
[JsonPropertyName("broadcaster_user_id")]
public string BroadcasterUserId { get; init; }

[JsonPropertyName("broadcaster_user_login")]
public string BroadcasterUserLogin { get; init; }

[JsonPropertyName("broadcaster_user_name")]
public string BroadcasterUserName { get; init; }

[JsonPropertyName("moderator_user_id")]
public string ModeratorUserId { get; init; }

[JsonPropertyName("moderator_user_login")]
public string ModeratorUserLogin { get; init; }

[JsonPropertyName("moderator_user_name")]
public string ModeratorUserName { get; init; }
}
}
37 changes: 37 additions & 0 deletions CatCore/Models/Twitch/EventSub/EventSubChatMessageDeletePayload.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using System.Text.Json.Serialization;

namespace CatCore.Models.Twitch.EventSub
{
internal struct EventSubChatMessageDeletePayload
{
[JsonPropertyName("subscription")]
public EventSubSubscription Subscription { get; init; }

[JsonPropertyName("event")]
public EventSubChatMessageDeleteEvent Event { get; init; }
}

public struct EventSubChatMessageDeleteEvent
{
[JsonPropertyName("broadcaster_user_id")]
public string BroadcasterUserId { get; init; }

[JsonPropertyName("broadcaster_user_login")]
public string BroadcasterUserLogin { get; init; }

[JsonPropertyName("broadcaster_user_name")]
public string BroadcasterUserName { get; init; }

[JsonPropertyName("target_user_id")]
public string TargetUserId { get; init; }

[JsonPropertyName("target_user_login")]
public string TargetUserLogin { get; init; }

[JsonPropertyName("target_user_name")]
public string TargetUserName { get; init; }

[JsonPropertyName("message_id")]
public string MessageId { get; init; }
}
}
196 changes: 196 additions & 0 deletions CatCore/Models/Twitch/EventSub/EventSubChatMessagePayload.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
using System.Collections.Generic;
using System.Text.Json.Serialization;
using JetBrains.Annotations;

namespace CatCore.Models.Twitch.EventSub
{
internal struct EventSubChatMessagePayload
{
[JsonPropertyName("subscription")]
public EventSubSubscription Subscription { get; init; }

[JsonPropertyName("event")]
public EventSubChatMessageEvent Event { get; init; }
}

[PublicAPI]
public struct EventSubSubscription
{
[JsonPropertyName("id")]
public string Id { get; init; }

[JsonPropertyName("type")]
public string Type { get; init; }

[JsonPropertyName("version")]
public string Version { get; init; }

[JsonPropertyName("status")]
public string Status { get; init; }

[JsonPropertyName("condition")]
public Dictionary<string, string> Condition { get; init; }

[JsonPropertyName("transport")]
public Dictionary<string, string> Transport { get; init; }

[JsonPropertyName("created_at")]
public string CreatedAt { get; init; }

[JsonPropertyName("cost")]
public int Cost { get; init; }
}

[PublicAPI]
public struct EventSubChatMessageEvent
{
[JsonPropertyName("broadcaster_user_id")]
public string BroadcasterUserId { get; init; }

[JsonPropertyName("broadcaster_user_login")]
public string BroadcasterUserLogin { get; init; }

[JsonPropertyName("broadcaster_user_name")]
public string BroadcasterUserName { get; init; }

[JsonPropertyName("chatter_user_id")]
public string ChatterUserId { get; init; }

[JsonPropertyName("chatter_user_login")]
public string ChatterUserLogin { get; init; }

[JsonPropertyName("chatter_user_name")]
public string ChatterUserName { get; init; }

[JsonPropertyName("message_id")]
public string MessageId { get; init; }

[JsonPropertyName("message")]
public EventSubChatMessageContent Message { get; init; }

[JsonPropertyName("color")]
public string Color { get; init; }

[JsonPropertyName("badges")]
public List<EventSubBadge> Badges { get; init; }

[JsonPropertyName("message_type")]
public string MessageType { get; init; }

[JsonPropertyName("cheer")]
public EventSubCheer? Cheer { get; init; }

[JsonPropertyName("reply")]
public EventSubReply? Reply { get; init; }

[JsonPropertyName("channel_points_custom_reward_id")]
public string? ChannelPointsCustomRewardId { get; init; }
}

[PublicAPI]
public struct EventSubChatMessageContent
{
[JsonPropertyName("text")]
public string Text { get; init; }

[JsonPropertyName("fragments")]
public List<EventSubFragment> Fragments { get; init; }
}

[PublicAPI]
public struct EventSubFragment
{
[JsonPropertyName("type")]
public string Type { get; init; }

[JsonPropertyName("text")]
public string Text { get; init; }

[JsonPropertyName("emote")]
public EventSubEmoteFragment? Emote { get; init; }

[JsonPropertyName("cheermote")]
public EventSubCheermoteFragment? Cheermote { get; init; }

[JsonPropertyName("mention")]
public EventSubMentionFragment? Mention { get; init; }
}

[PublicAPI]
public struct EventSubEmoteFragment
{
[JsonPropertyName("id")]
public string Id { get; init; }

[JsonPropertyName("emote_set_id")]
public string EmoteSetId { get; init; }

[JsonPropertyName("owner_id")]
public string OwnerId { get; init; }

[JsonPropertyName("format")]
public List<string> Format { get; init; }
}

[PublicAPI]
public struct EventSubCheermoteFragment
{
[JsonPropertyName("bits")]
public int Bits { get; init; }

[JsonPropertyName("tier")]
public int Tier { get; init; }
}

[PublicAPI]
public struct EventSubMentionFragment
{
[JsonPropertyName("user_id")]
public string UserId { get; init; }

[JsonPropertyName("user_name")]
public string UserName { get; init; }

[JsonPropertyName("user_login")]
public string UserLogin { get; init; }
}

[PublicAPI]
public struct EventSubBadge
{
[JsonPropertyName("set_id")]
public string SetId { get; init; }

[JsonPropertyName("id")]
public string Id { get; init; }

[JsonPropertyName("info")]
public string Info { get; init; }
}

[PublicAPI]
public struct EventSubCheer
{
[JsonPropertyName("bits")]
public int Bits { get; init; }
}

[PublicAPI]
public struct EventSubReply
{
[JsonPropertyName("parent_message_id")]
public string ParentMessageId { get; init; }

[JsonPropertyName("parent_message_body")]
public string ParentMessageBody { get; init; }

[JsonPropertyName("parent_user_id")]
public string ParentUserId { get; init; }

[JsonPropertyName("parent_user_login")]
public string ParentUserLogin { get; init; }

[JsonPropertyName("parent_user_name")]
public string ParentUserName { get; init; }
}
}
Loading
Loading