Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <uwebsockets/App.h>
- #include <nlohmann/json.hpp>
- using namespace std;
- using json = nlohmann::json;
- // [USER 17] =server> {"command":"public_msg", "text":"a"}
- // [SERVER] =everyone> {"command":"public_msg", "text":"a", "user_from": 17}
- void process_public_msg(json parsed_data, auto* ws) {
- auto* udata = ws->getUserData();
- json payload = {
- {"command", "public_msg"},
- {"text", parsed_data["text"]},
- {"user_from", udata->id}
- };
- // App::publish() ?
- ws->publish("public", payload.dump());
- }
- // [USER 17] =server> {"command":"private_msg", "text":"hi", "user_to": 23}
- // [SERVER] =user23> {"command":"private_msg", "text":"hi", "user_from": 17}
- void process_private_msg(json parsed_data, auto* ws) {
- // payload
- // publish ?
- //+ channel!
- // ДЗ!
- }
- // Завтра: set_name, online status
- int main() {
- int latest_user_id = 10; // каждый раз увеличиваем на 1 (++)
- /* ws->getUserData returns one of these */
- struct UserData {
- int id;
- string name;
- };
- // .ws = конфигурация WebSocket сервера
- uWS::App().ws<UserData>("/*", {
- .idleTimeout = 16,
- /* Handlers */
- // Кто-то подключился к серверу
- .open = [&latest_user_id](auto* ws) {
- // Выдать пользователю: id, имя по-умолчанию
- auto* data = ws->getUserData();
- data->id = latest_user_id++;
- data->name = "unnamed";
- cout << "New user connected: " << data->id << endl;
- ws->send("Welcome to SB chat server, v0.1", uWS::OpCode::TEXT);
- ws->subscribe("public");
- ws->subscribe("user" + to_string(data->id)); // личный канал!
- },
- // Кто-то отправил серверу пакет с данными
- .message = [](auto* ws, std::string_view message, uWS::OpCode opCode) {
- json parsed_data = json::parse(message);
- if (parsed_data["command"] == "public_msg") {
- process_public_msg(parsed_data, ws);
- }
- //if (parsed_data["command"] == "private_msg") {
- // process_private_msg();
- //}
- },
- // Отключился от сервера
- .close = [](auto*/*ws*/, int /*code*/, std::string_view /*message*/) {
- /* You may access ws->getUserData() here */
- }
- }).listen(9001, [](auto* listen_socket) {
- if (listen_socket) {
- std::cout << "Listening on port " << 9001 << std::endl;
- }
- }).run();
- }
- // 1. Отправка публичных сообщений (всем)
- // {"command":"public_msg", "text":"Всем приветы в этом чате"}
- // 2. Отправка приватных сообщений
- // {"command":"private_msg", "text":"Тебе лично привет", "user_id": 15}
- //
- //
- //
- // 3. У пользователей будут имена
- // 4. Как узнать кто подключен к серверу?
- // STATUS...
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement