comparison irccd-test/main.cpp @ 773:8c44bbcbbab9

Misc: style, cleanup and update
author David Demelier <markand@malikania.fr>
date Fri, 26 Oct 2018 13:01:00 +0200
parents f25c878d823b
children 7145a3df4cb7
comparison
equal deleted inserted replaced
772:f5ccf65ae929 773:8c44bbcbbab9
27 #include <boost/algorithm/string/trim.hpp> 27 #include <boost/algorithm/string/trim.hpp>
28 #include <boost/filesystem.hpp> 28 #include <boost/filesystem.hpp>
29 #include <boost/format.hpp> 29 #include <boost/format.hpp>
30 30
31 #if defined(IRCCD_HAVE_LIBEDIT) 31 #if defined(IRCCD_HAVE_LIBEDIT)
32 # include <histedit.h> 32 # include <histedit.h>
33 #endif 33 #endif
34 34
35 #include <irccd/options.hpp> 35 #include <irccd/options.hpp>
36 #include <irccd/string_util.hpp> 36 #include <irccd/string_util.hpp>
37 37
41 #include <irccd/daemon/server_service.hpp> 41 #include <irccd/daemon/server_service.hpp>
42 42
43 #include <irccd/test/debug_server.hpp> 43 #include <irccd/test/debug_server.hpp>
44 44
45 #if defined(IRCCD_HAVE_JS) 45 #if defined(IRCCD_HAVE_JS)
46 # include <irccd/js/js_api.hpp> 46 # include <irccd/js/js_api.hpp>
47 # include <irccd/js/js_plugin.hpp> 47 # include <irccd/js/js_plugin.hpp>
48 #endif 48 #endif
49 49
50 using boost::format; 50 using boost::format;
51 using boost::str; 51 using boost::str;
52 52
89 */ 89 */
90 using function = std::function<void (const std::string&)>; 90 using function = std::function<void (const std::string&)>;
91 using functions = std::unordered_map<std::string, function>; 91 using functions = std::unordered_map<std::string, function>;
92 92
93 static const functions list{ 93 static const functions list{
94 { "onCommand", &(on_command) }, 94 { "onCommand", &(on_command) },
95 { "onConnect", &(on_connect) }, 95 { "onConnect", &(on_connect) },
96 { "onInvite", &(on_invite) }, 96 { "onInvite", &(on_invite) },
97 { "onJoin", &(on_join) }, 97 { "onJoin", &(on_join) },
98 { "onKick", &(on_kick) }, 98 { "onKick", &(on_kick) },
99 { "onLoad", &(on_load) }, 99 { "onLoad", &(on_load) },
100 { "onMe", &(on_me) }, 100 { "onMe", &(on_me) },
101 { "onMessage", &(on_message) }, 101 { "onMessage", &(on_message) },
102 { "onMode", &(on_mode) }, 102 { "onMode", &(on_mode) },
103 { "onNames", &(on_names) }, 103 { "onNames", &(on_names) },
104 { "onNick", &(on_nick) }, 104 { "onNick", &(on_nick) },
105 { "onNotice", &(on_notice) }, 105 { "onNotice", &(on_notice) },
106 { "onPart", &(on_part) }, 106 { "onPart", &(on_part) },
107 { "onReload", &(on_reload) }, 107 { "onReload", &(on_reload) },
108 { "onTopic", &(on_topic) }, 108 { "onTopic", &(on_topic) },
109 { "onUnload", &(on_unload) }, 109 { "onUnload", &(on_unload) },
110 { "onWhois", &(on_whois) } 110 { "onWhois", &(on_whois) }
111 }; 111 };
112 112
113 // }}} 113 // }}}
114 114
115 // {{{ usage 115 // {{{ usage
116 116
117 void usage() 117 void usage()
118 { 118 {
119 std::cerr << "usage: irccd-test [-c config] plugin-name" << std::endl; 119 std::cerr << "usage: irccd-test [-c config] plugin-name" << std::endl;
120 std::exit(1); 120 std::exit(1);
121 } 121 }
122 122
123 // }}} 123 // }}}
124 124
125 // {{{ get_server 125 // {{{ get_server
126 126
127 std::shared_ptr<server> get_server(std::string name) 127 auto get_server(std::string name) -> std::shared_ptr<server>
128 { 128 {
129 name = boost::algorithm::trim_copy(name); 129 name = boost::algorithm::trim_copy(name);
130 130
131 if (name.empty()) 131 if (name.empty())
132 name = "test"; 132 name = "test";
133 133
134 auto s = daemon->servers().get(name); 134 auto s = daemon->servers().get(name);
135 135
136 if (!s) { 136 if (!s) {
137 s = std::make_shared<debug_server>(io, std::move(name), "localhost"); 137 s = std::make_shared<debug_server>(io, std::move(name), "localhost");
138 daemon->servers().add(s); 138 daemon->servers().add(s);
139 } 139 }
140 140
141 return s; 141 return s;
142 } 142 }
143 143
144 // }}} 144 // }}}
145 145
146 // {{{ get_arg 146 // {{{ get_arg
147 147
148 std::string get_arg(const std::vector<std::string>& args, unsigned index) 148 auto get_arg(const std::vector<std::string>& args, unsigned index) -> std::string
149 { 149 {
150 if (index >= args.size()) 150 if (index >= args.size())
151 return ""; 151 return "";
152 152
153 return args[index]; 153 return args[index];
154 } 154 }
155 155
156 // }}} 156 // }}}
157 157
158 // {{{ on_command 158 // {{{ on_command
160 /* 160 /*
161 * onCommand server origin channel message 161 * onCommand server origin channel message
162 */ 162 */
163 void on_command(const std::string& data) 163 void on_command(const std::string& data)
164 { 164 {
165 const auto args = su::split(data, " ", 4); 165 const auto args = su::split(data, " ", 4);
166 166
167 plugin->handle_command(*daemon, { 167 plugin->handle_command(*daemon, {
168 get_server(get_arg(args, 0)), 168 get_server(get_arg(args, 0)),
169 get_arg(args, 1), 169 get_arg(args, 1),
170 get_arg(args, 2), 170 get_arg(args, 2),
171 get_arg(args, 3) 171 get_arg(args, 3)
172 }); 172 });
173 } 173 }
174 174
175 // }}} 175 // }}}
176 176
177 // {{{ on_connect 177 // {{{ on_connect
179 /* 179 /*
180 * onConnect server 180 * onConnect server
181 */ 181 */
182 void on_connect(const std::string& data) 182 void on_connect(const std::string& data)
183 { 183 {
184 const auto args = su::split(data, " "); 184 const auto args = su::split(data, " ");
185 185
186 plugin->handle_connect(*daemon, {get_server(get_arg(args, 0))}); 186 plugin->handle_connect(*daemon, {get_server(get_arg(args, 0))});
187 } 187 }
188 188
189 // }}} 189 // }}}
190 190
191 // {{{ on_invite 191 // {{{ on_invite
193 /* 193 /*
194 * onInvite server origin channel target 194 * onInvite server origin channel target
195 */ 195 */
196 void on_invite(const std::string& data) 196 void on_invite(const std::string& data)
197 { 197 {
198 const auto args = su::split(data, " "); 198 const auto args = su::split(data, " ");
199 199
200 plugin->handle_invite(*daemon, { 200 plugin->handle_invite(*daemon, {
201 get_server(get_arg(args, 0)), 201 get_server(get_arg(args, 0)),
202 get_arg(args, 1), 202 get_arg(args, 1),
203 get_arg(args, 2), 203 get_arg(args, 2),
204 get_arg(args, 3), 204 get_arg(args, 3),
205 }); 205 });
206 } 206 }
207 207
208 // }}} 208 // }}}
209 209
210 // {{{ on_join 210 // {{{ on_join
212 /* 212 /*
213 * onJoin server origin channel 213 * onJoin server origin channel
214 */ 214 */
215 void on_join(const std::string& data) 215 void on_join(const std::string& data)
216 { 216 {
217 const auto args = su::split(data, " "); 217 const auto args = su::split(data, " ");
218 218
219 plugin->handle_join(*daemon, { 219 plugin->handle_join(*daemon, {
220 get_server(get_arg(args, 0)), 220 get_server(get_arg(args, 0)),
221 get_arg(args, 1), 221 get_arg(args, 1),
222 get_arg(args, 2) 222 get_arg(args, 2)
223 }); 223 });
224 } 224 }
225 225
226 // }}} 226 // }}}
227 227
228 // {{{ on_kick 228 // {{{ on_kick
230 /* 230 /*
231 * onKick server origin channel reason 231 * onKick server origin channel reason
232 */ 232 */
233 void on_kick(const std::string& data) 233 void on_kick(const std::string& data)
234 { 234 {
235 const auto args = su::split(data, " ", 5); 235 const auto args = su::split(data, " ", 5);
236 236
237 plugin->handle_kick(*daemon, { 237 plugin->handle_kick(*daemon, {
238 get_server(get_arg(args, 0)), 238 get_server(get_arg(args, 0)),
239 get_arg(args, 1), 239 get_arg(args, 1),
240 get_arg(args, 2), 240 get_arg(args, 2),
241 get_arg(args, 3), 241 get_arg(args, 3),
242 get_arg(args, 4), 242 get_arg(args, 4),
243 }); 243 });
244 } 244 }
245 245
246 // }}} 246 // }}}
247 247
248 // {{{ on_load 248 // {{{ on_load
250 /* 250 /*
251 * onLoad 251 * onLoad
252 */ 252 */
253 void on_load(const std::string&) 253 void on_load(const std::string&)
254 { 254 {
255 plugin->handle_load(*daemon); 255 plugin->handle_load(*daemon);
256 } 256 }
257 257
258 // }}} 258 // }}}
259 259
260 // {{{ on_me 260 // {{{ on_me
262 /* 262 /*
263 * onMe server origin channel message 263 * onMe server origin channel message
264 */ 264 */
265 void on_me(const std::string& data) 265 void on_me(const std::string& data)
266 { 266 {
267 const auto args = su::split(data, " ", 4); 267 const auto args = su::split(data, " ", 4);
268 268
269 plugin->handle_me(*daemon, { 269 plugin->handle_me(*daemon, {
270 get_server(get_arg(args, 0)), 270 get_server(get_arg(args, 0)),
271 get_arg(args, 1), 271 get_arg(args, 1),
272 get_arg(args, 2), 272 get_arg(args, 2),
273 get_arg(args, 3) 273 get_arg(args, 3)
274 }); 274 });
275 } 275 }
276 276
277 // }}} 277 // }}}
278 278
279 // {{{ on_message 279 // {{{ on_message
281 /* 281 /*
282 * onMessage server origin channel message 282 * onMessage server origin channel message
283 */ 283 */
284 void on_message(const std::string& data) 284 void on_message(const std::string& data)
285 { 285 {
286 const auto args = su::split(data, " ", 4); 286 const auto args = su::split(data, " ", 4);
287 287
288 plugin->handle_message(*daemon, { 288 plugin->handle_message(*daemon, {
289 get_server(get_arg(args, 0)), 289 get_server(get_arg(args, 0)),
290 get_arg(args, 1), 290 get_arg(args, 1),
291 get_arg(args, 2), 291 get_arg(args, 2),
292 get_arg(args, 3) 292 get_arg(args, 3)
293 }); 293 });
294 } 294 }
295 295
296 // }}} 296 // }}}
297 297
298 // {{{ on_mode 298 // {{{ on_mode
300 /* 300 /*
301 * onMode server origin channel mode limit user mask 301 * onMode server origin channel mode limit user mask
302 */ 302 */
303 void on_mode(const std::string& data) 303 void on_mode(const std::string& data)
304 { 304 {
305 const auto args = su::split(data, " ", 7); 305 const auto args = su::split(data, " ", 7);
306 306
307 plugin->handle_mode(*daemon, { 307 plugin->handle_mode(*daemon, {
308 get_server(get_arg(args, 0)), 308 get_server(get_arg(args, 0)),
309 get_arg(args, 1), 309 get_arg(args, 1),
310 get_arg(args, 2), 310 get_arg(args, 2),
311 get_arg(args, 3), 311 get_arg(args, 3),
312 get_arg(args, 4), 312 get_arg(args, 4),
313 get_arg(args, 5), 313 get_arg(args, 5),
314 get_arg(args, 6), 314 get_arg(args, 6),
315 }); 315 });
316 } 316 }
317 317
318 // }}} 318 // }}}
319 319
320 // {{{ on_names 320 // {{{ on_names
322 /* 322 /*
323 * onNames server channel nick1 nick2 nickN 323 * onNames server channel nick1 nick2 nickN
324 */ 324 */
325 void on_names(const std::string& data) 325 void on_names(const std::string& data)
326 { 326 {
327 const auto args = su::split(data, " "); 327 const auto args = su::split(data, " ");
328 328
329 names_event ev; 329 names_event ev;
330 330
331 ev.server = get_server(get_arg(args, 0)); 331 ev.server = get_server(get_arg(args, 0));
332 ev.channel = get_arg(args, 1); 332 ev.channel = get_arg(args, 1);
333 333
334 if (args.size() >= 3U) 334 if (args.size() >= 3U)
335 ev.names.insert(ev.names.begin(), args.begin() + 2, args.end()); 335 ev.names.insert(ev.names.begin(), args.begin() + 2, args.end());
336 336
337 plugin->handle_names(*daemon, ev); 337 plugin->handle_names(*daemon, ev);
338 } 338 }
339 339
340 // }}} 340 // }}}
341 341
342 // {{{ on_nick 342 // {{{ on_nick
344 /* 344 /*
345 * onNick server origin nickname 345 * onNick server origin nickname
346 */ 346 */
347 void on_nick(const std::string& data) 347 void on_nick(const std::string& data)
348 { 348 {
349 const auto args = su::split(data, " "); 349 const auto args = su::split(data, " ");
350 350
351 plugin->handle_nick(*daemon, { 351 plugin->handle_nick(*daemon, {
352 get_server(get_arg(args, 0)), 352 get_server(get_arg(args, 0)),
353 get_arg(args, 1), 353 get_arg(args, 1),
354 get_arg(args, 2) 354 get_arg(args, 2)
355 }); 355 });
356 } 356 }
357 357
358 // }}} 358 // }}}
359 359
360 // {{{ on_notice 360 // {{{ on_notice
362 /* 362 /*
363 * onNotice server origin channel nickname 363 * onNotice server origin channel nickname
364 */ 364 */
365 void on_notice(const std::string& data) 365 void on_notice(const std::string& data)
366 { 366 {
367 const auto args = su::split(data, " ", 4); 367 const auto args = su::split(data, " ", 4);
368 368
369 plugin->handle_notice(*daemon, { 369 plugin->handle_notice(*daemon, {
370 get_server(get_arg(args, 0)), 370 get_server(get_arg(args, 0)),
371 get_arg(args, 1), 371 get_arg(args, 1),
372 get_arg(args, 2), 372 get_arg(args, 2),
373 get_arg(args, 3) 373 get_arg(args, 3)
374 }); 374 });
375 } 375 }
376 376
377 // }}} 377 // }}}
378 378
379 // {{{ on_part 379 // {{{ on_part
381 /* 381 /*
382 * onPart server origin channel reason 382 * onPart server origin channel reason
383 */ 383 */
384 void on_part(const std::string& data) 384 void on_part(const std::string& data)
385 { 385 {
386 const auto args = su::split(data, " ", 4); 386 const auto args = su::split(data, " ", 4);
387 387
388 plugin->handle_part(*daemon, { 388 plugin->handle_part(*daemon, {
389 get_server(get_arg(args, 0)), 389 get_server(get_arg(args, 0)),
390 get_arg(args, 1), 390 get_arg(args, 1),
391 get_arg(args, 2), 391 get_arg(args, 2),
392 get_arg(args, 3), 392 get_arg(args, 3),
393 }); 393 });
394 } 394 }
395 395
396 // }}} 396 // }}}
397 397
398 // {{{ on_reload 398 // {{{ on_reload
400 /* 400 /*
401 * onReload 401 * onReload
402 */ 402 */
403 void on_reload(const std::string&) 403 void on_reload(const std::string&)
404 { 404 {
405 plugin->handle_reload(*daemon); 405 plugin->handle_reload(*daemon);
406 } 406 }
407 407
408 // }}} 408 // }}}
409 409
410 // {{{ on_topic 410 // {{{ on_topic
412 /* 412 /*
413 * onTopic server origin channel topic 413 * onTopic server origin channel topic
414 */ 414 */
415 void on_topic(const std::string& data) 415 void on_topic(const std::string& data)
416 { 416 {
417 const auto args = su::split(data, " ", 4); 417 const auto args = su::split(data, " ", 4);
418 418
419 plugin->handle_topic(*daemon, { 419 plugin->handle_topic(*daemon, {
420 get_server(get_arg(args, 0)), 420 get_server(get_arg(args, 0)),
421 get_arg(args, 1), 421 get_arg(args, 1),
422 get_arg(args, 2), 422 get_arg(args, 2),
423 get_arg(args, 3) 423 get_arg(args, 3)
424 }); 424 });
425 } 425 }
426 426
427 // }}} 427 // }}}
428 428
429 // {{{ on_unload 429 // {{{ on_unload
431 /* 431 /*
432 * onUnload 432 * onUnload
433 */ 433 */
434 void on_unload(const std::string&) 434 void on_unload(const std::string&)
435 { 435 {
436 plugin->handle_unload(*daemon); 436 plugin->handle_unload(*daemon);
437 } 437 }
438 438
439 // }}} 439 // }}}
440 440
441 // {{{ on_whois 441 // {{{ on_whois
443 /* 443 /*
444 * onWhois server nick user host realname chan1 chan2 chanN 444 * onWhois server nick user host realname chan1 chan2 chanN
445 */ 445 */
446 void on_whois(const std::string& data) 446 void on_whois(const std::string& data)
447 { 447 {
448 const auto args = su::split(data, " "); 448 const auto args = su::split(data, " ");
449 449
450 whois_event ev; 450 whois_event ev;
451 451
452 ev.server = get_server(get_arg(args, 0)); 452 ev.server = get_server(get_arg(args, 0));
453 ev.whois.nick = get_arg(args, 1); 453 ev.whois.nick = get_arg(args, 1);
454 ev.whois.user = get_arg(args, 2); 454 ev.whois.user = get_arg(args, 2);
455 ev.whois.host = get_arg(args, 3); 455 ev.whois.host = get_arg(args, 3);
456 ev.whois.realname = get_arg(args, 4); 456 ev.whois.realname = get_arg(args, 4);
457 457
458 if (args.size() >= 5) 458 if (args.size() >= 5)
459 ev.whois.channels.insert(ev.whois.channels.begin(), args.begin() + 5, args.end()); 459 ev.whois.channels.insert(ev.whois.channels.begin(), args.begin() + 5, args.end());
460 460
461 plugin->handle_whois(*daemon, ev); 461 plugin->handle_whois(*daemon, ev);
462 } 462 }
463 463
464 // }}} 464 // }}}
465 465
466 // {{{ exec 466 // {{{ exec
467 467
468 void exec(const std::string& line) 468 void exec(const std::string& line)
469 { 469 {
470 const auto pos = line.find(' '); 470 const auto pos = line.find(' ');
471 const auto it = list.find(line.substr(0, pos)); 471 const auto it = list.find(line.substr(0, pos));
472 472
473 if (it != list.end()) 473 if (it != list.end())
474 it->second(pos == std::string::npos ? "" : line.substr(pos + 1)); 474 it->second(pos == std::string::npos ? "" : line.substr(pos + 1));
475 } 475 }
476 476
477 // }}} 477 // }}}
478 478
479 #if defined(IRCCD_HAVE_LIBEDIT) 479 #if defined(IRCCD_HAVE_LIBEDIT)
480 480
481 // {{{ prompt (libedit version) 481 // {{{ prompt (libedit version)
482 482
483 const char* prompt(EditLine*) 483 auto prompt(EditLine*) -> const char*
484 { 484 {
485 static const char* text = "> "; 485 static const char* text = "> ";
486 486
487 return text; 487 return text;
488 } 488 }
489 489
490 std::string clean(std::string input) 490 auto clean(std::string input) -> std::string
491 { 491 {
492 while (!input.empty() && (input.back() == '\n' || input.back() == '\r')) 492 while (!input.empty() && (input.back() == '\n' || input.back() == '\r'))
493 input.pop_back(); 493 input.pop_back();
494 494
495 return input; 495 return input;
496 } 496 }
497 497
498 std::vector<std::string> matches(const std::string& name) 498 auto matches(const std::string& name) -> std::vector<std::string>
499 { 499 {
500 std::vector<std::string> result; 500 std::vector<std::string> result;
501 501
502 for (const auto& pair : list) 502 for (const auto& pair : list)
503 if (pair.first.compare(0U, name.size(), name) == 0U) 503 if (pair.first.compare(0U, name.size(), name) == 0U)
504 result.push_back(pair.first); 504 result.push_back(pair.first);
505 505
506 return result; 506 return result;
507 } 507 }
508 508
509 unsigned char complete(EditLine* el, int) 509 auto complete(EditLine* el, int) -> unsigned char
510 { 510 {
511 const auto* lf = el_line(el); 511 const auto* lf = el_line(el);
512 const auto args = su::split(std::string(lf->buffer, lf->cursor), " "); 512 const auto args = su::split(std::string(lf->buffer, lf->cursor), " ");
513 513
514 if (args.size() == 0U) 514 if (args.size() == 0U)
515 return CC_REFRESH; 515 return CC_REFRESH;
516 516
517 const auto found = matches(args[0]); 517 const auto found = matches(args[0]);
518 518
519 if (found.size() != 1U) 519 if (found.size() != 1U)
520 return CC_REFRESH; 520 return CC_REFRESH;
521 521
522 // Insert the missing text, e.g. onCom -> onCommand. 522 // Insert the missing text, e.g. onCom -> onCommand.
523 if (el_insertstr(el, &found[0].c_str()[args[0].size()]) < 0) 523 if (el_insertstr(el, &found[0].c_str()[args[0].size()]) < 0)
524 return CC_ERROR; 524 return CC_ERROR;
525 525
526 return CC_REFRESH; 526 return CC_REFRESH;
527 } 527 }
528 528
529 void run() 529 void run()
530 { 530 {
531 std::unique_ptr<EditLine, void (*)(EditLine*)> el( 531 std::unique_ptr<EditLine, void (*)(EditLine*)> el(
532 el_init("irccd-test", stdin, stdout, stderr), 532 el_init("irccd-test", stdin, stdout, stderr),
533 el_end 533 el_end
534 ); 534 );
535 std::unique_ptr<History, void (*)(History*)> hist( 535 std::unique_ptr<History, void (*)(History*)> hist(
536 history_init(), 536 history_init(),
537 history_end 537 history_end
538 ); 538 );
539 HistEvent hev; 539 HistEvent hev;
540 540
541 history(hist.get(), &hev, H_SETSIZE, 1024); 541 history(hist.get(), &hev, H_SETSIZE, 1024);
542 el_set(el.get(), EL_EDITOR, "emacs"); 542 el_set(el.get(), EL_EDITOR, "emacs");
543 el_set(el.get(), EL_PROMPT, prompt); 543 el_set(el.get(), EL_PROMPT, prompt);
544 el_set(el.get(), EL_HIST, history, hist.get()); 544 el_set(el.get(), EL_HIST, history, hist.get());
545 el_set(el.get(), EL_ADDFN, "ed-complete", "Complete command", complete); 545 el_set(el.get(), EL_ADDFN, "ed-complete", "Complete command", complete);
546 el_set(el.get(), EL_BIND, "^I", "ed-complete", nullptr); 546 el_set(el.get(), EL_BIND, "^I", "ed-complete", nullptr);
547 547
548 const char* s; 548 const char* s;
549 int size; 549 int size;
550 550
551 while ((s = el_gets(el.get(), &size)) && size >= 0) { 551 while ((s = el_gets(el.get(), &size)) && size >= 0) {
552 if (size > 0) 552 if (size > 0)
553 history(hist.get(), &hev, H_ENTER, s); 553 history(hist.get(), &hev, H_ENTER, s);
554 554
555 exec(clean(s)); 555 exec(clean(s));
556 } 556 }
557 } 557 }
558 558
559 // }}} 559 // }}}
560 560
561 #else 561 #else
562 562
563 // {{{ run (standard version) 563 // {{{ run (standard version)
564 564
565 void run() 565 void run()
566 { 566 {
567 std::string line; 567 std::string line;
568 568
569 for (;;) { 569 for (;;) {
570 std::cout << "> "; 570 std::cout << "> ";
571 571
572 if (!std::getline(std::cin, line)) 572 if (!std::getline(std::cin, line))
573 return; 573 return;
574 574
575 exec(line); 575 exec(line);
576 } 576 }
577 } 577 }
578 578
579 // }}} 579 // }}}
580 580
581 #endif 581 #endif
582 582
583 // {{{ load_plugins 583 // {{{ load_plugins
584 584
585 void load_plugins(int argc, char** argv) 585 void load_plugins(int argc, char** argv)
586 { 586 {
587 if (argc <= 0) 587 if (argc <= 0)
588 usage(); 588 usage();
589 589
590 daemon->plugins().load("test", boost::filesystem::exists(argv[0]) ? argv[0] : ""); 590 daemon->plugins().load("test", boost::filesystem::exists(argv[0]) ? argv[0] : "");
591 plugin = daemon->plugins().get("test"); 591 plugin = daemon->plugins().get("test");
592 } 592 }
593 593
594 // }}} 594 // }}}
595 595
596 // {{{ load_config 596 // {{{ load_config
597 597
598 auto load_config(const option::result& result) -> config 598 auto load_config(const option::result& result) -> config
599 { 599 {
600 auto it = result.find("-c"); 600 auto it = result.find("-c");
601 601
602 if (it != result.end() || (it = result.find("--config")) != result.end()) 602 if (it != result.end() || (it = result.find("--config")) != result.end())
603 return config(it->second); 603 return config(it->second);
604 604
605 auto cfg = config::search("irccd.conf"); 605 auto cfg = config::search("irccd.conf");
606 606
607 return *cfg; 607 return *cfg;
608 } 608 }
609 609
610 // }}} 610 // }}}
611 611
612 // {{{ load_options 612 // {{{ load_options
613 613
614 void load_options(int& argc, char**& argv) 614 void load_options(int& argc, char**& argv)
615 { 615 {
616 static const option::options def{ 616 static const option::options def{
617 { "-c", true }, 617 { "-c", true },
618 { "--config", true } 618 { "--config", true }
619 }; 619 };
620 620
621 try { 621 try {
622 daemon->set_config(load_config(option::read(argc, argv, def))); 622 daemon->set_config(load_config(option::read(argc, argv, def)));
623 } catch (const std::exception& ex) { 623 } catch (const std::exception& ex) {
624 throw std::runtime_error(str(format("%1%") % ex.what())); 624 throw std::runtime_error(str(format("%1%") % ex.what()));
625 } 625 }
626 } 626 }
627 627
628 // }}} 628 // }}}
629 629
630 // {{{ load 630 // {{{ load
631 631
632 void load(int argc, char** argv) 632 void load(int argc, char** argv)
633 { 633 {
634 daemon = std::make_unique<irccd>(io); 634 daemon = std::make_unique<irccd>(io);
635 daemon->plugins().add_loader(std::make_unique<dynlib_plugin_loader>()); 635 daemon->plugins().add_loader(std::make_unique<dynlib_plugin_loader>());
636 636
637 #if defined(IRCCD_HAVE_JS) 637 #if defined(IRCCD_HAVE_JS)
638 auto loader = std::make_unique<js::js_plugin_loader>(*daemon); 638 auto loader = std::make_unique<js::js_plugin_loader>(*daemon);
639 639
640 for (const auto& f : js::js_api::registry) 640 for (const auto& f : js::js_api::registry)
641 loader->get_modules().push_back(f()); 641 loader->get_modules().push_back(f());
642 642
643 daemon->plugins().add_loader(std::move(loader)); 643 daemon->plugins().add_loader(std::move(loader));
644 #endif 644 #endif
645 645
646 load_options(argc, argv); 646 load_options(argc, argv);
647 load_plugins(argc, argv); 647 load_plugins(argc, argv);
648 } 648 }
649 649
650 // }}} 650 // }}}
651 651
652 } // !namespace 652 } // !namespace
653 653
654 } // !irccd 654 } // !irccd
655 655
656 int main(int argc, char** argv) 656 int main(int argc, char** argv)
657 { 657 {
658 try { 658 try {
659 irccd::load(--argc, ++argv); 659 irccd::load(--argc, ++argv);
660 irccd::run(); 660 irccd::run();
661 } catch (const std::exception& ex) { 661 } catch (const std::exception& ex) {
662 std::cerr << "abort: " << ex.what() << std::endl; 662 std::cerr << "abort: " << ex.what() << std::endl;
663 return 1; 663 return 1;
664 } 664 }
665 } 665 }