📄 message.c
字号:
{ 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 + -