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(); }