Skip to content
Open
Show file tree
Hide file tree
Changes from 2 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
46 changes: 46 additions & 0 deletions src/Directory.Build.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
<PropertyGroup>
<WarningLevel>6</WarningLevel>
<WarningsAsErrors></WarningsAsErrors>
<NoWarn>CS1591;CA5349</NoWarn>
<Nullable>disable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors>
<RunAnalyzersDuringBuild>true</RunAnalyzersDuringBuild>
<EnforceCodeStyleInBuild>True</EnforceCodeStyleInBuild>
<RunAnalyzersDuringLiveAnalysis>true</RunAnalyzersDuringLiveAnalysis>
<EnableNETAnalyzers>true</EnableNETAnalyzers>
<AnalysisLevel>latest</AnalysisLevel>
<AnalysisMode>All</AnalysisMode>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<Authors>4DotNet</Authors>
<Title>Whack-A-Mole Core Library</Title>
<Company>4Dotnet Whack-A-Mole Team</Company>
<Copyright>(c) 2024 - rights reserved</Copyright>
<Product>WAM.Core</Product>
<ProductName>Whack-a-mole core</ProductName>
<ProductVersion>1.0.0</ProductVersion>
<LangVersion>12</LangVersion>
</PropertyGroup>

<ItemGroup Label ="Dotnet build visibility">
<CompilerVisibleProperty Include="RootNamespace" />
<CompilerVisibleProperty Include="ProjectDir" />
</ItemGroup>

<ItemGroup Label="Analyzers">
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" />
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.CodeStyle" />
<PackageReference Include="Roslynator.Analyzers" />
<PackageReference Include="Roslynator.CodeAnalysis.Analyzers" />
<PackageReference Include="Roslynator.Formatting.Analyzers" />
<PackageReference Include="SonarAnalyzer.CSharp" />
<PackageReference Include="AsyncFixer" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Analyzers" />
<PackageReference Include="Microsoft.Azure.Functions.Analyzers" />
<PackageReference Include="Microsoft.AspNetCore.Components.Analyzers" />
</ItemGroup>
</Project>
66 changes: 66 additions & 0 deletions src/Directory.Packages.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
<CentralPackageVersionOverrideEnabled>false</CentralPackageVersionOverrideEnabled>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Azure.Identity" Version="1.10.4" />
<PackageVersion Include="Azure.Messaging.WebPubSub" Version="1.3.0" />
<PackageVersion Include="HexMaster.RedisCache" Version="0.1.6" />
<PackageVersion Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.22.0" />
<PackageVersion Include="Microsoft.Azure.AppConfiguration.AspNetCore" Version="7.0.0" />
<PackageVersion Include="Microsoft.Extensions.Azure" Version="1.7.1" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>

<ItemGroup Label="Analyzers">
<PackageVersion Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="8.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageVersion>
<PackageVersion Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.8.14">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageVersion>
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp.CodeStyle" Version="4.8.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageVersion>
<PackageVersion Include="Roslynator.Analyzers" Version="4.9.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageVersion>
<PackageVersion Include="Roslynator.CodeAnalysis.Analyzers" Version="4.9.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageVersion>
<PackageVersion Include="Roslynator.Formatting.Analyzers" Version="4.9.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageVersion>
<PackageVersion Include="SonarAnalyzer.CSharp" Version="9.17.0.82934">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageVersion>
<PackageVersion Include="AsyncFixer" Version="1.6.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageVersion>
<PackageVersion Include="Microsoft.EntityFrameworkCore.Analyzers" Version="8.0.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageVersion>
<PackageVersion Include="Microsoft.Azure.Functions.Analyzers" Version="1.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageVersion>
<PackageVersion Include="Microsoft.AspNetCore.Components.Analyzers" Version="8.0.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageVersion>
</ItemGroup>
</Project>
8 changes: 4 additions & 4 deletions src/Wam.Core/Configuration/AzureServices.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
public class AzureServices
{
public const string SectionName = "AzureServices";
public string WebPubSubEndpoint { get; set; }
public string WebPubSubHub{ get; set; }
public string UsersStorageAccountName { get; set; }
public string GamesStorageAccountName { get; set; }
public string WebPubSubEndpoint { get; set; } = string.Empty;
public string WebPubSubHub{ get; set; } = string.Empty;
public string UsersStorageAccountName { get; set; } = string.Empty;
public string GamesStorageAccountName { get; set; } = string.Empty;
}
13 changes: 9 additions & 4 deletions src/Wam.Core/Configuration/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Microsoft.Extensions.Azure;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System.Diagnostics.CodeAnalysis;
using Wam.Core.Identity;

