///|
/// Whether a guild widget is enabled and the channel it links to.
pub(all) struct GuildWidgetSettings {
  enabled : Bool
  channel_id : Nullable[ChannelId]
} derive(ToJson, FromJson, Debug)

///|
/// The public JSON representation of a guild widget.
pub(all) struct GuildWidget {
  id : GuildId
  name : String
  instant_invite : Nullable[String]
  channels : Array[GuildWidgetChannel]
  members : Array[GuildWidgetMember]
  presence_count : Int
} derive(ToJson, FromJson, Debug)

///|
/// A voice channel shown in a public guild widget.
pub(all) struct GuildWidgetChannel {
  id : ChannelId
  name : String
  position : Int
} derive(ToJson, FromJson, Debug)

///|
/// An anonymized member shown in a public guild widget. Widget member IDs are
/// opaque strings rather than Discord snowflakes.
pub(all) struct GuildWidgetMember {
  id : String
  username : String
  discriminator : String
  avatar : Nullable[String]
  status : String
  avatar_url : String
} derive(ToJson, FromJson, Debug)