示例#1
0
void ShtServer::onNewConnection()
{
    QWebSocket *socket = socketServer->nextPendingConnection();
    connect(socket, &QWebSocket::textMessageReceived, this, &ShtServer::onTextMessage);
    connect(socket, &QWebSocket::disconnected, this, &ShtServer::onSocketDisconnected);
    //onlineSockets << socket;
    qWarning() << "Added socket " << socket->peerName() << ":" << socket->peerPort();
}
//! [onNewConnection]
void SslEchoServer::onNewConnection()
{
    QWebSocket *pSocket = m_pWebSocketServer->nextPendingConnection();

    qDebug() << "Client connected:" << pSocket->peerName() << pSocket->origin();

    connect(pSocket, SIGNAL(textMessageReceived(QString)), this, SLOT(processMessage(QString)));
    connect(pSocket, SIGNAL(binaryMessageReceived(QByteArray)), this, SLOT(processBinaryMessage(QByteArray)));
    connect(pSocket, SIGNAL(disconnected()), this, SLOT(socketDisconnected()));
    //connect(pSocket, SIGNAL(pong(quint64)), this, SLOT(processPong(quint64)));

    m_clients << pSocket;
}
//! [onNewConnection]
void SslEchoServer::onNewConnection()
{
    QWebSocket *pSocket = m_pWebSocketServer->nextPendingConnection();

    qDebug() << "Client connected:" << pSocket->peerName() << pSocket->origin();

    connect(pSocket, &QWebSocket::textMessageReceived, this, &SslEchoServer::processTextMessage);
    connect(pSocket, &QWebSocket::binaryMessageReceived,
            this, &SslEchoServer::processBinaryMessage);
    connect(pSocket, &QWebSocket::disconnected, this, &SslEchoServer::socketDisconnected);
    //connect(pSocket, &QWebSocket::pong, this, &SslEchoServer::processPong);

    m_clients << pSocket;
}
示例#4
0
void ShtServer::onTextMessage(QString msg)
{
    QElapsedTimer totalTime;
    totalTime.start();

    QWebSocket *socket = qobject_cast<QWebSocket *>(sender());
    qWarning() << "received: " << msg << "from " << socket->peerName();

    //Json
    QJsonDocument doc = QJsonDocument::fromJson(msg.toUtf8());
    if(!doc.isObject()){
        socket->sendTextMessage("json or gtfo");
        return;
    }

    QJsonObject docObj = doc.object();
    int r = docObj["request"].toInt();
    switch(r){
    case 0:     //LOGIN
    {
        QString uuid = docObj["uuid"].toString();
        User* u = dbManager->findUserByUuid(uuid);
        if(!u){
            //DEFAULTS FOR NEW USERS
           u = new User();
           u->setUuid(QUuid::createUuid().toString());
           u->setName("anonimo");
           u->setEmail("");
           u->setMatches(0);
           u->setKilos(0);
           u->setState(User::AVAILABLE);
           u->setAvatar("263a");
           dbManager->addUser(u);

           u->setSocket(socket);
        }
        usersBySocket.insert(socket, u);

        QJsonObject obj = u->getJsonObject();
        QJsonDocument doc;
        doc.setObject(obj);
        QByteArray msg = doc.toJson(QJsonDocument::Compact);
        socket->sendTextMessage(msg);
    }break;

    case 1:     //GET MATCHES
    {
        User *u = usersBySocket.value(socket);
        if(!u){
            qWarning() << "WARNING: getMatches from unknown user";
            break;
        }

        QJsonArray matchesList;
        for(Match* m: matches){
            QJsonObject matchObj = m->getJsonObject();
            matchesList.append(matchObj);
        }

        QJsonObject obj;
        obj["request"] = 1;
        obj["matchesList"] = matchesList;
        QJsonDocument doc;
        doc.setObject(obj);
        QByteArray msg = doc.toJson(QJsonDocument::Compact);
        socket->sendTextMessage(msg);
    }break;
    case 2:     //CREATE MATCH
    {
        User* u = usersBySocket.value(socket);
        if(!u){
            qWarning() << "ERROR: createMatch() user not found";
            break;
        }

        if(u->getPendingMatch() != NULL){
            qWarning() << "SKIPPING: user already has a match pending";
            break;
        }

        Match *m = new Match(this);
        m->init(u);
        m->addPlayer(u);
        matches.append(m);
        u->setPendingMatch(m);

        QJsonObject obj;
        obj["request"] = 2;
        obj["result"] = "ok";
        QJsonDocument doc;
        doc.setObject(obj);
        QByteArray msg = doc.toJson(QJsonDocument::Compact);
        socket->sendTextMessage(msg);
        connect(m, &Match::finished, this, &ShtServer::onMatchFinished);
    }break;
    case 3:     //JOIN MATCH
    {
        User* u = usersBySocket.value(socket);
        if(!u){
            qWarning() << "ERROR: joinMatch() user not found";
            break;
        }

        Match* m = findMatch(docObj["uuid"].toString());
        if(!m){
            qWarning() << "ERROR: match not found";
            break;
        }
        m->addPlayer(u);
        u->setPendingMatch(m);
    }break;
    case 4:     //LEAVE MATCH
    {
        User* u = usersBySocket.value(socket);
        if(!u){
            qWarning() << "ERROR: leaveMatch() user not found";
            break;
        }

        Match* m = findMatch(docObj["uuid"].toString());
        if(!m){
            qWarning() << "ERROR: match not found";
            break;
        }
        m->leavePlayer(u);
    }break;
    case 5:     //PASS CARD
    {
        User* u = usersBySocket.value(socket);
        if(!u){
            qWarning() << "ERROR: passCard user not found";
            break;
        }

        Match* m = findMatch(docObj["uuid"].toString());
        if(!m){
            qWarning() << "ERROR: match not found";
            break;
        }
        m->passCard(u, docObj["card"].toString());
    }break;
    case 6:     //START MATCH
    {
        User* u = usersBySocket.value(socket);
        if(!u){
            qWarning() << "ERROR: matchStart user not found";
            break;
        }

        Match* m = findMatch(docObj["uuid"].toString());
        if(!m){
            qWarning() << "ERROR: match not found";
            break;
        }

        //Only match creator can start the match
        if(m->state()==Match::INIT && m->getOwner() == u){
            m->start();
        } else {
            u->sendMessage("match_server", "start_game", "denied", "");
        }

    }break;

    default:
        break;
    }
    qWarning() << "Request " << r << " evaded in " << totalTime.elapsed() << "ms";
}