111 lines
2.7 KiB
Go
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
|
|
}
|
|
}
|