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 }
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())); }
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})); }); }
/// /// \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); }
/*! * @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; }