/// <summary>
 /// Makes a Rousecheck for the Character
 /// Increases the Hunger if not successfull
 /// Returns a Text that can be send to the user
 /// </summary>
 /// <param name="_reroll">Can the check rerolled if the first one ist not successful?</param>
 /// <returns>A nice message</returns>
 public string Rouse(bool _reroll)
 {
     if (VampireDiceRollerController.Rouse(_reroll))
     {
         // Check successful - Everythings fine
         return("You have your beast under control");
     }
     else
     {
         // Hunger increases to a maximum of 5!
         this.Hunger++;
         // Return a message depending on the new Hunger
         return(this.GetMessageForHunger());
     }
 }
        private async Task MessageReceived(SocketMessage message)
        {
            if (message.MentionedUsers.FirstOrDefault(user => GetUniqueDiscriminator(user) == GetUniqueDiscriminator(this.discordClient.CurrentUser)) != null)
            {
                // Remove all mentions from the content
                Regex  regi       = new Regex(@"<[@|#][!]?[\w]*>");
                string strMessage = regi.Replace(message.Content, "").Trim();
                // The Bot knows roll, reroll and help
                if (strMessage.StartsWith("roll", StringComparison.OrdinalIgnoreCase))
                {
                    #region Roll
                    // Split the string with Blanks
                    string[] strSplit = strMessage.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                    // We're expecting 3 values or 2 and an initialized character
                    VampireCharacter chara = null;
                    int intDiceTotal, intDiceRed;
                    if ((strSplit.Length == 2 && this.dicChar4User.TryGetValue(GetUniqueDiscriminator(message.Author), out chara)) || strSplit.Length == 3)
                    {
                        // We ignore the first one (it should be roll) and cast the rest to integer
                        if (Int32.TryParse(strSplit[1], out intDiceTotal) == false)
                        {
                            await message.Channel.SendMessageAsync($"{message.Author.Mention} Unable to cast '{strSplit[1]}' to a number");
                        }
                        if (strSplit.Length == 3)
                        {
                            if (Int32.TryParse(strSplit[2], out intDiceRed) == false)
                            {
                                await message.Channel.SendMessageAsync($"{message.Author.Mention} Unable to cast '{strSplit[2]}' to a number");
                            }
                        }
                        else
                        {
                            intDiceRed = chara.Hunger;
                        }

                        VampireDiceRoll diceRoll = new VampireDiceRoll(intDiceTotal, intDiceRed);
                        this.dicLastRoll4User[GetUniqueDiscriminator(message.Author)] = diceRoll;

                        await message.Channel.SendMessageAsync($"{message.Author.Mention} {diceRoll.Results}");
                    }
                    else
                    {
                        // Haven't found what we we're looking for
                        await message.Channel.SendMessageAsync($"{message.Author.Mention} Somethings not right with your roll command");
                    }
                    #endregion
                }
                else if (strMessage.StartsWith("reroll", StringComparison.OrdinalIgnoreCase))
                {
                    #region Reroll
                    VampireDiceRoll diceRoll;
                    if (this.dicLastRoll4User.TryGetValue(GetUniqueDiscriminator(message.Author), out diceRoll))
                    {
                        // Check if the user wants to reroll something specific
                        string[] strSplit         = strMessage.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                        string   strRerollOptions = string.Empty;
                        if (strSplit.Length > 1)
                        {
                            // In the second entry can be specific dice to reroll
                            strRerollOptions = strSplit[1];
                        }

                        await message.Channel.SendMessageAsync($"{message.Author.Mention} {diceRoll.Reroll(strRerollOptions)}");
                    }
                    else
                    {
                        // No roll found for the user...
                        await message.Channel.SendMessageAsync($"{message.Author.Mention} I found no roll for you to reroll.");
                    }
                    #endregion
                }
                else if (strMessage.StartsWith("initchar", StringComparison.OrdinalIgnoreCase))
                {
                    #region InitChar
                    if (this.dicChar4User.ContainsKey(GetUniqueDiscriminator(message.Author)))
                    {
                        await message.Channel.SendMessageAsync($"{message.Author.Mention} Your character is already initialized.");
                    }
                    else
                    {
                        // Read the stats from the input
                        string[] strSplit = strMessage.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                        int      intHunger;
                        // In the moment we expect the command, the name and the hunger - that makes 3
                        if (strSplit.Length < 3)
                        {
                            await message.Channel.SendMessageAsync($"{message.Author.Mention} Not enough parameters to create your character. Please use 'initchar name hunger'");
                        }
                        else if (int.TryParse(strSplit[2], out intHunger) == false)
                        {
                            await message.Channel.SendMessageAsync($"{message.Author.Mention} I'm very sorry, but I cannot read a number from '{strSplit[2]}'.");
                        }
                        else
                        {
                            // If the hunger ist out of the allowed range tell it to the user und set hunger to 1
                            if (intHunger < 0 || intHunger > 5)
                            {
                                await message.Channel.SendMessageAsync($"{message.Author.Mention} Hunger must be a number between 0 und 5 but you gave me {intHunger}. Your hunger has been set to 1.");

                                intHunger = 1;
                            }
                            string strName   = strSplit[1];
                            int    intHugner = intHunger;
                            this.dicChar4User.Add(GetUniqueDiscriminator(message.Author), new VampireCharacter(strName, intHugner));
                            await message.Channel.SendMessageAsync($"{message.Author.Mention} Hello {strName}. Nice to meet you.");
                        }
                    }
                    #endregion
                }
                else if (strMessage.StartsWith("kill", StringComparison.OrdinalIgnoreCase))
                {
                    #region kill
                    VampireCharacter character;
                    if (this.dicChar4User.TryGetValue(GetUniqueDiscriminator(message.Author), out character))
                    {
                        this.dicChar4User.Remove(GetUniqueDiscriminator(message.Author));
                        await message.Channel.SendMessageAsync($"{message.Author.Mention} {character.Name} has met his final death.");
                    }
                    else
                    {
                        await message.Channel.SendMessageAsync($"{message.Author.Mention} I can't kill something I cannot see.");
                    }
                    #endregion
                }
                else if (strMessage.StartsWith("rouse", StringComparison.OrdinalIgnoreCase))
                {
                    #region Rouse
                    // Check if the check can bererolled
                    bool bolReroll = strMessage.StartsWith("rouse+", StringComparison.OrdinalIgnoreCase);
                    if (this.dicChar4User.ContainsKey(GetUniqueDiscriminator(message.Author)) == false)
                    {
                        if (VampireDiceRollerController.Rouse(bolReroll))
                        {
                            await message.Channel.SendMessageAsync($"{message.Author.Mention} You are fine.");
                        }
                        else
                        {
                            await message.Channel.SendMessageAsync($"{message.Author.Mention} Your hunger increases.");
                        }
                    }
                    else
                    {
                        VampireCharacter vampChar = this.dicChar4User[GetUniqueDiscriminator(message.Author)];
                        await message.Channel.SendMessageAsync($"{message.Author.Mention} {vampChar.Rouse(bolReroll)}");
                    }
                    #endregion
                }
                else if (strMessage.StartsWith("hunger", StringComparison.OrdinalIgnoreCase))
                {
                    #region hunger
                    // Hunger makes only sense with an initialized character
                    VampireCharacter character;
                    if (this.dicChar4User.TryGetValue(GetUniqueDiscriminator(message.Author), out character))
                    {
                        // Hunger needs to be followed by something
                        string[] strSplit = strMessage.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                        if (strSplit.Length == 1)
                        {
                            await message.Channel.SendMessageAsync($"{message.Author.Mention} {character.GetMessageForHunger()}");
                        }
                        else
                        {
                            // We only care about the second string in the array - check if it starts with +/-
                            bool bolModusModify = false;
                            if (strSplit[1].StartsWith('+') || strSplit[1].StartsWith('-'))
                            {
                                bolModusModify = true;
                            }

                            // Try to parse the string to a number
                            int intHunger;
                            if (Int32.TryParse(strSplit[1], out intHunger))
                            {
                                await message.Channel.SendMessageAsync($"{message.Author.Mention} {character.SetHunger(intHunger, bolModusModify)}");
                            }
                            else
                            {
                                await message.Channel.SendMessageAsync($"{message.Author.Mention} I cannot get a number from '{strSplit[1]}'.");
                            }
                        }
                    }
                    else
                    {
                        await message.Channel.SendMessageAsync($"{message.Author.Mention} I have no character for you. Only you can get hungrier.");
                    }
                    #endregion
                }
                else if (strMessage.StartsWith("about", StringComparison.OrdinalIgnoreCase))
                {
                    await message.Channel.SendMessageAsync($"Vampire Dice Roller Version '{this.GetType().Assembly.GetName().Version}' under GPL-3.0 License.{Environment.NewLine}" +
                                                           $"Source code can be found under: https://github.com/Prohl/DiscordBotVampireDiceRoller{Environment.NewLine}");
                }
                else if (strMessage.StartsWith("help", StringComparison.OrdinalIgnoreCase))
                {
                    await message.Channel.SendMessageAsync($"{message.Author.Mention} I understand the following commands:{Environment.NewLine}" +
                                                           $"- roll: let me roll some dice for you. You can either tell me to roll a number of dice and hungerdice with (roll X Y) or if you have an initialized character simply (roll X) and I will get the hungerdice from your characters hunger{Environment.NewLine}" +
                                                           $"- reroll: I will reroll up to three normal dice from your last roll. Without specification a reroll will reroll failures. " +
                                                           $"You can specify what you want to reroll by adding 'c' for a critical, 's' for an success or 'f' for a failure (reroll cff).{Environment.NewLine}" +
                                                           $"- initchar: followed by a name and your current hunger (initchar foo 2). Initializes your character.{Environment.NewLine}" +
                                                           $"- kill: removes your current character and you can initialize a new one.{Environment.NewLine}" +
                                                           $"- rouse: makes a rousecheck. When your character is initialized I tell you your new hunger, if it increases.{Environment.NewLine}" +
                                                           $"- hunger: used to modify, set or get your hunger. To set it simply type hunger X and I will set your hunger to X. When you write +/- before X I will modify your hunger by X. Just hunger will reveal your current hunger.");
                }
                else
                {
                    await message.Channel.SendMessageAsync($"{message.Author.Mention} I don't understand. Type \"help\" when you need some help from me.");
                }
            }

            // Never respond to a bot and only if we have a chatter file
            if (message.Author.IsBot == false && this.dicChatter != null)
            {
                // Response to see, that the Bot is still responding
                foreach (KeyValuePair <string, string> pair in this.dicChatter)
                {
                    if (message.Content.Contains(pair.Key, StringComparison.OrdinalIgnoreCase))
                    {
                        await message.Channel.SendMessageAsync(pair.Value);

                        break;
                    }
                }
            }
        }