Exemplo n.º 1
0
        private async void HandleGuildDismantle()
        {
            if (!HasGuild || GuildRank != 1)
            {
                return;
            }

            var result = await _guildManager.TryDeleteGuild((int)GuildId);

            if (!result)
            {
                return;
            }

            foreach (var member in GuildMembers.ToList())
            {
                if (!_gameWorld.Players.ContainsKey(member.Id))
                {
                    continue;
                }

                var guildPlayer = _gameWorld.Players[member.Id];
                guildPlayer.ClearGuild();
                guildPlayer.SendGuildDismantle();
            }
        }
Exemplo n.º 2
0
        private async void HandleChangeRank(bool demote, int characterId)
        {
            if (!HasGuild || GuildRank > 3)
            {
                return;
            }

            var dbCharacter = await _guildManager.TryChangeRank((int)GuildId, characterId, demote);

            if (dbCharacter is null)
            {
                return;
            }

            foreach (var member in GuildMembers.ToList())
            {
                if (!_gameWorld.Players.ContainsKey(member.Id))
                {
                    continue;
                }

                var guildPlayer = _gameWorld.Players[member.Id];
                var changed     = guildPlayer.GuildMembers.FirstOrDefault(x => x.Id == characterId);
                if (changed is null)
                {
                    continue;
                }

                changed.GuildRank = dbCharacter.GuildRank;
                guildPlayer.SendGuildUserChangeRank(changed.Id, changed.GuildRank);
            }
        }
 public void Write(GamePacketWriter writer)
 {
     writer.Write(GuildRealm, 14u);
     writer.Write(GuildId);
     writer.Write(GuildMembers.Count);
     GuildMembers.ForEach(w => w.Write(writer));
     writer.Write(Done);
 }
Exemplo n.º 4
0
 public Task Clear()
 {
     NotifyGuildMembersOffline();
     GuildId   = 0;
     GuildName = string.Empty;
     GuildRank = 0;
     GuildMembers.Clear();
     return(Task.CompletedTask);
 }
Exemplo n.º 5
0
        public void UpdateFromModel(GuildInfo Model, bool RaiseChangedEvent)
        {
            if (RaiseChangedEvent)
            {
                GuildName       = Model.GuildName;
                PasswordSetFlag = Model.PasswordSetFlag;
                ChestPassword   = Model.ChestPassword;
                Flags           = Model.Flags;
                GuildID         = Model.GuildID;
                Rank1Male       = Model.Rank1Male;
                Rank1Female     = Model.Rank1Female;
                Rank2Male       = Model.Rank2Male;
                Rank2Female     = Model.Rank2Female;
                Rank3Male       = Model.Rank3Male;
                Rank3Female     = Model.Rank3Female;
                Rank4Male       = Model.Rank4Male;
                Rank4Female     = Model.Rank4Female;
                Rank5Male       = Model.Rank5Male;
                Rank5Female     = Model.Rank5Female;
                SupportedMember = Model.SupportedMember;

                GuildMembers.Clear();
                foreach (GuildMemberEntry obj in Model.GuildMembers)
                {
                    GuildMembers.Add(obj);
                }

                // not isvisible
            }
            else
            {
                guildName       = Model.GuildName;
                passwordSetFlag = Model.PasswordSetFlag;
                chestPassword   = Model.ChestPassword;
                flags           = Model.Flags;
                guildID         = Model.GuildID;
                rank1Male       = Model.Rank1Male;
                rank1Female     = Model.Rank1Female;
                rank2Male       = Model.Rank2Male;
                rank2Female     = Model.Rank2Female;
                rank3Male       = Model.Rank3Male;
                rank3Female     = Model.Rank3Female;
                rank4Male       = Model.Rank4Male;
                rank4Female     = Model.Rank4Female;
                rank5Male       = Model.Rank5Male;
                rank5Female     = Model.Rank5Female;
                supportedMember = Model.SupportedMember;

                guildMembers.Clear();
                foreach (GuildMemberEntry obj in Model.GuildMembers)
                {
                    guildMembers.Add(obj);
                }

                // not isvisible
            }
        }
Exemplo n.º 6
0
 public void RemoveMember(long account_idx)
 {
     if (GuildMembers == null)
     {
         return;
     }
     GuildMembers.RemoveAll(e => e.account_idx == account_idx);
     GuildInfo.info.member_count--;
     GuildInfo.guild_master = GuildMembers.Find(m => m.member_state == 0).nickname;
 }
