-
Notifications
You must be signed in to change notification settings - Fork 0
/
character.go
98 lines (79 loc) · 2.08 KB
/
character.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package character
import (
"errors"
"fmt"
"io/fs"
"strings"
"gopkg.in/telebot.v3"
"gopkg.in/yaml.v3"
"github.com/lostsnow/keqing/data"
"github.com/lostsnow/keqing/pkg/elemental"
"github.com/lostsnow/keqing/pkg/i18n"
_ "github.com/lostsnow/keqing/pkg/i18n/catalog"
"github.com/lostsnow/keqing/pkg/object"
"github.com/lostsnow/keqing/pkg/star"
)
var ErrInvalidElemental = errors.New("invalid elemental")
type Character struct {
ID string `yaml:"id"`
Star star.Star `yaml:"star"`
Elemental *elemental.Elemental `yaml:"-"`
Names []string `yaml:"names"`
NameAliases []string `yaml:"nameAliases"`
}
func (c *Character) UnmarshalYAML(n *yaml.Node) error {
type C Character
type T struct {
*C `yaml:",inline"`
Elemental string `yaml:"elemental"`
}
obj := &T{C: (*C)(c)}
if err := n.Decode(obj); err != nil {
return err
}
elem := elemental.Get(obj.Elemental)
if elem == nil {
return fmt.Errorf("%w: %s", ErrInvalidElemental, obj.Elemental)
}
c.Elemental = elem
return nil
}
var (
objectMap = make(map[string]*Character)
nameAliasMap = make(map[string]string)
)
func Init() error {
return fs.WalkDir(data.Model, "model/character", func(path string, d fs.DirEntry, err error) error {
if err != nil {
return nil //nolint:nilerr
}
if d.IsDir() || !strings.HasSuffix(path, ".yml") {
return nil
}
yamlFile, err := data.Model.ReadFile(path)
if err != nil {
return nil //nolint:nilerr
}
var v Character
err = yaml.Unmarshal(yamlFile, &v)
if err != nil {
return fmt.Errorf("unmarshal model file %s failed: %w", path, err)
}
objectMap[v.ID] = &v
nameAliases := i18n.TS(v.ID)
nameAliases = append(nameAliases, v.NameAliases...)
for _, nameAlias := range nameAliases {
nameAliasMap[nameAlias] = v.ID
}
return nil
})
}
func (c *Character) Name(ctx telebot.Context) string {
return i18n.T(ctx, c.ID)
}
func ObjectMap() map[string]*Character {
return objectMap
}
func Search(name string) []*Character {
return object.Search(name, nameAliasMap, objectMap)
}