]> gitweb.ps.run Git - autorec/blob - src/ws.h
4bebc1fb22bb0481f33a27a0a0d3bc68dc76e01e
[autorec] / src / ws.h
1 #include "mongoose.h"\r
2 \r
3 #include "json.hpp"\r
4 using json = nlohmann::json;\r
5 \r
6 #include <string>\r
7 #include <functional>\r
8 \r
9 namespace ws\r
10 {\r
11   mg_mgr mgr;\r
12   mg_connection *c = nullptr;\r
13 \r
14   bool done = false;\r
15 \r
16   std::function<void()> onConnect;\r
17 \r
18   static void cb(struct mg_connection *c, int ev, void *ev_data, void *fn_data) {\r
19     if (ev == MG_EV_WS_OPEN) {\r
20       puts("Open");\r
21     } else if (ev == MG_EV_WS_MSG) {\r
22       struct mg_ws_message *wm = (struct mg_ws_message *) ev_data;\r
23       printf("Msg: %.*s\n", (int)wm->data.len, wm->data.ptr);\r
24       std::string jsonStr(wm->data.ptr, wm->data.len);\r
25       auto msg = json::parse(jsonStr);\r
26       int op = msg["op"].get<int>();\r
27       \r
28       if (op == 0) {\r
29         json response = {\r
30           {"op", 1},\r
31           {"d", {\r
32             {"rpcVersion", 1},\r
33           }}\r
34         };\r
35         auto responseStr = response.dump();\r
36         mg_ws_send(c, responseStr.c_str(), responseStr.size(), WEBSOCKET_OP_TEXT);\r
37       }\r
38       else if (op == 2)\r
39       {\r
40         puts("Connected");\r
41         if (onConnect)\r
42           onConnect();\r
43       }\r
44     }\r
45 \r
46     if (ev == MG_EV_ERROR) {\r
47       printf("Error: %s\n", (char*)ev_data);\r
48       done = true;\r
49     }\r
50     if (ev == MG_EV_CLOSE) {\r
51       puts("Close");\r
52       done = true;\r
53     }\r
54   }\r
55 \r
56   void init()\r
57   {\r
58     mg_mgr_init(&mgr);\r
59   }\r
60 \r
61   void connect(std::string address)\r
62   {\r
63     c = mg_ws_connect(&mgr, address.c_str(), cb, nullptr, nullptr);\r
64   }\r
65 \r
66   void update()\r
67   {\r
68     if (c && !done)\r
69       mg_mgr_poll(&mgr, 10);\r
70   }\r
71 \r
72   void sendRequest(std::string requestType)\r
73   {\r
74     json request = { { "op", 6 },\r
75                       { "d",\r
76                         {\r
77                           { "requestType", requestType },\r
78                           { "requestId", std::to_string(time(nullptr)).c_str() }\r
79                         } } };\r
80     auto requestStr = request.dump();\r
81     mg_ws_send(c, requestStr.c_str(), requestStr.size(), WEBSOCKET_OP_TEXT);\r
82   }\r
83 }