[Server] Add extension points for tournament game commands

Adds the server-side seams the tournament engine will plug into:
- Dispatch ReportMatchResult / AdvanceTournament /
  TournamentSettingsSelect in processGameCommand; base implementations
  return RespContextError so regular games reject them safely
- Server_AbstractPlayer::setDeck lets a backend install a deck into a
  player slot directly
- Server_Room::getUserInterfaceByName resolves a room user by name for
  automated game setup


Took 24 minutes
This commit is contained in:
Lukas Brübach 2026-08-24 08:54:54 +02:00 committed by GitHub
parent 5cea39a1fc
commit 7d1ad2191a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 63 additions and 0 deletions

View file

@ -41,6 +41,7 @@
#include <libcockatrice/protocol/pb/command_set_sideboard_lock.pb.h> #include <libcockatrice/protocol/pb/command_set_sideboard_lock.pb.h>
#include <libcockatrice/protocol/pb/command_set_sideboard_plan.pb.h> #include <libcockatrice/protocol/pb/command_set_sideboard_plan.pb.h>
#include <libcockatrice/protocol/pb/command_shuffle.pb.h> #include <libcockatrice/protocol/pb/command_shuffle.pb.h>
#include <libcockatrice/protocol/pb/command_tournament.pb.h>
#include <libcockatrice/protocol/pb/command_undo_draw.pb.h> #include <libcockatrice/protocol/pb/command_undo_draw.pb.h>
#include <libcockatrice/protocol/pb/context_connection_state_changed.pb.h> #include <libcockatrice/protocol/pb/context_connection_state_changed.pb.h>
#include <libcockatrice/protocol/pb/event_game_say.pb.h> #include <libcockatrice/protocol/pb/event_game_say.pb.h>
@ -536,6 +537,15 @@ Server_AbstractParticipant::processGameCommand(const GameCommand &command, Respo
case GameCommand::SET_PLAYMAT: case GameCommand::SET_PLAYMAT:
return cmdSetPlaymat(command.GetExtension(Command_SetPlaymat::ext), rc, ges); return cmdSetPlaymat(command.GetExtension(Command_SetPlaymat::ext), rc, ges);
break; break;
case GameCommand::REPORT_MATCH_RESULT:
return cmdReportMatchResult(command.GetExtension(Command_ReportMatchResult::ext), rc, ges);
break;
case GameCommand::ADVANCE_TOURNAMENT:
return cmdAdvanceTournament(command.GetExtension(Command_AdvanceTournament::ext), rc, ges);
break;
case GameCommand::TOURNAMENT_SETTINGS_SELECT:
return cmdTournamentSettingsSelect(command.GetExtension(Command_TournamentSettingsSelect::ext), rc, ges);
break;
default: default:
return Response::RespInvalidCommand; return Response::RespInvalidCommand;
} }
@ -584,3 +594,25 @@ void Server_AbstractParticipant::getInfo(ServerInfo_Player *info,
{ {
getProperties(*info->mutable_properties(), withUserInfo); getProperties(*info->mutable_properties(), withUserInfo);
} }
Response::ResponseCode Server_AbstractParticipant::cmdReportMatchResult(const Command_ReportMatchResult & /*cmd*/,
ResponseContainer & /*rc*/,
GameEventStorage & /*ges*/)
{
return Response::RespContextError;
}
Response::ResponseCode Server_AbstractParticipant::cmdAdvanceTournament(const Command_AdvanceTournament & /*cmd*/,
ResponseContainer & /*rc*/,
GameEventStorage & /*ges*/)
{
return Response::RespContextError;
}
Response::ResponseCode
Server_AbstractParticipant::cmdTournamentSettingsSelect(const Command_TournamentSettingsSelect & /*cmd*/,
ResponseContainer & /*rc*/,
GameEventStorage & /*ges*/)
{
return Response::RespContextError;
}

View file

@ -53,6 +53,9 @@ class Command_DeckSelect;
class Command_SetSideboardLock; class Command_SetSideboardLock;
class Command_ChangeZoneProperties; class Command_ChangeZoneProperties;
class Command_SetPlaymat; class Command_SetPlaymat;
class Command_ReportMatchResult;
class Command_AdvanceTournament;
class Command_TournamentSettingsSelect;
class Server_AbstractParticipant : public Server_ArrowTarget, public ServerInfo_User_Container class Server_AbstractParticipant : public Server_ArrowTarget, public ServerInfo_User_Container
{ {
@ -175,6 +178,13 @@ public:
cmdReverseTurn(const Command_ReverseTurn & /*cmd*/, ResponseContainer & /*rc*/, GameEventStorage &ges); cmdReverseTurn(const Command_ReverseTurn & /*cmd*/, ResponseContainer & /*rc*/, GameEventStorage &ges);
virtual Response::ResponseCode virtual Response::ResponseCode
cmdChangeZoneProperties(const Command_ChangeZoneProperties &cmd, ResponseContainer &rc, GameEventStorage &ges); cmdChangeZoneProperties(const Command_ChangeZoneProperties &cmd, ResponseContainer &rc, GameEventStorage &ges);
virtual Response::ResponseCode
cmdReportMatchResult(const Command_ReportMatchResult &cmd, ResponseContainer &rc, GameEventStorage &ges);
virtual Response::ResponseCode
cmdAdvanceTournament(const Command_AdvanceTournament &cmd, ResponseContainer &rc, GameEventStorage &ges);
virtual Response::ResponseCode cmdTournamentSettingsSelect(const Command_TournamentSettingsSelect &cmd,
ResponseContainer &rc,
GameEventStorage &ges);
Response::ResponseCode processGameCommand(const GameCommand &command, ResponseContainer &rc, GameEventStorage &ges); Response::ResponseCode processGameCommand(const GameCommand &command, ResponseContainer &rc, GameEventStorage &ges);
void sendGameEvent(const GameEventContainer &event); void sendGameEvent(const GameEventContainer &event);

View file

@ -1663,3 +1663,9 @@ void Server_AbstractPlayer::getPlayerProperties(ServerInfo_PlayerProperties &res
playmatParams->set_zoom(playmat.params.zoom); playmatParams->set_zoom(playmat.params.zoom);
} }
} }
void Server_AbstractPlayer::setDeck(DeckList *_deck)
{
delete deck;
deck = _deck;
}

