62 lines
1.4 KiB
Go
62 lines
1.4 KiB
Go
package discord
|
|
|
|
import (
|
|
"net/http"
|
|
"sync"
|
|
"time"
|
|
|
|
"git.haelnorr.com/h/golib/hlog"
|
|
"github.com/bwmarrin/discordgo"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
type OAuthSession struct {
|
|
*discordgo.Session
|
|
}
|
|
|
|
func NewOAuthSession(token *Token) (*OAuthSession, error) {
|
|
session, err := discordgo.New("Bearer " + token.AccessToken)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "discordgo.New")
|
|
}
|
|
return &OAuthSession{Session: session}, nil
|
|
}
|
|
|
|
func (s *OAuthSession) GetUser() (*discordgo.User, error) {
|
|
user, err := s.User("@me")
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "s.User")
|
|
}
|
|
return user, nil
|
|
}
|
|
|
|
// APIClient is an HTTP client wrapper that handles Discord API rate limits
|
|
type APIClient struct {
|
|
cfg *Config
|
|
client *http.Client
|
|
logger *hlog.Logger
|
|
mu sync.RWMutex
|
|
buckets map[string]*RateLimitState
|
|
trustedHost string
|
|
}
|
|
|
|
// NewAPIClient creates a new Discord API client with rate limit handling
|
|
func NewAPIClient(cfg *Config, logger *hlog.Logger, trustedhost string) (*APIClient, error) {
|
|
if cfg == nil {
|
|
return nil, errors.New("config cannot be nil")
|
|
}
|
|
if logger == nil {
|
|
return nil, errors.New("logger cannot be nil")
|
|
}
|
|
if trustedhost == "" {
|
|
return nil, errors.New("trustedhost cannot be empty")
|
|
}
|
|
return &APIClient{
|
|
client: &http.Client{Timeout: 30 * time.Second},
|
|
logger: logger,
|
|
buckets: make(map[string]*RateLimitState),
|
|
cfg: cfg,
|
|
trustedHost: trustedhost,
|
|
}, nil
|
|
}
|