Untitled

 avatar
unknown
plain_text
2 months ago
2.6 kB
5
Indexable
package models

import (
	"api/database"
	"context"
	"encoding/json"
	"fmt"
	"go.mongodb.org/mongo-driver/v2/bson"
	"go.mongodb.org/mongo-driver/v2/mongo"
	"time"
)

type PlayerData struct {
	UUID            string      `json:"uuid" bson:"uuid"`
	Username        string      `json:"username" bson:"username"`
	Ips             []string    `json:"ips" bson:"ips"`
	LastIP          string      `json:"last_ip" bson:"last_ip"`
	ConnexionDates  []time.Time `json:"connexion_dates" bson:"connexion_dates"`
	FirstConnexion  time.Time   `json:"first_connexion" bson:"first_connexion"`
	Rank            string      `json:"rank" bson:"rank"`
	TotalPlayedTime int         `json:"total_played_time" bson:"total_played_time"`
	Money           int         `json:"money" bson:"money"`
}

func NewPlayerData(data *PlayerData) (*PlayerData, error) {
	var coll *mongo.Collection = database.MongoDB.Database(database.Database).Collection("players")

	_, err := coll.InsertOne(database.Ctx, *data)
	if err != nil {
		fmt.Println("Can't insert new player data: ", err.Error())
		return data, err
	}

	return data, nil
}

func UpdatePlayerData(data *PlayerData) (*PlayerData, error) {
	var coll *mongo.Collection = database.MongoDB.Database(database.Database).Collection("players")

	_, err := coll.UpdateOne(database.Ctx, bson.M{"uuid": data.UUID}, data)
	if err != nil {
		fmt.Println("Can't update player data: ", err.Error())
		return data, err
	}
	return data, nil
}

func fromRedis(uuid string) (*PlayerData, error) {
	result, err := database.RedisClient.Get(database.Ctx, uuid).Result()
	if err != nil {
		return nil, err
	}
	var data PlayerData
	err = json.Unmarshal([]byte(result), &data)
	if err != nil {
		return nil, err
	}
	return &data, nil
}

func fromMongo(uuid string) (*PlayerData, error) {
	var data PlayerData
	var coll *mongo.Collection = database.MongoDB.Database(database.Database).Collection("players")
	err := coll.FindOne(database.Ctx, bson.M{"uuid": uuid}).Decode(&data)
	if err != nil {
		return nil, err
	}
	return &data, nil
}

func saveRedis(data *PlayerData) {

	userData, _ := json.Marshal(*data)
	err := database.RedisClient.Set(context.Background(), data.UUID, userData, 0).Err()
	if err != nil {
		fmt.Println("Can't save player data in Redis: ", err.Error())
	}
}

func GetPlayerDataByUUID(uuid string) (PlayerData, error) {
	data, err := fromRedis(uuid)
	if err != nil {
		//From MongoDB
		data, err = fromMongo(uuid)
		if err != nil {
			fmt.Println("Can't find player data: ", err.Error())
			return PlayerData{}, err
		}
		saveRedis(data)
	}
	return *data, err
}
Editor is loading...
Leave a Comment