From 24e7f04e0e77a474e3781bb83e63363f987137eb Mon Sep 17 00:00:00 2001 From: Chris Rhodes Date: Fri, 22 Apr 2016 11:34:04 -0700 Subject: [PATCH] Add support for GuildEmbed and GuildIntegration endpoints. --- endpoints.go | 32 ++++++++++--------- message.go | 30 +++++++++--------- restapi.go | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++ structs.go | 27 ++++++++++++++++ 4 files changed, 148 insertions(+), 30 deletions(-) diff --git a/endpoints.go b/endpoints.go index 00d71bc..f97c03f 100644 --- a/endpoints.go +++ b/endpoints.go @@ -55,21 +55,23 @@ var ( USER_DEVICES = func(uID string) string { return USERS + uID + "/devices" } USER_CONNECTIONS = func(uID string) string { return USERS + uID + "/connections" } - GUILD = func(gID string) string { return GUILDS + gID } - GUILD_INIVTES = func(gID string) string { return GUILDS + gID + "/invites" } - GUILD_CHANNELS = func(gID string) string { return GUILDS + gID + "/channels" } - GUILD_MEMBERS = func(gID string) string { return GUILDS + gID + "/members" } - GUILD_MEMBER = func(gID, uID string) string { return GUILDS + gID + "/members/" + uID } - GUILD_BANS = func(gID string) string { return GUILDS + gID + "/bans" } - GUILD_BAN = func(gID, uID string) string { return GUILDS + gID + "/bans/" + uID } - GUILD_INTEGRATIONS = func(gID string) string { return GUILDS + gID + "/integrations" } - GUILD_ROLES = func(gID string) string { return GUILDS + gID + "/roles" } - GUILD_ROLE = func(gID, rID string) string { return GUILDS + gID + "/roles/" + rID } - GUILD_INVITES = func(gID string) string { return GUILDS + gID + "/invites" } - GUILD_EMBED = func(gID string) string { return GUILDS + gID + "/embed" } - GUILD_PRUNE = func(gID string) string { return GUILDS + gID + "/prune" } - GUILD_ICON = func(gID, hash string) string { return GUILDS + gID + "/icons/" + hash + ".jpg" } - GUILD_SPLASH = func(gID, hash string) string { return GUILDS + gID + "/splashes/" + hash + ".jpg" } + GUILD = func(gID string) string { return GUILDS + gID } + GUILD_INIVTES = func(gID string) string { return GUILDS + gID + "/invites" } + GUILD_CHANNELS = func(gID string) string { return GUILDS + gID + "/channels" } + GUILD_MEMBERS = func(gID string) string { return GUILDS + gID + "/members" } + GUILD_MEMBER = func(gID, uID string) string { return GUILDS + gID + "/members/" + uID } + GUILD_BANS = func(gID string) string { return GUILDS + gID + "/bans" } + GUILD_BAN = func(gID, uID string) string { return GUILDS + gID + "/bans/" + uID } + GUILD_INTEGRATIONS = func(gID string) string { return GUILDS + gID + "/integrations" } + GUILD_INTEGRATION = func(gID, iID string) string { return GUILDS + gID + "/integrations/" + iID } + GUILD_INTEGRATION_SYNC = func(gID, iID string) string { return GUILDS + gID + "/integrations/" + iID + "/sync" } + GUILD_ROLES = func(gID string) string { return GUILDS + gID + "/roles" } + GUILD_ROLE = func(gID, rID string) string { return GUILDS + gID + "/roles/" + rID } + GUILD_INVITES = func(gID string) string { return GUILDS + gID + "/invites" } + GUILD_EMBED = func(gID string) string { return GUILDS + gID + "/embed" } + GUILD_PRUNE = func(gID string) string { return GUILDS + gID + "/prune" } + GUILD_ICON = func(gID, hash string) string { return GUILDS + gID + "/icons/" + hash + ".jpg" } + GUILD_SPLASH = func(gID, hash string) string { return GUILDS + gID + "/splashes/" + hash + ".jpg" } CHANNEL = func(cID string) string { return CHANNELS + cID } CHANNEL_PERMISSIONS = func(cID string) string { return CHANNELS + cID + "/permissions" } diff --git a/message.go b/message.go index 60773bb..1790627 100644 --- a/message.go +++ b/message.go @@ -16,21 +16,21 @@ import ( // A Message stores all data related to a specific Discord message. type Message struct { - ID string `json:"id"` - ChannelID string `json:"channel_id"` - Content string `json:"content"` - Timestamp string `json:"timestamp"` - EditedTimestamp string `json:"edited_timestamp"` - Tts bool `json:"tts"` - MentionEveryone bool `json:"mention_everyone"` - Author *User `json:"author"` - Attachments []*Attachment `json:"attachments"` - Embeds []*Embed `json:"embeds"` - Mentions []*User `json:"mentions"` + ID string `json:"id"` + ChannelID string `json:"channel_id"` + Content string `json:"content"` + Timestamp string `json:"timestamp"` + EditedTimestamp string `json:"edited_timestamp"` + Tts bool `json:"tts"` + MentionEveryone bool `json:"mention_everyone"` + Author *User `json:"author"` + Attachments []*MessageAttachment `json:"attachments"` + Embeds []*MessageEmbed `json:"embeds"` + Mentions []*User `json:"mentions"` } -// An Attachment stores data for message attachments. -type Attachment struct { +// A MessageAttachment stores data for message attachments. +type MessageAttachment struct { ID string `json:"id"` URL string `json:"url"` ProxyURL string `json:"proxy_url"` @@ -40,8 +40,8 @@ type Attachment struct { Size int `json:"size"` } -// An Embed stores data for message embeds. -type Embed struct { +// An MessageEmbed stores data for message embeds. +type MessageEmbed struct { URL string `json:"url"` Type string `json:"type"` Title string `json:"title"` diff --git a/restapi.go b/restapi.go index 3209cdd..8f8a656 100644 --- a/restapi.go +++ b/restapi.go @@ -761,6 +761,72 @@ func (s *Session) GuildRoleDelete(guildID, roleID string) (err error) { return } +// GuildIntegrations returns an array of Integrations for a guild. +// guildID : The ID of a Guild. +func (s *Session) GuildIntegrations(guildID string) (st []*GuildIntegration, err error) { + + body, err := s.Request("GET", GUILD_INTEGRATIONS(guildID), nil) + if err != nil { + return + } + + err = unmarshal(body, &st) + + return +} + +// GuildIntegrationCreate creates a Guild Integration. +// guildID : The ID of a Guild. +// integrationType : The Integration type. +// integrationID : The ID of an integration. +func (s *Session) GuildIntegrationCreate(guildID, integrationType, integrationID string) (err error) { + + data := struct { + Type string `json:"type"` + Id string `json:"id"` + }{integrationType, integrationID} + + _, err = s.Request("POST", GUILD_INTEGRATIONS(guildID), data) + return +} + +// GuildIntegrationEdit edits a Guild Integration. +// guildID : The ID of a Guild. +// integrationType : The Integration type. +// integrationID : The ID of an integration. +// expireBehavior : The behavior when an integration subscription lapses (see the integration object documentation). +// expireGracePeriod : Period (in seconds) where the integration will ignore lapsed subscriptions. +// enableEmoticons : Whether emoticons should be synced for this integration (twitch only currently). +func (s *Session) GuildIntegrationEdit(guildID, integrationID string, expireBehavior, expireGracePeriod int, enableEmoticons bool) (err error) { + + data := struct { + ExpireBehavior int `json:"expire_behavior"` + ExpireGracePeriod int `json:"expire_grace_period"` + EnableEmoticons bool `json:"enable_emoticons"` + }{expireBehavior, expireGracePeriod, enableEmoticons} + + _, err = s.Request("PATCH", GUILD_INTEGRATION(guildID, integrationID), data) + return +} + +// GuildIntegrationDelete removes the given integration from the Guild. +// guildID : The ID of a Guild. +// integrationID : The ID of an integration. +func (s *Session) GuildIntegrationDelete(guildID, integrationID string) (err error) { + + _, err = s.Request("DELETE", GUILD_INTEGRATION(guildID, integrationID), nil) + return +} + +// GuildIntegrationSync syncs an integration. +// guildID : The ID of a Guild. +// integrationID : The ID of an integration. +func (s *Session) GuildIntegrationSync(guildID, integrationID string) (err error) { + + _, err = s.Request("POST", GUILD_INTEGRATION_SYNC(guildID, integrationID), nil) + return +} + // GuildIcon returns an image.Image of a guild icon. // guildID : The ID of a Guild. func (s *Session) GuildIcon(guildID string) (img image.Image, err error) { @@ -805,6 +871,29 @@ func (s *Session) GuildSplash(guildID string) (img image.Image, err error) { return } +// GuildEmbed returns the embed for a Guild. +// guildID : The ID of a Guild. +func (s *Session) GuildEmbed(guildID string) (st *GuildEmbed, err error) { + + body, err := s.Request("GET", GUILD_EMBED(guildID), nil) + if err != nil { + return + } + + err = unmarshal(body, &st) + return +} + +// GuildEmbedEdit returns the embed for a Guild. +// guildID : The ID of a Guild. +func (s *Session) GuildEmbedEdit(guildID string, enabled bool, channelID string) (err error) { + + data := GuildEmbed{enabled, channelID} + + _, err = s.Request("PATCH", GUILD_EMBED(guildID), data) + return +} + // ------------------------------------------------------------------------------------------------ // Functions specific to Discord Channels // ------------------------------------------------------------------------------------------------ diff --git a/structs.go b/structs.go index 7ca71a6..322ad11 100644 --- a/structs.go +++ b/structs.go @@ -345,6 +345,33 @@ type GuildEmojisUpdate struct { Emojis []*Emoji `json:"emojis"` } +// A GuildIntegration stores data for a guild integration. +type GuildIntegration struct { + ID string `json:"id"` + Name string `json:"name"` + Type string `json:"type"` + Enabled bool `json:"enabled"` + Syncing bool `json:"syncing"` + RoleID string `json:"role_id"` + ExpireBehavior int `json:"expire_behavior"` + ExpireGracePeriod int `json:"expire_grace_period"` + User *User `json:"user"` + Account *GuildIntegrationAccount `json:"account"` + SyncedAt int `json:"synced_at"` +} + +// A GuildIntegrationAccount stores data for a guild integration account. +type GuildIntegrationAccount struct { + ID string `json:"id"` + Name string `json:"name"` +} + +// A GuildEmbed stores data for a guild embed. +type GuildEmbed struct { + Enabled bool `json:"enabled"` + ChannelID string `json:"channel_id"` +} + // A UserGuildSettingsChannelOverride stores data for a channel override for a users guild settings. type UserGuildSettingsChannelOverride struct { Muted bool `json:"muted"`