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*/)