starting on guild and member fetching

This commit is contained in:
41666 2025-03-25 22:23:55 -07:00
parent 9755318400
commit aafe3e2d21
12 changed files with 149 additions and 20 deletions

View file

@ -1,8 +1,57 @@
package discord package discord
import (
"fmt"
"net/http"
"net/url"
"time"
)
const DiscordBaseUrl = "https://discord.com/api/v10"
type IDiscordClient interface { type IDiscordClient interface {
Do(req *http.Request) (*http.Response, error)
} }
func Get(url string) { type DiscordClient struct {
Client *http.Client
BotToken string
ClientID string
ClientSecret string
}
func NewDiscordClient(clientID, clientSecret, botToken string) DiscordClient {
return DiscordClient{
ClientID: clientID,
ClientSecret: clientSecret,
BotToken: botToken,
Client: &http.Client{
Timeout: time.Second * 10,
},
}
}
func (d *DiscordClient) Do(req *http.Request) (*http.Response, error) {
return d.Client.Do(req)
}
func NewRequest(method string, path string, botToken string) *http.Request {
url, err := url.Parse(fmt.Sprintf("%s%s", DiscordBaseUrl, path))
if err != nil {
panic("discord/api: wtf couldnt join a string??")
}
req := &http.Request{
Method: method,
URL: url,
}
req.Header.Set("User-Agent", "Roleypoly (https://roleypoly.com, v4)")
if botToken != "" {
req.Header.Set("Authorization", fmt.Sprintf("Bot %s", botToken))
}
return req
} }

30
discord/api_mock.go Normal file
View file

@ -0,0 +1,30 @@
package discord
import (
"bytes"
"encoding/json"
"io"
"net/http"
"github.com/stretchr/testify/mock"
)
type DiscordClientMock struct {
mock.Mock
}
func (c *DiscordClientMock) Do(req *http.Request) (*http.Response, error) {
args := c.Called(req)
return args.Get(0).(*http.Response), args.Error(1)
}
func (c *DiscordClientMock) MockResponse(statusCode int, data any) *http.Response {
body := bytes.Buffer{}
json.NewEncoder(&body).Encode(data)
return &http.Response{
StatusCode: statusCode,
Body: io.NopCloser(&body),
}
}

View file

@ -1,11 +1,12 @@
package discord package discord
import "context" import "git.sapphic.engineer/roleypoly/v4/types"
type IGuild interface { type IGuild interface {
GetMember(ctx context.Context, memberID string) (IMember, error) GetMember(memberID string) (IMember, error)
} }
type Guild struct { type Guild struct {
ID string Client IDiscordClient
types.DiscordGuild
} }

View file

