public void ParseMessage(EventMessage eventMessage) { Raid raid = null; if (eventMessage != null && eventMessage.Event == EventMessage.EventType.Raid) { raid = ParseRaid(eventMessage.Data); } else if (eventMessage != null && eventMessage.Event == EventMessage.EventType.Attendance) { raid = ParseAttendance(eventMessage.Data); } Send(raid); }
protected async override Task Send(Raid raid) { if (raid == null || !Raids.Contains(raid)) { return; } var link = $"{raid.Name}"; // (https://raidikalu.herokuapp.com/#raidi-{raid.Id})"; var message = raid.ComposeMessage(link); var url = $"https://raidikalu.herokuapp.com/#raidi-{raid.Id}"; var embed = new EmbedBuilder { Title = "Raidikalu", Url = url }; bool useDelay = false; if (raid.Messages.Any()) { try { useDelay = raid.Messages.Count > 25; foreach (var raidMessage in raid.Messages) { var discordMessage = raidMessage.Content as Discord.Rest.RestUserMessage; if (discordMessage != null) { await discordMessage.ModifyAsync(m => { m.Content = message; m.Embed = embed.Build(); }); } } } catch (Exception e) { Console.WriteLine($"Error modifying message: {e.Message}"); } } else { try { var sendChannels = Channels.Where(ch => ch.Gyms.Contains(raid.Name)).ToList(); useDelay = sendChannels.Count() > 25; foreach (var serviceChannel in sendChannels) { var channel = client.GetChannel((ulong)serviceChannel.Id); if (channel == null) { var splitName = serviceChannel.Name.Split('#'); if (splitName.Length != 2) { continue; } var user = client.GetUser(splitName[0].Substring(1), splitName[1]); if (user != null) { var dmchannel = user.GetOrCreateDMChannelAsync().Result; raid.Messages.Add(new DiscordMessage(await dmchannel.SendMessageAsync(message, false, embed.Build()))); } } else if (channel is SocketTextChannel textChannel) { raid.Messages.Add(new DiscordMessage(await textChannel.SendMessageAsync(message, false, embed.Build()))); } if (useDelay) { Task.Delay(200).Wait(); } } } catch (Exception e) { Console.WriteLine($"Error writing message: {e.Message}"); } } //throw new NotImplementedException(); }
protected abstract Task Send(Raid raid);
private Raid ParseRaid(EventData data) { if (data == null || !Channels.Any(ch => ch.Gyms.Any(gym => gym.Contains(data.Gym)))) { return(null); } if (!data.Start.HasValue && !data.End.HasValue) { Console.WriteLine("No Start or End time."); return(null); } DateTime start = DateTimeOffset.FromUnixTimeSeconds(data.Start.GetValueOrDefault()).LocalDateTime; DateTime end = DateTimeOffset.FromUnixTimeSeconds(data.End.GetValueOrDefault()).LocalDateTime; if (data.Start.HasValue && !data.End.HasValue) { end = start + new TimeSpan(0, 45, 0); } else if (!data.Start.HasValue) { start = end - new TimeSpan(0, 45, 0); } if (end < DateTime.Now) { return(null); } var raid = Raids.FirstOrDefault(r => r.Id == data.Raid); if (raid != null) { raid.Pokemon = data.Pokemon; raid.Tier = data.Tier.GetValueOrDefault(); raid.StartTime = start; raid.EndTime = end; } else { raid = new Raid(data.Raid, data.Gym) { Pokemon = data.Pokemon, Tier = data.Tier.GetValueOrDefault(), StartTime = start, EndTime = end }; Raids.Add(raid); } var raidToRemove = Raids.FirstOrDefault(r => r.EndTime < DateTime.Now); var currentRaidRemoved = false; while (raidToRemove != null) { Raids.Remove(raidToRemove); if (raidToRemove == raid) { currentRaidRemoved = true; } raidToRemove = Raids.FirstOrDefault(r => r.EndTime < DateTime.Now); } if (currentRaidRemoved) { return(null); } return(raid); }