diff --git a/module/discord/main.go b/module/discord/main.go index 9d2c372..e9bde01 100644 --- a/module/discord/main.go +++ b/module/discord/main.go @@ -12,8 +12,7 @@ import ( "github.com/gorilla/mux" "golang.org/x/oauth2" "html/template" - "image" - "image/png" + "io" "net/http" "os" ) @@ -61,7 +60,11 @@ func (m *Module) SetupModule(router *mux.Router, f func(cb func(http.ResponseWri } router.HandleFunc("/", m.getClient(m.homepage)) router.HandleFunc("/login", m.sessionWrapper(m.loginPage)) + router.HandleFunc("/user/avatar/{userId}/a_{avatarId}", m.getClient(m.userAvatarAnim)) router.HandleFunc("/user/avatar/{userId}/{avatarId}", m.getClient(m.userAvatar)) + router.HandleFunc("/user/banner/{userId}/a_{bannerId}", m.getClient(m.userAvatarAnim)) + router.HandleFunc("/user/banner/{userId}/{bannerId}", m.getClient(m.userAvatar)) + router.HandleFunc("/guild/icon/{guildId}/a_{iconId}", m.getClient(m.guildIconAnim)) router.HandleFunc("/guild/icon/{guildId}/{iconId}", m.getClient(m.guildIcon)) router.PathPrefix("/assets/icon/{name}.svg").HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { vars := mux.Vars(req) @@ -86,7 +89,7 @@ func (m *Module) getClient(cb func(http.ResponseWriter, *http.Request, *utils.St }) } -func (m *Module) homepage(rw http.ResponseWriter, req *http.Request, state *utils.State, discordClient *discordgo.Session) { +func (m *Module) homepage(rw http.ResponseWriter, _ *http.Request, state *utils.State, discordClient *discordgo.Session) { myUser, err := discordClient.User("@me") if err != nil { state.Del(KeyOauthClient) @@ -122,6 +125,7 @@ func (m *Module) homepage(rw http.ResponseWriter, req *http.Request, state *util User *discordgo.User UserAccent string Avatar template.HTMLAttr + Banner template.HTMLAttr Guilds []*discordgo.UserGuild GuildIcons []template.HTMLAttr Connections []*discordgo.UserConnection @@ -129,6 +133,7 @@ func (m *Module) homepage(rw http.ResponseWriter, req *http.Request, state *util User: myUser, UserAccent: fmt.Sprintf("#%06x", myUser.AccentColor), Avatar: template.HTMLAttr(fmt.Sprintf("src=\"/discord/user/avatar/%s/%s\"", myUser.ID, myUser.Avatar)), + Banner: template.HTMLAttr(fmt.Sprintf("src=\"/discord/user/banner/%s/%s\"", myUser.ID, myUser.Banner)), Guilds: myGuilds, GuildIcons: guildIcons, Connections: myConns, @@ -178,40 +183,51 @@ func (m *Module) loginPage(rw http.ResponseWriter, req *http.Request, state *uti http.Redirect(rw, req, m.oauthClient.AuthCodeURL(flowState.String(), oauth2.AccessTypeOffline), http.StatusTemporaryRedirect) } -func (m *Module) userAvatar(rw http.ResponseWriter, req *http.Request, state *utils.State, discordClient *discordgo.Session) { - vars := mux.Vars(req) - body, err := discordClient.RequestWithBucketID("GET", discordgo.EndpointUserAvatar(vars["userId"], vars["avatarId"]), nil, discordgo.EndpointUserAvatar("", "")) +func (m *Module) bucketFetchImage(rw http.ResponseWriter, discordClient *discordgo.Session, endpoint, emptyEndpoint, contentType string) { + body, err := discordClient.RequestWithBucketID("GET", endpoint, nil, emptyEndpoint) if err != nil { return } - rw.Header().Set("Content-Type", "image/png") - rw.WriteHeader(200) - - myAvatar, _, err := image.Decode(bytes.NewReader(body)) - err = png.Encode(rw, myAvatar) - if err != nil { - http.Error(rw, err.Error(), http.StatusInternalServerError) - return - } + rw.Header().Set("Content-Type", contentType) + rw.WriteHeader(http.StatusOK) + _, _ = io.Copy(rw, bytes.NewReader(body)) } -func (m *Module) guildIcon(rw http.ResponseWriter, req *http.Request, state *utils.State, discordClient *discordgo.Session) { +func (m *Module) userAvatar(rw http.ResponseWriter, req *http.Request, _ *utils.State, discordClient *discordgo.Session) { vars := mux.Vars(req) - body, err := discordClient.RequestWithBucketID("GET", discordgo.EndpointGuildIcon(vars["guildId"], vars["iconId"]), nil, discordgo.EndpointGuildIcon(vars["guildId"], "")) - if err != nil { - return - } + endpoint := discordgo.EndpointUserAvatar + m.bucketFetchImage(rw, discordClient, endpoint(vars["userId"], vars["avatarId"]), endpoint("", ""), "image/png") +} - rw.Header().Set("Content-Type", "image/png") - rw.WriteHeader(http.StatusOK) +func (m *Module) userAvatarAnim(rw http.ResponseWriter, req *http.Request, _ *utils.State, discordClient *discordgo.Session) { + vars := mux.Vars(req) + endpoint := discordgo.EndpointUserAvatarAnimated + m.bucketFetchImage(rw, discordClient, endpoint(vars["userId"], "a_"+vars["avatarId"]), endpoint("", ""), "image/gif") +} - myAvatar, _, err := image.Decode(bytes.NewReader(body)) - err = png.Encode(rw, myAvatar) - if err != nil { - http.Error(rw, err.Error(), http.StatusInternalServerError) - return - } +func (m *Module) userBanner(rw http.ResponseWriter, req *http.Request, _ *utils.State, discordClient *discordgo.Session) { + vars := mux.Vars(req) + endpoint := discordgo.EndpointUserBanner + m.bucketFetchImage(rw, discordClient, endpoint(vars["userId"], vars["bannerId"]), endpoint("", ""), "image/png") +} + +func (m *Module) userBannerAnim(rw http.ResponseWriter, req *http.Request, _ *utils.State, discordClient *discordgo.Session) { + vars := mux.Vars(req) + endpoint := discordgo.EndpointUserBannerAnimated + m.bucketFetchImage(rw, discordClient, endpoint(vars["userId"], "a_"+vars["bannerId"]), endpoint("", ""), "image/gif") +} + +func (m *Module) guildIcon(rw http.ResponseWriter, req *http.Request, _ *utils.State, discordClient *discordgo.Session) { + vars := mux.Vars(req) + endpoint := discordgo.EndpointGuildIcon + m.bucketFetchImage(rw, discordClient, endpoint(vars["userId"], vars["guildId"]), endpoint("", ""), "image/png") +} + +func (m *Module) guildIconAnim(rw http.ResponseWriter, req *http.Request, _ *utils.State, discordClient *discordgo.Session) { + vars := mux.Vars(req) + endpoint := discordgo.EndpointGuildIconAnimated + m.bucketFetchImage(rw, discordClient, endpoint(vars["userId"], "a_"+vars["guildId"]), endpoint("", ""), "image/gif") } func connectedLinkFunc(a *discordgo.UserConnection) string { diff --git a/module/discord/pages/index.go.html b/module/discord/pages/index.go.html index 8eb21b8..e34df93 100644 --- a/module/discord/pages/index.go.html +++ b/module/discord/pages/index.go.html @@ -43,84 +43,85 @@
{{with .User}} -

My User: {{.Username}}#{{.Discriminator}}

- +

My User: {{.Username}}#{{.Discriminator}}

+ {{end}}
{{with .User.PublicFlags}} -

My Flags:

- +

My Flags:

+ {{end}}

Connections ({{len .Connections}}):

@@ -128,11 +129,11 @@

Guilds ({{len .Guilds}}):

{{range $k, $v := .Guilds}} -
-
-
{{$v.Name}}
-
@*{{$v.ID}}
-
+
+
+
{{$v.Name}}
+
@*{{$v.ID}}
+
{{end}}