diff --git a/.vscode/settings.json b/.vscode/settings.json index f9c5899..1bf783c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,9 @@ { "editor.formatOnSave": true, - "dotnet.defaultSolution": "src/StevesBot.sln", + "dotnet.defaultSolution": "./src/StevesBot.sln", "cSpell.words": [ - "Steves" + "Reconnectable", + "Steves", + "Szalay" ], } \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 21bd2ba..0000000 --- a/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Steves Bot - -⚠️ Under Construction ⚠️ - -This is a custom discord bot that I use in my personal discord server. diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 807df2c..c78f721 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,6 +1,7 @@ + $(MSBuildThisFileDirectory) net9.0 enable enable diff --git a/src/StevesBot.Worker.Tests/Unit/DiscordEventTypes.cs b/src/StevesBot.Worker.Tests/Unit/DiscordEventTypes.cs new file mode 100644 index 0000000..2f73151 --- /dev/null +++ b/src/StevesBot.Worker.Tests/Unit/DiscordEventTypes.cs @@ -0,0 +1 @@ +namespace StevesBot.Worker.Tests.Unit; \ No newline at end of file diff --git a/src/StevesBot.Worker.Tests/Unit/IdentifyDataTests.cs b/src/StevesBot.Worker.Tests/Unit/IdentifyDataTests.cs new file mode 100644 index 0000000..7479f05 --- /dev/null +++ b/src/StevesBot.Worker.Tests/Unit/IdentifyDataTests.cs @@ -0,0 +1,50 @@ +using StevesBot.Worker.Discord.Gateway.Events.Data; + +namespace StevesBot.Worker.Tests.Unit; + +public class IdentifyDataTests +{ + [Fact] + public void Constructor_WhenCalled_ItShouldReturnInstance() + { + var result = new IdentifyData(); + + result.Token.Should().Be(string.Empty); + result.Properties.Should().BeEquivalentTo(new IdentifyProperties()); + result.Presence.Should().BeEquivalentTo(new UpdatePresenceData()); + result.Intents.Should().Be(0); + } + + [Fact] + public void Constructor_WhenCalledWithParameters_ItShouldReturnInstance() + { + var token = "test_token"; + var properties = new IdentifyProperties + { + Os = "test_os", + Browser = "test_browser", + Device = "test_device", + }; + + var presence = new UpdatePresenceData + { + Status = "test_status", + Activities = [], + }; + + var intents = 123456789; + + var result = new IdentifyData + { + Token = token, + Properties = properties, + Presence = presence, + Intents = intents + }; + + result.Token.Should().Be(token); + result.Properties.Should().BeSameAs(properties); + result.Presence.Should().BeSameAs(presence); + result.Intents.Should().Be(intents); + } +} \ No newline at end of file diff --git a/src/StevesBot.Worker.Tests/Usings.cs b/src/StevesBot.Worker.Tests/Usings.cs index 71effcd..351d711 100644 --- a/src/StevesBot.Worker.Tests/Usings.cs +++ b/src/StevesBot.Worker.Tests/Usings.cs @@ -18,6 +18,7 @@ global using RichardSzalay.MockHttp; global using StevesBot.Worker.Discord.Gateway; global using StevesBot.Worker.Discord.Gateway.Events; +global using StevesBot.Worker.Discord.Gateway.Events.Data; global using StevesBot.Worker.Discord.Rest; global using StevesBot.Worker.Discord.Shared; global using StevesBot.Worker.Tests.Integration.Infrastructure; diff --git a/src/StevesBot.Worker/Discord/Gateway/Events/Data/Activity.cs b/src/StevesBot.Worker/Discord/Gateway/Events/Data/Activity.cs new file mode 100644 index 0000000..8546739 --- /dev/null +++ b/src/StevesBot.Worker/Discord/Gateway/Events/Data/Activity.cs @@ -0,0 +1,13 @@ +namespace StevesBot.Worker.Discord.Gateway.Events.Data; + +internal sealed record Activity +{ + [JsonPropertyName("name")] + public string Name { get; init; } = string.Empty; + + [JsonPropertyName("type")] + public int Type { get; init; } = ActivityType.Custom; + + [JsonPropertyName("state")] + public string? State { get; init; } +} diff --git a/src/StevesBot.Worker/Discord/Gateway/Events/Data/ActivityType.cs b/src/StevesBot.Worker/Discord/Gateway/Events/Data/ActivityType.cs new file mode 100644 index 0000000..081e9c9 --- /dev/null +++ b/src/StevesBot.Worker/Discord/Gateway/Events/Data/ActivityType.cs @@ -0,0 +1,6 @@ +namespace StevesBot.Worker.Discord.Gateway.Events.Data; + +internal static class ActivityType +{ + public const int Custom = 4; +} \ No newline at end of file diff --git a/src/StevesBot.Worker/Discord/Gateway/Events/Data/HelloData.cs b/src/StevesBot.Worker/Discord/Gateway/Events/Data/HelloData.cs new file mode 100644 index 0000000..c1e0d59 --- /dev/null +++ b/src/StevesBot.Worker/Discord/Gateway/Events/Data/HelloData.cs @@ -0,0 +1,7 @@ +namespace StevesBot.Worker.Discord.Gateway.Events.Data; + +internal sealed record HelloData +{ + [JsonPropertyName("heartbeat_interval")] + public int HeartbeatInterval { get; init; } +} \ No newline at end of file diff --git a/src/StevesBot.Worker/Discord/Gateway/Events/Data/IdentifyData.cs b/src/StevesBot.Worker/Discord/Gateway/Events/Data/IdentifyData.cs new file mode 100644 index 0000000..9005066 --- /dev/null +++ b/src/StevesBot.Worker/Discord/Gateway/Events/Data/IdentifyData.cs @@ -0,0 +1,16 @@ +namespace StevesBot.Worker.Discord.Gateway.Events.Data; + +internal sealed record IdentifyData +{ + [JsonPropertyName("token")] + public string Token { get; init; } = string.Empty; + + [JsonPropertyName("properties")] + public IdentifyProperties Properties { get; init; } = new(); + + [JsonPropertyName("presence")] + public UpdatePresenceData Presence { get; init; } = new(); + + [JsonPropertyName("intents")] + public long Intents { get; init; } +} diff --git a/src/StevesBot.Worker/Discord/Gateway/Events/Data/IdentifyProperties.cs b/src/StevesBot.Worker/Discord/Gateway/Events/Data/IdentifyProperties.cs new file mode 100644 index 0000000..a61e74f --- /dev/null +++ b/src/StevesBot.Worker/Discord/Gateway/Events/Data/IdentifyProperties.cs @@ -0,0 +1,13 @@ +namespace StevesBot.Worker.Discord.Gateway.Events.Data; + +internal sealed record IdentifyProperties +{ + [JsonPropertyName("os")] + public string Os { get; init; } = Environment.OSVersion.ToString(); + + [JsonPropertyName("browser")] + public string Browser { get; init; } = Assembly.GetExecutingAssembly().GetName().FullName; + + [JsonPropertyName("device")] + public string Device { get; init; } = Assembly.GetExecutingAssembly().GetName().FullName; +} \ No newline at end of file diff --git a/src/StevesBot.Worker/Discord/Gateway/Events/Data/PresenceStatus.cs b/src/StevesBot.Worker/Discord/Gateway/Events/Data/PresenceStatus.cs new file mode 100644 index 0000000..d7c5e2d --- /dev/null +++ b/src/StevesBot.Worker/Discord/Gateway/Events/Data/PresenceStatus.cs @@ -0,0 +1,7 @@ +namespace StevesBot.Worker.Discord.Gateway.Events.Data; + +internal static class PresenceStatus +{ + public const string Online = "online"; + public const string Idle = "idle"; +} diff --git a/src/StevesBot.Worker/Discord/Gateway/Events/Data/ReadyData.cs b/src/StevesBot.Worker/Discord/Gateway/Events/Data/ReadyData.cs new file mode 100644 index 0000000..3574876 --- /dev/null +++ b/src/StevesBot.Worker/Discord/Gateway/Events/Data/ReadyData.cs @@ -0,0 +1,13 @@ +namespace StevesBot.Worker.Discord.Gateway.Events.Data; + +internal sealed record ReadyData +{ + [JsonPropertyName("v")] + public int Version { get; init; } + + [JsonPropertyName("session_id")] + public string SessionId { get; init; } = string.Empty; + + [JsonPropertyName("resume_gateway_url")] + public string ResumeGatewayUrl { get; init; } = string.Empty; +} \ No newline at end of file diff --git a/src/StevesBot.Worker/Discord/Gateway/Events/Data/UpdatePresenceData.cs b/src/StevesBot.Worker/Discord/Gateway/Events/Data/UpdatePresenceData.cs new file mode 100644 index 0000000..0e6846a --- /dev/null +++ b/src/StevesBot.Worker/Discord/Gateway/Events/Data/UpdatePresenceData.cs @@ -0,0 +1,16 @@ +namespace StevesBot.Worker.Discord.Gateway.Events.Data; + +internal sealed record UpdatePresenceData +{ + [JsonPropertyName("since")] + public long? Since { get; init; } = null; + + [JsonPropertyName("activities")] + public List Activities { get; init; } = []; + + [JsonPropertyName("status")] + public string Status { get; init; } = PresenceStatus.Online; + + [JsonPropertyName("afk")] + public bool Afk { get; init; } +} diff --git a/src/StevesBot.Worker/Discord/Gateway/Events/HelloDiscordEvent.cs b/src/StevesBot.Worker/Discord/Gateway/Events/HelloDiscordEvent.cs index 16569ef..ab2c0e7 100644 --- a/src/StevesBot.Worker/Discord/Gateway/Events/HelloDiscordEvent.cs +++ b/src/StevesBot.Worker/Discord/Gateway/Events/HelloDiscordEvent.cs @@ -5,9 +5,3 @@ internal sealed record HelloDiscordEvent : DiscordEvent [JsonPropertyName("d")] public new HelloData Data { get; init; } = new HelloData(); } - -internal sealed record HelloData -{ - [JsonPropertyName("heartbeat_interval")] - public int HeartbeatInterval { get; init; } -} \ No newline at end of file diff --git a/src/StevesBot.Worker/Discord/Gateway/Events/IdentifyDiscordEvent.cs b/src/StevesBot.Worker/Discord/Gateway/Events/IdentifyDiscordEvent.cs index 267a77d..6457312 100644 --- a/src/StevesBot.Worker/Discord/Gateway/Events/IdentifyDiscordEvent.cs +++ b/src/StevesBot.Worker/Discord/Gateway/Events/IdentifyDiscordEvent.cs @@ -16,30 +16,3 @@ internal sealed record IdentifyDiscordEvent : DiscordEvent }; } } - -internal sealed record IdentifyData -{ - [JsonPropertyName("token")] - public string Token { get; init; } = string.Empty; - - [JsonPropertyName("properties")] - public IdentifyProperties Properties { get; init; } = new(); - - [JsonPropertyName("presence")] - public UpdatePresenceData Presence { get; init; } = new(); - - [JsonPropertyName("intents")] - public long Intents { get; init; } -} - -internal sealed record IdentifyProperties -{ - [JsonPropertyName("os")] - public string Os { get; init; } = Environment.OSVersion.ToString(); - - [JsonPropertyName("browser")] - public string Browser { get; init; } = Assembly.GetExecutingAssembly().GetName().FullName; - - [JsonPropertyName("device")] - public string Device { get; init; } = Assembly.GetExecutingAssembly().GetName().FullName; -} \ No newline at end of file diff --git a/src/StevesBot.Worker/Discord/Gateway/Events/ReadyDiscordEvent.cs b/src/StevesBot.Worker/Discord/Gateway/Events/ReadyDiscordEvent.cs index dfa0645..69deb59 100644 --- a/src/StevesBot.Worker/Discord/Gateway/Events/ReadyDiscordEvent.cs +++ b/src/StevesBot.Worker/Discord/Gateway/Events/ReadyDiscordEvent.cs @@ -5,15 +5,3 @@ internal sealed record ReadyDiscordEvent : DispatchDiscordEvent [JsonPropertyName("d")] public new ReadyData Data { get; init; } = new ReadyData(); } - -internal sealed record ReadyData -{ - [JsonPropertyName("v")] - public int Version { get; init; } - - [JsonPropertyName("session_id")] - public string SessionId { get; init; } = string.Empty; - - [JsonPropertyName("resume_gateway_url")] - public string ResumeGatewayUrl { get; init; } = string.Empty; -} \ No newline at end of file diff --git a/src/StevesBot.Worker/Discord/Gateway/Events/UpdatePresenceDiscordEvent.cs b/src/StevesBot.Worker/Discord/Gateway/Events/UpdatePresenceDiscordEvent.cs index b64af13..4326b2e 100644 --- a/src/StevesBot.Worker/Discord/Gateway/Events/UpdatePresenceDiscordEvent.cs +++ b/src/StevesBot.Worker/Discord/Gateway/Events/UpdatePresenceDiscordEvent.cs @@ -17,41 +17,3 @@ internal sealed record UpdatePresenceDiscordEvent : DiscordEvent }; } } - -internal sealed record UpdatePresenceData -{ - [JsonPropertyName("since")] - public long? Since { get; init; } = null; - - [JsonPropertyName("activities")] - public List Activities { get; init; } = []; - - [JsonPropertyName("status")] - public string Status { get; init; } = PresenceStatus.Online; - - [JsonPropertyName("afk")] - public bool Afk { get; init; } -} - -internal static class PresenceStatus -{ - public const string Online = "online"; - public const string Idle = "idle"; -} - -internal sealed record Activity -{ - [JsonPropertyName("name")] - public string Name { get; init; } = string.Empty; - - [JsonPropertyName("type")] - public int Type { get; init; } = ActivityType.Custom; - - [JsonPropertyName("state")] - public string? State { get; init; } -} - -internal static class ActivityType -{ - public const int Custom = 4; -} \ No newline at end of file diff --git a/src/StevesBot.Worker/Usings.cs b/src/StevesBot.Worker/Usings.cs index 347427c..b4d31d3 100644 --- a/src/StevesBot.Worker/Usings.cs +++ b/src/StevesBot.Worker/Usings.cs @@ -11,6 +11,7 @@ global using StevesBot.Worker; global using StevesBot.Worker.Discord; global using StevesBot.Worker.Discord.Gateway; global using StevesBot.Worker.Discord.Gateway.Events; +global using StevesBot.Worker.Discord.Gateway.Events.Data; global using StevesBot.Worker.Discord.Rest; global using StevesBot.Worker.Discord.Rest.Requests; global using StevesBot.Worker.Discord.Rest.Responses;