Example #1
0
        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");
        }
Example #2
0
        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();
                }
            }
        }