예제 #1
0
void GameHandler::on_disconnect(DisconnectRequest *ev)
{
    GameLink * lnk = (GameLink *)ev->src();
    GameSession &session = m_session_store.session_from_event(ev);
    if(session.is_connected_to_map_server_id==0)
    {
        if(session.m_direction==GameSession::EXITING_TO_MAP)
        {
            SessionStore::MTGuard guard(m_session_store.reap_lock());
            m_session_store.mark_session_for_reaping(&session,lnk->session_token());
            m_session_store.session_link_lost(lnk->session_token());
        }
        else
        {
            EventProcessor * tgt = HandlerLocator::getAuth_Handler();
            tgt->putq(new ClientDisconnectedMessage({lnk->session_token()}));
            m_session_store.session_link_lost(lnk->session_token());
            m_session_store.remove_by_token(lnk->session_token(), session.auth_id());
        }
    }
    else
        m_session_store.session_link_lost(lnk->session_token());
    lnk->putq(new DisconnectResponse);
    // Post disconnect event to link, will close it's processing loop, after it sends the response
    lnk->putq(new DisconnectEvent(lnk->session_token())); // this should work, event if different threads try to do it in parallel
}
예제 #2
0
void GameHandler::on_link_lost(SEGSEvent *ev)
{
    GameLink * lnk = (GameLink *)ev->src();
    GameSession &session = m_session_store.session_from_event(ev);

    if(session.is_connected_to_map_server_id==0)
    {
        if(session.m_direction==GameSession::EXITING_TO_MAP)
        {
            SessionStore::MTGuard guard(m_session_store.reap_lock());
            m_session_store.mark_session_for_reaping(&session,lnk->session_token());
            m_session_store.session_link_lost(lnk->session_token());
        }
        else
        {
            EventProcessor * tgt = HandlerLocator::getAuth_Handler();
            tgt->putq(new ClientDisconnectedMessage({lnk->session_token()}));
            m_session_store.session_link_lost(lnk->session_token());
            m_session_store.remove_by_token(lnk->session_token(), session.auth_id());
        }
    }
    else
        m_session_store.session_link_lost(lnk->session_token());
    // Post disconnect event to link, will close it's processing loop
    lnk->putq(new DisconnectEvent(lnk->session_token()));
}
예제 #3
0
void GameHandler::reap_stale_links()
{
    SessionStore::MTGuard guard(m_session_store.reap_lock());
    EventProcessor *            tgt      = HandlerLocator::getAuth_Handler();
    m_session_store.reap_stale_links("GameInstance", link_is_stale_if_disconnected_for,
                                     [tgt](uint64_t tok) {
                                         tgt->putq(new ClientDisconnectedMessage({tok}));
                                     });
}
예제 #4
0
///
/// \brief This handler is called when we get the account information for a
/// \param ev
///
void GameHandler::on_account_data(GameAccountResponse *ev)
{
    GameSession &session(m_session_store.session_from_event(ev));
    // we've got db answer, session is ok again
    m_session_store.locked_unmark_session_for_reaping(&session);
    session.m_game_account = ev->m_data;
    // Inform auth server about succesful client connection
    EventProcessor *tgt      = HandlerLocator::getAuth_Handler();
    tgt->putq(new ClientConnectedMessage({ev->session_token(),m_server->getId(),0 }));

    m_session_store.add_to_active_sessions(&session);
    CharacterSlots *slots_event=new CharacterSlots;
    slots_event->set_account_data(&session.m_game_account);
    session.link()->putq(slots_event);
}
예제 #5
0
파일: AdminRPC.cpp 프로젝트: Segs/Segs
/*!
 * @brief       Add a user
 * @param[in]   username
 * @param[in]   password
 * @param[in]   access_level
 * @return      Returns a string, if successful "OK" otherwise an error
 */
QString AdminRPC::addUser(const QString &username, const QString &password, int access_level)
{
    QString result;
    uint64_t fake_session_token = s_last_token++;
    int token = static_cast<int>(fake_session_token);

    // Create and insert a record of this request into m_completion_state
    m_completion_state.insert(token, "");

    qCDebug(logRPC) << "addUser call in progress";

    EventProcessor *tgt = HandlerLocator::getAuthDB_Handler();
    tgt->putq(new CreateAccountMessage({username, password, access_level}, fake_session_token, this));

    QTimer response_timer;
    QTimer timeout;
    timeout.setSingleShot(true);
    QEventLoop loop;
    loop.connect(&timeout, SIGNAL(timeout()), SLOT(quit()));
    loop.connect(this, SIGNAL(responseRecieved()), SLOT(quit()));
    loop.connect(&response_timer, &QTimer::timeout, [=] () {
        if (!m_completion_state[token].isEmpty())
        {
            emit responseRecieved(); // Response recieved we can break out of event loop
            return;
        }
        else
            return;
    });
    response_timer.start(500); // Checks completion status every 500ms
    timeout.start(5000); // Timeout of 5 seconds in case something goes wrong.
    loop.exec();

    if (!m_completion_state[token].isEmpty())
    {
        result = m_completion_state[token];
        response_timer.stop();
        m_completion_state.remove(token); // Tidy up
    }
    else
    {
        result = "Something went wrong";
        response_timer.stop();
        m_completion_state.remove(token);
    }

    return result;
}