add screen

This commit is contained in:
2026-09-10 03:11:20 +07:00
parent 8fb3de92c8
commit e95a5423b5
65 changed files with 3026 additions and 2427 deletions
+177 -10
View File
@@ -194,8 +194,8 @@ service EveningDetectiveServer {
body: "*"
};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
tags: "Пользователи";
summary: "Изменить чужой пароль (только администратор)";
tags : "Пользователи";
summary : "Изменить чужой пароль (только администратор)";
description: "Пароль вводится вручную: минимум 12 символов, максимум 72 байта. Сеансы сохраняются. Ошибки: 401 — нет авторизации, 403 — нет прав, 400 — неверные данные или собственный ID, 404 — пользователь не найден, 500 — ошибка сохранения.";
};
}
@@ -437,11 +437,11 @@ service EveningDetectiveServer {
// Видео загружается через UploadFile (MP4/WebM). Пустая conclusion удаляет закрывашку.
rpc UpdateScenarioConclusion(UpdateScenarioConclusionReq) returns (UpdateScenarioConclusionRsp) {
option (google.api.http) = {
put: "/api/scenarios/{id}/conclusion"
put : "/api/scenarios/{id}/conclusion"
body: "*"
};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
tags: "Сценарии";
tags : "Сценарии";
summary: "Обновить закрывашку сценария (игрокам не передаётся)";
};
}
@@ -498,6 +498,84 @@ service EveningDetectiveServer {
};
}
// Создать сессию экрана. Экран получает токен и показывает QR для привязки.
rpc CreateScreenSession(CreateScreenSessionReq) returns (CreateScreenSessionRsp) {
option (google.api.http) = {
post: "/api/screens"
body: "*"
};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
security: {
security_requirement: {}
}
tags : "Экраны";
summary: "Создать сессию экрана";
};
}
// Получить состояние экрана по его токену. Вызывается самим экраном.
rpc GetScreenState(GetScreenStateReq) returns (GetScreenStateRsp) {
option (google.api.http) = {
post: "/api/screens/state"
body: "*"
};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
security: {
security_requirement: {}
}
tags : "Экраны";
summary: "Получить состояние экрана";
};
}
// Привязать экран к игре. Требует авторизацию организатора, автора или администратора.
rpc BindScreen(BindScreenReq) returns (BindScreenRsp) {
option (google.api.http) = {
post: "/api/screens/{screenId}/bind"
body: "*"
};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
tags : "Экраны";
summary: "Привязать экран к игре";
};
}
// Отвязать экран от игры. Требует авторизацию организатора, автора или администратора.
rpc UnbindScreen(UnbindScreenReq) returns (UnbindScreenRsp) {
option (google.api.http) = {
post: "/api/screens/{screenId}/unbind"
body: "*"
};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
tags : "Экраны";
summary: "Отвязать экран от игры";
};
}
// Изменить общий режим показа всех экранов игры.
rpc SetScreenMode(SetScreenModeReq) returns (SetScreenModeRsp) {
option (google.api.http) = {
post: "/api/games/{gameId}/screens/mode"
body: "*"
};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
tags : "Экраны";
summary: "Изменить режим показа экранов";
};
}
// Отправить общую команду экранам игры.
rpc SendScreenCommand(SendScreenCommandReq) returns (SendScreenCommandRsp) {
option (google.api.http) = {
post: "/api/games/{gameId}/screens/command"
body: "*"
};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
tags : "Экраны";
summary: "Отправить команду экранам";
};
}
rpc DownloadTeamQR(GetGameReq) returns (google.api.HttpBody) {
option (google.api.http) = {
get: "/api/games/{id}/teams/qr.pdf"
@@ -841,7 +919,7 @@ message GetMeRsp {
}
message ChangeUserPasswordReq {
int32 id = 1;
int32 id = 1;
string new_password = 2;
}
@@ -943,7 +1021,7 @@ message Story {
}
message Conclusion {
string text = 1;
string text = 1;
string video = 2;
}
@@ -1083,7 +1161,7 @@ message DeleteScenarioPlaceRsp {
}
message UpdateScenarioConclusionReq {
int32 id = 1;
int32 id = 1;
Conclusion conclusion = 2;
}
@@ -1168,6 +1246,95 @@ message Game {
optional google.protobuf.Timestamp ended_at = 9;
}
enum ScreenMode {
SCREEN_MODE_UNSPECIFIED = 0;
SCREEN_MODE_COVER = 1;
SCREEN_MODE_INTRO = 2;
SCREEN_MODE_INTRO_DONE = 3;
SCREEN_MODE_CONCLUSION = 4;
SCREEN_MODE_CONCLUSION_DONE = 5;
SCREEN_MODE_RESULTS = 6;
}
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;
}
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;
}
message CreateScreenSessionReq {}
message CreateScreenSessionRsp {
string error = 1;
string screen_id = 2;
string access_token = 3;
}
message GetScreenStateReq {
string screenId = 1;
string accessToken = 2;
}
message GetScreenStateRsp {
string error = 1;
ScreenState state = 2;
}
message BindScreenReq {
string screenId = 1;
string accessToken = 2;
int32 gameId = 3;
}
message BindScreenRsp {
string error = 1;
ScreenState state = 2;
}
message UnbindScreenReq {
string screenId = 1;
}
message UnbindScreenRsp {
string error = 1;
}
message SetScreenModeReq {
int32 gameId = 1;
ScreenMode mode = 2;
}
message SetScreenModeRsp {
string error = 1;
}
message SendScreenCommandReq {
int32 gameId = 1;
ScreenCommand command = 2;
int64 position_ms = 3;
int32 volume = 4;
}
message SendScreenCommandRsp {
string error = 1;
}
message Team {
int32 id = 1;
string name = 2;
@@ -1330,9 +1497,9 @@ message GetTeamStoryReq {
}
message GetTeamStoryRsp {
string error = 1;
Story story = 2;
Game game = 3;
string error = 1;
Story story = 2;
Game game = 3;
repeated TeamAction actions = 4;
}