private async Task LoadMissionsArchive(SocketGuild guild) { var archive = _services.GetService <MissionsArchiveData>(); var channels = guild.CategoryChannels.Single(x => x.Id == _config.SignupsCategory); Console.WriteLine($"[{DateTime.Now.ToString()}] Loading mission history"); archive.ArchiveMissions.Clear(); // History of missions var archiveChannel = guild.Channels.Single(x => x.Id == _config.SignupsArchive) as SocketTextChannel; var messages = archiveChannel.GetMessagesAsync(limit: 10000); List <IMessage> messagesNormal = new List <IMessage>(); await messages.ForEachAsync(async x => { foreach (var it in x) { messagesNormal.Add(it); } }); foreach (var message in messagesNormal) { if (message.Embeds.Count == 0) { continue; } //hardcoded previous bot instance ID if (message.Author.Id != _client.CurrentUser.Id && message.Author.Id != 598928706165276729) { continue; } var embed = message.Embeds.Single(); var newArchiveMission = new MissionsArchiveData.Mission(); newArchiveMission.Title = embed.Title; DateTime date; if (!DateTime.TryParseExact( embed.Footer.Value.Text, "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out date)) { Console.WriteLine($"Loading failed on mission date: {embed.Footer.Value.Text}"); continue; } newArchiveMission.Date = date; newArchiveMission.CloseTime = message.Timestamp.DateTime; newArchiveMission.Description = embed.Description; newArchiveMission.Attachment = embed.Image.HasValue ? embed.Image.Value.Url : null; ulong signedUsers = 0; ulong slots = 0; foreach (var field in embed.Fields) { switch (field.Name) { case "Zamknięcie zapisów:": case "Data:": break; case "Modlista:": newArchiveMission.Modlist = newArchiveMission.ModlistUrl = field.Value; newArchiveMission.ModlistName = GetModsetNameFromUnknownUrl(newArchiveMission.ModlistUrl); break; default: string signedPattern = @"(.+)(?:\(.*\))?-(\<\@\!([0-9]+)\>)?"; MatchCollection signedMatches = Regex.Matches(field.Value, signedPattern, RegexOptions.IgnoreCase | RegexOptions.RightToLeft); foreach (Match match in signedMatches.Reverse()) { slots++; if (match.Groups[2].Success) { signedUsers++; } } break; } } newArchiveMission.FreeSlots = slots - signedUsers; newArchiveMission.AllSlots = slots; archive.ArchiveMissions.Add(newArchiveMission); } // Sort channels by date archive.ArchiveMissions.Sort((x, y) => { return(x.Date.CompareTo(y.Date)); }); Console.WriteLine($"[{DateTime.Now.ToString()}] Loaded {archive.ArchiveMissions.Count} archive missions"); }
private async void CheckMissionsToArchiive(object source, ElapsedEventArgs e) { var signups = _services.GetService <SignupsData>(); if (signups.Missions.Count == 0) { return; } foreach (var mission in signups.Missions) { await mission.Access.WaitAsync(-1); try { if (mission.Editing == ArmaforcesMissionBotSharedClasses.Mission.EditEnum.NotEditing && mission.CloseTime < e.SignalTime) { var archive = _client.GetChannel(_config.SignupsArchive) as ITextChannel; var archiveEmbed = new EmbedBuilder() .WithColor(Color.Green) .WithTitle(mission.Title) .WithDescription(mission.Description) .WithFooter(mission.Date.ToString()) .AddField("Data:", mission.Date) .AddField("Zamknięcie zapisów:", mission.CloseTime.ToString()) .WithAuthor(_client.GetUser(mission.Owner).Username, url: BotConstants.DISCORD_USER_URL_PREFIX + (mission.Owner).ToString()) .AddField("Modlista:", mission.Modlist); if (mission.Attachment != null) { archiveEmbed.WithImageUrl(mission.Attachment); } var channel = _client.GetChannel(mission.SignupChannel) as ITextChannel; _miscHelper.BuildTeamsEmbed(mission.Teams, archiveEmbed, true); await archive.SendMessageAsync(embed : archiveEmbed.Build()); await channel.DeleteAsync(); signups.Missions.Remove(mission); var archiveMission = new MissionsArchiveData.Mission(); archiveMission.Title = mission.Title; archiveMission.Date = mission.Date; archiveMission.CloseTime = mission.CloseTime; archiveMission.Description = mission.Description; archiveMission.Modlist = mission.Modlist; archiveMission.Attachment = mission.Attachment; archiveMission.FreeSlots = (ulong)Helpers.MiscHelper.CountFreeSlots(mission); archiveMission.AllSlots = (ulong)Helpers.MiscHelper.CountAllSlots(mission); var archiveMissions = _services.GetService <MissionsArchiveData>(); archiveMissions.ArchiveMissions.Add(archiveMission); break; } } finally { mission.Access.Release(); } } }