diff --git a/channel.go b/channel.go index 26ff1fb..5719cd4 100644 --- a/channel.go +++ b/channel.go @@ -1,27 +1,5 @@ package discordgo -// A Channel holds all data related to an individual Discord channel. -type Channel struct { - ID string `json:"id"` - GuildID string `json:"guild_id"` - Name string `json:"name"` - Topic string `json:"topic"` - Position int `json:"position"` - Type string `json:"type"` - PermissionOverwrites []PermissionOverwrite `json:"permission_overwrites"` - IsPrivate bool `json:"is_private"` - LastMessageID string `json:"last_message_id"` - Recipient User `json:"recipient"` -} - -// A PermissionOverwrite holds permission overwrite data for a Channel -type PermissionOverwrite struct { - ID string `json:"id"` - Type string `json:"type"` - Deny int `json:"deny"` - Allow int `json:"allow"` -} - /* func (c *Channel) Messages() (messages []Message) { } diff --git a/guild.go b/guild.go index 0f32373..6ea4c1b 100644 --- a/guild.go +++ b/guild.go @@ -1,66 +1,5 @@ package discordgo -// A Guild holds all data related to a specific Discord Guild. Guilds are also -// sometimes referred to as Servers in the Discord client. -type Guild struct { - ID string `json:"id"` - Name string `json:"name"` - Icon string `json:"icon"` - Region string `json:"region"` - AfkTimeout int `json:"afk_timeout"` - AfkChannelID string `json:"afk_channel_id"` - EmbedChannelID string `json:"embed_channel_id"` - EmbedEnabled bool `json:"embed_enabled"` - OwnerID string `json:"owner_id"` - Large bool `json:"large"` // ?? - JoinedAt string `json:"joined_at"` // make this a timestamp - Roles []Role `json:"roles"` - Members []Member `json:"members"` - Presences []Presence `json:"presences"` - Channels []Channel `json:"channels"` - VoiceStates []VoiceState `json:"voice_states"` -} - -// A Role stores information about Discord guild member roles. -type Role struct { - ID string `json:"id"` - Name string `json:"name"` - Managed bool `json:"managed"` - Color int `json:"color"` - Hoist bool `json:"hoist"` - Position int `json:"position"` - Permissions int `json:"permissions"` -} - -// A VoiceState stores the voice states of Guilds -type VoiceState struct { - UserID string `json:"user_id"` - Suppress bool `json:"suppress"` - SessionID string `json:"session_id"` - SelfMute bool `json:"self_mute"` - SelfDeaf bool `json:"self_deaf"` - Mute bool `json:"mute"` - Deaf bool `json:"deaf"` - ChannelID string `json:"channel_id"` -} - -// A Presence stores the online, offline, or idle and game status of Guild members. -type Presence struct { - User User `json:"user"` - Status string `json:"status"` - GameID int `json:"game_id"` -} - -// A Member stores user information for Guild members. -type Member struct { - GuildID string `json:"guild_id"` - JoinedAt string `json:"joined_at"` - Deaf bool `json:"deaf"` - Mute bool `json:"mute"` - User User `json:"user"` - Roles []string `json:"roles"` -} - /* TODO: How to name these? If we make a variable to store channels from READY packet, etc. We can't have a Channel diff --git a/session.go b/session.go index 6069bd3..53d7ffe 100644 --- a/session.go +++ b/session.go @@ -17,57 +17,3 @@ import ( "github.com/gorilla/websocket" ) - -// A Session represents a connection to the Discord REST API. -// token : The authentication token returned from Discord -// Debug : If set to ture debug logging will be displayed. -type Session struct { - Token string // Authentication token for this session - Debug bool // Debug for printing JSON request/responses - Cache int // number in X to cache some responses - SessionID string // from websocket READY packet - - // Settable Callback functions for Websocket Events - OnEvent func(*Session, Event) // should Event be *Event? - OnReady func(*Session, Ready) - OnTypingStart func(*Session, TypingStart) - OnMessageCreate func(*Session, Message) - OnMessageUpdate func(*Session, Message) - OnMessageDelete func(*Session, MessageDelete) - OnMessageAck func(*Session, MessageAck) - OnPresenceUpdate func(*Session, PresenceUpdate) - OnVoiceStateUpdate func(*Session, VoiceState) - OnChannelCreate func(*Session, Channel) - OnChannelUpdate func(*Session, Channel) - OnChannelDelete func(*Session, Channel) - OnGuildCreate func(*Session, Guild) - OnGuildUpdate func(*Session, Guild) - OnGuildDelete func(*Session, Guild) - OnGuildMemberAdd func(*Session, Member) - OnGuildMemberRemove func(*Session, Member) - OnGuildMemberDelete func(*Session, Member) // which is it? - OnGuildMemberUpdate func(*Session, Member) - OnGuildRoleCreate func(*Session, GuildRole) - OnGuildRoleUpdate func(*Session, GuildRole) - OnGuildRoleDelete func(*Session, GuildRoleDelete) - OnGuildIntegrationsUpdate func(*Session, GuildIntegrationsUpdate) - - wsConn *websocket.Conn - //TODO, add bools for like. - // are we connnected to websocket? - // have we authenticated to login? - // lets put all the general session - // tracking and infos here.. clearly - - // Everything below here is used for Voice testing. - // This stuff is almost guarenteed to change a lot - // and is even a bit hackish right now. - VwsConn *websocket.Conn // new for voice - VSessionID string - VToken string - VEndpoint string - VGuildID string - VChannelID string - Vop2 VoiceOP2 - UDPConn *net.UDPConn -} diff --git a/structs.go b/structs.go index c2b7d44..335fd0a 100644 --- a/structs.go +++ b/structs.go @@ -1,5 +1,11 @@ package discordgo +import ( + "net" + + "golang.org/x/net/websocket" +) + // TODO: Eventually everything here gets moved to a better place. // A Message stores all data related to a specific Discord message. @@ -60,3 +66,255 @@ type Invite struct { XkcdPass bool `json:"xkcdpass"` Channel Channel `json:"channel"` } + +// A Channel holds all data related to an individual Discord channel. +type Channel struct { + ID string `json:"id"` + GuildID string `json:"guild_id"` + Name string `json:"name"` + Topic string `json:"topic"` + Position int `json:"position"` + Type string `json:"type"` + PermissionOverwrites []PermissionOverwrite `json:"permission_overwrites"` + IsPrivate bool `json:"is_private"` + LastMessageID string `json:"last_message_id"` + Recipient User `json:"recipient"` +} + +// A PermissionOverwrite holds permission overwrite data for a Channel +type PermissionOverwrite struct { + ID string `json:"id"` + Type string `json:"type"` + Deny int `json:"deny"` + Allow int `json:"allow"` +} + +// A Guild holds all data related to a specific Discord Guild. Guilds are also +// sometimes referred to as Servers in the Discord client. +type Guild struct { + ID string `json:"id"` + Name string `json:"name"` + Icon string `json:"icon"` + Region string `json:"region"` + AfkTimeout int `json:"afk_timeout"` + AfkChannelID string `json:"afk_channel_id"` + EmbedChannelID string `json:"embed_channel_id"` + EmbedEnabled bool `json:"embed_enabled"` + OwnerID string `json:"owner_id"` + Large bool `json:"large"` // ?? + JoinedAt string `json:"joined_at"` // make this a timestamp + Roles []Role `json:"roles"` + Members []Member `json:"members"` + Presences []Presence `json:"presences"` + Channels []Channel `json:"channels"` + VoiceStates []VoiceState `json:"voice_states"` +} + +// A Role stores information about Discord guild member roles. +type Role struct { + ID string `json:"id"` + Name string `json:"name"` + Managed bool `json:"managed"` + Color int `json:"color"` + Hoist bool `json:"hoist"` + Position int `json:"position"` + Permissions int `json:"permissions"` +} + +// A VoiceState stores the voice states of Guilds +type VoiceState struct { + UserID string `json:"user_id"` + Suppress bool `json:"suppress"` + SessionID string `json:"session_id"` + SelfMute bool `json:"self_mute"` + SelfDeaf bool `json:"self_deaf"` + Mute bool `json:"mute"` + Deaf bool `json:"deaf"` + ChannelID string `json:"channel_id"` +} + +// A Presence stores the online, offline, or idle and game status of Guild members. +type Presence struct { + User User `json:"user"` + Status string `json:"status"` + GameID int `json:"game_id"` +} + +// A Member stores user information for Guild members. +type Member struct { + GuildID string `json:"guild_id"` + JoinedAt string `json:"joined_at"` + Deaf bool `json:"deaf"` + Mute bool `json:"mute"` + User User `json:"user"` + Roles []string `json:"roles"` +} + +// A Session represents a connection to the Discord REST API. +// token : The authentication token returned from Discord +// Debug : If set to ture debug logging will be displayed. +type Session struct { + Token string // Authentication token for this session + Debug bool // Debug for printing JSON request/responses + Cache int // number in X to cache some responses + SessionID string // from websocket READY packet + + // Settable Callback functions for Websocket Events + OnEvent func(*Session, Event) // should Event be *Event? + OnReady func(*Session, Ready) + OnTypingStart func(*Session, TypingStart) + OnMessageCreate func(*Session, Message) + OnMessageUpdate func(*Session, Message) + OnMessageDelete func(*Session, MessageDelete) + OnMessageAck func(*Session, MessageAck) + OnPresenceUpdate func(*Session, PresenceUpdate) + OnVoiceStateUpdate func(*Session, VoiceState) + OnChannelCreate func(*Session, Channel) + OnChannelUpdate func(*Session, Channel) + OnChannelDelete func(*Session, Channel) + OnGuildCreate func(*Session, Guild) + OnGuildUpdate func(*Session, Guild) + OnGuildDelete func(*Session, Guild) + OnGuildMemberAdd func(*Session, Member) + OnGuildMemberRemove func(*Session, Member) + OnGuildMemberDelete func(*Session, Member) // which is it? + OnGuildMemberUpdate func(*Session, Member) + OnGuildRoleCreate func(*Session, GuildRole) + OnGuildRoleUpdate func(*Session, GuildRole) + OnGuildRoleDelete func(*Session, GuildRoleDelete) + OnGuildIntegrationsUpdate func(*Session, GuildIntegrationsUpdate) + + wsConn *websocket.Conn + //TODO, add bools for like. + // are we connnected to websocket? + // have we authenticated to login? + // lets put all the general session + // tracking and infos here.. clearly + + // Everything below here is used for Voice testing. + // This stuff is almost guarenteed to change a lot + // and is even a bit hackish right now. + VwsConn *websocket.Conn // new for voice + VSessionID string + VToken string + VEndpoint string + VGuildID string + VChannelID string + Vop2 VoiceOP2 + UDPConn *net.UDPConn +} + +// A User stores all data for an individual Discord user. +type User struct { + ID string `json:"id"` + Email string `json:"email"` + Username string `json:"username"` + Avatar string `json:"Avatar"` + Verified bool `json:"verified"` + //Discriminator int `json:"discriminator,string"` // TODO: See below +} + +// Discriminator sometimes comes as a string +// and sometimes it comes as a int. Weird. +// to avoid errors I've just commented it out +// but it doesn't seem to just kill the whole +// program. Heartbeat is taken on READY even +// with error and the system continues to read +// it just doesn't seem able to handle this one +// field correctly. Need to research this more. + +// A PrivateChannel stores all data for a specific user private channel. +type PrivateChannel struct { + ID string `json:"id"` + IsPrivate bool `json:"is_private"` + LastMessageID string `json:"last_message_id"` + Recipient User `json:"recipient"` +} // merge with channel? + +// A Settings stores data for a specific users Discord client settings. +type Settings struct { + RenderEmbeds bool `json:"render_embeds"` + InlineEmbedMedia bool `json:"inline_embed_media"` + EnableTtsCommand bool `json:"enable_tts_command"` + MessageDisplayCompact bool `json:"message_display_compact"` + Locale string `json:"locale"` + ShowCurrentGame bool `json:"show_current_game"` + Theme string `json:"theme"` + MutedChannels []string `json:"muted_channels"` +} + +// An Event provides a basic initial struct for all websocket event. +type Event struct { + Type string `json:"t"` + State int `json:"s"` + Operation int `json:"o"` + Direction int `json:"dir"` + RawData json.RawMessage `json:"d"` +} + +// A Ready stores all data for the websocket READY event. +type Ready struct { + Version int `json:"v"` + SessionID string `json:"session_id"` + HeartbeatInterval time.Duration `json:"heartbeat_interval"` + User User `json:"user"` + ReadState []ReadState + PrivateChannels []PrivateChannel + Guilds []Guild +} + +// ReadState might need to move? Gives me the read status +// of all my channels when first connecting. I think :) + +// A ReadState stores data on the read state of channels. +type ReadState struct { + MentionCount int + LastMessageID string `json:"last_message_id"` + ID string `json:"id"` +} + +// A TypingStart stores data for the typing start websocket event. +type TypingStart struct { + UserID string `json:"user_id"` + ChannelID string `json:"channel_id"` + Timestamp int `json:"timestamp"` +} + +// A PresenceUpdate stores data for the pressence update websocket event. +type PresenceUpdate struct { + User User `json:"user"` + Status string `json:"status"` + Roles []string `json:"roles"` + GuildID string `json:"guild_id"` + GameID int `json:"game_id"` +} + +// A MessageAck stores data for the message ack websocket event. +type MessageAck struct { + MessageID string `json:"message_id"` + ChannelID string `json:"channel_id"` +} + +// A MessageDelete stores data for the message delete websocket event. +type MessageDelete struct { + ID string `json:"id"` + ChannelID string `json:"channel_id"` +} // so much like MessageAck.. + +// A GuildIntegrationsUpdate stores data for the guild integrations update +// websocket event. +type GuildIntegrationsUpdate struct { + GuildID string `json:"guild_id"` +} + +// A GuildRole stores data for guild role websocket events. +type GuildRole struct { + Role Role `json:"role"` + GuildID string `json:"guild_id"` +} + +// A GuildRoleDelete stores data for the guild role delete websocket event. +type GuildRoleDelete struct { + RoleID string `json:"role_id"` + GuildID string `json:"guild_id"` +} diff --git a/users.go b/users.go index e04c161..b3dd92c 100644 --- a/users.go +++ b/users.go @@ -1,40 +1 @@ package discordgo - -// A User stores all data for an individual Discord user. -type User struct { - ID string `json:"id"` - Email string `json:"email"` - Username string `json:"username"` - Avatar string `json:"Avatar"` - Verified bool `json:"verified"` - //Discriminator int `json:"discriminator,string"` // TODO: See below -} - -// Discriminator sometimes comes as a string -// and sometimes it comes as a int. Weird. -// to avoid errors I've just commented it out -// but it doesn't seem to just kill the whole -// program. Heartbeat is taken on READY even -// with error and the system continues to read -// it just doesn't seem able to handle this one -// field correctly. Need to research this more. - -// A PrivateChannel stores all data for a specific user private channel. -type PrivateChannel struct { - ID string `json:"id"` - IsPrivate bool `json:"is_private"` - LastMessageID string `json:"last_message_id"` - Recipient User `json:"recipient"` -} // merge with channel? - -// A Settings stores data for a specific users Discord client settings. -type Settings struct { - RenderEmbeds bool `json:"render_embeds"` - InlineEmbedMedia bool `json:"inline_embed_media"` - EnableTtsCommand bool `json:"enable_tts_command"` - MessageDisplayCompact bool `json:"message_display_compact"` - Locale string `json:"locale"` - ShowCurrentGame bool `json:"show_current_game"` - Theme string `json:"theme"` - MutedChannels []string `json:"muted_channels"` -} diff --git a/wsapi.go b/wsapi.go index 1b7ce46..3fe79ee 100644 --- a/wsapi.go +++ b/wsapi.go @@ -17,82 +17,6 @@ import ( "github.com/gorilla/websocket" ) -// An Event provides a basic initial struct for all websocket event. -type Event struct { - Type string `json:"t"` - State int `json:"s"` - Operation int `json:"o"` - Direction int `json:"dir"` - RawData json.RawMessage `json:"d"` -} - -// A Ready stores all data for the websocket READY event. -type Ready struct { - Version int `json:"v"` - SessionID string `json:"session_id"` - HeartbeatInterval time.Duration `json:"heartbeat_interval"` - User User `json:"user"` - ReadState []ReadState - PrivateChannels []PrivateChannel - Guilds []Guild -} - -// ReadState might need to move? Gives me the read status -// of all my channels when first connecting. I think :) - -// A ReadState stores data on the read state of channels. -type ReadState struct { - MentionCount int - LastMessageID string `json:"last_message_id"` - ID string `json:"id"` -} - -// A TypingStart stores data for the typing start websocket event. -type TypingStart struct { - UserID string `json:"user_id"` - ChannelID string `json:"channel_id"` - Timestamp int `json:"timestamp"` -} - -// A PresenceUpdate stores data for the pressence update websocket event. -type PresenceUpdate struct { - User User `json:"user"` - Status string `json:"status"` - Roles []string `json:"roles"` - GuildID string `json:"guild_id"` - GameID int `json:"game_id"` -} - -// A MessageAck stores data for the message ack websocket event. -type MessageAck struct { - MessageID string `json:"message_id"` - ChannelID string `json:"channel_id"` -} - -// A MessageDelete stores data for the message delete websocket event. -type MessageDelete struct { - ID string `json:"id"` - ChannelID string `json:"channel_id"` -} // so much like MessageAck.. - -// A GuildIntegrationsUpdate stores data for the guild integrations update -// websocket event. -type GuildIntegrationsUpdate struct { - GuildID string `json:"guild_id"` -} - -// A GuildRole stores data for guild role websocket events. -type GuildRole struct { - Role Role `json:"role"` - GuildID string `json:"guild_id"` -} - -// A GuildRoleDelete stores data for the guild role delete websocket event. -type GuildRoleDelete struct { - RoleID string `json:"role_id"` - GuildID string `json:"guild_id"` -} - // Open opens a websocket connection to Discord. func (s *Session) Open() (err error) {