⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bnchat.c

📁 打魔兽战网的都知道他是什么
💻 C
📖 第 1 页 / 共 5 页
字号:
		    case mode_chat:			if (client.text[0]=='\0')			    break;			if (client.text[0]=='/')			{		            munge(&client);			}			else			{			    ansi_printf(&client,ansi_text_color_blue,"\r<%s>",user.player);			    printf(" ");			    str_print_term(stdout,client.text,0,0);			    printf("\n");			    client.munged = 1;			}						if (!(packet = packet_create(packet_class_bnet)))			{			    fprintf(stderr,"%s: could not create packet\n",argv[0]);			    psock_close(client.sd);			    if (client.changed_in)				tcsetattr(client.fd_stdin,TCSAFLUSH,&client.in_attr_old);			    return STATUS_FAILURE;			}			packet_set_size(packet,sizeof(t_client_message));			packet_set_type(packet,CLIENT_MESSAGE);			packet_append_string(packet,client.text);			client_blocksend_packet(client.sd,packet);			packet_del_ref(packet);			break;					    default:			/* one of the wait states; erase what they typed */		        munge(&client);			break;		    }		    		    client.commpos = 0;		    client.text[0] = '\0';		    break;		}	    }	    	    if (PSOCK_FD_ISSET(client.sd,&rfds)) /* got network data */	    {		/* rpacket is from server, packet is from client */		switch (net_recv_packet(client.sd,rpacket,&client.currsize))		{		case 0: /* nothing */		    break;		    		case 1:		    switch (packet_get_type(rpacket))		    {		    case SERVER_ECHOREQ: /* might as well support it */			if (packet_get_size(rpacket)<sizeof(t_server_echoreq))			{		            munge(&client);			    printf("Got bad SERVER_ECHOREQ packet (expected %u bytes, got %u)\n",sizeof(t_server_echoreq),packet_get_size(rpacket));			    break;			}						if (!(packet = packet_create(packet_class_bnet)))			{		            munge(&client);			    fprintf(stderr,"%s: could not create packet\n",argv[0]);			    psock_close(client.sd);			    if (client.changed_in)				tcsetattr(client.fd_stdin,TCSAFLUSH,&client.in_attr_old);			    return STATUS_FAILURE;			}			packet_set_size(packet,sizeof(t_client_echoreply));			packet_set_type(packet,CLIENT_ECHOREPLY);			bn_int_set(&packet->u.client_echoreply.ticks,bn_int_get(rpacket->u.server_echoreq.ticks));			client_blocksend_packet(client.sd,packet);			packet_del_ref(packet);						break;					    case SERVER_STARTGAME4_ACK:			if (client.mode==mode_gamewait)			{		            munge(&client);			    			    if (bn_int_get(rpacket->u.server_startgame4_ack.reply)==SERVER_STARTGAME4_ACK_OK)			    {				printf("Game created.\n");				client.mode = mode_gamestop;			    }			    else			    {				printf("Game could not be created, try another name.\n");				client.mode = mode_gamename;			    }			}			break;		    case SERVER_W3XP_CLAN_INVITEREQ:			if (packet_get_size(rpacket)<sizeof(t_server_w3xp_clan_invitereq))			{		            munge(&client);			    printf("Got bad SERVER_W3XP_CLAN_INVITEREQ packet (expected %u bytes, got %u)\n",sizeof(t_server_w3xp_clan_invitereq),packet_get_size(rpacket));			    break;			}			{			    char const * clan;			    char const * inviter;			    int offset;			    			    offset = sizeof(t_server_w3xp_clan_invitereq);			    if (!(clan = packet_get_str_const(rpacket,offset,MAX_CLANNAME_LEN)))			    {				munge(&client);				printf("Got SERVER_W3XP_CLAN_INVITEREQ with bad or missing clanname\n");				break;			    }			    offset+=strlen(clan)+1;			    if (!(inviter = packet_get_str_const(rpacket,offset,USER_NAME_MAX)))			    {				munge(&client);				printf("Got SERVER_W3XP_CLAN_INVITEREQ with bad or missing inviter\n");				break;			    }			    user.count   = bn_int_get(rpacket->u.server_w3xp_clan_invitereq.count);			    user.clantag = bn_int_get(rpacket->u.server_w3xp_clan_invitereq.clantag);			    if (user.inviter)			    	xfree((void *)user.inviter);			    user.inviter = xstrdup(inviter);			    			    munge(&client);			    printf("%s invited you to Clan %s\n",inviter,clan);			    printf("Do you want to accept invitation (yes/no) ? [yes] ");			    			    client.mode = mode_claninvite;			}								    case SERVER_W3XP_CLANMEMBERUPDATE:			if (packet_get_size(rpacket)<sizeof(t_server_w3xp_clanmemberupdate))			{		            munge(&client);			    printf("Got bad SERVER_W3XP_CLANMEMBERUPDATE packet (expected %u bytes, got %u)\n",sizeof(t_server_w3xp_clanmemberupdate),packet_get_size(rpacket));			    break;			}			if (client.mode == mode_claninvite)			    break;						{			    char const * member;			    char rank, online;			    char const * rank_p;			    char const * online_p;			    char const * append_str;			    int offset;			    char const * rank_str;			    char const * online_str;			    			    offset = sizeof(t_server_w3xp_clanmemberupdate);			    if (!(member = packet_get_str_const(rpacket,offset,USER_NAME_MAX)))			    {				munge(&client);				printf("Got SERVER_W3XP_CLANMEMBERUPDATE with bad or missing member\n");				break;			    }			    offset+=strlen(member)+1;			    if (!(rank_p = (char *)packet_get_data_const(rpacket,offset,1)))			    {				munge(&client);				printf("Got SERVER_W3XP_CLANMEMBERUPDATE with bad or missing rank\n");				break;			    }			    rank = *rank_p;			    offset+=1;			    if (!(online_p = (char *)packet_get_data_const(rpacket,offset,1)))			    {				munge(&client);				printf("Got SERVER_W3XP_CLAN_MEMBERUPDATE with bad or missing online status\n");				break;			    }			    online = *online_p;			    offset+=1;			    if (!(append_str = packet_get_str_const(rpacket,offset,USER_NAME_MAX)))			    {				munge(&client);				printf("Got SERVER_W3XP_CLANMEMBERUPDATE with bad or missing append_str\n");				break;			    }			    			    switch (rank)			    {				case SERVER_W3XP_CLAN_MEMBER_NEW:					rank_str = "New clan member";					break;				case SERVER_W3XP_CLAN_MEMBER_PEON:					rank_str = "Peon";					break;				case SERVER_W3XP_CLAN_MEMBER_GRUNT:					rank_str = "Grunt";					break;				case SERVER_W3XP_CLAN_MEMBER_SHAMAN:					rank_str = "Shaman";					break;				case SERVER_W3XP_CLAN_MEMBER_CHIEFTAIN:					rank_str = "Chieftain";					break;				default:					rank_str = "";								    }			    switch (online)			    {				case SERVER_W3XP_CLAN_MEMBER_OFFLINE:					online_str = "offline";					break;				case SERVER_W3XP_CLAN_MEMBER_ONLINE:					online_str = "online";					break;				case SERVER_W3XP_CLAN_MEMBER_CHANNEL:					online_str = "in channel";					break;				case SERVER_W3XP_CLAN_MEMBER_GAME:					online_str = "in game";					break;				case SERVER_W3XP_CLAN_MEMBER_PRIVATE_GAME:					online_str = "in private game";					break;				default:					online_str = "";			    }			    			    munge(&client);			    printf("%s %s  is now %s %s\n",rank_str,member,online_str,append_str);			}		    					    case SERVER_STATSREPLY:			if (client.mode==mode_waitstat)			{			    unsigned int names,keys;			    unsigned int match;			    unsigned int strpos;			    char const * temp;			    		            munge(&client);			    			    names = bn_int_get(rpacket->u.server_statsreply.name_count);			    keys  = bn_int_get(rpacket->u.server_statsreply.key_count);			    match = bn_int_get(rpacket->u.server_statsreply.requestid);			    			    if (names!=1 || keys!=4 || match!=statsmatch)				printf("mangled reply (name_count=%u key_count=%u unknown1=%u)\n",				       names,keys,match);			    			    strpos = sizeof(t_server_statsreply);			    if ((temp = packet_get_str_const(rpacket,strpos,256)))			    {				printf(" Sex: ");				ansi_printf(&client,ansi_text_color_yellow,"%s\n",temp);				strpos += strlen(temp)+1;			    }			    if ((temp = packet_get_str_const(rpacket,strpos,256)))			    {				printf(" Age: ");				ansi_printf(&client,ansi_text_color_yellow,"%s\n",temp);				strpos += strlen(temp)+1;			    }			    if ((temp = packet_get_str_const(rpacket,strpos,256)))			    {				printf(" Location: ");				ansi_printf(&client,ansi_text_color_yellow,"%s\n",temp);				strpos += strlen(temp)+1;			    }			    if ((temp = packet_get_str_const(rpacket,strpos,256)))			    {				char   msgtemp[1024];				char * tok;								printf(" Description: \n");				if (client.useansi)				    ansi_text_color_fore(ansi_text_color_yellow);				strncpy(msgtemp,temp,sizeof(msgtemp));				msgtemp[sizeof(msgtemp)-1] = '\0';				for (tok=strtok(msgtemp,"\r\n"); tok; tok=strtok(NULL,"\r\n"))				    printf("  %s\n",tok);				if (client.useansi)				    ansi_text_reset();				strpos += strlen(temp)+1;			    }			    			    if (match==statsmatch)				client.mode = mode_command;			}			break;					    case SERVER_PLAYERINFOREPLY: /* hmm. we didn't ask for one... */			break;					    case SERVER_MESSAGE:			if (packet_get_size(rpacket)<sizeof(t_server_message))			{		            munge(&client);			    printf("Got bad SERVER_MESSAGE packet (expected %u bytes, got %u)",sizeof(t_server_message),packet_get_size(rpacket));			    break;			}						{			    char const * speaker;			    char const * message;			    			    if (!(speaker = packet_get_str_const(rpacket,sizeof(t_server_message),32)))			    {		                munge(&client);				printf("Got SERVER_MESSAGE packet with bad or missing speaker\n");				break;			    }			    if (!(message = packet_get_str_const(rpacket,sizeof(t_server_message)+strlen(speaker)+1,1024)))			    {		                munge(&client);				printf("Got SERVER_MESSAGE packet with bad or missing message (speaker=\"%s\" start=%u len=%u)\n",speaker,sizeof(t_server_message)+strlen(speaker)+1,packet_get_size(rpacket));				break;			    }			    			    switch (bn_int_get(rpacket->u.server_message.type))			    {			    case SERVER_MESSAGE_TYPE_JOIN:		                munge(&client);				ansi_printf(&client,ansi_text_color_green,"\"%s\" %s enters\n",speaker,				            mflags_get_str(bn_int_get(rpacket->u.server_message.flags)));				break;			    case SERVER_MESSAGE_TYPE_CHANNEL:		                munge(&client);				ansi_printf(&client,ansi_text_color_green,"Joining channel :\"%s\" %s\n",message,				            cflags_get_str(bn_int_get(rpacket->u.server_message.flags)));				break;			    case SERVER_MESSAGE_TYPE_ADDUSER:		                munge(&client);				ansi_printf(&client,ansi_text_color_green,"\"%s\" %s is here\n",speaker,				            mflags_get_str(bn_int_get(rpacket->u.server_message.flags)));				break;			    case SERVER_MESSAGE_TYPE_USERFLAGS:				break;			    case SERVER_MESSAGE_TYPE_PART:		                munge(&client);				ansi_printf(&client,ansi_text_color_green,"\"%s\" %s leaves\n",speaker,				            mflags_get_str(bn_int_get(rpacket->u.server_message.flags)));				break;			    case SERVER_MESSAGE_TYPE_WHISPER:		                munge(&client);				ansi_printf(&client,ansi_text_color_blue,"<From: %s>",speaker);				printf(" ");				str_print_term(stdout,message,0,0);				printf("\n");				break;			    case SERVER_MESSAGE_TYPE_WHISPERACK:		                munge(&client);				ansi_printf(&client,ansi_text_color_blue,"<To: %s>",speaker);				printf(" ");				str_print_term(stdout,message,0,0);				printf("\n");				break;			    case SERVER_MESSAGE_TYPE_BROADCAST:		                munge(&client);				ansi_printf(&client,ansi_text_color_yellow,"<Broadcast %s> %s\n",speaker,message);				break;			    case SERVER_MESSAGE_TYPE_ERROR:		                munge(&client);				ansi_printf(&client,ansi_text_color_red,"<Error> %s\n",message);				break;			    case SERVER_MESSAGE_TYPE_INFO:		                munge(&client);				ansi_printf(&client,ansi_text_color_yellow,"<Info> %s\n",message);				break;			    case SERVER_MESSAGE_TYPE_EMOTE:		                munge(&client);				ansi_printf(&client,ansi_text_color_yellow,"<%s %s>\n",speaker,message);				break;			    default:			    case SERVER_MESSAGE_TYPE_TALK:		                munge(&client);				ansi_printf(&client,ansi_text_color_yellow,"<%s>",speaker);				printf(" ");				str_print_term(stdout,message,0,0);				printf("\n");			    }			}			break;					    default:		        munge(&client);			printf("Unsupported server packet type 0x%04x\n",packet_get_type(rpacket));			hexdump(stdout,packet_get_data_const(rpacket,0,packet_get_size(rpacket)),packet_get_size(rpacket));			printf("\n");		    }		    		    client.currsize = 0;		    break;		    		case -1: /* error (probably connection closed) */		default:		    munge(&client);		    printf("----\nConnection closed by server.\n");		    psock_close(client.sd);		    if (client.changed_in)			tcsetattr(client.fd_stdin,TCSAFLUSH,&client.in_attr_old);		    return STATUS_SUCCESS;		}	    }	}    }        /* not reached */}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -