///|
/// Fetch this guild member.
pub async fn MemberRef::fetch(
  self : MemberRef,
) -> @model.GuildMember raise DiscordHttpError {
  self.client.get_guild_member(self.guild_id, self.user_id)
}

///|
/// Ban this member from the guild.
pub async fn MemberRef::ban(
  self : MemberRef,
  delete_message_seconds? : Int,
  reason? : String,
) -> Unit raise DiscordHttpError {
  self.client.create_guild_ban(
    self.guild_id,
    self.user_id,
    delete_message_seconds?,
    audit_reason?=reason,
  )
}

///|
/// Remove this member from the guild.
pub async fn MemberRef::kick(
  self : MemberRef,
  reason? : String,
) -> Unit raise DiscordHttpError {
  self.client.remove_guild_member(
    self.guild_id,
    self.user_id,
    audit_reason?=reason,
  )
}

///|
/// Add a role to this member.
pub async fn MemberRef::add_role(
  self : MemberRef,
  role_id : @model.RoleId,
  reason? : String,
) -> Unit raise DiscordHttpError {
  self.client.add_member_role(
    self.guild_id,
    self.user_id,
    role_id,
    audit_reason?=reason,
  )
}

///|
/// Remove a role from this member.
pub async fn MemberRef::remove_role(
  self : MemberRef,
  role_id : @model.RoleId,
  reason? : String,
) -> Unit raise DiscordHttpError {
  self.client.remove_member_role(
    self.guild_id,
    self.user_id,
    role_id,
    audit_reason?=reason,
  )
}

///|
/// Set this member's communication timeout, or clear it when `until` is
/// `None`.
pub async fn MemberRef::timeout(
  self : MemberRef,
  until : @model.Timestamp?,
  reason? : String,
) -> @model.GuildMember raise DiscordHttpError {
  self.client.modify_guild_member(
    self.guild_id,
    self.user_id,
    communication_disabled_until?=until,
    clear_communication_disabled_until=until is None,
    audit_reason?=reason,
  )
}

///|
/// Edit this guild member.
pub async fn MemberRef::edit(
  self : MemberRef,
  nick? : String,
  clear_nick? : Bool = false,
  roles? : Array[@model.RoleId],
  mute? : Bool,
  deaf? : Bool,
  channel_id? : @model.ChannelId,
  clear_channel_id? : Bool = false,
  communication_disabled_until? : @model.Timestamp,
  clear_communication_disabled_until? : Bool = false,
  flags? : @model.GuildMemberFlags,
  reason? : String,
) -> @model.GuildMember raise DiscordHttpError {
  self.client.modify_guild_member(
    self.guild_id,
    self.user_id,
    nick?,
    clear_nick~,
    roles?,
    mute?,
    deaf?,
    channel_id?,
    clear_channel_id~,
    communication_disabled_until?,
    clear_communication_disabled_until~,
    flags?,
    audit_reason?=reason,
  )
}

///|
/// Remove this user's ban; the target does not need to be a current member.
pub async fn MemberRef::unban(
  self : MemberRef,
  reason? : String,
) -> Unit raise DiscordHttpError {
  self.client.remove_guild_ban(
    self.guild_id,
    self.user_id,
    audit_reason?=reason,
  )
}

///|
/// Fetch this user's voice state in the guild.
pub async fn MemberRef::voice_state(
  self : MemberRef,
) -> @model.VoiceState raise DiscordHttpError {
  self.client.get_user_voice_state(self.guild_id, self.user_id)
}

///|
/// Edit this user's voice state in the guild.
pub async fn MemberRef::edit_voice_state(
  self : MemberRef,
  channel_id : @model.ChannelId,
  suppress? : Bool,
) -> Unit raise DiscordHttpError {
  self.client.modify_user_voice_state(
    self.guild_id,
    self.user_id,
    channel_id,
    suppress?,
  )
}

///|
/// Fetch this user.
pub async fn UserRef::fetch(
  self : UserRef,
) -> @model.User raise DiscordHttpError {
  self.client.get_user(self.user_id)
}

///|
/// Open or reuse a DM channel with this user and bind it to the client.
pub async fn UserRef::dm(self : UserRef) -> ChannelRef raise DiscordHttpError {
  let channel = self.client.create_dm(self.user_id)
  self.client.channel_ref(channel.id)
}