diff --git a/cockatrice/cockatrice.pro b/cockatrice/cockatrice.pro index a9fd180d..cd59d143 100644 --- a/cockatrice/cockatrice.pro +++ b/cockatrice/cockatrice.pro @@ -58,6 +58,7 @@ HEADERS += src/abstractcounter.h \ src/tab_game.h \ src/tab_deck_storage.h \ src/tab_supervisor.h \ + src/tab_admin.h \ src/userlist.h \ src/userinfobox.h \ src/remotedecklist_treewidget.h \ @@ -139,6 +140,7 @@ SOURCES += src/abstractcounter.cpp \ src/tab_game.cpp \ src/tab_deck_storage.cpp \ src/tab_supervisor.cpp \ + src/tab_admin.cpp \ src/userlist.cpp \ src/userinfobox.cpp \ src/remotedecklist_treewidget.cpp \ diff --git a/cockatrice/src/localserverinterface.h b/cockatrice/src/localserverinterface.h index 0f954844..f88d4940 100644 --- a/cockatrice/src/localserverinterface.h +++ b/cockatrice/src/localserverinterface.h @@ -16,6 +16,7 @@ private: ResponseCode cmdDeckDel(Command_DeckDel * /*cmd*/, CommandContainer * /*cont*/) { return RespFunctionNotAllowed; } ResponseCode cmdDeckUpload(Command_DeckUpload * /*cmd*/, CommandContainer * /*cont*/) { return RespFunctionNotAllowed; } ResponseCode cmdDeckDownload(Command_DeckDownload * /*cmd*/, CommandContainer * /*cont*/) { return RespFunctionNotAllowed; } + ResponseCode cmdUpdateServerMessage(Command_UpdateServerMessage * /*cmd*/, CommandContainer * /*cont*/) { return RespFunctionNotAllowed; } public: LocalServerInterface(LocalServer *_server); ~LocalServerInterface(); diff --git a/cockatrice/src/remoteclient.cpp b/cockatrice/src/remoteclient.cpp index 876f1b72..e378fb8b 100644 --- a/cockatrice/src/remoteclient.cpp +++ b/cockatrice/src/remoteclient.cpp @@ -43,15 +43,16 @@ void RemoteClient::slotConnected() void RemoteClient::loginResponse(ProtocolResponse *response) { - Response_Login *resp = qobject_cast(response); - if (!resp) - disconnectFromServer(); - - if (resp->getResponseCode() == RespOk) { + if (response->getResponseCode() == RespOk) { + Response_Login *resp = qobject_cast(response); + if (!resp) { + disconnectFromServer(); + return; + } setStatus(StatusLoggedIn); emit userInfoChanged(resp->getUserInfo()); } else { - emit serverError(resp->getResponseCode()); + emit serverError(response->getResponseCode()); setStatus(StatusDisconnecting); } } diff --git a/cockatrice/src/tab_admin.cpp b/cockatrice/src/tab_admin.cpp new file mode 100644 index 00000000..3c520077 --- /dev/null +++ b/cockatrice/src/tab_admin.cpp @@ -0,0 +1,66 @@ +#include +#include +#include +#include +#include "tab_admin.h" +#include "abstractclient.h" +#include "protocol_items.h" + +TabAdmin::TabAdmin(AbstractClient *_client, QWidget *parent) + : Tab(parent), client(_client) +{ + updateServerMessageButton = new QPushButton; + connect(updateServerMessageButton, SIGNAL(clicked()), this, SLOT(actUpdateServerMessage())); + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->addWidget(updateServerMessageButton); + vbox->addStretch(); + + adminGroupBox = new QGroupBox; + adminGroupBox->setLayout(vbox); + adminGroupBox->setEnabled(false); + + unlockButton = new QPushButton; + connect(unlockButton, SIGNAL(clicked()), this, SLOT(actUnlock())); + lockButton = new QPushButton; + lockButton->setEnabled(false); + connect(lockButton, SIGNAL(clicked()), this, SLOT(actLock())); + + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addWidget(adminGroupBox); + mainLayout->addWidget(unlockButton); + mainLayout->addWidget(lockButton); + + retranslateUi(); + setLayout(mainLayout); +} + +void TabAdmin::retranslateUi() +{ + updateServerMessageButton->setText(tr("Update server &message")); + adminGroupBox->setTitle(tr("Server administration functions")); + + unlockButton->setText(tr("&Unlock functions")); + lockButton->setText(tr("&Lock functions")); +} + +void TabAdmin::actUpdateServerMessage() +{ + client->sendCommand(new Command_UpdateServerMessage()); +} + +void TabAdmin::actUnlock() +{ + if (QMessageBox::question(this, tr("Unlock administration functions"), tr("Do you really want to unlock the administration functions?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { + adminGroupBox->setEnabled(true); + lockButton->setEnabled(true); + unlockButton->setEnabled(false); + } +} + +void TabAdmin::actLock() +{ + adminGroupBox->setEnabled(false); + lockButton->setEnabled(false); + unlockButton->setEnabled(true); +} \ No newline at end of file diff --git a/cockatrice/src/tab_admin.h b/cockatrice/src/tab_admin.h new file mode 100644 index 00000000..f3d9b860 --- /dev/null +++ b/cockatrice/src/tab_admin.h @@ -0,0 +1,29 @@ +#ifndef TAB_ADMIN_H +#define TAB_ADMIN_H + +#include "tab.h" + +class AbstractClient; + +class QGroupBox; +class QPushButton; + +class TabAdmin : public Tab { + Q_OBJECT +private: + AbstractClient *client; + QPushButton *updateServerMessageButton; + QGroupBox *adminGroupBox; + QPushButton *unlockButton, *lockButton; +private slots: + void actUpdateServerMessage(); + + void actUnlock(); + void actLock(); +public: + TabAdmin(AbstractClient *_client, QWidget *parent = 0); + void retranslateUi(); + QString getTabText() const { return tr("Administration"); } +}; + +#endif diff --git a/cockatrice/src/tab_server.cpp b/cockatrice/src/tab_server.cpp index 8db7e41d..5c4766c2 100644 --- a/cockatrice/src/tab_server.cpp +++ b/cockatrice/src/tab_server.cpp @@ -163,6 +163,7 @@ void TabServer::retranslateUi() void TabServer::processServerMessageEvent(Event_ServerMessage *event) { serverInfoBox->setHtml(event->getMessage()); + emit userEvent(); } void TabServer::processListUsersResponse(ProtocolResponse *response) diff --git a/cockatrice/src/tab_supervisor.cpp b/cockatrice/src/tab_supervisor.cpp index 148409ee..70f712b2 100644 --- a/cockatrice/src/tab_supervisor.cpp +++ b/cockatrice/src/tab_supervisor.cpp @@ -5,13 +5,14 @@ #include "tab_room.h" #include "tab_game.h" #include "tab_deck_storage.h" +#include "tab_admin.h" #include "tab_message.h" #include "protocol_items.h" #include "pixmapgenerator.h" #include TabSupervisor:: TabSupervisor(QWidget *parent) - : QTabWidget(parent), client(0), tabServer(0), tabDeckStorage(0) + : QTabWidget(parent), client(0), tabServer(0), tabDeckStorage(0), tabAdmin(0) { tabChangedIcon = new QIcon(":/resources/icon_tab_changed.svg"); setElideMode(Qt::ElideRight); @@ -69,8 +70,17 @@ void TabSupervisor::start(AbstractClient *_client, ServerInfo_User *userInfo) myAddTab(tabServer); updatePingTime(0, -1); - tabDeckStorage = new TabDeckStorage(client); - myAddTab(tabDeckStorage); + if (userInfo->getUserLevel() & ServerInfo_User::IsRegistered) { + tabDeckStorage = new TabDeckStorage(client); + myAddTab(tabDeckStorage); + } else + tabDeckStorage = 0; + + if (userInfo->getUserLevel() & ServerInfo_User::IsAdmin) { + tabAdmin = new TabAdmin(client); + myAddTab(tabAdmin); + } else + tabAdmin = 0; retranslateUi(); } @@ -124,6 +134,8 @@ void TabSupervisor::updatePingTime(int value, int max) { if (!tabServer) return; + if (tabServer->getContentsChanged()) + return; setTabIcon(0, QIcon(PingPixmapGenerator::generatePixmap(15, value, max))); } diff --git a/cockatrice/src/tab_supervisor.h b/cockatrice/src/tab_supervisor.h index 413d37be..f10140ec 100644 --- a/cockatrice/src/tab_supervisor.h +++ b/cockatrice/src/tab_supervisor.h @@ -11,6 +11,7 @@ class TabServer; class TabRoom; class TabGame; class TabDeckStorage; +class TabAdmin; class TabMessage; class RoomEvent; class GameEventContainer; @@ -28,6 +29,7 @@ private: QList localClients; TabServer *tabServer; TabDeckStorage *tabDeckStorage; + TabAdmin *tabAdmin; QMap roomTabs; QMap gameTabs; QMap messageTabs; diff --git a/common/protocol.h b/common/protocol.h index 522b4974..15c99d40 100644 --- a/common/protocol.h +++ b/common/protocol.h @@ -162,6 +162,15 @@ public: void setGameId(int _gameId) { static_cast(itemMap.value("game_id"))->setData(_gameId); } }; +class AdminCommand : public Command { + Q_OBJECT +public: + AdminCommand(const QString &_cmdName) + : Command(_cmdName) + { + } +}; + class Command_DeckUpload : public Command { Q_OBJECT public: diff --git a/common/protocol_item_ids.h b/common/protocol_item_ids.h index 428a3f17..6e479773 100644 --- a/common/protocol_item_ids.h +++ b/common/protocol_item_ids.h @@ -69,5 +69,6 @@ ItemId_Event_RoomSay = 1067, ItemId_Context_ReadyStart = 1068, ItemId_Context_Concede = 1069, ItemId_Context_DeckSelect = 1070, -ItemId_Other = 1071 +ItemId_Command_UpdateServerMessage = 1071, +ItemId_Other = 1072 }; diff --git a/common/protocol_items.cpp b/common/protocol_items.cpp index 652f1a4c..226190da 100644 --- a/common/protocol_items.cpp +++ b/common/protocol_items.cpp @@ -437,6 +437,10 @@ Context_DeckSelect::Context_DeckSelect(int _deckId) { insertItem(new SerializableItem_Int("deck_id", _deckId)); } +Command_UpdateServerMessage::Command_UpdateServerMessage() + : AdminCommand("update_server_message") +{ +} void ProtocolItem::initializeHashAuto() { itemNameHash.insert("cmdping", Command_Ping::newItem); @@ -509,4 +513,5 @@ void ProtocolItem::initializeHashAuto() itemNameHash.insert("game_event_contextready_start", Context_ReadyStart::newItem); itemNameHash.insert("game_event_contextconcede", Context_Concede::newItem); itemNameHash.insert("game_event_contextdeck_select", Context_DeckSelect::newItem); + itemNameHash.insert("cmdupdate_server_message", Command_UpdateServerMessage::newItem); } diff --git a/common/protocol_items.dat b/common/protocol_items.dat index 2819ddec..7a80c732 100644 --- a/common/protocol_items.dat +++ b/common/protocol_items.dat @@ -68,3 +68,4 @@ 6:ready_start 6:concede 6:deck_select:i,deck_id +7:update_server_message \ No newline at end of file diff --git a/common/protocol_items.h b/common/protocol_items.h index 8a32ace1..c0058a99 100644 --- a/common/protocol_items.h +++ b/common/protocol_items.h @@ -649,5 +649,12 @@ public: static SerializableItem *newItem() { return new Context_DeckSelect; } int getItemId() const { return ItemId_Context_DeckSelect; } }; +class Command_UpdateServerMessage : public AdminCommand { + Q_OBJECT +public: + Command_UpdateServerMessage(); + static SerializableItem *newItem() { return new Command_UpdateServerMessage; } + int getItemId() const { return ItemId_Command_UpdateServerMessage; } +}; #endif diff --git a/common/protocol_mc.pl b/common/protocol_mc.pl index 3dae3a16..31e85b1f 100755 --- a/common/protocol_mc.pl +++ b/common/protocol_mc.pl @@ -73,6 +73,13 @@ while () { $parentConstructorCall = "$baseClass(\"$name1\")"; $constructorParamsH = ""; $constructorParamsCpp = ""; + } elsif ($type == 7) { + $type = 'cmd'; + $namePrefix = 'Command'; + $baseClass = 'AdminCommand'; + $parentConstructorCall = "$baseClass(\"$name1\")"; + $constructorParamsH = ""; + $constructorParamsCpp = ""; } $className = $namePrefix . '_' . $name2; $itemEnum .= "ItemId_$className = " . ++$itemId . ",\n"; diff --git a/common/serializable_item.cpp b/common/serializable_item.cpp index 3928e1cd..9c1a7c81 100644 --- a/common/serializable_item.cpp +++ b/common/serializable_item.cpp @@ -1,7 +1,7 @@ #include "serializable_item.h" #include #include - +#include QHash SerializableItem::itemNameHash; SerializableItem *SerializableItem::getNewItem(const QString &name) diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index 460ed86b..d7d354a5 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -55,7 +55,6 @@ ResponseCode Server_ProtocolHandler::processCommandHelper(Command *command, Comm lastCommandTime = QDateTime::currentDateTime(); RoomCommand *roomCommand = qobject_cast(command); - GameCommand *gameCommand = qobject_cast(command); if (roomCommand) { qDebug() << "received RoomCommand: roomId =" << roomCommand->getRoomId(); if (authState == PasswordWrong) @@ -66,12 +65,15 @@ ResponseCode Server_ProtocolHandler::processCommandHelper(Command *command, Comm return RespNameNotFound; switch (command->getItemId()) { - case ItemId_Command_LeaveRoom: return cmdLeaveRoom(qobject_cast(command), cont, room); - case ItemId_Command_RoomSay: return cmdRoomSay(qobject_cast(command), cont, room); - case ItemId_Command_CreateGame: return cmdCreateGame(qobject_cast(command), cont, room); - case ItemId_Command_JoinGame: return cmdJoinGame(qobject_cast(command), cont, room); + case ItemId_Command_LeaveRoom: return cmdLeaveRoom(static_cast(command), cont, room); + case ItemId_Command_RoomSay: return cmdRoomSay(static_cast(command), cont, room); + case ItemId_Command_CreateGame: return cmdCreateGame(static_cast(command), cont, room); + case ItemId_Command_JoinGame: return cmdJoinGame(static_cast(command), cont, room); + default: return RespInvalidCommand; } - } else if (gameCommand) { + } + GameCommand *gameCommand = qobject_cast(command); + if (gameCommand) { qDebug() << "received GameCommand: game =" << gameCommand->getGameId(); if (authState == PasswordWrong) return RespLoginNeeded; @@ -85,54 +87,65 @@ ResponseCode Server_ProtocolHandler::processCommandHelper(Command *command, Comm Server_Player *player = gamePair.second; switch (command->getItemId()) { - case ItemId_Command_DeckSelect: return cmdDeckSelect(qobject_cast(command), cont, game, player); - case ItemId_Command_SetSideboardPlan: return cmdSetSideboardPlan(qobject_cast(command), cont, game, player); - case ItemId_Command_LeaveGame: return cmdLeaveGame(qobject_cast(command), cont, game, player); - case ItemId_Command_ReadyStart: return cmdReadyStart(qobject_cast(command), cont, game, player); - case ItemId_Command_Concede: return cmdConcede(qobject_cast(command), cont, game, player); - case ItemId_Command_Say: return cmdSay(qobject_cast(command), cont, game, player); - case ItemId_Command_Shuffle: return cmdShuffle(qobject_cast(command), cont, game, player); - case ItemId_Command_Mulligan: return cmdMulligan(qobject_cast(command), cont, game, player); - case ItemId_Command_RollDie: return cmdRollDie(qobject_cast(command), cont, game, player); - case ItemId_Command_DrawCards: return cmdDrawCards(qobject_cast(command), cont, game, player); - case ItemId_Command_MoveCard: return cmdMoveCard(qobject_cast(command), cont, game, player); - case ItemId_Command_FlipCard: return cmdFlipCard(qobject_cast(command), cont, game, player); - case ItemId_Command_AttachCard: return cmdAttachCard(qobject_cast(command), cont, game, player); - case ItemId_Command_CreateToken: return cmdCreateToken(qobject_cast(command), cont, game, player); - case ItemId_Command_CreateArrow: return cmdCreateArrow(qobject_cast(command), cont, game, player); - case ItemId_Command_DeleteArrow: return cmdDeleteArrow(qobject_cast(command), cont, game, player); - case ItemId_Command_SetCardAttr: return cmdSetCardAttr(qobject_cast(command), cont, game, player); - case ItemId_Command_SetCardCounter: return cmdSetCardCounter(qobject_cast(command), cont, game, player); - case ItemId_Command_IncCardCounter: return cmdIncCardCounter(qobject_cast(command), cont, game, player); - case ItemId_Command_IncCounter: return cmdIncCounter(qobject_cast(command), cont, game, player); - case ItemId_Command_CreateCounter: return cmdCreateCounter(qobject_cast(command), cont, game, player); - case ItemId_Command_SetCounter: return cmdSetCounter(qobject_cast(command), cont, game, player); - case ItemId_Command_DelCounter: return cmdDelCounter(qobject_cast(command), cont, game, player); - case ItemId_Command_NextTurn: return cmdNextTurn(qobject_cast(command), cont, game, player); - case ItemId_Command_SetActivePhase: return cmdSetActivePhase(qobject_cast(command), cont, game, player); - case ItemId_Command_DumpZone: return cmdDumpZone(qobject_cast(command), cont, game, player); - case ItemId_Command_StopDumpZone: return cmdStopDumpZone(qobject_cast(command), cont, game, player); - case ItemId_Command_RevealCards: return cmdRevealCards(qobject_cast(command), cont, game, player); - } - } else { - qDebug() << "received generic Command"; - switch (command->getItemId()) { - case ItemId_Command_Ping: return cmdPing(qobject_cast(command), cont); - case ItemId_Command_Login: return cmdLogin(qobject_cast(command), cont); - case ItemId_Command_Message: return cmdMessage(qobject_cast(command), cont); - case ItemId_Command_DeckList: return cmdDeckList(qobject_cast(command), cont); - case ItemId_Command_DeckNewDir: return cmdDeckNewDir(qobject_cast(command), cont); - case ItemId_Command_DeckDelDir: return cmdDeckDelDir(qobject_cast(command), cont); - case ItemId_Command_DeckDel: return cmdDeckDel(qobject_cast(command), cont); - case ItemId_Command_DeckUpload: return cmdDeckUpload(qobject_cast(command), cont); - case ItemId_Command_DeckDownload: return cmdDeckDownload(qobject_cast(command), cont); - case ItemId_Command_GetUserInfo: return cmdGetUserInfo(qobject_cast(command), cont); - case ItemId_Command_ListRooms: return cmdListRooms(qobject_cast(command), cont); - case ItemId_Command_JoinRoom: return cmdJoinRoom(qobject_cast(command), cont); - case ItemId_Command_ListUsers: return cmdListUsers(qobject_cast(command), cont); + case ItemId_Command_DeckSelect: return cmdDeckSelect(static_cast(command), cont, game, player); + case ItemId_Command_SetSideboardPlan: return cmdSetSideboardPlan(static_cast(command), cont, game, player); + case ItemId_Command_LeaveGame: return cmdLeaveGame(static_cast(command), cont, game, player); + case ItemId_Command_ReadyStart: return cmdReadyStart(static_cast(command), cont, game, player); + case ItemId_Command_Concede: return cmdConcede(static_cast(command), cont, game, player); + case ItemId_Command_Say: return cmdSay(static_cast(command), cont, game, player); + case ItemId_Command_Shuffle: return cmdShuffle(static_cast(command), cont, game, player); + case ItemId_Command_Mulligan: return cmdMulligan(static_cast(command), cont, game, player); + case ItemId_Command_RollDie: return cmdRollDie(static_cast(command), cont, game, player); + case ItemId_Command_DrawCards: return cmdDrawCards(static_cast(command), cont, game, player); + case ItemId_Command_MoveCard: return cmdMoveCard(static_cast(command), cont, game, player); + case ItemId_Command_FlipCard: return cmdFlipCard(static_cast(command), cont, game, player); + case ItemId_Command_AttachCard: return cmdAttachCard(static_cast(command), cont, game, player); + case ItemId_Command_CreateToken: return cmdCreateToken(static_cast(command), cont, game, player); + case ItemId_Command_CreateArrow: return cmdCreateArrow(static_cast(command), cont, game, player); + case ItemId_Command_DeleteArrow: return cmdDeleteArrow(static_cast(command), cont, game, player); + case ItemId_Command_SetCardAttr: return cmdSetCardAttr(static_cast(command), cont, game, player); + case ItemId_Command_SetCardCounter: return cmdSetCardCounter(static_cast(command), cont, game, player); + case ItemId_Command_IncCardCounter: return cmdIncCardCounter(static_cast(command), cont, game, player); + case ItemId_Command_IncCounter: return cmdIncCounter(static_cast(command), cont, game, player); + case ItemId_Command_CreateCounter: return cmdCreateCounter(static_cast(command), cont, game, player); + case ItemId_Command_SetCounter: return cmdSetCounter(static_cast(command), cont, game, player); + case ItemId_Command_DelCounter: return cmdDelCounter(static_cast(command), cont, game, player); + case ItemId_Command_NextTurn: return cmdNextTurn(static_cast(command), cont, game, player); + case ItemId_Command_SetActivePhase: return cmdSetActivePhase(static_cast(command), cont, game, player); + case ItemId_Command_DumpZone: return cmdDumpZone(static_cast(command), cont, game, player); + case ItemId_Command_StopDumpZone: return cmdStopDumpZone(static_cast(command), cont, game, player); + case ItemId_Command_RevealCards: return cmdRevealCards(static_cast(command), cont, game, player); + default: return RespInvalidCommand; } } - return RespInvalidCommand; + AdminCommand *adminCommand = qobject_cast(command); + if (adminCommand) { + qDebug() << "received AdminCommand"; + if (!(userInfo->getUserLevel() & ServerInfo_User::IsAdmin)) + return RespLoginNeeded; + + switch (command->getItemId()) { + case ItemId_Command_UpdateServerMessage: return cmdUpdateServerMessage(static_cast(command), cont); + default: return RespInvalidCommand; + } + } + qDebug() << "received generic Command"; + switch (command->getItemId()) { + case ItemId_Command_Ping: return cmdPing(static_cast(command), cont); + case ItemId_Command_Login: return cmdLogin(static_cast(command), cont); + case ItemId_Command_Message: return cmdMessage(static_cast(command), cont); + case ItemId_Command_DeckList: return cmdDeckList(static_cast(command), cont); + case ItemId_Command_DeckNewDir: return cmdDeckNewDir(static_cast(command), cont); + case ItemId_Command_DeckDelDir: return cmdDeckDelDir(static_cast(command), cont); + case ItemId_Command_DeckDel: return cmdDeckDel(static_cast(command), cont); + case ItemId_Command_DeckUpload: return cmdDeckUpload(static_cast(command), cont); + case ItemId_Command_DeckDownload: return cmdDeckDownload(static_cast(command), cont); + case ItemId_Command_GetUserInfo: return cmdGetUserInfo(static_cast(command), cont); + case ItemId_Command_ListRooms: return cmdListRooms(static_cast(command), cont); + case ItemId_Command_JoinRoom: return cmdJoinRoom(static_cast(command), cont); + case ItemId_Command_ListUsers: return cmdListUsers(static_cast(command), cont); + default: return RespInvalidCommand; + } } void Server_ProtocolHandler::processCommandContainer(CommandContainer *cont) diff --git a/common/server_protocolhandler.h b/common/server_protocolhandler.h index d9ffa154..3e915f42 100644 --- a/common/server_protocolhandler.h +++ b/common/server_protocolhandler.h @@ -81,6 +81,7 @@ private: ResponseCode cmdDumpZone(Command_DumpZone *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player); ResponseCode cmdStopDumpZone(Command_StopDumpZone *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player); ResponseCode cmdRevealCards(Command_RevealCards *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player); + virtual ResponseCode cmdUpdateServerMessage(Command_UpdateServerMessage *cmd, CommandContainer *cont) = 0; ResponseCode processCommandHelper(Command *command, CommandContainer *cont); private slots: diff --git a/servatrice/src/servatrice.cpp b/servatrice/src/servatrice.cpp index 9d4ed6bf..f3419860 100644 --- a/servatrice/src/servatrice.cpp +++ b/servatrice/src/servatrice.cpp @@ -192,15 +192,24 @@ ServerInfo_User *Servatrice::getUserData(const QString &name) } else return new ServerInfo_User(name, ServerInfo_User::IsUser); } - +#include void Servatrice::updateLoginMessage() { checkSql(); QSqlQuery query; query.prepare("select message from " + dbPrefix + "_servermessages order by timest desc limit 1"); if (execSqlQuery(query)) - if (query.next()) + if (query.next()) { loginMessage = query.value(0).toString(); + + Event_ServerMessage *event = new Event_ServerMessage(loginMessage); + QMapIterator usersIterator(users); + while (usersIterator.hasNext()) { + usersIterator.next().value()->sendProtocolItem(event, false); + qDebug() << "sent message to" << usersIterator.value()->getUserInfo()->getName(); + } + delete event; + } } void Servatrice::statusUpdate() diff --git a/servatrice/src/serversocketinterface.cpp b/servatrice/src/serversocketinterface.cpp index 6d26d2ac..44cf4729 100644 --- a/servatrice/src/serversocketinterface.cpp +++ b/servatrice/src/serversocketinterface.cpp @@ -323,3 +323,12 @@ ResponseCode ServerSocketInterface::cmdDeckDownload(Command_DeckDownload *cmd, C cont->setResponse(new Response_DeckDownload(cont->getCmdId(), RespOk, deck)); return RespNothing; } + +// ADMIN FUNCTIONS. +// Permission is checked by the calling function. + +ResponseCode ServerSocketInterface::cmdUpdateServerMessage(Command_UpdateServerMessage *cmd, CommandContainer *cont) +{ + servatrice->updateLoginMessage(); + return RespOk; +} diff --git a/servatrice/src/serversocketinterface.h b/servatrice/src/serversocketinterface.h index b5286dd7..d496026e 100644 --- a/servatrice/src/serversocketinterface.h +++ b/servatrice/src/serversocketinterface.h @@ -55,6 +55,7 @@ private: ResponseCode cmdDeckUpload(Command_DeckUpload *cmd, CommandContainer *cont); DeckList *getDeckFromDatabase(int deckId); ResponseCode cmdDeckDownload(Command_DeckDownload *cmd, CommandContainer *cont); + ResponseCode cmdUpdateServerMessage(Command_UpdateServerMessage *cmd, CommandContainer *cont); public: ServerSocketInterface(Servatrice *_server, QTcpSocket *_socket, QObject *parent = 0); ~ServerSocketInterface();