internal void Update(WebSocketGuildModel model) { Update(model as GuildModel); for (var i = 0; i < model.Channels.Length; i++) { var channelModel = model.Channels[i]; _channels.AddOrUpdate(channelModel.Id, _ => CachedGuildChannel.Create(this, channelModel), (_, old) => { old.Update(channelModel); return(old); }); } Update(model.Members); for (var i = 0; i < model.VoiceStates.Length; i++) { var voiceState = model.VoiceStates[i]; _members[voiceState.UserId].Update(voiceState); } if (model.Presences != null) { Update(model.Presences); } MemberCount = model.MemberCount; IsLarge = model.Large; IsUnavailable = !model.Unavailable.HasValue || model.Unavailable.Value; }
internal CachedGuild(DiscordClientBase client, WebSocketGuildModel model) : base(client, model.Id) { _roles = new LockedDictionary <Snowflake, CachedRole>(model.Roles.Value.Length); _emojis = new LockedDictionary <Snowflake, CachedGuildEmoji>(model.Emojis.Value.Length); _channels = new LockedDictionary <Snowflake, CachedGuildChannel>(model.Channels.Length); _members = new LockedDictionary <Snowflake, CachedMember>(model.MemberCount); Update(model); if (client.IsBot && IsLarge) { ChunksExpected = (int)Math.Ceiling(model.MemberCount / 1000.0); ChunkTcs = new TaskCompletionSource <bool>(); } else if (!client.IsBot) { SyncTcs = new TaskCompletionSource <bool>(); } }
internal void Update(WebSocketGuildModel model) { Update(model as GuildModel); _channels.Clear(); for (var i = 0; i < model.Channels.Length; i++) { var channelModel = model.Channels[i]; _channels.TryAdd(channelModel.Id, CachedGuildChannel.Create(Client, channelModel, this)); } _members.Clear(); for (var i = 0; i < model.Members.Length; i++) { var memberModel = model.Members[i]; CachedMember member = null; if (Client.IsBot || !Client.IsBot && !_members.ContainsKey(memberModel.User.Id)) member = Client.GetOrCreateMember(this, memberModel, memberModel.User, true); if (member != null) { var voiceState = Array.Find(model.VoiceStates, x => x.UserId == member.Id); if (voiceState != null) member.Update(voiceState); } } if (!Client.IsBot) { Update(model.Presences); } MemberCount = model.MemberCount; IsLarge = model.Large; IsUnavailable = !model.Unavailable.HasValue || model.Unavailable.Value; }
internal CachedGuild(DiscordClient client, WebSocketGuildModel model) : base(client, model.Id) { _roles = Extensions.CreateConcurrentDictionary<Snowflake, CachedRole>(model.Roles.Value.Length); _channels = Extensions.CreateConcurrentDictionary<Snowflake, CachedGuildChannel>(model.Channels.Length); _members = Extensions.CreateConcurrentDictionary<Snowflake, CachedMember>(model.Members.Length); Roles = new ReadOnlyDictionary<Snowflake, CachedRole>(_roles); Channels = new ReadOnlyDictionary<Snowflake, CachedGuildChannel>(_channels); Members = new ReadOnlyDictionary<Snowflake, CachedMember>(_members); NestedChannels = new ReadOnlyOfTypeDictionary<Snowflake, CachedGuildChannel, CachedNestedChannel>(_channels); TextChannels = new ReadOnlyOfTypeDictionary<Snowflake, CachedGuildChannel, CachedTextChannel>(_channels); VoiceChannels = new ReadOnlyOfTypeDictionary<Snowflake, CachedGuildChannel, CachedVoiceChannel>(_channels); CategoryChannels = new ReadOnlyOfTypeDictionary<Snowflake, CachedGuildChannel, CachedCategoryChannel>(_channels); Update(model); if (client.IsBot && IsLarge) { ChunksExpected = (int) Math.Ceiling(model.MemberCount / 1000.0); ChunkTcs = new TaskCompletionSource<bool>(); } else if (!client.IsBot) { SyncTcs = new TaskCompletionSource<bool>(); } }