89 lines
1.5 KiB
Go
89 lines
1.5 KiB
Go
package discord
|
|
|
|
import (
|
|
"log"
|
|
"net/url"
|
|
|
|
"git.ddd.rip/ptrcnull/modweb"
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
type Module struct {
|
|
ClientID string
|
|
ClientSecret string
|
|
RedirectURI string
|
|
Scope string
|
|
Callback func(me *MeResponse) *modweb.User
|
|
}
|
|
|
|
const API_ENDPOINT = "https://discord.com/api/v6"
|
|
|
|
func (m *Module) LoginURL() string {
|
|
params := url.Values{}
|
|
params.Set("client_id", m.ClientID)
|
|
params.Set("redirect_uri", m.RedirectURI)
|
|
params.Set("response_type", "code")
|
|
params.Set("scope", m.Scope)
|
|
return "https://discord.com/api/oauth2/authorize?" + params.Encode()
|
|
}
|
|
|
|
func (m *Module) RegisterURL() string {
|
|
return ""
|
|
}
|
|
|
|
func (m *Module) FriendlyName() string {
|
|
return "Discord"
|
|
}
|
|
|
|
func (m *Module) Name() string {
|
|
return "discord"
|
|
}
|
|
|
|
func (m *Module) MinAccessLevel() int64 {
|
|
return -1
|
|
}
|
|
|
|
func (m *Module) Hidden() bool {
|
|
return true
|
|
}
|
|
|
|
type User struct {
|
|
ID string
|
|
AccessLevel int64
|
|
}
|
|
|
|
func (m *Module) Init(mm *modweb.ModuleManager) {
|
|
app := mm.Fiber()
|
|
app.Get("/callback", func(ctx *fiber.Ctx) error {
|
|
session := mm.Session(ctx)
|
|
defer session.Save()
|
|
|
|
if session.Get("user") != nil {
|
|
return ctx.Redirect("/")
|
|
}
|
|
|
|
code := ctx.Query("code")
|
|
if code == "" {
|
|
return ctx.Redirect("/")
|
|
}
|
|
|
|
token, err := m.getToken(code)
|
|
if err != nil {
|
|
log.Println(err)
|
|
return ctx.Redirect("/")
|
|
}
|
|
|
|
me, err := getMe(token)
|
|
if err != nil {
|
|
log.Println(err)
|
|
return ctx.Redirect("/")
|
|
}
|
|
|
|
user := m.Callback(me)
|
|
if user != nil {
|
|
user.Save(session)
|
|
}
|
|
|
|
return ctx.Redirect("/")
|
|
})
|
|
}
|