| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- package cmd
- import (
- "fmt"
- "log/slog"
- "github.com/ayn2op/discordo/internal/clipboard"
- "github.com/ayn2op/discordo/internal/config"
- "github.com/ayn2op/discordo/internal/consts"
- "github.com/ayn2op/discordo/internal/login"
- "github.com/ayn2op/tview"
- "github.com/gdamore/tcell/v3"
- )
- 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.SetInputCapture(app.onInputCapture)
- return app
- }
- func (a *application) run(token string) error {
- screen, err := tcell.NewScreen()
- if err != nil {
- return fmt.Errorf("failed to create screen: %w", err)
- }
- if err := screen.Init(); err != nil {
- return fmt.Errorf("failed to init screen: %w", err)
- }
- if a.cfg.Mouse {
- screen.EnableMouse()
- }
- screen.SetTitle(consts.Name)
- screen.EnablePaste()
- screen.EnableFocus()
- a.SetScreen(screen)
- if token == "" {
- loginForm := login.NewForm(a.Application, a.cfg, func(token string) {
- if err := a.showChatView(token); err != nil {
- slog.Error("failed to show chat view", "err", err)
- }
- })
- a.SetRoot(loginForm)
- } else {
- if err := a.showChatView(token); err != nil {
- return err
- }
- }
- return a.Run()
- }
- func (a *application) showChatView(token string) error {
- a.chatView = newChatView(a.Application, a.cfg)
- if err := openState(token); err != nil {
- return err
- }
- a.SetRoot(a.chatView)
- return nil
- }
- 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
- }
|