config.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package util
  2. import (
  3. "os"
  4. "path/filepath"
  5. "github.com/BurntSushi/toml"
  6. )
  7. const userAgent = "Mozilla/5.0 (X11; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0"
  8. type GeneralConfig struct {
  9. UserAgent string `toml:"user_agent"`
  10. FetchMessagesLimit int `toml:"fetch_messages_limit"`
  11. Mouse bool `toml:"mouse"`
  12. Timestamps bool `toml:"timestamps"`
  13. }
  14. type KeybindingsConfig struct {
  15. ToggleGuildsList string `toml:"toggle_guilds_list"`
  16. ToggleChannelsTreeView string `toml:"toggle_channels_tree_view"`
  17. ToggleMessagesTextView string `toml:"toggle_messages_text_view"`
  18. ToggleMessageInputField string `toml:"toggle_message_input_field"`
  19. ToggleMessageActionsList string `toml:"toggle_message_actions_list"`
  20. ToggleExternalEditor string `toml:"toggle_external_editor"`
  21. SelectPreviousMessage string `toml:"select_previous_message"`
  22. SelectNextMessage string `toml:"select_next_message"`
  23. SelectFirstMessage string `toml:"select_first_message"`
  24. SelectLastMessage string `toml:"select_last_message"`
  25. }
  26. type Config struct {
  27. Keybindings KeybindingsConfig `toml:"keybindings"`
  28. General GeneralConfig `toml:"general"`
  29. }
  30. func LoadConfig() *Config {
  31. configPath, err := os.UserConfigDir()
  32. if err != nil {
  33. panic(err)
  34. }
  35. configPath += "/discordo/config.toml"
  36. // Create a directory as well as create all of the nested directories, recursively.
  37. err = os.MkdirAll(filepath.Dir(configPath), os.ModePerm)
  38. if err != nil {
  39. panic(err)
  40. }
  41. c := &Config{}
  42. // If the configuration file does not exist, create and write the default configuration to the file.
  43. if _, err = os.Stat(configPath); os.IsNotExist(err) {
  44. f, err := os.Create(configPath)
  45. if err != nil {
  46. panic(err)
  47. }
  48. defer f.Close()
  49. c = newDefaultConfig()
  50. err = toml.NewEncoder(f).Encode(c)
  51. if err != nil {
  52. panic(err)
  53. }
  54. } else {
  55. _, err = toml.DecodeFile(configPath, c)
  56. if err != nil {
  57. panic(err)
  58. }
  59. }
  60. return c
  61. }
  62. func newDefaultConfig() *Config {
  63. return &Config{
  64. General: GeneralConfig{
  65. UserAgent: userAgent,
  66. FetchMessagesLimit: 50,
  67. Mouse: true,
  68. Timestamps: false,
  69. },
  70. Keybindings: KeybindingsConfig{
  71. ToggleGuildsList: "Rune[g]",
  72. ToggleChannelsTreeView: "Rune[c]",
  73. ToggleMessagesTextView: "Rune[m]",
  74. ToggleMessageInputField: "Rune[i]",
  75. ToggleMessageActionsList: "Rune[a]",
  76. ToggleExternalEditor: "Ctrl-E",
  77. SelectPreviousMessage: "Up",
  78. SelectNextMessage: "Down",
  79. SelectFirstMessage: "Home",
  80. SelectLastMessage: "End",
  81. },
  82. }
  83. }