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
4 changes: 4 additions & 0 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,10 @@ func (c *Client) Profile() *ProfileService {
return &ProfileService{client: c}
}

func (c *Client) SC2() *SC2Service {
return &SC2Service{client: c}
}

// NewRequest creates an API request. A relative URL can be provided in urlStr,
// in which case it is resolved relative to the BaseURL of the Client.
// Relative URLs should always be specified without a preceding slash. If
Expand Down
24 changes: 12 additions & 12 deletions profile_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,24 +113,24 @@ func TestProfileService_SC2(t *testing.T) {
if actual.Characters == nil {
t.Fatal("err: This user has no Starcraft 2 profile.")
}
want := sc2.SC2Character{ID: 1234567,
want := SC2Character{ID: 1234567,
Realm: 1,
DisplayName: "foobar",
ClanName: "foobar",
ClanTag: "foobar",
ProfilePath: "/profile/1234567/1/foobar/",
Portrait: sc2.CharacterImage{-10, -10, 10, 10, 10,
Portrait: CharacterImage{-10, -10, 10, 10, 10,
"http://media.blizzard.com/sc2/portraits/dummy.jpg"},
Career: sc2.Career{"PROTOSS", 0, 0, 0,
Career: Career{"PROTOSS", 0, 0, 0,
"DIAMOND", 0, 100},
SwarmLevels: sc2.SwarmLevels{10,
sc2.Level{1, 1000, 0},
sc2.Level{2, 1000, 0},
sc2.Level{3, 1000, 0}},
Season: sc2.Season{123, 1, 2017, 0},
Rewards: sc2.Rewards{[]int{12345678, 12345678}, []int{12345678, 12345678}},
Achievements: sc2.Achievements{sc2.Points{1234},
[]sc2.Achievement{sc2.Achievement{123456789, 123456789}}},
SwarmLevels: SwarmLevels{10,
Level{1, 1000, 0},
Level{2, 1000, 0},
Level{3, 1000, 0}},
Season: Season{123, 1, 2017, 0},
Rewards: Rewards{[]int{12345678, 12345678}, []int{12345678, 12345678}},
Achievements: Achievements{Points{1234},
[]Achievement{Achievement{123456789, 123456789}}},
}
if !reflect.DeepEqual(actual.Characters[0], want) {
t.Fatalf("returned %+v, want %+v", actual.Characters[0], want)
Expand All @@ -151,7 +151,7 @@ func TestProfileService_WoW(t *testing.T) {
if actual.Characters == nil {
t.Fatal("err: This user has no World of Warcraft characters.")
}
want := wow.WoWCharacter{
want := WoWCharacter{
Name: "foobar",
Realm: "foobar",
BattleGroup: "Foo",
Expand Down
5 changes: 5 additions & 0 deletions sc2.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package bnet

// SC2Service has Startcraft 2 related APIs.
type SC2Service struct {
client *Client
}

// TODO: Create a 'Campaign' struct to represent a character's campaign progress.

// CharacterImage is a character's portrait or avatar.
Expand Down
20 changes: 17 additions & 3 deletions sc2/profile.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,25 @@
package sc2

import (
"fmt"
"github.com/nmccrory/go-bnet"
)

// SC2Service has Startcraft 2 related APIs.
type SC2Service struct {
client *bnet.Client
// Profile() calls the /sc2/profile/:id/:region/:name endpoint to
// retrieve a user's Starcraft 2 profile. See Battle.net docs.
func (s *SC2Service) Profile(id int, region int, name string) (*bnet.SC2Profile, *bnet.Response, error) {
endpoint := fmt.Sprintf("sc2/profile/%d/%d/%s", id, region, name)
req, err := s.client.NewRequest("GET", endpoint, nil)
if err != nil {
return nil, nil, err
}

var profile bnet.SC2Profile
resp, err := s.client.Do(req, &profile)
if err != nil {
return nil, resp, err
}

return &profile, resp, nil
}

117 changes: 117 additions & 0 deletions sc2/profile_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
package sc2

import (
"fmt"
"net/http"
"reflect"
"testing"
"github.com/gorilla/mux

"github.com/nmccrory/go-bnet/sc2"
"github.com/aws/aws-sdk-go/aws/client"
)

const sc2ProfileResp = `{ "characters":
[{
"id": 1234567,
"realm": 1,
"displayName": "foobar",
"clanName": "foobar",
"clanTag": "foobar",
"profilePath": "/profile/1234567/1/foobar/",
"portrait": {
"x": -10,
"y": -10,
"w": 10,
"h": 10,
"offset": 10,
"url": "http://media.blizzard.com/sc2/portraits/dummy.jpg"
},
"career": {
"primaryRace": "PROTOSS",
"terranWins": 0,
"protossWins": 0,
"zergWins": 0,
"highest1v1Rank": "DIAMOND",
"seasonTotalGames": 0,
"careerTotalGames": 100
},
"swarmLevels": {
"level": 10,
"terran": {
"level": 1,
"totalLevelXP": 1000,
"currentLevelXP": 0
},
"zerg": {
"level": 2,
"totalLevelXP": 1000,
"currentLevelXP": 0
},
"protoss": {
"level": 3,
"totalLevelXP": 1000,
"currentLevelXP": 0
}
},
"campaign": {},
"season": {
"seasonId": 123,
"seasonNumber": 1,
"seasonYear": 2017,
"totalGamesThisSeason": 0
},
"rewards": {
"selected": [12345678, 12345678],
"earned": [12345678, 12345678]
},
"achievements": {
"points": {
"totalPoints": 1234,
"categoryPoints": {}
},
"achievements": [{
"achievementId": 123456789,
"completionDate": 123456789
}]
}
}]
}`

func TestSC2Service_Profile(t *testing.T) {
setup()
defer teardown()

mux.HandleFunc("/account/user", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")
fmt.Fprint(w, sc2ProfileResp)
})

actual, _, err := client.Account().User()
if err != nil {
t.Fatalf("err: %s", err)
}

want := SC2Character{ID: 1234567,
Realm: 1,
DisplayName: "foobar",
ClanName: "foobar",
ClanTag: "foobar",
ProfilePath: "/profile/1234567/1/foobar/",
Portrait: CharacterImage{-10, -10, 10, 10, 10,
"http://media.blizzard.com/sc2/portraits/dummy.jpg"},
Career: Career{"PROTOSS", 0, 0, 0,
"DIAMOND", 0, 100},
SwarmLevels: SwarmLevels{10,
Level{1, 1000, 0},
Level{2, 1000, 0},
Level{3, 1000, 0}},
Season: Season{123, 1, 2017, 0},
Rewards: Rewards{[]int{12345678, 12345678}, []int{12345678, 12345678}},
Achievements: Achievements{Points{1234},
[]Achievement{Achievement{123456789, 123456789}}},
}
if !reflect.DeepEqual(actual, want) {
t.Fatalf("returned %+v, want %+v", actual, want)
}
}