forked from jshiffer/matterbridge
111 lines
2.4 KiB
Go
111 lines
2.4 KiB
Go
|
package discordgo
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"io"
|
||
|
"mime/multipart"
|
||
|
"net/textproto"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
// SnowflakeTimestamp returns the creation time of a Snowflake ID relative to the creation of Discord.
|
||
|
func SnowflakeTimestamp(ID string) (t time.Time, err error) {
|
||
|
i, err := strconv.ParseInt(ID, 10, 64)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
timestamp := (i >> 22) + 1420070400000
|
||
|
t = time.Unix(0, timestamp*1000000)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// MultipartBodyWithJSON returns the contentType and body for a discord request
|
||
|
// data : The object to encode for payload_json in the multipart request
|
||
|
// files : Files to include in the request
|
||
|
func MultipartBodyWithJSON(data interface{}, files []*File) (requestContentType string, requestBody []byte, err error) {
|
||
|
body := &bytes.Buffer{}
|
||
|
bodywriter := multipart.NewWriter(body)
|
||
|
|
||
|
payload, err := json.Marshal(data)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
var p io.Writer
|
||
|
|
||
|
h := make(textproto.MIMEHeader)
|
||
|
h.Set("Content-Disposition", `form-data; name="payload_json"`)
|
||
|
h.Set("Content-Type", "application/json")
|
||
|
|
||
|
p, err = bodywriter.CreatePart(h)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if _, err = p.Write(payload); err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
for i, file := range files {
|
||
|
h := make(textproto.MIMEHeader)
|
||
|
h.Set("Content-Disposition", fmt.Sprintf(`form-data; name="file%d"; filename="%s"`, i, quoteEscaper.Replace(file.Name)))
|
||
|
contentType := file.ContentType
|
||
|
if contentType == "" {
|
||
|
contentType = "application/octet-stream"
|
||
|
}
|
||
|
h.Set("Content-Type", contentType)
|
||
|
|
||
|
p, err = bodywriter.CreatePart(h)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if _, err = io.Copy(p, file.Reader); err != nil {
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
|
||
|
err = bodywriter.Close()
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
return bodywriter.FormDataContentType(), body.Bytes(), nil
|
||
|
}
|
||
|
|
||
|
func avatarURL(avatarHash, defaultAvatarURL, staticAvatarURL, animatedAvatarURL, size string) string {
|
||
|
var URL string
|
||
|
if avatarHash == "" {
|
||
|
URL = defaultAvatarURL
|
||
|
} else if strings.HasPrefix(avatarHash, "a_") {
|
||
|
URL = animatedAvatarURL
|
||
|
} else {
|
||
|
URL = staticAvatarURL
|
||
|
}
|
||
|
|
||
|
if size != "" {
|
||
|
return URL + "?size=" + size
|
||
|
}
|
||
|
return URL
|
||
|
}
|
||
|
|
||
|
func bannerURL(bannerHash, staticBannerURL, animatedBannerURL, size string) string {
|
||
|
var URL string
|
||
|
if bannerHash == "" {
|
||
|
return ""
|
||
|
} else if strings.HasPrefix(bannerHash, "a_") {
|
||
|
URL = animatedBannerURL
|
||
|
} else {
|
||
|
URL = staticBannerURL
|
||
|
}
|
||
|
|
||
|
if size != "" {
|
||
|
return URL + "?size=" + size
|
||
|
}
|
||
|
return URL
|
||
|
}
|