2023-07-03 06:23:32 +00:00
|
|
|
package adapter
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"errors"
|
2024-05-02 05:57:24 +00:00
|
|
|
"slices"
|
|
|
|
"strings"
|
2023-07-03 06:23:32 +00:00
|
|
|
"time"
|
|
|
|
|
|
|
|
"gitea.dwysokinski.me/twhelp/dcbot/internal/domain"
|
|
|
|
"gitea.dwysokinski.me/twhelp/dcbot/internal/twhelp"
|
|
|
|
)
|
|
|
|
|
|
|
|
type TWHelpHTTP struct {
|
2024-05-02 05:57:24 +00:00
|
|
|
client *twhelp.ClientWithResponses
|
2023-07-03 06:23:32 +00:00
|
|
|
}
|
|
|
|
|
2024-05-02 05:57:24 +00:00
|
|
|
func NewTWHelpHTTP(client *twhelp.ClientWithResponses) *TWHelpHTTP {
|
2023-07-03 06:23:32 +00:00
|
|
|
return &TWHelpHTTP{client: client}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *TWHelpHTTP) ListVersions(ctx context.Context) ([]domain.TWVersion, error) {
|
2024-05-02 05:57:24 +00:00
|
|
|
resp, err := t.client.ListVersionsWithResponse(ctx, nil)
|
2023-07-03 06:23:32 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2024-05-02 05:57:24 +00:00
|
|
|
if resp.JSONDefault != nil {
|
|
|
|
return nil, t.convertErrors(resp.JSONDefault.Errors)
|
|
|
|
}
|
2023-07-03 06:23:32 +00:00
|
|
|
|
2024-05-02 05:57:24 +00:00
|
|
|
res := make([]domain.TWVersion, 0, len(resp.JSON200.Data))
|
|
|
|
for _, v := range resp.JSON200.Data {
|
2023-07-03 06:23:32 +00:00
|
|
|
res = append(res, t.convertVersionToDomain(v))
|
|
|
|
}
|
|
|
|
|
|
|
|
return res, nil
|
|
|
|
}
|
|
|
|
|
2024-05-02 05:57:24 +00:00
|
|
|
func (t *TWHelpHTTP) ListOpenServers(ctx context.Context, versionCode string, limit int) ([]domain.TWServer, error) {
|
|
|
|
open := true
|
|
|
|
return t.listServers(ctx, versionCode, &twhelp.ListServersParams{
|
|
|
|
Limit: &limit,
|
|
|
|
Open: &open,
|
2023-07-03 06:23:32 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2024-05-02 05:57:24 +00:00
|
|
|
func (t *TWHelpHTTP) ListClosedServers(ctx context.Context, versionCode string, limit int) ([]domain.TWServer, error) {
|
|
|
|
open := false
|
|
|
|
return t.listServers(ctx, versionCode, &twhelp.ListServersParams{
|
|
|
|
Limit: &limit,
|
|
|
|
Open: &open,
|
2023-07-03 06:23:32 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2024-05-02 05:57:24 +00:00
|
|
|
func (t *TWHelpHTTP) listServers(ctx context.Context, versionCode string, params *twhelp.ListServersParams) ([]domain.TWServer, error) {
|
|
|
|
resp, err := t.client.ListServersWithResponse(ctx, versionCode, params)
|
2023-07-03 06:23:32 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2024-05-02 05:57:24 +00:00
|
|
|
if resp.JSONDefault != nil {
|
|
|
|
return nil, t.convertErrors(resp.JSONDefault.Errors)
|
|
|
|
}
|
2023-07-03 06:23:32 +00:00
|
|
|
|
2024-05-02 05:57:24 +00:00
|
|
|
res := make([]domain.TWServer, 0, len(resp.JSON200.Data))
|
|
|
|
for _, s := range resp.JSON200.Data {
|
2023-07-03 06:23:32 +00:00
|
|
|
res = append(res, t.convertServerToDomain(s))
|
|
|
|
}
|
|
|
|
|
|
|
|
return res, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *TWHelpHTTP) GetOpenServer(ctx context.Context, versionCode, serverKey string) (domain.TWServer, error) {
|
2023-07-13 04:43:06 +00:00
|
|
|
server, err := t.GetServer(ctx, versionCode, serverKey)
|
2023-07-03 06:23:32 +00:00
|
|
|
if err != nil {
|
2023-07-13 04:43:06 +00:00
|
|
|
return domain.TWServer{}, err
|
|
|
|
}
|
2024-05-02 05:57:24 +00:00
|
|
|
|
2023-07-13 04:43:06 +00:00
|
|
|
if !server.Open {
|
2023-07-03 06:23:32 +00:00
|
|
|
return domain.TWServer{}, domain.TWServerNotFoundError{
|
|
|
|
VersionCode: versionCode,
|
|
|
|
Key: serverKey,
|
|
|
|
}
|
|
|
|
}
|
2024-05-02 05:57:24 +00:00
|
|
|
|
2023-07-13 04:43:06 +00:00
|
|
|
return server, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *TWHelpHTTP) GetServer(ctx context.Context, versionCode, serverKey string) (domain.TWServer, error) {
|
2024-05-02 05:57:24 +00:00
|
|
|
resp, err := t.client.GetServerWithResponse(ctx, versionCode, serverKey)
|
2023-07-13 04:43:06 +00:00
|
|
|
if err != nil {
|
2024-05-02 05:57:24 +00:00
|
|
|
return domain.TWServer{}, err
|
|
|
|
}
|
|
|
|
if resp.JSONDefault != nil {
|
|
|
|
if slices.ContainsFunc(resp.JSONDefault.Errors, func(err twhelp.Error) bool {
|
|
|
|
return err.Code == twhelp.ErrorCodeServerNotFound
|
|
|
|
}) {
|
|
|
|
return domain.TWServer{}, domain.TWServerNotFoundError{
|
|
|
|
VersionCode: versionCode,
|
|
|
|
Key: serverKey,
|
|
|
|
}
|
2023-07-03 06:23:32 +00:00
|
|
|
}
|
2024-05-02 05:57:24 +00:00
|
|
|
|
|
|
|
return domain.TWServer{}, t.convertErrors(resp.JSONDefault.Errors)
|
2023-07-03 06:23:32 +00:00
|
|
|
}
|
2024-05-02 05:57:24 +00:00
|
|
|
|
|
|
|
return t.convertServerToDomain(resp.JSON200.Data), nil
|
2023-07-03 06:23:32 +00:00
|
|
|
}
|
|
|
|
|
2024-05-02 05:57:24 +00:00
|
|
|
func (t *TWHelpHTTP) GetTribeByID(ctx context.Context, versionCode, serverKey string, id int) (domain.Tribe, error) {
|
|
|
|
resp, err := t.client.GetTribeWithResponse(ctx, versionCode, serverKey, id)
|
2023-07-03 06:23:32 +00:00
|
|
|
if err != nil {
|
2024-05-02 05:57:24 +00:00
|
|
|
return domain.Tribe{}, err
|
|
|
|
}
|
|
|
|
if resp.JSONDefault != nil {
|
|
|
|
if slices.ContainsFunc(resp.JSONDefault.Errors, func(err twhelp.Error) bool {
|
|
|
|
return err.Code == twhelp.ErrorCodeTribeNotFound
|
|
|
|
}) {
|
|
|
|
return domain.Tribe{}, domain.TribeIDNotFoundError{
|
|
|
|
VersionCode: versionCode,
|
|
|
|
ServerKey: serverKey,
|
|
|
|
ID: id,
|
|
|
|
}
|
2023-07-03 06:23:32 +00:00
|
|
|
}
|
2024-05-02 05:57:24 +00:00
|
|
|
|
|
|
|
return domain.Tribe{}, t.convertErrors(resp.JSONDefault.Errors)
|
2023-07-03 06:23:32 +00:00
|
|
|
}
|
2024-05-02 05:57:24 +00:00
|
|
|
|
|
|
|
return t.convertTribeToDomain(resp.JSON200.Data), nil
|
2023-07-03 06:23:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (t *TWHelpHTTP) GetExistingTribeByTag(ctx context.Context, versionCode, serverKey, tribeTag string) (domain.Tribe, error) {
|
2024-05-02 05:57:24 +00:00
|
|
|
deleted := false
|
|
|
|
tags := []string{tribeTag}
|
|
|
|
limit := 1
|
|
|
|
|
|
|
|
resp, err := t.client.ListTribesWithResponse(ctx, versionCode, serverKey, &twhelp.ListTribesParams{
|
|
|
|
Deleted: &deleted,
|
|
|
|
Tag: &tags,
|
|
|
|
Limit: &limit,
|
2023-07-03 06:23:32 +00:00
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return domain.Tribe{}, err
|
|
|
|
}
|
2024-05-02 05:57:24 +00:00
|
|
|
if resp.JSONDefault != nil {
|
|
|
|
return domain.Tribe{}, t.convertErrors(resp.JSONDefault.Errors)
|
|
|
|
}
|
2023-07-22 06:30:31 +00:00
|
|
|
|
2024-05-02 05:57:24 +00:00
|
|
|
if len(resp.JSON200.Data) == 0 {
|
2023-07-03 06:23:32 +00:00
|
|
|
return domain.Tribe{}, domain.TribeTagNotFoundError{
|
|
|
|
VersionCode: versionCode,
|
|
|
|
ServerKey: serverKey,
|
|
|
|
Tag: tribeTag,
|
|
|
|
}
|
|
|
|
}
|
2023-07-22 06:30:31 +00:00
|
|
|
|
2024-05-02 05:57:24 +00:00
|
|
|
return t.convertTribeToDomain(resp.JSON200.Data[0]), nil
|
2023-07-03 06:23:32 +00:00
|
|
|
}
|
|
|
|
|
2024-05-02 05:57:24 +00:00
|
|
|
func (t *TWHelpHTTP) ListTribesByTag(ctx context.Context, versionCode, serverKey string, tribeTags []string) ([]domain.Tribe, error) {
|
|
|
|
resp, err := t.client.ListTribesWithResponse(ctx, versionCode, serverKey, &twhelp.ListTribesParams{
|
|
|
|
Tag: &tribeTags,
|
2023-07-03 06:23:32 +00:00
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2024-05-02 05:57:24 +00:00
|
|
|
if resp.JSONDefault != nil {
|
|
|
|
return nil, t.convertErrors(resp.JSONDefault.Errors)
|
|
|
|
}
|
2023-07-03 06:23:32 +00:00
|
|
|
|
2024-05-02 05:57:24 +00:00
|
|
|
res := make([]domain.Tribe, 0, len(resp.JSON200.Data))
|
|
|
|
for _, tr := range resp.JSON200.Data {
|
2023-07-03 06:23:32 +00:00
|
|
|
res = append(res, t.convertTribeToDomain(tr))
|
|
|
|
}
|
|
|
|
|
|
|
|
return res, nil
|
|
|
|
}
|
|
|
|
|
2024-05-02 05:57:24 +00:00
|
|
|
func (t *TWHelpHTTP) ListVillagesByCoords(ctx context.Context, versionCode, serverKey string, coords []string) ([]domain.Village, error) {
|
|
|
|
resp, err := t.client.ListVillagesWithResponse(ctx, versionCode, serverKey, &twhelp.ListVillagesParams{
|
|
|
|
Coords: &coords,
|
2023-07-03 06:23:32 +00:00
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2024-05-02 05:57:24 +00:00
|
|
|
if resp.JSONDefault != nil {
|
|
|
|
return nil, t.convertErrors(resp.JSONDefault.Errors)
|
|
|
|
}
|
2023-07-03 06:23:32 +00:00
|
|
|
|
2024-05-02 05:57:24 +00:00
|
|
|
res := make([]domain.Village, 0, len(resp.JSON200.Data))
|
|
|
|
for _, v := range resp.JSON200.Data {
|
2023-07-03 06:23:32 +00:00
|
|
|
res = append(res, t.convertVillageToDomain(v))
|
|
|
|
}
|
|
|
|
|
|
|
|
return res, nil
|
|
|
|
}
|
|
|
|
|
2024-05-02 05:57:24 +00:00
|
|
|
func (t *TWHelpHTTP) ListEnnoblementsSince(ctx context.Context, versionCode, serverKey string, since time.Time) ([]domain.Ennoblement, error) {
|
|
|
|
sort := []string{
|
|
|
|
string(twhelp.ListEnnoblementsParamsSortCreatedAtASC),
|
|
|
|
}
|
|
|
|
|
|
|
|
resp, err := t.client.ListEnnoblementsWithResponse(ctx, versionCode, serverKey, &twhelp.ListEnnoblementsParams{
|
|
|
|
Sort: &sort,
|
|
|
|
Since: &since,
|
2023-07-03 06:23:32 +00:00
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2024-05-02 05:57:24 +00:00
|
|
|
if resp.JSONDefault != nil {
|
|
|
|
return nil, t.convertErrors(resp.JSONDefault.Errors)
|
|
|
|
}
|
2023-07-03 06:23:32 +00:00
|
|
|
|
2024-05-02 05:57:24 +00:00
|
|
|
res := make([]domain.Ennoblement, 0, len(resp.JSON200.Data))
|
|
|
|
for _, e := range resp.JSON200.Data {
|
2023-07-03 06:23:32 +00:00
|
|
|
res = append(res, t.convertEnnoblementToDomain(e))
|
|
|
|
}
|
|
|
|
|
|
|
|
return res, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *TWHelpHTTP) convertVersionToDomain(v twhelp.Version) domain.TWVersion {
|
|
|
|
return domain.TWVersion(v)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *TWHelpHTTP) convertServerToDomain(s twhelp.Server) domain.TWServer {
|
2024-05-02 05:57:24 +00:00
|
|
|
return domain.TWServer{
|
|
|
|
Key: s.Key,
|
|
|
|
URL: s.Url,
|
|
|
|
Open: s.Open,
|
|
|
|
}
|
2023-07-03 06:23:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (t *TWHelpHTTP) convertTribeToDomain(tr twhelp.Tribe) domain.Tribe {
|
2024-05-02 05:57:24 +00:00
|
|
|
var deletedAt time.Time
|
|
|
|
if tr.DeletedAt != nil {
|
|
|
|
deletedAt = *tr.DeletedAt
|
|
|
|
}
|
|
|
|
|
|
|
|
return domain.Tribe{
|
|
|
|
ID: tr.Id,
|
|
|
|
Tag: tr.Tag,
|
|
|
|
Name: tr.Name,
|
|
|
|
ProfileURL: tr.ProfileUrl,
|
|
|
|
DeletedAt: deletedAt,
|
|
|
|
}
|
2023-07-03 06:23:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (t *TWHelpHTTP) convertTribeMetaToDomain(tr twhelp.TribeMeta) domain.TribeMeta {
|
2024-05-02 05:57:24 +00:00
|
|
|
return domain.TribeMeta{
|
|
|
|
ID: tr.Id,
|
|
|
|
Name: tr.Name,
|
|
|
|
Tag: tr.Tag,
|
|
|
|
ProfileURL: tr.ProfileUrl,
|
|
|
|
}
|
2023-07-03 06:23:32 +00:00
|
|
|
}
|
|
|
|
|
2024-05-02 05:57:24 +00:00
|
|
|
func (t *TWHelpHTTP) convertNullTribeMetaToDomain(tr *twhelp.NullTribeMeta) domain.NullTribeMeta {
|
|
|
|
res := domain.NullTribeMeta{
|
|
|
|
Valid: tr != nil,
|
|
|
|
}
|
|
|
|
if tr != nil {
|
|
|
|
res.Tribe = t.convertTribeMetaToDomain(*tr)
|
2023-07-03 06:23:32 +00:00
|
|
|
}
|
2024-05-02 05:57:24 +00:00
|
|
|
return res
|
2023-07-03 06:23:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (t *TWHelpHTTP) convertPlayerMetaToDomain(p twhelp.PlayerMeta) domain.PlayerMeta {
|
|
|
|
return domain.PlayerMeta{
|
2024-05-02 05:57:24 +00:00
|
|
|
ID: p.Id,
|
2023-07-03 06:23:32 +00:00
|
|
|
Name: p.Name,
|
2024-05-02 05:57:24 +00:00
|
|
|
ProfileURL: p.ProfileUrl,
|
2023-07-03 06:23:32 +00:00
|
|
|
Tribe: t.convertNullTribeMetaToDomain(p.Tribe),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-05-02 05:57:24 +00:00
|
|
|
func (t *TWHelpHTTP) convertNullPlayerMetaToDomain(p *twhelp.NullPlayerMeta) domain.NullPlayerMeta {
|
|
|
|
res := domain.NullPlayerMeta{
|
|
|
|
Valid: p != nil,
|
2023-07-03 06:23:32 +00:00
|
|
|
}
|
2024-05-02 05:57:24 +00:00
|
|
|
if p != nil {
|
|
|
|
res.Player = t.convertPlayerMetaToDomain(*p)
|
|
|
|
}
|
|
|
|
return res
|
2023-07-03 06:23:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (t *TWHelpHTTP) convertVillageToDomain(v twhelp.Village) domain.Village {
|
|
|
|
return domain.Village{
|
2024-05-02 05:57:24 +00:00
|
|
|
ID: v.Id,
|
2023-07-03 06:23:32 +00:00
|
|
|
FullName: v.FullName,
|
2024-05-02 05:57:24 +00:00
|
|
|
ProfileURL: v.ProfileUrl,
|
2023-07-03 06:23:32 +00:00
|
|
|
Points: v.Points,
|
2023-07-09 04:28:45 +00:00
|
|
|
X: v.X,
|
|
|
|
Y: v.Y,
|
2023-07-03 06:23:32 +00:00
|
|
|
Player: t.convertNullPlayerMetaToDomain(v.Player),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *TWHelpHTTP) convertVillageMetaToDomain(v twhelp.VillageMeta) domain.VillageMeta {
|
|
|
|
return domain.VillageMeta{
|
2024-05-02 05:57:24 +00:00
|
|
|
ID: v.Id,
|
2023-07-03 06:23:32 +00:00
|
|
|
FullName: v.FullName,
|
2024-05-02 05:57:24 +00:00
|
|
|
ProfileURL: v.ProfileUrl,
|
2023-07-03 06:23:32 +00:00
|
|
|
Player: t.convertNullPlayerMetaToDomain(v.Player),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *TWHelpHTTP) convertEnnoblementToDomain(e twhelp.Ennoblement) domain.Ennoblement {
|
|
|
|
return domain.Ennoblement{
|
2024-05-02 05:57:24 +00:00
|
|
|
ID: e.Id,
|
2023-07-03 06:23:32 +00:00
|
|
|
Village: t.convertVillageMetaToDomain(e.Village),
|
2024-05-02 05:57:24 +00:00
|
|
|
NewOwner: t.convertPlayerMetaToDomain(e.NewOwner),
|
2023-07-03 06:23:32 +00:00
|
|
|
CreatedAt: e.CreatedAt,
|
|
|
|
}
|
|
|
|
}
|
2024-05-02 05:57:24 +00:00
|
|
|
|
|
|
|
func (t *TWHelpHTTP) convertErrors(errs []twhelp.Error) error {
|
|
|
|
if len(errs) == 0 {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
sep := "\n"
|
|
|
|
|
|
|
|
n := len(sep) * (len(errs) - 1)
|
|
|
|
for _, err := range errs {
|
|
|
|
n += len(err.Message)
|
|
|
|
}
|
|
|
|
|
|
|
|
var b strings.Builder
|
|
|
|
b.Grow(n)
|
|
|
|
|
|
|
|
for i, err := range errs {
|
|
|
|
if i > 0 {
|
|
|
|
b.WriteString(sep)
|
|
|
|
}
|
|
|
|
b.WriteString(err.Message)
|
|
|
|
}
|
|
|
|
|
|
|
|
return errors.New(b.String())
|
|
|
|
}
|