View file

@ -47,6 +47,7 @@ public:
{ {
return deck; return deck;
} }
void setDeck(DeckList *_deck);
bool getReadyStart() const bool getReadyStart() const
{ {
return readyStart; return readyStart;

View file

@ -363,6 +363,18 @@ void Server_Room::broadcastGameListUpdate(const ServerInfo_Game &gameInfo, bool
sendRoomEvent(prepareRoomEvent(event), sendToIsl); sendRoomEvent(prepareRoomEvent(event), sendToIsl);
} }
Server_AbstractUserInterface *Server_Room::getUserInterfaceByName(const QString &name) const
{
usersLock.lockForRead();
auto it = users.constFind(name);
Server_AbstractUserInterface *result = nullptr;
if (it != users.constEnd()) {
result = it.value();
}
usersLock.unlock();
return result;
}
void Server_Room::addGame(Server_Game *game) void Server_Room::addGame(Server_Game *game)
{ {
ServerInfo_Room roomInfo; ServerInfo_Room roomInfo;

View file

@ -135,6 +135,8 @@ public:
void addGame(Server_Game *game); void addGame(Server_Game *game);
void removeGame(Server_Game *game); void removeGame(Server_Game *game);
Server_AbstractUserInterface *getUserInterfaceByName(const QString &name) const;
void sendRoomEvent(RoomEvent *event, bool sendToIsl = true); void sendRoomEvent(RoomEvent *event, bool sendToIsl = true);
RoomEvent *prepareRoomEvent(const ::google::protobuf::Message &roomEvent); RoomEvent *prepareRoomEvent(const ::google::protobuf::Message &roomEvent);
}; };