Exemplo n.º 7
0
        public void Init(int ownerId, int guildId = 0, string name = "", byte rank = 0, IEnumerable <DbCharacter> members = null)
        {
            _ownerId = ownerId;
            GuildId  = guildId;

            if (GuildId != 0)
            {
                GuildName = name;
                GuildRank = rank;
                GuildMembers.AddRange(members);
                NotifyGuildMembersOnline();
            }
        }
Exemplo n.º 8
0
    public void GiveGold(long account_idx, int gold)
    {
        if (GuildMembers == null)
        {
            return;
        }
        var member = GuildMembers.Find(e => e.account_idx == account_idx);

        if (member == null)
        {
            return;
        }
        member.give += GuildInfoManager.Config.GetGivePoint(gold);
    }
Exemplo n.º 9
0
        public GuildChar GetCharFromGuild(string findName, string realmName, string guildName, string regionName = "us")
        {
            GuildMembers members     = new GuildMembers();
            string       matchedName = string.Empty;
            GuildChar    guildInfo   = new GuildChar();
            Regex        myRegex     = new Regex($@"{findName.ToLower()}");

            guildName = guildName.Replace(" ", "%20");
            try
            {
                members = GetGuildMembers(realmName, guildName, regionName);
            }
            catch (Exception ex)
            {
                _logger.LogError($"{ex.Message}");
            }
            bool done = false;

            while (!done)
            {
                foreach (Member member in members.members.OrderByDescending(m => m.character.name))
                {
                    string curMember = string.Empty;
                    curMember = member.character.name;
                    MatchCollection m = myRegex.Matches(curMember.ToLower());

                    switch (m.Count)
                    {
                    case 1:
                    {
                        matchedName = curMember;
                        realmName   = member.character.realm.slug;

                        guildInfo.charName   = curMember;
                        guildInfo.realmName  = realmName;
                        guildInfo.regionName = regionName;
                        done = true;
                        break;
                    }

                    default:
                    {
                        break;
                    }
                    }
                }
            }

            return(guildInfo);
        }
Exemplo n.º 10
0
        public GuildChar GetCharFromGuild(string findName, string realmName, string guildName, string regionName = "us")
        {
            GuildMembers members     = new GuildMembers();
            string       matchedName = string.Empty;
            GuildChar    guildInfo   = new GuildChar();
            Regex        myRegex     = new Regex($@"{findName.ToLower()}");

            guildName = guildName.Replace(" ", "%20");
            Console.WriteLine(guildName);
            try
            {
                members = GetGuildMembers(realmName, guildName, regionName);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"{ex.Message}");
            }
            Console.WriteLine("Get char from guild");
            foreach (Member member in members.members)
            {
                string curMember = string.Empty;

                curMember = member.character.name;

                MatchCollection m = myRegex.Matches(curMember.ToLower());

                switch (m.Count)
                {
                case 1:
                {
                    matchedName = curMember;
                    realmName   = member.character.realm;

                    guildInfo.charName   = curMember;
                    guildInfo.realmName  = realmName;
                    guildInfo.regionName = regionName;

                    break;
                }

                default:
                {
                    break;
                }
                }
            }
            return(guildInfo);
        }
Exemplo n.º 11
0
 public void Clear(bool RaiseChangedEvent)
 {
     if (RaiseChangedEvent)
     {
         GuildName       = String.Empty;
         PasswordSetFlag = 0;
         ChestPassword   = String.Empty;
         Flags           = new GuildFlags();
         GuildID         = new ObjectID(0);
         Rank1Male       = String.Empty;
         Rank1Female     = String.Empty;
         Rank2Male       = String.Empty;
         Rank2Female     = String.Empty;
         Rank3Male       = String.Empty;
         Rank3Female     = String.Empty;
         Rank4Male       = String.Empty;
         Rank4Female     = String.Empty;
         Rank5Male       = String.Empty;
         Rank5Female     = String.Empty;
         SupportedMember = new ObjectID(0);
         GuildMembers.Clear();
         IsVisible = false;
     }
     else
     {
         guildName       = String.Empty;
         passwordSetFlag = 0;
         chestPassword   = String.Empty;
         flags           = new GuildFlags();
         guildID         = new ObjectID(0);
         rank1Male       = String.Empty;
         rank1Female     = String.Empty;
         rank2Male       = String.Empty;
         rank2Female     = String.Empty;
         rank3Male       = String.Empty;
         rank3Female     = String.Empty;
         rank4Male       = String.Empty;
         rank4Female     = String.Empty;
         rank5Male       = String.Empty;
         rank5Female     = String.Empty;
         supportedMember = new ObjectID(0);
         guildMembers.Clear();
         isVisible = false;
     }
 }
