void HandleChannelCreateEvent(DiscordApiData data) { Snowflake id = data.GetSnowflake("id").Value; DiscordChannelType type = (DiscordChannelType)data.GetInteger("type").Value; if (type == DiscordChannelType.DirectMessage) { // DM channel DiscordApiData recipientData = data.GetArray("recipients").First(); Snowflake recipientId = recipientData.GetSnowflake("id").Value; MutableUser recipient; if (!cache.Users.TryGetValue(recipientId, out recipient)) { recipient = new MutableUser(recipientId, false, http); cache.Users[recipientId] = recipient; } recipient.Update(recipientData); MutableDMChannel mutableDMChannel; if (!cache.DMChannels.TryGetValue(id, out mutableDMChannel)) { mutableDMChannel = new MutableDMChannel(id, recipient, http); cache.DMChannels[id] = mutableDMChannel; } OnDMChannelCreated?.Invoke(this, new DMChannelEventArgs(shard, mutableDMChannel.ImmutableEntity)); } else if (type == DiscordChannelType.GuildText || type == DiscordChannelType.GuildVoice) { // Guild channel Snowflake guildId = data.GetSnowflake("guild_id").Value; DiscordGuildChannel channel; if (type == DiscordChannelType.GuildText) { channel = new DiscordGuildTextChannel(http, data, guildId); } else if (type == DiscordChannelType.GuildVoice) { channel = new DiscordGuildVoiceChannel(http, data, guildId); } else if (type == DiscordChannelType.GuildCategory) { channel = new DiscordGuildCategoryChannel(http, data, guildId); } else { throw new NotImplementedException($"Guild channel type \"{type}\" has no implementation!"); } cache.GuildChannels[id] = channel; OnGuildChannelCreated?.Invoke(this, new GuildChannelEventArgs(shard, guildId, channel)); } }
internal DiscordDMChannel(DiscordHttpClient http, MutableDMChannel channel) : base(http, DiscordChannelType.DirectMessage) { this.http = http; Id = channel.Id; Recipient = channel.Recipient.ImmutableEntity; lastMessageId = channel.LastMessageId; }
void HandleReadyEvent(DiscordApiData data) { // Check gateway protocol int protocolVersion = data.GetInteger("v").Value; if (protocolVersion != GATEWAY_VERSION) { log.LogError($"[Ready] Gateway protocol mismatch! Expected v{GATEWAY_VERSION}, got {protocolVersion}."); } // Clear the cache cache.Clear(); // Get the current bot's user object DiscordApiData userData = data.Get("user"); Snowflake userId = userData.GetSnowflake("id").Value; MutableUser user; if (!cache.Users.TryGetValue(userId, out user)) { user = new MutableUser(userId, false, http); cache.Users[userId] = user; } user.Update(userData); shard.UserId = userId; log.LogInfo($"[Ready] user = {user.Username}#{user.Discriminator}"); // Get session ID sessionId = data.GetString("session_id"); // Get unavailable guilds foreach (DiscordApiData unavailableGuildData in data.GetArray("guilds")) { Snowflake guildId = unavailableGuildData.GetSnowflake("id").Value; cache.AddGuildId(guildId); cache.SetGuildAvailability(guildId, false); } // Get DM channels foreach (DiscordApiData dmChannelData in data.GetArray("private_channels")) { DiscordChannelType type = (DiscordChannelType)dmChannelData.GetInteger("type").Value; if (type != DiscordChannelType.DirectMessage) { // TODO: Support group DMs continue; } Snowflake channelId = dmChannelData.GetSnowflake("id").Value; DiscordApiData recipientData = dmChannelData.GetArray("recipients").First(); Snowflake recipientId = recipientData.GetSnowflake("id").Value; MutableUser recipient; if (!cache.Users.TryGetValue(recipientId, out recipient)) { recipient = new MutableUser(recipientId, false, http); cache.Users[recipientId] = recipient; } recipient.Update(recipientData); MutableDMChannel mutableDMChannel; if (!cache.DMChannels.TryGetValue(channelId, out mutableDMChannel)) { mutableDMChannel = new MutableDMChannel(channelId, recipient, http); cache.DMChannels[channelId] = mutableDMChannel; } mutableDMChannel.Update(dmChannelData); } LogServerTrace("Ready", data); // Signal that the connection is ready handshakeCompleteEvent.Set(); }