diff --git a/src/FMBot.Bot/Builders/GameBuilders.cs b/src/FMBot.Bot/Builders/GameBuilders.cs index bc9abb57..c04867fc 100644 --- a/src/FMBot.Bot/Builders/GameBuilders.cs +++ b/src/FMBot.Bot/Builders/GameBuilders.cs @@ -1,6 +1,65 @@ +using Discord; +using FMBot.Bot.Models; +using FMBot.Bot.Resources; +using System.Text; +using FMBot.Domain.Models; +using System.Threading.Tasks; +using FMBot.Bot.Services; + namespace FMBot.Bot.Builders; public class GameBuilders { - + private readonly UserService _userService; + private readonly GameService _gameService; + private readonly ArtistsService _artistsService; + + public GameBuilders(UserService userService, GameService gameService, ArtistsService artistsService) + { + this._userService = userService; + this._gameService = gameService; + this._artistsService = artistsService; + } + + public static ResponseModel GameModePick(ContextModel context) + { + var response = new ResponseModel + { + ResponseType = ResponseType.Embed, + Components = new ComponentBuilder() + .WithButton("First correct answer wins", InteractionConstants.Game.StartJumbleFirstWins) + .WithButton("Play as group", InteractionConstants.Game.StartJumbleGroup) + }; + + var description = new StringBuilder(); + + description.AppendLine("Start jumble game"); + + response.Embed.WithDescription(description.ToString()); + response.Embed.WithColor(DiscordConstants.InformationColorBlue); + + return response; + } + + public async Task StartJumbleFirstWins(ContextModel context, int userId) + { + var response = new ResponseModel + { + ResponseType = ResponseType.Embed, + }; + + var topArtists = await this._artistsService.GetUserAllTimeTopArtists(userId, true); + var artist = await this._gameService.PickArtistForJumble(topArtists); + var game = await this._gameService.StartJumbleGame(userId, context.DiscordGuild?.Id, GameType.JumbleFirstWins, artist); + + response.Embed.WithAuthor("Guess the artist - Jumble"); + + var description = new StringBuilder(); + response.Embed.WithDescription($"`{game.jumbled}`"); + response.Embed.AddField("Hint", "aasddasd"); + response.Embed.AddField("Add an answer", "Type your answer in this channel to make a guess"); + response.Embed.WithColor(DiscordConstants.InformationColorBlue); + + return response; + } } diff --git a/src/FMBot.Bot/Models/GameModels.cs b/src/FMBot.Bot/Models/GameModels.cs new file mode 100644 index 00000000..48d3d84a --- /dev/null +++ b/src/FMBot.Bot/Models/GameModels.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; + +namespace FMBot.Bot.Models; + +public class GameModel +{ + public int GameId { get; set; } + public int StarterUserId { get; set; } + public ulong? DiscordGuildId { get; set; } + + public int HintCount { get; set; } + + public GameType GameType { get; set; } + + public DateTime DateStarted { get; set; } + public DateTime? DateEnded { get; set; } + + public List Answers { get; set; } + + public string CorrectAnswer { get; set; } +} + +public class GameAnswerModel +{ + public int GameAnswerId { get; set; } + public int GameId { get; set; } + public int UserId { get; set; } + + public bool Correct { get; set; } + + public string Answer { get; set; } +} + +public enum GameType +{ + JumbleFirstWins = 1, + JumbleGroup = 2 +} + +public enum JumbleHintType +{ + Reshuffle = 1, + Description = 2 +} diff --git a/src/FMBot.Bot/Resources/InteractionConstants.cs b/src/FMBot.Bot/Resources/InteractionConstants.cs index 8db45e9a..93d41d3e 100644 --- a/src/FMBot.Bot/Resources/InteractionConstants.cs +++ b/src/FMBot.Bot/Resources/InteractionConstants.cs @@ -148,4 +148,10 @@ public static class ToggleCommand public const string GuildMembers = "guild-members"; public const string FeaturedLog = "featured-log"; + + public static class Game + { + public const string StartJumbleFirstWins = "jumble-firstwins"; + public const string StartJumbleGroup = "jumble-group"; + } } diff --git a/src/FMBot.Bot/Services/GameService.cs b/src/FMBot.Bot/Services/GameService.cs new file mode 100644 index 00000000..1522557f --- /dev/null +++ b/src/FMBot.Bot/Services/GameService.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography; +using System.Threading.Tasks; +using FMBot.Bot.Models; +using FMBot.Domain.Models; + +namespace FMBot.Bot.Services; + +public class GameService +{ + public async Task PickArtistForJumble(List topArtists) + { + return "The Beatles"; + } + + public async Task<(GameModel game, string jumbled)> StartJumbleGame(int userId, ulong? discordGuildId, GameType gameType, string artist) + { + var game = new GameModel + { + DateStarted = DateTime.UtcNow, + StarterUserId = userId, + DiscordGuildId = discordGuildId, + GameType = gameType, + CorrectAnswer = artist, + HintCount = 0 + }; + + var jumbled = JumbleWords(artist); + + + + return (game, jumbled); + } + + //public async Task GetJumbleHint(int userId, string artist) + //{ + + // var jumbled = JumbleWords(artist); + + + + // return (game, jumbled); + //} + + public static string JumbleWords(string input) + { + var words = input.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + + var jumbledWords = words.Select(JumbleWord); + + return string.Join(" ", jumbledWords); + } + + private static string JumbleWord(string word) + { + var letters = word.ToCharArray(); + + for (var i = letters.Length - 1; i > 0; i--) + { + var swapIndex = RandomNumberGenerator.GetInt32(0, i + 1); + (letters[i], letters[swapIndex]) = (letters[swapIndex], letters[i]); + } + + return new string(letters); + } +} diff --git a/src/FMBot.Bot/SlashCommands/GameSlashCommands.cs b/src/FMBot.Bot/SlashCommands/GameSlashCommands.cs new file mode 100644 index 00000000..ef530189 --- /dev/null +++ b/src/FMBot.Bot/SlashCommands/GameSlashCommands.cs @@ -0,0 +1,32 @@ +using System.Threading.Tasks; +using Discord.Interactions; +using FMBot.Bot.Attributes; +using FMBot.Bot.Builders; +using FMBot.Bot.Extensions; +using FMBot.Bot.Models; +using FMBot.Bot.Resources; +using FMBot.Bot.Services; + +namespace FMBot.Bot.SlashCommands; + +public class GameSlashCommands : InteractionModuleBase +{ + private readonly GameBuilders _gameBuilders; + private readonly UserService _userService; + + public GameSlashCommands(GameBuilders gameBuilders, UserService userService) + { + this._gameBuilders = gameBuilders; + this._userService = userService; + } + + [ComponentInteraction(InteractionConstants.Game.StartJumbleFirstWins)] + public async Task StartJumbleFirstAnswerWins() + { + var contextUser = await this._userService.GetUserSettingsAsync(this.Context.User); + + var response = await this._gameBuilders.StartJumbleFirstWins(new ContextModel(this.Context), contextUser.UserId); + + await this.Context.UpdateInteractionEmbed(response); + } +} diff --git a/src/FMBot.Bot/Startup.cs b/src/FMBot.Bot/Startup.cs index 8a64cf07..7ce2cda2 100644 --- a/src/FMBot.Bot/Startup.cs +++ b/src/FMBot.Bot/Startup.cs @@ -183,6 +183,7 @@ private void ConfigureServices(IServiceCollection services) .AddSingleton() .AddSingleton() .AddSingleton() + .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() diff --git a/src/FMBot.Bot/TextCommands/GameCommands.cs b/src/FMBot.Bot/TextCommands/GameCommands.cs index 6a97054e..36b28098 100644 --- a/src/FMBot.Bot/TextCommands/GameCommands.cs +++ b/src/FMBot.Bot/TextCommands/GameCommands.cs @@ -30,10 +30,10 @@ public GameCommands(IOptions botSettings, UserService userService, this.Interactivity = interactivity; } - //[Command("jumble", RunMode = RunMode.Async)] - //[Summary("Play the Jumble game.")] + [Command("jumble", RunMode = RunMode.Async)] + [Summary("Play the Jumble game.")] [UsernameSetRequired] - //[CommandCategories(CommandCategory.Friends)] + [CommandCategories(CommandCategory.Friends)] public async Task JumbleAsync() { _ = this.Context.Channel.TriggerTypingAsync(); @@ -43,10 +43,10 @@ public async Task JumbleAsync() try { - //var response = await this._gameBuilders.FriendsAsync(new ContextModel(this.Context, prfx, contextUser)); + var response = GameBuilders.GameModePick(new ContextModel(this.Context, prfx, contextUser)); - //await this.Context.SendResponse(this.Interactivity, response); - //this.Context.LogCommandUsed(response.CommandResponse); + await this.Context.SendResponse(this.Interactivity, response); + this.Context.LogCommandUsed(response.CommandResponse); } catch (Exception e) { diff --git a/src/FMBot.Discord.slnLaunch b/src/FMBot.Discord.slnLaunch index 50ee5a48..0f883f1d 100644 --- a/src/FMBot.Discord.slnLaunch +++ b/src/FMBot.Discord.slnLaunch @@ -4,7 +4,7 @@ "Projects": [ { "Name": "..\\..\\fmbot-web-backend\\src\\Web.InternalApi\\Web.InternalApi.csproj", - "Action": "Start", + "Action": "StartWithoutDebugging", "DebugTarget": "http" }, { diff --git a/src/FMBot.Domain/Models/TopTrack.cs b/src/FMBot.Domain/Models/TopTrack.cs index 49fc62dd..cceb88dc 100644 --- a/src/FMBot.Domain/Models/TopTrack.cs +++ b/src/FMBot.Domain/Models/TopTrack.cs @@ -21,7 +21,7 @@ public class TopTrack public string TrackName { get; set; } public string TrackUrl { get; set; } - + public string ArtistName { get; set; } public string ArtistUrl { get; set; }