diff options
-rw-r--r-- | CMakeLists.txt | 8 | ||||
-rw-r--r-- | lingo.cpp | 413 |
2 files changed, 232 insertions, 189 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 5f09bbd..38883b5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt | |||
@@ -5,21 +5,21 @@ set(CMAKE_BUILD_TYPE Debug) | |||
5 | 5 | ||
6 | find_package(PkgConfig) | 6 | find_package(PkgConfig) |
7 | pkg_check_modules(yaml-cpp yaml-cpp REQUIRED) | 7 | pkg_check_modules(yaml-cpp yaml-cpp REQUIRED) |
8 | pkg_check_modules(mastodonpp mastodonpp REQUIRED) | 8 | pkg_check_modules(dpp dpp REQUIRED) |
9 | 9 | ||
10 | add_subdirectory(vendor/verbly) | 10 | add_subdirectory(vendor/verbly) |
11 | 11 | ||
12 | include_directories( | 12 | include_directories( |
13 | ${mastodonpp_INCLUDE_DIRS} | 13 | ${dpp_INCLUDE_DIRS} |
14 | vendor/verbly/lib | 14 | vendor/verbly/lib |
15 | ${yaml-cpp_INCLUDE_DIRS} | 15 | ${yaml-cpp_INCLUDE_DIRS} |
16 | vendor/json) | 16 | vendor/json) |
17 | 17 | ||
18 | link_directories( | 18 | link_directories( |
19 | ${mastodonpp_LIBRARY_DIRS} | 19 | ${dpp_LIBRARY_DIRS} |
20 | ${yaml-cpp_LIBRARY_DIRS}) | 20 | ${yaml-cpp_LIBRARY_DIRS}) |
21 | 21 | ||
22 | add_executable(lingo lingo.cpp) | 22 | add_executable(lingo lingo.cpp) |
23 | set_property(TARGET lingo PROPERTY CXX_STANDARD 17) | 23 | set_property(TARGET lingo PROPERTY CXX_STANDARD 17) |
24 | set_property(TARGET lingo PROPERTY CXX_STANDARD_REQUIRED ON) | 24 | set_property(TARGET lingo PROPERTY CXX_STANDARD_REQUIRED ON) |
25 | target_link_libraries(lingo verbly ${mastodonpp_LIBRARIES} ${yaml-cpp_LIBRARIES}) | 25 | target_link_libraries(lingo verbly ${dpp_LIBRARIES} ${yaml-cpp_LIBRARIES}) |
diff --git a/lingo.cpp b/lingo.cpp index b549804..b417ffb 100644 --- a/lingo.cpp +++ b/lingo.cpp | |||
@@ -1,8 +1,9 @@ | |||
1 | #include <mastodonpp/mastodonpp.hpp> | 1 | #include <dpp/dpp.h> |
2 | #include <random> | 2 | #include <random> |
3 | #include <yaml-cpp/yaml.h> | 3 | #include <yaml-cpp/yaml.h> |
4 | #include <iostream> | 4 | #include <iostream> |
5 | #include <thread> | 5 | #include <thread> |
6 | #include <mutex> | ||
6 | #include <chrono> | 7 | #include <chrono> |
7 | #include <string> | 8 | #include <string> |
8 | #include <algorithm> | 9 | #include <algorithm> |
@@ -54,12 +55,34 @@ int main(int argc, char** argv) | |||
54 | std::string configfile(argv[1]); | 55 | std::string configfile(argv[1]); |
55 | YAML::Node config = YAML::LoadFile(configfile); | 56 | YAML::Node config = YAML::LoadFile(configfile); |
56 | 57 | ||
57 | verbly::database database(config["verbly_datafile"].as<std::string>()); | 58 | std::map<uint64_t, std::string> answer_by_message; |
59 | std::mutex answers_mutex; | ||
60 | |||
61 | dpp::cluster bot(config["discord_token"].as<std::string>()); | ||
62 | bot.on_message_create([&bot, &answers_mutex, &answer_by_message](const dpp::message_create_t& event) { | ||
63 | std::lock_guard answer_lock(answers_mutex); | ||
64 | if (answer_by_message.count(event.msg.message_reference.message_id)) | ||
65 | { | ||
66 | std::string canonical_answer = hatkirby::lowercase(answer_by_message[event.msg.message_reference.message_id]); | ||
67 | std::string canonical_attempt = hatkirby::lowercase(event.msg.content); | ||
68 | while (canonical_attempt.find("||") != std::string::npos) | ||
69 | { | ||
70 | canonical_attempt.erase(canonical_attempt.find("||"), 2); | ||
71 | } | ||
72 | |||
73 | if (canonical_attempt == canonical_answer) | ||
74 | { | ||
75 | bot.message_add_reaction(event.msg.id, event.msg.channel_id, "✅"); | ||
76 | } else { | ||
77 | bot.message_add_reaction(event.msg.id, event.msg.channel_id, "❌"); | ||
78 | } | ||
79 | } | ||
80 | }); | ||
81 | bot.start(); | ||
58 | 82 | ||
59 | /*mastodonpp::Instance instance{ | 83 | dpp::snowflake channel(config["discord_channel"].as<uint64_t>()); |
60 | config["mastodon_instance"].as<std::string>(), | 84 | |
61 | config["mastodon_token"].as<std::string>()}; | 85 | verbly::database database(config["verbly_datafile"].as<std::string>()); |
62 | mastodonpp::Connection connection{instance};*/ | ||
63 | 86 | ||
64 | std::set<std::tuple<Height, Colour>> filters = { | 87 | std::set<std::tuple<Height, Colour>> filters = { |
65 | {kTop, kPurple}, | 88 | {kTop, kPurple}, |
@@ -85,161 +108,42 @@ int main(int argc, char** argv) | |||
85 | 108 | ||
86 | for (;;) | 109 | for (;;) |
87 | { | 110 | { |
88 | bool puzzleEmpty = true; | 111 | try |
89 | std::array<std::optional<Colour>, kHeightCount> parts; | 112 | { |
90 | for (int height = 0; height < static_cast<int>(kHeightCount); height++) { | 113 | int hints = 0; |
91 | if (std::bernoulli_distribution(0.5)(rng)) { | 114 | std::array<std::optional<Colour>, kHeightCount> parts; |
92 | int colour = std::uniform_int_distribution<int>(0, static_cast<int>(kColourCount)-1)(rng); | 115 | for (int height = 0; height < static_cast<int>(kHeightCount); height++) { |
93 | if (filters.count({static_cast<Height>(height), static_cast<Colour>(colour)})) { | 116 | if (std::bernoulli_distribution(0.5)(rng)) { |
94 | parts[static_cast<Height>(height)] = static_cast<Colour>(colour); | 117 | int colour = std::uniform_int_distribution<int>(0, static_cast<int>(kColourCount)-1)(rng); |
95 | puzzleEmpty = false; | 118 | if (filters.count({static_cast<Height>(height), static_cast<Colour>(colour)})) { |
119 | parts[static_cast<Height>(height)] = static_cast<Colour>(colour); | ||
120 | hints++; | ||
121 | } | ||
96 | } | 122 | } |
97 | } | 123 | } |
98 | } | ||
99 | 124 | ||
100 | if (puzzleEmpty) { | 125 | if (hints < 2) { |
101 | continue; | ||
102 | } | ||
103 | |||
104 | verbly::filter forwardFilter = cleanFilter && (verbly::form::proper == false); | ||
105 | for (int i=0; i<static_cast<int>(kHeightCount); i++) { | ||
106 | Height height = static_cast<Height>(i); | ||
107 | std::optional<Colour>& colour = parts[i]; | ||
108 | if (!colour.has_value()) { | ||
109 | continue; | 126 | continue; |
110 | } | 127 | } |
111 | switch (*colour) { | ||
112 | case kWhite: { | ||
113 | switch (height) { | ||
114 | case kBottom: { | ||
115 | forwardFilter &= (verbly::word::synonyms %= wordFilter); | ||
116 | break; | ||
117 | } | ||
118 | case kTop: { | ||
119 | forwardFilter &= (verbly::form::pronunciations %= | ||
120 | verbly::filter("homophones", false, | ||
121 | (verbly::pronunciation::forms %= (wordFilter && verbly::filter( | ||
122 | verbly::form::id, | ||
123 | verbly::filter::comparison::field_does_not_equal, | ||
124 | verbly::form::id))))); | ||
125 | break; | ||
126 | } | ||
127 | default: break; // Not supposed yet. | ||
128 | } | ||
129 | break; | ||
130 | } | ||
131 | case kBlack: { | ||
132 | switch (height) { | ||
133 | case kBottom: { | ||
134 | forwardFilter &= (verbly::word::antonyms %= wordFilter); | ||
135 | break; | ||
136 | } | ||
137 | default: break; // Not supposed yet. | ||
138 | } | ||
139 | break; | ||
140 | } | ||
141 | case kBrown: { | ||
142 | switch (height) { | ||
143 | case kBottom: { | ||
144 | forwardFilter &= (verbly::notion::causes %= wordFilter); | ||
145 | break; | ||
146 | } | ||
147 | default: break; // Not supposed yet. | ||
148 | } | ||
149 | break; | ||
150 | } | ||
151 | case kRed: { | ||
152 | switch (height) { | ||
153 | case kTop: { | ||
154 | forwardFilter &= (verbly::pronunciation::holophones %= wordFilter); | ||
155 | break; | ||
156 | } | ||
157 | case kMiddle: { | ||
158 | forwardFilter &= (verbly::form::holographs %= wordFilter); | ||
159 | break; | ||
160 | } | ||
161 | case kBottom: { | ||
162 | forwardFilter &= (verbly::notion::partMeronyms %= wordFilter); | ||
163 | break; | ||
164 | } | ||
165 | default: break; // Not supposed yet. | ||
166 | } | ||
167 | break; | ||
168 | } | ||
169 | case kBlue: { | ||
170 | switch (height) { | ||
171 | case kTop: { | ||
172 | forwardFilter &= (verbly::pronunciation::merophones %= wordFilter); | ||
173 | break; | ||
174 | } | ||
175 | case kMiddle: { | ||
176 | forwardFilter &= (verbly::form::merographs %= wordFilter); | ||
177 | break; | ||
178 | } | ||
179 | case kBottom: { | ||
180 | forwardFilter &= (verbly::notion::partHolonyms %= wordFilter); | ||
181 | break; | ||
182 | } | ||
183 | default: break; // Not supposed yet. | ||
184 | } | ||
185 | break; | ||
186 | } | ||
187 | case kPurple: { | ||
188 | switch (height) { | ||
189 | case kMiddle: { | ||
190 | forwardFilter &= (verbly::form::merographs %= (verbly::form::length >= 4 && (verbly::form::holographs %= wordFilter))); | ||
191 | break; | ||
192 | } | ||
193 | case kTop: { | ||
194 | forwardFilter &= (verbly::pronunciation::rhymes %= wordFilter); | ||
195 | break; | ||
196 | } | ||
197 | default: break; // Not supposed yet. | ||
198 | } | ||
199 | break; | ||
200 | } | ||
201 | case kYellow: { | ||
202 | switch (height) { | ||
203 | case kTop: { | ||
204 | forwardFilter &= (verbly::pronunciation::anaphones %= (wordFilter && verbly::filter( | ||
205 | verbly::pronunciation::id, | ||
206 | verbly::filter::comparison::field_does_not_equal, | ||
207 | verbly::pronunciation::id))); | ||
208 | break; | ||
209 | } | ||
210 | case kMiddle: { | ||
211 | forwardFilter &= (verbly::form::anagrams %= (wordFilter && verbly::filter( | ||
212 | verbly::form::id, | ||
213 | verbly::filter::comparison::field_does_not_equal, | ||
214 | verbly::form::id))); | ||
215 | break; | ||
216 | } | ||
217 | default: break; // Not supposed yet. | ||
218 | } | ||
219 | break; | ||
220 | } | ||
221 | default: break; // Not supposed yet. | ||
222 | } | ||
223 | } | ||
224 | 128 | ||
225 | verbly::form solution = database.forms(forwardFilter).first(); | 129 | verbly::filter forwardFilter = cleanFilter && (verbly::form::proper == false); |
226 | 130 | for (int i=0; i<static_cast<int>(kHeightCount); i++) { | |
227 | for (int i=0; i<static_cast<int>(kHeightCount); i++) { | 131 | Height height = static_cast<Height>(i); |
228 | Height height = static_cast<Height>(i); | 132 | std::optional<Colour>& colour = parts[i]; |
229 | std::optional<Colour>& colour = parts[i]; | 133 | if (!colour.has_value()) { |
230 | if (colour.has_value()) { | 134 | continue; |
231 | verbly::filter questionFilter; | 135 | } |
232 | switch (*colour) { | 136 | switch (*colour) { |
233 | case kWhite: { | 137 | case kWhite: { |
234 | switch (height) { | 138 | switch (height) { |
235 | case kBottom: { | 139 | case kBottom: { |
236 | questionFilter = (verbly::word::synonyms %= solution); | 140 | forwardFilter &= (verbly::word::synonyms %= wordFilter); |
237 | break; | 141 | break; |
238 | } | 142 | } |
239 | case kTop: { | 143 | case kTop: { |
240 | questionFilter = (verbly::form::pronunciations %= | 144 | forwardFilter &= (verbly::form::pronunciations %= |
241 | verbly::filter("homophones", false, | 145 | verbly::filter("homophones", false, |
242 | (verbly::pronunciation::forms %= ((verbly::filter)solution && verbly::filter( | 146 | (verbly::pronunciation::forms %= (wordFilter && verbly::filter( |
243 | verbly::form::id, | 147 | verbly::form::id, |
244 | verbly::filter::comparison::field_does_not_equal, | 148 | verbly::filter::comparison::field_does_not_equal, |
245 | verbly::form::id))))); | 149 | verbly::form::id))))); |
@@ -252,7 +156,7 @@ int main(int argc, char** argv) | |||
252 | case kBlack: { | 156 | case kBlack: { |
253 | switch (height) { | 157 | switch (height) { |
254 | case kBottom: { | 158 | case kBottom: { |
255 | questionFilter = (verbly::word::antonyms %= solution); | 159 | forwardFilter &= (verbly::word::antonyms %= wordFilter); |
256 | break; | 160 | break; |
257 | } | 161 | } |
258 | default: break; // Not supposed yet. | 162 | default: break; // Not supposed yet. |
@@ -262,51 +166,43 @@ int main(int argc, char** argv) | |||
262 | case kBrown: { | 166 | case kBrown: { |
263 | switch (height) { | 167 | switch (height) { |
264 | case kBottom: { | 168 | case kBottom: { |
265 | questionFilter = (verbly::notion::effects %= solution); | 169 | forwardFilter &= (verbly::notion::causes %= wordFilter); |
266 | break; | 170 | break; |
267 | } | 171 | } |
268 | default: break; // Not supposed yet. | 172 | default: break; // Not supposed yet. |
269 | } | 173 | } |
270 | break; | 174 | break; |
271 | } | 175 | } |
272 | case kBlue: { | 176 | case kRed: { |
273 | switch (height) { | 177 | switch (height) { |
274 | case kTop: { | 178 | case kTop: { |
275 | questionFilter = (verbly::pronunciation::holophones %= solution); | 179 | forwardFilter &= (verbly::pronunciation::holophones %= wordFilter); |
276 | break; | 180 | break; |
277 | } | 181 | } |
278 | case kMiddle: { | 182 | case kMiddle: { |
279 | questionFilter = (verbly::form::holographs %= solution); | 183 | forwardFilter &= (verbly::form::holographs %= wordFilter); |
280 | break; | 184 | break; |
281 | } | 185 | } |
282 | case kBottom: { | 186 | case kBottom: { |
283 | /*questionFilter = ((verbly::notion::fullMemberHolonyms %= solution) | 187 | forwardFilter &= (verbly::notion::partMeronyms %= wordFilter); |
284 | || (verbly::notion::fullPartHolonyms %= solution) | ||
285 | || (verbly::notion::fullSubstanceHolonyms %= solution));*/ | ||
286 | //questionFilter &= !(verbly::notion::words %= solution); | ||
287 | questionFilter = (verbly::notion::partMeronyms %= solution); | ||
288 | break; | 188 | break; |
289 | } | 189 | } |
290 | default: break; // Not supposed yet. | 190 | default: break; // Not supposed yet. |
291 | } | 191 | } |
292 | break; | 192 | break; |
293 | } | 193 | } |
294 | case kRed: { | 194 | case kBlue: { |
295 | switch (height) { | 195 | switch (height) { |
296 | case kTop: { | 196 | case kTop: { |
297 | questionFilter = (verbly::pronunciation::merophones %= solution); | 197 | forwardFilter &= (verbly::pronunciation::merophones %= wordFilter); |
298 | break; | 198 | break; |
299 | } | 199 | } |
300 | case kMiddle: { | 200 | case kMiddle: { |
301 | questionFilter = (verbly::form::merographs %= solution); | 201 | forwardFilter &= (verbly::form::merographs %= wordFilter); |
302 | break; | 202 | break; |
303 | } | 203 | } |
304 | case kBottom: { | 204 | case kBottom: { |
305 | /*questionFilter = ((verbly::notion::fullMemberMeronyms %= solution) | 205 | forwardFilter &= (verbly::notion::partHolonyms %= wordFilter); |
306 | || (verbly::notion::fullPartMeronyms %= solution) | ||
307 | || (verbly::notion::fullSubstanceMeronyms %= solution));*/ | ||
308 | questionFilter = (verbly::notion::partHolonyms %= solution); | ||
309 | //questionFilter &= !(verbly::notion::words %= solution); | ||
310 | break; | 206 | break; |
311 | } | 207 | } |
312 | default: break; // Not supposed yet. | 208 | default: break; // Not supposed yet. |
@@ -315,12 +211,12 @@ int main(int argc, char** argv) | |||
315 | } | 211 | } |
316 | case kPurple: { | 212 | case kPurple: { |
317 | switch (height) { | 213 | switch (height) { |
318 | case kTop: { | 214 | case kMiddle: { |
319 | questionFilter = (verbly::pronunciation::rhymes %= solution); | 215 | forwardFilter &= (verbly::form::merographs %= (verbly::form::length >= 4 && (verbly::form::holographs %= wordFilter))); |
320 | break; | 216 | break; |
321 | } | 217 | } |
322 | case kMiddle: { | 218 | case kTop: { |
323 | questionFilter = (verbly::form::merographs %= (verbly::form::length >= 4 && (verbly::form::holographs %= solution))); | 219 | forwardFilter &= (verbly::pronunciation::rhymes %= wordFilter); |
324 | break; | 220 | break; |
325 | } | 221 | } |
326 | default: break; // Not supposed yet. | 222 | default: break; // Not supposed yet. |
@@ -330,17 +226,17 @@ int main(int argc, char** argv) | |||
330 | case kYellow: { | 226 | case kYellow: { |
331 | switch (height) { | 227 | switch (height) { |
332 | case kTop: { | 228 | case kTop: { |
333 | questionFilter = (verbly::pronunciation::anaphones %= ((verbly::filter)solution && verbly::filter( | 229 | forwardFilter &= (verbly::pronunciation::anaphones %= (wordFilter && verbly::filter( |
334 | verbly::pronunciation::id, | 230 | verbly::pronunciation::id, |
335 | verbly::filter::comparison::field_does_not_equal, | 231 | verbly::filter::comparison::field_does_not_equal, |
336 | verbly::pronunciation::id))); | 232 | verbly::pronunciation::id))); |
337 | break; | 233 | break; |
338 | } | 234 | } |
339 | case kMiddle: { | 235 | case kMiddle: { |
340 | questionFilter = (verbly::form::anagrams %= ((verbly::filter)solution && verbly::filter( | 236 | forwardFilter &= (verbly::form::anagrams %= (wordFilter && verbly::filter( |
341 | verbly::form::id, | 237 | verbly::form::id, |
342 | verbly::filter::comparison::field_does_not_equal, | 238 | verbly::filter::comparison::field_does_not_equal, |
343 | verbly::form::id))); | 239 | verbly::form::id))); |
344 | break; | 240 | break; |
345 | } | 241 | } |
346 | default: break; // Not supposed yet. | 242 | default: break; // Not supposed yet. |
@@ -349,16 +245,163 @@ int main(int argc, char** argv) | |||
349 | } | 245 | } |
350 | default: break; // Not supposed yet. | 246 | default: break; // Not supposed yet. |
351 | } | 247 | } |
352 | verbly::form questionPart = database.forms(questionFilter && cleanFilter).first(); | ||
353 | std::cout << COLOUR_EMOJIS[*colour] << " " << questionPart.getText() << std::endl; | ||
354 | } else { | ||
355 | std::cout << "▪️" << std::endl; | ||
356 | } | 248 | } |
357 | } | ||
358 | std::cout << "(" << solution.getText().size() << ")" << std::endl << std::endl << solution.getText() << std::endl; | ||
359 | 249 | ||
250 | verbly::form solution = database.forms(forwardFilter).first(); | ||
251 | |||
252 | std::ostringstream msg_stream; | ||
253 | for (int i=0; i<static_cast<int>(kHeightCount); i++) { | ||
254 | Height height = static_cast<Height>(i); | ||
255 | std::optional<Colour>& colour = parts[i]; | ||
256 | if (colour.has_value()) { | ||
257 | verbly::filter questionFilter; | ||
258 | switch (*colour) { | ||
259 | case kWhite: { | ||
260 | switch (height) { | ||
261 | case kBottom: { | ||
262 | questionFilter = (verbly::word::synonyms %= solution); | ||
263 | break; | ||
264 | } | ||
265 | case kTop: { | ||
266 | questionFilter = (verbly::form::pronunciations %= | ||
267 | verbly::filter("homophones", false, | ||
268 | (verbly::pronunciation::forms %= ((verbly::filter)solution && verbly::filter( | ||
269 | verbly::form::id, | ||
270 | verbly::filter::comparison::field_does_not_equal, | ||
271 | verbly::form::id))))); | ||
272 | break; | ||
273 | } | ||
274 | default: break; // Not supposed yet. | ||
275 | } | ||
276 | break; | ||
277 | } | ||
278 | case kBlack: { | ||
279 | switch (height) { | ||
280 | case kBottom: { | ||
281 | questionFilter = (verbly::word::antonyms %= solution); | ||
282 | break; | ||
283 | } | ||
284 | default: break; // Not supposed yet. | ||
285 | } | ||
286 | break; | ||
287 | } | ||
288 | case kBrown: { | ||
289 | switch (height) { | ||
290 | case kBottom: { | ||
291 | questionFilter = (verbly::notion::effects %= solution); | ||
292 | break; | ||
293 | } | ||
294 | default: break; // Not supposed yet. | ||
295 | } | ||
296 | break; | ||
297 | } | ||
298 | case kBlue: { | ||
299 | switch (height) { | ||
300 | case kTop: { | ||
301 | questionFilter = (verbly::pronunciation::holophones %= solution); | ||
302 | break; | ||
303 | } | ||
304 | case kMiddle: { | ||
305 | questionFilter = (verbly::form::holographs %= solution); | ||
306 | break; | ||
307 | } | ||
308 | case kBottom: { | ||
309 | /*questionFilter = ((verbly::notion::fullMemberHolonyms %= solution) | ||
310 | || (verbly::notion::fullPartHolonyms %= solution) | ||
311 | || (verbly::notion::fullSubstanceHolonyms %= solution));*/ | ||
312 | //questionFilter &= !(verbly::notion::words %= solution); | ||
313 | questionFilter = (verbly::notion::partMeronyms %= solution); | ||
314 | break; | ||
315 | } | ||
316 | default: break; // Not supposed yet. | ||
317 | } | ||
318 | break; | ||
319 | } | ||
320 | case kRed: { | ||
321 | switch (height) { | ||
322 | case kTop: { | ||
323 | questionFilter = (verbly::pronunciation::merophones %= solution); | ||
324 | break; | ||
325 | } | ||
326 | case kMiddle: { | ||
327 | questionFilter = (verbly::form::merographs %= solution); | ||
328 | break; | ||
329 | } | ||
330 | case kBottom: { | ||
331 | /*questionFilter = ((verbly::notion::fullMemberMeronyms %= solution) | ||
332 | || (verbly::notion::fullPartMeronyms %= solution) | ||
333 | || (verbly::notion::fullSubstanceMeronyms %= solution));*/ | ||
334 | questionFilter = (verbly::notion::partHolonyms %= solution); | ||
335 | //questionFilter &= !(verbly::notion::words %= solution); | ||
336 | break; | ||
337 | } | ||
338 | default: break; // Not supposed yet. | ||
339 | } | ||
340 | break; | ||
341 | } | ||
342 | case kPurple: { | ||
343 | switch (height) { | ||
344 | case kTop: { | ||
345 | questionFilter = (verbly::pronunciation::rhymes %= solution); | ||
346 | break; | ||
347 | } | ||
348 | case kMiddle: { | ||
349 | questionFilter = (verbly::form::merographs %= (verbly::form::length >= 4 && (verbly::form::holographs %= solution))); | ||
350 | break; | ||
351 | } | ||
352 | default: break; // Not supposed yet. | ||
353 | } | ||
354 | break; | ||
355 | } | ||
356 | case kYellow: { | ||
357 | switch (height) { | ||
358 | case kTop: { | ||
359 | questionFilter = (verbly::pronunciation::anaphones %= ((verbly::filter)solution && verbly::filter( | ||
360 | verbly::pronunciation::id, | ||
361 | verbly::filter::comparison::field_does_not_equal, | ||
362 | verbly::pronunciation::id))); | ||
363 | break; | ||
364 | } | ||
365 | case kMiddle: { | ||
366 | questionFilter = (verbly::form::anagrams %= ((verbly::filter)solution && verbly::filter( | ||
367 | verbly::form::id, | ||
368 | verbly::filter::comparison::field_does_not_equal, | ||
369 | verbly::form::id))); | ||
370 | break; | ||
371 | } | ||
372 | default: break; // Not supposed yet. | ||
373 | } | ||
374 | break; | ||
375 | } | ||
376 | default: break; // Not supposed yet. | ||
377 | } | ||
378 | verbly::form questionPart = database.forms(questionFilter && cleanFilter).first(); | ||
379 | msg_stream << COLOUR_EMOJIS[*colour] << " " << questionPart.getText() << std::endl; | ||
380 | } else { | ||
381 | msg_stream << "▪️" << std::endl; | ||
382 | } | ||
383 | } | ||
384 | msg_stream << "(" << solution.getText().size() << ")"; | ||
385 | |||
386 | std::string message_text = msg_stream.str(); | ||
387 | std::cout << message_text << std::endl << std::endl << solution.getText() << std::endl; | ||
388 | |||
389 | dpp::message message(channel, message_text); | ||
390 | bot.message_create(message, [&answers_mutex, &answer_by_message, &solution](const dpp::confirmation_callback_t& userdata) { | ||
391 | const auto& posted_msg = std::get<dpp::message>(userdata.value); | ||
392 | std::lock_guard answer_lock(answers_mutex); | ||
393 | if (answer_by_message.size() > 3000) | ||
394 | { | ||
395 | answer_by_message.clear(); | ||
396 | } | ||
397 | answer_by_message[posted_msg.id] = solution.getText(); | ||
398 | }); | ||
399 | |||
400 | std::this_thread::sleep_for(std::chrono::hours(3)); | ||
401 | } catch (const std::exception& ex) { | ||
402 | std::cout << ex.what() << std::endl; | ||
403 | } | ||
360 | 404 | ||
361 | // We can poll the timeline at most once every five minutes. | 405 | std::this_thread::sleep_for(std::chrono::minutes(1)); |
362 | std::this_thread::sleep_for(std::chrono::hours(3)); | ||
363 | } | 406 | } |
364 | } | 407 | } |