Updated Request func to handle POST as well. Updated other
functions to use it. Now all HTTP API calls run though the Request function to make the actual call.
This commit is contained in:
parent
f3ddf16ff7
commit
665c468c33
1 changed files with 39 additions and 107 deletions
144
client.go
144
client.go
|
@ -3,8 +3,8 @@
|
||||||
* A Discord API for Golang.
|
* A Discord API for Golang.
|
||||||
* See discord.go for more information.
|
* See discord.go for more information.
|
||||||
*
|
*
|
||||||
* This file contains functions for interacting with the Discord API
|
* This file contains functions for interacting with the Discord HTTPHTTP REST API
|
||||||
* at the lowest level. See other files for easier methods of access.
|
* at the lowest level.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package discordgo
|
package discordgo
|
||||||
|
@ -19,45 +19,52 @@ import (
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Request makes a REST API GET Request with Discord.
|
// Request makes a (GET/POST/?) Requests to Discord REST API.
|
||||||
// TODO make this handle GET, POST, DELETE, etc
|
// All the other functions in this file use this function.
|
||||||
// TODO also since everything comes back as JSON let this
|
func Request(session *Session, method, urlStr, body string) (response []byte, err error) {
|
||||||
// func unmarshal into a referenced object here
|
|
||||||
// then it can reduce code more and handle errors better
|
|
||||||
func Request(session *Session, urlStr string) (body []byte, err error) {
|
|
||||||
|
|
||||||
req, err := http.NewRequest("GET", urlStr, bytes.NewBuffer([]byte(fmt.Sprintf(``))))
|
if session.Debug {
|
||||||
|
fmt.Println("REQUEST :: " + method + " " + urlStr + "\n" + body)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: not sure if the NewBuffer is really needed always?
|
||||||
|
req, err := http.NewRequest(method, urlStr, bytes.NewBuffer([]byte(body)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Not used on initial login..
|
||||||
|
if session.Token != "" {
|
||||||
req.Header.Set("authorization", session.Token)
|
req.Header.Set("authorization", session.Token)
|
||||||
|
}
|
||||||
|
|
||||||
req.Header.Set("Content-Type", "application/json")
|
req.Header.Set("Content-Type", "application/json")
|
||||||
client := &http.Client{Timeout: (20 * time.Second)}
|
client := &http.Client{Timeout: (20 * time.Second)}
|
||||||
|
|
||||||
resp, err := client.Do(req)
|
resp, err := client.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
body, err = ioutil.ReadAll(resp.Body)
|
response, err = ioutil.ReadAll(resp.Body)
|
||||||
resp.Body.Close()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
resp.Body.Close()
|
||||||
|
|
||||||
if resp.StatusCode != 200 {
|
if resp.StatusCode != 204 && resp.StatusCode != 200 {
|
||||||
err = errors.New(fmt.Sprintf("StatusCode: %d, %s", resp.StatusCode, string(body)))
|
err = errors.New(fmt.Sprintf("StatusCode: %d, %s", resp.StatusCode, string(response)))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if session.Debug {
|
if session.Debug {
|
||||||
var prettyJSON bytes.Buffer
|
var prettyJSON bytes.Buffer
|
||||||
error := json.Indent(&prettyJSON, body, "", "\t")
|
error := json.Indent(&prettyJSON, response, "", "\t")
|
||||||
if error != nil {
|
if error != nil {
|
||||||
fmt.Print("JSON parse error: ", error)
|
fmt.Print("JSON parse error: ", error)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
fmt.Println(urlStr+" Response:\n", string(prettyJSON.Bytes()))
|
fmt.Println("RESPONSE ::\n" + string(prettyJSON.Bytes()))
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -66,37 +73,11 @@ func Request(session *Session, urlStr string) (body []byte, err error) {
|
||||||
func Login(session *Session, email string, password string) (token string, err error) {
|
func Login(session *Session, email string, password string) (token string, err error) {
|
||||||
|
|
||||||
var urlStr string = fmt.Sprintf("%s/%s", discordApi, "auth/login")
|
var urlStr string = fmt.Sprintf("%s/%s", discordApi, "auth/login")
|
||||||
req, err := http.NewRequest("POST", urlStr, bytes.NewBuffer([]byte(fmt.Sprintf(`{"email":"%s", "password":"%s"}`, email, password))))
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
req.Header.Set("Content-Type", "application/json")
|
|
||||||
|
|
||||||
client := &http.Client{Timeout: (20 * time.Second)}
|
response, err := Request(session, "POST", urlStr, fmt.Sprintf(`{"email":"%s", "password":"%s"}`, email, password))
|
||||||
resp, err := client.Do(req)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
body, _ := ioutil.ReadAll(resp.Body)
|
|
||||||
if resp.StatusCode != 200 {
|
|
||||||
err = errors.New(fmt.Sprintf("StatusCode: %d, %s", resp.StatusCode, string(body)))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if session.Debug {
|
|
||||||
var prettyJSON bytes.Buffer
|
|
||||||
error := json.Indent(&prettyJSON, body, "", "\t")
|
|
||||||
if error != nil {
|
|
||||||
fmt.Print("JSON parse error: ", error)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
fmt.Println("requestToken Response:\n", string(prettyJSON.Bytes()))
|
|
||||||
}
|
|
||||||
|
|
||||||
var temp map[string]interface{}
|
var temp map[string]interface{}
|
||||||
err = json.Unmarshal(body, &temp)
|
err = json.Unmarshal(response, &temp)
|
||||||
token = temp["token"].(string)
|
token = temp["token"].(string)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
@ -107,7 +88,7 @@ func Login(session *Session, email string, password string) (token string, err e
|
||||||
// user : A user Id or name
|
// user : A user Id or name
|
||||||
func Users(session *Session, userId string) (user User, err error) {
|
func Users(session *Session, userId string) (user User, err error) {
|
||||||
|
|
||||||
body, err := Request(session, fmt.Sprintf("%s/users/%s", discordApi, userId))
|
body, err := Request(session, "GET", fmt.Sprintf("%s/users/%s", discordApi, userId), ``)
|
||||||
err = json.Unmarshal(body, &user)
|
err = json.Unmarshal(body, &user)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -116,7 +97,7 @@ func Users(session *Session, userId string) (user User, err error) {
|
||||||
// channels for a user
|
// channels for a user
|
||||||
func PrivateChannels(session *Session, userId string) (channels []Channel, err error) {
|
func PrivateChannels(session *Session, userId string) (channels []Channel, err error) {
|
||||||
|
|
||||||
body, err := Request(session, fmt.Sprintf("%s/%s", discordApi, fmt.Sprintf("users/%s/channels", userId)))
|
body, err := Request(session, "GET", fmt.Sprintf("%s/users/%s/channels", discordApi, userId), ``)
|
||||||
err = json.Unmarshal(body, &channels)
|
err = json.Unmarshal(body, &channels)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
@ -125,7 +106,7 @@ func PrivateChannels(session *Session, userId string) (channels []Channel, err e
|
||||||
// Servers returns an array of Server structures for all servers for a user
|
// Servers returns an array of Server structures for all servers for a user
|
||||||
func Servers(session *Session, userId string) (servers []Server, err error) {
|
func Servers(session *Session, userId string) (servers []Server, err error) {
|
||||||
|
|
||||||
body, err := Request(session, fmt.Sprintf("%s/users/%s/guilds", discordApi, userId))
|
body, err := Request(session, "GET", fmt.Sprintf("%s/users/%s/guilds", discordApi, userId), ``)
|
||||||
err = json.Unmarshal(body, &servers)
|
err = json.Unmarshal(body, &servers)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
@ -135,7 +116,7 @@ func Servers(session *Session, userId string) (servers []Server, err error) {
|
||||||
// server.
|
// server.
|
||||||
func Members(session *Session, serverId int) (members []Member, err error) {
|
func Members(session *Session, serverId int) (members []Member, err error) {
|
||||||
|
|
||||||
body, err := Request(session, fmt.Sprintf("%s/guilds/%d/members", discordApi, serverId))
|
body, err := Request(session, "GET", fmt.Sprintf("%s/guilds/%d/members", discordApi, serverId), ``)
|
||||||
err = json.Unmarshal(body, &members)
|
err = json.Unmarshal(body, &members)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
@ -145,7 +126,7 @@ func Members(session *Session, serverId int) (members []Member, err error) {
|
||||||
// server.
|
// server.
|
||||||
func Channels(session *Session, serverId int) (channels []Channel, err error) {
|
func Channels(session *Session, serverId int) (channels []Channel, err error) {
|
||||||
|
|
||||||
body, err := Request(session, fmt.Sprintf("%s/guilds/%d/channels", discordApi, serverId))
|
body, err := Request(session, "GET", fmt.Sprintf("%s/guilds/%d/channels", discordApi, serverId), ``)
|
||||||
err = json.Unmarshal(body, &channels)
|
err = json.Unmarshal(body, &channels)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
@ -182,79 +163,30 @@ func Messages(session *Session, channelId int, limit int, beforeId int, afterId
|
||||||
urlStr = fmt.Sprintf("%s/channels/%d/messages", discordApi, channelId)
|
urlStr = fmt.Sprintf("%s/channels/%d/messages", discordApi, channelId)
|
||||||
}
|
}
|
||||||
|
|
||||||
body, err := Request(session, urlStr)
|
body, err := Request(session, "GET", urlStr, ``)
|
||||||
err = json.Unmarshal(body, &messages)
|
err = json.Unmarshal(body, &messages)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// SendMessage sends a message to the given channel.
|
// SendMessage sends a message to the given channel.
|
||||||
func SendMessage(session *Session, channelId int, message string) (response Message, err error) {
|
func SendMessage(session *Session, channelId int, content string) (message Message, err error) {
|
||||||
|
|
||||||
var urlStr string = fmt.Sprintf("%s/channels/%d/messages", discordApi, channelId)
|
var urlStr string = fmt.Sprintf("%s/channels/%d/messages", discordApi, channelId)
|
||||||
|
response, err := Request(session, "POST", urlStr, fmt.Sprintf(`{"content":"%s"}`, content))
|
||||||
|
err = json.Unmarshal(response, &message)
|
||||||
|
|
||||||
req, err := http.NewRequest("POST", urlStr, bytes.NewBuffer([]byte(fmt.Sprintf(`{"content":"%s"}`, message))))
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
req.Header.Set("authorization", session.Token)
|
|
||||||
req.Header.Set("Content-Type", "application/json")
|
|
||||||
|
|
||||||
client := &http.Client{Timeout: (20 * time.Second)}
|
|
||||||
resp, err := client.Do(req)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
resp.Body.Close()
|
|
||||||
|
|
||||||
if resp.StatusCode != 200 {
|
|
||||||
err = errors.New(fmt.Sprintf("StatusCode: %d, %s", resp.StatusCode, string(body)))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if session.Debug {
|
|
||||||
var prettyJSON bytes.Buffer
|
|
||||||
error := json.Indent(&prettyJSON, body, "", "\t")
|
|
||||||
if error != nil {
|
|
||||||
fmt.Print("JSON parse error: ", error)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
fmt.Println(urlStr+" Response:\n", string(prettyJSON.Bytes()))
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal(body, &response)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close ends a session and logs out from the Discord REST API.
|
// Close ends a session and logs out from the Discord REST API.
|
||||||
|
// This does not seem to actually invalidate the token. So you can still
|
||||||
|
// make API calls even after a Logout. So, it seems almost pointless to
|
||||||
|
// even use.
|
||||||
func Logout(session *Session) (err error) {
|
func Logout(session *Session) (err error) {
|
||||||
req, err := http.NewRequest("POST", fmt.Sprintf("%s/%s", discordApi, fmt.Sprintf("auth/logout")), bytes.NewBuffer([]byte(fmt.Sprintf(``))))
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
req.Header.Set("authorization", session.Token)
|
|
||||||
req.Header.Set("Content-Type", "application/json")
|
|
||||||
client := &http.Client{Timeout: (20 * time.Second)}
|
|
||||||
resp, err := client.Do(req)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
urlStr := fmt.Sprintf("%s/auth/logout", discordApi)
|
||||||
if err != nil {
|
_, err = Request(session, "POST", urlStr, fmt.Sprintf(`{"token": "%s"}`, session.Token))
|
||||||
return
|
|
||||||
}
|
|
||||||
resp.Body.Close()
|
|
||||||
|
|
||||||
if resp.StatusCode != 204 && resp.StatusCode != 200 {
|
|
||||||
err = errors.New(fmt.Sprintf("StatusCode: %d, %s", resp.StatusCode, string(body)))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue