-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
111c9ac
commit 91626ed
Showing
11 changed files
with
266 additions
and
92 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,57 +1,29 @@ | ||
name: ci | ||
name: "Build and push" | ||
|
||
on: | ||
push: | ||
pull_request: | ||
types: [ opened, reopened ] | ||
|
||
env: | ||
IMAGE_NAME: ghcr.io/${{ github.repository }} | ||
branches: [main] | ||
pull_request: {} | ||
|
||
jobs: | ||
lint: | ||
runs-on: ubuntu-latest | ||
runs-on: "ubuntu-latest" | ||
steps: | ||
- uses: actions/setup-go@v4 | ||
with: | ||
go-version: "1.20" | ||
cache: false | ||
- uses: actions/checkout@v3 | ||
- name: go-lint | ||
uses: golangci/golangci-lint-action@v3 | ||
with: | ||
version: latest | ||
args: --timeout 2m0s | ||
|
||
build: | ||
if: github.event_name == 'push' && github.ref == 'refs/heads/main' | ||
needs: [ lint ] | ||
runs-on: ubuntu-latest | ||
outputs: | ||
image: ${{ steps.build.outputs.image }} | ||
- uses: "emortalmc/actions/go/lint@main" | ||
|
||
publish: | ||
needs: "lint" | ||
runs-on: "ubuntu-latest" | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@v3 | ||
|
||
- name: Login to container registry | ||
uses: docker/login-action@v2 | ||
- uses: "emortalmc/actions/go/publish-single@main" | ||
with: | ||
registry: ghcr.io | ||
username: ${{ github.actor }} | ||
password: ${{ secrets.GITHUB_TOKEN }} | ||
registry-password: "${{ secrets.GITHUB_TOKEN }}" | ||
|
||
- name: Set up Docker Buildx | ||
uses: docker/setup-buildx-action@v2 | ||
|
||
- name: Build and push | ||
uses: docker/build-push-action@v4 | ||
deploy: | ||
needs: "publish" | ||
runs-on: "ubuntu-latest" | ||
if: "github.ref == 'refs/heads/main'" | ||
steps: | ||
- uses: "emortalmc/actions/k8s-sync@main" | ||
with: | ||
context: . | ||
file: ./Dockerfile | ||
push: true | ||
platforms: linux/amd64,linux/arm64 | ||
cache-from: type=registry,ref=${{ env.IMAGE_NAME }}:latest | ||
cache-to: type=inline | ||
tags: | | ||
${{ env.IMAGE_NAME }}:${{ github.sha }} | ||
${{ env.IMAGE_NAME }}:latest | ||
manifest-path: "deployment.yaml" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
package config | ||
|
||
import ( | ||
"game-player-data/internal/repository/model" | ||
"github.com/google/uuid" | ||
) | ||
|
||
func CreateDefaultBlockSumoData(playerId uuid.UUID) *model.BlockSumoData { | ||
return &model.BlockSumoData{ | ||
PlayerId: playerId, | ||
BlockSlot: 2, | ||
ShearsSlot: 1, | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
package kafka | ||
|
||
import ( | ||
"context" | ||
"errors" | ||
"fmt" | ||
"game-player-data/internal/config" | ||
"game-player-data/internal/repository" | ||
pbmsg "github.com/emortalmc/proto-specs/gen/go/message/gameplayerdata" | ||
pbmodel "github.com/emortalmc/proto-specs/gen/go/model/gameplayerdata" | ||
"github.com/emortalmc/proto-specs/gen/go/nongenerated/kafkautils" | ||
"github.com/google/uuid" | ||
"github.com/segmentio/kafka-go" | ||
"go.mongodb.org/mongo-driver/mongo" | ||
"go.uber.org/zap" | ||
"google.golang.org/protobuf/proto" | ||
"google.golang.org/protobuf/types/known/anypb" | ||
"sync" | ||
) | ||
|
||
const GamePlayerDataTopic = "game-player-data" | ||
|
||
type consumer struct { | ||
logger *zap.SugaredLogger | ||
repo repository.Repository | ||
|
||
reader *kafka.Reader | ||
} | ||
|
||
func NewConsumer(ctx context.Context, wg *sync.WaitGroup, cfg *config.KafkaConfig, logger *zap.SugaredLogger, | ||
repo repository.Repository) { | ||
|
||
reader := kafka.NewReader(kafka.ReaderConfig{ | ||
Brokers: []string{fmt.Sprintf("%s:%d", cfg.Host, cfg.Port)}, | ||
GroupID: "game-player-data", | ||
GroupTopics: []string{GamePlayerDataTopic}, | ||
|
||
Logger: kafka.LoggerFunc(func(format string, args ...interface{}) { | ||
logger.Infow(fmt.Sprintf(format, args...)) | ||
}), | ||
ErrorLogger: kafka.LoggerFunc(func(format string, args ...interface{}) { | ||
logger.Errorw(fmt.Sprintf(format, args...)) | ||
}), | ||
}) | ||
|
||
c := &consumer{ | ||
logger: logger, | ||
repo: repo, | ||
|
||
reader: reader, | ||
} | ||
|
||
handler := kafkautils.NewConsumerHandler(logger, reader) | ||
handler.RegisterHandler(&pbmsg.UpdateGamePlayerDataMessage{}, c.handleUpdateGamePlayerDataMessage) | ||
|
||
logger.Infow("starting listening for kafka messages", "topics", reader.Config().GroupTopics) | ||
|
||
wg.Add(1) | ||
go func() { | ||
defer wg.Done() | ||
handler.Run(ctx) // Run is blocking until the context is cancelled | ||
if err := reader.Close(); err != nil { | ||
logger.Errorw("error closing kafka reader", "error", err) | ||
} | ||
}() | ||
} | ||
|
||
func (c *consumer) handleUpdateGamePlayerDataMessage(ctx context.Context, _ *kafka.Message, uncast proto.Message) { | ||
msg := uncast.(*pbmsg.UpdateGamePlayerDataMessage) | ||
|
||
pId, err := uuid.Parse(msg.PlayerId) | ||
if err != nil { | ||
c.logger.Errorw("failed to parse player id", "error", err) | ||
return | ||
} | ||
|
||
switch msg.GameMode { | ||
case pbmodel.GameDataGameMode_BLOCK_SUMO: | ||
err = c.handleBlockSumoUpdate(ctx, pId, msg) | ||
} | ||
|
||
if err != nil { | ||
c.logger.Errorw("failed to handle update", "error", err, "playerId", pId, "gameMode", msg.GameMode) | ||
return | ||
} | ||
} | ||
|
||
func (c *consumer) handleBlockSumoUpdate(ctx context.Context, pId uuid.UUID, msg *pbmsg.UpdateGamePlayerDataMessage) error { | ||
player, err := c.repo.GetBlockSumoData(ctx, pId) | ||
|
||
if err != nil { | ||
if !errors.Is(err, mongo.ErrNoDocuments) { | ||
return fmt.Errorf("failed to get block sumo data: %w", err) | ||
} | ||
|
||
player = config.CreateDefaultBlockSumoData(pId) | ||
} | ||
|
||
msgData := &pbmodel.BlockSumoPlayerData{} | ||
|
||
if err := anypb.UnmarshalTo(msg.Data, msgData, proto.UnmarshalOptions{}); err != nil { | ||
return fmt.Errorf("failed to unmarshal data: %w", err) | ||
} | ||
|
||
for _, path := range msg.DataMask.Paths { | ||
switch path { | ||
case "block_slot": | ||
player.BlockSlot = msgData.BlockSlot | ||
case "shears_slot": | ||
player.ShearsSlot = msgData.ShearsSlot | ||
} | ||
} | ||
|
||
return c.repo.SaveBlockSumoPlayer(ctx, player) | ||
} |
Oops, something went wrong.