Files

144 lines
3.0 KiB
Go
Raw Permalink Normal View History

2024-09-26 23:16:20 +02:00
package extension
import (
2024-10-02 21:17:59 +02:00
"encoding/json"
2024-09-30 21:10:33 +02:00
"github.com/hiddify/hiddify-core/config"
"github.com/hiddify/hiddify-core/extension/ui"
2024-09-26 23:16:20 +02:00
pb "github.com/hiddify/hiddify-core/hiddifyrpc"
2024-09-30 21:10:33 +02:00
"github.com/hiddify/hiddify-core/v2/db"
"github.com/jellydator/validation"
"github.com/sagernet/sing-box/log"
"github.com/sagernet/sing-box/option"
2024-09-26 23:16:20 +02:00
)
type Extension interface {
GetUI() ui.Form
2024-09-30 21:10:33 +02:00
SubmitData(button string, data map[string]string) error
Close() error
UpdateUI(form ui.Form) error
BeforeAppConnect(hiddifySettings *config.HiddifyOptions, singconfig *option.Options) error
StoreData()
2024-09-26 23:16:20 +02:00
init(id string)
getQueue() chan *pb.ExtensionResponse
getId() string
}
type Base[T any] struct {
2024-09-26 23:16:20 +02:00
id string
// responseStream grpc.ServerStreamingServer[pb.ExtensionResponse]
queue chan *pb.ExtensionResponse
Data T
2024-09-26 23:16:20 +02:00
}
// func (b *Base) mustEmbdedBaseExtension() {
2024-09-26 23:16:20 +02:00
// }
func (b *Base[T]) BeforeAppConnect(hiddifySettings *config.HiddifyOptions, singconfig *option.Options) error {
return nil
}
func (b *Base[T]) StoreData() {
2024-09-30 21:10:33 +02:00
table := db.GetTable[extensionData]()
2024-10-02 21:17:59 +02:00
ed, err := table.Get(b.id)
if err != nil {
log.Warn("error: ", err)
return
}
res, err := json.Marshal(b.Data)
if err != nil {
log.Warn("error: ", err)
return
}
ed.JsonData = (res)
table.UpdateInsert(ed)
}
func (b *Base[T]) init(id string) {
2024-09-26 23:16:20 +02:00
b.id = id
b.queue = make(chan *pb.ExtensionResponse, 1)
2024-09-30 21:10:33 +02:00
table := db.GetTable[extensionData]()
2024-10-02 21:17:59 +02:00
extdata, err := table.Get(b.id)
2024-09-30 21:10:33 +02:00
if err != nil {
log.Warn("error: ", err)
return
}
if extdata == nil {
log.Warn("extension data not found ", id)
return
}
2024-10-02 21:17:59 +02:00
if extdata.JsonData != nil {
var t T
if err := json.Unmarshal(extdata.JsonData, &t); err != nil {
log.Warn("error loading data of ", id, " : ", err)
2024-09-30 21:10:33 +02:00
} else {
2024-10-02 21:17:59 +02:00
b.Data = t
2024-09-30 21:10:33 +02:00
}
}
2024-09-26 23:16:20 +02:00
}
func (b *Base[T]) getQueue() chan *pb.ExtensionResponse {
2024-09-26 23:16:20 +02:00
return b.queue
}
func (b *Base[T]) getId() string {
2024-09-26 23:16:20 +02:00
return b.id
}
func (e *Base[T]) ShowMessage(title string, msg string) error {
return e.ShowDialog(ui.Form{
Title: title,
Description: msg,
2024-09-30 21:27:18 +02:00
Fields: [][]ui.FormField{
{{
Type: ui.FieldButton,
Key: ui.ButtonDialogOk,
2024-09-30 21:27:18 +02:00
Label: "Ok",
}},
},
// Buttons: []string{ui.Button_Ok},
})
}
func (p *Base[T]) UpdateUI(form ui.Form) error {
2024-09-26 23:16:20 +02:00
p.queue <- &pb.ExtensionResponse{
ExtensionId: p.id,
Type: pb.ExtensionResponseType_UPDATE_UI,
JsonUi: form.ToJSON(),
}
return nil
}
func (p *Base[T]) ShowDialog(form ui.Form) error {
2024-09-26 23:16:20 +02:00
p.queue <- &pb.ExtensionResponse{
ExtensionId: p.id,
Type: pb.ExtensionResponseType_SHOW_DIALOG,
JsonUi: form.ToJSON(),
}
// log.Printf("Updated UI for extension %s: %s", err, p.id)
return nil
}
func (base *Base[T]) ValName(fieldPtr interface{}) string {
val, err := validation.ErrorFieldName(&base.Data, fieldPtr)
if err != nil {
log.Warn(err)
return ""
2024-09-26 23:16:20 +02:00
}
if val == "" {
log.Warn("Field not found")
return ""
2024-09-26 23:16:20 +02:00
}
return val
}
2024-09-26 23:16:20 +02:00
type ExtensionFactory struct {
Id string
Title string
Description string
Builder func() Extension
2024-09-26 23:16:20 +02:00
}