Exemplo n.º 12
0
        private async void HandleGuildKick(int removeId)
        {
            if (!HasGuild || GuildRank > 3)
            {
                SendGuildKickMember(false, removeId);
                return;
            }

            var dbCharacter = await _guildManager.TryRemoveMember((int)GuildId, removeId);

            if (dbCharacter is null)
            {
                SendGuildKickMember(false, removeId);
                return;
            }

            // Update guild members.
            foreach (var member in GuildMembers.ToList())
            {
                if (!_gameWorld.Players.ContainsKey(member.Id))
                {
                    continue;
                }

                var guildPlayer = _gameWorld.Players[member.Id];

                if (guildPlayer.Id == removeId)
                {
                    guildPlayer.ClearGuild();
                }
                else
                {
                    var temp = guildPlayer.GuildMembers.FirstOrDefault(x => x.Id == removeId);

                    if (temp != null)
                    {
                        guildPlayer.GuildMembers.Remove(temp);
                    }

                    guildPlayer.SendGuildMemberRemove(removeId);
                }

                guildPlayer.SendGuildKickMember(true, removeId);
            }
        }
Exemplo n.º 13
0
    public void UpdateGuildMembers(long account_idx, int exp, bool isAttend = false)
    {
        if (GuildMembers == null)
        {
            return;
        }
        var member = GuildMembers.Find(e => e.account_idx == account_idx);

        if (member == null)
        {
            return;
        }
        member.give += exp;
        if (isAttend)
        {
            member.attend_daily_index = Network.DailyIndex;
        }
    }
Exemplo n.º 14
0
        private void HandleLeaveGuild()
        {
            if (!HasGuild)
            {
                return;
            }

            var dbCharacter = _guildManager.TryRemoveMember((int)GuildId, Id);

            if (dbCharacter == null)
            {
                SendGuildMemberLeaveResult(false);
                return;
            }

            foreach (var member in GuildMembers.ToList())
            {
                if (!_gameWorld.Players.ContainsKey(member.Id))
                {
                    continue;
                }

                var guildPlayer = _gameWorld.Players[member.Id];

                if (guildPlayer.Id == Id)
                {
                    guildPlayer.ClearGuild();
                }
                else
                {
                    var temp = guildPlayer.GuildMembers.FirstOrDefault(x => x.Id == Id);

                    if (temp != null)
                    {
                        guildPlayer.GuildMembers.Remove(temp);
                    }

                    guildPlayer.SendGuildMemberLeave(Id);
                }
            }

            SendGuildMemberLeaveResult(true);
        }
Exemplo n.º 15
0
        public void Clear()
        {
            guildIds.Clear();
            unavailableGuildIds.Clear();

            GuildChannelIds.Clear();

            Users.Clear();
            DMChannels.Clear();

            Guilds.Clear();
            GuildMetadata.Clear();

            GuildChannels.Clear();

            GuildMembers.Clear();
            GuildPresences.Clear();
            GuildVoiceStates.Clear();
        }
Exemplo n.º 16
0
        /// <summary>
        /// Return a list of Guild Members.
        /// </summary>
        /// <param name="limit">Max number of members to return (1-1000)</param>
        /// <returns></returns>
        public GuildMembers GetMembers(TokenResponse tokenResponse, string guildId, int limit)
        {
            GuildMembers members     = new GuildMembers();
            string       memberLimit = limit.ToString();

            using (WebClient client = new WebClient())
            {
                client.Headers.Add(HttpRequestHeader.Authorization, tokenResponse.Type + " " + tokenResponse.AccessToken);
                try
                {
                    IDiscordUriBuilder uriBuilder = new DiscordUriBuilder();
                    string             uri        = uriBuilder.AddPath(members.PathUrl.Replace("{guild}", guildId))
                                                    .AddEndOfPath()
                                                    .AddParameter("limit", memberLimit, false)
                                                    .Build();
                    string response = client.DownloadString(uri);

                    members = serializer.Deserialize <GuildMembers>(response);
                }
                catch (Exception) { }
            }
            return(members);
        }
Exemplo n.º 17
0
 /// <summary>
 /// Returns a list of all currently cached members for the given guild, or null if the guild is not currently cached.
 /// </summary>
 public IReadOnlyList <DiscordGuildMember> GetGuildMembers(Snowflake guildId)
 {
     return(GuildMembers.GetValues(guildId)?.Select(x => x.ImmutableEntity).ToList());
 }
