Advertisement
Guest User

Untitled

a guest
Sep 9th, 2022
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <uwebsockets/App.h>
  3. #include <nlohmann/json.hpp>  // vcpkg.exe install nlohmann-json
  4. using namespace std;
  5. using json = nlohmann::json;
  6.  
  7. struct UserData {
  8.     int id;
  9.     string name;
  10. };
  11. // Лямбда выражения - функция
  12. // [](){}
  13. // [](аргументы){ код }
  14. int main()
  15. {
  16.     // * - указатель - адрес в памяти
  17.     // char * - ['A', 'B', 'C', 'D', 0]
  18.     int latest_user_id = 10;
  19.     uWS::App().get("/hello",
  20.         [](auto* response, auto* request) {
  21.             /* You can efficiently stream huge files too */
  22.             response->writeHeader("Content-Type", "text/html; charset=utf-8")->end("Welcome to SkillChatServer");
  23.         }
  24.     ).ws<UserData>("/*", {
  25.         // Вызывается как только подключается новый пользователь
  26.         .open = [&latest_user_id](auto* ws) {
  27.             UserData* user_data = ws->getUserData();
  28.             // Выдать пользователю уникальный ID
  29.             user_data->id = latest_user_id++;
  30.             // По-умолчанию назовем пользователя "unnamed user"
  31.             user_data->name = "unnamed user";
  32.  
  33.             cout << "User connected: " << user_data->id << endl;
  34.  
  35.             ws->subscribe("public_channel"); // Всех кто подключается подписываем на канал public_channel
  36.             ws->subscribe("user" + to_string(user_data->id)); // И еще на ЛИЧНЫЙ канал // user11
  37.         },
  38.         // Вызывается когда от пользователя приходит сообщение (байтики)
  39.         .message = [](auto* ws, std::string_view message, uWS::OpCode opCode) {
  40.             UserData* user_data = ws->getUserData(); // Получаем информацию о пользователе
  41.             json message_data = json::parse(message); // Парсим данные которые он нам прислал
  42.             if (message_data["command"] == "public_msg") { // Если он хочет отправить public_msg
  43.                 json payload; // готовим посылку
  44.                 payload["command"] = "public_msg";
  45.                 payload["text"] = message_data["text"];
  46.                 payload["user_id"] = user_data->id;
  47.                 // payload.dump - выводит JSON
  48.                 ws->publish("public_channel", payload.dump());
  49.                 cout << "User sent public message: " << user_data->id << endl;
  50.             }
  51.             if (message_data["command"] == "private_msg") {
  52.                 json payload;
  53.                 payload["command"] = "private_msg";
  54.                 payload["text"] = message_data["text"];
  55.                 payload["user_from"] = user_data->id;
  56.                 ws->publish("user" + to_string(message_data["user_to"]), payload.dump()); // Отправляем лично получателю
  57.                 cout << "User sent private message: " << user_data->id << " to: " << message_data["user_to"] << endl;
  58.             }
  59.            
  60.             // Протокол на основе JSON
  61.             // Планируем дать пользователю след. возможности:
  62.             // 1. Отправлять публичные сообщение всем на сервер
  63.             //  // "СЕРВЕР ЛОХ" => обработать ошибку, из-за неверного формата
  64.                 // Пользователь серверу: {"command": "public_msg", "text": "Всем приветики и чмоки"}
  65.                 // Сервер пользователям: {"command": "public_msg", "text": "Всем приветики и чмоки", "user_id": 11}
  66.             // 2. Отправлять приватные сообщения кому-то конкретному
  67.             // Пользователь серверу: {"command": "private_msg", "text": "Привет тебе 11ый!", "user_to": 11}
  68.             // Сервер пользователю : {"command": "private_msg", "text": "Привет тебе 11ый!", "user_from": 13}
  69.             // 3. Указать свое имя
  70.         }
  71.  
  72.     }).listen(9001, [](auto* listenSocket) {  // http://127.0.0.1:9001/
  73.  
  74.         if (listenSocket) {
  75.             std::cout << "Listening on port " << 9001 << std::endl;
  76.         }
  77.  
  78.     }).run();
  79. }
  80.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement