add sound screen

This commit is contained in:
2026-09-10 03:36:41 +07:00
parent 9986d593d3
commit 3b85484701
9 changed files with 1097 additions and 401 deletions
+49 -4
View File
@@ -9,6 +9,7 @@ import (
"net/netip"
"strconv"
"strings"
"time"
"evening_detective_server/docs"
"evening_detective_server/internal/modules/file_storage"
@@ -93,6 +94,27 @@ func (s *server) GetScreenState(ctx context.Context, req *proto.GetScreenStateRe
return &proto.GetScreenStateRsp{State: screenState(session)}, nil
}
func (s *server) GetGameScreens(ctx context.Context, req *proto.GetGameScreensReq) (*proto.GetGameScreensRsp, error) {
if !canManageScreens(ctx) {
return nil, status.Error(codes.PermissionDenied, "permission denied")
}
if req == nil || req.GameId <= 0 {
return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор игры")
}
if _, err := s.gameService.GetGame(ctx, int(req.GameId)); err != nil {
return nil, status.Error(codes.NotFound, "игра не найдена")
}
sessions, err := s.screenRepo.ListByGame(ctx, int(req.GameId))
if err != nil {
return nil, status.Error(codes.Internal, "не удалось получить экраны игры")
}
states := make([]*proto.ScreenState, 0, len(sessions))
for _, session := range sessions {
states = append(states, screenState(session))
}
return &proto.GetGameScreensRsp{Screens: states}, nil
}
func (s *server) BindScreen(ctx context.Context, req *proto.BindScreenReq) (*proto.BindScreenRsp, error) {
if !canManageScreens(ctx) {
return nil, status.Error(codes.PermissionDenied, "permission denied")
@@ -141,6 +163,26 @@ func (s *server) UnbindScreen(ctx context.Context, req *proto.UnbindScreenReq) (
return &proto.UnbindScreenRsp{}, nil
}
func (s *server) SetScreenSound(ctx context.Context, req *proto.SetScreenSoundReq) (*proto.SetScreenSoundRsp, error) {
if !canManageScreens(ctx) {
return nil, status.Error(codes.PermissionDenied, "permission denied")
}
if req == nil || req.ScreenId == "" {
return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор экрана")
}
id, err := strconv.Atoi(req.ScreenId)
if err != nil || id <= 0 {
return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор экрана")
}
if err = s.screenRepo.SetSound(ctx, id, req.SoundEnabled); err != nil {
if errors.Is(err, screen_sessions_repo.ErrScreenNotFound) {
return nil, status.Error(codes.NotFound, "экран не найден")
}
return nil, status.Error(codes.Internal, "не удалось назначить экран со звуком")
}
return &proto.SetScreenSoundRsp{}, nil
}
func canManageScreens(ctx context.Context) bool {
claims, ok := ctx.Value("claims").(*processor_jwt.JWTClaims)
if !ok || claims == nil {
@@ -156,14 +198,17 @@ func hashScreenToken(token string) string {
func screenState(session *screen_sessions_repo.ScreenSession) *proto.ScreenState {
state := &proto.ScreenState{
Id: fmt.Sprint(session.ID),
Status: "waiting",
Mode: proto.ScreenMode_SCREEN_MODE_UNSPECIFIED,
Id: fmt.Sprint(session.ID),
Status: "disconnected",
SoundEnabled: session.Sound,
Mode: proto.ScreenMode_SCREEN_MODE_UNSPECIFIED,
}
if time.Since(session.LastSeen) <= 5*time.Second {
state.Status = "connected"
}
if session.GameID != nil {
gameID := int32(*session.GameID)
state.GameId = &gameID
state.Status = "bound"
state.Mode = proto.ScreenMode_SCREEN_MODE_COVER
}
return state