Skip to content

Commit c0df446

Browse files
committed
improved achievement indexing
1 parent 125a581 commit c0df446

File tree

2 files changed

+86
-47
lines changed

2 files changed

+86
-47
lines changed

achievements.go

Lines changed: 55 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -12,51 +12,59 @@ type Achievement struct {
1212
Village string `json:"village"`
1313
}
1414

15-
const (
16-
AchievementIndexBiggerCoffers = iota
17-
AchievementIndexGetThoseGoblins
18-
AchievementIndexBiggerAndBetter
19-
AchievementIndexNiceAndTidy
20-
AchievementIndexDiscoverNewTroops
21-
AchievementIndexGoldGrab
22-
AchievementIndexElixirEscapade
23-
AchievementIndexSweetVictory
24-
AchievementIndexEmpireBuilder
25-
AchievementIndexWallBuster
26-
AchievementIndexHumiliator
27-
AchievementIndexUnionBuster
28-
AchievementIndexConqueror
29-
AchievementIndexUnbreakable
30-
AchievementIndexFriendInNeed
31-
AchievementIndexMortarMauler
32-
AchievementIndexHeroicHeist
33-
AchievementIndexLeagueAllStar
34-
AchievementIndexXbowExterminator
35-
AchievementIndexFirefighter
36-
AchievementIndexWarHero
37-
AchievementIndexClanWarWealth
38-
AchievementIndexAntiArtillery
39-
AchievementIndexSharingIsCaring
40-
AchievementIndexKeepYourAccountSafeOld
41-
AchievementIndexMasterEngineering
42-
AchievementIndexNextGenerationModel
43-
AchievementIndexUnBuildIt
44-
AchievementIndexChampionBuilder
45-
AchievementIndexHighGear
46-
AchievementIndexHiddenTreasures
47-
AchievementIndexGamesChampion
48-
AchievementIndexDragonSlayer
49-
AchievementIndexWarLeagueLegend
50-
AchievementIndexKeepYourAccountSafe
51-
AchievementIndexWellSeasoned
52-
AchievementIndexShatteredAndScattered
53-
AchievementIndexNotSoEasyThisTime
54-
AchievementIndexBustThis
55-
AchievementIndexSuperbWork
56-
AchievementIndexSiegeSharer
57-
AchievementIndexAggressiveCapitalism
58-
AchievementIndexMostValuableClanmate
59-
AchievementIndexCounterspell
60-
AchievementIndexMonolithMasher
61-
AchievementIndexUngratefulChild
15+
// IndexedAchievement embeds Achievement and adds the index of the achievement in the Player.Achievements slice to it.
16+
type IndexedAchievement struct {
17+
*Achievement
18+
Index int
19+
}
20+
21+
var (
22+
AchievementBiggerCoffers = &Achievement{Name: "Bigger Coffers"}
23+
AchievementGetThoseGoblins = &Achievement{Name: "Get those Goblins!"}
24+
AchievementBiggerAndBetter = &Achievement{Name: "Bigger & Better"}
25+
AchievementNiceAndTidy = &Achievement{Name: "Nice and Tidy"}
26+
AchievementDiscoverNewTroops = &Achievement{Name: "Discover New Troops"}
27+
AchievementGoldGrab = &Achievement{Name: "Gold Grab"}
28+
AchievementElixirEscapade = &Achievement{Name: "Elixir Escapade"}
29+
AchievementSweetVictory = &Achievement{Name: "Sweet Victory!"}
30+
AchievementEmpireBuilder = &Achievement{Name: "Empire Builder"}
31+
AchievementWallBuster = &Achievement{Name: "Wall Buster"}
32+
AchievementHumiliator = &Achievement{Name: "Humiliator"}
33+
AchievementUnionBuster = &Achievement{Name: "Union Buster"}
34+
AchievementConqueror = &Achievement{Name: "Conqueror"}
35+
AchievementUnbreakable = &Achievement{Name: "Unbreakable"}
36+
AchievementFriendInNeed = &Achievement{Name: "Friend in Need"}
37+
AchievementMortarMauler = &Achievement{Name: "Mortar Mauler"}
38+
AchievementHeroicHeist = &Achievement{Name: "Heroic Heist"}
39+
AchievementLeagueAllStar = &Achievement{Name: "League All-Star"}
40+
AchievementXBowExterminator = &Achievement{Name: "X-Bow Exterminator"}
41+
AchievementFirefighter = &Achievement{Name: "Firefighter"}
42+
AchievementWarHero = &Achievement{Name: "War Hero"}
43+
AchievementClanWarWealth = &Achievement{Name: "Clan War Wealth"}
44+
AchievementAntiArtillery = &Achievement{Name: "Anti-Artillery"}
45+
AchievementSharingIsCaring = &Achievement{Name: "Sharing is caring"}
46+
AchievementKeepYourAccountSafeOld = &Achievement{Name: "Keep Your Account Safe!", Info: "Protect your village by connecting to a social network"}
47+
AchievementMasterEngineering = &Achievement{Name: "Master Engineering"}
48+
AchievementNextGenerationModel = &Achievement{Name: "Next Generation Model"}
49+
AchievementUnBuildIt = &Achievement{Name: "Un-Build It"}
50+
AchievementChampionBuilder = &Achievement{Name: "Champion Builder"}
51+
AchievementHighGear = &Achievement{Name: "High Gear"}
52+
AchievementHiddenTreasures = &Achievement{Name: "Hidden Treasures"}
53+
AchievementGamesChampion = &Achievement{Name: "Games Champion"}
54+
AchievementDragonSlayer = &Achievement{Name: "Dragon Slayer"}
55+
AchievementWarLeagueLegend = &Achievement{Name: "War League Legend"}
56+
AchievementKeepYourAccountSafeSCID = &Achievement{Name: "Keep Your Account Safe!", Info: "Connect your account to Supercell ID for safe keeping."}
57+
AchievementWellSeasoned = &Achievement{Name: "Well Seasoned"}
58+
AchievementShatteredAndScattered = &Achievement{Name: "Shattered and Scattered"}
59+
AchievementNotSoEasyThisTime = &Achievement{Name: "Not So Easy This Time"}
60+
AchievementBustThis = &Achievement{Name: "Bust This"}
61+
AchievementSuperbWork = &Achievement{Name: "Superb Work"}
62+
AchievementSiegeSharer = &Achievement{Name: "Siege Sharer"}
63+
AchievementCounterspell = &Achievement{Name: "Counterspell"}
64+
AchievementMonolithMasher = &Achievement{Name: "Monolith Masher"}
65+
AchievementGetThoseOtherGoblins = &Achievement{Name: "Get those other Goblins!"}
66+
AchievementGetEvenMoreGoblins = &Achievement{Name: "Get even more Goblins!"}
67+
AchievementUngratefulChild = &Achievement{Name: "Ungrateful Child"}
68+
AchievementAggressiveCapitalism = &Achievement{Name: "Aggressive Capitalism"}
69+
AchievementMostValuableClanmate = &Achievement{Name: "Most Valuable Clanmate"}
6270
)

players.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package goclash
22

33
import (
4+
"errors"
45
"fmt"
56
"net/http"
67
"sync"
@@ -51,6 +52,19 @@ func (p *Player) InGameURL() string {
5152
return "https://link.clashofclans.com?action=OpenPlayerProfile&tag=" + TagURLSafe(p.Tag)
5253
}
5354

55+
// GetAchievement returns an IndexedAchievement by Achievement.Name and Achievement.Info. The index can be used to get the same achievement from other players, to make it more efficient.
56+
func (p *Player) GetAchievement(achievement *Achievement) (*IndexedAchievement, error) {
57+
for i, a := range p.Achievements {
58+
if a.Name == achievement.Name && a.Info == achievement.Info {
59+
return &IndexedAchievement{
60+
Achievement: &a,
61+
Index: i,
62+
}, nil
63+
}
64+
}
65+
return nil, errors.New("achievement not found")
66+
}
67+
5468
type Players []*Player
5569

5670
func (p Players) Tags() []string {
@@ -61,6 +75,23 @@ func (p Players) Tags() []string {
6175
return tags
6276
}
6377

78+
func (p Players) GetAchievement(achievement *Achievement) ([]*Achievement, error) {
79+
if len(p) == 0 {
80+
return nil, errors.New("no players were provided")
81+
}
82+
83+
indexed, err := p[0].GetAchievement(achievement)
84+
if err != nil {
85+
return nil, err
86+
}
87+
88+
achievements := make([]*Achievement, len(p))
89+
for i, player := range p {
90+
achievements[i] = &player.Achievements[indexed.Index]
91+
}
92+
return achievements, nil
93+
}
94+
6495
type PlayerClan struct {
6596
Tag string `json:"tag"`
6697
Level int `json:"clanLevel"`

0 commit comments

Comments
 (0)