You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: member.rb
    path of file: ./repos/discordrb/lib/discordrb/data
    
    the code of the file until where you have to start completion: # frozen_string_literal: true

module Discordrb
  # Mixin for the attributes members and private members should have
  module MemberAttributes
    # @return [Time] when this member joined the server.
    attr_reader :joined_at

    # @return [Time, nil] when this member boosted this server, `nil` if they haven't.
    attr_reader :boosting_since

    # @return [String, nil] the nickname this member has, or `nil` if it has none.
    attr_reader :nick
   
    
    def update_roles(role_ids)
      @roles = []
      role_ids.each do |id|
        # It is posible for members to have roles that do not exist
        # on the server any longer. See https://github.com/discordrb/discordrb/issues/371
        role = @server.role(id)
        @roles << role if role
      end
    end

    # Update this member's nick
    # @note For internal use only.
    # @!visibility private
    def update_nick(nick)
      @nick = nick
    end

    # Update this member's boosting timestamp
    # @note For internal user only.
    # @!visibility private
    def update_boosting_since(time)
      @boosting_since = time
    end

    include PermissionCalculator

    # Overwriting inspect for debug purposes
    def inspect
      "<Member user=#{@user.inspect} server=#{@server.inspect} joined_at=#{@joined_at} roles=#{@roles.inspect} voice_channel=#{@voice_channel.inspect} mute=#{@mute} deaf=#{@deaf} self_mute=#{@self_mute} self_deaf=#{@self_deaf}>"
    end

    private

    # Utility method to get a list of role IDs from one role or an array of roles
    def role_id_array(role)
      if role.is_a? Array
        role.map(&:resolve_id)
      else
        [role.resolve_id]
      end
    end