namespace Wam.Core.Configuration;
Expand All @@ -10,18 +11,22 @@ public static class ServiceCollectionExtensions
{
public static IServiceCollection AddWamCoreConfiguration(
this IServiceCollection services,
IConfiguration configuration,
[NotNull] IConfiguration configuration,
bool skipApplicationInsights = false)
{
var azureServicesOptions = configuration.GetSection(AzureServices.SectionName).Get<AzureServices>();
var azureServicesOptions = configuration
.GetSection(AzureServices.SectionName)
.Get<AzureServices>()
?? throw new InvalidOperationException("Missing Azure Services configuration");

services.AddHealthChecks();
services.AddOptions<AzureServices>().Bind(configuration.GetSection(AzureServices.SectionName)); //.ValidateOnStart();
services.AddOptions<AzureServices>().Bind(configuration.GetRequiredSection(AzureServices.SectionName));
services.AddAzureClients(builder =>
{
builder.AddWebPubSubServiceClient(
new Uri(azureServicesOptions.WebPubSubEndpoint),
azureServicesOptions.WebPubSubHub,
CloudIdentity.GetCloudIdentity());
CloudIdentity.GetCloudIdentity);
});

if (!skipApplicationInsights)
Expand Down
29 changes: 9 additions & 20 deletions src/Wam.Core/Enums/GameState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@ namespace Wam.Core.Enums;
public abstract class GameState
{

public static readonly GameState New;
public static readonly GameState Current;
public static readonly GameState Started;
public static readonly GameState Finished;
public static readonly GameState Cancelled;
public static readonly GameState[] All;
public static readonly GameState Init = new GameStateInit();
public static readonly GameState Current = new GameStateCurrent();
public static readonly GameState Started = new GameStateStarted();
public static readonly GameState Finished = new GameStateFinished();
public static readonly GameState Cancelled = new GameStateCancelled();
public static readonly GameState[] All = { Init, Current, Started, Finished, Cancelled };

public static GameState FromCode(string code)
{
var state = All.FirstOrDefault(s => s.Code == code);
var state = Array.Find(All, s => s.Code == code);
if (state == null)
{
throw new InvalidOperationException($"Invalid game state code {code}");
Expand All @@ -27,22 +27,11 @@ public static GameState FromCode(string code)

public virtual bool CanChangeTo(GameState state) => false;

static GameState()
{
All = new[]
{
New = new GameStateNew() ,
Current = new GameStateCurrent(),
Started = new GameStateStarted(),
Finished = new GameStateFinished(),
Cancelled = new GameStateCancelled()
};
}
}

public class GameStateNew : GameState
public class GameStateInit : GameState
{
public override string Code => "New";
public override string Code => "Init";
public override bool CanChangeTo(GameState state)
{
return state == Current || state == Cancelled;
Expand Down
11 changes: 8 additions & 3 deletions src/Wam.Core/ErrorCodes/WamErrorCode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,14 @@

public abstract class WamErrorCode
{

public abstract string Code { get; }
public virtual string Namespace { get; } = "Wam.ErrorCodes";
public virtual string TranslationKey => $"{Namespace}.{Code}";
public virtual string RootNamespace { get; } = "Wam.ErrorCodes";
public virtual string TranslationKey => $"{RootNamespace}.{Code}";

public static WamErrorCode Unknown() => new Unknown();
}

public class Unknown : WamErrorCode
{
public override string Code => "Unknown";
}
4 changes: 2 additions & 2 deletions src/Wam.Core/Events/RealtimeEvent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ namespace Wam.Core.Events;

public class RealtimeEvent<T>
{
public string Message { get; set; }
public T Data { get; set; }
public string Message { get; set; } = string.Empty;
public T Data { get; set; } = default!;

public string ToJson()
{
Expand Down
14 changes: 13 additions & 1 deletion src/Wam.Core/Exceptions/WamException.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,19 @@

namespace Wam.Core.Exceptions;

public class WamException(WamErrorCode error, string message) : Exception(message)
public class WamException(WamErrorCode error, string message, Exception? innerException) : Exception (message, innerException)
{
public WamErrorCode Error { get; } = error;

public WamException() : this(WamErrorCode.Unknown(), "An unknown error occurred.", null)
{
}

public WamException(string message) : this(WamErrorCode.Unknown(), message, null)
{
}

public WamException(string message, Exception innerException) : this(WamErrorCode.Unknown(), message, innerException)
{
}
}
2 changes: 1 addition & 1 deletion src/Wam.Core/ExtensionMethods/ConfigurationExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ public static class ConfigurationExtensions
{
public static string GetRequiredValue(this IConfiguration configuration, string key, string? description = null)
{
string value = configuration.GetValue<string>(key);
var value = configuration.GetValue<string>(key)??string.Empty;
if (string.IsNullOrWhiteSpace(value))
{
throw new InvalidOperationException("Missing setting " + ((description != null) ? ("for " + description) : "") + " : " + key);
Expand Down
16 changes: 6 additions & 10 deletions src/Wam.Core/ExtensionMethods/StringExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,21 +1,17 @@
namespace Wam.Core.ExtensionMethods;
using System.Security.Cryptography;
namespace Wam.Core.ExtensionMethods;

public static class StringExtensions
{
private const string Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
private static readonly Random Random;

public static string GenerateGameCode(int length = 6)
{
var result = new string(
Enumerable.Repeat(Chars, length)
.Select(s => s[Random.Next(s.Length)])
.ToArray());
Enumerable
.Repeat(Chars, length)
.Select(s => s[RandomNumberGenerator.GetInt32(s.Length)])
.ToArray());
return result;
}

static StringExtensions()
{
Random = new Random();
}
}
9 changes: 3 additions & 6 deletions src/Wam.Core/Identity/CloudIdentity.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,10 @@

namespace Wam.Core.Identity;

public class CloudIdentity
public static class CloudIdentity
{
public static TokenCredential GetCloudIdentity()
{
return new ChainedTokenCredential(
public static TokenCredential GetCloudIdentity => new ChainedTokenCredential(
new ManagedIdentityCredential(),
new VisualStudioCredential(),
new AzureCliCredential());
}
new AzureCliCredential());
}
22 changes: 11 additions & 11 deletions src/Wam.Core/Wam.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,17 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Azure.Identity" Version="1.10.4" />
<PackageReference Include="Azure.Messaging.WebPubSub" Version="1.3.0" />
<PackageReference Include="HexMaster.RedisCache" Version="0.1.6" />
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.22.0" />
<PackageReference Include="Microsoft.Azure.AppConfiguration.AspNetCore" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Azure" Version="1.7.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Options" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Azure.Identity" />
<PackageReference Include="Azure.Messaging.WebPubSub" />
<PackageReference Include="HexMaster.RedisCache" />
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" />
<PackageReference Include="Microsoft.Azure.AppConfiguration.AspNetCore" />
<PackageReference Include="Microsoft.Extensions.Azure" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" />
<PackageReference Include="Microsoft.Extensions.Options" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" />
<PackageReference Include="Newtonsoft.Json" />
</ItemGroup>

</Project>
8 changes: 7 additions & 1 deletion src/wam-core-library.sln
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,13 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.6.33717.318
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wam.Core", "Wam.Core\Wam.Core.csproj", "{D5F4E98F-FFD3-4448-B17C-56AA61719D59}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wam.Core", "Wam.Core\Wam.Core.csproj", "{D5F4E98F-FFD3-4448-B17C-56AA61719D59}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F83C7DFC-90A3-4D64-98DE-C5F2156E7752}"
ProjectSection(SolutionItems) = preProject
Directory.Build.props = Directory.Build.props
Directory.Packages.props = Directory.Packages.props
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand Down