Exemplo n.º 18
0
        public async Task GetNoggen([Remainder] string args = null)
        {
            var          embed            = new EmbedBuilder();
            var          sb               = new StringBuilder();
            string       title            = string.Empty;
            GuildMembers members          = null;
            string       thumbUrl         = string.Empty;
            var          guildInfo        = Context.Guild;
            string       discordGuildName = string.Empty;

            if (guildInfo == null)
            {
                discordGuildName = Context.User.Username;
                thumbUrl         = Context.User.GetAvatarUrl();
            }
            else
            {
                discordGuildName = Context.Guild.Name;
                thumbUrl         = Context.Guild.IconUrl;
            }

            var guildObject = await _wowUtils.GetGuildName(Context);

            title              = $"Top Noggenfogger Consumers in **{guildObject.guildName}**";
            embed.Title        = title;
            embed.ThumbnailUrl = thumbUrl;

            if (guildObject.guildName != null || members != null)
            {
                try
                {
                    if (args == "clear")
                    {
                        List <CharStats> statsFromDb = new List <CharStats>();

                        using (var db = new NinjaBotEntities())
                        {
                            statsFromDb = db.CharStats.Where(c => c.GuildName == guildObject.guildName).ToList();
                        }
                        if (statsFromDb != null)
                        {
                            using (var db = new NinjaBotEntities())
                            {
                                var people = db.CharStats.Where(c => c.GuildName == guildObject.guildName).ToList();
                                foreach (var person in people)
                                {
                                    db.CharStats.Remove(person);
                                }
                                await db.SaveChangesAsync();
                            }
                        }
                    }
                    else
                    {
                        if (!string.IsNullOrEmpty(guildObject.locale))
                        {
                            members = _wowApi.GetGuildMembers(guildObject.realmName, guildObject.guildName, locale: guildObject.locale, regionName: guildObject.regionName);
                        }
                        else
                        {
                            members = _wowApi.GetGuildMembers(guildObject.realmName, guildObject.guildName, regionName: guildObject.regionName);
                        }

                        var maxLevelChars            = members.members.Where(m => m.character.level == 120);
                        List <CharStats> statsFromDb = new List <CharStats>();

                        using (var db = new NinjaBotEntities())
                        {
                            statsFromDb = db.CharStats.Where(c => c.GuildName == guildObject.guildName).ToList();
                        }

                        foreach (var member in maxLevelChars)
                        {
                            var curMemberStats = new WowStats();
                            var match          = statsFromDb.Where(s => s.CharName == member.character.name).FirstOrDefault();
                            var matchTime      = DateTime.Now;

                            if (match != null)
                            {
                                matchTime = match.LastModified;
                            }
                            if (match == null || matchTime.Day != DateTime.Now.Day)
                            {
                                curMemberStats = _wowApi.GetCharStats(member.character.name, member.character.realm.slug, guildObject.locale);
                                var elixer = curMemberStats.Statistics.SubCategories[0].SubCategories[0].Statistics.Where(s => s.Name == "Elixir consumed most").FirstOrDefault();
                                using (var db = new NinjaBotEntities())
                                {
                                    db.CharStats.Add(new CharStats {
                                        CharName       = member.character.name,
                                        RealmName      = member.character.realm.slug,
                                        GuildName      = guildObject.guildName,
                                        ElixerConsumed = elixer.Highest,
                                        Quantity       = elixer.Quantity,
                                        LastModified   = DateTime.Now
                                    });
                                    await db.SaveChangesAsync();
                                }
                            }
                            else
                            {
                            }
                        }
                        if (statsFromDb.Count() == 0)
                        {
                            using (var db = new NinjaBotEntities())
                            {
                                statsFromDb = db.CharStats.Where(c => c.GuildName == guildObject.guildName).ToList();
                            }
                        }
                        if (statsFromDb.Count() > 0)
                        {
                            var candidates = statsFromDb.OrderByDescending(o => o.Quantity).Take(10).ToList();
                            if (candidates != null && candidates.Count() > 0)
                            {
                                foreach (var canditate in candidates)
                                {
                                    sb.AppendLine($":black_medium_small_square: {canditate.CharName} -> *{canditate.Quantity}*");
                                }
                            }
                        }
                        embed.Description = sb.ToString();
                        await _cc.Reply(Context, embed);
                    }
                }
                catch (Exception ex)
                {
                    _logger.LogError($"Get-Guild Error getting guild info: [{ex.Message}]");
                }
            }
        }
