discrawl/internal/cli/helpers.go
2026-05-05 10:07:56 +01:00

113 lines
2.4 KiB
Go

package cli
import (
"errors"
"flag"
"strings"
"time"
"github.com/openclaw/discrawl/internal/store"
)
func (r *runtime) resolveSyncGuilds(guild, guilds string) []string {
requested := append(csvList(guilds), strings.TrimSpace(guild))
requested = csvList(strings.Join(requested, ","))
if len(requested) > 0 {
return requested
}
if defaultGuild := r.cfg.EffectiveDefaultGuildID(); defaultGuild != "" {
return []string{defaultGuild}
}
return nil
}
func (r *runtime) resolveSyncGuildsAll(guild, guilds string, all bool) ([]string, error) {
if !all {
return r.resolveSyncGuilds(guild, guilds), nil
}
if len(csvList(guilds)) > 0 || strings.TrimSpace(guild) != "" {
return nil, errors.New("use either --all or --guild/--guilds")
}
return nil, nil
}
func (r *runtime) resolveSearchGuilds(guild, guilds string) []string {
requested := append(csvList(guilds), strings.TrimSpace(guild))
return csvList(strings.Join(requested, ","))
}
func directMessageGuildScope(dm bool, guild, guilds string) ([]string, error) {
if !dm {
requested := append(csvList(guilds), strings.TrimSpace(guild))
return csvList(strings.Join(requested, ",")), nil
}
if len(csvList(guilds)) > 0 || strings.TrimSpace(guild) != "" {
return nil, errors.New("use either --dm or --guild/--guilds")
}
return []string{store.DirectMessageGuildID}, nil
}
func csvList(raw string) []string {
if raw == "" {
return nil
}
parts := strings.Split(raw, ",")
out := make([]string, 0, len(parts))
seen := map[string]struct{}{}
for _, part := range parts {
part = strings.TrimSpace(part)
if part == "" {
continue
}
if _, ok := seen[part]; ok {
continue
}
seen[part] = struct{}{}
out = append(out, part)
}
return out
}
func flagPassed(fs *flag.FlagSet, name string) bool {
found := false
fs.Visit(func(f *flag.Flag) {
if f.Name == name {
found = true
}
})
return found
}
func mustDuration(raw string) time.Duration {
d, err := time.ParseDuration(raw)
if err != nil {
return 6 * time.Hour
}
return d
}
func usageErr(err error) error {
return &cliError{code: 2, err: err}
}
func configErr(err error) error {
return &cliError{code: 3, err: err}
}
func authErr(err error) error {
return &cliError{code: 4, err: err}
}
func dbErr(err error) error {
return &cliError{code: 5, err: err}
}
func firstNonEmpty(items ...string) string {
for _, item := range items {
if strings.TrimSpace(item) != "" {
return item
}
}
return ""
}