Beispiel #1
0
        public static int CountAllSlots(ArmaforcesMissionBotSharedClasses.Mission mission)
        {
            int slots = 0;

            foreach (var team in mission.Teams)
            {
                foreach (var slot in team.Slots)
                {
                    slots += slot.Count;
                }
            }

            return(slots);
        }
Beispiel #2
0
        private async Task LoadMissions(SocketGuild guild)
        {
            var signups = _services.GetService <SignupsData>();

            var channels = guild.CategoryChannels.Single(x => x.Id == _config.SignupsCategory);

            Console.WriteLine($"[{DateTime.Now.ToString()}] Loading missions");

            foreach (var channel in channels.Channels.Where(x => x.Id != _config.SignupsArchive && x.Id != _config.CreateMissionChannel && x.Id != _config.HallOfShameChannel).Reverse())
            {
                if (signups.Missions.Any(x => x.SignupChannel == channel.Id))
                {
                    continue;
                }
                var mission = new ArmaforcesMissionBotSharedClasses.Mission();

                var             textChannel    = channel as SocketTextChannel;
                var             messages       = textChannel.GetMessagesAsync();
                List <IMessage> messagesNormal = new List <IMessage>();
                await messages.ForEachAsync(async x =>
                {
                    foreach (var it in x)
                    {
                        messagesNormal.Add(it);
                    }
                });

                mission.SignupChannel = channel.Id;

                foreach (var message in messagesNormal)
                {
                    if (message.Embeds.Count == 0)
                    {
                        continue;
                    }

                    if (message.Author.Id != _client.CurrentUser.Id)
                    {
                        continue;
                    }

                    var embed = message.Embeds.Single();
                    if (embed.Author == null)
                    {
                        var pattern = "";
                        if (embed.Footer.HasValue)
                        {
                            pattern = embed.Footer.Value.Text;
                        }
                        else
                        {
                            pattern = embed.Title;
                        }

                        MatchCollection matches = Helpers.MiscHelper.GetSlotMatchesFromText(pattern);

                        if (matches.Count > 0)
                        {
                            var team = new ArmaforcesMissionBotSharedClasses.Mission.Team();
                            team.Name = embed.Title;
                            pattern   = "";
                            foreach (Match match in matches.Reverse())
                            {
                                var icon = match.Groups[1].Value;
                                if (icon[0] == ':')
                                {
                                    var emotes     = _client.GetGuild(_config.AFGuild).Emotes;
                                    var foundEmote = emotes.Single(x => x.Name == icon.Substring(1, icon.Length - 2));
                                    var animated   = foundEmote.Animated ? "a" : "";
                                    icon    = $"<{animated}:{foundEmote.Name}:{foundEmote.Id}>";
                                    pattern = pattern.Replace(match.Groups[1].Value, icon);
                                }
                                var count = match.Groups[2].Value;
                                var name  = match.Groups[3].Success ? match.Groups[3].Value : "";
                                var slot  = new ArmaforcesMissionBotSharedClasses.Mission.Team.Slot(
                                    name,
                                    icon,
                                    int.Parse(count.Substring(1, count.Length - 2)));

                                if (!embed.Footer.HasValue)
                                {
                                    team.Name = team.Name.Replace(match.Groups[0].Value, "");
                                }
                                pattern += $"{match.Groups[0]} ";
                                team.Slots.Add(slot);

                                Console.WriteLine($"New slot {slot.Emoji} [{slot.Count}] {slot.Name}");
                            }

                            team.Name = team.Name.Replace("|", "");

                            if (embed.Description != null)
                            {
                                try
                                {
                                    string          signedPattern = @"(.+)(?:\(.*\))?-\<\@\!([0-9]+)\>";
                                    MatchCollection signedMatches = Regex.Matches(embed.Description, signedPattern, RegexOptions.IgnoreCase | RegexOptions.RightToLeft);
                                    foreach (Match match in signedMatches.Reverse())
                                    {
                                        var signedID = ulong.Parse(match.Groups[2].Value);
                                        mission.SignedUsers.Add(signedID);
                                        Console.WriteLine($"{match.Groups[1].Value} : {match.Groups[2].Value} ({signedID})");
                                        team.Slots.Single(x => x.Emoji == match.Groups[1].Value).Signed.Add(signedID);
                                    }
                                }
                                catch (Exception e)
                                {
                                    Console.WriteLine($"Failed loading team {team.Name} : {e.Message}");
                                }
                            }

                            team.TeamMsg = message.Id;
                            team.Pattern = pattern;
                            mission.Teams.Add(team);
                        }
                    }
                    else
                    {
                        mission.Title       = embed.Title;
                        mission.Description = embed.Description;
                        mission.Owner       = ulong.Parse(embed.Author.Value.Url.Substring(BotConstants.DISCORD_USER_URL_PREFIX.Length));
                        // Do I need author id again?
                        mission.Attachment = embed.Image.HasValue ? embed.Image.Value.Url : null;
                        foreach (var field in embed.Fields)
                        {
                            switch (field.Name)
                            {
                            case "Data:":
                                mission.Date = DateTime.ParseExact(field.Value, "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture);
                                break;

                            case "Modlista:":
                                mission.Modlist     = mission.ModlistUrl = field.Value;
                                mission.ModlistName = GetModsetNameFromUnknownUrl(mission.ModlistUrl);
                                break;

                            case "Zamknięcie zapisów:":
                                uint timeDifference;
                                if (!uint.TryParse(field.Value, out timeDifference))
                                {
                                    mission.CloseTime = DateTime.ParseExact(field.Value, "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture);
                                }
                                else
                                {
                                    mission.CloseTime = mission.Date.AddMinutes(-timeDifference);
                                }
                                break;
                            }
                        }
                    }
                }

                mission.Teams.Reverse(); // As teams were read backwards due to reading messages backwards

                signups.Missions.Add(mission);
            }

            // Sort channels by date
            signups.Missions.Sort((x, y) =>
            {
                return(x.Date.CompareTo(y.Date));
            });
        }
Beispiel #3
0
            public ArmaforcesMissionBotSharedClasses.Mission ToShared(ulong owner)
            {
                var shared = new ArmaforcesMissionBotSharedClasses.Mission();

                shared.Title       = Name;
                shared.Date        = Date;
                shared.CloseTime   = Close;
                shared.Description = Description;
                //Attachment handle
                shared.Modlist = "https://modlist.armaforces.com/#/download/" + Modlist;
                shared.Owner   = owner;

                foreach (var team in Teams)
                {
                    var outTeam = new ArmaforcesMissionBotSharedClasses.Mission.Team();
                    outTeam.Name    = team.Name;
                    outTeam.Pattern = "";

                    foreach (var slot in team.Slots)
                    {
                        var outSlot = new ArmaforcesMissionBotSharedClasses.Mission.Team.Slot();
                        outSlot.Name  = slot.Name;
                        outSlot.Emoji = (slot.Icon[0] == ':' || slot.Icon[0] == 'a') ? $"<{slot.Icon}>" : slot.Icon;
                        outSlot.Count = slot.Count;
                        if (slot.Signed != null)
                        {
                            foreach (var prebeton in slot.Signed)
                            {
                                outSlot.Signed.Add(prebeton);
                                shared.SignedUsers.Add(prebeton);
                            }
                        }

                        if (outTeam.Pattern.Length > 0)
                        {
                            outTeam.Pattern += "| ";
                        }
                        outTeam.Pattern += $"{outSlot.Emoji} [{outSlot.Count}] {outSlot.Name} ";

                        outTeam.Slots.Add(outSlot);
                    }

                    shared.Teams.Add(outTeam);
                }

                if (Picture != null)
                {
                    shared.AttachmentBytes = new byte[Picture.Length];
                    using (MemoryStream ms = new MemoryStream())
                    {
                        Picture.CopyTo(ms);
                        shared.AttachmentBytes = ms.ToArray();
                        shared.FileName        = Picture.FileName;
                    }
                }
                else
                {
                    shared.AttachmentBytes = null;
                }

                return(shared);
            }
Beispiel #4
0
 public static int CountFreeSlots(ArmaforcesMissionBotSharedClasses.Mission mission)
 {
     return(CountAllSlots(mission) - mission.SignedUsers.Count);
 }
Beispiel #5
0
        public void OnGet()
        {
            if (Request.Query.Keys.Contains("id"))
            {
                // Get data from boderator
                {
                    var request = (HttpWebRequest)WebRequest.Create($"{Program.BoderatorAddress}/api/mission?id={Request.Query["id"]}&userID={Program.Database.GetUser(Request.Cookies["Token"]).id}");

                    request.Method = "GET";

                    var response = (HttpWebResponse)request.GetResponse();

                    var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

                    _Mission = JsonConvert.DeserializeObject <ArmaforcesMissionBotSharedClasses.Mission>(responseString);
                }

                {
                    var request = (HttpWebRequest)WebRequest.Create($"{Program.BoderatorAddress}/api/emotes");

                    request.Method = "GET";

                    var response = (HttpWebResponse)request.GetResponse();

                    var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

                    _Emotes = JsonConvert.DeserializeObject <JArray>(responseString);
                }

                {
                    var request = (HttpWebRequest)WebRequest.Create($"{Program.BoderatorAddress}/api/users");

                    request.Method = "GET";

                    var response = (HttpWebResponse)request.GetResponse();

                    var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

                    _Users = JsonConvert.DeserializeObject <JArray>(responseString);
                }

                foreach (var team in _Mission.Teams)
                {
                    var slotsText = "";
                    foreach (var slot in team.Slots)
                    {
                        for (var i = 0; i < slot.Count; i++)
                        {
                            slotsText += "<tr class='text-align-middle'>";
                            if (_Emotes.Any(x => (string)x["id"] == slot.Emoji))
                            {
                                slotsText += $"<td><img width='16' height='16' src='{_Emotes.Single(x => (string)x["id"] == slot.Emoji)["url"]}'/></td><td>{slot.Name}</td>";
                            }
                            else
                            {
                                slotsText += $"<td>{slot.Emoji}</td><td>{slot.Name}</td>";
                            }
                            if (slot.Signed.Count > 0)
                            {
                                var signedUser = slot.Signed.First();
                                slot.Signed.Remove(signedUser);
                                slotsText += $"<td class='text-right'>{_Users.Single(x => (ulong)x["id"] == signedUser)["name"]}</td>";
                                if (signedUser == ulong.Parse(Program.Database.GetUser(Request.Cookies["Token"]).id))
                                {
                                    slotsText += $"<td class='text-right'><a class='btn btn-outline-warning' href='/api/signoff?" +
                                                 $"missionID={Request.Query["id"]}&teamID={team.TeamMsg}&slotID={slot.Emoji}'>Wypisz</a></td>";
                                }
                            }
                            else if (!_Mission.SignedUsers.Contains(ulong.Parse(Program.Database.GetUser(Request.Cookies["Token"]).id)))
                            {
                                slotsText += $"<td class='text-right'><a class='btn btn-outline-warning' href='/api/signup?" +
                                             $"missionID={Request.Query["id"]}&teamID={team.TeamMsg}&slotID={slot.Emoji}'>Zapisz</a></td>";
                            }
                            slotsText += "</tr>";
                        }
                    }
                    _TeamSlots.Add(team.TeamMsg, slotsText);
                }
            }
        }