@ -1,8 +1,6 @@
package discord package discord
import ( import (
"context"
"github.com/stretchr/testify/mock" "github.com/stretchr/testify/mock"
) )
@ -10,8 +8,8 @@ type GuildMock struct {
mock.Mock mock.Mock
} }
func (g *GuildMock) GetMember(ctx context.Context, memberID string) (IMember, error) { func (g *GuildMock) GetMember(memberID string) (IMember, error) {
args := g.Called(ctx, memberID) args := g.Called(memberID)
if args.Get(0) == nil { if args.Get(0) == nil {
return nil, args.Error(1) return nil, args.Error(1)

View file

@ -1,14 +1,18 @@
package discord package discord
import "context"
type IGuildService interface { type IGuildService interface {
GetGuild(ctx context.Context, guildID string) (IGuild, error) Client() IDiscordClient
GetGuild(guildID string) (IGuild, error)
} }
type GuildService struct { type GuildService struct {
client IDiscordClient
} }
func (gs *GuildService) GetGuild(ctx context.Context, guildID string) (IGuild, error) { func (gs *GuildService) Client() IDiscordClient {
return nil, nil return gs.client
}
func (gs *GuildService) GetGuild(guildID string) (IGuild, error) {
// gs.client
} }

View file

@ -1,8 +1,6 @@
package discord package discord
import ( import (
"context"
"github.com/stretchr/testify/mock" "github.com/stretchr/testify/mock"
) )
@ -10,8 +8,8 @@ type GuildServiceMock struct {
mock.Mock mock.Mock
} }
func (gs *GuildServiceMock) GetGuild(ctx context.Context, guildID string) (IGuild, error) { func (gs *GuildServiceMock) GetGuild(guildID string) (IGuild, error) {
args := gs.Called(ctx, guildID) args := gs.Called(guildID)
if args.Get(0) == nil { if args.Get(0) == nil {
return nil, args.Error(1) return nil, args.Error(1)

View file

@ -72,3 +72,8 @@ func (i *Interactions) PostHandler(c fiber.Ctx) error {
return types.NewAPIError(http.StatusNotImplemented, "not implemented").Send(c) return types.NewAPIError(http.StatusNotImplemented, "not implemented").Send(c)
} }
func (i *Interactions) Respond(ix Interaction, ir InteractionResponse) error {
// TODO: make request to /webhooks/appid/{ix.Token}
return nil
}

View file

@ -9,6 +9,7 @@ type Interaction struct {
GuildID string `json:"guild_id"` GuildID string `json:"guild_id"`
AppPermissions uint64 `json:"app_permissions"` AppPermissions uint64 `json:"app_permissions"`
Type uint64 `json:"type"` Type uint64 `json:"type"`
Token string `json:"token"`
} }
const ( const (

View file

@ -1,14 +1,43 @@
package testing package testing
import "github.com/gofiber/fiber/v3" import (
"log"
type TestingController struct{} "github.com/gofiber/fiber/v3"
"git.sapphic.engineer/roleypoly/v4/discord"
"git.sapphic.engineer/roleypoly/v4/types"
)
type TestingController struct {
Guilds discord.IGuildService
}
func (t *TestingController) Routes(r fiber.Router) { func (t *TestingController) Routes(r fiber.Router) {
r.Get("/picker/:version?", t.Picker) r.Get("/picker/:version?", t.Picker)
r.Get("/m/:server/:user", t.GetMember)
} }
func (t *TestingController) Picker(c fiber.Ctx) error { func (t *TestingController) Picker(c fiber.Ctx) error {
version := c.Params("version", "main") version := c.Params("version", "main")
return c.Render("picker/"+version, fiber.Map{}) return c.Render("picker/"+version, fiber.Map{})
} }
func (t *TestingController) GetMember(c fiber.Ctx) error {
serverID := c.Params("server")
userID := c.Params("user")
g, err := t.Guilds.GetGuild(serverID)
if err != nil {
log.Println("testing/get guild: ", err)
types.NewAPIError(500, err.Error()).Send(c)
}
m, err := g.GetMember(userID)
if err != nil {
log.Println("testing/get member: ", err)
types.NewAPIError(500, err.Error()).Send(c)
}
return c.JSON(m)
}

3
types/guild.go Normal file
View file

@ -0,0 +1,3 @@
package types
type DiscordGuild struct{}

View file

@ -1,7 +1,14 @@
package utils package utils
import "fmt" import (
"fmt"
"strings"
)
func HeadTitle(text string) string { func HeadTitle(text string) string {
return fmt.Sprintf("%s | Roleypoly", text) return fmt.Sprintf("%s | Roleypoly", text)
} }
func J(parts ...string) string {
return "/" + strings.Join(parts, "/")
}

View file

@ -11,3 +11,7 @@ import (
func TestHeadTitle(t *testing.T) { func TestHeadTitle(t *testing.T) {
assert.Equal(t, utils.HeadTitle("Hello World"), "Hello World | Roleypoly") assert.Equal(t, utils.HeadTitle("Hello World"), "Hello World | Roleypoly")
} }
func TestJ(t *testing.T) {
assert.Equal(t, "a/b/c", utils.J("a", "b", "c"))
}