events.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package chat
  2. import (
  3. "context"
  4. "log/slog"
  5. "github.com/ayn2op/tview"
  6. "github.com/diamondburned/arikawa/v3/discord"
  7. "github.com/diamondburned/arikawa/v3/gateway"
  8. "github.com/gdamore/tcell/v3"
  9. )
  10. func (m *Model) openState() tview.Command {
  11. return func() tview.Event {
  12. if err := m.state.Open(context.Background()); err != nil {
  13. slog.Error("failed to open chat state", "err", err)
  14. return tcell.NewEventError(err)
  15. }
  16. return nil
  17. }
  18. }
  19. func (m *Model) closeState() tview.Command {
  20. return func() tview.Event {
  21. if m.state != nil {
  22. if err := m.state.Close(); err != nil {
  23. slog.Error("failed to close the session", "err", err)
  24. return tcell.NewEventError(err)
  25. }
  26. }
  27. return nil
  28. }
  29. }
  30. type gatewayEvent struct {
  31. tcell.EventTime
  32. gateway.Event
  33. }
  34. func (m *Model) listen() tview.Command {
  35. return func() tview.Event {
  36. return &gatewayEvent{Event: <-m.events}
  37. }
  38. }
  39. type channelLoadedEvent struct {
  40. tcell.EventTime
  41. Channel discord.Channel
  42. Messages []discord.Message
  43. }
  44. func newChannelLoadedEvent(channel discord.Channel, messages []discord.Message) *channelLoadedEvent {
  45. return &channelLoadedEvent{Channel: channel, Messages: messages}
  46. }
  47. type olderMessagesLoadedEvent struct {
  48. tcell.EventTime
  49. ChannelID discord.ChannelID
  50. Older []discord.Message
  51. }
  52. func newOlderMessagesLoadedEvent(channelID discord.ChannelID, older []discord.Message) *olderMessagesLoadedEvent {
  53. return &olderMessagesLoadedEvent{ChannelID: channelID, Older: older}
  54. }
  55. type LogoutEvent struct{ tcell.EventTime }
  56. func (m *Model) logout() tview.Command {
  57. return func() tview.Event {
  58. return &LogoutEvent{}
  59. }
  60. }
  61. type QuitEvent struct{ tcell.EventTime }
  62. type closeLayerEvent struct {
  63. tcell.EventTime
  64. name string
  65. }
  66. func closeLayer(name string) tview.Command {
  67. return func() tview.Event {
  68. return &closeLayerEvent{name: name}
  69. }
  70. }