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

📄 message.c

📁 打魔兽战网的都知道他是什么
💻 C
📖 第 1 页 / 共 3 页
字号:
	    {		msgtemp = xmalloc(strlen(newtext)+4);		sprintf(msgtemp,"%s\r\n",newtext);		xfree((void *)newtext); /* avoid warning */	    }	    else	    {		msgtemp = xmalloc(strlen(text)+4);		sprintf(msgtemp,"%s\r\n",text);	    }	}	break;    case message_type_error:	if (!text)	{	    eventlog(eventlog_level_error,__FUNCTION__,"got NULL text for %s",message_type_get_str(type));	    return -1;	}	{	    char const * newtext;	    	    if ((newtext = escape_chars(text,strlen(text))))	    {		msgtemp = xmalloc(8+strlen(newtext)+4);		sprintf(msgtemp,"ERROR: %s\r\n",newtext);		xfree((void *)newtext); /* avoid warning */	    }	    else	    {		msgtemp = xmalloc(8+strlen(text)+4);		sprintf(msgtemp,"ERROR: %s\r\n",text);	    }	}	break;    case message_type_emote:	if (!me)	{	    eventlog(eventlog_level_error,__FUNCTION__,"got NULL connection for %s",message_type_get_str(type));	    return -1;	}	if (!text)	{	    eventlog(eventlog_level_error,__FUNCTION__,"got NULL text for %s",message_type_get_str(type));	    return -1;	}	if (dstflags&MF_X)	    return -1; /* player is ignored */	{	    char const * tname;	    char const * newtext;	    	    tname = conn_get_chatcharname(me, dst);	    if ((newtext = escape_chars(text,strlen(text))))	    {		msgtemp = xmalloc(strlen(tname)+4+strlen(newtext)+4);		sprintf(msgtemp,"<%s %s>\r\n",tname,newtext);		xfree((void *)newtext); /* avoid warning */	    }	    else	    {		msgtemp = xmalloc(strlen(tname)+4+strlen(text)+4);		sprintf(msgtemp,"<%s %s>\r\n",tname,text);	    }	    conn_unget_chatcharname(me,tname);	}	break;    case message_type_mode:	if (!me)	{	    eventlog(eventlog_level_error,__FUNCTION__,"got NULL connection for %s",message_type_get_str(type));	    return -1;	}	{	    char const * tname;	    tname = conn_get_chatcharname(me,dst);	    msgtemp = xmalloc(strlen(tname)+32);	    sprintf(msgtemp,"%s change mode: %s\r\n",tname,text);	    conn_unget_chatcharname(me,tname);	}    default:	eventlog(eventlog_level_error,__FUNCTION__,"got bad message type %d",(int)type);	return -1;    }        {	int retval;		retval = packet_append_ntstring(packet,msgtemp);	xfree(msgtemp);	return retval;    }}static int message_bot_format(t_packet * packet, t_message_type type, t_connection * me, t_connection * dst, char const * text, unsigned int dstflags){    char * msgtemp;    char clienttag_str[5];        if (!packet)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL packet");	return -1;    }        /* special-case the login banner so it doesn't have numbers     * at the start of each line     */    if (me &&        conn_get_state(me)!=conn_state_loggedin &&        conn_get_state(me)!=conn_state_destroy &&        type!=message_type_null) /* this does not apply for NULL messages */    {	if (!text)        {#if 0	    /* battle.net actually sends them during login */	    if (type==message_type_null)	    	return 0; /* don't display null messages during the login */#endif            eventlog(eventlog_level_error,__FUNCTION__,"got NULL text for non-loggedin state");            return -1;        }	msgtemp = xmalloc(strlen(text)+4);        sprintf(msgtemp,"%s\r\n",text);    }    else	switch (type)	{	case message_type_null:	    msgtemp = xmalloc(32);	    sprintf(msgtemp,"%u %s\r\n",EID_NULL,"NULL");	    break;	case message_type_uniqueid: /* FIXME: need to send this for some bots, also needed to support guest accounts */	    if (!text)	    {		eventlog(eventlog_level_error,__FUNCTION__,"got NULL text for %s",message_type_get_str(type));		return -1;	    }	    msgtemp = xmalloc(strlen(text)+32);	    sprintf(msgtemp,"%u %s %s\r\n",EID_UNIQUENAME,"NAME",text);	    break;	case message_type_adduser:	    if (!me)	    {		eventlog(eventlog_level_error,__FUNCTION__,"got NULL connection for %s",message_type_get_str(type));		return -1;	    }	    {		char const * tname;				tname = conn_get_chatcharname(me, dst);		msgtemp = xmalloc(32+strlen(tname)+32);		sprintf(msgtemp,"%u %s %s %04x [%s]\r\n",EID_SHOWUSER,"USER",tname,conn_get_flags(me)|dstflags,tag_uint_to_str(clienttag_str,conn_get_fake_clienttag(me)));		conn_unget_chatcharname(me,tname);	    }	    break;	case message_type_join:	    if (!me)	    {		eventlog(eventlog_level_error,__FUNCTION__,"got NULL connection for %s",message_type_get_str(type));		return -1;	    }	    {		char const * tname;				tname = conn_get_chatcharname(me, dst);		msgtemp = xmalloc(32+strlen(tname)+32);		sprintf(msgtemp,"%u %s %s %04x [%s]\r\n",EID_JOIN,"JOIN",tname,conn_get_flags(me)|dstflags,tag_uint_to_str(clienttag_str,conn_get_fake_clienttag(me)));		conn_unget_chatcharname(me,tname);	    }	    break;	case message_type_part:	    if (!me)	    {		eventlog(eventlog_level_error,__FUNCTION__,"got NULL connection for %s",message_type_get_str(type));		return -1;	    }	    {		char const * tname;				tname = conn_get_chatcharname(me, dst);		msgtemp = xmalloc(32+strlen(tname)+32);		sprintf(msgtemp,"%u %s %s %04x\r\n",EID_LEAVE,"LEAVE",tname,conn_get_flags(me)|dstflags);		conn_unget_chatcharname(me,tname);	    }	    break;	case message_type_whisper:	    if (!text)	    {		eventlog(eventlog_level_error,__FUNCTION__,"got NULL text for %s",message_type_get_str(type));		return -1;	    }	    if (dstflags&MF_X)		return -1; /* player is ignored */	    {		char const * tname;				if (me)		    tname = conn_get_chatcharname(me, dst);		else		    tname = prefs_get_servername();				msgtemp = xmalloc(32+strlen(tname)+32+strlen(text));		sprintf(msgtemp,"%u %s %s %04x \"%s\"\r\n",EID_WHISPER,"WHISPER",tname,me?conn_get_flags(me)|dstflags:dstflags,text);		if (me)		    conn_unget_chatcharname(me,tname);	    }	    break;	case message_type_talk:	    if (!me)	    {		eventlog(eventlog_level_error,__FUNCTION__,"got NULL connection for %s",message_type_get_str(type));		return -1;	    }	    if (!text)	    {		eventlog(eventlog_level_error,__FUNCTION__,"got NULL text for %s",message_type_get_str(type));		return -1;	    }	    if (dstflags&MF_X)		return -1; /* player is ignored */	    {		char const * tname;				tname = conn_get_chatcharname(me, dst);		msgtemp = xmalloc(32+strlen(tname)+32+strlen(text));		sprintf(msgtemp,"%u %s %s %04x \"%s\"\r\n",EID_TALK,"TALK",tname,conn_get_flags(me)|dstflags,text);		conn_unget_chatcharname(me,tname);	    }	    break;	case message_type_broadcast:	    if (!text)	    {		eventlog(eventlog_level_error,__FUNCTION__,"got NULL text for %s",message_type_get_str(type));		return -1;	    }	    if (dstflags&MF_X)		return -1; /* player is ignored */	    msgtemp = xmalloc(32+32+strlen(text));	    sprintf(msgtemp,"%u %s \"%s\"\r\n",EID_BROADCAST,"_",text); /* FIXME: what does this look like on Battle.net? */	    break;	case message_type_channel:	    if (!text)	    {		eventlog(eventlog_level_error,__FUNCTION__,"got NULL text for %s",message_type_get_str(type));		return -1;	    }	    msgtemp = xmalloc(32+strlen(text));	    sprintf(msgtemp,"%u %s \"%s\"\r\n",EID_CHANNEL,"CHANNEL",text);	    break;	case message_type_userflags:	    if (!me)	    {		eventlog(eventlog_level_error,__FUNCTION__,"got NULL connection for %s",message_type_get_str(type));		return -1;	    }	    {		char const * tname;				tname = conn_get_chatcharname(me, dst);		msgtemp = xmalloc(32+strlen(tname)+16);		sprintf(msgtemp,"%u %s %s %04x\r\n",EID_USERFLAGS,"USER",tname,conn_get_flags(me)|dstflags);		conn_unget_chatcharname(me,tname);	    }	    break;	case message_type_whisperack:	    if (!me)	    {		eventlog(eventlog_level_error,__FUNCTION__,"got NULL connection for %s",message_type_get_str(type));		return -1;	    }	    if (!text)	    {		eventlog(eventlog_level_error,__FUNCTION__,"got NULL text for %s",message_type_get_str(type));		return -1;	    }	    {		char const * tname;				tname = conn_get_chatcharname(me, dst);		msgtemp = xmalloc(32+strlen(tname)+32+strlen(text));		sprintf(msgtemp,"%u %s %s %04x \"%s\"\r\n",EID_WHISPERSENT,"WHISPER",tname,conn_get_flags(me)|dstflags,text);		conn_unget_chatcharname(me,tname);	    }	    break;	case message_type_friendwhisperack: // [zap-zero] 20020518	    if (!me)	    {		eventlog(eventlog_level_error,__FUNCTION__,"got NULL connection for %s",message_type_get_str(type));		return -1;	    }	    if (!text)	    {		eventlog(eventlog_level_error,__FUNCTION__,"got NULL text for %s",message_type_get_str(type));		return -1;	    }	    {		msgtemp = xmalloc(32+16+32+strlen(text));		sprintf(msgtemp,"%u %s \"your friends\" %04x \"%s\"\r\n",EID_WHISPERSENT,"WHISPER",conn_get_flags(me)|dstflags,text);	    }	    break;	case message_type_channelfull:	    msgtemp = xmalloc(32);	    sprintf(msgtemp,"%u \r\n",EID_CHANNELFULL); /* FIXME */	    break;	case message_type_channeldoesnotexist:	    msgtemp = xmalloc(32);	    sprintf(msgtemp,"%u \r\n",EID_CHANNELDOESNOTEXIST); /* FIXME */	    break;	case message_type_channelrestricted:	    msgtemp = xmalloc(32);	    sprintf(msgtemp,"%u \r\n",EID_CHANNELRESTRICTED); /* FIXME */	    break;	case message_type_info:	    if (!text)	    {		eventlog(eventlog_level_error,__FUNCTION__,"got NULL text for %s",message_type_get_str(type));		return -1;	    }	    msgtemp = xmalloc(32+16+strlen(text));	    sprintf(msgtemp,"%u %s \"%s\"\r\n",EID_INFO,"INFO",text);	    break;	case message_type_error:	    if (!text)	    {		eventlog(eventlog_level_error,__FUNCTION__,"got NULL text for %s",message_type_get_str(type));		return -1;	    }	    msgtemp = xmalloc(32+16+strlen(text));	    sprintf(msgtemp,"%u %s \"%s\"\r\n",EID_ERROR,"ERROR",text);	    break;	case message_type_emote:	    if (!me)	    {		eventlog(eventlog_level_error,__FUNCTION__,"got NULL connection for %s",message_type_get_str(type));		return -1;	    }	    if (!text)	    {		eventlog(eventlog_level_error,__FUNCTION__,"got NULL text for %s",message_type_get_str(type));		return -1;	    }	    if (dstflags&MF_X)		return -1; /* player is ignored */	    {		char const * tname;				tname = conn_get_chatcharname(me, dst);		msgtemp = xmalloc(32+strlen(tname)+32+strlen(text));		sprintf(msgtemp,"%u %s %s %04x \"%s\"\r\n",EID_EMOTE,"EMOTE",tname,conn_get_flags(me)|dstflags,text);		conn_unget_chatcharname(me,tname);	    }	    break;	default:	    eventlog(eventlog_level_error,__FUNCTION__,"got bad message type %d",(int)type);	    return -1;	}        if (strlen(msgtemp)>MAX_MESSAGE_LEN)	msgtemp[MAX_MESSAGE_LEN] = '\0'; /* now truncate to max size */        {	int retval;		retval = packet_append_ntstring(packet,msgtemp);	xfree(msgtemp);	return retval;    }}static int message_bnet_format(t_packet * packet, t_message_type type, t_connection * me, t_connection * dst, char const * text, unsigned int dstflags){    if (!packet)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL packet");	return -1;    }        if (text && text[0]=='\0')        text = " "; /* empty messages crash some clients, just send whitespace */        packet_set_size(packet,sizeof(t_server_message));    packet_set_type(packet,SERVER_MESSAGE);    bn_int_set(&packet->u.server_message.player_ip,SERVER_MESSAGE_PLAYER_IP_DUMMY);    bn_int_nset(&packet->u.server_message.account_num,SERVER_MESSAGE_ACCOUNT_NUM);    bn_int_set(&packet->u.server_message.reg_auth,SERVER_MESSAGE_REG_AUTH);      switch (type)    {    case message_type_adduser:	if (!me)	{	    eventlog(eventlog_level_error,__FUNCTION__,"got NULL connection for %s",message_type_get_str(type));	    return -1;	}        bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_ADDUSER);		bn_int_set(&packet->u.server_message.flags,conn_get_flags(me)|dstflags);		bn_int_set(&packet->u.server_message.latency,conn_get_latency(me));	{	    char const * tname;	    char const * playerinfo;	    	    tname = conn_get_chatcharname(me, dst);	    packet_append_string(packet,tname);	    conn_unget_chatcharname(me,tname);	    if ((conn_get_clienttag(me) == CLIENTTAG_WARCRAFT3_UINT) || (conn_get_clienttag(me) == CLIENTTAG_WAR3XP_UINT))		playerinfo = conn_get_w3_playerinfo(me);	    else playerinfo = conn_get_playerinfo(me);	    	    if (playerinfo == NULL) { playerinfo = ""; }	    packet_append_string(packet,playerinfo);	}	break;    case message_type_join:	if (!me)	{	    eventlog(eventlog_level_error,__FUNCTION__,"got NULL connection for %s",message_type_get_str(type));	    return -1;	}        bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_JOIN);	bn_int_set(&packet->u.server_message.flags,conn_get_flags(me)|dstflags); 	bn_int_set(&packet->u.server_message.latency,conn_get_latency(me));	{	    char const * tname;	    char const * playerinfo;	    	    tname = conn_get_chatcharname(me, dst);	    packet_append_string(packet,tname);	    conn_unget_chatcharname(me,tname);	    	    if ((conn_get_clienttag(me) == CLIENTTAG_WARCRAFT3_UINT) || (conn_get_clienttag(me) == CLIENTTAG_WAR3XP_UINT))		playerinfo = conn_get_w3_playerinfo(me);	    else playerinfo = conn_get_playerinfo(me);	    	    if (playerinfo == NULL) { playerinfo = ""; }	    packet_append_string(packet, playerinfo);	}	break;    case message_type_part:	if (!me)	{	    eventlog(eventlog_level_error,__FUNCTION__,"got NULL connection for %s",message_type_get_str(type));	    return -1;	}        bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_PART);	bn_int_set(&packet->u.server_message.flags,conn_get_flags(me)|dstflags);	bn_int_set(&packet->u.server_message.latency,conn_get_latency(me));	{	    char const * tname;	    	    tname = conn_get_chatcharname(me, dst);	    packet_append_string(packet,tname);	    conn_unget_chatcharname(me,tname);	    packet_append_string(packet,"");	}	break;    case message_type_whisper:	if (!text)	{	    eventlog(eventlog_level_error,__FUNCTION__,"got NULL text for %s",message_type_get_str(type));	    return -1;	}	if (dstflags&MF_X)	    return -1; /* player is ignored */        bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_WHISPER);	bn_int_set(&packet->u.server_message.flags,me?conn_get_flags(me)|dstflags:dstflags);	bn_int_set(&packet->u.server_message.latency,me?conn_get_latency(me):0);		if (me)	{	    char const * tname;	    	    tname = conn_get_chatcharname(me, dst);	    packet_append_string(packet,tname);	    conn_unget_chatcharname(me,tname);	}	else	packet_append_string(packet,prefs_get_servername());		        packet_append_string(packet,text);		break;    case message_type_talk:	if (!me)	{	    eventlog(eventlog_level_error,__FUNCTION__,"got NULL connection for %s",message_type_get_str(type));	    return -1;	}	if (!text)	{	    eventlog(eventlog_level_error,__FUNCTION__,"got NULL text for %s",message_type_get_str(type));	    return -1;	}	if (dstflags&MF_X)	    return -1; /* player is ignored */        bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_TALK);	bn_int_set(&packet->u.server_message.flags,conn_get_flags(me)|dstflags);	bn_int_set(&packet->u.server_message.latency,conn_get_latency(me));	{	    char const * tname;	    	    tname = conn_get_chatcharname(me, dst);	    packet_append_string(packet,tname);	    conn_unget_chatcharname(me,tname);	    packet_append_string(packet,text);	}	break;    case message_type_broadcast:	if (!text)	{	    eventlog(eventlog_level_error,__FUNCTION__,"got NULL text for %s",message_type_get_str(type));	    return -1;	}	if (dstflags&MF_X)	    return -1; /* player is ignored */        bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_BROADCAST);	bn_int_set(&packet->u.server_message.flags,conn_get_flags(me)|dstflags);	bn_int_set(&packet->u.server_message.latency,conn_get_latency(me));	{	    char const * tname;	    	    tname = conn_get_chatcharname(me, dst);	    packet_append_string(packet,tname);	    conn_unget_chatcharname(me,tname);	    packet_append_string(packet,text);	}	break;    case message_type_channel:	if (!me)	{	    eventlog(eventlog_level_error,__FUNCTION__,"got NULL connection for %s",message_type_get_str(type));	    return -1;	}	if (!text)	{	    eventlog(eventlog_level_error,__FUNCTION__,"got NULL text for %s",message_type_get_str(type));	    return -1;	}        bn_int_set(&packet->u.server_message.type,SERVER_MESSAGE_TYPE_CHANNEL);	{	    t_channel const * channel;	    	    if (!(channel = conn_get_channel(me)))

⌨️ 快捷键说明

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