main.go 1.9 KB

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