discordo/util/config.go

138 lines
3.7 KiB
Go

package util
import (
"os"
"github.com/BurntSushi/toml"
"github.com/rivo/tview"
)
const userAgent = "" +
"Mozilla/5.0 (X11; Linux x86_64) " +
"AppleWebKit/537.36 (KHTML, like Gecko) " +
"Chrome/92.0.4515.131 Safari/537.36"
type keybindings struct {
FocusChannelsTree []string `toml:"focus_channels_tree"`
FocusMessagesView []string `toml:"focus_messages_view"`
FocusMessageInputField []string `toml:"focus_message_input_field"`
SelectPreviousMessage []string `toml:"select_previous_message"`
SelectNextMessage []string `toml:"select_next_message"`
SelectFirstMessage []string `toml:"select_first_message"`
SelectLastMessage []string `toml:"select_last_message"`
SelectMessageReference []string `toml:"select_message_reference"`
ReplySelectedMessage []string `toml:"reply_selected_message"`
MentionReplySelectedMessage []string `toml:"mention_reply_selected_message"`
CopySelectedMessage []string `toml:"copy_selected_message"`
}
type theme struct {
Background string `toml:"background"`
Border string `toml:"border"`
Title string `toml:"title"`
Graphics string `toml:"graphics"`
Text string `toml:"text"`
}
type borders struct {
Horizontal rune
Vertical rune
TopLeft rune
TopRight rune
BottomLeft rune
BottomRight rune
HorizontalFocus rune
VerticalFocus rune
TopLeftFocus rune
TopRightFocus rune
BottomLeftFocus rune
BottomRightFocus rune
}
type Config struct {
Token string `toml:"token"`
UserAgent string `toml:"user_agent"`
Mouse bool `toml:"mouse"`
Notifications bool `toml:"notifications"`
GetMessagesLimit int `toml:"get_messages_limit"`
Theme theme `toml:"theme"`
Keybindings keybindings `toml:"keybindings"`
Borders borders `toml:"borders"`
}
// NewConfig loads the configuration file, if the configuration file exists or creates a new one if not, and returns it.
func NewConfig() *Config {
configPath, err := os.UserConfigDir()
if err != nil {
panic(err)
}
configPath += "/discordo.toml"
var c Config
if _, err = os.Stat(configPath); os.IsNotExist(err) {
f, err := os.Create(configPath)
if err != nil {
panic(err)
}
defer f.Close()
c = Config{
Mouse: true,
Notifications: true,
UserAgent: userAgent,
GetMessagesLimit: 50,
Borders: borders{
Horizontal: 0,
Vertical: 0,
TopLeft: 0,
TopRight: 0,
BottomLeft: 0,
BottomRight: 0,
HorizontalFocus: tview.BoxDrawingsLightHorizontal,
VerticalFocus: tview.BoxDrawingsLightVertical,
TopLeftFocus: tview.BoxDrawingsLightDownAndRight,
TopRightFocus: tview.BoxDrawingsLightDownAndLeft,
BottomLeftFocus: tview.BoxDrawingsLightUpAndRight,
BottomRightFocus: tview.BoxDrawingsLightUpAndLeft,
},
Theme: theme{
Background: "black",
Border: "white",
Title: "white",
Graphics: "white",
Text: "white",
},
Keybindings: keybindings{
FocusChannelsTree: []string{"Alt+Left"},
FocusMessagesView: []string{"Alt+Right"},
FocusMessageInputField: []string{"Alt+Down"},
SelectPreviousMessage: []string{"Up"},
SelectNextMessage: []string{"Down"},
SelectFirstMessage: []string{"Home"},
SelectLastMessage: []string{"End"},
ReplySelectedMessage: []string{"Rune[r]"},
MentionReplySelectedMessage: []string{"Rune[R]"},
CopySelectedMessage: []string{"Rune[c]"},
SelectMessageReference: []string{"Rune[m]"},
},
}
err = toml.NewEncoder(f).Encode(c)
if err != nil {
panic(err)
}
} else {
_, err = toml.DecodeFile(configPath, &c)
if err != nil {
panic(err)
}
}
return &c
}