main.go 2.0 KB

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