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