/
portals.go
133 lines (111 loc) · 3.73 KB
/
portals.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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package portals
import (
"strings"
"unicode"
"github.com/bwmarrin/discordgo"
"github.com/kaellybot/kaelly-discord/models/constants"
"github.com/kaellybot/kaelly-discord/models/entities"
"github.com/kaellybot/kaelly-discord/repositories/areas"
"github.com/kaellybot/kaelly-discord/repositories/dimensions"
"github.com/kaellybot/kaelly-discord/repositories/subareas"
"github.com/kaellybot/kaelly-discord/repositories/transports"
"github.com/kaellybot/kaelly-discord/utils/translators"
"github.com/rs/zerolog/log"
"golang.org/x/text/runes"
"golang.org/x/text/transform"
"golang.org/x/text/unicode/norm"
)
func New(dimensionRepo dimensions.Repository, areaRepo areas.Repository,
subAreaRepo subareas.Repository, transportTypeRepo transports.Repository) (*Impl, error) {
// dimensions
dimEntities, err := dimensionRepo.GetDimensions()
if err != nil {
return nil, err
}
log.Info().
Int(constants.LogEntityCount, len(dimEntities)).
Msgf("Dimensions loaded")
dimensions := make(map[string]entities.Dimension)
for _, dimension := range dimEntities {
dimensions[dimension.ID] = dimension
}
// area
areaEntities, err := areaRepo.GetAreas()
if err != nil {
return nil, err
}
log.Info().
Int(constants.LogEntityCount, len(areaEntities)).
Msgf("Areas loaded")
areas := make(map[string]entities.Area)
for _, area := range areaEntities {
areas[area.ID] = area
}
// sub area
subAreaEntities, err := subAreaRepo.GetSubAreas()
if err != nil {
return nil, err
}
log.Info().
Int(constants.LogEntityCount, len(subAreaEntities)).
Msgf("Sub Areas loaded")
subAreas := make(map[string]entities.SubArea)
for _, subArea := range subAreaEntities {
subAreas[subArea.ID] = subArea
}
// transport type
transportTypeEntities, err := transportTypeRepo.GetTransportTypes()
if err != nil {
return nil, err
}
log.Info().
Int(constants.LogEntityCount, len(transportTypeEntities)).
Msgf("Transport types loaded")
transportTypes := make(map[string]entities.TransportType)
for _, transportType := range transportTypeEntities {
transportTypes[transportType.ID] = transportType
}
return &Impl{
transformer: transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC),
dimensions: dimensions,
dimensionRepo: dimensionRepo,
areas: areas,
areaRepo: areaRepo,
subAreas: subAreas,
subAreaRepo: subAreaRepo,
transportTypes: transportTypes,
transportTypeRepo: transportTypeRepo,
}, nil
}
func (service *Impl) GetDimension(id string) (entities.Dimension, bool) {
dimension, found := service.dimensions[id]
return dimension, found
}
func (service *Impl) FindDimensions(name string, locale discordgo.Locale) []entities.Dimension {
dimensionsFound := make([]entities.Dimension, 0)
cleanedName, _, err := transform.String(service.transformer, strings.ToLower(name))
if err != nil {
log.Error().Err(err).Msgf("Cannot normalize dimension name, returning empty dimension list")
return dimensionsFound
}
for _, dimension := range service.dimensions {
currentCleanedName, _, errStr := transform.String(service.transformer,
strings.ToLower(translators.GetEntityLabel(dimension, locale)))
if errStr == nil && strings.HasPrefix(currentCleanedName, cleanedName) {
dimensionsFound = append(dimensionsFound, dimension)
}
}
return dimensionsFound
}
func (service *Impl) GetArea(id string) (entities.Area, bool) {
area, found := service.areas[id]
return area, found
}
func (service *Impl) GetSubArea(id string) (entities.SubArea, bool) {
subArea, found := service.subAreas[id]
return subArea, found
}
func (service *Impl) GetTransportType(id string) (entities.TransportType, bool) {
transportType, found := service.transportTypes[id]
return transportType, found
}