Advertisement
Guest User

Untitled

a guest
Aug 12th, 2022
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.72 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. struct UserData {
  9.     int id;
  10.     string name;
  11. };
  12.  
  13. // Чтобы записывать типы покороче
  14. typedef uWS::WebSocket<false, true, UserData>* websock;
  15.  
  16. // "отправить приватное сообщение" = PRIVATE_MSG
  17. // JSON {"command": "PRIVATE_MSG", "user_to": 11, "text" : "Эй привет 11ый!"}
  18. void process_private_msg(websock ws, json parsed_data) {
  19.     UserData* data = ws->getUserData(); // Получаем информацию о текущему пользовале
  20.  
  21.     json payload;
  22.     payload["command"] = "PRIVATE_MSG";
  23.     payload["user_from"] = data->id;
  24.     payload["text"] = parsed_data["text"];
  25.  
  26.     ws->publish("USER_" + to_string(parsed_data["user_to"]), payload.dump());
  27. }
  28.  
  29. int main()
  30. {
  31.     int latest_user_id = 10; // ID последнего подключившегося
  32.     uWS::App app = uWS::App(); // Создали приложение
  33.     //app.get("/", )
  34.     app.ws<UserData>("/*", {
  35.         // "[]() {}" - Лямбда - функция
  36.         // открытие соединения
  37.         // Назначить ID
  38.         // Сообщить всем что человек (такой-то) подключился
  39.         .open = [&latest_user_id](websock ws) {
  40.             UserData* data = ws->getUserData(); // Получаем данные пользователя
  41.             data->id = latest_user_id++; // Каждому следующему подключив. будет назначен следующий АЙди
  42.             cout << "New user connected: " << data->id << endl;
  43.             ws->subscribe("USER_" + to_string(data->id)); // Каждого пользователя подписываем на личный канал
  44.         },
  45.         // при получении информации от клиента
  46.         // "отправить публичное сообщение" = PUBLIC_MSG
  47.         // "представиться" = SET_NAME
  48.  
  49.         .message = [](websock ws, string_view message, uWS::OpCode opcode) {
  50.             // ToDO: предусмотреть обработку исключений
  51.             json parsed_data = json::parse(message); // Распарсить JSON
  52.             string command = parsed_data["command"];
  53.  
  54.             cout << "Got command " << command << endl;
  55.  
  56.             if (command == "PRIVATE_MSG") {
  57.                 process_private_msg(ws, parsed_data);
  58.             }
  59.         },
  60.         // при закрытии соединения
  61.         // Сообщить всем что человек (такой-то) отключился
  62.         .close = [](websock ws, int, string_view) {},
  63.     });
  64.    
  65.     app.listen(9001, [](auto *) {});
  66.     app.run();
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement