discordo/cmd/application.go
2025-12-09 01:35:40 -05:00

78 lines
1.6 KiB
Go

package cmd
import (
"log/slog"
"github.com/ayn2op/discordo/internal/config"
"github.com/ayn2op/discordo/internal/login"
"github.com/ayn2op/tview"
"github.com/gdamore/tcell/v3"
"golang.design/x/clipboard"
)
type application struct {
*tview.Application
chatView *chatView
cfg *config.Config
}
func newApplication(cfg *config.Config) *application {
tview.Styles = tview.Theme{}
app := &application{
Application: tview.NewApplication(),
cfg: cfg,
}
if err := clipboard.Init(); err != nil {
slog.Error("failed to init clipboard", "err", err)
}
app.
EnableMouse(cfg.Mouse).
SetInputCapture(app.onInputCapture).
EnablePaste(true)
return app
}
func (a *application) run(token string) error {
if token == "" {
loginForm := login.NewForm(a.Application, a.cfg, func(token string) {
if err := a.run(token); err != nil {
slog.Error("failed to run application", "err", err)
}
})
a.SetRoot(loginForm, true)
} else {
a.chatView = newChatView(a.Application, a.cfg)
if err := openState(token); err != nil {
return err
}
a.SetRoot(a.chatView, true)
}
return a.Run()
}
func (a *application) quit() {
if discordState != nil {
if err := discordState.Close(); err != nil {
slog.Error("failed to close the session", "err", err)
}
}
a.Stop()
}
func (a *application) onInputCapture(event *tcell.EventKey) *tcell.EventKey {
switch event.Name() {
case a.cfg.Keys.Quit:
a.quit()
return nil
case "Ctrl+C":
// https://github.com/ayn2op/tview/blob/a64fc48d7654432f71922c8b908280cdb525805c/application.go#L153
return tcell.NewEventKey(tcell.KeyCtrlC, "", tcell.ModNone)
}
return event
}