Добавить API таймера экранов

This commit is contained in:
2026-09-21 17:58:51 +07:00
parent f07038f43a
commit 458bf320d4
6 changed files with 1207 additions and 715 deletions
+61 -23
View File
@@ -656,6 +656,17 @@ service EveningDetectiveServer {
};
}
rpc SetScreenTimer(SetScreenTimerReq) returns (SetScreenTimerRsp) {
option (google.api.http) = {
post: "/api/games/{gameId}/screens/timer"
body: "*"
};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
tags : "Экраны";
summary: "Настроить таймер экранов";
};
}
// Отправить общую команду экранам игры.
rpc SendScreenCommand(SendScreenCommandReq) returns (SendScreenCommandRsp) {
option (google.api.http) = {
@@ -1425,35 +1436,52 @@ enum ScreenMode {
SCREEN_MODE_CONCLUSION = 4;
SCREEN_MODE_CONCLUSION_DONE = 5;
SCREEN_MODE_RESULTS = 6;
SCREEN_MODE_TIMER = 7;
}
enum ScreenTimerState {
SCREEN_TIMER_STATE_UNSPECIFIED = 0;
SCREEN_TIMER_STATE_STOPPED = 1;
SCREEN_TIMER_STATE_RUNNING = 2;
SCREEN_TIMER_STATE_PAUSED = 3;
SCREEN_TIMER_STATE_FINISHED = 4;
}
enum ScreenCommand {
SCREEN_COMMAND_UNSPECIFIED = 0;
SCREEN_COMMAND_PLAY = 1;
SCREEN_COMMAND_PAUSE = 2;
SCREEN_COMMAND_RESUME = 3;
SCREEN_COMMAND_STOP = 4;
SCREEN_COMMAND_REPLAY = 5;
SCREEN_COMMAND_SEEK = 6;
SCREEN_COMMAND_VOLUME = 7;
SCREEN_COMMAND_UNSPECIFIED = 0;
SCREEN_COMMAND_PLAY = 1;
SCREEN_COMMAND_PAUSE = 2;
SCREEN_COMMAND_RESUME = 3;
SCREEN_COMMAND_STOP = 4;
SCREEN_COMMAND_REPLAY = 5;
SCREEN_COMMAND_SEEK = 6;
SCREEN_COMMAND_VOLUME = 7;
SCREEN_COMMAND_TIMER_START = 8;
SCREEN_COMMAND_TIMER_PAUSE = 9;
SCREEN_COMMAND_TIMER_RESUME = 10;
SCREEN_COMMAND_TIMER_RESET = 11;
}
message ScreenState {
string id = 1;
string status = 2;
optional int32 game_id = 3;
ScreenMode mode = 4;
bool sound_enabled = 5;
string error = 6;
int64 state_version = 7;
int64 position_ms = 8;
string game_name = 9;
string cover_image = 10;
string intro_audio = 11;
string conclusion_video = 12;
ScreenCommand command = 13;
int32 volume = 14;
string background_image = 15;
string id = 1;
string status = 2;
optional int32 game_id = 3;
ScreenMode mode = 4;
bool sound_enabled = 5;
string error = 6;
int64 state_version = 7;
int64 position_ms = 8;
string game_name = 9;
string cover_image = 10;
string intro_audio = 11;
string conclusion_video = 12;
ScreenCommand command = 13;
int32 volume = 14;
string background_image = 15;
string timer_label = 16;
int64 timer_duration_seconds = 17;
int64 timer_remaining_seconds = 18;
ScreenTimerState timer_state = 19;
}
message CreateScreenSessionReq {}
@@ -1551,6 +1579,16 @@ message SetScreenModeRsp {
string error = 1;
}
message SetScreenTimerReq {
int32 gameId = 1;
int64 duration_seconds = 2;
string label = 3;
}
message SetScreenTimerRsp {
string error = 1;
}
message SendScreenCommandReq {
int32 gameId = 1;
ScreenCommand command = 2;
+92 -2
View File
@@ -792,6 +792,46 @@
]
}
},
"/api/games/{gameId}/screens/timer": {
"post": {
"summary": "Настроить таймер экранов",
"operationId": "EveningDetectiveServer_SetScreenTimer",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/evening_detective_serverSetScreenTimerRsp"
}
},
"default": {
"description": "An unexpected error response.",
"schema": {
"$ref": "#/definitions/rpcStatus"
}
}
},
"parameters": [
{
"name": "gameId",
"in": "path",
"required": true,
"type": "integer",
"format": "int32"
},
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/EveningDetectiveServerSetScreenTimerBody"
}
}
],
"tags": [
"Экраны"
]
}
},
"/api/games/{gameId}/tickets": {
"post": {
"summary": "Выпустить билеты на игру",
@@ -3164,6 +3204,18 @@
}
}
},
"EveningDetectiveServerSetScreenTimerBody": {
"type": "object",
"properties": {
"durationSeconds": {
"type": "string",
"format": "int64"
},
"label": {
"type": "string"
}
}
},
"EveningDetectiveServerSetTeamAnswerScoreBody": {
"type": "object",
"properties": {
@@ -4457,7 +4509,11 @@
"SCREEN_COMMAND_STOP",
"SCREEN_COMMAND_REPLAY",
"SCREEN_COMMAND_SEEK",
"SCREEN_COMMAND_VOLUME"
"SCREEN_COMMAND_VOLUME",
"SCREEN_COMMAND_TIMER_START",
"SCREEN_COMMAND_TIMER_PAUSE",
"SCREEN_COMMAND_TIMER_RESUME",
"SCREEN_COMMAND_TIMER_RESET"
],
"default": "SCREEN_COMMAND_UNSPECIFIED"
},
@@ -4470,7 +4526,8 @@
"SCREEN_MODE_INTRO_DONE",
"SCREEN_MODE_CONCLUSION",
"SCREEN_MODE_CONCLUSION_DONE",
"SCREEN_MODE_RESULTS"
"SCREEN_MODE_RESULTS",
"SCREEN_MODE_TIMER"
],
"default": "SCREEN_MODE_UNSPECIFIED"
},
@@ -4525,9 +4582,34 @@
},
"backgroundImage": {
"type": "string"
},
"timerLabel": {
"type": "string"
},
"timerDurationSeconds": {
"type": "string",
"format": "int64"
},
"timerRemainingSeconds": {
"type": "string",
"format": "int64"
},
"timerState": {
"$ref": "#/definitions/evening_detective_serverScreenTimerState"
}
}
},
"evening_detective_serverScreenTimerState": {
"type": "string",
"enum": [
"SCREEN_TIMER_STATE_UNSPECIFIED",
"SCREEN_TIMER_STATE_STOPPED",
"SCREEN_TIMER_STATE_RUNNING",
"SCREEN_TIMER_STATE_PAUSED",
"SCREEN_TIMER_STATE_FINISHED"
],
"default": "SCREEN_TIMER_STATE_UNSPECIFIED"
},
"evening_detective_serverSendScreenCommandRsp": {
"type": "object",
"properties": {
@@ -4552,6 +4634,14 @@
}
}
},
"evening_detective_serverSetScreenTimerRsp": {
"type": "object",
"properties": {
"error": {
"type": "string"
}
}
},
"evening_detective_serverSetTeamAnswerScoreRsp": {
"type": "object",
"properties": {
+4
View File
@@ -218,6 +218,10 @@ func (s *server) SetScreenMode(ctx context.Context, req *proto.SetScreenModeReq)
return &proto.SetScreenModeRsp{}, nil
}
func (s *server) SetScreenTimer(context.Context, *proto.SetScreenTimerReq) (*proto.SetScreenTimerRsp, error) {
return nil, status.Error(codes.Unimplemented, "таймер экранов ещё не реализован")
}
func (s *server) SendScreenCommand(ctx context.Context, req *proto.SendScreenCommandReq) (*proto.SendScreenCommandRsp, error) {
if !canManageScreens(ctx) {
return nil, status.Error(codes.PermissionDenied, "permission denied")
+928 -690
View File
File diff suppressed because it is too large Load Diff
+84
View File
@@ -2090,6 +2090,51 @@ func local_request_EveningDetectiveServer_SetScreenMode_0(ctx context.Context, m
return msg, metadata, err
}
func request_EveningDetectiveServer_SetScreenTimer_0(ctx context.Context, marshaler runtime.Marshaler, client EveningDetectiveServerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var (
protoReq SetScreenTimerReq
metadata runtime.ServerMetadata
err error
)
if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if req.Body != nil {
_, _ = io.Copy(io.Discard, req.Body)
}
val, ok := pathParams["gameId"]
if !ok {
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "gameId")
}
protoReq.GameId, err = runtime.Int32(val)
if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "gameId", err)
}
msg, err := client.SetScreenTimer(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_EveningDetectiveServer_SetScreenTimer_0(ctx context.Context, marshaler runtime.Marshaler, server EveningDetectiveServerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var (
protoReq SetScreenTimerReq
metadata runtime.ServerMetadata
err error
)
if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
val, ok := pathParams["gameId"]
if !ok {
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "gameId")
}
protoReq.GameId, err = runtime.Int32(val)
if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "gameId", err)
}
msg, err := server.SetScreenTimer(ctx, &protoReq)
return msg, metadata, err
}
func request_EveningDetectiveServer_SendScreenCommand_0(ctx context.Context, marshaler runtime.Marshaler, client EveningDetectiveServerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var (
protoReq SendScreenCommandReq
@@ -4394,6 +4439,26 @@ func RegisterEveningDetectiveServerHandlerServer(ctx context.Context, mux *runti
}
forward_EveningDetectiveServer_SetScreenMode_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle(http.MethodPost, pattern_EveningDetectiveServer_SetScreenTimer_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
var stream runtime.ServerTransportStream
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/crabs.evening_detective_server.EveningDetectiveServer/SetScreenTimer", runtime.WithHTTPPathPattern("/api/games/{gameId}/screens/timer"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_EveningDetectiveServer_SetScreenTimer_0(annotatedContext, inboundMarshaler, server, req, pathParams)
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
if err != nil {
runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
return
}
forward_EveningDetectiveServer_SetScreenTimer_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle(http.MethodPost, pattern_EveningDetectiveServer_SendScreenCommand_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
@@ -5946,6 +6011,23 @@ func RegisterEveningDetectiveServerHandlerClient(ctx context.Context, mux *runti
}
forward_EveningDetectiveServer_SetScreenMode_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle(http.MethodPost, pattern_EveningDetectiveServer_SetScreenTimer_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/crabs.evening_detective_server.EveningDetectiveServer/SetScreenTimer", runtime.WithHTTPPathPattern("/api/games/{gameId}/screens/timer"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_EveningDetectiveServer_SetScreenTimer_0(annotatedContext, inboundMarshaler, client, req, pathParams)
annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
if err != nil {
runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
return
}
forward_EveningDetectiveServer_SetScreenTimer_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle(http.MethodPost, pattern_EveningDetectiveServer_SendScreenCommand_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
@@ -6482,6 +6564,7 @@ var (
pattern_EveningDetectiveServer_GetGameMap_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"api", "games", "gameId", "map"}, ""))
pattern_EveningDetectiveServer_UpdateGameMapItem_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 1, 0, 4, 1, 5, 6}, []string{"api", "games", "gameId", "map", "items", "kind", "itemId"}, ""))
pattern_EveningDetectiveServer_SetScreenMode_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 2, 4}, []string{"api", "games", "gameId", "screens", "mode"}, ""))
pattern_EveningDetectiveServer_SetScreenTimer_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 2, 4}, []string{"api", "games", "gameId", "screens", "timer"}, ""))
pattern_EveningDetectiveServer_SendScreenCommand_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 2, 4}, []string{"api", "games", "gameId", "screens", "command"}, ""))
pattern_EveningDetectiveServer_GetScreenResults_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "screens", "results"}, ""))
pattern_EveningDetectiveServer_DownloadTeamQR_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 2, 4}, []string{"api", "games", "id", "teams", "qr.pdf"}, ""))
@@ -6569,6 +6652,7 @@ var (
forward_EveningDetectiveServer_GetGameMap_0 = runtime.ForwardResponseMessage
forward_EveningDetectiveServer_UpdateGameMapItem_0 = runtime.ForwardResponseMessage
forward_EveningDetectiveServer_SetScreenMode_0 = runtime.ForwardResponseMessage
forward_EveningDetectiveServer_SetScreenTimer_0 = runtime.ForwardResponseMessage
forward_EveningDetectiveServer_SendScreenCommand_0 = runtime.ForwardResponseMessage
forward_EveningDetectiveServer_GetScreenResults_0 = runtime.ForwardResponseMessage
forward_EveningDetectiveServer_DownloadTeamQR_0 = runtime.ForwardResponseMessage
+38
View File
@@ -76,6 +76,7 @@ const (
EveningDetectiveServer_GetGameMap_FullMethodName = "/crabs.evening_detective_server.EveningDetectiveServer/GetGameMap"
EveningDetectiveServer_UpdateGameMapItem_FullMethodName = "/crabs.evening_detective_server.EveningDetectiveServer/UpdateGameMapItem"
EveningDetectiveServer_SetScreenMode_FullMethodName = "/crabs.evening_detective_server.EveningDetectiveServer/SetScreenMode"
EveningDetectiveServer_SetScreenTimer_FullMethodName = "/crabs.evening_detective_server.EveningDetectiveServer/SetScreenTimer"
EveningDetectiveServer_SendScreenCommand_FullMethodName = "/crabs.evening_detective_server.EveningDetectiveServer/SendScreenCommand"
EveningDetectiveServer_GetScreenResults_FullMethodName = "/crabs.evening_detective_server.EveningDetectiveServer/GetScreenResults"
EveningDetectiveServer_DownloadTeamQR_FullMethodName = "/crabs.evening_detective_server.EveningDetectiveServer/DownloadTeamQR"
@@ -175,6 +176,7 @@ type EveningDetectiveServerClient interface {
UpdateGameMapItem(ctx context.Context, in *UpdateGameMapItemReq, opts ...grpc.CallOption) (*UpdateGameMapItemRsp, error)
// Изменить общий режим показа всех экранов игры.
SetScreenMode(ctx context.Context, in *SetScreenModeReq, opts ...grpc.CallOption) (*SetScreenModeRsp, error)
SetScreenTimer(ctx context.Context, in *SetScreenTimerReq, opts ...grpc.CallOption) (*SetScreenTimerRsp, error)
// Отправить общую команду экранам игры.
SendScreenCommand(ctx context.Context, in *SendScreenCommandReq, opts ...grpc.CallOption) (*SendScreenCommandRsp, error)
GetScreenResults(ctx context.Context, in *GetScreenResultsReq, opts ...grpc.CallOption) (*GetScreenResultsRsp, error)
@@ -774,6 +776,16 @@ func (c *eveningDetectiveServerClient) SetScreenMode(ctx context.Context, in *Se
return out, nil
}
func (c *eveningDetectiveServerClient) SetScreenTimer(ctx context.Context, in *SetScreenTimerReq, opts ...grpc.CallOption) (*SetScreenTimerRsp, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(SetScreenTimerRsp)
err := c.cc.Invoke(ctx, EveningDetectiveServer_SetScreenTimer_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *eveningDetectiveServerClient) SendScreenCommand(ctx context.Context, in *SendScreenCommandReq, opts ...grpc.CallOption) (*SendScreenCommandRsp, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(SendScreenCommandRsp)
@@ -1123,6 +1135,7 @@ type EveningDetectiveServerServer interface {
UpdateGameMapItem(context.Context, *UpdateGameMapItemReq) (*UpdateGameMapItemRsp, error)
// Изменить общий режим показа всех экранов игры.
SetScreenMode(context.Context, *SetScreenModeReq) (*SetScreenModeRsp, error)
SetScreenTimer(context.Context, *SetScreenTimerReq) (*SetScreenTimerRsp, error)
// Отправить общую команду экранам игры.
SendScreenCommand(context.Context, *SendScreenCommandReq) (*SendScreenCommandRsp, error)
GetScreenResults(context.Context, *GetScreenResultsReq) (*GetScreenResultsRsp, error)
@@ -1330,6 +1343,9 @@ func (UnimplementedEveningDetectiveServerServer) UpdateGameMapItem(context.Conte
func (UnimplementedEveningDetectiveServerServer) SetScreenMode(context.Context, *SetScreenModeReq) (*SetScreenModeRsp, error) {
return nil, status.Error(codes.Unimplemented, "method SetScreenMode not implemented")
}
func (UnimplementedEveningDetectiveServerServer) SetScreenTimer(context.Context, *SetScreenTimerReq) (*SetScreenTimerRsp, error) {
return nil, status.Error(codes.Unimplemented, "method SetScreenTimer not implemented")
}
func (UnimplementedEveningDetectiveServerServer) SendScreenCommand(context.Context, *SendScreenCommandReq) (*SendScreenCommandRsp, error) {
return nil, status.Error(codes.Unimplemented, "method SendScreenCommand not implemented")
}
@@ -2444,6 +2460,24 @@ func _EveningDetectiveServer_SetScreenMode_Handler(srv interface{}, ctx context.
return interceptor(ctx, in, info, handler)
}
func _EveningDetectiveServer_SetScreenTimer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(SetScreenTimerReq)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(EveningDetectiveServerServer).SetScreenTimer(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: EveningDetectiveServer_SetScreenTimer_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(EveningDetectiveServerServer).SetScreenTimer(ctx, req.(*SetScreenTimerReq))
}
return interceptor(ctx, in, info, handler)
}
func _EveningDetectiveServer_SendScreenCommand_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(SendScreenCommandReq)
if err := dec(in); err != nil {
@@ -3179,6 +3213,10 @@ var EveningDetectiveServer_ServiceDesc = grpc.ServiceDesc{
MethodName: "SetScreenMode",
Handler: _EveningDetectiveServer_SetScreenMode_Handler,
},
{
MethodName: "SetScreenTimer",
Handler: _EveningDetectiveServer_SetScreenTimer_Handler,
},
{
MethodName: "SendScreenCommand",
Handler: _EveningDetectiveServer_SendScreenCommand_Handler,