internal SocketGuildChannel AddChannel(ClientState state, ChannelModel model) { var channel = SocketGuildChannel.Create(this, state, model); _channels.TryAdd(model.Id); state.AddChannel(channel); return(channel); }
internal void Update(ClientState state, ExtendedModel model) { IsAvailable = !(model.Unavailable ?? false); if (!IsAvailable) { if (_channels == null) { _channels = new ConcurrentHashSet <ulong>(); } if (_members == null) { _members = new ConcurrentDictionary <ulong, SocketGuildUser>(); } if (_roles == null) { _roles = new ConcurrentDictionary <ulong, SocketRole>(); } /*if (Emojis == null) * _emojis = ImmutableArray.Create<Emoji>(); * if (Features == null) * _features = ImmutableArray.Create<string>();*/ _syncPromise = new TaskCompletionSource <bool>(); _downloaderPromise = new TaskCompletionSource <bool>(); return; } Update(state, model as Model); var channels = new ConcurrentHashSet <ulong>(ConcurrentHashSet.DefaultConcurrencyLevel, (int)(model.Channels.Length * 1.05)); { for (int i = 0; i < model.Channels.Length; i++) { var channel = SocketGuildChannel.Create(this, state, model.Channels[i]); state.AddChannel(channel); channels.TryAdd(channel.Id); } } _channels = channels; var members = new ConcurrentDictionary <ulong, SocketGuildUser>(ConcurrentHashSet.DefaultConcurrencyLevel, (int)(model.Members.Length * 1.05)); { for (int i = 0; i < model.Members.Length; i++) { var member = SocketGuildUser.Create(this, state, model.Members[i]); members.TryAdd(member.Id, member); } DownloadedMemberCount = members.Count; for (int i = 0; i < model.Presences.Length; i++) { if (members.TryGetValue(model.Presences[i].User.Id, out SocketGuildUser member)) { member.Update(state, model.Presences[i], true); } } } _members = members; MemberCount = model.MemberCount; var voiceStates = new ConcurrentDictionary <ulong, SocketVoiceState>(ConcurrentHashSet.DefaultConcurrencyLevel, (int)(model.VoiceStates.Length * 1.05)); { for (int i = 0; i < model.VoiceStates.Length; i++) { SocketVoiceChannel channel = null; if (model.VoiceStates[i].ChannelId.HasValue) { channel = state.GetChannel(model.VoiceStates[i].ChannelId.Value) as SocketVoiceChannel; } var voiceState = SocketVoiceState.Create(channel, model.VoiceStates[i]); voiceStates.TryAdd(model.VoiceStates[i].UserId, voiceState); } } _voiceStates = voiceStates; _syncPromise = new TaskCompletionSource <bool>(); _downloaderPromise = new TaskCompletionSource <bool>(); var _ = _syncPromise.TrySetResultAsync(true); /*if (!model.Large) * _ = _downloaderPromise.TrySetResultAsync(true);*/ }
internal SocketResolvableData(DiscordSocketClient discord, ulong?guildId, T model) { var guild = guildId.HasValue ? discord.GetGuild(guildId.Value) : null; var resolved = model.Resolved.Value; if (resolved.Users.IsSpecified) { foreach (var user in resolved.Users.Value) { var socketUser = discord.GetOrCreateUser(discord.State, user.Value); Users.Add(ulong.Parse(user.Key), socketUser); } } if (resolved.Channels.IsSpecified) { foreach (var channel in resolved.Channels.Value) { SocketChannel socketChannel = guild != null ? guild.GetChannel(channel.Value.Id) : discord.GetChannel(channel.Value.Id); if (socketChannel == null) { var channelModel = guild != null ? discord.Rest.ApiClient.GetChannelAsync(guild.Id, channel.Value.Id).ConfigureAwait(false).GetAwaiter().GetResult() : discord.Rest.ApiClient.GetChannelAsync(channel.Value.Id).ConfigureAwait(false).GetAwaiter().GetResult(); socketChannel = guild != null ? SocketGuildChannel.Create(guild, discord.State, channelModel) : (SocketChannel)SocketChannel.CreatePrivate(discord, discord.State, channelModel); } discord.State.AddChannel(socketChannel); Channels.Add(ulong.Parse(channel.Key), socketChannel); } } if (resolved.Members.IsSpecified && guild != null) { foreach (var member in resolved.Members.Value) { member.Value.User = resolved.Users.Value[member.Key]; var user = guild.AddOrUpdateUser(member.Value); GuildMembers.Add(ulong.Parse(member.Key), user); } } if (resolved.Roles.IsSpecified) { foreach (var role in resolved.Roles.Value) { var socketRole = guild.AddOrUpdateRole(role.Value); Roles.Add(ulong.Parse(role.Key), socketRole); } } if (resolved.Messages.IsSpecified) { foreach (var msg in resolved.Messages.Value) { var channel = discord.GetChannel(msg.Value.ChannelId) as ISocketMessageChannel; SocketUser author; if (guild != null) { if (msg.Value.WebhookId.IsSpecified) { author = SocketWebhookUser.Create(guild, discord.State, msg.Value.Author.Value, msg.Value.WebhookId.Value); } else { author = guild.GetUser(msg.Value.Author.Value.Id); } } else { author = (channel as SocketChannel).GetUser(msg.Value.Author.Value.Id); } if (channel == null) { if (!msg.Value.GuildId.IsSpecified) // assume it is a DM { channel = discord.CreateDMChannel(msg.Value.ChannelId, msg.Value.Author.Value, discord.State); } } var message = SocketMessage.Create(discord, discord.State, author, channel, msg.Value); Messages.Add(message.Id, message); } } if (resolved.Attachments.IsSpecified) { foreach (var attachment in resolved.Attachments.Value) { var discordAttachment = Attachment.Create(attachment.Value); Attachments.Add(ulong.Parse(attachment.Key), discordAttachment); } } }