main.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package main
  2. import (
  3. "log"
  4. "os"
  5. "github.com/ayntgl/discordo/config"
  6. "github.com/ayntgl/discordo/ui"
  7. "github.com/gdamore/tcell/v2"
  8. "github.com/rivo/tview"
  9. "github.com/urfave/cli/v2"
  10. "github.com/zalando/go-keyring"
  11. )
  12. const (
  13. name = "discordo"
  14. usage = "A lightweight, secure, and feature-rich Discord terminal client"
  15. )
  16. func main() {
  17. t, _ := keyring.Get(name, "token")
  18. cliApp := &cli.App{
  19. Name: name,
  20. Usage: usage,
  21. EnableBashCompletion: true,
  22. Flags: []cli.Flag{
  23. &cli.StringFlag{
  24. Name: "token",
  25. Usage: "The client authentication token.",
  26. Value: t,
  27. DefaultText: "From keyring",
  28. Aliases: []string{"t"},
  29. },
  30. &cli.StringFlag{
  31. Name: "config",
  32. Usage: "The path of the configuration file.",
  33. Value: config.DefaultPath(),
  34. Aliases: []string{"c"},
  35. },
  36. },
  37. }
  38. cliApp.Action = func(ctx *cli.Context) error {
  39. c := config.New()
  40. err := c.Load(ctx.String("config"))
  41. if err != nil {
  42. log.Fatal(err)
  43. }
  44. token := ctx.String("token")
  45. app := ui.NewApp(token, c)
  46. if token != "" {
  47. err := app.Connect()
  48. if err != nil {
  49. panic(err)
  50. }
  51. app.DrawMainFlex()
  52. app.SetFocus(app.GuildsList)
  53. } else {
  54. loginForm := ui.NewLoginForm(false)
  55. loginForm.AddButton("Login", func() {
  56. email := loginForm.GetFormItem(0).(*tview.InputField).GetText()
  57. password := loginForm.GetFormItem(1).(*tview.InputField).GetText()
  58. if email == "" || password == "" {
  59. return
  60. }
  61. // Login using the email and password
  62. lr, err := app.Session.Login(email, password)
  63. if err != nil {
  64. panic(err)
  65. }
  66. if lr.Token != "" && !lr.Mfa {
  67. app.Session.Identify.Token = lr.Token
  68. err = app.Connect()
  69. if err != nil {
  70. panic(err)
  71. }
  72. app.DrawMainFlex()
  73. app.SetFocus(app.GuildsList)
  74. go keyring.Set(name, "token", lr.Token)
  75. } else {
  76. // The account has MFA enabled, reattempt login with MFA code and ticket.
  77. mfaLoginForm := ui.NewLoginForm(true)
  78. mfaLoginForm.AddButton("Login", func() {
  79. code := loginForm.GetFormItem(0).(*tview.InputField).GetText()
  80. if code == "" {
  81. return
  82. }
  83. lr, err = app.Session.Totp(code, lr.Ticket)
  84. if err != nil {
  85. panic(err)
  86. }
  87. app.Session.Identify.Token = lr.Token
  88. err = app.Connect()
  89. if err != nil {
  90. panic(err)
  91. }
  92. app.DrawMainFlex()
  93. app.SetFocus(app.GuildsList)
  94. go keyring.Set(name, "token", lr.Token)
  95. })
  96. }
  97. })
  98. app.SetRoot(loginForm, true)
  99. }
  100. tview.Borders.TopLeftFocus = tview.Borders.TopLeft
  101. tview.Borders.TopRightFocus = tview.Borders.TopRight
  102. tview.Borders.BottomLeftFocus = tview.Borders.BottomLeft
  103. tview.Borders.BottomRightFocus = tview.Borders.BottomRight
  104. tview.Borders.HorizontalFocus = tview.Borders.Horizontal
  105. tview.Borders.VerticalFocus = tview.Borders.Vertical
  106. tview.Borders.TopLeft = 0
  107. tview.Borders.TopRight = 0
  108. tview.Borders.BottomLeft = 0
  109. tview.Borders.BottomRight = 0
  110. tview.Borders.Horizontal = 0
  111. tview.Borders.Vertical = 0
  112. tview.Styles.PrimitiveBackgroundColor = tcell.GetColor(app.Config.Theme.Background)
  113. tview.Styles.BorderColor = tcell.GetColor(app.Config.Theme.Border)
  114. tview.Styles.TitleColor = tcell.GetColor(app.Config.Theme.Title)
  115. err = app.Run()
  116. if err != nil {
  117. panic(err)
  118. }
  119. return nil
  120. }
  121. err := cliApp.Run(os.Args)
  122. if err != nil {
  123. panic(err)
  124. }
  125. }