Exemplo n.º 19
0
        private async void HandleJoinResult(bool ok, int characterId)
        {
            if (!HasGuild || GuildRank > 3)
            {
                return;
            }

            var guild = await _guildManager.GetGuild((int)GuildId);

            if (guild is null)
            {
                return;
            }

            await _guildManager.RemoveRequestJoin(characterId);

            var onlinePlayer = _gameWorld.Players[characterId];

            if (!ok)
            {
                if (onlinePlayer != null)
                {
                    onlinePlayer.SendGuildJoinResult(false, guild);
                }

                return;
            }

            var dbCharacter = await _guildManager.TryAddMember((int)GuildId, characterId);

            if (dbCharacter is null)
            {
                if (onlinePlayer != null)
                {
                    onlinePlayer.SendGuildJoinResult(false, guild);
                }

                return;
            }

            // Update guild members.
            foreach (var member in GuildMembers.ToList())
            {
                if (!_gameWorld.Players.ContainsKey(member.Id))
                {
                    continue;
                }

                var guildPlayer = _gameWorld.Players[member.Id];
                guildPlayer.GuildMembers.Add(dbCharacter);
                guildPlayer.SendGuildUserListAdd(dbCharacter, onlinePlayer != null);
            }

            // Send additional info to new member, if he is online.
            if (onlinePlayer != null)
            {
                onlinePlayer.GuildId   = guild.Id;
                onlinePlayer.GuildName = guild.Name;
                onlinePlayer.GuildRank = 9;
                onlinePlayer.GuildMembers.AddRange(GuildMembers);

                onlinePlayer.SendGuildJoinResult(true, guild);
                onlinePlayer.SendGuildMembersOnline();
            }
        }
Exemplo n.º 20
0
 public void AddGuildMember(pd_GuildMemberInfoDetail member)
 {
     GuildInfo.info.member_count++;
     GuildMembers.Add(member);
 }
Exemplo n.º 21
0
            public async Task <bool> Refresh(Action <string> optional_output = null)
            {
                try
                {
                    LastError = string.Empty;

                    optional_output?.Invoke($"Getting info: \"{Realm}/{Guild}\"...");

                    var rsp = await Get.GuildInfo(Realm, Guild);

                    if (rsp.Successful == false)
                    {
                        if (rsp.StatusCode == System.Net.HttpStatusCode.NotFound)
                        {
                            LastError = $"I couldn't find the guild `{Guild}` on `{Realm}`";
                        }
                        else
                        {
                            LastError = $"Something went wrong with the request. Tell a nerd: {rsp.ErrorText}";
                        }
                        return(false);
                    }

                    GuildResponse = rsp.Result;

                    CharacterCount = GuildResponse.members.Count;

                    var chars_at_110 = GuildResponse.members.Where(x => x.guildCharacter.level >= TargetLevel).ToList();

                    TargetLevelCharacterCount = chars_at_110.Count;

                    optional_output?.Invoke($"{CharacterCount} characters. {TargetLevelCharacterCount} are at level {TargetLevel}.");

                    if (TargetLevelCharacterCount == 0)
                    {
                        return(true);
                    }

                    int count = 0;
                    var tasks = new List <Task>();

                    // build tasks for each character to get more info for them.
                    var fields = bnet.Requests.Fields.Character.Minimal;
                    fields.Items = true;

                    int active_requests = 0;

                    foreach (var member in chars_at_110)
                    {
                        var fetch_task = Task.Run(async() =>
                        {
                            while (active_requests > MaxAsyncRequests)
                            {
                                await Task.Delay(5);
                            }

                            System.Threading.Interlocked.Increment(ref active_requests);

                            try
                            {
                                await member.FetchSpecificCharacterInfo(fields);
                            }
                            finally
                            {
                                System.Threading.Interlocked.Decrement(ref active_requests);
                            }
                        });

                        tasks.Add(fetch_task);

                        ++count;
                    }

                    await Task.WhenAll(tasks);

                    if (active_requests > 0)
                    {
                        throw new InvalidOperationException($"Tasks finished but {nameof(active_requests)} still > 0?! ({active_requests})");
                    }

                    GuildMembers     = chars_at_110.Where(x => x.character != null).OrderByDescending(x => x.character.items.calculatedItemLevel).ToList();
                    FailedCharacters = chars_at_110.Where(x => x.character == null).OrderByDescending(x => x.guildCharacter.name).Select(x => x.guildCharacter.name).ToList();

                    LastRefresh = DateTime.Now;

                    optional_output?.Invoke($"Finished refreshing: \"{Realm}/{Guild}\"...");

                    return(true);
                }
                catch (Exception ex)
                {
                    LastError = ex.Message;
                    return(false);
                }
            }
