Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions cmd/discord/rest/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"io"
"mime/multipart"
"net/http"
"net/http/cookiejar"
"net/textproto"
"strconv"
"sync"
Expand Down Expand Up @@ -53,18 +54,26 @@ func NewClient(token string, opts ...ClientOption) (*Client, error) {
apply(&options)
}

jar, err := cookiejar.New(nil)
if err != nil {
return nil, fmt.Errorf("failed to create a new cookie jar: %w", err)
}

client := &Client{
token: token,
rateLimitMx: sync.Mutex{},
rateLimitBuckets: make(map[string]time.Time),
http: http.Client{Timeout: time.Millisecond * 5000}, // discord is very slow sometimes
observer: options.observer,
http: http.Client{
Timeout: time.Millisecond * 5000, // discord is very slow sometimes
Jar: jar,
},
observer: options.observer,
}

ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()

_, err := client.lookupApplicationID(ctx)
_, err = client.lookupApplicationID(ctx)
if err != nil {
return nil, err
}
Expand Down
28 changes: 6 additions & 22 deletions cmd/discord/router/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import (
"github.com/bwmarrin/discordgo"
"github.com/cufee/aftermath/cmd/discord/commands/builder"
"github.com/cufee/aftermath/cmd/discord/common"
"github.com/cufee/aftermath/cmd/discord/rest"
"github.com/cufee/aftermath/internal/localization"
"github.com/cufee/aftermath/internal/log"
"github.com/cufee/aftermath/internal/retry"
Expand Down Expand Up @@ -50,9 +49,6 @@ func (router *router) HTTPHandler() (http.HandlerFunc, error) {
return
}

// we validated the request and are working on it
w.WriteHeader(http.StatusProcessing)

cmd, err := router.routeInteraction(data)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
Expand All @@ -69,26 +65,14 @@ func (router *router) HTTPHandler() (http.HandlerFunc, error) {
return
}

res := retry.Retry(
func() (struct{}, error) {
ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*500)
defer cancel()

err := router.restClient.AckInteractionResponse(ctx, data.ID, data.Token, cmd.Ephemeral)
if errors.Is(err, rest.ErrInteractionAlreadyAcked) {
err = nil
}
return struct{}{}, err
},
5,
time.Millisecond*250)
if res.Err != nil {
log.Warn().Err(res.Err).Str("id", data.ID).Msg("failed to ack an interaction")
// cross our fingers and hope discord registered one of those requests, or will propagate the ack from the response body
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
if cmd.Ephemeral {
w.Write([]byte(`{"type":5,"data":{"flags":64}}`))
} else {
w.Write([]byte(`{"type":5}`))
}

w.WriteHeader(http.StatusAccepted)

// run the interaction handler
go func() {
// while the limit for a deferred reply is on a scale of minutes, we probably do not want a user to wait that long
Expand Down
8 changes: 0 additions & 8 deletions internal/external/blitzkit/client.go
Original file line number Diff line number Diff line change
@@ -1,24 +1,16 @@
package blitzkit

import (
"context"
"net/http"
"time"

"github.com/cufee/aftermath/internal/stats/frame"
"github.com/pkg/errors"
)

//go:generate go tool github.com/bufbuild/buf/cmd/buf generate --template buf.gen.yaml --path averages.proto

var ErrServiceUnavailable = errors.New("blitzkit averages unavailable")

type Client interface {
CurrentTankAverages(ctx context.Context) (map[string]frame.StatsFrame, error)
}

var _ Client = &client{} // just a marker to see if it is implemented correctly

type client struct {
http http.Client
requestTimeout time.Duration
Expand Down
6 changes: 0 additions & 6 deletions internal/external/blitzstars/client.go
Original file line number Diff line number Diff line change
@@ -1,20 +1,14 @@
package blitzstars

import (
"context"
"net/http"
"time"

"github.com/cufee/aftermath/internal/stats/frame"
"github.com/pkg/errors"
)

var ErrServiceUnavailable = errors.New("blitz stars unavailable")

type Client interface {
CurrentTankAverages(ctx context.Context) (map[string]frame.StatsFrame, error)
}

type client struct {
http http.Client
apiURL string
Expand Down
4 changes: 2 additions & 2 deletions internal/stats/fetch/v1/multisource.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,10 @@ type multiSourceClient struct {

database database.Client
wargaming wargaming.Client
averages *averages.Client
averages averages.Source
}

func NewMultiSourceClient(wargaming wargaming.Client, averages *averages.Client, database database.Client) (*multiSourceClient, error) {
func NewMultiSourceClient(wargaming wargaming.Client, averages averages.Source, database database.Client) (*multiSourceClient, error) {
return &multiSourceClient{
database: database,
wargaming: wargaming,
Expand Down
4 changes: 2 additions & 2 deletions render_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,12 @@ func TestRenderReplay(t *testing.T) {

env.LoadTestEnv(t)
db := tests.StaticTestingDatabase()
wg, _ := wargamingClientsFromEnv(nil)
wg, _ := wargamingClientsFromEnv(tests.NewNoopObserver())

printer, err := localization.NewPrinter("stats", language.English)
is.NoErr(err)

fetch, err := fetch.NewMultiSourceClient(wg, nil, db)
fetch, err := fetch.NewMultiSourceClient(wg, tests.StaticTestingFetch(), db)
is.NoErr(err)

replayFiles := []string{"replay_defeat.wotbreplay", "replay_victory.wotbreplay", "replay_draw.wotbreplay", "replay_rating.wotbreplay"}
Expand Down
9 changes: 9 additions & 0 deletions tests/noop_metrics.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package tests

type NoopObserver struct{}

func (o *NoopObserver) Record(source, operation string, failed bool) {}

func NewNoopObserver() *NoopObserver {
return &NoopObserver{}
}
Loading