diff options
author | Grail Finder <wohilas@gmail.com> | 2024-11-20 06:51:40 +0300 |
---|---|---|
committer | Grail Finder <wohilas@gmail.com> | 2024-11-20 06:51:40 +0300 |
commit | aaf056663628f15bb6e4f23c899b6fd31bac5bf7 (patch) | |
tree | a0129fbb531e31d1a9d6465549a44b823906aaae /session.go | |
parent | f32375488f5127c910021f627d83e017c5c7a10f (diff) |
Enha: db chat management
Diffstat (limited to 'session.go')
-rw-r--r-- | session.go | 92 |
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 +} |