Changeset 5899:4e7e80f39536 in roaraudio
- Timestamp:
- 04/14/13 15:16:58 (11 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
plugins/roard/protocol-irc.c
r5823 r5899 50 50 static void cb_client_delete(struct roar_notify_core * core, struct roar_event * event, void * userdata); 51 51 52 static struct roar_subscriber * subscription_client_delete = NULL; 53 54 static char * server_name = "irc.roard"; 55 static char * server_fullname = "RoarAudio roard IRC Server plugin"; 56 57 static char * quit_msg = NULL; 58 59 static struct channel { 52 struct channel { 60 53 char * name; 61 54 struct { … … 66 59 size_t client_count; 67 60 int clients[ROAR_CLIENTS_MAX]; 68 } g_channels[MAX_CHANNELS]; 69 70 static struct command { 61 }; 62 63 struct state { 64 const char * server_name; 65 const char * server_fullname; 66 const char * quit_msg; 67 struct roar_subscriber * subscription_client_delete; 68 struct channel g_channels[MAX_CHANNELS]; 69 }; 70 71 static struct state g_state_init = { 72 .server_name = "irc.roard", 73 .server_fullname = "RoarAudio roard IRC Server plugin", 74 .quit_msg = NULL, 75 .subscription_client_delete = NULL 76 }; 77 78 static struct state * g_state = &g_state_init; 79 80 static const struct command { 71 81 const char * name; 72 82 int (*func)(int client, const char * cmd, char * args, char * text); … … 193 203 194 204 for (i = 0; i < MAX_CHANNELS; i++) { 195 c = &(g_ channels[i]);205 c = &(g_state->g_channels[i]); 196 206 197 207 if ( !c->client_count ) … … 216 226 217 227 for (i = 0; i < MAX_CHANNELS; i++) { 218 c = &(g_ channels[i]);228 c = &(g_state->g_channels[i]); 219 229 220 230 if ( !c->client_count ) … … 281 291 282 292 for (i = 0; i < MAX_CHANNELS; i++) { 283 if ( !g_ channels[i].client_count )284 continue; 285 286 if ( !!strcasecmp(g_ channels[i].name, channel) )287 continue; 288 289 c = &(g_ channels[i]);293 if ( !g_state->g_channels[i].client_count ) 294 continue; 295 296 if ( !!strcasecmp(g_state->g_channels[i].name, channel) ) 297 continue; 298 299 c = &(g_state->g_channels[i]); 290 300 break; 291 301 } … … 293 303 if ( c == NULL ) { 294 304 for (i = 0; i < MAX_CHANNELS; i++) { 295 if ( g_ channels[i].client_count )305 if ( g_state->g_channels[i].client_count ) 296 306 continue; 297 307 298 c = &(g_ channels[i]);308 c = &(g_state->g_channels[i]); 299 309 break; 300 310 } … … 322 332 323 333 for (i = 0; i < MAX_CHANNELS; i++) { 324 if ( !g_ channels[i].client_count )325 continue; 326 327 if ( !!strcasecmp(g_ channels[i].name, channel) )328 continue; 329 330 if ( !g_ channels[i].clients[client] )334 if ( !g_state->g_channels[i].client_count ) 335 continue; 336 337 if ( !!strcasecmp(g_state->g_channels[i].name, channel) ) 338 continue; 339 340 if ( !g_state->g_channels[i].clients[client] ) 331 341 return -1; 332 342 333 c = &(g_ channels[i]);343 c = &(g_state->g_channels[i]); 334 344 break; 335 345 } … … 359 369 360 370 for (i = 0; i < MAX_CHANNELS; i++) { 361 if ( !g_ channels[i].client_count )362 continue; 363 364 if ( !!strcasecmp(g_ channels[i].name, channel) )371 if ( !g_state->g_channels[i].client_count ) 372 continue; 373 374 if ( !!strcasecmp(g_state->g_channels[i].name, channel) ) 365 375 continue; 366 376 … … 368 378 369 379 for (j = 0; j < ROAR_CLIENTS_MAX; j++) { 370 if ( g_ channels[i].clients[j] == 0 )380 if ( g_state->g_channels[i].clients[j] == 0 ) 371 381 continue; 372 382 … … 375 385 if ( (offset + len + 3) > sizeof(buf) ) { 376 386 buf[offset] = 0; 377 put_printf(client, ":%s 353 %s = %s :%s\n", server_name, nick, channel, buf);387 put_printf(client, ":%s 353 %s = %s :%s\n", g_state->server_name, nick, channel, buf); 378 388 offset = 0; 379 389 } … … 388 398 if ( offset ) { 389 399 buf[offset] = 0; 390 put_printf(client, ":%s 353 %s = %s :%s\n", server_name, nick, channel, buf);391 } 392 put_printf(client, ":%s 366 %s %s :End of /NAMES list.\n", server_name, nick, channel);400 put_printf(client, ":%s 353 %s = %s :%s\n", g_state->server_name, nick, channel, buf); 401 } 402 put_printf(client, ":%s 366 %s %s :End of /NAMES list.\n", g_state->server_name, nick, channel); 393 403 394 404 return 0; … … 402 412 size_t count; 403 413 struct channel * c; 404 const char * text = quit_msg;414 const char * text = g_state->quit_msg; 405 415 int client = event->target; 406 416 const char * ufull = get_ufull(client); … … 412 422 text = "Client deleted. Died, kicked or internal error."; 413 423 414 if ( quit_msg != NULL )424 if ( g_state->quit_msg != NULL ) 415 425 put_printf(client, "ERROR :Closing Link: %s (Quit: %s)\n", ufull, text); 416 426 … … 420 430 421 431 for (i = 0; i < MAX_CHANNELS; i++) { 422 c = &(g_ channels[i]);432 c = &(g_state->g_channels[i]); 423 433 424 434 if ( !c->client_count ) … … 474 484 ":%s 372 %s :- MotD goes here...\n" 475 485 ":%s 376 %s :End of /MOTD command.\n", 476 server_name, name,477 server_name, name,server_name,478 server_name, name,479 server_name, name486 g_state->server_name, name, 487 g_state->server_name, name, g_state->server_name, 488 g_state->server_name, name, 489 g_state->server_name, name 480 490 ); 481 491 … … 537 547 538 548 if ( !found ) { 539 put_printf(client, ":%s 421 %s %s :Unknown command\n", server_name, get_nick(client), cmd);549 put_printf(client, ":%s 421 %s %s :Unknown command\n", g_state->server_name, get_nick(client), cmd); 540 550 } 541 551 … … 554 564 if ( args != NULL && args[0] != 0 && is_valid_name(args) && strlen(args) < ROAR_BUFFER_NAME ) { 555 565 if ( get_client_by_nick(args) != -1 ) { 556 put_printf(client, ":%s 433 %s %s :Nickname is already in use.\n", server_name, nick, args);566 put_printf(client, ":%s 433 %s %s :Nickname is already in use.\n", g_state->server_name, nick, args); 557 567 } else { 558 568 ufull = get_ufull(client); … … 566 576 } 567 577 } else { 568 put_printf(client, ":%s 432 %s %s :Erroneous Nickname: Illegal characters\n", server_name, nick, args);578 put_printf(client, ":%s 432 %s %s :Erroneous Nickname: Illegal characters\n", g_state->server_name, nick, args); 569 579 } 570 580 … … 585 595 text = "... have a cuddle ..."; 586 596 587 quit_msg = text;597 g_state->quit_msg = text; 588 598 ret = clients_delete(client); 589 quit_msg = NULL;599 g_state->quit_msg = NULL; 590 600 591 601 return ret; … … 619 629 620 630 for (i = 0; i < MAX_CHANNELS; i++) { 621 if ( !g_ channels[i].client_count )631 if ( !g_state->g_channels[i].client_count ) 622 632 continue; 623 633 numchans++; … … 625 635 626 636 put_printf(client, ":%s 251 %s :There are %zu users and 0 invisible on 1 servers\n", 627 server_name, clientnick, counters_get(cur, clients));637 g_state->server_name, clientnick, counters_get(cur, clients)); 628 638 put_printf(client, ":%s 254 %s %zu :channels formed\n", 629 server_name, clientnick, numchans);639 g_state->server_name, clientnick, numchans); 630 640 put_printf(client, ":%s 255 %s :I have %zu clients and 0 servers\n", 631 server_name, clientnick, counters_get(cur, clients));641 g_state->server_name, clientnick, counters_get(cur, clients)); 632 642 put_printf(client, ":%s 265 %s :Current Local Users: %zu Max: <unknown>\n", 633 server_name, clientnick, counters_get(cur, clients));643 g_state->server_name, clientnick, counters_get(cur, clients)); 634 644 put_printf(client, ":%s 266 %s :Current Global Users: %zu Max: <unknown>\n", 635 server_name, clientnick, counters_get(cur, clients));645 g_state->server_name, clientnick, counters_get(cur, clients)); 636 646 637 647 return 0; … … 650 660 651 661 if ( (tclient = get_client_by_nick(tnick)) == -1 ) { 652 put_printf(client, ":%s 401 %s %s :No such nick/channel\n", server_name, clientnick, tnick);662 put_printf(client, ":%s 401 %s %s :No such nick/channel\n", g_state->server_name, clientnick, tnick); 653 663 } else { 654 put_printf(client, ":%s 311 %s %s %s %s * :%s\n", server_name, clientnick, tnick,664 put_printf(client, ":%s 311 %s %s %s %s * :%s\n", g_state->server_name, clientnick, tnick, 655 665 get_ident(tclient), get_node(tclient), get_realname(tclient)); 656 put_printf(client, ":%s 312 %s %s %s :%s\n", server_name, clientnick, tnick, server_name,server_fullname);657 } 658 put_printf(client, ":%s 318 %s %s :End of /WHOIS list.\n", server_name, clientnick, tnick);666 put_printf(client, ":%s 312 %s %s %s :%s\n", g_state->server_name, clientnick, tnick, g_state->server_name, g_state->server_fullname); 667 } 668 put_printf(client, ":%s 318 %s %s :End of /WHOIS list.\n", g_state->server_name, clientnick, tnick); 659 669 660 670 return 0; … … 688 698 } else { 689 699 if ( (tmp = get_client_by_nick(args)) == -1 ) { 690 put_printf(client, ":%s 401 %s %s :No such nick/channel\n", server_name, get_nick(client), args);700 put_printf(client, ":%s 401 %s %s :No such nick/channel\n", g_state->server_name, get_nick(client), args); 691 701 } else { 692 702 put_printf(tmp, ":%s %s %s :%s\n", ufull, cmd, args, text); … … 708 718 (void)cmd, (void)args, (void)text; 709 719 710 put_printf(client, ":%s 321 %s Channel :Users Name\n", server_name, clientnick);720 put_printf(client, ":%s 321 %s Channel :Users Name\n", g_state->server_name, clientnick); 711 721 712 722 for (i = 0; i < MAX_CHANNELS; i++) { 713 c = &(g_ channels[i]);723 c = &(g_state->g_channels[i]); 714 724 if ( !c->client_count ) 715 725 continue; 716 726 717 727 put_printf(client, ":%s 322 %s %s %zu :[+] %s\n", 718 server_name, clientnick, c->name, c->client_count, c->topic.text == NULL ? "" : c->topic.text);719 } 720 721 put_printf(client, ":%s 323 %s :End of /LIST\n", server_name, clientnick);728 g_state->server_name, clientnick, c->name, c->client_count, c->topic.text == NULL ? "" : c->topic.text); 729 } 730 731 put_printf(client, ":%s 323 %s :End of /LIST\n", g_state->server_name, clientnick); 722 732 723 733 return 0; … … 750 760 put_printf(client, ":%s 332 %s %s :%s\n" 751 761 ":%s 333 %s %s %s %li\n", 752 server_name, nick, c->name, c->topic.text,753 server_name, nick, c->name, c->topic.user, (long int)c->topic.ts762 g_state->server_name, nick, c->name, c->topic.text, 763 g_state->server_name, nick, c->name, c->topic.user, (long int)c->topic.ts 754 764 ); 755 765 } … … 848 858 event.target_type = ROAR_OT_CLIENT; 849 859 850 memset(g_ channels, 0, sizeof(g_channels));851 852 subscription_client_delete = roar_notify_core_subscribe(NULL, &event, cb_client_delete, NULL);860 memset(g_state->g_channels, 0, sizeof(g_state->g_channels)); 861 862 g_state->subscription_client_delete = roar_notify_core_subscribe(NULL, &event, cb_client_delete, NULL); 853 863 854 864 return 0; … … 858 868 (void)para, (void)lib; 859 869 860 roar_notify_core_unsubscribe(NULL, subscription_client_delete);870 roar_notify_core_unsubscribe(NULL, g_state->subscription_client_delete); 861 871 862 872 return 0; … … 890 900 ROAR_DL_PLUGIN_META_DESC("Implementation of the Internet Relay Chat (IRC)"); 891 901 902 ROAR_DL_PLUGIN_REG(ROAR_DL_FN_PROTO, __reg_proto); 892 903 ROAR_DL_PLUGIN_REG(ROAR_DL_FN_INIT, init); 893 904 ROAR_DL_PLUGIN_REG_UNLOAD(unload); 894 ROAR_DL_PLUGIN_REG (ROAR_DL_FN_PROTO, __reg_proto);905 ROAR_DL_PLUGIN_REG_GLOBAL_DATA(g_state, g_state_init); 895 906 } ROAR_DL_PLUGIN_END 896 907
Note: See TracChangeset
for help on using the changeset viewer.