You can now edit hangman.json to add more categories
This commit is contained in:
		@@ -12,37 +12,15 @@ using System.Threading.Tasks;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace NadekoBot.Modules.Games.Commands.Hangman
 | 
					namespace NadekoBot.Modules.Games.Commands.Hangman
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    public class HangmanModel
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        public List<HangmanObject> All { get; set; }
 | 
					 | 
				
			||||||
        public List<HangmanObject> Animals { get; set; }
 | 
					 | 
				
			||||||
        public List<HangmanObject> Countries { get; set; }
 | 
					 | 
				
			||||||
        public List<HangmanObject> Movies { get; set; }
 | 
					 | 
				
			||||||
        public List<HangmanObject> Things { get; set; }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public class HangmanTermPool
 | 
					    public class HangmanTermPool
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public enum HangmanTermType
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            All,
 | 
					 | 
				
			||||||
            Animals,
 | 
					 | 
				
			||||||
            Countries,
 | 
					 | 
				
			||||||
            Movies,
 | 
					 | 
				
			||||||
            Things
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        const string termsPath = "data/hangman.json";
 | 
					        const string termsPath = "data/hangman.json";
 | 
				
			||||||
        public static HangmanModel data { get; }
 | 
					        public static IReadOnlyDictionary<string, HangmanObject[]> data { get; }
 | 
				
			||||||
        static HangmanTermPool()
 | 
					        static HangmanTermPool()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            try
 | 
					            try
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                data = JsonConvert.DeserializeObject<HangmanModel>(File.ReadAllText(termsPath));
 | 
					                data = JsonConvert.DeserializeObject<Dictionary<string, HangmanObject[]>>(File.ReadAllText(termsPath));
 | 
				
			||||||
                data.All = data.Animals.Concat(data.Countries)
 | 
					 | 
				
			||||||
                                       .Concat(data.Movies)
 | 
					 | 
				
			||||||
                                       .Concat(data.Things)
 | 
					 | 
				
			||||||
                                       .ToList();
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            catch (Exception ex)
 | 
					            catch (Exception ex)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@@ -50,23 +28,27 @@ namespace NadekoBot.Modules.Games.Commands.Hangman
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public static HangmanObject GetTerm(HangmanTermType type)
 | 
					        public static HangmanObject GetTerm(string type)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					            if (string.IsNullOrWhiteSpace(type))
 | 
				
			||||||
 | 
					                throw new ArgumentNullException(nameof(type));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            type = type.Trim();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var rng = new NadekoRandom();
 | 
					            var rng = new NadekoRandom();
 | 
				
			||||||
            switch (type)
 | 
					
 | 
				
			||||||
            {
 | 
					            if (type == "All") {
 | 
				
			||||||
                case HangmanTermType.Animals:
 | 
					                var keys = data.Keys.ToArray();
 | 
				
			||||||
                    return data.Animals[rng.Next(0, data.Animals.Count)];
 | 
					                type = keys[rng.Next(0, keys.Length)];
 | 
				
			||||||
                case HangmanTermType.Countries:
 | 
					 | 
				
			||||||
                    return data.Countries[rng.Next(0, data.Countries.Count)];
 | 
					 | 
				
			||||||
                case HangmanTermType.Movies:
 | 
					 | 
				
			||||||
                    return data.Movies[rng.Next(0, data.Movies.Count)];
 | 
					 | 
				
			||||||
                case HangmanTermType.Things:
 | 
					 | 
				
			||||||
                    return data.Things[rng.Next(0, data.Things.Count)];
 | 
					 | 
				
			||||||
                default:
 | 
					 | 
				
			||||||
                    return data.All[rng.Next(0, data.All.Count)];
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            HangmanObject[] termTypes;
 | 
				
			||||||
 | 
					            data.TryGetValue(type, out termTypes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (termTypes.Length == 0)
 | 
				
			||||||
 | 
					                return null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return termTypes[rng.Next(0, termTypes.Length)];
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -95,20 +77,23 @@ namespace NadekoBot.Modules.Games.Commands.Hangman
 | 
				
			|||||||
        public bool GuessedAll => Guesses.IsSupersetOf(Term.Word.ToUpperInvariant()
 | 
					        public bool GuessedAll => Guesses.IsSupersetOf(Term.Word.ToUpperInvariant()
 | 
				
			||||||
                                                           .Where(c => char.IsLetter(c) || char.IsDigit(c)));
 | 
					                                                           .Where(c => char.IsLetter(c) || char.IsDigit(c)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public HangmanTermPool.HangmanTermType TermType { get; }
 | 
					        public string TermType { get; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public event Action<HangmanGame> OnEnded;
 | 
					        public event Action<HangmanGame> OnEnded;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public HangmanGame(IMessageChannel channel, HangmanTermPool.HangmanTermType type)
 | 
					        public HangmanGame(IMessageChannel channel, string type)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            _log = LogManager.GetCurrentClassLogger();
 | 
					            _log = LogManager.GetCurrentClassLogger();
 | 
				
			||||||
            this.GameChannel = channel;
 | 
					            this.GameChannel = channel;
 | 
				
			||||||
            this.TermType = type;
 | 
					            this.TermType = type.ToTitleCase();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public void Start()
 | 
					        public void Start()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            this.Term = HangmanTermPool.GetTerm(TermType);
 | 
					            this.Term = HangmanTermPool.GetTerm(TermType);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (this.Term == null)
 | 
				
			||||||
 | 
					                throw new KeyNotFoundException("Can't find a term with that type. Use hangmanlist command.");
 | 
				
			||||||
            // start listening for answers when game starts
 | 
					            // start listening for answers when game starts
 | 
				
			||||||
            NadekoBot.Client.MessageReceived += PotentialGuess;
 | 
					            NadekoBot.Client.MessageReceived += PotentialGuess;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,7 +23,7 @@ namespace NadekoBot.Modules.Games
 | 
				
			|||||||
            static HangmanCommands()
 | 
					            static HangmanCommands()
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                _log = LogManager.GetCurrentClassLogger();
 | 
					                _log = LogManager.GetCurrentClassLogger();
 | 
				
			||||||
                typesStr = $"`List of \"{NadekoBot.ModulePrefixes[typeof(Games).Name]}hangman\" term types:`\n" + String.Join(", ", Enum.GetNames(typeof(HangmanTermPool.HangmanTermType)));
 | 
					                typesStr = $"`List of \"{NadekoBot.ModulePrefixes[typeof(Games).Name]}hangman\" term types:`\n" + String.Join(", ", HangmanTermPool.data.Keys);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            [NadekoCommand, Usage, Description, Aliases]
 | 
					            [NadekoCommand, Usage, Description, Aliases]
 | 
				
			||||||
@@ -33,7 +33,7 @@ namespace NadekoBot.Modules.Games
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            [NadekoCommand, Usage, Description, Aliases]
 | 
					            [NadekoCommand, Usage, Description, Aliases]
 | 
				
			||||||
            public async Task Hangman(HangmanTermPool.HangmanTermType type = HangmanTermPool.HangmanTermType.All)
 | 
					            public async Task Hangman([Remainder]string type = "All")
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                var hm = new HangmanGame(Context.Channel, type);
 | 
					                var hm = new HangmanGame(Context.Channel, type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -48,7 +48,14 @@ namespace NadekoBot.Modules.Games
 | 
				
			|||||||
                    HangmanGame throwaway;
 | 
					                    HangmanGame throwaway;
 | 
				
			||||||
                    HangmanGames.TryRemove(g.GameChannel.Id, out throwaway);
 | 
					                    HangmanGames.TryRemove(g.GameChannel.Id, out throwaway);
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                hm.Start();
 | 
					                try
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    hm.Start();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                catch (Exception ex) {
 | 
				
			||||||
 | 
					                    try { await Context.Channel.SendErrorAsync($"Starting errored: {ex.Message}").ConfigureAwait(false); } catch { }
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                await Context.Channel.SendConfirmAsync("Hangman game started", hm.ScrambledWord + "\n" + hm.GetHangman() + "\n" + hm.ScrambledWord);
 | 
					                await Context.Channel.SendConfirmAsync("Hangman game started", hm.ScrambledWord + "\n" + hm.GetHangman() + "\n" + hm.ScrambledWord);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user