This commit is contained in:
2026-10-07 01:43:28 +07:00
parent 494b3fc471
commit e0caa0b409
23 changed files with 5264 additions and 963 deletions
+41
View File
@@ -49,6 +49,42 @@ func (s *server) GetScreenState(ctx context.Context, req *proto.GetScreenStateRe
return &proto.GetScreenStateRsp{State: state}, nil
}
func (s *server) AdvanceScreenMusic(ctx context.Context, req *proto.AdvanceScreenMusicReq) (*proto.AdvanceScreenMusicRsp, error) {
if req == nil || req.ScreenID == "" || req.AccessToken == "" {
return nil, status.Error(codes.InvalidArgument, "некорректные данные экрана")
}
id, err := strconv.Atoi(req.ScreenID)
if err != nil || id <= 0 {
return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор экрана")
}
session, err := s.screenService.Get(ctx, id, hashScreenToken(req.AccessToken))
if errors.Is(err, screen_service.ErrScreenNotFound) {
return nil, status.Error(codes.Unauthenticated, "недействительная сессия экрана")
}
if err != nil || session.GameID == nil {
return nil, status.Error(codes.FailedPrecondition, "экран не привязан к игре")
}
state, err := s.playlistService.GetGame(ctx, *session.GameID)
if err != nil || state.Playlist == nil || len(state.Playlist.Tracks) == 0 {
return &proto.AdvanceScreenMusicRsp{State: mapMusicState(state)}, nil
}
next := state.TrackIndex + 1
playback := state.Playback
if next >= len(state.Playlist.Tracks) {
if state.Loop {
next = 0
} else {
next = len(state.Playlist.Tracks) - 1
playback = 1
}
}
updated, err := s.playlistService.SetGame(ctx, *session.GameID, state.Playlist.ID, next, 0, state.Volume, state.Loop, playback)
if err != nil {
return nil, status.Error(codes.Internal, "не удалось переключить трек")
}
return &proto.AdvanceScreenMusicRsp{State: mapMusicState(updated)}, 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")
@@ -201,6 +237,11 @@ func (s *server) enrichScreenState(ctx context.Context, session *screen_service.
if session.GameID == nil {
return
}
if s.playlistService != nil {
if music, err := s.playlistService.GetGame(ctx, *session.GameID); err == nil {
state.Music = mapMusicState(music)
}
}
game, err := s.gameService.GetGameMedia(ctx, *session.GameID)
if err != nil {
return