online.hpp 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #ifndef __ONLINE_HPP__
  2. #define __ONLINE_HPP__
  3. #include "util.hpp"
  4. #include <mutex>
  5. #include <unordered_map>
  6. #include <websocketpp/server.hpp>
  7. #include <websocketpp/config/asio_no_tls.hpp>
  8. typedef websocketpp::server<websocketpp::config::asio> wsserver_t;
  9. /*在线用户管理模块 -- 用于管理在游戏大厅以及游戏房间中的用户,建立用户id与websocket长连接的对应关系*/
  10. class online_manager {
  11. public:
  12. online_manager() { LOG(DEBUG, "在线用户管理模块初始化完毕"); }
  13. ~online_manager() { LOG(DEBUG, "在线用户管理模块已被销毁"); }
  14. /*用户进入游戏大厅(此时用户websocket长连接已建立好)*/
  15. void enter_game_hall(uint64_t uid, wsserver_t::connection_ptr conn) {
  16. std::unique_lock<std::mutex> lock(_mutex);
  17. _hall_user[uid] = conn;
  18. }
  19. /*用户进入游戏房间*/
  20. void enter_game_room(uint64_t uid, wsserver_t::connection_ptr conn) {
  21. std::unique_lock<std::mutex> lock(_mutex);
  22. _room_user[uid] = conn;
  23. }
  24. /*用户离开游戏大厅(websocket长连接断开时)*/
  25. void exit_game_hall(uint64_t uid) {
  26. std::unique_lock<std::mutex> lock(_mutex);
  27. _hall_user.erase(uid);
  28. }
  29. /*用户对战结束离开游戏房间回到游戏大厅*/
  30. void exit_game_room(uint64_t uid) {
  31. std::unique_lock<std::mutex> lock(_mutex);
  32. _room_user.erase(uid);
  33. }
  34. /*判断当前用户是否在游戏大厅*/
  35. bool is_in_game_hall(uint64_t uid) {
  36. std::unique_lock<std::mutex> lock(_mutex);
  37. auto it = _hall_user.find(uid);
  38. if(it == _hall_user.end()) return false;
  39. return true;
  40. }
  41. /*判断当前用户是否在游戏房间*/
  42. bool is_in_game_room(uint64_t uid) {
  43. std::unique_lock<std::mutex> lock(_mutex);
  44. auto it = _room_user.find(uid);
  45. if(it == _room_user.end()) return false;
  46. return true;
  47. }
  48. /*通过用户id获取游戏大厅用户的通信连接*/
  49. wsserver_t::connection_ptr get_conn_from_hall(uint64_t uid) {
  50. std::unique_lock<std::mutex> lock(_mutex);
  51. auto it = _hall_user.find(uid);
  52. if(it == _hall_user.end()) return nullptr;
  53. return _hall_user[uid];
  54. }
  55. /*通过用户id获取游戏房间用户的通信连接*/
  56. wsserver_t::connection_ptr get_conn_from_room(uint64_t uid) {
  57. std::unique_lock<std::mutex> lock(_mutex);
  58. auto it = _room_user.find(uid);
  59. if(it == _room_user.end()) return nullptr;
  60. return _room_user[uid];
  61. }
  62. private:
  63. std::mutex _mutex; // 解决多线程模式下的线程安全问题
  64. std::unordered_map<uint64_t, wsserver_t::connection_ptr> _hall_user; // 建立游戏大厅用户id与通信连接之间的关系
  65. std::unordered_map<uint64_t, wsserver_t::connection_ptr> _room_user; // 建立游戏房间用户id与通信连接之间的关系
  66. };
  67. #endif