Add support for banner image
This commit is contained in:
parent
d42ef41dc0
commit
f77e0bd08f
@ -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 {
|
||||
|
@ -43,84 +43,85 @@
|
||||
<div class="page-content">
|
||||
<div>
|
||||
{{with .User}}
|
||||
<p>My User: {{.Username}}#{{.Discriminator}}</p>
|
||||
<ul>
|
||||
<li>ID: {{.ID}}</li>
|
||||
<li>Email: {{.Email}}</li>
|
||||
<li>Username: {{.Username}}</li>
|
||||
<li>Avatar: <img {{$.Avatar}}/></li>
|
||||
<li>Locale: {{.Locale}}</li>
|
||||
<li>Discriminator: {{.Discriminator}}</li>
|
||||
<li>Verified: {{.Verified}}</li>
|
||||
<li>MFA: {{.MFAEnabled}}</li>
|
||||
<li>Banner: {{.Banner}}</li>
|
||||
<li>Accent Color: {{$.UserAccent}} <span class="colour-block" style="background-color: {{$.UserAccent}}"> </span>
|
||||
</li>
|
||||
<li>Bot: {{.Bot}}</li>
|
||||
<li>Premium: {{.PremiumType}}</li>
|
||||
<li>System: {{.System}}</li>
|
||||
</ul>
|
||||
<p>My User: {{.Username}}#{{.Discriminator}}</p>
|
||||
<ul>
|
||||
<li>ID: {{.ID}}</li>
|
||||
<li>Email: {{.Email}}</li>
|
||||
<li>Username: {{.Username}}</li>
|
||||
<li>Avatar: <img {{$.Avatar}} alt="User Avatar"/></li>
|
||||
<li>Locale: {{.Locale}}</li>
|
||||
<li>Discriminator: {{.Discriminator}}</li>
|
||||
<li>Verified: {{.Verified}}</li>
|
||||
<li>MFA: {{.MFAEnabled}}</li>
|
||||
<li>Banner: <img {{$.Banner}} alt="User Banner"/></li>
|
||||
<li>Accent Color: {{$.UserAccent}} <span class="colour-block"
|
||||
style="background-color: {{$.UserAccent}}"> </span>
|
||||
</li>
|
||||
<li>Bot: {{.Bot}}</li>
|
||||
<li>Premium: {{.PremiumType}}</li>
|
||||
<li>System: {{.System}}</li>
|
||||
</ul>
|
||||
{{end}}
|
||||
</div>
|
||||
<div>
|
||||
{{with .User.PublicFlags}}
|
||||
<p>My Flags:</p>
|
||||
<ul>
|
||||
{{if checkFlag . 1}}
|
||||
<li>Discord Employee</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 2}}
|
||||
<li>Discord Partner</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 4}}
|
||||
<li>Hype Squad Events</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 8}}
|
||||
<li>Bug Hunter Level 1</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 64}}
|
||||
<li>House Bravery</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 128}}
|
||||
<li>House Brilliance</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 256}}
|
||||
<li>House Balance</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 512}}
|
||||
<li>Early Supporter</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 1024}}
|
||||
<li>Team User</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 4096}}
|
||||
<li>System</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 16384}}
|
||||
<li>Bug Hunter Level 2</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 65536}}
|
||||
<li>Verified Bot</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 131072}}
|
||||
<li>Verified Bot Developer</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 262144}}
|
||||
<li>Discord Certified Moderator</li>
|
||||
{{end}}
|
||||
</ul>
|
||||
<p>My Flags:</p>
|
||||
<ul>
|
||||
{{if checkFlag . 1}}
|
||||
<li>Discord Employee</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 2}}
|
||||
<li>Discord Partner</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 4}}
|
||||
<li>Hype Squad Events</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 8}}
|
||||
<li>Bug Hunter Level 1</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 64}}
|
||||
<li>House Bravery</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 128}}
|
||||
<li>House Brilliance</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 256}}
|
||||
<li>House Balance</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 512}}
|
||||
<li>Early Supporter</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 1024}}
|
||||
<li>Team User</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 4096}}
|
||||
<li>System</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 16384}}
|
||||
<li>Bug Hunter Level 2</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 65536}}
|
||||
<li>Verified Bot</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 131072}}
|
||||
<li>Verified Bot Developer</li>
|
||||
{{end}}
|
||||
{{if checkFlag . 262144}}
|
||||
<li>Discord Certified Moderator</li>
|
||||
{{end}}
|
||||
</ul>
|
||||
{{end}}
|
||||
</div>
|
||||
<div>
|
||||
<p>Connections ({{len .Connections}}):</p>
|
||||
<ul class="connected-accounts">
|
||||
{{range .Connections}}
|
||||
<li>
|
||||
<a href="{{connectedLink .}}" target="_blank" data-is-revoked="{{.Revoked}}">
|
||||
<img src="/discord/assets/icon/{{.Type}}.svg"/>
|
||||
<span>{{.Name}}</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{connectedLink .}}" target="_blank" data-is-revoked="{{.Revoked}}">
|
||||
<img src="/discord/assets/icon/{{.Type}}.svg"/>
|
||||
<span>{{.Name}}</span>
|
||||
</a>
|
||||
</li>
|
||||
{{end}}
|
||||
</ul>
|
||||
</div>
|
||||
@ -128,11 +129,11 @@
|
||||
<p>Guilds ({{len .Guilds}}):</p>
|
||||
<div class="page-content guilds">
|
||||
{{range $k, $v := .Guilds}}
|
||||
<div class="guild-item">
|
||||
<div><img {{index $.GuildIcons $k}}/></div>
|
||||
<div>{{$v.Name}}</div>
|
||||
<div>@*{{$v.ID}}</div>
|
||||
</div>
|
||||
<div class="guild-item">
|
||||
<div><img {{index $.GuildIcons $k}}/></div>
|
||||
<div>{{$v.Name}}</div>
|
||||
<div>@*{{$v.ID}}</div>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
|
Loading…
Reference in New Issue
Block a user