summaryrefslogtreecommitdiff
path: root/session.go
diff options
context:
space:
mode:
authorGrail Finder <wohilas@gmail.com>2024-11-20 06:51:40 +0300
committerGrail Finder <wohilas@gmail.com>2024-11-20 06:51:40 +0300
commitaaf056663628f15bb6e4f23c899b6fd31bac5bf7 (patch)
treea0129fbb531e31d1a9d6465549a44b823906aaae /session.go
parentf32375488f5127c910021f627d83e017c5c7a10f (diff)
Enha: db chat management
Diffstat (limited to 'session.go')
-rw-r--r--session.go92
1 files changed, 92 insertions, 0 deletions
diff --git a/session.go b/session.go
new file mode 100644
index 0000000..769fe90
--- /dev/null
+++ b/session.go
@@ -0,0 +1,92 @@
+package main
+
+import (
+ "elefant/models"
+ "encoding/json"
+ "fmt"
+ "time"
+)
+
+var (
+ chatMap = make(map[string]*models.Chat)
+)
+
+func historyToSJSON(msgs []models.MessagesStory) (string, error) {
+ data, err := json.Marshal(msgs)
+ if err != nil {
+ return "", err
+ }
+ if data == nil {
+ return "", fmt.Errorf("nil data")
+ }
+ return string(data), nil
+}
+
+func updateStorageChat(name string, msgs []models.MessagesStory) error {
+ var err error
+ chat, ok := chatMap[name]
+ if !ok {
+ err = fmt.Errorf("failed to find active chat; map:%v; key:%s", chatMap, name)
+ logger.Error("failed to find active chat", "map", chatMap, "key", name)
+ return err
+ }
+ chat.Msgs, err = historyToSJSON(msgs)
+ if err != nil {
+ return err
+ }
+ chat.UpdatedAt = time.Now()
+ _, err = store.UpsertChat(chat)
+ return err
+}
+
+func loadHistoryChats() ([]string, error) {
+ chats, err := store.ListChats()
+ if err != nil {
+ return nil, err
+ }
+ resp := []string{}
+ for _, chat := range chats {
+ if chat.Name == "" {
+ chat.Name = fmt.Sprintf("%d_%v", chat.ID, chat.CreatedAt.Unix())
+ }
+ resp = append(resp, chat.Name)
+ chatMap[chat.Name] = &chat
+ }
+ return resp, nil
+}
+
+func loadHistoryChat(chatName string) ([]models.MessagesStory, error) {
+ chat, ok := chatMap[chatName]
+ if !ok {
+ err := fmt.Errorf("failed to read chat")
+ logger.Error("failed to read chat", "name", chatName)
+ return nil, err
+ }
+ activeChatName = chatName
+ return chat.ToHistory()
+}
+
+func loadOldChatOrGetNew() []models.MessagesStory {
+ // find last chat
+ chat, err := store.GetLastChat()
+ newChat := &models.Chat{
+ ID: 0,
+ CreatedAt: time.Now(),
+ UpdatedAt: time.Now(),
+ }
+ newChat.Name = fmt.Sprintf("%d_%v", chat.ID, chat.CreatedAt.Unix())
+ if err != nil {
+ logger.Warn("failed to load history chat", "error", err)
+ activeChatName = newChat.Name
+ chatMap[newChat.Name] = newChat
+ return defaultStarter
+ }
+ history, err := chat.ToHistory()
+ if err != nil {
+ logger.Warn("failed to load history chat", "error", err)
+ activeChatName = newChat.Name
+ chatMap[newChat.Name] = newChat
+ return defaultStarter
+ }
+ return history
+}