Skip to content

Instantly share code, notes, and snippets.

@zet4
Created December 24, 2016 12:40
Show Gist options
  • Save zet4/a8492fc23169b2db8a04d297e93f6d54 to your computer and use it in GitHub Desktop.
Save zet4/a8492fc23169b2db8a04d297e93f6d54 to your computer and use it in GitHub Desktop.
Bubbie pls
package main
import (
"encoding/json"
"flag"
"fmt"
"io"
"log"
"net/http"
"os"
"path"
"time"
)
var (
token string
name string
client = http.Client{
Timeout: time.Minute,
}
)
type (
// https://canary.discordapp.com/api/v6/users/@me/guilds
// https://canary.discordapp.com/api/v6/guilds/:id
// https://cdn.discordapp.com/emojis/:id.png
Guilds []Guild
Guild struct {
ID string `json:"id"`
Emojis []Emoji `json:"emojis"`
}
Emoji struct {
ID string `json:"id"`
Name string `json:"name"`
}
)
func init() {
flag.StringVar(&token, "token", "", "")
flag.StringVar(&name, "filename", "dump", "")
}
func main() {
flag.Parse()
returnChan := make(chan error)
guilds, err := getGuilds(token)
if err != nil {
log.Fatal(err)
}
total := 0
for _, guild := range guilds {
fullguild, err := getGuild(token, guild.ID)
if err != nil {
log.Fatal(err)
}
total += len(fullguild.Emojis)
for _, emoji := range fullguild.Emojis {
go saveEmoji(guild.ID, emoji, returnChan)
}
}
finished := 0
for {
select {
case err := <-returnChan:
if err != nil {
log.Print(err)
}
finished++
}
if finished == total {
break
}
}
log.Printf("Finished dumping with a total count of %d", finished)
}
func getGuilds(t string) (Guilds, error) {
req, err := http.NewRequest("GET", "https://canary.discordapp.com/api/v6/users/@me/guilds", nil)
if err != nil {
return nil, err
}
req.Header.Set("Authorization", t)
resp, err := client.Do(req)
if err != nil {
return nil, err
}
var guilds Guilds
err = json.NewDecoder(resp.Body).Decode(&guilds)
if err != nil {
return nil, err
}
return guilds, nil
}
func getGuild(t, id string) (*Guild, error) {
req, err := http.NewRequest("GET", fmt.Sprintf("https://canary.discordapp.com/api/v6/guilds/%s", id), nil)
if err != nil {
return nil, err
}
req.Header.Set("Authorization", t)
resp, err := client.Do(req)
if err != nil {
return nil, err
}
var guild Guild
err = json.NewDecoder(resp.Body).Decode(&guild)
if err != nil {
return nil, err
}
return &guild, nil
}
func saveEmoji(gid string, e Emoji, rc chan error) {
resp, err := client.Get(fmt.Sprintf("https://cdn.discordapp.com/emojis/%s.png", e.ID))
if err != nil {
rc <- err
return
}
defer resp.Body.Close()
fullpath := path.Join(name, gid, fmt.Sprintf("%s.png", e.Name))
err = os.MkdirAll(path.Dir(fullpath), 666)
if err != nil {
rc <- err
return
}
fd, err := os.Create(fullpath)
if err != nil {
rc <- err
return
}
io.Copy(fd, resp.Body)
fd.Close()
rc <- nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment