Changeset 0298d11
- Timestamp:
- 2006-01-13T23:51:21Z (19 years ago)
- Branches:
- master
- Children:
- c22c210
- Parents:
- 277674c
- Files:
-
- 1 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
Makefile
r277674c r0298d11 10 10 11 11 # Program variables 12 objects = account.o bitlbee.o commands.o conf.o crypting.o help.o ini.o irc.o log.o nick.o query.o set.o storage.o storage_text.o unix.o url.o user.o util.o12 objects = account.o bitlbee.o commands.o conf.o crypting.o help.o ini.o irc.o irc_commands.o log.o nick.o query.o set.o storage.o storage_text.o unix.o url.o user.o util.o 13 13 subdirs = protocols 14 14 -
commands.c
r277674c r0298d11 32 32 #include <string.h> 33 33 34 const command_t commands[] = {35 { "help", 0, cmd_help },36 { "identify", 1, cmd_identify },37 { "register", 1, cmd_register },38 { "drop", 1, cmd_drop },39 { "account", 1, cmd_account },40 { "add", 2, cmd_add },41 { "info", 1, cmd_info },42 { "rename", 2, cmd_rename },43 { "remove", 1, cmd_remove },44 { "block", 1, cmd_block },45 { "allow", 1, cmd_allow },46 { "save", 0, cmd_save },47 { "set", 0, cmd_set },48 { "yes", 0, cmd_yesno },49 { "no", 0, cmd_yesno },50 { "blist", 0, cmd_blist },51 { "nick", 1, cmd_nick },52 { "import_buddies", 1, cmd_import_buddies },53 { "qlist", 0, cmd_qlist },54 { NULL }55 };56 57 34 int root_command_string( irc_t *irc, user_t *u, char *command, int flags ) 58 35 { … … 114 91 } 115 92 116 int cmd_help( irc_t *irc, char **cmd )93 static int cmd_help( irc_t *irc, char **cmd ) 117 94 { 118 95 char param[80]; … … 143 120 } 144 121 145 int cmd_identify( irc_t *irc, char **cmd )122 static int cmd_identify( irc_t *irc, char **cmd ) 146 123 { 147 124 storage_status_t status = storage_load( irc->nick, cmd[1], irc ); … … 166 143 } 167 144 168 int cmd_register( irc_t *irc, char **cmd )145 static int cmd_register( irc_t *irc, char **cmd ) 169 146 { 170 147 if( global.conf->authmode == AUTHMODE_REGISTERED ) … … 193 170 } 194 171 195 int cmd_drop( irc_t *irc, char **cmd )172 static int cmd_drop( irc_t *irc, char **cmd ) 196 173 { 197 174 storage_status_t status; … … 217 194 } 218 195 219 int cmd_account( irc_t *irc, char **cmd )196 static int cmd_account( irc_t *irc, char **cmd ) 220 197 { 221 198 account_t *a; … … 377 354 } 378 355 379 int cmd_add( irc_t *irc, char **cmd )356 static int cmd_add( irc_t *irc, char **cmd ) 380 357 { 381 358 account_t *a; … … 417 394 } 418 395 419 int cmd_info( irc_t *irc, char **cmd )396 static int cmd_info( irc_t *irc, char **cmd ) 420 397 { 421 398 struct gaim_connection *gc; … … 454 431 } 455 432 456 int cmd_rename( irc_t *irc, char **cmd )433 static int cmd_rename( irc_t *irc, char **cmd ) 457 434 { 458 435 user_t *u; … … 495 472 } 496 473 497 int cmd_remove( irc_t *irc, char **cmd )474 static int cmd_remove( irc_t *irc, char **cmd ) 498 475 { 499 476 user_t *u; … … 517 494 } 518 495 519 int cmd_block( irc_t *irc, char **cmd )496 static int cmd_block( irc_t *irc, char **cmd ) 520 497 { 521 498 struct gaim_connection *gc; … … 558 535 } 559 536 560 int cmd_allow( irc_t *irc, char **cmd )537 static int cmd_allow( irc_t *irc, char **cmd ) 561 538 { 562 539 struct gaim_connection *gc; … … 600 577 } 601 578 602 int cmd_yesno( irc_t *irc, char **cmd )579 static int cmd_yesno( irc_t *irc, char **cmd ) 603 580 { 604 581 query_t *q = NULL; … … 640 617 } 641 618 642 int cmd_set( irc_t *irc, char **cmd )619 static int cmd_set( irc_t *irc, char **cmd ) 643 620 { 644 621 if( cmd[1] && cmd[2] ) … … 666 643 } 667 644 668 int cmd_save( irc_t *irc, char **cmd )645 static int cmd_save( irc_t *irc, char **cmd ) 669 646 { 670 647 if( storage_save( irc, TRUE ) == STORAGE_OK ) … … 676 653 } 677 654 678 int cmd_blist( irc_t *irc, char **cmd )655 static int cmd_blist( irc_t *irc, char **cmd ) 679 656 { 680 657 int online = 0, away = 0, offline = 0; … … 722 699 } 723 700 724 int cmd_nick( irc_t *irc, char **cmd )701 static int cmd_nick( irc_t *irc, char **cmd ) 725 702 { 726 703 account_t *a; … … 758 735 } 759 736 760 int cmd_qlist( irc_t *irc, char **cmd )737 static int cmd_qlist( irc_t *irc, char **cmd ) 761 738 { 762 739 query_t *q = irc->queries; … … 780 757 } 781 758 782 int cmd_import_buddies( irc_t *irc, char **cmd )759 static int cmd_import_buddies( irc_t *irc, char **cmd ) 783 760 { 784 761 struct gaim_connection *gc; … … 832 809 return( 0 ); 833 810 } 811 812 const command_t commands[] = { 813 { "help", 0, cmd_help, 0 }, 814 { "identify", 1, cmd_identify, 0 }, 815 { "register", 1, cmd_register, 0 }, 816 { "drop", 1, cmd_drop, 0 }, 817 { "account", 1, cmd_account, 0 }, 818 { "add", 2, cmd_add, 0 }, 819 { "info", 1, cmd_info, 0 }, 820 { "rename", 2, cmd_rename, 0 }, 821 { "remove", 1, cmd_remove, 0 }, 822 { "block", 1, cmd_block, 0 }, 823 { "allow", 1, cmd_allow, 0 }, 824 { "save", 0, cmd_save, 0 }, 825 { "set", 0, cmd_set, 0 }, 826 { "yes", 0, cmd_yesno, 0 }, 827 { "no", 0, cmd_yesno, 0 }, 828 { "blist", 0, cmd_blist, 0 }, 829 { "nick", 1, cmd_nick, 0 }, 830 { "import_buddies", 1, cmd_import_buddies, 0 }, 831 { "qlist", 0, cmd_qlist, 0 }, 832 { NULL } 833 }; -
commands.h
r277674c r0298d11 29 29 #include "bitlbee.h" 30 30 31 typedef struct command _t31 typedef struct command 32 32 { 33 33 char *command; 34 34 int required_parameters; 35 35 int (*execute)(irc_t *, char **args); 36 int flags; 36 37 } command_t; 37 38 int cmd_account( irc_t *irc, char **cmd );39 int cmd_help( irc_t *irc, char **args);40 int cmd_info( irc_t *irc, char **args);41 int cmd_add( irc_t *irc, char **args) ;42 int cmd_rename( irc_t *irc, char **args );43 int cmd_remove( irc_t *irc, char **args );44 int cmd_block( irc_t *irc, char **args );45 int cmd_allow( irc_t *irc, char **args );46 int cmd_save( irc_t *irc, char **args );47 int cmd_set( irc_t *irc, char **args );48 int cmd_yesno( irc_t *irc, char **args );49 int cmd_identify( irc_t *irc, char **args );50 int cmd_register( irc_t *irc, char **args );51 int cmd_drop( irc_t *irc, char **args );52 int cmd_blist( irc_t *irc, char **cmd );53 int cmd_nick( irc_t *irc, char **cmd );54 int cmd_qlist( irc_t *irc, char **cmd );55 int cmd_import_buddies( irc_t *irc, char **cmd );56 int cmd_dump( irc_t *irc, char **cmd );57 38 58 39 extern const command_t commands[]; 59 40 41 #define IRC_CMD_PRE_LOGIN 1 42 #define IRC_CMD_LOGGED_IN 2 43 #define IRC_CMD_OPER_ONLY 4 44 60 45 #endif -
irc.c
r277674c r0298d11 419 419 } 420 420 421 int irc_exec( irc_t *irc, char **cmd )422 {423 int i;424 425 if( (global.conf)->authmode == AUTHMODE_CLOSED && irc->status < USTATUS_AUTHORIZED )426 {427 if( g_strcasecmp( cmd[0], "PASS" ) == 0 )428 {429 if( !cmd[1] )430 {431 irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );432 }433 else if( strcmp( cmd[1], (global.conf)->auth_pass ) == 0 )434 {435 irc->status = USTATUS_AUTHORIZED;436 }437 else438 {439 irc_reply( irc, 464, ":Nope, maybe you should try it again..." );440 }441 }442 else443 {444 irc_reply( irc, 464, ":Uhh, fine, but I want the password first." );445 }446 447 return( 1 );448 }449 450 if( g_strcasecmp( cmd[0], "USER" ) == 0 )451 {452 if( !( cmd[1] && cmd[2] && cmd[3] && cmd[4] ) )453 {454 irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );455 }456 else if( irc->user )457 {458 irc_reply( irc, 462, ":You can't change your nick/userinfo" );459 }460 else461 {462 irc->user = g_strdup( cmd[1] );463 irc->realname = g_strdup( cmd[4] );464 if( irc->nick ) irc_login( irc );465 }466 return( 1 );467 }468 else if( g_strcasecmp( cmd[0], "NICK" ) == 0 )469 {470 if( !cmd[1] )471 {472 irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );473 }474 else if( irc->nick )475 {476 irc_reply( irc, 438, ":The hand of the deity is upon thee, thy nick may not change" );477 }478 /* This is not clean, but for now it'll have to be like this... */479 else if( ( nick_cmp( cmd[1], irc->mynick ) == 0 ) || ( nick_cmp( cmd[1], NS_NICK ) == 0 ) )480 {481 irc_reply( irc, 433, ":This nick is already in use" );482 }483 else if( !nick_ok( cmd[1] ) )484 {485 /* [SH] Invalid characters. */486 irc_reply( irc, 432, ":This nick contains invalid characters" );487 }488 else489 {490 irc->nick = g_strdup( cmd[1] );491 if( irc->user ) irc_login( irc );492 }493 return( 1 );494 }495 else if( g_strcasecmp( cmd[0], "QUIT" ) == 0 )496 {497 irc_write( irc, "ERROR :%s%s", cmd[1]?"Quit: ":"", cmd[1]?cmd[1]:"Client Quit" );498 g_io_channel_close( irc->io_channel );499 return( 0 );500 }501 502 if( !irc->user || !irc->nick )503 {504 irc_reply( irc, 451, ":Register first" );505 return( 1 );506 }507 508 if( g_strcasecmp( cmd[0], "PING" ) == 0 )509 {510 irc_write( irc, ":%s PONG %s :%s", irc->myhost, irc->myhost, cmd[1]?cmd[1]:irc->myhost );511 }512 else if( g_strcasecmp( cmd[0], "OPER" ) == 0 )513 {514 if( !cmd[2] )515 irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );516 else if( strcmp( cmd[2], global.conf->oper_pass ) == 0 )517 irc_umode_set( irc, "+o", 1 );518 // else519 /* FIXME/TODO: Find out which reply to send now. */520 }521 else if( g_strcasecmp( cmd[0], "MODE" ) == 0 )522 {523 if( !cmd[1] )524 {525 irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );526 }527 else if( *cmd[1] == '#' || *cmd[1] == '&' )528 {529 if( cmd[2] )530 {531 if( *cmd[2] == '+' || *cmd[2] == '-' )532 irc_reply( irc, 477, "%s :Can't change channel modes", cmd[1] );533 else if( *cmd[2] == 'b' )534 irc_reply( irc, 368, "%s :No bans possible", cmd[1] );535 }536 else537 irc_reply( irc, 324, "%s +%s", cmd[1], CMODE );538 }539 else540 {541 if( nick_cmp( cmd[1], irc->nick ) == 0 )542 {543 if( cmd[2] )544 irc_umode_set( irc, cmd[2], 0 );545 }546 else547 irc_reply( irc, 502, ":Don't touch their modes" );548 }549 }550 else if( g_strcasecmp( cmd[0], "NAMES" ) == 0 )551 {552 irc_names( irc, cmd[1]?cmd[1]:irc->channel );553 }554 else if( g_strcasecmp( cmd[0], "PART" ) == 0 )555 {556 struct conversation *c;557 558 if( !cmd[1] )559 {560 irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );561 }562 else if( g_strcasecmp( cmd[1], irc->channel ) == 0 )563 {564 user_t *u = user_find( irc, irc->nick );565 566 /* Not allowed to leave control channel */567 irc_part( irc, u, irc->channel );568 irc_join( irc, u, irc->channel );569 }570 else if( ( c = conv_findchannel( cmd[1] ) ) )571 {572 user_t *u = user_find( irc, irc->nick );573 574 irc_part( irc, u, c->channel );575 576 if( c->gc && c->gc->prpl )577 {578 c->joined = 0;579 c->gc->prpl->chat_leave( c->gc, c->id );580 }581 }582 else583 {584 irc_reply( irc, 403, "%s :No such channel", cmd[1] );585 }586 }587 else if( g_strcasecmp( cmd[0], "JOIN" ) == 0 )588 {589 if( !cmd[1] )590 {591 irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );592 }593 else if( g_strcasecmp( cmd[1], irc->channel ) == 0 )594 ; /* Dude, you're already there...595 RFC doesn't have any reply for that though? */596 else if( cmd[1] )597 {598 if( ( cmd[1][0] == '#' || cmd[1][0] == '&' ) && cmd[1][1] )599 {600 user_t *u = user_find( irc, cmd[1] + 1 );601 602 if( u && u->gc && u->gc->prpl && u->gc->prpl->chat_open )603 {604 irc_reply( irc, 403, "%s :Initializing groupchat in a different channel", cmd[1] );605 606 if( !u->gc->prpl->chat_open( u->gc, u->handle ) )607 {608 irc_usermsg( irc, "Could not open a groupchat with %s, maybe you don't have a connection to him/her yet?", u->nick );609 }610 }611 else612 {613 irc_reply( irc, 403, "%s :Groupchats are not possible with %s", cmd[1], cmd[1]+1 );614 }615 }616 else617 {618 irc_reply( irc, 403, "%s :No such channel", cmd[1] );619 }620 }621 }622 else if( g_strcasecmp( cmd[0], "INVITE" ) == 0 )623 {624 if( cmd[1] && cmd[2] )625 irc_invite( irc, cmd[1], cmd[2] );626 else627 irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );628 }629 else if( g_strcasecmp( cmd[0], "PRIVMSG" ) == 0 || g_strcasecmp( cmd[0], "NOTICE" ) == 0 )630 {631 if( !cmd[1] )632 {633 irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );634 }635 else if ( !cmd[2] )636 {637 irc_reply( irc, 412, ":No text to send" );638 }639 else if ( irc->nick && g_strcasecmp( cmd[1], irc->nick ) == 0 )640 {641 irc_write( irc, ":%s!%s@%s %s %s :%s", irc->nick, irc->user, irc->host, cmd[0], cmd[1], cmd[2] );642 }643 else644 {645 if( g_strcasecmp( cmd[1], irc->channel ) == 0 )646 {647 unsigned int i;648 char *t = set_getstr( irc, "default_target" );649 650 if( g_strcasecmp( t, "last" ) == 0 && irc->last_target )651 cmd[1] = irc->last_target;652 else if( g_strcasecmp( t, "root" ) == 0 )653 cmd[1] = irc->mynick;654 655 for( i = 0; i < strlen( cmd[2] ); i ++ )656 {657 if( cmd[2][i] == ' ' ) break;658 if( cmd[2][i] == ':' || cmd[2][i] == ',' )659 {660 cmd[1] = cmd[2];661 cmd[2] += i;662 *cmd[2] = 0;663 while( *(++cmd[2]) == ' ' );664 break;665 }666 }667 668 irc->is_private = 0;669 670 if( cmd[1] != irc->last_target )671 {672 if( irc->last_target )673 g_free( irc->last_target );674 irc->last_target = g_strdup( cmd[1] );675 }676 }677 else678 {679 irc->is_private = 1;680 }681 irc_send( irc, cmd[1], cmd[2], ( g_strcasecmp( cmd[0], "NOTICE" ) == 0 ) ? IM_FLAG_AWAY : 0 );682 }683 }684 else if( g_strcasecmp( cmd[0], "WHO" ) == 0 )685 {686 irc_who( irc, cmd[1] );687 }688 else if( g_strcasecmp( cmd[0], "USERHOST" ) == 0 )689 {690 user_t *u;691 692 if( !cmd[1] )693 {694 irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );695 }696 /* [TV] Usable USERHOST-implementation according to697 RFC1459. Without this, mIRC shows an error698 while connecting, and the used way of rejecting699 breaks standards.700 */701 702 for( i = 1; cmd[i]; i ++ )703 if( ( u = user_find( irc, cmd[i] ) ) )704 {705 if( u->online && u->away )706 irc_reply( irc, 302, ":%s=-%s@%s", u->nick, u->user, u->host );707 else708 irc_reply( irc, 302, ":%s=+%s@%s", u->nick, u->user, u->host );709 }710 }711 else if( g_strcasecmp( cmd[0], "ISON" ) == 0 )712 {713 user_t *u;714 char buff[IRC_MAX_LINE];715 int lenleft;716 717 buff[0] = '\0';718 719 /* [SH] Leave room for : and \0 */720 lenleft = IRC_MAX_LINE - 2;721 722 for( i = 1; cmd[i]; i ++ )723 {724 if( ( u = user_find( irc, cmd[i] ) ) && u->online )725 {726 /* [SH] Make sure we don't use too much buffer space. */727 lenleft -= strlen( u->nick ) + 1;728 729 if( lenleft < 0 )730 {731 break;732 }733 734 /* [SH] Add the nick to the buffer. Note735 * that an extra space is always added. Even736 * if it's the last nick in the list. Who737 * cares?738 */739 740 strcat( buff, u->nick );741 strcat( buff, " " );742 }743 }744 745 /* [WvG] Well, maybe someone cares, so why not remove it? */746 if( strlen( buff ) > 0 )747 buff[strlen(buff)-1] = '\0';748 749 /* [SH] By the way, that really *was* WvG talking. */750 /* [WvG] Really? */751 /* [SH] Yeah... But *this* is WvG talking too. ;-P */752 /* [WvG] *sigh* */753 754 irc_reply( irc, 303, ":%s", buff );755 }756 else if( g_strcasecmp( cmd[0], "WATCH" ) == 0 )757 {758 /* Obviously we could also mark a user structure as being759 watched, but what if the WATCH command is sent right760 after connecting? The user won't exist yet then... */761 for( i = 1; cmd[i]; i ++ )762 {763 char *nick;764 user_t *u;765 766 if( !cmd[i][0] || !cmd[i][1] )767 break;768 769 nick = g_strdup( cmd[i] + 1 );770 nick_lc( nick );771 772 u = user_find( irc, nick );773 774 if( cmd[i][0] == '+' )775 {776 if( !g_hash_table_lookup( irc->watches, nick ) )777 g_hash_table_insert( irc->watches, nick, nick );778 779 if( u && u->online )780 irc_reply( irc, 604, "%s %s %s %d :%s", u->nick, u->user, u->host, time( NULL ), "is online" );781 else782 irc_reply( irc, 605, "%s %s %s %d :%s", nick, "*", "*", time( NULL ), "is offline" );783 }784 else if( cmd[i][0] == '-' )785 {786 gpointer okey, ovalue;787 788 if( g_hash_table_lookup_extended( irc->watches, nick, &okey, &ovalue ) )789 {790 g_free( okey );791 g_hash_table_remove( irc->watches, okey );792 793 irc_reply( irc, 602, "%s %s %s %d :%s", nick, "*", "*", 0, "Stopped watching" );794 }795 }796 }797 }798 else if( g_strcasecmp( cmd[0], "TOPIC" ) == 0 )799 {800 if( cmd[1] && cmd[2] )801 irc_reply( irc, 482, "%s :Cannot change topic", cmd[1] );802 else if( cmd[1] )803 irc_topic( irc, cmd[1] );804 else805 irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );806 }807 else if( g_strcasecmp( cmd[0], "AWAY" ) == 0 )808 {809 irc_away( irc, cmd[1] );810 }811 else if( g_strcasecmp( cmd[0], "WHOIS" ) == 0 )812 {813 if( cmd[1] )814 {815 irc_whois( irc, cmd[1] );816 }817 else818 {819 irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );820 }821 }822 else if( g_strcasecmp( cmd[0], "WHOWAS" ) == 0 )823 {824 /* For some reason irssi tries a whowas when whois fails. We can825 ignore this, but then the user never gets a "user not found"826 message from irssi which is a bit annoying. So just respond827 with not-found and irssi users will get better error messages */828 829 if( cmd[1] )830 {831 irc_reply( irc, 406, "%s :Nick does not exist", cmd[1] );832 irc_reply( irc, 369, "%s :End of WHOWAS", cmd[1] );833 }834 else835 {836 irc_reply( irc, 461, "%s :Need more parameters", cmd[0] );837 }838 }839 else if( ( g_strcasecmp( cmd[0], "NICKSERV" ) == 0 ) || ( g_strcasecmp( cmd[0], "NS" ) == 0 ) )840 {841 /* [SH] This aliases the NickServ command to PRIVMSG root */842 /* [TV] This aliases the NS command to PRIVMSG root as well */843 root_command( irc, cmd + 1 );844 }845 else if( g_strcasecmp( cmd[0], "MOTD" ) == 0 )846 {847 irc_motd( irc );848 }849 else if( g_strcasecmp( cmd[0], "PONG" ) == 0 )850 {851 /* We could check the value we get back from the user, but in852 fact we don't care, we're just happy he's still alive. */853 irc->last_pong = gettime();854 irc->pinging = 0;855 }856 else if( g_strcasecmp( cmd[0], "COMPLETIONS" ) == 0 )857 {858 user_t *u = user_find( irc, irc->mynick );859 help_t *h;860 set_t *s;861 int i;862 863 irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS ", "OK" );864 865 for( i = 0; commands[i].command; i ++ )866 irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS ", commands[i].command );867 868 for( h = global.help; h; h = h->next )869 irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS help ", h->string );870 871 for( s = irc->set; s; s = s->next )872 irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS set ", s->key );873 874 irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS ", "END" );875 }876 else if( set_getint( irc, "debug" ) )877 {878 irc_usermsg( irc, "\002--- Unknown command:" );879 for( i = 0; cmd[i]; i ++ ) irc_usermsg( irc, "%s", cmd[i] );880 irc_usermsg( irc, "\002--------------------" );881 }882 883 return( 1 );884 }885 886 421 void irc_reply( irc_t *irc, int code, char *format, ... ) 887 422 { … … 1038 573 1039 574 irc_reply( irc, 366, "%s :End of /NAMES list", channel ); 1040 }1041 1042 void irc_who( irc_t *irc, char *channel )1043 {1044 user_t *u = irc->users;1045 struct conversation *c;1046 GList *l;1047 1048 if( !channel || *channel == '0' || *channel == '*' || !*channel )1049 while( u )1050 {1051 irc_reply( irc, 352, "%s %s %s %s %s %c :0 %s", u->online ? irc->channel : "*", u->user, u->host, irc->myhost, u->nick, u->online ? ( u->away ? 'G' : 'H' ) : 'G', u->realname );1052 u = u->next;1053 }1054 else if( g_strcasecmp( channel, irc->channel ) == 0 )1055 while( u )1056 {1057 if( u->online )1058 irc_reply( irc, 352, "%s %s %s %s %s %c :0 %s", channel, u->user, u->host, irc->myhost, u->nick, u->away ? 'G' : 'H', u->realname );1059 u = u->next;1060 }1061 else if( ( c = conv_findchannel( channel ) ) )1062 for( l = c->in_room; l; l = l->next )1063 {1064 if( ( u = user_findhandle( c->gc, l->data ) ) )1065 irc_reply( irc, 352, "%s %s %s %s %s %c :0 %s", channel, u->user, u->host, irc->myhost, u->nick, u->away ? 'G' : 'H', u->realname );1066 }1067 else if( ( u = user_find( irc, channel ) ) )1068 irc_reply( irc, 352, "%s %s %s %s %s %c :0 %s", channel, u->user, u->host, irc->myhost, u->nick, u->online ? ( u->away ? 'G' : 'H' ) : 'G', u->realname );1069 1070 irc_reply( irc, 315, "%s :End of /WHO list.", channel?channel:"**" );1071 575 } 1072 576 … … 1180 684 } 1181 685 1182 void irc_whois( irc_t *irc, char *nick )1183 {1184 user_t *u = user_find( irc, nick );1185 1186 if( u )1187 {1188 irc_reply( irc, 311, "%s %s %s * :%s", u->nick, u->user, u->host, u->realname );1189 1190 if( u->gc )1191 irc_reply( irc, 312, "%s %s.%s :%s network", u->nick, u->gc->user->username,1192 *u->gc->user->proto_opt[0] ? u->gc->user->proto_opt[0] : "", u->gc->prpl->name );1193 else1194 irc_reply( irc, 312, "%s %s :%s", u->nick, irc->myhost, IRCD_INFO );1195 1196 if( !u->online )1197 irc_reply( irc, 301, "%s :%s", u->nick, "User is offline" );1198 else if( u->away )1199 irc_reply( irc, 301, "%s :%s", u->nick, u->away );1200 1201 irc_reply( irc, 318, "%s :End of /WHOIS list", nick );1202 }1203 else1204 {1205 irc_reply( irc, 401, "%s :Nick does not exist", nick );1206 }1207 }1208 1209 1210 686 void irc_umode_set( irc_t *irc, char *s, int allow_priv ) 1211 687 { … … 1237 713 } 1238 714 1239 int irc_away( irc_t *irc, char *away )1240 {1241 user_t *u = user_find( irc, irc->nick );1242 GSList *c = get_connections();1243 1244 if( !u ) return( 0 );1245 1246 if( away && *away )1247 {1248 int i, j;1249 1250 /* Copy away string, but skip control chars. Mainly because1251 Jabber really doesn't like them. */1252 u->away = g_malloc( strlen( away ) + 1 );1253 for( i = j = 0; away[i]; i ++ )1254 if( ( u->away[j] = away[i] ) >= ' ' )1255 j ++;1256 u->away[j] = 0;1257 1258 irc_reply( irc, 306, ":You're now away: %s", u->away );1259 /* irc_umode_set( irc, irc->myhost, "+a" ); */1260 }1261 else1262 {1263 if( u->away ) g_free( u->away );1264 u->away = NULL;1265 /* irc_umode_set( irc, irc->myhost, "-a" ); */1266 irc_reply( irc, 305, ":Welcome back" );1267 }1268 1269 while( c )1270 {1271 if( ((struct gaim_connection *)c->data)->flags & OPT_LOGGED_IN )1272 proto_away( c->data, u->away );1273 1274 c = c->next;1275 }1276 1277 return( 1 );1278 }1279 1280 715 void irc_spawn( irc_t *irc, user_t *u ) 1281 716 { … … 1329 764 } 1330 765 g_free( nick ); 1331 }1332 1333 void irc_invite( irc_t *irc, char *nick, char *channel )1334 {1335 struct conversation *c = conv_findchannel( channel );1336 user_t *u = user_find( irc, nick );1337 1338 if( u && c && ( u->gc == c->gc ) )1339 if( c->gc && c->gc->prpl && c->gc->prpl->chat_invite )1340 {1341 c->gc->prpl->chat_invite( c->gc, c->id, "", u->handle );1342 irc_reply( irc, 341, "%s %s", nick, channel );1343 return;1344 }1345 1346 irc_reply( irc, 482, "%s :Invite impossible; User/Channel non-existent or incompatible", channel );1347 766 } 1348 767
Note: See TracChangeset
for help on using the changeset viewer.