mirror of https://github.com/synctv-org/synctv
Feat: setting interface and boot strap
parent
3085eb800b
commit
ff6d2faa9f
@ -0,0 +1,11 @@
|
|||||||
|
package bootstrap
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/synctv-org/synctv/internal/setting"
|
||||||
|
)
|
||||||
|
|
||||||
|
func InitSetting(ctx context.Context) error {
|
||||||
|
return setting.Init()
|
||||||
|
}
|
||||||
@ -1,150 +0,0 @@
|
|||||||
package op
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/synctv-org/synctv/internal/db"
|
|
||||||
"github.com/synctv-org/synctv/internal/model"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
BoolSettings map[string]BoolSetting
|
|
||||||
)
|
|
||||||
|
|
||||||
type Setting interface {
|
|
||||||
Name() string
|
|
||||||
InitRaw(string)
|
|
||||||
Raw() string
|
|
||||||
Type() model.SettingType
|
|
||||||
Group() model.SettingGroup
|
|
||||||
Interface() (any, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetSettingByGroup(group model.SettingGroup) []Setting {
|
|
||||||
return settingByGroup(group, ToSettings(BoolSettings)...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func settingByGroup(group model.SettingGroup, settings ...Setting) []Setting {
|
|
||||||
s := make([]Setting, 0, len(settings))
|
|
||||||
for _, bs := range settings {
|
|
||||||
if bs.Group() == group {
|
|
||||||
s = append(s, bs)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
func ToSettings[s Setting](settings ...map[string]s) []Setting {
|
|
||||||
l := 0
|
|
||||||
for _, v := range settings {
|
|
||||||
l += len(v)
|
|
||||||
}
|
|
||||||
var ss []Setting = make([]Setting, 0, l)
|
|
||||||
for _, v := range settings {
|
|
||||||
for _, s := range v {
|
|
||||||
ss = append(ss, s)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ss
|
|
||||||
}
|
|
||||||
|
|
||||||
type BoolSetting interface {
|
|
||||||
Setting
|
|
||||||
Set(bool) error
|
|
||||||
Get() (bool, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
type Bool struct {
|
|
||||||
name string
|
|
||||||
value string
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewBool(name, value string) *Bool {
|
|
||||||
return &Bool{
|
|
||||||
name: name,
|
|
||||||
value: value,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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 model.SettingGroupRoom
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *Bool) Interface() (any, error) {
|
|
||||||
return b.Get()
|
|
||||||
}
|
|
||||||
|
|
||||||
type Int64Setting interface {
|
|
||||||
Set(int64) error
|
|
||||||
Get() (int64, error)
|
|
||||||
Raw() string
|
|
||||||
}
|
|
||||||
|
|
||||||
type Float64Setting interface {
|
|
||||||
Set(float64) error
|
|
||||||
Get() (float64, error)
|
|
||||||
Raw() string
|
|
||||||
}
|
|
||||||
|
|
||||||
type StringSetting interface {
|
|
||||||
Set(string) error
|
|
||||||
Get() (string, error)
|
|
||||||
Raw() string
|
|
||||||
}
|
|
||||||
|
|
||||||
func newRegBoolSetting(k, v string) BoolSetting {
|
|
||||||
b := NewBool(k, v)
|
|
||||||
if BoolSettings == nil {
|
|
||||||
BoolSettings = make(map[string]BoolSetting)
|
|
||||||
}
|
|
||||||
BoolSettings[k] = b
|
|
||||||
return b
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetSettingType(name string) (model.SettingType, bool) {
|
|
||||||
s, ok := BoolSettings[name]
|
|
||||||
if !ok {
|
|
||||||
return "", false
|
|
||||||
}
|
|
||||||
return s.Type(), true
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
DisableCreateRoom = newRegBoolSetting("disable_create_room", "0")
|
|
||||||
)
|
|
||||||
@ -0,0 +1,90 @@
|
|||||||
|
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
|
||||||
|
}
|
||||||
@ -0,0 +1,126 @@
|
|||||||
|
package setting
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
"github.com/synctv-org/synctv/internal/db"
|
||||||
|
"github.com/synctv-org/synctv/internal/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
Settings map[string]Setting
|
||||||
|
GroupsSetting map[model.SettingGroup][]Setting
|
||||||
|
)
|
||||||
|
|
||||||
|
type Setting interface {
|
||||||
|
Name() string
|
||||||
|
InitRaw(string)
|
||||||
|
Raw() string
|
||||||
|
Type() model.SettingType
|
||||||
|
Group() model.SettingGroup
|
||||||
|
Interface() (any, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetValue(name string, value any) error {
|
||||||
|
s, ok := Settings[name]
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("setting %s not found", name)
|
||||||
|
}
|
||||||
|
return SetSettingValue(s, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetSettingValue(s Setting, value any) error {
|
||||||
|
switch s.Type() {
|
||||||
|
case model.SettingTypeBool:
|
||||||
|
i, ok := s.(BoolSetting)
|
||||||
|
if !ok {
|
||||||
|
log.Fatalf("setting %s is not bool", s.Name())
|
||||||
|
}
|
||||||
|
v, ok := value.(bool)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("setting %s, value %v is not bool", s.Name(), value)
|
||||||
|
}
|
||||||
|
i.Set(v)
|
||||||
|
case model.SettingTypeInt64:
|
||||||
|
i, ok := s.(Int64Setting)
|
||||||
|
if !ok {
|
||||||
|
log.Fatalf("setting %s is not int64", s.Name())
|
||||||
|
}
|
||||||
|
v, ok := value.(int64)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("setting %s, value %v is not int64", s.Name(), value)
|
||||||
|
}
|
||||||
|
i.Set(v)
|
||||||
|
case model.SettingTypeFloat64:
|
||||||
|
i, ok := s.(Float64Setting)
|
||||||
|
if !ok {
|
||||||
|
log.Fatalf("setting %s is not float64", s.Name())
|
||||||
|
}
|
||||||
|
v, ok := value.(float64)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("setting %s, value %v is not float64", s.Name(), value)
|
||||||
|
}
|
||||||
|
i.Set(v)
|
||||||
|
case model.SettingTypeString:
|
||||||
|
i, ok := s.(StringSetting)
|
||||||
|
if !ok {
|
||||||
|
log.Fatalf("setting %s is not string", s.Name())
|
||||||
|
}
|
||||||
|
v, ok := value.(string)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("setting %s, value %v is not string", s.Name(), value)
|
||||||
|
}
|
||||||
|
i.Set(v)
|
||||||
|
default:
|
||||||
|
log.Fatalf("unknown setting type: %s", s.Type())
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ToSettings[s Setting](settings map[string]s) []Setting {
|
||||||
|
var ss []Setting = make([]Setting, 0, len(settings))
|
||||||
|
for _, v := range settings {
|
||||||
|
ss = append(ss, v)
|
||||||
|
}
|
||||||
|
return ss
|
||||||
|
}
|
||||||
|
|
||||||
|
type Int64Setting interface {
|
||||||
|
Set(int64) error
|
||||||
|
Get() (int64, error)
|
||||||
|
Raw() string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Float64Setting interface {
|
||||||
|
Set(float64) error
|
||||||
|
Get() (float64, error)
|
||||||
|
Raw() string
|
||||||
|
}
|
||||||
|
|
||||||
|
type StringSetting interface {
|
||||||
|
Set(string) error
|
||||||
|
Get() (string, error)
|
||||||
|
Raw() string
|
||||||
|
}
|
||||||
|
|
||||||
|
func Init() error {
|
||||||
|
return initSettings(ToSettings(Settings)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func initSettings(i ...Setting) error {
|
||||||
|
for _, b := range i {
|
||||||
|
s := &model.Setting{
|
||||||
|
Name: b.Name(),
|
||||||
|
Value: b.Raw(),
|
||||||
|
Type: b.Type(),
|
||||||
|
Group: b.Group(),
|
||||||
|
}
|
||||||
|
err := db.FirstOrCreateSettingItemValue(s)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
b.InitRaw(s.Value)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
package setting
|
||||||
|
|
||||||
|
import "github.com/synctv-org/synctv/internal/model"
|
||||||
|
|
||||||
|
var (
|
||||||
|
DisableCreateRoom = newBoolSetting("disable_create_room", "0", model.SettingGroupRoom)
|
||||||
|
)
|
||||||
Loading…
Reference in New Issue