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