12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- #ifndef __ONLINE_HPP__
- #define __ONLINE_HPP__
- #include "util.hpp"
- #include <mutex>
- #include <unordered_map>
- #include <websocketpp/server.hpp>
- #include <websocketpp/config/asio_no_tls.hpp>
- typedef websocketpp::server<websocketpp::config::asio> wsserver_t;
- /*在线用户管理模块 -- 用于管理在游戏大厅以及游戏房间中的用户,建立用户id与websocket长连接的对应关系*/
- class online_manager {
- public:
- online_manager() { LOG(DEBUG, "在线用户管理模块初始化完毕"); }
- ~online_manager() { LOG(DEBUG, "在线用户管理模块已被销毁"); }
- /*用户进入游戏大厅(此时用户websocket长连接已建立好)*/
- void enter_game_hall(uint64_t uid, wsserver_t::connection_ptr conn) {
- std::unique_lock<std::mutex> lock(_mutex);
- _hall_user[uid] = conn;
- }
- /*用户进入游戏房间*/
- void enter_game_room(uint64_t uid, wsserver_t::connection_ptr conn) {
- std::unique_lock<std::mutex> lock(_mutex);
- _room_user[uid] = conn;
- }
- /*用户离开游戏大厅(websocket长连接断开时)*/
- void exit_game_hall(uint64_t uid) {
- std::unique_lock<std::mutex> lock(_mutex);
- _hall_user.erase(uid);
- }
- /*用户对战结束离开游戏房间回到游戏大厅*/
- void exit_game_room(uint64_t uid) {
- std::unique_lock<std::mutex> lock(_mutex);
- _room_user.erase(uid);
- }
- /*判断当前用户是否在游戏大厅*/
- bool is_in_game_hall(uint64_t uid) {
- std::unique_lock<std::mutex> lock(_mutex);
- auto it = _hall_user.find(uid);
- if(it == _hall_user.end()) return false;
- return true;
- }
- /*判断当前用户是否在游戏房间*/
- bool is_in_game_room(uint64_t uid) {
- std::unique_lock<std::mutex> lock(_mutex);
- auto it = _room_user.find(uid);
- if(it == _room_user.end()) return false;
- return true;
- }
- /*通过用户id获取游戏大厅用户的通信连接*/
- wsserver_t::connection_ptr get_conn_from_hall(uint64_t uid) {
- std::unique_lock<std::mutex> lock(_mutex);
- auto it = _hall_user.find(uid);
- if(it == _hall_user.end()) return nullptr;
- return _hall_user[uid];
- }
- /*通过用户id获取游戏房间用户的通信连接*/
- wsserver_t::connection_ptr get_conn_from_room(uint64_t uid) {
- std::unique_lock<std::mutex> lock(_mutex);
- auto it = _room_user.find(uid);
- if(it == _room_user.end()) return nullptr;
- return _room_user[uid];
- }
- private:
- std::mutex _mutex; // 解决多线程模式下的线程安全问题
- std::unordered_map<uint64_t, wsserver_t::connection_ptr> _hall_user; // 建立游戏大厅用户id与通信连接之间的关系
- std::unordered_map<uint64_t, wsserver_t::connection_ptr> _room_user; // 建立游戏房间用户id与通信连接之间的关系
- };
- #endif
|