diff --git a/src/TibiaCharactersCharacter.go b/src/TibiaCharactersCharacter.go
index df03b710..ba965449 100644
--- a/src/TibiaCharactersCharacter.go
+++ b/src/TibiaCharactersCharacter.go
@@ -142,7 +142,7 @@ func fansiteUnixToDate(ts int64) string {
if ts <= 0 {
return ""
}
- return time.Unix(ts, 0).UTC().Format("2006-01-02")
+ return time.Unix(ts, 0).In(berlinLocation).Format("2006-01-02")
}
// fansiteDeathReason computes a human-readable death reason sentence for the
diff --git a/src/TibiaCharactersCharacter_test.go b/src/TibiaCharactersCharacter_test.go
index c7571cb9..ee0e6462 100644
--- a/src/TibiaCharactersCharacter_test.go
+++ b/src/TibiaCharactersCharacter_test.go
@@ -10,6 +10,7 @@ import (
"reflect"
"strings"
"testing"
+ "time"
"github.com/gin-gonic/gin"
"github.com/stretchr/testify/assert"
@@ -25,6 +26,7 @@ func TestFansiteUnixConversions(t *testing.T) {
assert.Equal(t, "", fansiteUnixToDate(0))
assert.Equal(t, "", fansiteUnixToDate(-1))
assert.Equal(t, "2021-12-24", fansiteUnixToDate(1640339536))
+ assert.Equal(t, "2026-10-20", fansiteUnixToDate(time.Date(2026, time.October, 19, 22, 0, 0, 0, time.UTC).Unix()))
}
func TestFansiteCharacterJSONOptionalFields(t *testing.T) {
@@ -222,6 +224,41 @@ func TestFansiteCharacterJSONFixtures(t *testing.T) {
}
}
+func TestCharacterWillicusHouseDates(t *testing.T) {
+ expected := []Houses{
+ {Name: "Alai Flats, Flat 05", Town: "Thais", Paid: "2026-10-25", HouseID: 10305},
+ {Name: "Alai Flats, Flat 04", Town: "Thais", Paid: "2026-10-22", HouseID: 10304},
+ {Name: "Alai Flats, Flat 02", Town: "Thais", Paid: "2026-11-11", HouseID: 10302},
+ }
+
+ for _, extension := range []string{"html", "json"} {
+ t.Run(extension, func(t *testing.T) {
+ data, err := static.TestFiles.ReadFile("testdata/characters/Willicus." + extension)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ response, err := TibiaCharactersCharacterImpl(string(data), "")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ assert.Equal(t, "Willicus", response.Character.CharacterInfo.Name)
+ assert.Equal(t, expected, response.Character.CharacterInfo.Houses)
+
+ if extension == "json" {
+ var raw fansiteAPICharacterResponse
+ if err := json.Unmarshal(data, &raw); err != nil {
+ t.Fatal(err)
+ }
+ for i, house := range raw.CharacterAdminInformation.Houses {
+ assert.Equal(t, expected[i].Paid, time.Unix(house.PaidUntil, 0).UTC().Format("2006-01-02"))
+ }
+ }
+ })
+ }
+}
+
func TestCharacterTrollefar(t *testing.T) {
testCases := []struct {
name string
diff --git a/src/static/testdata/characters/Willicus.html b/src/static/testdata/characters/Willicus.html
new file mode 100644
index 00000000..c174c772
--- /dev/null
+++ b/src/static/testdata/characters/Willicus.html
@@ -0,0 +1,822 @@
+
+
+
+
+ Tibia - Free Multiplayer Online Role Playing Game - Community
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
NO - internet explorer
+
NEW - internet explorer
+
OLD - internet explorer
+
+
+
+
+
+
+
+
+

+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
| Name: | Willicus | | Title: | Silencer (38 titles unlocked) | | Sex: | male | | Vocation: | Royal Paladin | | Level: | 660 | | Achievement Points: | 901 | | World: | Antica | | Residence: | Thais | | House: | Alai Flats, Flat 05 (Thais) is paid until Oct 25 2026 | | House: | Alai Flats, Flat 04 (Thais) is paid until Oct 22 2026 | | House: | Alai Flats, Flat 02 (Thais) is paid until Nov 11 2026 | | Last Login: | Oct 22 2026, 19:26:47 CEST | | Account Status: | Premium Account | | |
| There are no achievements set to be displayed for this character. | | |
Character Deaths (Last 30 Days)
| |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+ 
+
diff --git a/src/static/testdata/characters/Willicus.json b/src/static/testdata/characters/Willicus.json
new file mode 100644
index 00000000..6810e5ff
--- /dev/null
+++ b/src/static/testdata/characters/Willicus.json
@@ -0,0 +1 @@
+{"characterGameInformation":{"characterName":"Willicus","level":660,"vocation":"paladin","isPromoted":true,"sex":"male","world":"Antica","residence":"Thais","deletedTimestamp":0,"comment":null,"wasRecentlyTradedAndNotRenamed":false,"spouse":null,"formerWorld":null,"lastLogin":1792690007,"isPremium":true,"formerNames":[],"guildName":null,"guildRank":null,"achievementPoints":901},"characterDeathsData":{"tooMany":false,"deaths":[{"date":1792703657,"level":660,"murderers":[{"name":"Flexirock","tradedMurderer":false,"assist":false,"playerCharacter":true,"remark":null},{"name":"Expresco","tradedMurderer":false,"assist":false,"playerCharacter":true,"remark":null},{"name":"Mas sari","tradedMurderer":false,"assist":false,"playerCharacter":true,"remark":null},{"name":"Xanaduu","tradedMurderer":false,"assist":false,"playerCharacter":true,"remark":null},{"name":"King spanish","tradedMurderer":false,"assist":false,"playerCharacter":true,"remark":null},{"name":"Karciu","tradedMurderer":false,"assist":false,"playerCharacter":true,"remark":null},{"name":"Heavy Hax","tradedMurderer":false,"assist":false,"playerCharacter":true,"remark":null},{"name":"Kaplini oro Ekiem","tradedMurderer":false,"assist":false,"playerCharacter":true,"remark":null}]}]},"characterAdminInformation":{"characterTitle":"Silencer","characterTitleCount":38,"displayedAchievements":[],"houses":[{"houseId":10305,"name":"Alai Flats, Flat 05","town":"Thais","paidUntil":1792915507},{"houseId":10304,"name":"Alai Flats, Flat 04","town":"Thais","paidUntil":1792657077},{"houseId":10302,"name":"Alai Flats, Flat 02","town":"Thais","paidUntil":1794384340}]},"characterAccountInformation":null,"accountCharacters":null}