diff options
Diffstat (limited to 'server_main.cpp')
-rw-r--r-- | server_main.cpp | 94 |
1 files changed, 15 insertions, 79 deletions
diff --git a/server_main.cpp b/server_main.cpp index 145f8a2..00a4e7a 100644 --- a/server_main.cpp +++ b/server_main.cpp | |||
@@ -12,7 +12,6 @@ | |||
12 | #include <websocketpp/server.hpp> | 12 | #include <websocketpp/server.hpp> |
13 | 13 | ||
14 | #include "cardset.h" | 14 | #include "cardset.h" |
15 | #include "database.h" | ||
16 | #include "imagestore.h" | 15 | #include "imagestore.h" |
17 | #include "wizard.h" | 16 | #include "wizard.h" |
18 | 17 | ||
@@ -67,8 +66,6 @@ class server { | |||
67 | std::string cmd = msgJson["cmd"]; | 66 | std::string cmd = msgJson["cmd"]; |
68 | if (cmd == "generate") { | 67 | if (cmd == "generate") { |
69 | cmd_generate(connection, msgJson["text"]); | 68 | cmd_generate(connection, msgJson["text"]); |
70 | } else if (cmd == "check") { | ||
71 | cmd_check(connection, msgJson["token"]); | ||
72 | } else { | 69 | } else { |
73 | std::string response = R"( | 70 | std::string response = R"( |
74 | { | 71 | { |
@@ -84,71 +81,11 @@ class server { | |||
84 | } | 81 | } |
85 | 82 | ||
86 | void cmd_generate(websocketpp::connection_hdl connection, std::string text) { | 83 | void cmd_generate(websocketpp::connection_hdl connection, std::string text) { |
87 | std::string token; | 84 | asio::post(std::bind(&server::generate_thread, this, connection, text)); |
88 | |||
89 | { | ||
90 | std::lock_guard rng_guard(rng_mutex_); | ||
91 | token = database_.create(rng_); | ||
92 | } | ||
93 | |||
94 | nlohmann::json tokenMsg; | ||
95 | tokenMsg["type"] = "token"; | ||
96 | tokenMsg["token"] = token; | ||
97 | socket_.send(connection, tokenMsg.dump(), | ||
98 | websocketpp::frame::opcode::value::TEXT); | ||
99 | |||
100 | database_.subscribe(token, [this, connection](const std::string& msg) { | ||
101 | socket_.send(connection, msg, websocketpp::frame::opcode::value::TEXT); | ||
102 | }); | ||
103 | |||
104 | asio::post(std::bind(&server::generate_thread, this, token, text)); | ||
105 | } | 85 | } |
106 | 86 | ||
107 | void cmd_check(websocketpp::connection_hdl connection, std::string token) { | 87 | void generate_thread(websocketpp::connection_hdl connection, |
108 | bool failed = false; | 88 | std::string text) { |
109 | |||
110 | try { | ||
111 | database_.subscribe(token, [this, connection](const std::string& msg) { | ||
112 | socket_.send(connection, msg, websocketpp::frame::opcode::value::TEXT); | ||
113 | }); | ||
114 | |||
115 | if (!database_.is_done(token)) { | ||
116 | return; | ||
117 | } | ||
118 | |||
119 | std::string result = database_.getResult(token); | ||
120 | nlohmann::json resultMsg; | ||
121 | if (result.empty()) { | ||
122 | resultMsg["type"] = "error"; | ||
123 | resultMsg["msg"] = "Unknown error occurred."; | ||
124 | } else { | ||
125 | resultMsg["type"] = "result"; | ||
126 | resultMsg["image"] = database_.getResult(token); | ||
127 | resultMsg["msg"] = "Success!"; | ||
128 | } | ||
129 | |||
130 | socket_.send(connection, resultMsg.dump(), | ||
131 | websocketpp::frame::opcode::value::TEXT); | ||
132 | } catch (const std::exception& ex) { | ||
133 | failed = true; | ||
134 | } | ||
135 | |||
136 | if (failed) { | ||
137 | try { | ||
138 | socket_.send(connection, R"( | ||
139 | { | ||
140 | "type": "error", | ||
141 | "msg": "Error retrieving request." | ||
142 | })", | ||
143 | websocketpp::frame::opcode::value::TEXT); | ||
144 | } catch (const std::exception& ex) { | ||
145 | // Well, okay | ||
146 | std::cout << ex.what() << std::endl; | ||
147 | } | ||
148 | } | ||
149 | } | ||
150 | |||
151 | void generate_thread(std::string token, std::string text) { | ||
152 | std::unique_ptr<wizard> generator; | 89 | std::unique_ptr<wizard> generator; |
153 | 90 | ||
154 | { | 91 | { |
@@ -157,13 +94,15 @@ class server { | |||
157 | } | 94 | } |
158 | 95 | ||
159 | try { | 96 | try { |
160 | generator->set_status_callback([this, token](const std::string& status) { | 97 | generator->set_status_callback( |
161 | nlohmann::json msg; | 98 | [this, connection](const std::string& status) { |
162 | msg["type"] = "status"; | 99 | nlohmann::json msg; |
163 | msg["msg"] = status; | 100 | msg["type"] = "status"; |
101 | msg["msg"] = status; | ||
164 | 102 | ||
165 | database_.post(token, msg.dump()); | 103 | socket_.send(connection, msg.dump(), |
166 | }); | 104 | websocketpp::frame::opcode::value::TEXT); |
105 | }); | ||
167 | 106 | ||
168 | Magick::Image resultImage = generator->run(); | 107 | Magick::Image resultImage = generator->run(); |
169 | Magick::Blob resultBlob; | 108 | Magick::Blob resultBlob; |
@@ -173,24 +112,22 @@ class server { | |||
173 | resultBlob.length()); | 112 | resultBlob.length()); |
174 | std::string resultEncoded = base64::to_base64(resultBytes); | 113 | std::string resultEncoded = base64::to_base64(resultBytes); |
175 | 114 | ||
176 | database_.setResult(token, resultEncoded); | ||
177 | |||
178 | nlohmann::json resultMsg; | 115 | nlohmann::json resultMsg; |
179 | resultMsg["type"] = "result"; | 116 | resultMsg["type"] = "result"; |
180 | resultMsg["image"] = resultEncoded; | 117 | resultMsg["image"] = resultEncoded; |
181 | resultMsg["msg"] = "Success!"; | 118 | resultMsg["msg"] = "Success!"; |
182 | 119 | ||
183 | database_.post(token, resultMsg.dump()); | 120 | socket_.send(connection, resultMsg.dump(), |
121 | websocketpp::frame::opcode::value::TEXT); | ||
184 | } catch (const std::exception& ex) { | 122 | } catch (const std::exception& ex) { |
185 | nlohmann::json response; | 123 | nlohmann::json response; |
186 | response["type"] = "error"; | 124 | response["type"] = "error"; |
187 | response["msg"] = | 125 | response["msg"] = |
188 | std::string("Error generating card (") + ex.what() + ")"; | 126 | std::string("Error generating card (") + ex.what() + ")"; |
189 | 127 | ||
190 | database_.post(token, response.dump()); | 128 | socket_.send(connection, response.dump(), |
129 | websocketpp::frame::opcode::value::TEXT); | ||
191 | } | 130 | } |
192 | |||
193 | database_.mark_done(token); | ||
194 | } | 131 | } |
195 | 132 | ||
196 | void cleanup_thread() { | 133 | void cleanup_thread() { |
@@ -207,7 +144,6 @@ class server { | |||
207 | std::mt19937& rng_; | 144 | std::mt19937& rng_; |
208 | 145 | ||
209 | socket_type socket_; | 146 | socket_type socket_; |
210 | database database_; | ||
211 | }; | 147 | }; |
212 | 148 | ||
213 | } // namespace | 149 | } // namespace |