Advertisement
Guest User

Untitled

a guest
Nov 18th, 2022
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.87 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. // [USER 17] =server> {"command":"public_msg", "text":"a"}
  9. // [SERVER] =everyone> {"command":"public_msg", "text":"a", "user_from": 17}
  10. void process_public_msg(json parsed_data, auto* ws) {
  11.     auto* udata = ws->getUserData();
  12.     json payload = {
  13.         {"command", "public_msg"},
  14.         {"text", parsed_data["text"]},
  15.         {"user_from", udata->id}
  16.     };
  17.     // App::publish() ?
  18.     ws->publish("public", payload.dump());
  19. }
  20.  
  21. // [USER 17] =server> {"command":"private_msg", "text":"hi", "user_to": 23}
  22. // [SERVER] =user23> {"command":"private_msg", "text":"hi", "user_from": 17}
  23. void process_private_msg(json parsed_data, auto* ws) {
  24.     // payload
  25.     // publish ?
  26.     //+ channel!
  27.  
  28.     // ДЗ!
  29. }
  30.  
  31. // Завтра: set_name, online status
  32.  
  33. int main() {
  34.     int latest_user_id = 10; // каждый раз увеличиваем на 1 (++)
  35.  
  36.     /* ws->getUserData returns one of these */
  37.     struct UserData {
  38.         int id;
  39.         string name;
  40.     };
  41.     // .ws = конфигурация WebSocket сервера
  42.     uWS::App().ws<UserData>("/*", {
  43.         .idleTimeout = 16,
  44.             /* Handlers */
  45.  
  46.         // Кто-то подключился к серверу
  47.         .open = [&latest_user_id](auto* ws) {
  48.             // Выдать пользователю: id, имя по-умолчанию
  49.             auto* data = ws->getUserData();
  50.             data->id = latest_user_id++;
  51.             data->name = "unnamed";
  52.  
  53.             cout << "New user connected: " << data->id << endl;
  54.             ws->send("Welcome to SB chat server, v0.1", uWS::OpCode::TEXT);
  55.  
  56.             ws->subscribe("public");
  57.             ws->subscribe("user" + to_string(data->id)); // личный канал!
  58.         },
  59.  
  60.         // Кто-то отправил серверу пакет с данными
  61.         .message = [](auto* ws, std::string_view message, uWS::OpCode opCode) {
  62.             json parsed_data = json::parse(message);
  63.  
  64.             if (parsed_data["command"] == "public_msg") {
  65.                 process_public_msg(parsed_data, ws);
  66.             }
  67.  
  68.             //if (parsed_data["command"] == "private_msg") {
  69.             //  process_private_msg();
  70.             //}
  71.         },
  72.  
  73.         // Отключился от сервера
  74.         .close = [](auto*/*ws*/, int /*code*/, std::string_view /*message*/) {
  75.             /* You may access ws->getUserData() here */
  76.         }
  77.  
  78.     }).listen(9001, [](auto* listen_socket) {
  79.         if (listen_socket) {
  80.             std::cout << "Listening on port " << 9001 << std::endl;
  81.         }
  82.     }).run();
  83. }
  84.  
  85.  
  86. // 1. Отправка публичных сообщений (всем)
  87.     //     {"command":"public_msg", "text":"Всем приветы в этом чате"}
  88.     // 2. Отправка приватных сообщений
  89.     //      {"command":"private_msg", "text":"Тебе лично привет", "user_id": 15}
  90.     //
  91.     //
  92.     //
  93.     // 3. У пользователей будут имена
  94.     // 4. Как узнать кто подключен к серверу?
  95.     //   STATUS...
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement