package discord import ( "bytes" "encoding/json" "errors" "fmt" "net/http" "github.com/gorilla/websocket" ) const DISCORD_URl = "https://discord.com/api/v9/" const USER_AGENT = "DiscordBot (https://jinx.rnrd.eu/, v0.0.0) Jinx" type Discord struct { Token string } func NewClient(token string) *Discord { return &Discord{ Token: token, } } func (d *Discord) Connect() error { gatewayURL, err := d.gateway() if err != nil { return err } fmt.Printf("Gateway: %s\n", gatewayURL) connectHeader := http.Header{} conn, _, err := websocket.DefaultDialer.Dial(gatewayURL, connectHeader) if err != nil { return err } defer conn.Close() messageType, message, err := conn.ReadMessage() if err != nil { return err } fmt.Printf("Type: %d, Message: %s\n", messageType, message) return nil } func (d *Discord) gateway() (string, error) { url := DISCORD_URl + "gateway" req, err := http.NewRequest("GET", url, nil) if err != nil { return "", err } req.Header.Set("Authorization", d.Token) req.Header.Set("Content-Type", "application/json") req.Header.Set("User-Agent", USER_AGENT) resp, err := http.DefaultClient.Do(req) if err != nil { return "", err } defer resp.Body.Close() var buf bytes.Buffer _, err = buf.ReadFrom(resp.Body) if err != nil { return "", err } switch resp.StatusCode { case 200: default: return "", errors.New("Gateway response status code: " + resp.Status) } body := struct { URL string `json:"url"` }{} err = json.Unmarshal(buf.Bytes(), &body) if err != nil { return "", err } url = body.URL + "?v=9&encoding=json" return url, nil }