some client code
This commit is contained in:
parent
240ff06032
commit
c46ef255a1
8 changed files with 115 additions and 69 deletions
|
@ -8,6 +8,8 @@
|
||||||
Client::Client(QObject *parent)
|
Client::Client(QObject *parent)
|
||||||
: QObject(parent), currentItem(0), status(StatusDisconnected)
|
: QObject(parent), currentItem(0), status(StatusDisconnected)
|
||||||
{
|
{
|
||||||
|
ProtocolItem::initializeHash();
|
||||||
|
|
||||||
timer = new QTimer(this);
|
timer = new QTimer(this);
|
||||||
timer->setInterval(1000);
|
timer->setInterval(1000);
|
||||||
connect(timer, SIGNAL(timeout()), this, SLOT(ping()));
|
connect(timer, SIGNAL(timeout()), this, SLOT(ping()));
|
||||||
|
@ -40,36 +42,21 @@ void Client::slotConnected()
|
||||||
setStatus(StatusAwaitingWelcome);
|
setStatus(StatusAwaitingWelcome);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::removePendingCommand()
|
void Client::loginResponse(ResponseCode response)
|
||||||
{
|
|
||||||
pendingCommands.remove(static_cast<Command *>(sender())->getCmdId());
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
void Client::loginResponse(ServerResponse response)
|
|
||||||
{
|
{
|
||||||
if (response == RespOk)
|
if (response == RespOk)
|
||||||
setStatus(StatusIdle);
|
setStatus(StatusLoggedIn);
|
||||||
else {
|
else {
|
||||||
emit serverError(response);
|
emit serverError(response);
|
||||||
disconnectFromServer();
|
disconnectFromServer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::enterGameResponse(ServerResponse response)
|
|
||||||
{
|
|
||||||
if (response == RespOk)
|
|
||||||
setStatus(StatusPlaying);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Client::leaveGameResponse(ServerResponse response)
|
|
||||||
{
|
|
||||||
if (response == RespOk)
|
|
||||||
setStatus(StatusIdle);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
void Client::readData()
|
void Client::readData()
|
||||||
{
|
{
|
||||||
xmlReader->addData(socket->readAll());
|
QByteArray data = socket->readAll();
|
||||||
|
qDebug() << data;
|
||||||
|
xmlReader->addData(data);
|
||||||
|
|
||||||
if (currentItem) {
|
if (currentItem) {
|
||||||
if (!currentItem->read(xmlReader))
|
if (!currentItem->read(xmlReader))
|
||||||
|
@ -80,8 +67,25 @@ void Client::readData()
|
||||||
xmlReader->readNext();
|
xmlReader->readNext();
|
||||||
if (xmlReader->isStartElement()) {
|
if (xmlReader->isStartElement()) {
|
||||||
QString itemType = xmlReader->name().toString();
|
QString itemType = xmlReader->name().toString();
|
||||||
if (itemType == "cockatrice_server_stream")
|
if (itemType == "cockatrice_server_stream") {
|
||||||
continue;
|
int serverVersion = xmlReader->attributes().value("version").toString().toInt();
|
||||||
|
if (serverVersion != ProtocolItem::protocolVersion) {
|
||||||
|
emit protocolVersionMismatch(ProtocolItem::protocolVersion, serverVersion);
|
||||||
|
disconnectFromServer();
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
xmlWriter->writeStartDocument();
|
||||||
|
xmlWriter->writeStartElement("cockatrice_client_stream");
|
||||||
|
xmlWriter->writeAttribute("version", QString::number(ProtocolItem::protocolVersion));
|
||||||
|
|
||||||
|
setStatus(StatusLoggingIn);
|
||||||
|
Command_Login *cmdLogin = new Command_Login(userName, password);
|
||||||
|
connect(cmdLogin, SIGNAL(finished(ResponseCode)), this, SLOT(loginResponse(ResponseCode)));
|
||||||
|
sendCommand(cmdLogin);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
QString itemName = xmlReader->attributes().value("name").toString();
|
QString itemName = xmlReader->attributes().value("name").toString();
|
||||||
qDebug() << "parseXml: startElement: " << "type =" << itemType << ", name =" << itemName;
|
qDebug() << "parseXml: startElement: " << "type =" << itemType << ", name =" << itemName;
|
||||||
currentItem = ProtocolItem::getNewItem(itemType + itemName);
|
currentItem = ProtocolItem::getNewItem(itemType + itemName);
|
||||||
|
@ -90,13 +94,9 @@ void Client::readData()
|
||||||
if (!currentItem->read(xmlReader))
|
if (!currentItem->read(xmlReader))
|
||||||
return;
|
return;
|
||||||
else {
|
else {
|
||||||
/* Command *command = qobject_cast<Command *>(currentItem);
|
processProtocolItem(currentItem);
|
||||||
if (qobject_cast<InvalidCommand *>(command))
|
|
||||||
sendProtocolItem(new ProtocolResponse(command->getCmdId(), ProtocolResponse::RespInvalidCommand));
|
|
||||||
else
|
|
||||||
processCommand(command);
|
|
||||||
currentItem = 0;
|
currentItem = 0;
|
||||||
*/ }
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
@ -265,6 +265,46 @@ void Client::readData()
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Client::processProtocolItem(ProtocolItem *item)
|
||||||
|
{
|
||||||
|
ProtocolResponse *response = qobject_cast<ProtocolResponse *>(item);
|
||||||
|
if (response) {
|
||||||
|
Command *cmd = pendingCommands.value(response->getCmdId(), 0);
|
||||||
|
if (!cmd)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cmd->processResponse(response);
|
||||||
|
delete response;
|
||||||
|
|
||||||
|
pendingCommands.remove(cmd->getCmdId());
|
||||||
|
delete cmd;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
GenericEvent *genericEvent = qobject_cast<GenericEvent *>(item);
|
||||||
|
if (genericEvent) {
|
||||||
|
switch (genericEvent->getItemId()) {
|
||||||
|
}
|
||||||
|
delete genericEvent;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* GameEvent *gameEvent = qobject_cast<GameEvent *>(item);
|
||||||
|
if (gameEvent) {
|
||||||
|
emit gameEventReceived(gameEvent);
|
||||||
|
delete gameEvent;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
ChatEvent *chatEvent = qobject_cast<ChatEvent *>(item);
|
||||||
|
if (chatEvent) {
|
||||||
|
qDebug() << "chatEventReceived()";
|
||||||
|
emit chatEventReceived(chatEvent);
|
||||||
|
delete chatEvent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Client::setStatus(const ClientStatus _status)
|
void Client::setStatus(const ClientStatus _status)
|
||||||
{
|
{
|
||||||
if (_status != status) {
|
if (_status != status) {
|
||||||
|
@ -272,26 +312,18 @@ void Client::setStatus(const ClientStatus _status)
|
||||||
emit statusChanged(_status);
|
emit statusChanged(_status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
PendingCommand *Client::cmd(const QString &s, PendingCommand *_pc)
|
void Client::sendCommand(Command *cmd)
|
||||||
{
|
{
|
||||||
msg(QString("%1|%2").arg(++MsgId).arg(s));
|
cmd->write(xmlWriter);
|
||||||
PendingCommand *pc;
|
pendingCommands.insert(cmd->getCmdId(), cmd);
|
||||||
if (_pc) {
|
|
||||||
pc = _pc;
|
|
||||||
pc->setMsgId(MsgId);
|
|
||||||
} else
|
|
||||||
pc = new PendingCommand(MsgId);
|
|
||||||
pendingCommands.insert(MsgId, pc);
|
|
||||||
connect(pc, SIGNAL(finished(ServerResponse)), this, SLOT(removePendingCommand()));
|
|
||||||
return pc;
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
void Client::connectToServer(const QString &hostname, unsigned int port, const QString &_playerName, const QString &_password)
|
void Client::connectToServer(const QString &hostname, unsigned int port, const QString &_userName, const QString &_password)
|
||||||
{
|
{
|
||||||
disconnectFromServer();
|
disconnectFromServer();
|
||||||
|
|
||||||
playerName = _playerName;
|
userName = _userName;
|
||||||
password = _password;
|
password = _password;
|
||||||
socket->connectToHost(hostname, port);
|
socket->connectToHost(hostname, port);
|
||||||
setStatus(StatusConnecting);
|
setStatus(StatusConnecting);
|
||||||
|
@ -326,10 +358,8 @@ void Client::ping()
|
||||||
if (maxTime >= maxTimeout) {
|
if (maxTime >= maxTimeout) {
|
||||||
emit serverTimeout();
|
emit serverTimeout();
|
||||||
disconnectFromServer();
|
disconnectFromServer();
|
||||||
}
|
} else
|
||||||
/* else
|
sendCommand(new Command_Ping);
|
||||||
cmd("ping");
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
PendingCommand *Client::chatListChannels()
|
PendingCommand *Client::chatListChannels()
|
||||||
|
|
|
@ -5,12 +5,15 @@
|
||||||
#include <QColor>
|
#include <QColor>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
|
#include "protocol_datastructures.h"
|
||||||
|
|
||||||
class QTimer;
|
class QTimer;
|
||||||
class Command;
|
class Command;
|
||||||
class QXmlStreamReader;
|
class QXmlStreamReader;
|
||||||
class QXmlStreamWriter;
|
class QXmlStreamWriter;
|
||||||
|
|
||||||
class ProtocolItem;
|
class ProtocolItem;
|
||||||
|
class ChatEvent;
|
||||||
|
|
||||||
enum ClientStatus {
|
enum ClientStatus {
|
||||||
StatusDisconnected,
|
StatusDisconnected,
|
||||||
|
@ -24,26 +27,23 @@ class Client : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
signals:
|
signals:
|
||||||
void statusChanged(ClientStatus _status);
|
void statusChanged(ClientStatus _status);
|
||||||
void welcomeMsgReceived(QString welcomeMsg);
|
|
||||||
// void gameListEvent(const ServerGame &game);
|
// void gameListEvent(const ServerGame &game);
|
||||||
void playerIdReceived(int id, QString name);
|
// void playerIdReceived(int id, QString name);
|
||||||
// void gameEvent(const ServerEventData &msg);
|
// void gameEvent(const ServerEventData &msg);
|
||||||
// void chatEvent(const ChatEventData &msg);
|
|
||||||
void maxPingTime(int seconds, int maxSeconds);
|
void maxPingTime(int seconds, int maxSeconds);
|
||||||
void serverTimeout();
|
void serverTimeout();
|
||||||
void logSocketError(const QString &errorString);
|
void logSocketError(const QString &errorString);
|
||||||
// void serverError(ServerResponse resp);
|
void serverError(ResponseCode resp);
|
||||||
void protocolVersionMismatch();
|
void protocolVersionMismatch(int clientVersion, int serverVersion);
|
||||||
void protocolError();
|
void protocolError();
|
||||||
|
|
||||||
|
void chatEventReceived(ChatEvent *event);
|
||||||
private slots:
|
private slots:
|
||||||
void slotConnected();
|
void slotConnected();
|
||||||
void readData();
|
void readData();
|
||||||
void slotSocketError(QAbstractSocket::SocketError error);
|
void slotSocketError(QAbstractSocket::SocketError error);
|
||||||
void ping();
|
void ping();
|
||||||
void removePendingCommand();
|
void loginResponse(ResponseCode response);
|
||||||
// void loginResponse(ServerResponse response);
|
|
||||||
// void enterGameResponse(ServerResponse response);
|
|
||||||
// void leaveGameResponse(ServerResponse response);
|
|
||||||
private:
|
private:
|
||||||
static const int maxTimeout = 10;
|
static const int maxTimeout = 10;
|
||||||
|
|
||||||
|
@ -54,16 +54,18 @@ private:
|
||||||
QXmlStreamWriter *xmlWriter;
|
QXmlStreamWriter *xmlWriter;
|
||||||
ProtocolItem *currentItem;
|
ProtocolItem *currentItem;
|
||||||
ClientStatus status;
|
ClientStatus status;
|
||||||
QString playerName, password;
|
QString userName, password;
|
||||||
void setStatus(ClientStatus _status);
|
void setStatus(ClientStatus _status);
|
||||||
|
void processProtocolItem(ProtocolItem *item);
|
||||||
public:
|
public:
|
||||||
Client(QObject *parent = 0);
|
Client(QObject *parent = 0);
|
||||||
~Client();
|
~Client();
|
||||||
ClientStatus getStatus() const { return status; }
|
ClientStatus getStatus() const { return status; }
|
||||||
QString peerName() const { return socket->peerName(); }
|
QString peerName() const { return socket->peerName(); }
|
||||||
|
|
||||||
void connectToServer(const QString &hostname, unsigned int port, const QString &_playerName, const QString &_password);
|
void connectToServer(const QString &hostname, unsigned int port, const QString &_userName, const QString &_password);
|
||||||
void disconnectFromServer();
|
void disconnectFromServer();
|
||||||
|
void sendCommand(Command *cmd);
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
void chatListChannels() { }
|
void chatListChannels() { }
|
||||||
|
|
|
@ -17,9 +17,9 @@ void MessageLogWidget::logConnecting(QString hostname)
|
||||||
append(tr("Connecting to %1...").arg(sanitizeHtml(hostname)));
|
append(tr("Connecting to %1...").arg(sanitizeHtml(hostname)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessageLogWidget::logConnected(QString welcomeMsg)
|
void MessageLogWidget::logConnected()
|
||||||
{
|
{
|
||||||
append(tr("Connected: %1").arg(welcomeMsg));
|
append(tr("Connected."));
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessageLogWidget::logDisconnected()
|
void MessageLogWidget::logDisconnected()
|
||||||
|
@ -40,9 +40,9 @@ void MessageLogWidget::logServerError(ResponseCode response)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessageLogWidget::logProtocolVersionMismatch()
|
void MessageLogWidget::logProtocolVersionMismatch(int clientVersion, int serverVersion)
|
||||||
{
|
{
|
||||||
append(tr("Protocol version mismatch."));
|
append(tr("Protocol version mismatch. Client: %1, Server: %2").arg(clientVersion).arg(serverVersion));
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessageLogWidget::logProtocolError()
|
void MessageLogWidget::logProtocolError()
|
||||||
|
|
|
@ -17,11 +17,11 @@ private:
|
||||||
QString trZoneName(CardZone *zone, Player *player, bool hisOwn, GrammaticalCase gc) const;
|
QString trZoneName(CardZone *zone, Player *player, bool hisOwn, GrammaticalCase gc) const;
|
||||||
public slots:
|
public slots:
|
||||||
void logConnecting(QString hostname);
|
void logConnecting(QString hostname);
|
||||||
void logConnected(QString welcomeMsg);
|
void logConnected();
|
||||||
void logDisconnected();
|
void logDisconnected();
|
||||||
void logSocketError(const QString &errorString);
|
void logSocketError(const QString &errorString);
|
||||||
void logServerError(ResponseCode response);
|
void logServerError(ResponseCode response);
|
||||||
void logProtocolVersionMismatch();
|
void logProtocolVersionMismatch(int clientVersion, int serverVersion);
|
||||||
void logProtocolError();
|
void logProtocolError();
|
||||||
private slots:
|
private slots:
|
||||||
void logPlayerListReceived(QStringList players);
|
void logPlayerListReceived(QStringList players);
|
||||||
|
|
|
@ -98,6 +98,7 @@ void MainWindow::statusChanged(ClientStatus _status)
|
||||||
emit logDisconnected();
|
emit logDisconnected();
|
||||||
break;
|
break;
|
||||||
case StatusLoggingIn:
|
case StatusLoggingIn:
|
||||||
|
emit logConnected();
|
||||||
aConnect->setEnabled(false);
|
aConnect->setEnabled(false);
|
||||||
aDisconnect->setEnabled(true);
|
aDisconnect->setEnabled(true);
|
||||||
break;
|
break;
|
||||||
|
@ -341,11 +342,11 @@ MainWindow::MainWindow(QTranslator *_translator, QWidget *parent)
|
||||||
connect(client, SIGNAL(statusChanged(ClientStatus)), this, SLOT(statusChanged(ClientStatus)));
|
connect(client, SIGNAL(statusChanged(ClientStatus)), this, SLOT(statusChanged(ClientStatus)));
|
||||||
|
|
||||||
connect(this, SIGNAL(logConnecting(QString)), messageLog, SLOT(logConnecting(QString)));
|
connect(this, SIGNAL(logConnecting(QString)), messageLog, SLOT(logConnecting(QString)));
|
||||||
connect(client, SIGNAL(welcomeMsgReceived(QString)), messageLog, SLOT(logConnected(QString)));
|
connect(this, SIGNAL(logConnected()), messageLog, SLOT(logConnected()));
|
||||||
connect(this, SIGNAL(logDisconnected()), messageLog, SLOT(logDisconnected()));
|
connect(this, SIGNAL(logDisconnected()), messageLog, SLOT(logDisconnected()));
|
||||||
connect(client, SIGNAL(logSocketError(const QString &)), messageLog, SLOT(logSocketError(const QString &)));
|
connect(client, SIGNAL(logSocketError(const QString &)), messageLog, SLOT(logSocketError(const QString &)));
|
||||||
connect(client, SIGNAL(serverError(ServerResponse)), messageLog, SLOT(logServerError(ServerResponse)));
|
connect(client, SIGNAL(serverError(ResponseCode)), messageLog, SLOT(logServerError(ResponseCode)));
|
||||||
connect(client, SIGNAL(protocolVersionMismatch()), messageLog, SLOT(logProtocolVersionMismatch()));
|
connect(client, SIGNAL(protocolVersionMismatch(int, int)), messageLog, SLOT(logProtocolVersionMismatch(int, int)));
|
||||||
connect(client, SIGNAL(protocolError()), messageLog, SLOT(logProtocolError()));
|
connect(client, SIGNAL(protocolError()), messageLog, SLOT(logProtocolError()));
|
||||||
connect(phasesToolbar, SIGNAL(signalSetPhase(int)), client, SLOT(setActivePhase(int)));
|
connect(phasesToolbar, SIGNAL(signalSetPhase(int)), client, SLOT(setActivePhase(int)));
|
||||||
connect(phasesToolbar, SIGNAL(signalNextTurn()), client, SLOT(nextTurn()));
|
connect(phasesToolbar, SIGNAL(signalNextTurn()), client, SLOT(nextTurn()));
|
||||||
|
|
|
@ -75,6 +75,7 @@ private slots:
|
||||||
void actExit();
|
void actExit();
|
||||||
signals:
|
signals:
|
||||||
void logConnecting(QString hostname);
|
void logConnecting(QString hostname);
|
||||||
|
void logConnected();
|
||||||
void logDisconnected();
|
void logDisconnected();
|
||||||
private:
|
private:
|
||||||
void retranslateUi();
|
void retranslateUi();
|
||||||
|
|
|
@ -84,6 +84,11 @@ void Command::extractParameters()
|
||||||
cmdId = -1;
|
cmdId = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Command::processResponse(ProtocolResponse *response)
|
||||||
|
{
|
||||||
|
emit finished(response->getResponseCode());
|
||||||
|
}
|
||||||
|
|
||||||
QHash<QString, ResponseCode> ProtocolResponse::responseHash;
|
QHash<QString, ResponseCode> ProtocolResponse::responseHash;
|
||||||
|
|
||||||
ProtocolResponse::ProtocolResponse(int _cmdId, ResponseCode _responseCode)
|
ProtocolResponse::ProtocolResponse(int _cmdId, ResponseCode _responseCode)
|
||||||
|
|
|
@ -13,6 +13,8 @@ class QXmlStreamReader;
|
||||||
class QXmlStreamWriter;
|
class QXmlStreamWriter;
|
||||||
class QXmlStreamAttributes;
|
class QXmlStreamAttributes;
|
||||||
|
|
||||||
|
class ProtocolResponse;
|
||||||
|
|
||||||
enum ItemId {
|
enum ItemId {
|
||||||
ItemId_Event_ChatListChannels = ItemId_Other + 1,
|
ItemId_Event_ChatListChannels = ItemId_Other + 1,
|
||||||
ItemId_Event_ChatListPlayers = ItemId_Other + 2,
|
ItemId_Event_ChatListPlayers = ItemId_Other + 2,
|
||||||
|
@ -51,6 +53,8 @@ public:
|
||||||
|
|
||||||
class Command : public ProtocolItem {
|
class Command : public ProtocolItem {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
signals:
|
||||||
|
void finished(ResponseCode response);
|
||||||
private:
|
private:
|
||||||
int cmdId;
|
int cmdId;
|
||||||
int ticks;
|
int ticks;
|
||||||
|
@ -62,6 +66,7 @@ public:
|
||||||
Command(const QString &_itemName = QString(), int _cmdId = -1);
|
Command(const QString &_itemName = QString(), int _cmdId = -1);
|
||||||
int getCmdId() const { return cmdId; }
|
int getCmdId() const { return cmdId; }
|
||||||
int tick() { return ++ticks; }
|
int tick() { return ++ticks; }
|
||||||
|
void processResponse(ProtocolResponse *response);
|
||||||
};
|
};
|
||||||
|
|
||||||
class InvalidCommand : public Command {
|
class InvalidCommand : public Command {
|
||||||
|
@ -121,6 +126,8 @@ public:
|
||||||
int getItemId() const { return ItemId_Other; }
|
int getItemId() const { return ItemId_Other; }
|
||||||
static void initializeHash();
|
static void initializeHash();
|
||||||
static ProtocolItem *newItem() { return new ProtocolResponse; }
|
static ProtocolItem *newItem() { return new ProtocolResponse; }
|
||||||
|
int getCmdId() const { return cmdId; }
|
||||||
|
ResponseCode getResponseCode() const { return responseCode; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class GenericEvent : public ProtocolItem {
|
class GenericEvent : public ProtocolItem {
|
||||||
|
@ -157,12 +164,12 @@ public:
|
||||||
ChatEvent(const QString &_eventName, const QString &_channel);
|
ChatEvent(const QString &_eventName, const QString &_channel);
|
||||||
};
|
};
|
||||||
|
|
||||||
class Event_ChatListChannels : public GenericEvent {
|
class Event_ChatListChannels : public ChatEvent {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
QList<ServerChatChannelInfo> channelList;
|
QList<ServerChatChannelInfo> channelList;
|
||||||
public:
|
public:
|
||||||
Event_ChatListChannels() : GenericEvent("chat_list_channels") { }
|
Event_ChatListChannels() : ChatEvent("chat_list_channels", QString()) { }
|
||||||
int getItemId() const { return ItemId_Event_ChatListChannels; }
|
int getItemId() const { return ItemId_Event_ChatListChannels; }
|
||||||
void addChannel(const QString &_name, const QString &_description, int _playerCount, bool _autoJoin)
|
void addChannel(const QString &_name, const QString &_description, int _playerCount, bool _autoJoin)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue