config.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package config
  2. import (
  3. "os"
  4. "path/filepath"
  5. "gopkg.in/yaml.v3"
  6. )
  7. const Name = "discordo"
  8. type Config struct {
  9. Mouse bool `yaml:"mouse"`
  10. MessagesLimit uint `yaml:"messages_limit"`
  11. Timestamps bool `yaml:"timestamps"`
  12. Editor string `yaml:"editor"`
  13. Keys KeysConfig `yaml:"keys"`
  14. Theme ThemeConfig `yaml:"theme"`
  15. }
  16. func New() (*Config, error) {
  17. path, err := os.UserConfigDir()
  18. if err != nil {
  19. return nil, err
  20. }
  21. path = filepath.Join(path, Name)
  22. err = os.MkdirAll(path, os.ModePerm)
  23. if err != nil {
  24. return nil, err
  25. }
  26. c := Config{
  27. Mouse: true,
  28. Timestamps: false,
  29. MessagesLimit: 50,
  30. Editor: "default",
  31. Keys: KeysConfig{
  32. Cancel: "Esc",
  33. MessagesText: MessagesTextKeysConfig{
  34. CopyContent: "Rune[c]",
  35. Reply: "Rune[r]",
  36. ReplyMention: "Rune[R]",
  37. SelectReply: "Rune[s]",
  38. SelectPrevious: "Up",
  39. SelectNext: "Down",
  40. SelectFirst: "Home",
  41. SelectLast: "End",
  42. },
  43. MessageInput: MessageInputKeysConfig{
  44. Send: "Enter",
  45. Paste: "Ctrl+V",
  46. LaunchEditor: "Ctrl+E",
  47. },
  48. },
  49. Theme: ThemeConfig{
  50. Border: true,
  51. BorderColor: "default",
  52. BorderPadding: [...]int{0, 0, 1, 1},
  53. TitleColor: "default",
  54. BackgroundColor: "default",
  55. GuildsTree: GuildsTreeThemeConfig{
  56. Graphics: true,
  57. },
  58. MessagesText: MessagesTextThemeConfig{
  59. AuthorColor: "aqua",
  60. },
  61. MessageInput: MessageInputThemeConfig{},
  62. },
  63. }
  64. path = filepath.Join(path, "config.yml")
  65. _, err = os.Stat(path)
  66. if os.IsNotExist(err) {
  67. f, err := os.Create(path)
  68. if err != nil {
  69. return nil, err
  70. }
  71. defer f.Close()
  72. err = yaml.NewEncoder(f).Encode(c)
  73. if err != nil {
  74. return nil, err
  75. }
  76. } else {
  77. f, err := os.Open(path)
  78. if err != nil {
  79. return nil, err
  80. }
  81. defer f.Close()
  82. err = yaml.NewDecoder(f).Decode(&c)
  83. if err != nil {
  84. return nil, err
  85. }
  86. }
  87. return &c, nil
  88. }