Skip to content

Signups refactor #29

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 17 commits into from
Closed
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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
14 changes: 1 addition & 13 deletions ArmaforcesMissionBot.sln
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,16 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.28729.10
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ArmaforcesMissionBotWeb", "ArmaforcesMissionBotWeb\ArmaforcesMissionBotWeb.csproj", "{F58CF544-6ED7-4468-A681-5CDAE3F60AE4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArmaforcesMissionBotSharedClasses", "ArmaforcesMissionBotSharedClasses\ArmaforcesMissionBotSharedClasses.csproj", "{3C406BBC-0631-4F73-BADB-4D6DB3240376}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ArmaforcesMissionBot", "ArmaforcesMissionBot\ArmaforcesMissionBot.csproj", "{9BD71946-1FB7-4461-9FFA-B20085B5B663}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArmaforcesMissionBot.Tests", "ArmaforcesMissionBot.Tests\ArmaforcesMissionBot.Tests.csproj", "{AE3D33CC-1515-47D3-AA67-CB285DBBA9D2}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ArmaforcesMissionBot.Tests", "ArmaforcesMissionBot.Tests\ArmaforcesMissionBot.Tests.csproj", "{AE3D33CC-1515-47D3-AA67-CB285DBBA9D2}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{F58CF544-6ED7-4468-A681-5CDAE3F60AE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F58CF544-6ED7-4468-A681-5CDAE3F60AE4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F58CF544-6ED7-4468-A681-5CDAE3F60AE4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F58CF544-6ED7-4468-A681-5CDAE3F60AE4}.Release|Any CPU.Build.0 = Release|Any CPU
{3C406BBC-0631-4F73-BADB-4D6DB3240376}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3C406BBC-0631-4F73-BADB-4D6DB3240376}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3C406BBC-0631-4F73-BADB-4D6DB3240376}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3C406BBC-0631-4F73-BADB-4D6DB3240376}.Release|Any CPU.Build.0 = Release|Any CPU
{9BD71946-1FB7-4461-9FFA-B20085B5B663}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9BD71946-1FB7-4461-9FFA-B20085B5B663}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9BD71946-1FB7-4461-9FFA-B20085B5B663}.Release|Any CPU.ActiveCfg = Release|Any CPU
Expand Down
3 changes: 3 additions & 0 deletions ArmaforcesMissionBot.sln.DotSettings
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/UserDictionary/Words/=Modset/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Signups/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
4 changes: 0 additions & 4 deletions ArmaforcesMissionBot/ArmaforcesMissionBot.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,4 @@
<PackageReference Include="RestSharp" Version="106.11.7" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\ArmaforcesMissionBotSharedClasses\ArmaforcesMissionBotSharedClasses.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace ArmaforcesMissionBot.Configuration.Constants
{
public class SignupsConstants
{
public const int MinimumSignupsDurationInDays = 1;
}
}
21 changes: 11 additions & 10 deletions ArmaforcesMissionBot/Controllers/ApiController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
using System.Linq;
using System.Threading.Tasks;
using ArmaforcesMissionBot.DataClasses;
using ArmaforcesMissionBot.Features.Signups.Missions;
using ArmaforcesMissionBot.Helpers;
using ArmaforcesMissionBotSharedClasses;
using Discord;
using Discord.WebSocket;
using Microsoft.AspNetCore.Http;
Expand Down Expand Up @@ -73,10 +73,11 @@ public void Missions(DateTime? fromDateTime = null, DateTime? toDateTime = null,

JArray missionArray = new JArray();
var openMissionsEnumerable = _signupsData.Missions
.Where(x => x.Editing == ArmaforcesMissionBotSharedClasses.Mission.EditEnum.NotEditing)
.Where(x => x.Editing == Features.Signups.Missions.Mission.EditEnum.NotEditing)
.Where(x => x.Date >= fromDateTime)
.Where(x => x.Date <= toDateTime)
.Reverse();

foreach (var mission in openMissionsEnumerable)
{
var objMission = new JObject();
Expand All @@ -89,8 +90,8 @@ public void Missions(DateTime? fromDateTime = null, DateTime? toDateTime = null,
objMission.Add("modlistName", mission.ModlistName);
objMission.Add("modlistUrl", mission.ModlistUrl);
objMission.Add("id", mission.SignupChannel);
objMission.Add("freeSlots", Helpers.MiscHelper.CountFreeSlots(mission));
objMission.Add("allSlots", Helpers.MiscHelper.CountAllSlots(mission));
objMission.Add("freeSlots", MiscHelper.CountFreeSlots(mission));
objMission.Add("allSlots", MiscHelper.CountAllSlots(mission));
objMission.Add("state", "Open");

missionArray.Add(objMission);
Expand Down Expand Up @@ -180,7 +181,7 @@ public async Task Signup(ulong missionID, ulong teamID, ulong userID, string slo
{
var team = mission.Teams.Single(x => x.TeamMsg == teamID);

if (team.Slots.Any(x => x.Emoji == slotID && x.Count > x.Signed.Count()))
if (team.Slots.Any(x => x.Emoji.Name == slotID && x.Count > x.Signed.Count()))
{
var channel = _client.GetGuild(_config.AFGuild).GetTextChannel(missionID);
var teamMsg = await channel.GetMessageAsync(teamID) as IUserMessage;
Expand All @@ -189,7 +190,7 @@ public async Task Signup(ulong missionID, ulong teamID, ulong userID, string slo

if (!mission.SignedUsers.Contains(userID))
{
var slot = team.Slots.Single(x => x.Emoji == slotID);
var slot = team.Slots.Single(x => x.Emoji.Name == slotID);
slot.Signed.Add(userID);
mission.SignedUsers.Add(userID);

Expand Down Expand Up @@ -259,7 +260,7 @@ public async Task Signoff(ulong missionID, ulong teamID, ulong userID, string sl
{
var team = mission.Teams.Single(x => x.TeamMsg == teamID);

if (team.Slots.Any(x => x.Emoji == slotID))
if (team.Slots.Any(x => x.Emoji.Name == slotID))
{
var channel = _client.GetGuild(_config.AFGuild).GetTextChannel(missionID);
var teamMsg = await channel.GetMessageAsync(teamID) as IUserMessage;
Expand All @@ -268,7 +269,7 @@ public async Task Signoff(ulong missionID, ulong teamID, ulong userID, string sl

if (mission.SignedUsers.Contains(userID))
{
var slot = team.Slots.Single(x => x.Emoji == slotID);
var slot = team.Slots.Single(x => x.Emoji.Name == slotID);
slot.Signed.Remove(userID);
mission.SignedUsers.Remove(userID);

Expand Down Expand Up @@ -347,10 +348,10 @@ public async Task CreateMissionAsync(Mission mission)
{
Console.WriteLine(JsonConvert.SerializeObject(mission));

mission.Editing = ArmaforcesMissionBotSharedClasses.Mission.EditEnum.New;
mission.Editing = Features.Signups.Missions.Mission.EditEnum.New;
_signupsData.Missions.Add(mission);

if (Helpers.SignupHelper.CheckMissionComplete(mission))
if (SignupHelper.CheckMissionComplete(mission))
{
var guild = _client.GetGuild(_config.AFGuild);

Expand Down
2 changes: 1 addition & 1 deletion ArmaforcesMissionBot/DataClasses/MissionsArchiveData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using ArmaforcesMissionBotSharedClasses;
using ArmaforcesMissionBot.Features.Signups.Missions;

namespace ArmaforcesMissionBot.DataClasses
{
Expand Down
5 changes: 1 addition & 4 deletions ArmaforcesMissionBot/DataClasses/SignupsData.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Text;
using System.Threading;
using ArmaforcesMissionBotSharedClasses;
using ArmaforcesMissionBot.Features.Signups.Missions;

namespace ArmaforcesMissionBot.DataClasses
{
Expand Down
49 changes: 43 additions & 6 deletions ArmaforcesMissionBot/DependencyInjection/BoderatorModules.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,17 @@
using ArmaForces.ArmaServerManager.Discord.Extensions;
using ArmaforcesMissionBot.DataClasses;
using ArmaforcesMissionBot.Extensions;
using ArmaforcesMissionBot.Features.Emojis;
using ArmaforcesMissionBot.Features.Modsets;
using ArmaforcesMissionBot.Features.Modsets.Legacy;
using ArmaforcesMissionBot.Features.RichPresence;
using ArmaforcesMissionBot.Features.ServerManager;
using ArmaforcesMissionBot.Features.Signups;
using ArmaforcesMissionBot.Features.Signups.Missions.Slots;
using ArmaforcesMissionBot.Features.Signups.Missions.Validators;
using ArmaforcesMissionBot.Helpers;
using ArmaforcesMissionBot.Modules;
using ArmaforcesMissionBot.Providers.Guild;
using ArmaforcesMissionBot.Services;
using Discord.WebSocket;
using Microsoft.Extensions.DependencyInjection;
Expand All @@ -18,28 +24,59 @@ public static class BoderatorModules
{
public static IServiceCollection AddBoderatorModules(this IServiceCollection serviceCollection)
=> serviceCollection
.AddConfig()
.AddSingleton(CreateDiscordSocketClient)
.AddSingleton(CreateConfig)
.AddSingleton<SignupsData>()
.AddSingleton<OpenedDialogs>()
.AddSingleton<MissionsArchiveData>()
.AddSingleton<GameStatusUpdater>()
.AddSingleton<MiscHelper>()
.AddSingleton<SignupHelper>()
.AddSingleton<BanHelper>()
.AddSingleton<IGuildProviderFactory, GuildProviderFactory>()
.AddSingleton(GuildProviderFactory.CreateGuildProvider)
.AddTransient<IEmoteProvider, EmoteProvider>()
.AddSignupsModules()
.AddLogging()
.AddHostedService<StartupService>()
.AddSingleton<IModsetsApiClient, ModsetsApiClient>()
.AddSingleton(provider => string.IsNullOrWhiteSpace(provider.GetService<Config>().ModsetsApiUrl)
? (IModsetProvider) new LegacyModsetProvider()
: new ModsetProvider(provider.GetService<IModsetsApiClient>()))
.AddModsetProvider()
.AddCommandModules()
.AddServerManager<ServerManagerConfiguration>();

private static Config CreateConfig(IServiceProvider serviceCollection)
private static IServiceCollection AddCommandModules(this IServiceCollection serviceCollection)
=> serviceCollection
.AddTransient<Bans>()
.AddTransient<Misc>()
.AddTransient<Mods>()
.AddTransient<Ranks>()
.AddTransient<Server>()
.AddTransient<ServerConfig>()
.AddTransient<Signups>()
.AddTransient<Stats>();

private static IServiceCollection AddModsetProvider(this IServiceCollection serviceCollection) =>
serviceCollection.AddSingleton(provider =>
string.IsNullOrWhiteSpace(provider.GetService<Config>().ModsetsApiUrl)
? (IModsetProvider) new LegacyModsetProvider()
: new ModsetProvider(provider.GetService<IModsetsApiClient>()));

private static IServiceCollection AddSignupsModules(this IServiceCollection serviceCollection)
{
return serviceCollection
.AddTransient<ISlotFactory, SlotFactory>()
.AddTransient<IMissionValidator, MissionValidator>()
.AddTransient<ISignupsBuilder, SignupsBuilder>()
.AddTransient<ISignupsLogic, SignupsLogic>()
.AddSingleton<ISignupsBuilderDictionary, SignupsBuilderDictionary>()
.AddTransient<ISignupsBuilderFactory, SignupsBuilderFactory>();
}

private static IServiceCollection AddConfig(this IServiceCollection serviceCollection)
{
var config = new Config();
config.Load();
return config;
return serviceCollection.AddSingleton(config);
}

private static DiscordSocketClient CreateDiscordSocketClient(IServiceProvider provider)
Expand Down
43 changes: 35 additions & 8 deletions ArmaforcesMissionBot/Extensions/SignupsDataExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,20 +1,47 @@
using ArmaforcesMissionBot.DataClasses;
using ArmaforcesMissionBotSharedClasses;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ArmaforcesMissionBot.Features.Signups.Missions;
using CSharpFunctionalExtensions;
using Discord;

namespace ArmaforcesMissionBot.Extensions
{
public static class SignupsDataExtensions
{
public static Mission GetCurrentlyEditedMission(this SignupsData signupsData, ulong userId)
{
return signupsData.Missions.SingleOrDefault(x =>
x.Owner == userId &&
((x.Editing == ArmaforcesMissionBotSharedClasses.Mission.EditEnum.New) ||
(x.Editing == ArmaforcesMissionBotSharedClasses.Mission.EditEnum.Started)));
return signupsData.Missions.SingleOrDefault(mission =>
mission.Owner == userId &&
(mission.Editing == Mission.EditEnum.New ||
mission.Editing == Mission.EditEnum.Started));
}

#nullable enable
public static Mission? GetCurrentlyCreatedMission(this SignupsData signupsData, ulong userId)
#nullable restore
{
return signupsData.Missions.SingleOrDefault(mission =>
mission.Owner == userId &&
mission.Editing == Mission.EditEnum.New);
}

public static Result<Mission> GetUserMissionForEdition(
this SignupsData signupsData,
IUser user,
IGuildChannel channel)
{
var missionToBeEdited = signupsData.Missions.FirstOrDefault(x => x.SignupChannel == channel.Id);
if (missionToBeEdited is null)
{
return Result.Failure<Mission>("There is no such mission.");
}

if (missionToBeEdited.Owner != user.Id)
{
return Result.Failure<Mission>("You cannot edit not owned missions.");
}

return Result.Success(missionToBeEdited);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using System;
using ArmaforcesMissionBot.DataClasses;
using Discord;

namespace ArmaforcesMissionBot.Features.Bans.Extensions
{
public static class SignupsDataBansExtensions
{
public static bool UserHasBan(this SignupsData signupsData, IUser user, DateTime missionDate)
=> UserHasBan(signupsData, user.Id, missionDate);

public static bool UserHasBan(this SignupsData signupsData, ulong userId, DateTime missionDate)
{
return signupsData.SignupBans.ContainsKey(userId)
&& signupsData.SignupBans[userId] > missionDate;
}
}
}
22 changes: 22 additions & 0 deletions ArmaforcesMissionBot/Features/Emojis/Constants/EmojiConstants.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using Discord;

namespace ArmaforcesMissionBot.Features.Emojis.Constants
{
/// <summary>
/// Built in Discord emojis.
/// </summary>
internal static class EmojiConstants
{
public static Emoji Ambulance { get; } = new Emoji("🚑");

public static Emoji ArrowDownEmote { get; } = new Emoji("⬇");

public static Emoji ArrowUpEmote { get; } = new Emoji("⬆");

public static Emoji LockEmote { get; } = new Emoji("🔒");

public static Emoji PinEmote { get; } = new Emoji("📍");

public static Emoji ScissorsEmote { get; } = new Emoji("✂");
}
}
14 changes: 14 additions & 0 deletions ArmaforcesMissionBot/Features/Emojis/Constants/EmoteConstants.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using Discord;

namespace ArmaforcesMissionBot.Features.Emojis.Constants
{
/// <summary>
/// Server custom emojis.
/// </summary>
internal static class EmoteConstants
{
public static Emote Beton { get; } = Emote.Parse("<:beton:437603383373987853>");

public static Emote WscieklyZulu { get; } = Emote.Parse("<:wsciekly_zulu:426139721001992193>");
}
}
28 changes: 28 additions & 0 deletions ArmaforcesMissionBot/Features/Emojis/EmoteProvider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using System;
using Discord;

namespace ArmaforcesMissionBot.Features.Emojis
{
internal class EmoteProvider : IEmoteProvider
{
public IEmote GetEmoteFromString(string emojiString)
{
// TODO: Get list of custom emotes from context.Guild.Emotes
try
{
return GetCustomEmoji(emojiString);
}
catch (ArgumentException)
{
return GetStandardEmoji(emojiString);
}
}

private static Emote GetCustomEmoji(string emojiName)
{
return Emote.Parse(emojiName);
}

private static Emoji GetStandardEmoji(string emojiName) => new Emoji(emojiName);
}
}
9 changes: 9 additions & 0 deletions ArmaforcesMissionBot/Features/Emojis/IEmoteProvider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using Discord;

namespace ArmaforcesMissionBot.Features.Emojis
{
internal interface IEmoteProvider
{
IEmote GetEmoteFromString(string emojiString);
}
}
Loading