mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-07-01 19:13:55 -07:00
Judge mode (#3531)
* Judge mode * Use seperate judge icon * Fix clang init ordering complaint * Create gavel.svg * Add judge level * Adjust judge permissions. * - Tag events caused by judges - Allow judges access to card right click menus. * Allow judges to change phase / turn. * Remove gavel from pawn * Make judge action text black. * Create scales * Rename scales to scales.svg * Use scales * remove gavel * - Address PR feedback - Fix sort order * Zach * add option to servatrice.ini
This commit is contained in:
parent
9d27b36704
commit
ea8201af5c
42 changed files with 375 additions and 105 deletions
|
|
@ -26,7 +26,7 @@ AbstractCounter::AbstractCounter(Player *_player,
|
|||
|
||||
shortcutActive = false;
|
||||
|
||||
if (player->getLocal()) {
|
||||
if (player->getLocalOrJudge()) {
|
||||
menu = new QMenu(name);
|
||||
aSet = new QAction(this);
|
||||
connect(aSet, SIGNAL(triggered()), this, SLOT(setCounter()));
|
||||
|
|
@ -115,7 +115,7 @@ void AbstractCounter::setValue(int _value)
|
|||
|
||||
void AbstractCounter::mousePressEvent(QGraphicsSceneMouseEvent *event)
|
||||
{
|
||||
if (isUnderMouse() && player->getLocal()) {
|
||||
if (isUnderMouse() && player->getLocalOrJudge()) {
|
||||
if (event->button() == Qt::MidButton || (QApplication::keyboardModifiers() & Qt::ShiftModifier)) {
|
||||
if (menu)
|
||||
menu->exec(event->screenPos());
|
||||
|
|
|
|||
|
|
@ -321,7 +321,7 @@ void CardItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
|
|||
const ZoneViewZone *view = static_cast<const ZoneViewZone *>(zone);
|
||||
if (view->getRevealZone() && !view->getWriteableRevealZone())
|
||||
return;
|
||||
} else if (!owner->getLocal())
|
||||
} else if (!owner->getLocalOrJudge())
|
||||
return;
|
||||
|
||||
bool forceFaceDown = event->modifiers().testFlag(Qt::ShiftModifier);
|
||||
|
|
@ -352,7 +352,7 @@ void CardItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
|
|||
void CardItem::playCard(bool faceDown)
|
||||
{
|
||||
// Do nothing if the card belongs to another player
|
||||
if (!owner->getLocal())
|
||||
if (!owner->getLocalOrJudge())
|
||||
return;
|
||||
|
||||
TableZone *tz = qobject_cast<TableZone *>(zone);
|
||||
|
|
|
|||
|
|
@ -71,8 +71,9 @@ public:
|
|||
QWidget *parent = 0);
|
||||
void retranslateUi();
|
||||
void appendHtml(const QString &html);
|
||||
void
|
||||
appendHtmlServerMessage(const QString &html, bool optionalIsBold = false, QString optionalFontColor = QString());
|
||||
void virtual appendHtmlServerMessage(const QString &html,
|
||||
bool optionalIsBold = false,
|
||||
QString optionalFontColor = QString());
|
||||
void appendMessage(QString message,
|
||||
RoomMessageTypeFlags messageType = 0,
|
||||
QString sender = QString(),
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
#include "dlg_creategame.h"
|
||||
#include "settingscache.h"
|
||||
#include "tab_room.h"
|
||||
#include <QApplication>
|
||||
#include <QCheckBox>
|
||||
#include <QDialogButtonBox>
|
||||
#include <QGridLayout>
|
||||
|
|
@ -223,6 +224,7 @@ void DlgCreateGame::actOK()
|
|||
cmd.set_spectators_need_password(spectatorsNeedPasswordCheckBox->isChecked());
|
||||
cmd.set_spectators_can_talk(spectatorsCanTalkCheckBox->isChecked());
|
||||
cmd.set_spectators_see_everything(spectatorsSeeEverythingCheckBox->isChecked());
|
||||
cmd.set_join_as_judge(QApplication::keyboardModifiers() & Qt::ShiftModifier);
|
||||
|
||||
QString gameTypes = QString();
|
||||
QMapIterator<int, QRadioButton *> gameTypeCheckBoxIterator(gameTypeCheckBoxes);
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
#include "pending_command.h"
|
||||
#include "tab_room.h"
|
||||
#include "tab_supervisor.h"
|
||||
#include <QApplication>
|
||||
#include <QCheckBox>
|
||||
#include <QDebug>
|
||||
#include <QHBoxLayout>
|
||||
|
|
@ -205,6 +206,7 @@ void GameSelector::actJoin()
|
|||
cmd.set_password(password.toStdString());
|
||||
cmd.set_spectator(spectator);
|
||||
cmd.set_override_restrictions(overrideRestrictions);
|
||||
cmd.set_join_as_judge((QApplication::keyboardModifiers() & Qt::ShiftModifier) != 0);
|
||||
|
||||
TabRoom *r = tabSupervisor->getRoomTabs().value(game.room_id());
|
||||
if (!r) {
|
||||
|
|
|
|||
|
|
@ -121,9 +121,11 @@ MessageLogWidget::getFromStr(CardZone *zone, QString cardName, int position, boo
|
|||
|
||||
void MessageLogWidget::containerProcessingDone()
|
||||
{
|
||||
|
||||
if (currentContext == MessageContext_MoveCard) {
|
||||
for (auto &i : moveCardQueue)
|
||||
logDoMoveCard(i);
|
||||
|
||||
moveCardQueue.clear();
|
||||
moveCardTapped.clear();
|
||||
moveCardExtras.clear();
|
||||
|
|
@ -134,6 +136,7 @@ void MessageLogWidget::containerProcessingDone()
|
|||
}
|
||||
|
||||
currentContext = MessageContext_None;
|
||||
messageSuffix = messagePrefix = QString();
|
||||
}
|
||||
|
||||
void MessageLogWidget::containerProcessingStarted(const GameEventContext &context)
|
||||
|
|
@ -815,6 +818,18 @@ void MessageLogWidget::logUndoDraw(Player *player, QString cardName)
|
|||
.arg(QString("<a href=\"card://%1\">%2</a>").arg(sanitizeHtml(cardName)).arg(sanitizeHtml(cardName))));
|
||||
}
|
||||
|
||||
void MessageLogWidget::setContextJudgeName(QString name)
|
||||
{
|
||||
messagePrefix = QString("<span style=\"color:black\">");
|
||||
messageSuffix = QString("</span> [<img height=12 src=\"theme:icons/scales\"> %1]").arg(sanitizeHtml(name));
|
||||
}
|
||||
|
||||
void MessageLogWidget::appendHtmlServerMessage(const QString &html, bool optionalIsBold, QString optionalFontColor)
|
||||
{
|
||||
|
||||
ChatView::appendHtmlServerMessage(messagePrefix + html + messageSuffix, optionalIsBold, optionalFontColor);
|
||||
}
|
||||
|
||||
void MessageLogWidget::connectToPlayer(Player *player)
|
||||
{
|
||||
connect(player, SIGNAL(logSay(Player *, QString)), this, SLOT(logSay(Player *, QString)));
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ private:
|
|||
QList<LogMoveCard> moveCardQueue;
|
||||
QMap<CardItem *, bool> moveCardTapped;
|
||||
QList<QString> moveCardExtras;
|
||||
QString messagePrefix, messageSuffix;
|
||||
|
||||
const QString tableConstant() const;
|
||||
const QString graveyardConstant() const;
|
||||
|
|
@ -108,6 +109,10 @@ public slots:
|
|||
void logStopDumpZone(Player *player, CardZone *zone);
|
||||
void logUnattachCard(Player *player, QString cardName);
|
||||
void logUndoDraw(Player *player, QString cardName);
|
||||
void setContextJudgeName(QString player);
|
||||
void appendHtmlServerMessage(const QString &html,
|
||||
bool optionalIsBold = false,
|
||||
QString optionalFontColor = QString()) override;
|
||||
|
||||
public:
|
||||
void connectToPlayer(Player *player);
|
||||
|
|
|
|||
|
|
@ -143,6 +143,7 @@ QPixmap UserLevelPixmapGenerator::generatePixmap(int height, UserLevelFlags user
|
|||
|
||||
QPixmap pixmap = QPixmap("theme:userlevels/" + levelString)
|
||||
.scaled(height, height, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||
|
||||
pmCache.insert(key, pixmap);
|
||||
return pixmap;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
|
||||
#include "pb/command_attach_card.pb.h"
|
||||
#include "pb/command_change_zone_properties.pb.h"
|
||||
#include "pb/command_concede.pb.h"
|
||||
#include "pb/command_create_token.pb.h"
|
||||
#include "pb/command_draw_cards.pb.h"
|
||||
#include "pb/command_flip_card.pb.h"
|
||||
|
|
@ -91,10 +92,11 @@ void PlayerArea::setSize(qreal width, qreal height)
|
|||
bRect = QRectF(0, 0, width, height);
|
||||
}
|
||||
|
||||
Player::Player(const ServerInfo_User &info, int _id, bool _local, TabGame *_parent)
|
||||
Player::Player(const ServerInfo_User &info, int _id, bool _local, bool _judge, TabGame *_parent)
|
||||
: QObject(_parent), game(_parent), shortcutsActive(false), defaultNumberTopCards(1),
|
||||
defaultNumberTopCardsToPlaceBelow(1), lastTokenDestroy(true), lastTokenTableRow(0), id(_id), active(false),
|
||||
local(_local), mirrored(false), handVisible(false), conceded(false), dialogSemaphore(false), deck(nullptr)
|
||||
local(_local), judge(_judge), mirrored(false), handVisible(false), conceded(false), dialogSemaphore(false),
|
||||
deck(nullptr)
|
||||
{
|
||||
userInfo = new ServerInfo_User;
|
||||
userInfo->CopyFrom(info);
|
||||
|
|
@ -140,10 +142,12 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, TabGame *_pare
|
|||
|
||||
updateBoundingRect();
|
||||
|
||||
if (local) {
|
||||
if (local || judge) {
|
||||
connect(_parent, SIGNAL(playerAdded(Player *)), this, SLOT(addPlayer(Player *)));
|
||||
connect(_parent, SIGNAL(playerRemoved(Player *)), this, SLOT(removePlayer(Player *)));
|
||||
}
|
||||
|
||||
if (local || judge) {
|
||||
aMoveHandToTopLibrary = new QAction(this);
|
||||
aMoveHandToTopLibrary->setData(QList<QVariant>() << "deck" << 0);
|
||||
aMoveHandToBottomLibrary = new QAction(this);
|
||||
|
|
@ -204,7 +208,7 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, TabGame *_pare
|
|||
aViewRfg = new QAction(this);
|
||||
connect(aViewRfg, SIGNAL(triggered()), this, SLOT(actViewRfg()));
|
||||
|
||||
if (local) {
|
||||
if (local || judge) {
|
||||
aViewSideboard = new QAction(this);
|
||||
connect(aViewSideboard, SIGNAL(triggered()), this, SLOT(actViewSideboard()));
|
||||
|
||||
|
|
@ -237,7 +241,7 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, TabGame *_pare
|
|||
playerMenu = new QMenu(QString());
|
||||
table->setMenu(playerMenu);
|
||||
|
||||
if (local) {
|
||||
if (local || judge) {
|
||||
handMenu = playerMenu->addMenu(QString());
|
||||
playerLists.append(mRevealHand = handMenu->addMenu(QString()));
|
||||
playerLists.append(mRevealRandomHandCard = handMenu->addMenu(QString()));
|
||||
|
|
@ -286,7 +290,7 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, TabGame *_pare
|
|||
graveMenu = playerMenu->addMenu(QString());
|
||||
graveMenu->addAction(aViewGraveyard);
|
||||
|
||||
if (local) {
|
||||
if (local || judge) {
|
||||
mRevealRandomGraveyardCard = graveMenu->addMenu(QString());
|
||||
QAction *newAction = mRevealRandomGraveyardCard->addAction(QString());
|
||||
newAction->setData(-1);
|
||||
|
|
@ -300,7 +304,7 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, TabGame *_pare
|
|||
rfgMenu->addAction(aViewRfg);
|
||||
rfg->setMenu(rfgMenu, aViewRfg);
|
||||
|
||||
if (local) {
|
||||
if (local || judge) {
|
||||
graveMenu->addSeparator();
|
||||
moveGraveMenu = graveMenu->addMenu(QString());
|
||||
moveGraveMenu->addAction(aMoveGraveToTopLibrary);
|
||||
|
|
@ -349,12 +353,22 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, TabGame *_pare
|
|||
playerMenu->addAction(aCreateAnotherToken);
|
||||
playerMenu->addMenu(createPredefinedTokenMenu);
|
||||
playerMenu->addSeparator();
|
||||
}
|
||||
|
||||
if (local) {
|
||||
sayMenu = playerMenu->addMenu(QString());
|
||||
initSayMenu();
|
||||
}
|
||||
|
||||
if (local || judge) {
|
||||
aCardMenu = new QAction(this);
|
||||
playerMenu->addSeparator();
|
||||
playerMenu->addAction(aCardMenu);
|
||||
} else {
|
||||
aCardMenu = nullptr;
|
||||
}
|
||||
|
||||
if (local || judge) {
|
||||
|
||||
for (auto &playerList : playerLists) {
|
||||
QAction *newAction = playerList->addAction(QString());
|
||||
|
|
@ -363,12 +377,13 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, TabGame *_pare
|
|||
allPlayersActions.append(newAction);
|
||||
playerList->addSeparator();
|
||||
}
|
||||
} else {
|
||||
}
|
||||
|
||||
if (!local && !judge) {
|
||||
countersMenu = nullptr;
|
||||
sbMenu = nullptr;
|
||||
aCreateAnotherToken = nullptr;
|
||||
createPredefinedTokenMenu = nullptr;
|
||||
aCardMenu = nullptr;
|
||||
}
|
||||
|
||||
aTap = new QAction(this);
|
||||
|
|
@ -632,7 +647,7 @@ void Player::retranslateUi()
|
|||
graveMenu->setTitle(tr("&Graveyard"));
|
||||
rfgMenu->setTitle(tr("&Exile"));
|
||||
|
||||
if (local) {
|
||||
if (local || judge) {
|
||||
moveHandMenu->setTitle(tr("&Move hand to..."));
|
||||
aMoveHandToTopLibrary->setText(tr("&Top of library"));
|
||||
aMoveHandToBottomLibrary->setText(tr("&Bottom of library"));
|
||||
|
|
@ -684,7 +699,6 @@ void Player::retranslateUi()
|
|||
aCreateToken->setText(tr("&Create token..."));
|
||||
aCreateAnotherToken->setText(tr("C&reate another token"));
|
||||
createPredefinedTokenMenu->setTitle(tr("Cr&eate predefined token"));
|
||||
sayMenu->setTitle(tr("S&ay"));
|
||||
|
||||
QMapIterator<int, AbstractCounter *> counterIterator(counters);
|
||||
while (counterIterator.hasNext())
|
||||
|
|
@ -696,6 +710,10 @@ void Player::retranslateUi()
|
|||
allPlayersAction->setText(tr("&All players"));
|
||||
}
|
||||
|
||||
if (local) {
|
||||
sayMenu->setTitle(tr("S&ay"));
|
||||
}
|
||||
|
||||
aPlay->setText(tr("&Play"));
|
||||
aHide->setText(tr("&Hide"));
|
||||
aPlayFacedown->setText(tr("Play &Face Down"));
|
||||
|
|
@ -2122,7 +2140,7 @@ AbstractCounter *Player::addCounter(int counterId, const QString &name, QColor c
|
|||
ctr = new GeneralCounter(this, counterId, name, color, radius, value, true, this);
|
||||
}
|
||||
counters.insert(counterId, ctr);
|
||||
if (countersMenu) {
|
||||
if (countersMenu && ctr->getMenu()) {
|
||||
countersMenu->addMenu(ctr->getMenu());
|
||||
}
|
||||
if (shortcutsActive) {
|
||||
|
|
@ -2254,17 +2272,47 @@ void Player::rearrangeCounters()
|
|||
|
||||
PendingCommand *Player::prepareGameCommand(const google::protobuf::Message &cmd)
|
||||
{
|
||||
return game->prepareGameCommand(cmd);
|
||||
|
||||
if (judge && !local) {
|
||||
Command_Judge base;
|
||||
GameCommand *c = base.add_game_command();
|
||||
base.set_target_id(id);
|
||||
c->GetReflection()->MutableMessage(c, cmd.GetDescriptor()->FindExtensionByName("ext"))->CopyFrom(cmd);
|
||||
return game->prepareGameCommand(base);
|
||||
} else {
|
||||
return game->prepareGameCommand(cmd);
|
||||
}
|
||||
}
|
||||
|
||||
PendingCommand *Player::prepareGameCommand(const QList<const ::google::protobuf::Message *> &cmdList)
|
||||
{
|
||||
return game->prepareGameCommand(cmdList);
|
||||
if (judge && !local) {
|
||||
Command_Judge base;
|
||||
base.set_target_id(id);
|
||||
for (int i = 0; i < cmdList.size(); ++i) {
|
||||
GameCommand *c = base.add_game_command();
|
||||
c->GetReflection()
|
||||
->MutableMessage(c, cmdList[i]->GetDescriptor()->FindExtensionByName("ext"))
|
||||
->CopyFrom(*cmdList[i]);
|
||||
delete cmdList[i];
|
||||
}
|
||||
return game->prepareGameCommand(base);
|
||||
} else {
|
||||
return game->prepareGameCommand(cmdList);
|
||||
}
|
||||
}
|
||||
|
||||
void Player::sendGameCommand(const google::protobuf::Message &command)
|
||||
{
|
||||
game->sendGameCommand(command, id);
|
||||
if (judge && !local) {
|
||||
Command_Judge base;
|
||||
GameCommand *c = base.add_game_command();
|
||||
base.set_target_id(id);
|
||||
c->GetReflection()->MutableMessage(c, command.GetDescriptor()->FindExtensionByName("ext"))->CopyFrom(command);
|
||||
game->sendGameCommand(base, id);
|
||||
} else {
|
||||
game->sendGameCommand(command, id);
|
||||
}
|
||||
}
|
||||
|
||||
void Player::sendGameCommand(PendingCommand *pend)
|
||||
|
|
@ -2806,7 +2854,7 @@ void Player::refreshShortcuts()
|
|||
void Player::updateCardMenu(const CardItem *card)
|
||||
{
|
||||
// If bad card OR is a spectator (as spectators don't need card menus), return
|
||||
if (card == nullptr || game->isSpectator()) {
|
||||
if (card == nullptr || (game->isSpectator() && !judge)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -2817,7 +2865,7 @@ void Player::updateCardMenu(const CardItem *card)
|
|||
cardMenu->clear();
|
||||
|
||||
bool revealedCard = false;
|
||||
bool writeableCard = getLocal();
|
||||
bool writeableCard = getLocalOrJudge();
|
||||
if (card->getZone() && card->getZone()->getIsView()) {
|
||||
auto *view = dynamic_cast<ZoneViewZone *>(card->getZone());
|
||||
if (view->getRevealZone()) {
|
||||
|
|
|
|||
|
|
@ -228,6 +228,7 @@ private:
|
|||
int id;
|
||||
bool active;
|
||||
bool local;
|
||||
bool judge;
|
||||
bool mirrored;
|
||||
bool handVisible;
|
||||
bool conceded;
|
||||
|
|
@ -339,8 +340,9 @@ public:
|
|||
return playerTarget;
|
||||
}
|
||||
|
||||
Player(const ServerInfo_User &info, int _id, bool _local, TabGame *_parent);
|
||||
Player(const ServerInfo_User &info, int _id, bool _local, bool _judge, TabGame *_parent);
|
||||
~Player() override;
|
||||
|
||||
void retranslateUi();
|
||||
void clear();
|
||||
TabGame *getGame() const
|
||||
|
|
@ -365,6 +367,14 @@ public:
|
|||
{
|
||||
return local;
|
||||
}
|
||||
bool getLocalOrJudge() const
|
||||
{
|
||||
return local || judge;
|
||||
}
|
||||
bool getJudge() const
|
||||
{
|
||||
return judge;
|
||||
}
|
||||
bool getMirrored() const
|
||||
{
|
||||
return mirrored;
|
||||
|
|
|
|||
|
|
@ -58,6 +58,7 @@ PlayerListWidget::PlayerListWidget(TabSupervisor *_tabSupervisor,
|
|||
notReadyIcon = QPixmap("theme:icons/not_ready_start");
|
||||
concededIcon = QPixmap("theme:icons/conceded");
|
||||
playerIcon = QPixmap("theme:icons/player");
|
||||
judgeIcon = QPixmap("theme:icons/scales");
|
||||
spectatorIcon = QPixmap("theme:icons/spectator");
|
||||
lockIcon = QPixmap("theme:icons/lock");
|
||||
|
||||
|
|
@ -111,8 +112,16 @@ void PlayerListWidget::updatePlayerProperties(const ServerInfo_PlayerProperties
|
|||
return;
|
||||
|
||||
bool isSpectator = prop.has_spectator() && prop.spectator();
|
||||
player->setIcon(1, isSpectator ? spectatorIcon : playerIcon);
|
||||
player->setData(1, Qt::UserRole, !isSpectator);
|
||||
if (prop.has_judge() || prop.has_spectator()) {
|
||||
if (prop.has_judge() && prop.judge()) {
|
||||
player->setIcon(1, judgeIcon);
|
||||
} else if (isSpectator) {
|
||||
player->setIcon(1, spectatorIcon);
|
||||
} else {
|
||||
player->setIcon(1, playerIcon);
|
||||
}
|
||||
player->setData(1, Qt::UserRole, !isSpectator);
|
||||
}
|
||||
|
||||
if (!isSpectator) {
|
||||
if (prop.has_conceded())
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ private:
|
|||
AbstractClient *client;
|
||||
TabGame *game;
|
||||
UserContextMenu *userContextMenu;
|
||||
QIcon readyIcon, notReadyIcon, concededIcon, playerIcon, spectatorIcon, lockIcon;
|
||||
QIcon readyIcon, notReadyIcon, concededIcon, playerIcon, judgeIcon, spectatorIcon, lockIcon;
|
||||
bool gameStarted;
|
||||
signals:
|
||||
void openMessageDialog(const QString &userName, bool focus);
|
||||
|
|
|
|||
|
|
@ -332,8 +332,8 @@ void DeckViewContainer::setDeck(const DeckLoader &deck)
|
|||
|
||||
TabGame::TabGame(TabSupervisor *_tabSupervisor, GameReplay *_replay)
|
||||
: Tab(_tabSupervisor), secondsElapsed(0), hostId(-1), localPlayerId(-1),
|
||||
isLocalGame(_tabSupervisor->getIsLocalGame()), spectator(true), gameStateKnown(false), resuming(false),
|
||||
currentPhase(-1), activeCard(nullptr), gameClosed(false), replay(_replay), currentReplayStep(0),
|
||||
isLocalGame(_tabSupervisor->getIsLocalGame()), spectator(true), judge(false), gameStateKnown(false),
|
||||
resuming(false), currentPhase(-1), activeCard(nullptr), gameClosed(false), replay(_replay), currentReplayStep(0),
|
||||
sayLabel(nullptr), sayEdit(nullptr)
|
||||
{
|
||||
// THIS CTOR IS USED ON REPLAY
|
||||
|
|
@ -393,8 +393,8 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor,
|
|||
const QMap<int, QString> &_roomGameTypes)
|
||||
: Tab(_tabSupervisor), clients(_clients), gameInfo(event.game_info()), roomGameTypes(_roomGameTypes),
|
||||
hostId(event.host_id()), localPlayerId(event.player_id()), isLocalGame(_tabSupervisor->getIsLocalGame()),
|
||||
spectator(event.spectator()), gameStateKnown(false), resuming(event.resuming()), currentPhase(-1),
|
||||
activeCard(nullptr), gameClosed(false), replay(nullptr), replayDock(nullptr)
|
||||
spectator(event.spectator()), judge(event.judge()), gameStateKnown(false), resuming(event.resuming()),
|
||||
currentPhase(-1), activeCard(nullptr), gameClosed(false), replay(nullptr), replayDock(nullptr)
|
||||
{
|
||||
// THIS CTOR IS USED ON GAMES
|
||||
gameInfo.set_started(false);
|
||||
|
|
@ -751,7 +751,7 @@ void TabGame::actCompleterChanged()
|
|||
Player *TabGame::addPlayer(int playerId, const ServerInfo_User &info)
|
||||
{
|
||||
bool local = ((clients.size() > 1) || (playerId == localPlayerId));
|
||||
auto *newPlayer = new Player(info, playerId, local, this);
|
||||
auto *newPlayer = new Player(info, playerId, local, judge, this);
|
||||
connect(newPlayer, SIGNAL(openDeckEditor(const DeckLoader *)), this, SIGNAL(openDeckEditor(const DeckLoader *)));
|
||||
QString newPlayerName = "@" + newPlayer->getName();
|
||||
if (sayEdit && !autocompleteUserList.contains(newPlayerName)) {
|
||||
|
|
@ -789,6 +789,17 @@ void TabGame::processGameEventContainer(const GameEventContainer &cont, Abstract
|
|||
const GameEvent &event = cont.event_list(i);
|
||||
const int playerId = event.player_id();
|
||||
const auto eventType = static_cast<GameEvent::GameEventType>(getPbExtension(event));
|
||||
|
||||
if (cont.has_forced_by_judge()) {
|
||||
auto id = cont.forced_by_judge();
|
||||
Player *judgep = players.value(id, nullptr);
|
||||
if (judgep) {
|
||||
messageLog->setContextJudgeName(judgep->getName());
|
||||
} else if (spectators.contains(id)) {
|
||||
messageLog->setContextJudgeName(QString::fromStdString(spectators.value(id).name()));
|
||||
}
|
||||
}
|
||||
|
||||
if (spectators.contains(playerId)) {
|
||||
switch (eventType) {
|
||||
case GameEvent::GAME_SAY:
|
||||
|
|
|
|||
|
|
@ -124,6 +124,7 @@ private:
|
|||
int localPlayerId;
|
||||
const bool isLocalGame;
|
||||
bool spectator;
|
||||
bool judge;
|
||||
QMap<int, Player *> players;
|
||||
QMap<int, ServerInfo_User> spectators;
|
||||
bool gameStateKnown;
|
||||
|
|
|
|||
|
|
@ -44,6 +44,8 @@ UserContextMenu::UserContextMenu(const TabSupervisor *_tabSupervisor, QWidget *p
|
|||
aBanHistory = new QAction(QString(), this);
|
||||
aPromoteToMod = new QAction(QString(), this);
|
||||
aDemoteFromMod = new QAction(QString(), this);
|
||||
aPromoteToJudge = new QAction(QString(), this);
|
||||
aDemoteFromJudge = new QAction(QString(), this);
|
||||
|
||||
retranslateUi();
|
||||
}
|
||||
|
|
@ -64,6 +66,8 @@ void UserContextMenu::retranslateUi()
|
|||
aBanHistory->setText(tr("View user's &ban history"));
|
||||
aPromoteToMod->setText(tr("&Promote user to moderator"));
|
||||
aDemoteFromMod->setText(tr("Dem&ote user from moderator"));
|
||||
aPromoteToJudge->setText(tr("Promote user to &juge"));
|
||||
aDemoteFromJudge->setText(tr("Demote user from judge"));
|
||||
}
|
||||
|
||||
void UserContextMenu::gamesOfUserReceived(const Response &resp, const CommandContainer &commandContainer)
|
||||
|
|
@ -220,7 +224,7 @@ void UserContextMenu::adjustMod_processUserResponse(const Response &resp, const
|
|||
const Command_AdjustMod &cmd = commandContainer.admin_command(0).GetExtension(Command_AdjustMod::ext);
|
||||
|
||||
if (resp.response_code() == Response::RespOk) {
|
||||
if (cmd.should_be_mod()) {
|
||||
if (cmd.should_be_mod() || cmd.should_be_judge()) {
|
||||
QMessageBox::information(static_cast<QWidget *>(parent()), tr("Success"),
|
||||
tr("Successfully promoted user."));
|
||||
} else {
|
||||
|
|
@ -228,7 +232,7 @@ void UserContextMenu::adjustMod_processUserResponse(const Response &resp, const
|
|||
}
|
||||
|
||||
} else {
|
||||
if (cmd.should_be_mod()) {
|
||||
if (cmd.should_be_mod() || cmd.should_be_judge()) {
|
||||
QMessageBox::information(static_cast<QWidget *>(parent()), tr("Failed"), tr("Failed to promote user."));
|
||||
} else {
|
||||
QMessageBox::information(static_cast<QWidget *>(parent()), tr("Failed"), tr("Failed to demote user."));
|
||||
|
|
@ -312,6 +316,15 @@ void UserContextMenu::showContextMenu(const QPoint &pos,
|
|||
(tabSupervisor->getUserInfo()->user_level() & ServerInfo_User::IsAdmin)) {
|
||||
menu->addAction(aPromoteToMod);
|
||||
}
|
||||
|
||||
if (userLevel.testFlag(ServerInfo_User::IsJudge) &&
|
||||
(tabSupervisor->getUserInfo()->user_level() & ServerInfo_User::IsAdmin)) {
|
||||
menu->addAction(aDemoteFromJudge);
|
||||
|
||||
} else if (userLevel.testFlag(ServerInfo_User::IsRegistered) &&
|
||||
(tabSupervisor->getUserInfo()->user_level() & ServerInfo_User::IsAdmin)) {
|
||||
menu->addAction(aPromoteToJudge);
|
||||
}
|
||||
}
|
||||
bool anotherUser = userName != tabSupervisor->getOwnUsername();
|
||||
aDetails->setEnabled(true);
|
||||
|
|
@ -389,6 +402,15 @@ void UserContextMenu::showContextMenu(const QPoint &pos,
|
|||
cmd.set_user_name(userName.toStdString());
|
||||
cmd.set_should_be_mod(actionClicked == aPromoteToMod);
|
||||
|
||||
PendingCommand *pend = client->prepareAdminCommand(cmd);
|
||||
connect(pend, SIGNAL(finished(Response, CommandContainer, QVariant)), this,
|
||||
SLOT(adjustMod_processUserResponse(Response, CommandContainer)));
|
||||
client->sendCommand(pend);
|
||||
} else if (actionClicked == aPromoteToJudge || actionClicked == aDemoteFromJudge) {
|
||||
Command_AdjustMod cmd;
|
||||
cmd.set_user_name(userName.toStdString());
|
||||
cmd.set_should_be_judge(actionClicked == aPromoteToJudge);
|
||||
|
||||
PendingCommand *pend = client->prepareAdminCommand(cmd);
|
||||
connect(pend, SIGNAL(finished(Response, CommandContainer, QVariant)), this,
|
||||
SLOT(adjustMod_processUserResponse(Response, CommandContainer)));
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ private:
|
|||
QAction *aKick;
|
||||
QAction *aBan, *aBanHistory;
|
||||
QAction *aPromoteToMod, *aDemoteFromMod;
|
||||
QAction *aPromoteToJudge, *aDemoteFromJudge;
|
||||
QAction *aWarnUser, *aWarnHistory;
|
||||
signals:
|
||||
void openMessageDialog(const QString &userName, bool focus);
|
||||
|
|
|
|||
|
|
@ -109,6 +109,9 @@ void UserInfoBox::updateInfo(const ServerInfo_User &user)
|
|||
else
|
||||
userLevelText = tr("Unregistered user");
|
||||
|
||||
if (userLevel.testFlag(ServerInfo_User::IsJudge))
|
||||
userLevelText += " | " + tr("Judge");
|
||||
|
||||
if (user.has_privlevel() && user.privlevel() != "NONE") {
|
||||
userLevelText += " | " + QString("%1").arg(user.privlevel().c_str());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -307,7 +307,7 @@ bool UserListTWI::operator<(const QTreeWidgetItem &other) const
|
|||
|
||||
// Sort by user level
|
||||
if (data(0, Qt::UserRole) != other.data(0, Qt::UserRole))
|
||||
return data(0, Qt::UserRole).toInt() > other.data(0, Qt::UserRole).toInt();
|
||||
return (data(0, Qt::UserRole).toInt() & 15) > (other.data(0, Qt::UserRole).toInt() & 15);
|
||||
|
||||
// Sort by name
|
||||
return QString::localeAwareCompare(data(2, Qt::UserRole).toString(), other.data(2, Qt::UserRole).toString()) < 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue