some-automoderation/rooms/rooms_manager.go

71 lines
1.6 KiB
Go

package rooms
import (
"context"
"encoding/json"
"fmt"
"log"
"github.com/redis/go-redis/v9"
)
type Person struct {
PersonId int64
Name string
PasswordHash string
}
type Room struct {
Name string // will be unique ID
AdminIds []int64
PasswordHash string
Paricipants []Person
// TODO hands, for each type of hand?
// i guess participants order fixed for now?
// and i'll still need 'current' for each hand level
}
// well, it seems that i'd better do marshalling into bytes then
// see https://github.com/redis/go-redis/issues/2512
func (r *Room) MarshalBinary() (data []byte, err error) {
return json.Marshal(r)
}
func (r *Room) UnmarshalBinary(data []byte) error {
return json.Unmarshal(data, r)
}
// let's check whether it will be possible to save nested structs
var ctx = context.Background()
type RoomManager interface {
Get(roomName string) (Room, error) // but we need Get by name
Save(room Room) error
}
const roomRedisPrefix = "room"
func roomNameToRedisId(roomName string) string {
return fmt.Sprintf("%s:%s", roomRedisPrefix, roomName)
}
type RedisRM struct {
Rdb *redis.Client
}
func (redisRM RedisRM) Get(roomName string) (Room, error) {
var readRoom Room
err := redisRM.Rdb.Get(ctx, roomNameToRedisId(roomName)).Scan(&readRoom)
if err != nil {
log.Printf("error reading room with id %s : %s", roomName, err)
return Room{}, err
}
return readRoom, nil
}
func (redisRM RedisRM) Save(room Room) error {
err := redisRM.Rdb.Set(ctx, roomNameToRedisId(room.Name), room, 0).Err() // maybe even set expiration?
return err
}