package player // Code generated by viewgen; DO NOT EDIT. import ( "longheng.io/server/internal/platform/readmodel" "sort" "strings" "time" ) type PlayerSummary struct { AccountID string `json:"account_id"` RoleID string `json:"role_id"` Name string `json:"name"` Level int `json:"level"` State string `json:"state"` Online bool `json:"online"` Version int64 `json:"version"` UpdatedAt time.Time `json:"updated_at"` SavedAt time.Time `json:"saved_at,omitempty"` } type PlayerSummaryQuery struct { AccountIDs []string `json:"account_ids,omitempty"` RoleIDs []string `json:"role_ids,omitempty"` NameContains string `json:"name_contains,omitempty"` State string `json:"state,omitempty"` OnlineOnly bool `json:"online_only,omitempty"` Limit int `json:"limit,omitempty"` } const redisPlayerSumField = "summary" const redisPlayerSumSet = "accounts" const redisPlayerSumIndex = "role" const redisPlayerSumNS = "player_summary" func NewPlayerSummary(profile Profile) PlayerSummary { state := strings.TrimSpace(profile.State) return PlayerSummary{ AccountID: profile.AccountID, RoleID: profile.RoleID, Name: profile.Name, Level: profile.Level, State: state, Online: state == "online" || state == "active", Version: profile.Version, UpdatedAt: profile.UpdatedAt, SavedAt: profile.SavedAt, } } func summaryMatches(summary PlayerSummary, query PlayerSummaryQuery) bool { query.NameContains = strings.ToLower(strings.TrimSpace(query.NameContains)) if query.NameContains != "" && !strings.Contains(strings.ToLower(summary.Name), query.NameContains) { return false } query.State = strings.TrimSpace(query.State) if query.State != "" && summary.State != query.State { return false } if query.OnlineOnly && !summary.Online { return false } return true } func sortPlayerSummaries(summaries []PlayerSummary) { sort.Slice(summaries, func(i, j int) bool { if summaries[i].AccountID == summaries[j].AccountID { return summaries[i].RoleID < summaries[j].RoleID } return summaries[i].AccountID < summaries[j].AccountID }) } func filterSummaries(summaries []PlayerSummary, query PlayerSummaryQuery) []PlayerSummary { out := make([]PlayerSummary, 0, len(summaries)) for _, summary := range summaries { if summaryMatches(summary, query) { out = append(out, clonePlayerSummary(summary)) } } sortPlayerSummaries(out) if query.Limit > 0 && len(out) > query.Limit { out = out[:query.Limit] } return out } func clonePlayerSummary(summary PlayerSummary) PlayerSummary { return summary } func normPlayerSummaryID(summary PlayerSummary) PlayerSummary { summary.AccountID = strings.TrimSpace(summary.AccountID) summary.RoleID = strings.TrimSpace(summary.RoleID) return summary } func summaryReadOpts() readmodel.ModelOptions[PlayerSummary, PlayerSummaryQuery] { return readmodel.ModelOptions[PlayerSummary, PlayerSummaryQuery]{ PrimaryID: func(summary PlayerSummary) string { return summary.AccountID }, SecondaryID: func(summary PlayerSummary) string { return summary.RoleID }, Normalize: normPlayerSummaryID, Clone: clonePlayerSummary, Match: summaryMatches, Less: func(left, right PlayerSummary) bool { if left.AccountID == right.AccountID { return left.RoleID < right.RoleID } return left.AccountID < right.AccountID }, QueryPrimaryIDs: func(query PlayerSummaryQuery) []string { return query.AccountIDs }, QuerySecondaryIDs: func(query PlayerSummaryQuery) []string { return query.RoleIDs }, QueryLimit: func(query PlayerSummaryQuery) int { return query.Limit }, } }