2023-12-23 09:54:47 +00:00
|
|
|
package adapter
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"fmt"
|
2023-12-27 08:07:40 +00:00
|
|
|
"net/url"
|
2024-01-04 10:44:36 +00:00
|
|
|
"time"
|
2023-12-23 09:54:47 +00:00
|
|
|
|
|
|
|
"gitea.dwysokinski.me/twhelp/corev3/internal/domain"
|
|
|
|
"gitea.dwysokinski.me/twhelp/corev3/internal/tw"
|
|
|
|
)
|
|
|
|
|
|
|
|
type TWHTTP struct {
|
|
|
|
client *tw.Client
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewTWHTTP(client *tw.Client) *TWHTTP {
|
|
|
|
return &TWHTTP{client: client}
|
|
|
|
}
|
|
|
|
|
2023-12-27 08:07:40 +00:00
|
|
|
func (t *TWHTTP) GetOpenServers(ctx context.Context, baseURL *url.URL) (domain.BaseServers, error) {
|
2023-12-23 09:54:47 +00:00
|
|
|
servers, err := t.client.GetOpenServers(ctx, baseURL)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return t.convertServersToDomain(servers)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *TWHTTP) convertServersToDomain(servers []tw.Server) (domain.BaseServers, error) {
|
|
|
|
res := make(domain.BaseServers, 0, len(servers))
|
|
|
|
|
|
|
|
for _, s := range servers {
|
|
|
|
converted, err := domain.NewBaseServer(s.Key, s.URL, true)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("couldn't construct domain.BaseServer: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
res = append(res, converted)
|
|
|
|
}
|
|
|
|
|
|
|
|
return res, nil
|
|
|
|
}
|
2023-12-25 11:04:12 +00:00
|
|
|
|
2023-12-27 08:07:40 +00:00
|
|
|
func (t *TWHTTP) GetServerConfig(ctx context.Context, baseURL *url.URL) (domain.ServerConfig, error) {
|
2023-12-25 11:04:12 +00:00
|
|
|
cfg, err := t.client.GetServerConfig(ctx, baseURL)
|
|
|
|
if err != nil {
|
|
|
|
return domain.ServerConfig{}, err
|
|
|
|
}
|
|
|
|
|
|
|
|
res, err := domain.NewServerConfig(
|
|
|
|
cfg.Speed,
|
|
|
|
cfg.UnitSpeed,
|
|
|
|
cfg.Moral,
|
|
|
|
domain.ServerConfigBuild(cfg.Build),
|
|
|
|
domain.ServerConfigMisc(cfg.Misc),
|
|
|
|
domain.ServerConfigCommands(cfg.Commands),
|
|
|
|
domain.ServerConfigNewbie(cfg.Newbie),
|
|
|
|
domain.ServerConfigGame{
|
|
|
|
BuildtimeFormula: cfg.Game.BuildtimeFormula,
|
|
|
|
Knight: cfg.Game.Knight,
|
|
|
|
KnightNewItems: cfg.Game.KnightNewItems.Int(),
|
|
|
|
Archer: cfg.Game.Archer,
|
|
|
|
Tech: cfg.Game.Tech,
|
|
|
|
FarmLimit: cfg.Game.FarmLimit,
|
|
|
|
Church: cfg.Game.Church,
|
|
|
|
Watchtower: cfg.Game.Watchtower,
|
|
|
|
Stronghold: cfg.Game.Stronghold,
|
|
|
|
FakeLimit: cfg.Game.FakeLimit,
|
|
|
|
BarbarianRise: cfg.Game.BarbarianRise,
|
|
|
|
BarbarianShrink: cfg.Game.BarbarianShrink,
|
|
|
|
BarbarianMaxPoints: cfg.Game.BarbarianMaxPoints,
|
|
|
|
Scavenging: cfg.Game.Scavenging,
|
|
|
|
Hauls: cfg.Game.Hauls,
|
|
|
|
HaulsBase: cfg.Game.HaulsBase,
|
|
|
|
HaulsMax: cfg.Game.HaulsMax,
|
|
|
|
BaseProduction: cfg.Game.BaseProduction,
|
|
|
|
Event: cfg.Game.Event,
|
|
|
|
SuppressEvents: cfg.Game.SuppressEvents,
|
|
|
|
},
|
|
|
|
domain.ServerConfigBuildings(cfg.Buildings),
|
|
|
|
domain.ServerConfigSnob(cfg.Snob),
|
|
|
|
domain.ServerConfigAlly(cfg.Ally),
|
|
|
|
domain.ServerConfigCoord(cfg.Coord),
|
|
|
|
domain.ServerConfigSitter(cfg.Sitter),
|
|
|
|
domain.ServerConfigSleep(cfg.Sleep),
|
|
|
|
domain.ServerConfigNight(cfg.Night),
|
|
|
|
domain.ServerConfigWin(cfg.Win),
|
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
return domain.ServerConfig{}, fmt.Errorf("couldn't construct domain.ServerConfig: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return res, nil
|
|
|
|
}
|
|
|
|
|
2023-12-27 08:07:40 +00:00
|
|
|
func (t *TWHTTP) GetUnitInfo(ctx context.Context, baseURL *url.URL) (domain.UnitInfo, error) {
|
2023-12-25 11:04:12 +00:00
|
|
|
info, err := t.client.GetUnitInfo(ctx, baseURL)
|
|
|
|
if err != nil {
|
|
|
|
return domain.UnitInfo{}, err
|
|
|
|
}
|
|
|
|
|
|
|
|
res, err := domain.NewUnitInfo(
|
|
|
|
domain.Unit(info.Spear),
|
|
|
|
domain.Unit(info.Sword),
|
|
|
|
domain.Unit(info.Axe),
|
|
|
|
domain.Unit(info.Archer),
|
|
|
|
domain.Unit(info.Spy),
|
|
|
|
domain.Unit(info.Light),
|
|
|
|
domain.Unit(info.Marcher),
|
|
|
|
domain.Unit(info.Heavy),
|
|
|
|
domain.Unit(info.Ram),
|
|
|
|
domain.Unit(info.Catapult),
|
|
|
|
domain.Unit(info.Knight),
|
|
|
|
domain.Unit(info.Snob),
|
|
|
|
domain.Unit(info.Militia),
|
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
return domain.UnitInfo{}, fmt.Errorf("couldn't construct domain.UnitInfo: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return res, nil
|
|
|
|
}
|
|
|
|
|
2023-12-27 08:07:40 +00:00
|
|
|
func (t *TWHTTP) GetBuildingInfo(ctx context.Context, baseURL *url.URL) (domain.BuildingInfo, error) {
|
2023-12-25 11:04:12 +00:00
|
|
|
info, err := t.client.GetBuildingInfo(ctx, baseURL)
|
|
|
|
if err != nil {
|
|
|
|
return domain.BuildingInfo{}, err
|
|
|
|
}
|
|
|
|
|
|
|
|
res, err := domain.NewBuildingInfo(
|
|
|
|
domain.Building(info.Main),
|
|
|
|
domain.Building(info.Barracks),
|
|
|
|
domain.Building(info.Stable),
|
|
|
|
domain.Building(info.Garage),
|
|
|
|
domain.Building(info.Watchtower),
|
|
|
|
domain.Building(info.Snob),
|
|
|
|
domain.Building(info.Smith),
|
|
|
|
domain.Building(info.Place),
|
|
|
|
domain.Building(info.Statue),
|
|
|
|
domain.Building(info.Market),
|
|
|
|
domain.Building(info.Wood),
|
|
|
|
domain.Building(info.Stone),
|
|
|
|
domain.Building(info.Iron),
|
|
|
|
domain.Building(info.Farm),
|
|
|
|
domain.Building(info.Storage),
|
|
|
|
domain.Building(info.Hide),
|
|
|
|
domain.Building(info.Wall),
|
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
return domain.BuildingInfo{}, fmt.Errorf("couldn't construct domain.BuildingInfo: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return res, nil
|
|
|
|
}
|
2023-12-27 08:07:40 +00:00
|
|
|
|
|
|
|
func (t *TWHTTP) GetTribes(ctx context.Context, baseURL *url.URL) (domain.BaseTribes, error) {
|
|
|
|
tribes, err := t.client.GetTribes(ctx, baseURL)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return t.convertTribesToDomain(tribes)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *TWHTTP) convertTribesToDomain(tribes []tw.Tribe) (domain.BaseTribes, error) {
|
|
|
|
res := make(domain.BaseTribes, 0, len(tribes))
|
|
|
|
|
|
|
|
for _, tr := range tribes {
|
|
|
|
od, err := domain.NewOpponentsDefeated(
|
|
|
|
tr.OpponentsDefeated.RankAtt,
|
|
|
|
tr.OpponentsDefeated.ScoreAtt,
|
|
|
|
tr.OpponentsDefeated.RankDef,
|
|
|
|
tr.OpponentsDefeated.ScoreDef,
|
|
|
|
tr.OpponentsDefeated.RankSup,
|
|
|
|
tr.OpponentsDefeated.ScoreSup,
|
|
|
|
tr.OpponentsDefeated.RankTotal,
|
|
|
|
tr.OpponentsDefeated.ScoreTotal,
|
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("couldn't construct domain.OpponentsDefeated: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
converted, err := domain.NewBaseTribe(
|
|
|
|
tr.ID,
|
|
|
|
tr.Name,
|
|
|
|
tr.Tag,
|
|
|
|
tr.NumMembers,
|
|
|
|
tr.NumVillages,
|
|
|
|
tr.Points,
|
|
|
|
tr.AllPoints,
|
|
|
|
tr.Rank,
|
|
|
|
od,
|
|
|
|
tr.ProfileURL,
|
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("couldn't construct domain.BaseTribe: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
res = append(res, converted)
|
|
|
|
}
|
|
|
|
|
|
|
|
return res, nil
|
|
|
|
}
|
2024-01-01 07:49:47 +00:00
|
|
|
|
|
|
|
func (t *TWHTTP) GetPlayers(ctx context.Context, baseURL *url.URL) (domain.BasePlayers, error) {
|
2024-01-02 09:54:11 +00:00
|
|
|
players, err := t.client.GetPlayers(ctx, baseURL)
|
2024-01-01 07:49:47 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2024-01-02 09:54:11 +00:00
|
|
|
return t.convertPlayersToDomain(players)
|
2024-01-01 07:49:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (t *TWHTTP) convertPlayersToDomain(players []tw.Player) (domain.BasePlayers, error) {
|
|
|
|
res := make(domain.BasePlayers, 0, len(players))
|
|
|
|
|
|
|
|
for _, p := range players {
|
|
|
|
od, err := domain.NewOpponentsDefeated(
|
|
|
|
p.OpponentsDefeated.RankAtt,
|
|
|
|
p.OpponentsDefeated.ScoreAtt,
|
|
|
|
p.OpponentsDefeated.RankDef,
|
|
|
|
p.OpponentsDefeated.ScoreDef,
|
|
|
|
p.OpponentsDefeated.RankSup,
|
|
|
|
p.OpponentsDefeated.ScoreSup,
|
|
|
|
p.OpponentsDefeated.RankTotal,
|
|
|
|
p.OpponentsDefeated.ScoreTotal,
|
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("couldn't construct domain.OpponentsDefeated: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
converted, err := domain.NewBasePlayer(
|
|
|
|
p.ID,
|
|
|
|
p.Name,
|
|
|
|
p.NumVillages,
|
|
|
|
p.Points,
|
|
|
|
p.Rank,
|
|
|
|
p.TribeID,
|
|
|
|
od,
|
|
|
|
p.ProfileURL,
|
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("couldn't construct domain.BasePlayer: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
res = append(res, converted)
|
|
|
|
}
|
|
|
|
|
|
|
|
return res, nil
|
|
|
|
}
|
2024-01-02 09:54:11 +00:00
|
|
|
|
|
|
|
func (t *TWHTTP) GetVillages(ctx context.Context, baseURL *url.URL) (domain.BaseVillages, error) {
|
|
|
|
villages, err := t.client.GetVillages(ctx, baseURL)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return t.convertVillagesToDomain(villages)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *TWHTTP) convertVillagesToDomain(villages []tw.Village) (domain.BaseVillages, error) {
|
|
|
|
res := make(domain.BaseVillages, 0, len(villages))
|
|
|
|
|
|
|
|
for _, v := range villages {
|
|
|
|
converted, err := domain.NewBaseVillage(
|
|
|
|
v.ID,
|
|
|
|
v.Name,
|
|
|
|
v.Points,
|
|
|
|
v.X,
|
|
|
|
v.Y,
|
|
|
|
v.Continent,
|
|
|
|
v.Bonus,
|
|
|
|
v.PlayerID,
|
|
|
|
v.ProfileURL,
|
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("couldn't construct domain.BaseVillage: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
res = append(res, converted)
|
|
|
|
}
|
|
|
|
|
|
|
|
return res, nil
|
|
|
|
}
|
2024-01-04 10:44:36 +00:00
|
|
|
|
|
|
|
func (t *TWHTTP) GetEnnoblements(
|
|
|
|
ctx context.Context,
|
|
|
|
baseURL *url.URL,
|
|
|
|
since time.Time,
|
|
|
|
) (domain.BaseEnnoblements, error) {
|
|
|
|
ennoblements, err := t.client.GetEnnoblements(ctx, baseURL, since)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return t.convertEnnoblementsToDomain(ennoblements)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *TWHTTP) convertEnnoblementsToDomain(ennoblements []tw.Ennoblement) (domain.BaseEnnoblements, error) {
|
|
|
|
res := make(domain.BaseEnnoblements, 0, len(ennoblements))
|
|
|
|
|
|
|
|
for _, e := range ennoblements {
|
|
|
|
converted, err := domain.NewBaseEnnoblement(
|
|
|
|
e.VillageID,
|
|
|
|
e.NewOwnerID,
|
|
|
|
e.NewTribeID,
|
|
|
|
e.OldOwnerID,
|
|
|
|
e.OldTribeID,
|
|
|
|
e.Points,
|
|
|
|
e.CreatedAt,
|
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("couldn't construct domain.BaseEnnoblement: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
res = append(res, converted)
|
|
|
|
}
|
|
|
|
|
|
|
|
return res, nil
|
|
|
|
}
|