68 lines
1.3 KiB
Go
68 lines
1.3 KiB
Go
|
package storage
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"git.mascherari.press/cwtch/protocol"
|
||
|
"os"
|
||
|
"sync"
|
||
|
)
|
||
|
|
||
|
type MessageStoreInterface interface {
|
||
|
AddMessage(protocol.GroupMessage)
|
||
|
FetchMessages() []*protocol.GroupMessage
|
||
|
}
|
||
|
|
||
|
type MessageStore struct {
|
||
|
file *os.File
|
||
|
lock sync.Mutex
|
||
|
messages []*protocol.GroupMessage
|
||
|
}
|
||
|
|
||
|
func (ms *MessageStore) Close() {
|
||
|
ms.messages = nil
|
||
|
ms.file.Close()
|
||
|
}
|
||
|
|
||
|
func (ms *MessageStore) Init(filename string) {
|
||
|
f, err := os.OpenFile(filename, os.O_CREATE|os.O_APPEND|os.O_RDWR, 0600)
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
ms.file = f
|
||
|
|
||
|
scanner := bufio.NewScanner(f)
|
||
|
for scanner.Scan() {
|
||
|
gms := scanner.Text()
|
||
|
gm := &protocol.GroupMessage{}
|
||
|
err := json.Unmarshal([]byte(gms), gm)
|
||
|
if err == nil {
|
||
|
ms.messages = append(ms.messages, gm)
|
||
|
} else {
|
||
|
panic(err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if err := scanner.Err(); err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
func (ms *MessageStore) FetchMessages() (messages []*protocol.GroupMessage) {
|
||
|
messages = make([]*protocol.GroupMessage, len(ms.messages))
|
||
|
ms.lock.Lock()
|
||
|
copy(messages, ms.messages)
|
||
|
ms.lock.Unlock()
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func (ms *MessageStore) AddMessage(gm protocol.GroupMessage) {
|
||
|
ms.lock.Lock()
|
||
|
ms.messages = append(ms.messages, &gm)
|
||
|
s, _ := json.Marshal(gm)
|
||
|
fmt.Fprintf(ms.file, "%s\n", s)
|
||
|
ms.lock.Unlock()
|
||
|
}
|