📄 bnchat.c
字号:
" --arch=XMAC report architecture as PowerPC MacOSX\n"); fprintf(stderr, " -o NAME, --owner=NAME report CD owner as NAME\n" " -k KEY, --cdkey=KEY report CD key as KEY\n" " -l LANG --lang=LANG report language as LANG (default \"enUS\")\n" " -h, --help, --usage show this information and exit\n" " -v, --version print version number and exit\n"); exit(STATUS_FAILURE);}int read_commandline(int argc, char * * argv, char const * * servname, unsigned short * servport, char const * * clienttag, char const * * archtag, int * changepass, int * newacct, char const * * channel, char const * * cdowner, char const * * cdkey, char const * * gamelang, int * useansi){ int a; if (argc<1 || !argv || !argv[0]) { fprintf(stderr,"bad arguments\n"); return STATUS_FAILURE; } for (a=1; a<argc; a++) if (*servname && isdigit((int)argv[a][0]) && a+1>=argc) { if (str_to_ushort(argv[a],servport)<0) { fprintf(stderr,"%s: \"%s\" should be a positive integer\n",argv[0],argv[a]); usage(argv[0]); } } else if (!(*servname) && argv[a][0]!='-' && a+2>=argc) *servname = argv[a]; else if (strcmp(argv[a],"-a")==0 || strcmp(argv[a],"--use-ansi")==0) *useansi = 1; else if (strcmp(argv[a],"-n")==0 || strcmp(argv[a],"--new-account")==0) { if (*changepass) { fprintf(stderr,"%s: can not create new account when changing passwords\n",argv[0]); usage(argv[0]); } *newacct = 1; } else if (strcmp(argv[a],"-c")==0 || strcmp(argv[a],"--change-password")==0) { if (*newacct) { fprintf(stderr,"%s: can not change passwords when creating a new account\n",argv[0]); usage(argv[0]); } *changepass = 1; } else if (strcmp(argv[a],"--client=CHAT")==0) { if (*clienttag) { fprintf(stderr,"%s: client type was already specified as \"%s\"\n",argv[0],*clienttag); usage(argv[0]); } *clienttag = CLIENTTAG_BNCHATBOT; *channel = CHANNEL_BNCHATBOT; } else if (strcmp(argv[a],"-b")==0 || strcmp(argv[a],"--client=SEXP")==0) { if (*clienttag) { fprintf(stderr,"%s: client type was already specified as \"%s\"\n",argv[0],*clienttag); usage(argv[0]); } *clienttag = CLIENTTAG_BROODWARS; *channel = CHANNEL_BROODWARS; } else if (strcmp(argv[a],"-d")==0 || strcmp(argv[a],"--client=DRTL")==0) { if (*clienttag) { fprintf(stderr,"%s: client type was already specified as \"%s\"\n",argv[0],*clienttag); usage(argv[0]); } *clienttag = CLIENTTAG_DIABLORTL; *channel = CHANNEL_DIABLORTL; } else if (strcmp(argv[a],"--client=DSHR")==0) { if (*clienttag) { fprintf(stderr,"%s: client type was already specified as \"%s\"\n",argv[0],*clienttag); usage(argv[0]); } *clienttag = CLIENTTAG_DIABLOSHR; *channel = CHANNEL_DIABLOSHR; } else if (strcmp(argv[a],"-s")==0 || strcmp(argv[a],"--client=STAR")==0) { if (*clienttag) { fprintf(stderr,"%s: client type was already specified as \"%s\"\n",argv[0],*clienttag); usage(argv[0]); } *clienttag = CLIENTTAG_STARCRAFT; *channel = CHANNEL_STARCRAFT; } else if (strcmp(argv[a],"--client=SSHR")==0) { if (*clienttag) { fprintf(stderr,"%s: client type was already specified as \"%s\"\n",argv[0],*clienttag); usage(argv[0]); } *clienttag = CLIENTTAG_SHAREWARE; *channel = CHANNEL_SHAREWARE; } else if (strcmp(argv[a],"-w")==0 || strcmp(argv[a],"--client=W2BN")==0) { if (*clienttag) { fprintf(stderr,"%s: client type was already specified as \"%s\"\n",argv[0],*clienttag); usage(argv[0]); } *clienttag = CLIENTTAG_WARCIIBNE; *channel = CHANNEL_WARCIIBNE; } else if (strcmp(argv[a],"--client=D2DV")==0) { if (*clienttag) { fprintf(stderr,"%s: client type was already specified as \"%s\"\n",argv[0],*clienttag); usage(argv[0]); } *clienttag = CLIENTTAG_DIABLO2DV; *channel = CHANNEL_DIABLO2DV; } else if (strcmp(argv[a],"--client=D2XP")==0) { if (*clienttag) { fprintf(stderr,"%s: client type was already specified as \"%s\"\n",argv[0],*clienttag); usage(argv[0]); } *clienttag = CLIENTTAG_DIABLO2XP; *channel = CHANNEL_DIABLO2XP; } else if (strcmp(argv[a],"--client=WAR3")==0) { if (*clienttag) { fprintf(stderr,"%s: client type was already specified as \"%s\"\n",argv[0],*clienttag); usage(argv[0]); } *clienttag = CLIENTTAG_WARCRAFT3; *channel = CHANNEL_WARCRAFT3; } else if (strcmp(argv[a],"--client=W3XP")==0) { if (*clienttag) { fprintf(stderr,"%s: client type was already specified as \"%s\"\n",argv[0],*clienttag); usage(argv[0]); } *clienttag = CLIENTTAG_WAR3XP; *channel = CHANNEL_WAR3XP; } else if (strncmp(argv[a],"--client=",9)==0) { fprintf(stderr,"%s: unknown client tag \"%s\"\n",argv[0],&argv[a][9]); usage(argv[0]); } else if (strcmp(argv[a],"--arch=IX86")==0) { *archtag = ARCHTAG_WINX86; } else if (strcmp(argv[a],"--arch=PMAC")==0) { *archtag = ARCHTAG_MACPPC; } else if (strcmp(argv[a],"--arch=XMAC")==0) { *archtag = ARCHTAG_OSXPPC; } else if (strncmp(argv[a],"--arch=",7)==0) { fprintf(stderr,"%s: unknown architecture tag \"%s\"\n",argv[0],&argv[a][7]); usage(argv[0]); } else if (strcmp(argv[a],"-o")==0) { if (a+1>=argc) { fprintf(stderr,"%s: option \"%s\" requires an argument\n",argv[0],argv[a]); usage(argv[0]); } if (*cdowner) { fprintf(stderr,"%s: CD owner was already specified as \"%s\"\n",argv[0],*cdowner); usage(argv[0]); } *cdowner = argv[++a]; } else if (strncmp(argv[a],"--owner=",8)==0) { if (*cdowner) { fprintf(stderr,"%s: CD owner was already specified as \"%s\"\n",argv[0],*cdowner); usage(argv[0]); } *cdowner = &argv[a][8]; } else if (strcmp(argv[a],"-k")==0) { if (a+1>=argc) { fprintf(stderr,"%s: option \"%s\" requires an argument\n",argv[0],argv[a]); usage(argv[0]); } if (*cdkey) { fprintf(stderr,"%s: CD key was already specified as \"%s\"\n",argv[0],*cdkey); usage(argv[0]); } *cdkey = argv[++a]; } else if (strncmp(argv[a],"--cdkey=",8)==0) { if (*cdkey) { fprintf(stderr,"%s: CD key was already specified as \"%s\"\n",argv[0],*cdkey); usage(argv[0]); } *cdkey = &argv[a][8]; } else if (strcmp(argv[a],"-l")==0) { if (a+1>=argc) { fprintf(stderr,"%s: option \"%s\" requires an argument\n",argv[0],argv[a]); usage(argv[0]); } if (strlen(argv[a + 1]) != 4) { fprintf(stderr,"%s: language has to be 4 characters long\n",argv[0]); usage(argv[0]); } *gamelang = argv[++a]; } else if (strncmp(argv[a],"--lang=",7)==0) { if (strlen(argv[a] + 7) != 4) { fprintf(stderr,"%s: language has to be 4 characters long\n",argv[0]); usage(argv[0]); } *gamelang = &argv[a][7]; } else if (strcmp(argv[a],"-v")==0 || strcmp(argv[a],"--version")==0) { printf("version "PVPGN_VERSION"\n"); return STATUS_SUCCESS; } else if (strcmp(argv[a],"-h")==0 || strcmp(argv[a],"--help")==0 || strcmp(argv[a],"--usage")==0) usage(argv[0]); else if (strcmp(argv[a],"--client")==0 || strcmp(argv[a],"--owner")==0 || strcmp(argv[a],"--cdkey")==0) { fprintf(stderr,"%s: option \"%s\" requires an argument\n",argv[0],argv[a]); usage(argv[0]); } else { fprintf(stderr,"%s: unknown option \"%s\"\n",argv[0],argv[a]); usage(argv[0]); } if (*servport==0) *servport = BNETD_SERV_PORT; if (!(*cdowner)) *cdowner = BNETD_DEFAULT_OWNER; if (!(*cdkey)) *cdkey = BNETD_DEFAULT_KEY; if (!(*clienttag)) { *clienttag = CLIENTTAG_STARCRAFT; *channel = CHANNEL_STARCRAFT; } if (!(*servname)) *servname = BNETD_DEFAULT_HOST; return 0;}void munge(t_client_state * client){ int i; if (!client->munged) { printf("\r"); for (i=0; i<strlen(mode_get_prompt(client->mode)); i++) printf(" "); for (i=0; i<strlen(client->text) && i<client->screen_width-strlen(mode_get_prompt(client->mode)); i++) printf(" "); printf("\r"); client->munged = 1; }}void ansi_printf(t_client_state * client,int color, char const * fmt, ...){ va_list args; char buffer[2048]; if (!(client)) return; if (!(fmt)) return; if (client->useansi) ansi_text_color_fore(color); VA_START(args,fmt); vsnprintf(buffer,2048,fmt,args); va_end(args); str_print_term(stdout,buffer,0,1); if (client->useansi) ansi_text_reset(); fflush(stdout);}extern int main(int argc, char * argv[]){ int newacct=0; int changepass=0; t_client_state client; t_user_info user; t_packet * packet; t_packet * rpacket; char const * servname=NULL; unsigned short servport=0; char const * * channellist; unsigned int statsmatch=24; /* any random number that is rare in uninitialized fields */ memset(&user,0,sizeof(t_user_info)); memset(&client,0,sizeof(t_client_state)); /* default values */ user.archtag = ARCHTAG_WINX86; user.gamelang = CLIENT_COUNTRYINFO_109_GAMELANG; read_commandline(argc,argv,&servname,&servport,&user.clienttag,&user.archtag,&changepass, &newacct,&user.channel,&user.cdowner,&user.cdkey,&user.gamelang,&client.useansi); client.fd_stdin = fileno(stdin); if (tcgetattr(client.fd_stdin,&client.in_attr_old)>=0) { client.in_attr_new = client.in_attr_old; client.in_attr_new.c_lflag &= ~(ECHO | ICANON); /* turn off ECHO and ICANON */ client.in_attr_new.c_cc[VMIN] = 0; /* don't require reads to return data */ client.in_attr_new.c_cc[VTIME] = 1; /* timeout = .1 seconds */ tcsetattr(client.fd_stdin,TCSANOW,&client.in_attr_new); client.changed_in = 1; } else { fprintf(stderr,"%s: could not set terminal attributes for stdin\n",argv[0]); client.changed_in = 0; } #ifdef HAVE_SIGACTION { struct sigaction winch_action; winch_action.sa_handler = winch_sig_handle; sigemptyset(&winch_action.sa_mask); winch_action.sa_flags = SA_RESTART; sigaction(SIGWINCH,&winch_action,NULL); }#endif if (client_get_termsize(client.fd_stdin,&client.screen_width,&client.screen_height)<0) { fprintf(stderr,"%s: could not determine screen size\n",argv[0]); if (client.changed_in) tcsetattr(client.fd_stdin,TCSAFLUSH,&client.in_attr_old); return STATUS_FAILURE; } if (client.useansi) { ansi_text_reset(); ansi_screen_clear(); ansi_cursor_move_home(); fflush(stdout); } if ((client.sd = client_connect(argv[0], servname,servport,user.cdowner,user.cdkey,user.clienttag, &client.saddr,&client.sessionkey,&client.sessionnum,user.archtag,user.gamelang))<0) { fprintf(stderr,"%s: fatal error during handshake\n",argv[0]); if (client.changed_in) tcsetattr(client.fd_stdin,TCSAFLUSH,&client.in_attr_old); return STATUS_FAILURE; } /* reuse this same packet over and over */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -