public IChatEmbed MakeResponseEmbed(PokemonRaidPost post, IBotServerConfiguration guildConfig, string header)
        {
            var embed = new DiscordChatEmbed();

            embed.WithDescription(header);

            embed.WithColor(post.Color[0], post.Color[1], post.Color[2]);
            embed.WithUrl(string.Format(Language.Formats["pokemonInfoLink"], post.PokemonId));
            embed.WithThumbnailUrl(string.Format(Language.Formats["imageUrlLargePokemon"], post.PokemonId.ToString().PadLeft(3, '0')));

            foreach (var message in post.Responses.OrderBy(x => x.MessageDate).Skip(Math.Max(0, post.Responses.Count() - 10)))//max fields is 25
            {
                embed.AddField(string.Format(Language.Formats["responseInfo"], message.MessageDate.AddHours(TimeOffset), message.ChannelName, message.Username), message.Content);
            }
            //var builder = new EmbedBuilder();

            /*
             * builder.WithColor(post.Color[0], post.Color[1], post.Color[2]);
             *
             * builder.WithDescription(header);
             * builder.WithUrl(string.Format(Language.Formats["pokemonInfoLink"], post.PokemonId));
             *
             * builder.WithThumbnailUrl(string.Format(Language.Formats["imageUrlLargePokemon"], post.PokemonId.ToString().PadLeft(3, '0')));
             *
             * foreach (var message in post.Responses.OrderBy(x => x.MessageDate).Skip(Math.Max(0, post.Responses.Count() - 10)))//max fields is 25
             * {
             *  builder.AddField(string.Format(Language.Formats["responseInfo"], message.MessageDate.AddHours(TimeOffset), message.ChannelName, message.Username), message.Content);
             * }
             */
            return(embed);
        }
        /// <summary>
        /// Attempts to get a location out of a full message string.
        /// </summary>
        /// <param name="message"></param>
        /// <returns>The string representation of the location</returns>
        public string ParseLocation(string message, IBotServerConfiguration guildConfig)
        {
            var cleanedMessage = Language.RegularExpressions["locationExcludeWords"].Replace(message, matchedWordReplacement).ToLower();

            foreach (var place in guildConfig.Places)
            {
                var reg = new Regex($@"\b{place.Key}\b", RegexOptions.IgnoreCase);
                if (reg.IsMatch(cleanedMessage))
                {
                    return(ToTitleCase(place.Key));
                }
            }

            var result = ParseLocationBase(cleanedMessage);

            var cleanreg = Language.RegularExpressions["locationCleanWords"];
            var cleaned  = cleanreg.Replace(result.Trim(), "");

            var cleanedLocation = cleaned.Replace(",", "").Replace(".", "").Replace("  ", " ").Replace(matchedWordReplacement, "").Trim();

            if (Language.RegularExpressions["locationTooShort"].IsMatch(cleanedLocation))
            {
                return("");
            }

            return(ToTitleCase(cleanedLocation));
        }
 public MessageParser(IBotServerConfiguration serverConfig, string language = "en-us", int timeZoneOffset = 0)
 {
     this.serverConfig = serverConfig;
     Lang       = language;
     Language   = new ParserLanguage(language);
     TimeOffset = timeZoneOffset;
     CultureInfo.CurrentCulture = Language.GetCultureInfo();
 }
        private void JoinCount_Changed(object sender, JoinedCountChangedEventArgs e)
        {
            PokemonRaidPost         post        = null;
            IBotServerConfiguration guildConfig = null;
            PokemonRaidJoinedUser   joinedUser  = null;

            if (sender is PokemonRaidPost)
            {
                post        = (PokemonRaidPost)sender;
                guildConfig = Config.GetServerConfig(post.GuildId, ChatTypes.Discord);
            }
            else if (sender is PokemonRaidJoinedUser)
            {
                joinedUser  = (PokemonRaidJoinedUser)sender;
                guildConfig = Config.GetServerConfig(joinedUser.GuildId, ChatTypes.Discord);
                //var guild = bot.Guil
                post = guildConfig.Posts.FirstOrDefault(x => x.UniqueId == joinedUser.PostId);
            }

            if (post != null)
            {
                List <Task> tasks  = new List <Task>();
                var         parser = GetParser(guildConfig);

                var joinstr = parser.Language.Strings["joining"];

                if (e.ChangeType == JoinCountChangeType.Remove || (e.ChangeType == JoinCountChangeType.Change && e.Count < 0))
                {
                    joinstr = parser.Language.Strings["quitting"];
                }

                string message = string.Format(parser.Language.Formats["directMessage"],
                                               e.Count,
                                               joinstr,
                                               post.PokemonName,
                                               e.ArriveTime.HasValue && !joinstr.Equals(parser.Language.Strings["quitting"]) ? string.Format(parser.Language.Formats["postjoinTime"], e.ArriveTime.Value.ToString("t")) : "",
                                               e.UserName);

                var usersToDM = new List <ulong>();
                if (post.UserId != e.UserId)
                {
                    usersToDM.Add(post.UserId);
                }
                usersToDM.AddRange(post.JoinedUsers.Where(x => x.Id != e.UserId && x.Id != post.UserId).Select(x => x.Id));

                foreach (var id in usersToDM)
                {
                    var user = bot.GetUser(id);

                    if (user != default(SocketUser))
                    {
                        tasks.Add(DirectMessageUser(new DiscordChatUser(user), $"{message}\n{parser.Language.Strings["dmStop"]}"));//TODO
                    }
                }
                Task.WaitAll(tasks.ToArray());
            }
        }
        public string GetFullLocation(string location, IBotServerConfiguration guildConfig, ulong channelId)
        {
            var city = guildConfig.ChannelCities.ContainsKey(channelId) ? guildConfig.ChannelCities[channelId] : guildConfig.City ?? "";

            if (!string.IsNullOrEmpty(city))
            {
                city = " near " + city;
            }
            return(Uri.EscapeDataString(location + city));
        }
        /// <summary>
        /// Parses a bot's message to get an existing post from the config using the unique id.
        /// </summary>
        /// <param name="message"></param>
        /// <param name="config"></param>
        /// <returns></returns>
        public PokemonRaidPost ParsePostFromPostMessage(string message, IBotServerConfiguration config)
        {
            var uidReg = Language.RegularExpressions["postUniqueId"];

            if (!uidReg.IsMatch(message))
            {
                return(null);
            }

            var uid = uidReg.Match(message).Groups[1].Value;

            return(config.Posts.FirstOrDefault(x => x.UniqueId == uid));
        }
        public BotCommandHandler(IChatMessageHandler handler, IChatMessage message, MessageParser parser)
        {
            Handler = handler;
            Message = message;
            Parser = parser;

            Config = Handler.Config;
            Command = new List<string>(Message.Content.ToLower().Replace("  ", " ").Substring(Config.Prefix.Length).Split(' '));
            Command.Remove("");
            switch (message.ChatType)
            {
                case ChatTypes.Discord:
                    Output = new DiscordMessageOutput();
                    break;
            }

            GuildConfig = Config.GetServerConfig(message.Server.Id, message.ChatType);
        }
        public void MakePostWithEmbed(PokemonRaidPost post, IBotServerConfiguration guildConfig, out IChatEmbed header, out IChatEmbed response, out string channel, out string mentions)
        {
            var headerstring = MakePostHeader(post);

            response = MakeResponseEmbed(post, guildConfig, headerstring);
            header   = MakeHeaderEmbed(post, headerstring);

            var joinedUserIds  = post.JoinedUsers.Select(x => x.Id);
            var mentionUserIds = post.Responses.Select(x => x.UserId.ToString()).Distinct().ToList();

            mentionUserIds.AddRange(post.JoinedUsers.Select(x => x.Id.ToString()).Distinct());


            channel = $"<#{string.Join(">, <#", post.ChannelMessages.Keys)}>";
            //var users = mentionUserIds.Count() > 0 ? $",<@{string.Join(">,<@", mentionUserIds.Distinct())}>" : "";
            mentions = post.MentionedRoleIds.Count() > 0 ? $"<@&{string.Join(">, <@&", post.MentionedRoleIds.Distinct())}>" : "";

            //mentions = channel +/* users +*/ roles;
        }
        private MessageParser GetParser(IBotServerConfiguration guildConfig)
        {
            var botTimezone    = TimeZoneInfo.Local.GetUtcOffset(DateTime.Now).Hours - (TimeZoneInfo.Local.IsDaylightSavingTime(DateTime.Now) ? 1 : 0);
            var serverTimezone = guildConfig.Timezone ?? botTimezone;
            var timeOffset     = serverTimezone - botTimezone;

            var lang = guildConfig.Language ?? "en-us";

            var parser = ParserCache.FirstOrDefault(x => x.Lang == lang && x.TimeOffset == timeOffset);

            if (parser != null && parser.Language.Lang == lang)
            {
                return(parser);
            }

            parser = new MessageParser(guildConfig, lang, timeOffset);
            ParserCache.Add(parser);
            return(parser);
        }
 public IChatEmbed MakeResponseEmbed(PokemonRaidPost post, IBotServerConfiguration guildConfig, string header)
 {
     throw new NotImplementedException();
 }
 public void MakePostWithEmbed(PokemonRaidPost post, IBotServerConfiguration guildConfig, out IChatEmbed header, out IChatEmbed response, out string channel, out string mentions)
 {
     throw new NotImplementedException();
 }