2026-06-17 11:30:18 +08:00

127 lines
3.5 KiB
Go

package robotclient
import (
"context"
"fmt"
"strings"
"time"
"hyapp-admin-server/internal/appctx"
robotv1 "hyapp.local/api/proto/robot/v1"
"google.golang.org/grpc"
)
type Client interface {
ListGameRobots(ctx context.Context, req ListGameRobotsRequest) (ListGameRobotsResult, error)
ListRoomRobots(ctx context.Context, req ListRoomRobotsRequest) (ListRoomRobotsResult, error)
}
type Robot struct {
UserID int64
Status string
RoomScene string
CreatedAtMS int64
UpdatedAtMS int64
LastUsedAtMS int64
UsedCount int64
}
type ListRoomRobotsRequest struct {
RoomScene string
Status string
PageSize int32
Cursor string
}
type ListGameRobotsRequest struct {
GameID string
Status string
PageSize int32
Cursor string
}
type ListRoomRobotsResult struct {
Robots []Robot
NextCursor string
ServerTimeMS int64
}
type ListGameRobotsResult struct {
Robots []Robot
NextCursor string
ServerTimeMS int64
}
type GRPCClient struct {
gameClient robotv1.GameRobotServiceClient
roomClient robotv1.RoomRobotServiceClient
}
func NewGRPC(conn grpc.ClientConnInterface) *GRPCClient {
return &GRPCClient{
gameClient: robotv1.NewGameRobotServiceClient(conn),
roomClient: robotv1.NewRoomRobotServiceClient(conn),
}
}
func (c *GRPCClient) ListGameRobots(ctx context.Context, req ListGameRobotsRequest) (ListGameRobotsResult, error) {
if c == nil || c.gameClient == nil {
return ListGameRobotsResult{}, fmt.Errorf("game robot service client is not configured")
}
resp, err := c.gameClient.ListGameRobots(ctx, &robotv1.ListGameRobotsRequest{
Meta: requestMeta(ctx, "admin-game-robots"),
GameId: strings.TrimSpace(req.GameID),
Status: strings.TrimSpace(req.Status),
PageSize: req.PageSize,
Cursor: strings.TrimSpace(req.Cursor),
})
if err != nil {
return ListGameRobotsResult{}, err
}
return ListGameRobotsResult{Robots: robotsFromProto(resp.GetRobots()), NextCursor: resp.GetNextCursor(), ServerTimeMS: resp.GetServerTimeMs()}, nil
}
func (c *GRPCClient) ListRoomRobots(ctx context.Context, req ListRoomRobotsRequest) (ListRoomRobotsResult, error) {
if c == nil || c.roomClient == nil {
return ListRoomRobotsResult{}, fmt.Errorf("robot service client is not configured")
}
resp, err := c.roomClient.ListRoomRobots(ctx, &robotv1.ListRoomRobotsRequest{
Meta: requestMeta(ctx, "admin-room-robots"),
RoomScene: strings.TrimSpace(req.RoomScene),
Status: strings.TrimSpace(req.Status),
PageSize: req.PageSize,
Cursor: strings.TrimSpace(req.Cursor),
})
if err != nil {
return ListRoomRobotsResult{}, err
}
return ListRoomRobotsResult{Robots: robotsFromProto(resp.GetRobots()), NextCursor: resp.GetNextCursor(), ServerTimeMS: resp.GetServerTimeMs()}, nil
}
func requestMeta(ctx context.Context, prefix string) *robotv1.RequestMeta {
return &robotv1.RequestMeta{
RequestId: fmt.Sprintf("%s-%d", prefix, time.Now().UnixMilli()),
Caller: "admin-server",
AppCode: appctx.FromContext(ctx),
SentAtMs: time.Now().UnixMilli(),
ActorUserId: 0,
}
}
func robotsFromProto(source []*robotv1.Robot) []Robot {
items := make([]Robot, 0, len(source))
for _, item := range source {
items = append(items, Robot{
UserID: item.GetUserId(),
Status: item.GetStatus(),
RoomScene: item.GetRoomScene(),
CreatedAtMS: item.GetCreatedAtMs(),
UpdatedAtMS: item.GetUpdatedAtMs(),
LastUsedAtMS: item.GetLastUsedAtMs(),
UsedCount: item.GetUsedCount(),
})
}
return items
}