You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.1 KiB
55 lines
1.1 KiB
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io"
|
|
"strings"
|
|
)
|
|
|
|
type charInfo struct {
|
|
Nicks []string `json:"nicks"`
|
|
Name string `json:"name"`
|
|
Author string `json:"player"`
|
|
ShortName string `json:"first"`
|
|
}
|
|
|
|
func load(reader io.Reader) ([]charInfo, error) {
|
|
data := make(map[string]interface{})
|
|
err := json.NewDecoder(reader).Decode(&data)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
links := make(map[string]string, len(data))
|
|
infos := make([]charInfo, 0, 64)
|
|
|
|
for key, value := range data {
|
|
if info, ok := value.(map[string]interface{}); ok {
|
|
name := info["name"].(string)
|
|
author := info["player"].(string)
|
|
shortName, ok := info["first"].(string)
|
|
if !ok {
|
|
shortName = strings.SplitN(name, " ", 2)[0]
|
|
}
|
|
|
|
infos = append(infos, charInfo{
|
|
Nicks: []string{key},
|
|
Name: name,
|
|
Author: author,
|
|
ShortName: shortName,
|
|
})
|
|
} else if nick, ok := value.(string); ok {
|
|
links[key] = nick
|
|
}
|
|
}
|
|
|
|
for key, value := range links {
|
|
for i := range infos {
|
|
if infos[i].Nicks[0] == value {
|
|
infos[i].Nicks = append(infos[i].Nicks, key)
|
|
}
|
|
}
|
|
}
|
|
|
|
return infos, nil
|
|
}
|