diff options
Diffstat (limited to 'vendor/github.com/bwmarrin/discordgo/discord.go')
-rw-r--r-- | vendor/github.com/bwmarrin/discordgo/discord.go | 144 |
1 files changed, 6 insertions, 138 deletions
diff --git a/vendor/github.com/bwmarrin/discordgo/discord.go b/vendor/github.com/bwmarrin/discordgo/discord.go index d1cfddf5..4081c65a 100644 --- a/vendor/github.com/bwmarrin/discordgo/discord.go +++ b/vendor/github.com/bwmarrin/discordgo/discord.go @@ -13,13 +13,10 @@ // Package discordgo provides Discord binding for Go package discordgo -import ( - "fmt" - "reflect" -) +import "fmt" // VERSION of Discordgo, follows Symantic Versioning. (http://semver.org/) -const VERSION = "0.13.0" +const VERSION = "0.15.0" // New creates a new Discord session and will automate some startup // tasks if given enough information to do so. Currently you can pass zero @@ -27,6 +24,8 @@ const VERSION = "0.13.0" // There are 3 ways to call New: // With a single auth token - All requests will use the token blindly, // no verification of the token will be done and requests may fail. +// IF THE TOKEN IS FOR A BOT, IT MUST BE PREFIXED WITH `BOT ` +// eg: `"Bot <token>"` // With an email and password - Discord will sign in with the provided // credentials. // With an email, password and auth token - Discord will verify the auth @@ -37,11 +36,13 @@ func New(args ...interface{}) (s *Session, err error) { // Create an empty Session interface. s = &Session{ State: NewState(), + ratelimiter: NewRatelimiter(), StateEnabled: true, Compress: true, ShouldReconnectOnError: true, ShardID: 0, ShardCount: 1, + MaxRestRetries: 3, } // If no arguments are passed return the empty Session interface. @@ -122,136 +123,3 @@ func New(args ...interface{}) (s *Session, err error) { return } - -// validateHandler takes an event handler func, and returns the type of event. -// eg. -// Session.validateHandler(func (s *discordgo.Session, m *discordgo.MessageCreate)) -// will return the reflect.Type of *discordgo.MessageCreate -func (s *Session) validateHandler(handler interface{}) reflect.Type { - - handlerType := reflect.TypeOf(handler) - - if handlerType.NumIn() != 2 { - panic("Unable to add event handler, handler must be of the type func(*discordgo.Session, *discordgo.EventType).") - } - - if handlerType.In(0) != reflect.TypeOf(s) { - panic("Unable to add event handler, first argument must be of type *discordgo.Session.") - } - - eventType := handlerType.In(1) - - // Support handlers of type interface{}, this is a special handler, which is triggered on every event. - if eventType.Kind() == reflect.Interface { - eventType = nil - } - - return eventType -} - -// AddHandler allows you to add an event handler that will be fired anytime -// the Discord WSAPI event that matches the interface fires. -// eventToInterface in events.go has a list of all the Discord WSAPI events -// and their respective interface. -// eg: -// Session.AddHandler(func(s *discordgo.Session, m *discordgo.MessageCreate) { -// }) -// -// or: -// Session.AddHandler(func(s *discordgo.Session, m *discordgo.PresenceUpdate) { -// }) -// The return value of this method is a function, that when called will remove the -// event handler. -func (s *Session) AddHandler(handler interface{}) func() { - - s.initialize() - - eventType := s.validateHandler(handler) - - s.handlersMu.Lock() - defer s.handlersMu.Unlock() - - h := reflect.ValueOf(handler) - - s.handlers[eventType] = append(s.handlers[eventType], h) - - // This must be done as we need a consistent reference to the - // reflected value, otherwise a RemoveHandler method would have - // been nice. - return func() { - s.handlersMu.Lock() - defer s.handlersMu.Unlock() - - handlers := s.handlers[eventType] - for i, v := range handlers { - if h == v { - s.handlers[eventType] = append(handlers[:i], handlers[i+1:]...) - return - } - } - } -} - -// handle calls any handlers that match the event type and any handlers of -// interface{}. -func (s *Session) handle(event interface{}) { - - s.handlersMu.RLock() - defer s.handlersMu.RUnlock() - - if s.handlers == nil { - return - } - - handlerParameters := []reflect.Value{reflect.ValueOf(s), reflect.ValueOf(event)} - - if handlers, ok := s.handlers[nil]; ok { - for _, handler := range handlers { - go handler.Call(handlerParameters) - } - } - - if handlers, ok := s.handlers[reflect.TypeOf(event)]; ok { - for _, handler := range handlers { - go handler.Call(handlerParameters) - } - } -} - -// initialize adds all internal handlers and state tracking handlers. -func (s *Session) initialize() { - - s.log(LogInformational, "called") - - s.handlersMu.Lock() - if s.handlers != nil { - s.handlersMu.Unlock() - return - } - - s.handlers = map[interface{}][]reflect.Value{} - s.handlersMu.Unlock() - - s.AddHandler(s.onReady) - s.AddHandler(s.onResumed) - s.AddHandler(s.onVoiceServerUpdate) - s.AddHandler(s.onVoiceStateUpdate) - s.AddHandler(s.State.onInterface) -} - -// onReady handles the ready event. -func (s *Session) onReady(se *Session, r *Ready) { - - // Store the SessionID within the Session struct. - s.sessionID = r.SessionID - - // Start the heartbeat to keep the connection alive. - go s.heartbeat(s.wsConn, s.listening, r.HeartbeatInterval) -} - -// onResumed handles the resumed event. -func (s *Session) onResumed(se *Session, r *Resumed) { - - // Start the heartbeat to keep the connection alive. - go s.heartbeat(s.wsConn, s.listening, r.HeartbeatInterval) -} |