Exemplo n.º 22
0
        public override void Patch(Dictionary <string, JsonElement> Data)
        {
            //if (!Partial) return;
            Console.WriteLine($"Patching guild data for {this.Id}");

            JsonElement temp;
            long        tempL;

            #region String values
            Name            = Data["name"].GetString();
            Icon            = Data["icon"].GetString();
            Splash          = Data["splash"].GetString();
            DiscoverySplash = Data["discovery_splash"].ToString();
            Region          = Data["region"].ToString();

            ArrayEnumerator _Features = Data["features"].EnumerateArray();
            Features = new string[Data["features"].GetArrayLength()];
            for (int i = 0; i < Features.Length; i++)
            {
                _Features.MoveNext();
                Features[i] = _Features.Current.GetString();
            }
            #endregion String values

            #region Integer values
            AfkTimeout            = Data["afk_timeout"].GetInt32();
            VerificationLevel     = Data["verification_level"].GetInt32();
            DefaultNotifications  = Data["default_message_notifications"].GetInt32();
            ExplicitContentFilter = Data["explicit_content_filter"].GetInt32();
            MfaLevel = Data["mfa_level"].GetInt32();
            if (Data.TryGetValue("member_count", out temp))
            {
                MemberCount = temp.GetInt32();
            }
            if (Data.TryGetValue("max_presences", out temp))
            {
                MaxPresences = temp.GetInt32();
            }
            if (Data.TryGetValue("max_members", out temp))
            {
                MaxMembers = temp.GetInt32();
            }
            #endregion Integer values

            #region Long values
            OwnerId = long.Parse(Data["owner_id"].GetString());
            if (Data.TryGetValue("afk_channel_id", out temp) && long.TryParse(temp.GetString(), out tempL))
            {
                AfkChannelId = tempL;
            }
            if (Data.TryGetValue("application_id", out temp) && long.TryParse(temp.GetString(), out tempL))
            {
                ApplicationId = tempL;
            }
            if (long.TryParse(Data["system_channel_id"].GetString(), out tempL))
            {
                SystemChannelId = tempL;
            }
            if (long.TryParse(Data["rules_channel_id"].GetString(), out tempL))
            {
                RulesChannelId = tempL;
            }
            if (Data.TryGetValue("widget_channel_id", out temp) && long.TryParse(temp.GetString(), out tempL))
            {
                WidgetChannelId = tempL;
            }
            #endregion Long values

            #region Bool values
            if (Data.TryGetValue("widget_enabled", out temp))
            {
                WidgetEnabled = temp.GetBoolean();
            }
            if (Data.TryGetValue("large", out temp))
            {
                Large = temp.GetBoolean();
            }
            if (Data.TryGetValue("unavailable", out temp))
            {
                Unavailable = temp.GetBoolean();
            }
            #endregion Bool values

            if (Data.TryGetValue("joined_at", out temp))
            {
                JoinedAt = DateTime.Parse(temp.GetString());
            }

            if (_Patched)
            {
                return;
            }

            // TODO: Create role objects
            Roles = new GuildRoles(this.Client, this);
            ArrayEnumerator _Roles = Data["roles"].EnumerateArray();
            foreach (JsonElement Role in _Roles)
            {
                Roles.CreateEntry(Role);
            }

            // TODO: Create emoji objects
            Emojis = new GuildEmojis(this.Client, this);
            ArrayEnumerator _Emojis = Data["emojis"].EnumerateArray();
            foreach (JsonElement Role in _Roles)
            {
                Emojis.CreateEntry(Role);
            }

            // TODO: AFK channel

            // TODO: System channel

            // TODO: Rules channel

            // TODO: Channels
            Channels = new GuildChannels(this.Client, this);
            ArrayEnumerator _Channels = Data["channels"].EnumerateArray();
            foreach (JsonElement Channel in _Channels)
            {
                Channels.CreateEntry(Channel);
            }

            // TODO: Members
            Members = new GuildMembers(Client, this);
            ArrayEnumerator _Members = Data["members"].EnumerateArray();
            foreach (JsonElement Member in _Members)
            {
                //Console.WriteLine(Member);
                Members.CreateEntry(Member);
            }

            // TODO: Presences

            // TODO: Voice states

            _Patched = true;
        }