mirror of
https://github.com/diamondburned/cchat-gtk.git
synced 2024-11-17 03:32:56 +00:00
105 lines
2.5 KiB
Go
105 lines
2.5 KiB
Go
package keyring
|
|
|
|
import (
|
|
"github.com/diamondburned/cchat"
|
|
"github.com/diamondburned/cchat-gtk/internal/keyring/driver"
|
|
"github.com/diamondburned/cchat-gtk/internal/keyring/driver/json"
|
|
"github.com/diamondburned/cchat-gtk/internal/keyring/driver/keyring"
|
|
"github.com/diamondburned/cchat-gtk/internal/log"
|
|
"github.com/diamondburned/cchat-gtk/internal/ui/config"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// Declare a keyring store with fallbacks.
|
|
var store = driver.NewStore(
|
|
keyring.NewProvider(),
|
|
json.NewProvider(config.DirPath()), // fallback
|
|
)
|
|
|
|
type Session struct {
|
|
ID cchat.ID
|
|
|
|
// Metadata.
|
|
Name string
|
|
Data map[string]string
|
|
}
|
|
|
|
// ConvertSession attempts to get the session data from the given cchat session.
|
|
// It returns nil if it can't do it.
|
|
func ConvertSession(ses cchat.Session, name string) *Session {
|
|
saver := ses.AsSessionSaver()
|
|
if saver == nil {
|
|
return nil
|
|
}
|
|
|
|
// Treat the ID as name if none is provided. This is a shitty hack around
|
|
// backends that only set the name after returning.
|
|
if name == "" {
|
|
name = ses.ID()
|
|
}
|
|
|
|
return &Session{
|
|
ID: ses.ID(),
|
|
Name: name,
|
|
Data: saver.SaveSession(),
|
|
}
|
|
}
|
|
|
|
// RestoreSession restores a single session.
|
|
func RestoreSession(svc cchat.Service, sessionID cchat.ID) *Session {
|
|
service := Restore(svc)
|
|
for _, session := range service.Sessions {
|
|
if session.ID == sessionID {
|
|
return &session
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Sessions is a list of sessions within a keyring. It provides an abstract way
|
|
// to save sessions with order.
|
|
type Service struct {
|
|
ID cchat.ID
|
|
Sessions []Session
|
|
}
|
|
|
|
// NewService creates a new service.
|
|
func NewService(svc cchat.Service, cap int) Service {
|
|
return Service{
|
|
ID: svc.ID(),
|
|
Sessions: make([]Session, 0, cap),
|
|
}
|
|
}
|
|
|
|
// Restore restores all sessions of the service asynchronously, then calls the
|
|
// auth callback inside the GTK main thread.
|
|
func Restore(svc cchat.Service) Service {
|
|
var sessions []Session
|
|
// Ignore the error, it's not important.
|
|
if err := store.Get(svc.ID(), &sessions); err != nil {
|
|
log.Warn(err)
|
|
}
|
|
|
|
return Service{
|
|
ID: svc.ID(),
|
|
Sessions: sessions,
|
|
}
|
|
}
|
|
|
|
// Add adds a session into the sessions list.
|
|
func (svc *Service) Add(ses cchat.Session, name string) {
|
|
s := ConvertSession(ses, name)
|
|
if s == nil {
|
|
return
|
|
}
|
|
|
|
svc.Sessions = append(svc.Sessions, *s)
|
|
}
|
|
|
|
// Save saves the sessions into the keyring.
|
|
func (svc Service) Save() {
|
|
if err := store.Set(svc.ID, svc.Sessions); err != nil {
|
|
log.Warn(errors.Wrap(err, "Error saving session"))
|
|
}
|
|
}
|