 
     /// MESSAGE_REACTION_ADD, MESSAGE_REACTION_REMOVE
     case .reactionAdd, .reactionRemove:
-      let channelID = ChannelID(data["channel_id"] as! String)!
+      let channelId = ChannelID(data["channel_id"] as! String)!
+      guard let channel = self.sword.getChannel(for: channelId) else {
+        return
+      }
       let userID = UserID(data["user_id"] as! String)!
       let messageID = MessageID(data["message_id"] as! String)!
       let emoji = Emoji(data["emoji"] as! [String: Any])
-      self.sword.emit(
-        event,
-        with: (self.sword.getChannel(for: channelID)!, userID, messageID, emoji)
-      )
+      self.sword.emit(event, with: (channel, userID, messageID, emoji))
 
     /// TYPING_START
     case .typingStart:

    /// MESSAGE_DELETE
    case .messageDelete:
      let channelId = ChannelID(data["channel_id"] as! String)!
      let messageId = MessageID(data["id"] as! String)!
      self.sword.emit(
        .messageDelete,
        with: (messageId, self.sword.getChannel(for: channelId)!)
      )

    /// MESSAGE_BULK_DELETE
    case .messageDeleteBulk:
      let messageIds = (data["ids"] as! [String]).map({ MessageID($0)! })
      let channelId = ChannelID(data["channel_id"] as! String)!
      self.sword.emit(
        .messageDeleteBulk,
        with: (messageIds, self.sword.getChannel(for: channelId)!)
      )
      
    /// MESSAGE_REACTION_REMOVE_ALL
    case .messageReactionRemoveAll:
      let messageId = MessageID(data["message_id"] as! String)!
      let channelId = ChannelID(data["channel_id"] as! String)!
      self.sword.emit(
        .messageReactionRemoveAll,
        with: (messageId, self.sword.getChannel(for: channelId)!)
      )
      
    /// MESSAGE_UPDATE
    case .messageUpdate:


    /// GUILD_MEMBER_UPDATE
    case .guildMemberUpdate:
      let guildId = GuildID(data["guild_id"] as! String)!
      guard let guild = self.sword.guilds[guildId] else {
        return
      }
      let member = Member(self.sword, guild, data)
      guild.members[member.user.id] = member
      self.sword.emit(.guildMemberUpdate, with: member)

    /// GUILD_ROLE_CREATE
    case .guildRoleCreate:
      let guildId = GuildID(data["guild_id"] as! String)!
      guard let guild = self.sword.guilds[guildId] else {
        return
      }
      let role = Role(data["role"] as! [String: Any])
      guild.roles[role.id] = role
      self.sword.emit(.guildRoleCreate, with: (guild, role))

    /// GUILD_ROLE_DELETE
    case .guildRoleDelete:
      let guildId = GuildID(data["guild_id"] as! String)!
      guard let guild = self.sword.guilds[guildId] else {
        return
      }
      let roleId = RoleID(data["role_id"] as! String)!
      guard let role = guild.roles[roleId] else {
        return
      }
      guild.roles.removeValue(forKey: role.id)
      self.sword.emit(.guildRoleDelete, with: (guild, role))

    /// GUILD_ROLE_UPDATE
    case .guildRoleUpdate:
      let guildId = GuildID(data["guild_id"] as! String)!
      guard let guild = self.sword.guilds[guildId] else {
        return
      }
      let role = Role(data["role"] as! [String: Any])
      guild.roles[role.id] = role
      self.sword.emit(.guildRoleUpdate, with: (guild, role))
