Merge branch 'develop' of https://github.com/bwmarrin/discordgo into develop
This commit is contained in:
commit
10be6053b9
10 changed files with 57 additions and 21 deletions
|
@ -137,6 +137,7 @@ var (
|
|||
EndpointIntegrationsJoin = func(iID string) string { return EndpointAPI + "integrations/" + iID + "/join" }
|
||||
|
||||
EndpointEmoji = func(eID string) string { return EndpointAPI + "emojis/" + eID + ".png" }
|
||||
EndpointEmojiAnimated = func(eID string) string { return EndpointAPI + "emojis/" + eID + ".gif" }
|
||||
|
||||
EndpointOauth2 = EndpointAPI + "oauth2/"
|
||||
EndpointApplications = EndpointOauth2 + "applications"
|
||||
|
|
|
@ -50,6 +50,7 @@ const (
|
|||
userUpdateEventType = "USER_UPDATE"
|
||||
voiceServerUpdateEventType = "VOICE_SERVER_UPDATE"
|
||||
voiceStateUpdateEventType = "VOICE_STATE_UPDATE"
|
||||
webhooksUpdateEventType = "WEBHOOKS_UPDATE"
|
||||
)
|
||||
|
||||
// channelCreateEventHandler is an event handler for ChannelCreate events.
|
||||
|
@ -892,6 +893,26 @@ func (eh voiceStateUpdateEventHandler) Handle(s *Session, i interface{}) {
|
|||
}
|
||||
}
|
||||
|
||||
// webhooksUpdateEventHandler is an event handler for WebhooksUpdate events.
|
||||
type webhooksUpdateEventHandler func(*Session, *WebhooksUpdate)
|
||||
|
||||
// Type returns the event type for WebhooksUpdate events.
|
||||
func (eh webhooksUpdateEventHandler) Type() string {
|
||||
return webhooksUpdateEventType
|
||||
}
|
||||
|
||||
// New returns a new instance of WebhooksUpdate.
|
||||
func (eh webhooksUpdateEventHandler) New() interface{} {
|
||||
return &WebhooksUpdate{}
|
||||
}
|
||||
|
||||
// Handle is the handler for WebhooksUpdate events.
|
||||
func (eh webhooksUpdateEventHandler) Handle(s *Session, i interface{}) {
|
||||
if t, ok := i.(*WebhooksUpdate); ok {
|
||||
eh(s, t)
|
||||
}
|
||||
}
|
||||
|
||||
func handlerForInterface(handler interface{}) EventHandler {
|
||||
switch v := handler.(type) {
|
||||
case func(*Session, interface{}):
|
||||
|
@ -982,6 +1003,8 @@ func handlerForInterface(handler interface{}) EventHandler {
|
|||
return voiceServerUpdateEventHandler(v)
|
||||
case func(*Session, *VoiceStateUpdate):
|
||||
return voiceStateUpdateEventHandler(v)
|
||||
case func(*Session, *WebhooksUpdate):
|
||||
return webhooksUpdateEventHandler(v)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
@ -1027,4 +1050,5 @@ func init() {
|
|||
registerInterfaceProvider(userUpdateEventHandler(nil))
|
||||
registerInterfaceProvider(voiceServerUpdateEventHandler(nil))
|
||||
registerInterfaceProvider(voiceStateUpdateEventHandler(nil))
|
||||
registerInterfaceProvider(webhooksUpdateEventHandler(nil))
|
||||
}
|
||||
|
|
|
@ -254,3 +254,9 @@ type MessageDeleteBulk struct {
|
|||
ChannelID string `json:"channel_id"`
|
||||
GuildID string `json:"guild_id"`
|
||||
}
|
||||
|
||||
// WebhooksUpdate is the data for a WebhooksUpdate event
|
||||
type WebhooksUpdate struct {
|
||||
GuildID string `json:"guild_id"`
|
||||
ChannelID string `json:"channel_id"`
|
||||
}
|
||||
|
|
|
@ -12,7 +12,6 @@ func TestContentWithMoreMentionsReplaced(t *testing.T) {
|
|||
Username: "User Name",
|
||||
}
|
||||
|
||||
s.StateEnabled = true
|
||||
s.State.GuildAdd(&Guild{ID: "guild"})
|
||||
s.State.RoleAdd("guild", &Role{
|
||||
ID: "role",
|
||||
|
|
14
restapi.go
14
restapi.go
|
@ -90,7 +90,7 @@ func (s *Session) RequestWithLockedBucket(method, urlStr, contentType string, b
|
|||
|
||||
req.Header.Set("Content-Type", contentType)
|
||||
// TODO: Make a configurable static variable.
|
||||
req.Header.Set("User-Agent", fmt.Sprintf("DiscordBot (https://github.com/bwmarrin/discordgo, v%s)", VERSION))
|
||||
req.Header.Set("User-Agent", "DiscordBot (https://github.com/bwmarrin/discordgo, v"+VERSION+")")
|
||||
|
||||
if s.Debug {
|
||||
for k, v := range req.Header {
|
||||
|
@ -250,7 +250,7 @@ func (s *Session) Register(username string) (token string, err error) {
|
|||
// even use.
|
||||
func (s *Session) Logout() (err error) {
|
||||
|
||||
// _, err = s.Request("POST", LOGOUT, fmt.Sprintf(`{"token": "%s"}`, s.Token))
|
||||
// _, err = s.Request("POST", LOGOUT, `{"token": "` + s.Token + `"}`)
|
||||
|
||||
if s.Token == "" {
|
||||
return
|
||||
|
@ -428,7 +428,7 @@ func (s *Session) UserGuilds(limit int, beforeID, afterID string) (st []*UserGui
|
|||
uri := EndpointUserGuilds("@me")
|
||||
|
||||
if len(v) > 0 {
|
||||
uri = fmt.Sprintf("%s?%s", uri, v.Encode())
|
||||
uri += "?" + v.Encode()
|
||||
}
|
||||
|
||||
body, err := s.RequestWithBucketID("GET", uri, nil, EndpointUserGuilds(""))
|
||||
|
@ -743,7 +743,7 @@ func (s *Session) GuildMembers(guildID string, after string, limit int) (st []*M
|
|||
}
|
||||
|
||||
if len(v) > 0 {
|
||||
uri = fmt.Sprintf("%s?%s", uri, v.Encode())
|
||||
uri += "?" + v.Encode()
|
||||
}
|
||||
|
||||
body, err := s.RequestWithBucketID("GET", uri, nil, EndpointGuildMembers(guildID))
|
||||
|
@ -1065,7 +1065,7 @@ func (s *Session) GuildPruneCount(guildID string, days uint32) (count uint32, er
|
|||
Pruned uint32 `json:"pruned"`
|
||||
}{}
|
||||
|
||||
uri := EndpointGuildPrune(guildID) + fmt.Sprintf("?days=%d", days)
|
||||
uri := EndpointGuildPrune(guildID) + "?days=" + strconv.FormatUint(uint64(days), 10)
|
||||
body, err := s.RequestWithBucketID("GET", uri, nil, EndpointGuildPrune(guildID))
|
||||
if err != nil {
|
||||
return
|
||||
|
@ -1423,7 +1423,7 @@ func (s *Session) ChannelMessages(channelID string, limit int, beforeID, afterID
|
|||
v.Set("around", aroundID)
|
||||
}
|
||||
if len(v) > 0 {
|
||||
uri = fmt.Sprintf("%s?%s", uri, v.Encode())
|
||||
uri += "?" + v.Encode()
|
||||
}
|
||||
|
||||
body, err := s.RequestWithBucketID("GET", uri, nil, EndpointChannelMessages(channelID))
|
||||
|
@ -2103,7 +2103,7 @@ func (s *Session) MessageReactions(channelID, messageID, emojiID string, limit i
|
|||
}
|
||||
|
||||
if len(v) > 0 {
|
||||
uri = fmt.Sprintf("%s?%s", uri, v.Encode())
|
||||
uri += "?" + v.Encode()
|
||||
}
|
||||
|
||||
body, err := s.RequestWithBucketID("GET", uri, nil, EndpointMessageReaction(channelID, "", "", ""))
|
||||
|
|
|
@ -597,7 +597,7 @@ type Member struct {
|
|||
GuildID string `json:"guild_id"`
|
||||
|
||||
// The time at which the member joined the guild, in ISO8601.
|
||||
JoinedAt string `json:"joined_at"`
|
||||
JoinedAt Timestamp `json:"joined_at"`
|
||||
|
||||
// The nickname of the member, if they have one.
|
||||
Nick string `json:"nick"`
|
||||
|
@ -615,6 +615,11 @@ type Member struct {
|
|||
Roles []string `json:"roles"`
|
||||
}
|
||||
|
||||
// Mention creates a member mention
|
||||
func (m *Member) Mention() string {
|
||||
return "<@!" + m.User.ID + ">"
|
||||
}
|
||||
|
||||
// A Settings stores data for a specific users Discord client settings.
|
||||
type Settings struct {
|
||||
RenderEmbeds bool `json:"render_embeds"`
|
||||
|
@ -929,6 +934,7 @@ const (
|
|||
ErrCodeUnknownToken = 10012
|
||||
ErrCodeUnknownUser = 10013
|
||||
ErrCodeUnknownEmoji = 10014
|
||||
ErrCodeUnknownWebhook = 10015
|
||||
|
||||
ErrCodeBotsCannotUseEndpoint = 20001
|
||||
ErrCodeOnlyBotsCanUseEndpoint = 20002
|
||||
|
|
3
types.go
3
types.go
|
@ -11,7 +11,6 @@ package discordgo
|
|||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"time"
|
||||
)
|
||||
|
@ -54,5 +53,5 @@ func newRestError(req *http.Request, resp *http.Response, body []byte) *RESTErro
|
|||
}
|
||||
|
||||
func (r RESTError) Error() string {
|
||||
return fmt.Sprintf("HTTP %s, %s", r.Response.Status, r.ResponseBody)
|
||||
return "HTTP " + r.Response.Status + ", " + string(r.ResponseBody)
|
||||
}
|
||||
|
|
9
user.go
9
user.go
|
@ -1,9 +1,6 @@
|
|||
package discordgo
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
import "strings"
|
||||
|
||||
// A User stores all data for an individual Discord user.
|
||||
type User struct {
|
||||
|
@ -43,12 +40,12 @@ type User struct {
|
|||
|
||||
// String returns a unique identifier of the form username#discriminator
|
||||
func (u *User) String() string {
|
||||
return fmt.Sprintf("%s#%s", u.Username, u.Discriminator)
|
||||
return u.Username + "#" + u.Discriminator
|
||||
}
|
||||
|
||||
// Mention return a string which mentions the user
|
||||
func (u *User) Mention() string {
|
||||
return fmt.Sprintf("<@%s>", u.ID)
|
||||
return "<@" + u.ID + ">"
|
||||
}
|
||||
|
||||
// AvatarURL returns a URL to the user's avatar.
|
||||
|
|
6
voice.go
6
voice.go
|
@ -14,6 +14,7 @@ import (
|
|||
"encoding/json"
|
||||
"fmt"
|
||||
"net"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
@ -135,7 +136,6 @@ func (v *VoiceConnection) ChangeChannel(channelID string, mute, deaf bool) (err
|
|||
|
||||
// Disconnect disconnects from this voice channel and closes the websocket
|
||||
// and udp connections to Discord.
|
||||
// !!! NOTE !!! this function may be removed in favour of ChannelVoiceLeave
|
||||
func (v *VoiceConnection) Disconnect() (err error) {
|
||||
|
||||
// Send a OP4 with a nil channel to disconnect
|
||||
|
@ -299,7 +299,7 @@ func (v *VoiceConnection) open() (err error) {
|
|||
}
|
||||
|
||||
// Connect to VoiceConnection Websocket
|
||||
vg := fmt.Sprintf("wss://%s", strings.TrimSuffix(v.endpoint, ":80"))
|
||||
vg := "wss://" + strings.TrimSuffix(v.endpoint, ":80")
|
||||
v.log(LogInformational, "connecting to voice endpoint %s", vg)
|
||||
v.wsConn, _, err = websocket.DefaultDialer.Dial(vg, nil)
|
||||
if err != nil {
|
||||
|
@ -542,7 +542,7 @@ func (v *VoiceConnection) udpOpen() (err error) {
|
|||
return fmt.Errorf("empty endpoint")
|
||||
}
|
||||
|
||||
host := fmt.Sprintf("%s:%d", strings.TrimSuffix(v.endpoint, ":80"), v.op2.Port)
|
||||
host := strings.TrimSuffix(v.endpoint, ":80") + ":" + strconv.Itoa(v.op2.Port)
|
||||
addr, err := net.ResolveUDPAddr("udp", host)
|
||||
if err != nil {
|
||||
v.log(LogWarning, "error resolving udp host %s, %s", host, err)
|
||||
|
|
4
wsapi.go
4
wsapi.go
|
@ -86,6 +86,10 @@ func (s *Session) Open() error {
|
|||
return err
|
||||
}
|
||||
|
||||
s.wsConn.SetCloseHandler(func(code int, text string) error {
|
||||
return nil
|
||||
})
|
||||
|
||||
defer func() {
|
||||
// because of this, all code below must set err to the error
|
||||
// when exiting with an error :) Maybe someone has a better
|
||||
|
|
Loading…
Reference in a new issue