diff -r 0730c68fdf97 -r 773beead236f qmlfrontend/net_session.cpp --- a/qmlfrontend/net_session.cpp Fri May 24 22:27:19 2019 +0200 +++ b/qmlfrontend/net_session.cpp Fri May 24 23:39:51 2019 +0200 @@ -1,6 +1,14 @@ #include "net_session.h" -NetSession::NetSession(QObject *parent) : QObject(parent) {} +#include "players_model.h" +#include "rooms_model.h" + +NetSession::NetSession(QObject *parent) + : QObject(parent), + m_playersModel(new PlayersListModel()), + m_roomsModel(new RoomsListModel()) {} + +NetSession::~NetSession() { close(); } QUrl NetSession::url() const { return m_url; } @@ -31,6 +39,8 @@ return m_sessionState; } +QString NetSession::room() const { return m_room; } + void NetSession::setUrl(const QUrl &url) { if (m_url == url) return; @@ -52,12 +62,20 @@ emit passwordChanged(m_password); } +void NetSession::setRoom(const QString &room) { + if (m_room == room) return; + + m_room = room; + emit roomChanged(m_room); +} + void NetSession::close() { if (!m_socket.isNull()) { m_socket->disconnectFromHost(); m_socket.clear(); setSessionState(NotConnected); + setRoom({}); } } @@ -182,9 +200,33 @@ void NetSession::handleLeft(const QStringList ¶meters) {} -void NetSession::handleLobbyJoined(const QStringList ¶meters) {} +void NetSession::handleLobbyJoined(const QStringList ¶meters) { + for (auto player : parameters) { + if (player == m_nickname) { + // check if server is authenticated or no authentication was performed at + // all + if (!m_serverAuthHash.isEmpty()) { + emit error(tr("Server authentication error")); + + close(); + } + + setSessionState(Lobby); + } -void NetSession::handleLobbyLeft(const QStringList ¶meters) {} + m_playersModel->addPlayer(player, false); + } +} + +void NetSession::handleLobbyLeft(const QStringList ¶meters) { + if (parameters.length() == 1) { + m_playersModel->removePlayer(parameters[0]); + } else if (parameters.length() == 2) { + m_playersModel->removePlayer(parameters[0], parameters[1]); + } else { + qWarning("Malformed LOBBY:LEFT message"); + } +} void NetSession::handleNick(const QStringList ¶meters) { if (parameters.length()) setNickname(parameters[0]); @@ -206,9 +248,29 @@ void NetSession::handleRoomAbandoned(const QStringList ¶meters) {} -void NetSession::handleRoom(const QStringList ¶meters) {} +void NetSession::handleRoom(const QStringList ¶meters) { + if (parameters.size() == 10 && parameters[0] == "ADD") { + m_roomsModel->addRoom(parameters.mid(1)); + } else if (parameters.length() == 11 && parameters[0] == "UPD") { + m_roomsModel->updateRoom(parameters[1], parameters.mid(2)); -void NetSession::handleRooms(const QStringList ¶meters) {} + // keep track of room name so correct name is displayed + if (m_room == parameters[1]) { + setRoom(parameters[2]); + } + } else if (parameters.size() == 2 && parameters[0] == "DEL") { + m_roomsModel->removeRoom(parameters[1]); + } +} + +void NetSession::handleRooms(const QStringList ¶meters) { + if (parameters.size() % 9) { + qWarning("Net: Malformed ROOMS message"); + return; + } + + m_roomsModel->setRoomsList(parameters); +} void NetSession::handleRoundFinished(const QStringList ¶meters) {}