gost-plus
/
main.go
98 строк · 1.8 Кб
1package main
2
3import (
4"context"
5"fmt"
6"log/slog"
7_ "net"
8"os"
9"time"
10
11"gioui.org/app"
12_ "gioui.org/app/permission/storage"
13"gioui.org/op"
14"github.com/go-gost/core/logger"
15"github.com/go-gost/gost.plus/config"
16"github.com/go-gost/gost.plus/runner"
17"github.com/go-gost/gost.plus/runner/task"
18"github.com/go-gost/gost.plus/tunnel"
19"github.com/go-gost/gost.plus/tunnel/entrypoint"
20"github.com/go-gost/gost.plus/ui"
21"github.com/go-gost/gost.plus/ui/page"
22"github.com/go-gost/gost.plus/ui/theme"
23"github.com/go-gost/gost.plus/ui/widget"
24_ "github.com/go-gost/gost.plus/winres"
25)
26
27func main() {
28Init()
29
30go func() {
31if err := run(); err != nil {
32logger.Default().Fatal(err)
33}
34os.Exit(0)
35}()
36app.Main()
37}
38
39func run() error {
40ui := ui.NewUI()
41
42go handleEvent(ui)
43
44w := ui.Window()
45var ops op.Ops
46for {
47switch e := w.Event().(type) {
48case app.DestroyEvent:
49tunnel.SaveConfig()
50entrypoint.SaveConfig()
51return e.Err
52case app.FrameEvent:
53gtx := app.NewContext(&ops, e)
54ui.Layout(gtx)
55e.Frame(gtx.Ops)
56}
57}
58}
59
60func handleEvent(ui *ui.UI) {
61for {
62select {
63case e := <-ui.Router().Event():
64switch e.ID {
65case page.EventThemeChanged:
66slog.Debug("theme changed", "event", e.ID)
67ui.Window().Option(app.StatusColor(theme.Current().Material.Bg))
68}
69
70case e := <-runner.Event():
71switch e.TaskID {
72case runner.TaskUpdateStats:
73ui.Window().Invalidate()
74
75default:
76if e.Err != nil {
77slog.Error(fmt.Sprintf("task: %s", e.Err), "task", e.TaskID)
78ui.Router().Notify(widget.Message{
79Type: widget.Error,
80Content: e.Err.Error(),
81})
82}
83}
84}
85}
86}
87
88func Init() {
89config.Init()
90tunnel.LoadConfig()
91entrypoint.LoadConfig()
92
93runner.Exec(context.Background(), task.UpdateStats(),
94runner.WithAync(true),
95runner.WithInterval(time.Second),
96runner.WithCancel(true),
97)
98}
99