diff --git a/cockatrice/src/cardinfowidget.cpp b/cockatrice/src/cardinfowidget.cpp index 6ebe620b..4d82c656 100644 --- a/cockatrice/src/cardinfowidget.cpp +++ b/cockatrice/src/cardinfowidget.cpp @@ -62,6 +62,7 @@ CardInfoWidget::CardInfoWidget(CardDatabase *_db, QWidget *parent) retranslateUi(); setFrameStyle(QFrame::Panel | QFrame::Raised); + textLabel->setFixedHeight(130); setFixedSize(sizeHint()); } diff --git a/cockatrice/src/chatwidget.cpp b/cockatrice/src/chatwidget.cpp index ad1f3b34..604ffb62 100644 --- a/cockatrice/src/chatwidget.cpp +++ b/cockatrice/src/chatwidget.cpp @@ -2,23 +2,27 @@ #include "chatwidget.h" #include "client.h" -ChannelWidget::ChannelWidget(Client *_client, const QString &_name, QWidget *parent) +ChannelWidget::ChannelWidget(Client *_client, const QString &_name, bool readOnly, QWidget *parent) : QWidget(parent), client(_client), name(_name) { playerList = new QListWidget; textEdit = new QTextEdit; textEdit->setReadOnly(true); - sayEdit = new QLineEdit; - connect(sayEdit, SIGNAL(returnPressed()), this, SLOT(sendMessage())); + if (!readOnly) { + sayEdit = new QLineEdit; + connect(sayEdit, SIGNAL(returnPressed()), this, SLOT(sendMessage())); + } QVBoxLayout *vbox = new QVBoxLayout; vbox->addWidget(textEdit); - vbox->addWidget(sayEdit); + if (!readOnly) + vbox->addWidget(sayEdit); QHBoxLayout *hbox = new QHBoxLayout; - hbox->addLayout(vbox, 1); + hbox->addLayout(vbox); hbox->addWidget(playerList); + playerList->setFixedWidth(100); setLayout(hbox); } @@ -57,6 +61,11 @@ void ChannelWidget::sayEvent(const QString &playerName, const QString &s) textEdit->append(QString("%1: %2").arg(playerName).arg(s)); } +void ChannelWidget::serverMessageEvent(const QString &s) +{ + textEdit->append(QString("%1").arg(s)); +} + ChatWidget::ChatWidget(Client *_client, QWidget *parent) : QWidget(parent), client(_client) { @@ -110,7 +119,7 @@ void ChatWidget::chatEvent(const ChatEventData &data) const QStringList &msg = data.getEventData(); switch (data.getEventType()) { case eventChatListChannels: { - if (msg.size() != 3) + if (msg.size() != 4) break; for (int i = 0; i < channelList->topLevelItemCount(); ++i) { QTreeWidgetItem *twi = channelList->topLevelItem(i); @@ -121,6 +130,8 @@ void ChatWidget::chatEvent(const ChatEventData &data) } } channelList->addTopLevelItem(new QTreeWidgetItem(QStringList() << msg[0] << msg[1] << msg[2])); + if (msg[3] == "1") + joinChannel(msg[0]); break; } case eventChatJoinChannel: { @@ -159,11 +170,33 @@ void ChatWidget::chatEvent(const ChatEventData &data) w->sayEvent(msg[1], msg[2]); break; } + case eventChatServerMessage: { + if (msg.size() != 2) + break; + ChannelWidget *w; + if (msg[0].isEmpty()) { + w = getChannel("Server"); + if (!w) { + w = new ChannelWidget(client, "Server", true); + tab->addTab(w, "Server"); + } + } else + w = getChannel(msg[0]); + w->serverMessageEvent(msg[1]); + break; + } default: { } } } +void ChatWidget::joinChannel(const QString &channelName) +{ + PendingCommand *pc = client->chatJoinChannel(channelName); + pc->setExtraData(channelName); + connect(pc, SIGNAL(finished(ServerResponse)), this, SLOT(joinFinished(ServerResponse))); +} + void ChatWidget::joinClicked() { QTreeWidgetItem *twi = channelList->currentItem(); @@ -173,9 +206,7 @@ void ChatWidget::joinClicked() if (getChannel(channelName)) return; - PendingCommand *pc = client->chatJoinChannel(channelName); - pc->setExtraData(channelName); - connect(pc, SIGNAL(finished(ServerResponse)), this, SLOT(joinFinished(ServerResponse))); + joinChannel(channelName); } void ChatWidget::joinFinished(ServerResponse resp) diff --git a/cockatrice/src/chatwidget.h b/cockatrice/src/chatwidget.h index 94bb8944..6e891293 100644 --- a/cockatrice/src/chatwidget.h +++ b/cockatrice/src/chatwidget.h @@ -23,13 +23,14 @@ private: private slots: void sendMessage(); public: - ChannelWidget(Client *_client, const QString &_name, QWidget *parent = 0); + ChannelWidget(Client *_client, const QString &_name, bool readOnly = false, QWidget *parent = 0); const QString &getName() const { return name; } void joinEvent(const QString &playerName); void listPlayersEvent(const QString &playerName); void leaveEvent(const QString &playerName); void sayEvent(const QString &playerName, const QString &s); + void serverMessageEvent(const QString &s); }; class ChatWidget : public QWidget { @@ -41,6 +42,7 @@ private: Client *client; ChannelWidget *getChannel(const QString &name); + void joinChannel(const QString &channelName); private slots: void chatEvent(const ChatEventData &data); void joinClicked(); diff --git a/cockatrice/src/gameselector.cpp b/cockatrice/src/gameselector.cpp index 2f84ac84..65c5c94e 100644 --- a/cockatrice/src/gameselector.cpp +++ b/cockatrice/src/gameselector.cpp @@ -42,12 +42,6 @@ void GameSelector::actRefresh() client->listGames(); } -void GameSelector::statusChanged(ProtocolStatus status) -{ - if (status == StatusDisconnected) - disableGameList(); -} - void GameSelector::checkResponse(ServerResponse response) { createButton->setEnabled(true); @@ -84,7 +78,6 @@ void GameSelector::actJoin() void GameSelector::enableGameList() { connect(client, SIGNAL(gameListEvent(ServerGame *)), gameListModel, SLOT(updateGameList(ServerGame *))); - connect(client, SIGNAL(statusChanged(ProtocolStatus)), this, SLOT(statusChanged(ProtocolStatus))); client->listGames(); show(); } diff --git a/cockatrice/src/gameselector.h b/cockatrice/src/gameselector.h index 76b134e6..fe3ac8cf 100644 --- a/cockatrice/src/gameselector.h +++ b/cockatrice/src/gameselector.h @@ -21,7 +21,6 @@ private slots: void actRefresh(); void actJoin(); void checkResponse(ServerResponse response); - void statusChanged(ProtocolStatus status); private: Client *client; diff --git a/cockatrice/src/servereventdata.cpp b/cockatrice/src/servereventdata.cpp index df97bf60..324e90fe 100644 --- a/cockatrice/src/servereventdata.cpp +++ b/cockatrice/src/servereventdata.cpp @@ -50,6 +50,7 @@ ChatEventData::ChatEventData(const QString &line) eventHash.insert("list_players", eventChatListPlayers); eventHash.insert("leave_channel", eventChatLeaveChannel); eventHash.insert("say", eventChatSay); + eventHash.insert("server_message", eventChatServerMessage); } QStringList values = line.split('|'); diff --git a/cockatrice/src/servereventdata.h b/cockatrice/src/servereventdata.h index 50233af5..9f809fcf 100644 --- a/cockatrice/src/servereventdata.h +++ b/cockatrice/src/servereventdata.h @@ -53,7 +53,8 @@ enum ChatEventType { eventChatJoinChannel, eventChatListPlayers, eventChatLeaveChannel, - eventChatSay + eventChatSay, + eventChatServerMessage }; class ChatEventData { diff --git a/cockatrice/src/window_main.cpp b/cockatrice/src/window_main.cpp index 0e8a6024..d04bab30 100644 --- a/cockatrice/src/window_main.cpp +++ b/cockatrice/src/window_main.cpp @@ -71,6 +71,8 @@ void MainWindow::statusChanged(ProtocolStatus _status) aLeaveGame->setEnabled(false); phasesToolbar->setActivePhase(-1); phasesToolbar->hide(); + gameSelector->disableGameList(); + chatWidget->disableChat(); emit logDisconnected(); break; case StatusLoggingIn: diff --git a/servatrice/servatrice.ini.example b/servatrice/servatrice.ini.example index 632c525d..c4e7b3ca 100644 --- a/servatrice/servatrice.ini.example +++ b/servatrice/servatrice.ini.example @@ -7,3 +7,6 @@ hostname=localhost database=servatrice user=servatrice password=foobar + +[messages] +login="Example line 1", "Example line 2" diff --git a/servatrice/src/chatchannel.cpp b/servatrice/src/chatchannel.cpp index fc621013..75d8dad6 100644 --- a/servatrice/src/chatchannel.cpp +++ b/servatrice/src/chatchannel.cpp @@ -1,8 +1,8 @@ #include "chatchannel.h" #include "serversocket.h" -ChatChannel::ChatChannel(const QString &_name, const QString &_description) - : name(_name), description(_description) +ChatChannel::ChatChannel(const QString &_name, const QString &_description, bool _autoJoin, const QStringList &_joinMessage) + : name(_name), description(_description), autoJoin(_autoJoin), joinMessage(_joinMessage) { } @@ -16,6 +16,8 @@ void ChatChannel::addPlayer(ServerSocket *player) for (int i = 0; i < size(); ++i) player->msg(QString("chat|list_players|%1|%2").arg(name).arg(at(i)->getPlayerName())); + for (int i = 0; i < joinMessage.size(); ++i) + player->msg(QString("chat|server_message|%1|%2").arg(name).arg(joinMessage[i])); emit channelInfoChanged(); } @@ -40,5 +42,5 @@ void ChatChannel::say(ServerSocket *player, const QString &s) QString ChatChannel::getChannelListLine() const { - return QString("chat|list_channels|%1|%2|%3").arg(name).arg(description).arg(size()); -} \ No newline at end of file + return QString("chat|list_channels|%1|%2|%3|%4").arg(name).arg(description).arg(size()).arg(autoJoin ? 1 : 0); +} diff --git a/servatrice/src/chatchannel.h b/servatrice/src/chatchannel.h index fdf254f4..c7ca5b76 100644 --- a/servatrice/src/chatchannel.h +++ b/servatrice/src/chatchannel.h @@ -3,6 +3,7 @@ #include #include +#include class ServerSocket; @@ -13,10 +14,13 @@ signals: private: QString name; QString description; + bool autoJoin; + QStringList joinMessage; public: - ChatChannel(const QString &_name, const QString &_description); + ChatChannel(const QString &_name, const QString &_description, bool _autoJoin, const QStringList &_joinMessage); QString getName() const { return name; } QString getDescription() const { return description; } + bool getAutoJoin() const { return autoJoin; } void addPlayer(ServerSocket *player); void removePlayer(ServerSocket *player); void say(ServerSocket *player, const QString &s); diff --git a/servatrice/src/server.cpp b/servatrice/src/server.cpp index 30a0cd53..990503cd 100644 --- a/servatrice/src/server.cpp +++ b/servatrice/src/server.cpp @@ -27,7 +27,7 @@ #include Server::Server(QObject *parent) - : QTcpServer(parent), nextGameId(0) + : QTcpServer(parent), nextGameId(0) { rng = new RNG_Qt(this); @@ -37,11 +37,20 @@ Server::Server(QObject *parent) if (dbType == "mysql") openDatabase(); - chatChannelList << new ChatChannel("channel1", "testchannel 1"); - chatChannelList << new ChatChannel("channel2", "testchannel 2"); + int size = settings->beginReadArray("chatchannels"); + for (int i = 0; i < size; ++i) { + settings->setArrayIndex(i); + chatChannelList << new ChatChannel(settings->value("name").toString(), + settings->value("description").toString(), + settings->value("autojoin").toBool(), + settings->value("joinmessage").toStringList()); + } + settings->endArray(); for (int i = 0; i < chatChannelList.size(); ++i) connect(chatChannelList[i], SIGNAL(channelInfoChanged()), this, SLOT(broadcastChannelUpdate())); + + loginMessage = settings->value("messages/login").toStringList(); } Server::~Server() diff --git a/servatrice/src/server.h b/servatrice/src/server.h index 62ac25f1..bccdb292 100644 --- a/servatrice/src/server.h +++ b/servatrice/src/server.h @@ -21,6 +21,7 @@ #define SERVER_H #include +#include class ServerGame; class ServerSocket; @@ -52,12 +53,14 @@ public: AbstractRNG *getRNG() const { return rng; } void broadcastGameListUpdate(ServerGame *game); void removePlayer(ServerSocket *player); + const QStringList &getLoginMessage() const { return loginMessage; } private: void incomingConnection(int SocketId); QList games; QList players; QList chatChannelList; int nextGameId; + QStringList loginMessage; AbstractRNG *rng; }; diff --git a/servatrice/src/serversocket.cpp b/servatrice/src/serversocket.cpp index 934eb74d..c4a07a4b 100644 --- a/servatrice/src/serversocket.cpp +++ b/servatrice/src/serversocket.cpp @@ -236,7 +236,13 @@ ReturnMessage::ReturnCode ServerSocket::cmdLogin(const QList ¶ms) return ReturnMessage::ReturnPasswordWrong; playerName = params[0].toString(); - return ReturnMessage::ReturnOk; + remsg->send(ReturnMessage::ReturnOk); + + QStringList loginMessage = server->getLoginMessage(); + for (int i = 0; i < loginMessage.size(); ++i) + msg("chat|server_message||" + loginMessage[i]); + + return ReturnMessage::ReturnNothing; } ReturnMessage::ReturnCode ServerSocket::cmdChatListChannels(const QList &/*params*/)