From aaf056663628f15bb6e4f23c899b6fd31bac5bf7 Mon Sep 17 00:00:00 2001 From: Grail Finder Date: Wed, 20 Nov 2024 06:51:40 +0300 Subject: Enha: db chat management --- session.go | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 session.go (limited to 'session.go') 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 +} -- cgit v1.2.3