WhspBrd/internal/tui/messages.go
2025-09-04 16:03:49 +02:00

111 lines
2.7 KiB
Go

package tui
import (
"encoding/base64"
"encoding/json"
"fmt"
"log"
"os"
"path/filepath"
"strconv"
"strings"
"time"
)
type ChatMessage struct {
ID string `json:"id"`
Sender string `json:"sender"`
Receiver string `json:"receiver"`
Content string `json:"content"`
Timestamp string `json:"timestamp"`
}
type ChatData struct {
Messages []ChatMessage `json:"messages"`
}
func LoadContacts(path string) {
users = nil
contactsPath := filepath.Join(path, "users")
folders, err := os.ReadDir(contactsPath)
if err != nil {
log.Printf("Error reading contacts directory: %v", err)
return
}
// TODO: Instead of just using list create some more complex structure so i can load details about the user in it
for _, folder := range folders {
if folder.IsDir() {
users = append(users, folder.Name())
}
}
}
func WriteMessage(username, sender, receiver, content string) error {
chatFile := filepath.Join("configs", "servers", "default", "users", strings.ToLower(username), "messages.json")
if _, err := os.Stat(chatFile); os.IsNotExist(err) {
emptyData := ChatData{Messages: []ChatMessage{}}
data, _ := json.MarshalIndent(emptyData, "", " ")
if err := os.WriteFile(chatFile, data, 0644); err != nil {
return fmt.Errorf("failed to create chat file: %v", err)
}
}
data, err := os.ReadFile(chatFile)
if err != nil {
return fmt.Errorf("error reading chat file: %v", err)
}
var chatData ChatData
if len(data) > 0 {
if err := json.Unmarshal(data, &chatData); err != nil {
return fmt.Errorf("error parsing JSON: %v", err)
}
}
newID := "1"
if len(chatData.Messages) > 0 {
lastMsg := chatData.Messages[len(chatData.Messages)-1]
if lastID, err := strconv.Atoi(lastMsg.ID); err == nil {
newID = strconv.Itoa(lastID + 1)
}
}
encodedContent := base64.StdEncoding.EncodeToString([]byte(content))
newMsg := ChatMessage{
ID: newID,
Sender: sender,
Receiver: receiver,
Content: encodedContent,
Timestamp: time.Now().UTC().Format(time.RFC3339),
}
chatData.Messages = append(chatData.Messages, newMsg)
updatedData, err := json.MarshalIndent(chatData, "", " ")
if err != nil {
return fmt.Errorf("error encoding JSON: %v", err)
}
if err := os.WriteFile(chatFile, updatedData, 0644); err != nil {
return fmt.Errorf("error writing chat file: %v", err)
}
return nil
}
func LoadMessages(username string) {
chatFile := filepath.Join("configs", "servers", "default", "users", strings.ToLower(username), "messages.json")
data, err := os.ReadFile(chatFile)
if err != nil {
log.Printf("Error reading chat file: %v", err)
return
}
if err := json.Unmarshal(data, &chatData); err != nil {
log.Printf("Error parsing JSON: %v", err)
return
}
}