diff options
Diffstat (limited to 'config')
-rw-r--r-- | config/config.go | 77 | ||||
-rw-r--r-- | config/session.go | 125 |
2 files changed, 202 insertions, 0 deletions
diff --git a/config/config.go b/config/config.go new file mode 100644 index 0000000..d4ede80 --- /dev/null +++ b/config/config.go @@ -0,0 +1,77 @@ +// gomuks - A terminal Matrix client written in Go. +// Copyright (C) 2018 Tulir Asokan +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. + +package config + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + + "gopkg.in/yaml.v2" + "maunium.net/go/gomuks/ui/debug" +) + +type Config struct { + MXID string `yaml:"mxid"` + HS string `yaml:"homeserver"` + + dir string `yaml:"-"` + Session *Session `yaml:"-"` +} + +func NewConfig(dir string) *Config { + return &Config{ + dir: dir, + } +} + +func (config *Config) Load() { + os.MkdirAll(config.dir, 0700) + configPath := filepath.Join(config.dir, "config.yaml") + data, err := ioutil.ReadFile(configPath) + if err != nil { + if os.IsNotExist(err) { + return + } else { + fmt.Println("Failed to read config from", configPath) + panic(err) + } + } + + err = yaml.Unmarshal(data, &config) + if err != nil { + fmt.Println("Failed to parse config at", configPath) + panic(err) + } +} + +func (config *Config) Save() { + os.MkdirAll(config.dir, 0700) + data, err := yaml.Marshal(&config) + if err != nil { + debug.Print("Failed to marshal config") + panic(err) + } + + path := filepath.Join(config.dir, "config.yaml") + err = ioutil.WriteFile(path, data, 0600) + if err != nil { + debug.Print("Failed to write config to", path) + panic(err) + } +} diff --git a/config/session.go b/config/session.go new file mode 100644 index 0000000..a90fc20 --- /dev/null +++ b/config/session.go @@ -0,0 +1,125 @@ +// gomuks - A terminal Matrix client written in Go. +// Copyright (C) 2018 Tulir Asokan +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. + +package config + +import ( + "encoding/json" + "io/ioutil" + "path/filepath" + + "maunium.net/go/gomatrix" + rooms "maunium.net/go/gomuks/matrix/room" + "maunium.net/go/gomuks/ui/debug" +) + +type Session struct { + MXID string `json:"-"` + path string `json:"-"` + AccessToken string + NextBatch string + FilterID string + Rooms map[string]*rooms.Room +} + +func (config *Config) LoadSession(mxid string) { + config.Session = config.NewSession(mxid) + config.Session.Load() +} + +func (config *Config) NewSession(mxid string) *Session { + return &Session{ + MXID: mxid, + path: filepath.Join(config.dir, mxid+".session"), + Rooms: make(map[string]*rooms.Room), + } +} + +func (s *Session) Clear() { + s.Rooms = make(map[string]*rooms.Room) + s.NextBatch = "" + s.FilterID = "" + s.Save() +} + +func (s *Session) Load() { + data, err := ioutil.ReadFile(s.path) + if err != nil { + debug.Print("Failed to read session from", s.path) + panic(err) + } + + err = json.Unmarshal(data, s) + if err != nil { + debug.Print("Failed to parse session at", s.path) + panic(err) + } +} + +func (s *Session) Save() { + data, err := json.Marshal(s) + if err != nil { + debug.Print("Failed to marshal session of", s.MXID) + panic(err) + } + + err = ioutil.WriteFile(s.path, data, 0600) + if err != nil { + debug.Print("Failed to write session to", s.path) + panic(err) + } +} + +func (s *Session) LoadFilterID(_ string) string { + return s.FilterID +} + +func (s *Session) LoadNextBatch(_ string) string { + return s.NextBatch +} + +func (s *Session) GetRoom(mxid string) *rooms.Room { + room, _ := s.Rooms[mxid] + if room == nil { + room = rooms.NewRoom(mxid) + s.Rooms[room.ID] = room + } + return room +} + +func (s *Session) PutRoom(room *rooms.Room) { + s.Rooms[room.ID] = room + s.Save() +} + +func (s *Session) SaveFilterID(_, filterID string) { + s.FilterID = filterID + s.Save() +} + +func (s *Session) SaveNextBatch(_, nextBatch string) { + s.NextBatch = nextBatch + s.Save() +} + +func (s *Session) LoadRoom(mxid string) *gomatrix.Room { + return s.GetRoom(mxid).Room +} + +func (s *Session) SaveRoom(room *gomatrix.Room) { + s.GetRoom(room.ID).Room = room + s.Save() +} |