Advertisement
Guest User

Untitled

a guest
Dec 9th, 2022
491
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.58 KB | None | 0 0
  1. #include <iostream>
  2. #include <uwebsockets/App.h>
  3. #include <nlohmann/json.hpp>
  4. using namespace std;
  5. using json = nlohmann::json;
  6.  
  7. // Публичные сообщения
  8. // user13 => server: {"command": "public_msg", "text": "Всем приветы в этом чате"}
  9. // server => all users {"command": "public_msg", "text": "...", user_from: 13}
  10. // data, ws
  11.  
  12. void process_public_msg(auto data, auto* ws) {
  13.     json payload = {
  14.         {"command", data["command"]},
  15.         {"text", data["text"]},
  16.         {"user_from", ws->getUserData()->user_id}
  17.     };
  18.     ws->publish("public", payload.dump());
  19. }
  20.  
  21. // Приватные сообщения
  22. // user10 => server {"command": "private_msg", "text": "...", user_to: 20}
  23. // server => user20 {"command": "private_msg", "text": "...", user_from: 10}
  24. void process_private_msg(auto data, auto* ws) {
  25.     json payload = {
  26.         {"command", data["command"]},
  27.         {"text", data["text"]},
  28.         {"user_from", ws->getUserData()->user_id},
  29.     };
  30.     int user_to = data["user_to"];
  31.     ws->publish("user" + to_string(user_to), payload.dump());
  32. }
  33.  
  34. // Возможность указать имя command:set_name
  35. // Оповещение о подключениях command:status (список людей онлайн)
  36.  
  37. int main()
  38. {
  39.     struct UserData {
  40.         int user_id;
  41.         string name;
  42.     };
  43.  
  44.     int latest_user_id = 10;
  45.  
  46.  
  47.     uWS::App().ws<UserData>("/*", {
  48.         .idleTimeout = 300,
  49.         // Вызывается при новом подключении
  50.         .open = [&latest_user_id](auto* ws) {
  51.             UserData* data = ws->getUserData();
  52.             data->user_id = latest_user_id++;
  53.             data->name = "noname";
  54.  
  55.             cout << "New user connected: " << data->user_id << endl;
  56.             ws->subscribe("public"); // подписываем всех на канал(топик) паблик
  57.             ws->subscribe("user" + to_string(data->user_id)); // подписываем на персональны топик
  58.         },
  59.         // При получении данных от клиента
  60.         .message = [](auto* ws, std::string_view data, uWS::OpCode opCode) {
  61.             json parsed_data = json::parse(data); // ToDo: check format / handle exception
  62.  
  63.             if (parsed_data["command"] == "public_msg") {
  64.                 process_public_msg(parsed_data, ws);
  65.             }
  66.  
  67.             if (parsed_data["command"] == "private_msg") {
  68.                 process_private_msg(parsed_data, ws);
  69.             }
  70.         },
  71.         .close = [](auto*/*ws*/, int /*code*/, std::string_view /*message*/) {
  72.             /* You may access ws->getUserData() here */
  73.         }
  74.     }).listen(9001, [](auto* listen_socket) {
  75.         if (listen_socket) {
  76.             std::cout << "Listening on port " << 9001 << std::endl;
  77.         } // http://localhost:9001/
  78.     }).run();
  79. }
  80.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement