void HandleChannelUpdateEvent(DiscordApiData data) { Snowflake id = data.GetSnowflake("id").Value; DiscordChannelType type = (DiscordChannelType)data.GetInteger("type"); Snowflake guildId = data.GetSnowflake("guild_id").Value; DiscordGuildChannel channel = null; 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); } if (channel != null) { cache.GuildChannels[id] = channel; OnGuildChannelUpdated?.Invoke(this, new GuildChannelEventArgs(shard, guildId, channel)); } else { log.LogWarning($"Failed to update channel {id} because the type ({type}) doesn't have an implementation!"); } }
void HandleChannelDeleteEvent(DiscordApiData data) { Snowflake id = data.GetSnowflake("id").Value; DiscordChannelType type = (DiscordChannelType)data.GetInteger("type").Value; if (type == DiscordChannelType.DirectMessage) { // DM channel DiscordDMChannel dm; if (cache.DMChannels.TryRemove(id, out MutableDMChannel mutableDM)) { mutableDM.ClearReferences(); dm = mutableDM.ImmutableEntity; } else { dm = new DiscordDMChannel(http, data); } OnDMChannelRemoved?.Invoke(this, new DMChannelEventArgs(shard, dm)); } else if (type == DiscordChannelType.GuildText || type == DiscordChannelType.GuildVoice || type == DiscordChannelType.GuildCategory) { // Guild channel Snowflake guildId = data.GetSnowflake("guild_id").Value; DiscordGuildChannel channel; if (type == DiscordChannelType.GuildText) { if (!cache.GuildChannels.TryRemove(id, out channel)) { channel = new DiscordGuildTextChannel(http, data, guildId); } } else if (type == DiscordChannelType.GuildVoice) { if (!cache.GuildChannels.TryRemove(id, out channel)) { channel = new DiscordGuildVoiceChannel(http, data, guildId); } } else if (type == DiscordChannelType.GuildCategory) { if (!cache.GuildChannels.TryRemove(id, out channel)) { channel = new DiscordGuildCategoryChannel(http, data, guildId); } } else { throw new NotImplementedException($"Guild channel type \"{type}\" has no implementation!"); } OnGuildChannelRemoved?.Invoke(this, new GuildChannelEventArgs(shard, guildId, channel)); } }
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)); } }
public DiscordChannel( ulong id, string name, int position, bool canManage, DiscordChannelType type, ulong?parentId = null) : base(id, name) { Position = position; CanManage = canManage; Type = type; ParentId = parentId; }
internal DiscordGuildChannel(DiscordHttpClient http, DiscordApiData data, DiscordChannelType type, Snowflake?guildId) : base(http, data, type) { this.http = http; GuildId = guildId ?? data.GetSnowflake("guild_id").Value; Name = data.GetString("name"); Position = data.GetInteger("position").Value; IList <DiscordApiData> overwrites = data.GetArray("permission_overwrites"); Dictionary <Snowflake, DiscordOverwrite> permissionOverwrites = new Dictionary <Snowflake, DiscordOverwrite>(); for (int i = 0; i < overwrites.Count; i++) { DiscordOverwrite overwrite = new DiscordOverwrite(http, Id, overwrites[i]); permissionOverwrites.Add(overwrite.Id, overwrite); } PermissionOverwrites = permissionOverwrites; }
public DiscordOverwrite(ulong id, bool isRole, DiscordChannelType type) { Id = id; IsRole = isRole; if (type is not DiscordChannelType.Unknown) { Permission.Add(DiscordPermission.ViewChannel, null); Permission.Add(DiscordPermission.ManageChannel, null); Permission.Add(DiscordPermission.ManagePermissions, null); Permission.Add(DiscordPermission.ManageWebhooks, null); Permission.Add(DiscordPermission.CreateInvite, null); } if (type is DiscordChannelType.Category || type is DiscordChannelType.TextChannel) { Permission.Add(DiscordPermission.SendMessages, null); Permission.Add(DiscordPermission.SendTTS, null); Permission.Add(DiscordPermission.ManageMessages, null); Permission.Add(DiscordPermission.EmbedLinks, null); Permission.Add(DiscordPermission.AttachFiles, null); Permission.Add(DiscordPermission.ReadMessageHistory, null); Permission.Add(DiscordPermission.MentionEveryone, null); Permission.Add(DiscordPermission.UseExternalEmoji, null); Permission.Add(DiscordPermission.AddReactions, null); } if (type is DiscordChannelType.Category || type is DiscordChannelType.VoiceChannel) { Permission.Add(DiscordPermission.Connect, null); Permission.Add(DiscordPermission.Speak, null); Permission.Add(DiscordPermission.Video, null); Permission.Add(DiscordPermission.MuteMembers, null); Permission.Add(DiscordPermission.DeafenMembers, null); Permission.Add(DiscordPermission.MoveMembers, null); Permission.Add(DiscordPermission.UseVoiceActivity, null); Permission.Add(DiscordPermission.PrioritySpeaker, null); } }
public async Task<DiscordChannel> CreateChannel(string guildId, string channelName, DiscordChannelType channelType = DiscordChannelType.Text) // POST https://discordapp.com/api/guilds/123456789012345678/channels { if (_token == null) throw new DiscordException(ExceptionList.NotLoggedIn); if (guildId == null) throw new ArgumentNullException("guildId"); if (channelName == null) throw new ArgumentNullException("channelName"); JsonObject request = new JsonObject { { "type", JsonValue.CreateStringValue(channelType == DiscordChannelType.Text ? "text" : "voice") }, { "name", JsonValue.CreateStringValue(channelName) } }; WebResult response = await Web.POST(DiscordEndpoint.Api + DiscordEndpoint.Guilds + "/" + guildId + "/channels", request.Stringify(), _token); if (response.Status != System.Net.HttpStatusCode.Created) return null; JObject jmessage = JObject.Parse((string)response.Data); return JsonHelper.ParseChannelAndChoose(jmessage); }
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(); }
void HandleGuildCreateEvent(DiscordApiData data) { Snowflake guildId = data.GetSnowflake("id").Value; bool wasUnavailable = !cache.IsGuildAvailable(guildId); // Update guild MutableGuild mutableGuild; if (!cache.Guilds.TryGetValue(guildId, out mutableGuild)) { mutableGuild = new MutableGuild(guildId, http); cache.Guilds[guildId] = mutableGuild; } mutableGuild.Update(data); // Ensure the cache guildId list contains this guild (it uses a hashset so don't worry about duplicates). cache.AddGuildId(guildId); // GUILD_CREATE specifics // Update metadata cache.GuildMetadata[guildId] = new DiscordGuildMetadata(data); // Deserialize members cache.GuildMembers.Clear(guildId); IList <DiscordApiData> membersArray = data.GetArray("members"); for (int i = 0; i < membersArray.Count; i++) { DiscordApiData memberData = membersArray[i]; DiscordApiData userData = memberData.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); MutableGuildMember member; if (!cache.GuildMembers.TryGetValue(guildId, userId, out member)) { member = new MutableGuildMember(user, guildId, http); cache.GuildMembers[guildId, userId] = member; } member.Update(memberData); } // Deserialize channels cache.ClearGuildChannels(guildId); IList <DiscordApiData> channelsArray = data.GetArray("channels"); for (int i = 0; i < channelsArray.Count; i++) { DiscordApiData channelData = channelsArray[i]; DiscordChannelType channelType = (DiscordChannelType)channelData.GetInteger("type"); DiscordGuildChannel channel = null; if (channelType == DiscordChannelType.GuildText) { channel = new DiscordGuildTextChannel(http, channelData, guildId); } else if (channelType == DiscordChannelType.GuildVoice) { channel = new DiscordGuildVoiceChannel(http, channelData, guildId); } else if (channelType == DiscordChannelType.GuildCategory) { channel = new DiscordGuildCategoryChannel(http, channelData, guildId); } if (channel != null) { cache.AddGuildChannel(channel); } } // Deserialize voice states cache.GuildVoiceStates.Clear(guildId); IList <DiscordApiData> voiceStatesArray = data.GetArray("voice_states"); for (int i = 0; i < voiceStatesArray.Count; i++) { DiscordVoiceState state = new DiscordVoiceState(guildId, voiceStatesArray[i]); UpdateMemberVoiceState(state); } // Deserialize presences cache.GuildPresences.Clear(guildId); IList <DiscordApiData> presencesArray = data.GetArray("presences"); for (int i = 0; i < presencesArray.Count; i++) { // Presence's in GUILD_CREATE do not contain full user objects, // so don't attempt to update them here. DiscordApiData presenceData = presencesArray[i]; Snowflake userId = presenceData.LocateSnowflake("user.id").Value; cache.GuildPresences[guildId, userId] = new DiscordUserPresence(userId, presenceData); } // Mark the guild as available cache.SetGuildAvailability(guildId, true); // Fire event if (wasUnavailable) { OnGuildAvailable?.Invoke(this, new GuildEventArgs(shard, mutableGuild.ImmutableEntity)); } else { OnGuildCreated?.Invoke(this, new GuildEventArgs(shard, mutableGuild.ImmutableEntity)); } }
internal DiscordChannel(DiscordHttpClient http, DiscordApiData data, DiscordChannelType type) : base(data) { this.http = http; ChannelType = type; }
internal DiscordChannel(DiscordHttpClient http, DiscordChannelType type) { this.http = http; ChannelType = type; }
internal DiscordInviteChannel(DiscordApiData data) { ChannelId = data.GetSnowflake("id").Value; Name = data.GetString("name"); Type = (DiscordChannelType)data.GetInteger("type"); }