From d42a34535b2d3f5c7063e23c79b3533fac2d1bba Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 22 Jun 2023 18:05:02 -0500 Subject: [PATCH] split redis.go --- compose.yaml | 2 +- core/redis/login.go | 51 ++++++++++++++++++++++++++++++ core/redis/redis.go | 76 --------------------------------------------- core/redis/shard.go | 34 ++++++++++++++++++++ 4 files changed, 86 insertions(+), 77 deletions(-) create mode 100644 core/redis/login.go create mode 100644 core/redis/shard.go diff --git a/compose.yaml b/compose.yaml index ad51767..3f3d674 100644 --- a/compose.yaml +++ b/compose.yaml @@ -24,7 +24,7 @@ services: links: - postgresql - redis - shard0: + shard: restart: on-failure build: . hostname: shard diff --git a/core/redis/login.go b/core/redis/login.go new file mode 100644 index 0000000..c2d2a1a --- /dev/null +++ b/core/redis/login.go @@ -0,0 +1,51 @@ +package redis + +import ( + "encoding/json" + "fmt" + "strconv" + + "github.com/CPunch/gopenfusion/config" +) + +type LoginMetadata struct { + FEKey []byte `json:",omitempty"` + PlayerID int32 `json:",omitempty"` +} + +// we store login queues into redis with the name "loginMetadata_" +// set to expire after config.LOGIN_TIMEOUT duration. this way we can easily +// have a shared pool of active serial keys & player login data which any +// shard can pull from + +func makeLoginMetadataKey(serialKey int64) string { + return fmt.Sprintf("loginMetadata_%s", strconv.Itoa(int(serialKey))) +} + +func (r *RedisHandler) QueueLogin(serialKey int64, data LoginMetadata) error { + value, err := json.Marshal(data) + if err != nil { + return err + } + + // add to table + return r.client.Set(r.ctx, makeLoginMetadataKey(serialKey), value, config.LOGIN_TIMEOUT).Err() +} + +func (r *RedisHandler) GetLogin(serialKey int64) (LoginMetadata, error) { + value, err := r.client.Get(r.ctx, makeLoginMetadataKey(serialKey)).Result() + if err != nil { + return LoginMetadata{}, err + } + + var data LoginMetadata + if err := json.Unmarshal([]byte(value), &data); err != nil { + return LoginMetadata{}, err + } + + return data, nil +} + +func (r *RedisHandler) RemoveLogin(serialKey int64) error { + return r.client.Del(r.ctx, makeLoginMetadataKey(serialKey)).Err() +} diff --git a/core/redis/redis.go b/core/redis/redis.go index b876a22..f95968d 100644 --- a/core/redis/redis.go +++ b/core/redis/redis.go @@ -6,9 +6,6 @@ package redis import ( "context" - "encoding/json" - "fmt" - "strconv" "github.com/CPunch/gopenfusion/config" @@ -20,16 +17,6 @@ type RedisHandler struct { ctx context.Context } -type LoginMetadata struct { - FEKey []byte `json:",omitempty"` - PlayerID int32 `json:",omitempty"` -} - -type ShardMetadata struct { - IP string - Port int -} - const ( SHARD_SET = "shards" ) @@ -47,66 +34,3 @@ func OpenRedis(addr string) (*RedisHandler, error) { func (r *RedisHandler) Close() error { return r.client.Close() } - -// we store login queues into redis with the name "loginMetadata_" -// set to expire after config.LOGIN_TIMEOUT duration. this way we can easily -// have a shared pool of active serial keys & player login data which any -// shard can pull from - -func makeLoginMetadataKey(serialKey int64) string { - return fmt.Sprintf("loginMetadata_%s", strconv.Itoa(int(serialKey))) -} - -func (r *RedisHandler) QueueLogin(serialKey int64, data LoginMetadata) error { - value, err := json.Marshal(data) - if err != nil { - return err - } - - // add to table - return r.client.Set(r.ctx, makeLoginMetadataKey(serialKey), value, config.LOGIN_TIMEOUT).Err() -} - -func (r *RedisHandler) GetLogin(serialKey int64) (LoginMetadata, error) { - value, err := r.client.Get(r.ctx, makeLoginMetadataKey(serialKey)).Result() - if err != nil { - return LoginMetadata{}, err - } - - var data LoginMetadata - if err := json.Unmarshal([]byte(value), &data); err != nil { - return LoginMetadata{}, err - } - - return data, nil -} - -func (r *RedisHandler) RemoveLogin(serialKey int64) error { - return r.client.Del(r.ctx, makeLoginMetadataKey(serialKey)).Err() -} - -func (r *RedisHandler) RegisterShard(shard ShardMetadata) error { - value, err := json.Marshal(shard) - if err != nil { - return err - } - - return r.client.SAdd(r.ctx, SHARD_SET, value).Err() -} - -func (r *RedisHandler) GetShards() []ShardMetadata { - shardData := r.client.SMembers(r.ctx, SHARD_SET).Val() - - // unmarshal all shards - shards := make([]ShardMetadata, 0, len(shardData)) - for _, data := range shardData { - var shard ShardMetadata - if err := json.Unmarshal([]byte(data), &shard); err != nil { - continue - } - - shards = append(shards, shard) - } - - return shards -} diff --git a/core/redis/shard.go b/core/redis/shard.go new file mode 100644 index 0000000..8063cf3 --- /dev/null +++ b/core/redis/shard.go @@ -0,0 +1,34 @@ +package redis + +import "encoding/json" + +type ShardMetadata struct { + IP string + Port int +} + +func (r *RedisHandler) RegisterShard(shard ShardMetadata) error { + value, err := json.Marshal(shard) + if err != nil { + return err + } + + return r.client.SAdd(r.ctx, SHARD_SET, value).Err() +} + +func (r *RedisHandler) GetShards() []ShardMetadata { + shardData := r.client.SMembers(r.ctx, SHARD_SET).Val() + + // unmarshal all shards + shards := make([]ShardMetadata, 0, len(shardData)) + for _, data := range shardData { + var shard ShardMetadata + if err := json.Unmarshal([]byte(data), &shard); err != nil { + continue + } + + shards = append(shards, shard) + } + + return shards +}