main.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package main
  2. import (
  3. "context"
  4. "flag"
  5. "log"
  6. "os"
  7. "path/filepath"
  8. "github.com/rivo/tview"
  9. "github.com/zalando/go-keyring"
  10. )
  11. var (
  12. token string
  13. config *Config
  14. discordState *State
  15. app = tview.NewApplication()
  16. flex = tview.NewFlex()
  17. guildsTree *GuildsTree
  18. messagesText *MessagesText
  19. messageInput *MessageInput
  20. )
  21. func init() {
  22. flag.StringVar(&token, "token", "", "The authentication token.")
  23. path, err := os.UserCacheDir()
  24. if err != nil {
  25. log.Fatal(err)
  26. }
  27. path = filepath.Join(path, name)
  28. err = os.MkdirAll(path, os.ModePerm)
  29. if err != nil {
  30. log.Fatal(err)
  31. }
  32. path = filepath.Join(path, "logs.txt")
  33. f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, os.ModePerm)
  34. if err != nil {
  35. log.Fatal(err)
  36. }
  37. log.SetOutput(f)
  38. log.SetFlags(log.LstdFlags | log.Llongfile)
  39. }
  40. func main() {
  41. flag.Parse()
  42. var err error
  43. // If the token is passed via the flag, set it in the keyring.
  44. if token != "" {
  45. go keyring.Set(name, "token", token)
  46. } else {
  47. token, err = keyring.Get(name, "token")
  48. if err != nil {
  49. log.Println(err)
  50. return
  51. }
  52. }
  53. config, err = newConfig()
  54. if err != nil {
  55. log.Fatal(err)
  56. }
  57. // UI must be initialized after the configuration has been loaded and before the plugins are loaded.
  58. guildsTree = newGuildsTree()
  59. messagesText = newMessagesText()
  60. messageInput = newMessageInput()
  61. // mission failed, we'll get 'em next time
  62. if token == "" {
  63. app.SetRoot(newLoginForm(), true)
  64. } else {
  65. discordState = newState(token)
  66. err = discordState.Open(context.Background())
  67. if err != nil {
  68. log.Fatal(err)
  69. }
  70. right := tview.NewFlex()
  71. right.SetDirection(tview.FlexRow)
  72. right.AddItem(messagesText, 0, 1, false)
  73. right.AddItem(messageInput, 3, 1, false)
  74. // The guilds tree is always focused first at start-up.
  75. flex.AddItem(guildsTree, 0, 1, true)
  76. flex.AddItem(right, 0, 4, false)
  77. app.SetRoot(flex, true)
  78. }
  79. app.EnableMouse(config.Mouse)
  80. err = app.Run()
  81. if err != nil {
  82. log.Fatal(err)
  83. }
  84. }