mirror of https://github.com/synctv-org/synctv
Feat: add setting cmd
parent
ff6d2faa9f
commit
6d7ad91f13
@ -0,0 +1,47 @@
|
|||||||
|
package setting
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
"github.com/synctv-org/synctv/internal/bootstrap"
|
||||||
|
"github.com/synctv-org/synctv/internal/settings"
|
||||||
|
)
|
||||||
|
|
||||||
|
var FixCmd = &cobra.Command{
|
||||||
|
Use: "fix",
|
||||||
|
Short: "fix setting",
|
||||||
|
Long: `fix setting`,
|
||||||
|
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
return bootstrap.New(bootstrap.WithContext(cmd.Context())).Add(
|
||||||
|
bootstrap.InitDiscardLog,
|
||||||
|
bootstrap.InitConfig,
|
||||||
|
bootstrap.InitDatabase,
|
||||||
|
bootstrap.InitSetting,
|
||||||
|
).Run()
|
||||||
|
},
|
||||||
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
count := 0
|
||||||
|
errorCount := 0
|
||||||
|
for k, s := range settings.Settings {
|
||||||
|
_, err := s.Interface()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("setting %s, interface error: %v\n", k, err)
|
||||||
|
err = s.SetString(s.DefaultString())
|
||||||
|
if err != nil {
|
||||||
|
errorCount++
|
||||||
|
fmt.Printf("setting %s fix error: %v\n", k, err)
|
||||||
|
} else {
|
||||||
|
count++
|
||||||
|
fmt.Printf("setting %s fix success\n", k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Printf("fix success: %d, fix error: %d\n", count, errorCount)
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
SettingCmd.AddCommand(FixCmd)
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package setting
|
||||||
|
|
||||||
|
import "github.com/spf13/cobra"
|
||||||
|
|
||||||
|
var SettingCmd = &cobra.Command{
|
||||||
|
Use: "setting",
|
||||||
|
Short: "setting",
|
||||||
|
Long: `you must first shut down the server, otherwise the changes will not take effect.`,
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
package setting
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
"github.com/synctv-org/synctv/internal/bootstrap"
|
||||||
|
"github.com/synctv-org/synctv/internal/model"
|
||||||
|
"github.com/synctv-org/synctv/internal/settings"
|
||||||
|
"gopkg.in/yaml.v3"
|
||||||
|
)
|
||||||
|
|
||||||
|
var ShowCmd = &cobra.Command{
|
||||||
|
Use: "show",
|
||||||
|
Short: "show setting",
|
||||||
|
Long: `show setting`,
|
||||||
|
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
return bootstrap.New(bootstrap.WithContext(cmd.Context())).Add(
|
||||||
|
bootstrap.InitDiscardLog,
|
||||||
|
bootstrap.InitConfig,
|
||||||
|
bootstrap.InitDatabase,
|
||||||
|
bootstrap.InitSetting,
|
||||||
|
).Run()
|
||||||
|
},
|
||||||
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
m := make(map[model.SettingGroup]map[string]any)
|
||||||
|
for g, s := range settings.GroupSettings {
|
||||||
|
if _, ok := m[g]; !ok {
|
||||||
|
m[g] = make(map[string]any)
|
||||||
|
}
|
||||||
|
for _, v := range s {
|
||||||
|
i, err := v.Interface()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("parse setting %s error: %v\ntry to fix setting\n", v.Name(), err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
m[g][v.Name()] = i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return yaml.NewEncoder(os.Stdout).Encode(m)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
SettingCmd.AddCommand(ShowCmd)
|
||||||
|
}
|
@ -1,90 +0,0 @@
|
|||||||
package setting
|
|
||||||
|
|
||||||
import (
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
"github.com/synctv-org/synctv/internal/db"
|
|
||||||
"github.com/synctv-org/synctv/internal/model"
|
|
||||||
)
|
|
||||||
|
|
||||||
type BoolSetting interface {
|
|
||||||
Setting
|
|
||||||
Set(bool) error
|
|
||||||
Get() (bool, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
type Bool struct {
|
|
||||||
name string
|
|
||||||
value string
|
|
||||||
group model.SettingGroup
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewBool(name, value string, group model.SettingGroup) *Bool {
|
|
||||||
return &Bool{
|
|
||||||
name: name,
|
|
||||||
value: value,
|
|
||||||
group: group,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *Bool) Name() string {
|
|
||||||
return b.name
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *Bool) InitRaw(s string) {
|
|
||||||
if b.value == s {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
b.value = s
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *Bool) Set(value bool) error {
|
|
||||||
if value {
|
|
||||||
if b.value == "1" {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
b.value = "1"
|
|
||||||
} else {
|
|
||||||
if b.value == "0" {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
b.value = "0"
|
|
||||||
}
|
|
||||||
return db.UpdateSettingItemValue(b.name, b.value)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *Bool) Get() (bool, error) {
|
|
||||||
return b.value == "1", nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *Bool) Raw() string {
|
|
||||||
return b.value
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *Bool) Type() model.SettingType {
|
|
||||||
return model.SettingTypeBool
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *Bool) Group() model.SettingGroup {
|
|
||||||
return b.group
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *Bool) Interface() (any, error) {
|
|
||||||
return b.Get()
|
|
||||||
}
|
|
||||||
|
|
||||||
func newBoolSetting(k, v string, g model.SettingGroup) BoolSetting {
|
|
||||||
if Settings == nil {
|
|
||||||
Settings = make(map[string]Setting)
|
|
||||||
}
|
|
||||||
if GroupsSetting == nil {
|
|
||||||
GroupsSetting = make(map[model.SettingGroup][]Setting)
|
|
||||||
}
|
|
||||||
_, loaded := Settings[k]
|
|
||||||
if loaded {
|
|
||||||
log.Fatalf("setting %s already exists", k)
|
|
||||||
}
|
|
||||||
b := NewBool(k, v, g)
|
|
||||||
Settings[k] = b
|
|
||||||
GroupsSetting[g] = append(GroupsSetting[g], b)
|
|
||||||
return b
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
package setting
|
|
||||||
|
|
||||||
import "github.com/synctv-org/synctv/internal/model"
|
|
||||||
|
|
||||||
var (
|
|
||||||
DisableCreateRoom = newBoolSetting("disable_create_room", "0", model.SettingGroupRoom)
|
|
||||||
)
|
|
@ -0,0 +1,115 @@
|
|||||||
|
package settings
|
||||||
|
|
||||||
|
import (
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
"github.com/synctv-org/synctv/internal/db"
|
||||||
|
"github.com/synctv-org/synctv/internal/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
type BoolSetting interface {
|
||||||
|
Setting
|
||||||
|
Set(bool) error
|
||||||
|
Get() (bool, error)
|
||||||
|
Default() bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type Bool struct {
|
||||||
|
name string
|
||||||
|
value string
|
||||||
|
defaultValue bool
|
||||||
|
group model.SettingGroup
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewBool(name string, value bool, group model.SettingGroup) *Bool {
|
||||||
|
b := &Bool{
|
||||||
|
name: name,
|
||||||
|
group: group,
|
||||||
|
defaultValue: value,
|
||||||
|
}
|
||||||
|
if value {
|
||||||
|
b.value = "1"
|
||||||
|
} else {
|
||||||
|
b.value = "0"
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bool) Name() string {
|
||||||
|
return b.name
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bool) Init(s string) {
|
||||||
|
if b.value == s {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
b.value = s
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bool) Default() bool {
|
||||||
|
return b.defaultValue
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bool) DefaultString() string {
|
||||||
|
if b.defaultValue {
|
||||||
|
return "1"
|
||||||
|
} else {
|
||||||
|
return "0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bool) DefaultInterface() any {
|
||||||
|
return b.Default()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bool) SetString(value string) error {
|
||||||
|
if b.value == value {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
b.value = value
|
||||||
|
return db.UpdateSettingItemValue(b.name, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bool) Set(value bool) error {
|
||||||
|
if value {
|
||||||
|
return b.SetString("1")
|
||||||
|
} else {
|
||||||
|
return b.SetString("0")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bool) Get() (bool, error) {
|
||||||
|
return b.value == "1", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bool) String() string {
|
||||||
|
return b.value
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bool) Type() model.SettingType {
|
||||||
|
return model.SettingTypeBool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bool) Group() model.SettingGroup {
|
||||||
|
return b.group
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bool) Interface() (any, error) {
|
||||||
|
return b.Get()
|
||||||
|
}
|
||||||
|
|
||||||
|
func newBoolSetting(k string, v bool, g model.SettingGroup) BoolSetting {
|
||||||
|
if Settings == nil {
|
||||||
|
Settings = make(map[string]Setting)
|
||||||
|
}
|
||||||
|
if GroupSettings == nil {
|
||||||
|
GroupSettings = make(map[model.SettingGroup][]Setting)
|
||||||
|
}
|
||||||
|
_, loaded := Settings[k]
|
||||||
|
if loaded {
|
||||||
|
log.Fatalf("setting %s already exists", k)
|
||||||
|
}
|
||||||
|
b := NewBool(k, v, g)
|
||||||
|
Settings[k] = b
|
||||||
|
GroupSettings[g] = append(GroupSettings[g], b)
|
||||||
|
return b
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package settings
|
||||||
|
|
||||||
|
import "github.com/synctv-org/synctv/internal/model"
|
||||||
|
|
||||||
|
var (
|
||||||
|
DisableCreateRoom = newBoolSetting("disable_create_room", false, model.SettingGroupRoom)
|
||||||
|
)
|
Loading…
Reference in New Issue