Log direct messages and keep track of open direct message tabs
This commit is contained in:
parent
e97bb519ed
commit
8305dd561d
17 changed files with 655 additions and 304 deletions
|
@ -15,6 +15,7 @@ var (
|
|||
bucketUsers = []byte("Users")
|
||||
bucketServers = []byte("Servers")
|
||||
bucketChannels = []byte("Channels")
|
||||
bucketOpenDMs = []byte("OpenDMs")
|
||||
bucketMessages = []byte("Messages")
|
||||
bucketSessions = []byte("Sessions")
|
||||
)
|
||||
|
@ -34,6 +35,7 @@ func New(path string) (*BoltStore, error) {
|
|||
tx.CreateBucketIfNotExists(bucketUsers)
|
||||
tx.CreateBucketIfNotExists(bucketServers)
|
||||
tx.CreateBucketIfNotExists(bucketChannels)
|
||||
tx.CreateBucketIfNotExists(bucketOpenDMs)
|
||||
tx.CreateBucketIfNotExists(bucketMessages)
|
||||
tx.CreateBucketIfNotExists(bucketSessions)
|
||||
return nil
|
||||
|
@ -168,6 +170,13 @@ func (s *BoltStore) RemoveServer(user *storage.User, address string) error {
|
|||
b.Delete(k)
|
||||
}
|
||||
|
||||
b = tx.Bucket(bucketOpenDMs)
|
||||
c = b.Cursor()
|
||||
|
||||
for k, _ := c.Seek(serverID); bytes.HasPrefix(k, serverID); k, _ = c.Next() {
|
||||
b.Delete(k)
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
@ -246,6 +255,42 @@ func (s *BoltStore) RemoveChannel(user *storage.User, server, channel string) er
|
|||
})
|
||||
}
|
||||
|
||||
func (s *BoltStore) GetOpenDMs(user *storage.User) ([]storage.Tab, error) {
|
||||
var openDMs []storage.Tab
|
||||
|
||||
s.db.View(func(tx *bolt.Tx) error {
|
||||
c := tx.Bucket(bucketOpenDMs).Cursor()
|
||||
|
||||
for k, _ := c.Seek(user.IDBytes); bytes.HasPrefix(k, user.IDBytes); k, _ = c.Next() {
|
||||
tab := bytes.Split(k[8:], []byte{0})
|
||||
openDMs = append(openDMs, storage.Tab{
|
||||
Server: string(tab[0]),
|
||||
Name: string(tab[1]),
|
||||
})
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
return openDMs, nil
|
||||
}
|
||||
|
||||
func (s *BoltStore) AddOpenDM(user *storage.User, server, nick string) error {
|
||||
return s.db.Batch(func(tx *bolt.Tx) error {
|
||||
b := tx.Bucket(bucketOpenDMs)
|
||||
|
||||
return b.Put(channelID(user, server, nick), nil)
|
||||
})
|
||||
}
|
||||
|
||||
func (s *BoltStore) RemoveOpenDM(user *storage.User, server, nick string) error {
|
||||
return s.db.Batch(func(tx *bolt.Tx) error {
|
||||
b := tx.Bucket(bucketOpenDMs)
|
||||
|
||||
return b.Delete(channelID(user, server, nick))
|
||||
})
|
||||
}
|
||||
|
||||
func (s *BoltStore) LogMessage(message *storage.Message) error {
|
||||
return s.db.Batch(func(tx *bolt.Tx) error {
|
||||
b, err := tx.Bucket(bucketMessages).CreateBucketIfNotExists([]byte(message.Server + ":" + message.To))
|
||||
|
|
|
@ -38,6 +38,10 @@ type Store interface {
|
|||
GetChannels(user *User) ([]*Channel, error)
|
||||
AddChannel(user *User, channel *Channel) error
|
||||
RemoveChannel(user *User, server, channel string) error
|
||||
|
||||
GetOpenDMs(user *User) ([]Tab, error)
|
||||
AddOpenDM(user *User, server, nick string) error
|
||||
RemoveOpenDM(user *User, server, nick string) error
|
||||
}
|
||||
|
||||
type SessionStore interface {
|
||||
|
|
|
@ -190,6 +190,23 @@ func (u *User) RemoveChannel(server, channel string) error {
|
|||
return u.store.RemoveChannel(u, server, channel)
|
||||
}
|
||||
|
||||
type Tab struct {
|
||||
Server string
|
||||
Name string
|
||||
}
|
||||
|
||||
func (u *User) GetOpenDMs() ([]Tab, error) {
|
||||
return u.store.GetOpenDMs(u)
|
||||
}
|
||||
|
||||
func (u *User) AddOpenDM(server, nick string) error {
|
||||
return u.store.AddOpenDM(u, server, nick)
|
||||
}
|
||||
|
||||
func (u *User) RemoveOpenDM(server, nick string) error {
|
||||
return u.store.RemoveOpenDM(u, server, nick)
|
||||
}
|
||||
|
||||
type Message struct {
|
||||
ID string `json:"-" bleve:"-"`
|
||||
Server string `json:"-" bleve:"server"`
|
||||
|
|
|
@ -80,6 +80,16 @@ func TestUser(t *testing.T) {
|
|||
channels, err = user.GetChannels()
|
||||
assert.Len(t, channels, 0)
|
||||
|
||||
user.AddOpenDM(srv.Host, "cake")
|
||||
openDMs, err := user.GetOpenDMs()
|
||||
assert.Nil(t, err)
|
||||
assert.Len(t, openDMs, 1)
|
||||
err = user.RemoveOpenDM(srv.Host, "cake")
|
||||
assert.Nil(t, err)
|
||||
openDMs, err = user.GetOpenDMs()
|
||||
assert.Nil(t, err)
|
||||
assert.Len(t, openDMs, 0)
|
||||
|
||||
settings := user.GetClientSettings()
|
||||
assert.NotNil(t, settings)
|
||||
assert.Equal(t, storage.DefaultClientSettings(), settings)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue