Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <uwebsockets/App.h>
- #include <nlohmann/json.hpp> // vcpkg.exe install nlohmann-json
- using namespace std;
- using json = nlohmann::json;
- struct UserData {
- int id;
- string name;
- };
- // Лямбда выражения - функция
- // [](){}
- // [](аргументы){ код }
- int main()
- {
- // * - указатель - адрес в памяти
- // char * - ['A', 'B', 'C', 'D', 0]
- int latest_user_id = 10;
- uWS::App().get("/hello",
- [](auto* response, auto* request) {
- /* You can efficiently stream huge files too */
- response->writeHeader("Content-Type", "text/html; charset=utf-8")->end("Welcome to SkillChatServer");
- }
- ).ws<UserData>("/*", {
- // Вызывается как только подключается новый пользователь
- .open = [&latest_user_id](auto* ws) {
- UserData* user_data = ws->getUserData();
- // Выдать пользователю уникальный ID
- user_data->id = latest_user_id++;
- // По-умолчанию назовем пользователя "unnamed user"
- user_data->name = "unnamed user";
- cout << "User connected: " << user_data->id << endl;
- ws->subscribe("public_channel"); // Всех кто подключается подписываем на канал public_channel
- ws->subscribe("user" + to_string(user_data->id)); // И еще на ЛИЧНЫЙ канал // user11
- },
- // Вызывается когда от пользователя приходит сообщение (байтики)
- .message = [](auto* ws, std::string_view message, uWS::OpCode opCode) {
- UserData* user_data = ws->getUserData(); // Получаем информацию о пользователе
- json message_data = json::parse(message); // Парсим данные которые он нам прислал
- if (message_data["command"] == "public_msg") { // Если он хочет отправить public_msg
- json payload; // готовим посылку
- payload["command"] = "public_msg";
- payload["text"] = message_data["text"];
- payload["user_id"] = user_data->id;
- // payload.dump - выводит JSON
- ws->publish("public_channel", payload.dump());
- cout << "User sent public message: " << user_data->id << endl;
- }
- if (message_data["command"] == "private_msg") {
- json payload;
- payload["command"] = "private_msg";
- payload["text"] = message_data["text"];
- payload["user_from"] = user_data->id;
- ws->publish("user" + to_string(message_data["user_to"]), payload.dump()); // Отправляем лично получателю
- cout << "User sent private message: " << user_data->id << " to: " << message_data["user_to"] << endl;
- }
- // Протокол на основе JSON
- // Планируем дать пользователю след. возможности:
- // 1. Отправлять публичные сообщение всем на сервер
- // // "СЕРВЕР ЛОХ" => обработать ошибку, из-за неверного формата
- // Пользователь серверу: {"command": "public_msg", "text": "Всем приветики и чмоки"}
- // Сервер пользователям: {"command": "public_msg", "text": "Всем приветики и чмоки", "user_id": 11}
- // 2. Отправлять приватные сообщения кому-то конкретному
- // Пользователь серверу: {"command": "private_msg", "text": "Привет тебе 11ый!", "user_to": 11}
- // Сервер пользователю : {"command": "private_msg", "text": "Привет тебе 11ый!", "user_from": 13}
- // 3. Указать свое имя
- }
- }).listen(9001, [](auto* listenSocket) { // http://127.0.0.1:9001/
- if (listenSocket) {
- std::cout << "Listening on port " << 9001 << std::endl;
- }
- }).run();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement