Exemplo n.º 1
0
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;
    
    if (!packet)
    {
	eventlog(eventlog_level_error,"message_bot_format","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,"message_bot_format","got NULL text for non-loggedin state");
            return -1;
        }
	if (!(msgtemp = malloc(strlen(text)+4)))
	{
	    eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp");
	    return -1;
	}
        sprintf(msgtemp,"%s\r\n",text);
    }
    else
	switch (type)
	{
	case message_type_null:
	    if (!(msgtemp = malloc(32)))
	    {
		eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp");
		return -1;
	    }
	    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,"message_bot_format","got NULL text for %s",message_type_get_str(type));
		return -1;
	    }
	    if (!(msgtemp = malloc(strlen(text)+32)))
	    {
		eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp");
		return -1;
	    }
	    sprintf(msgtemp,"%u %s %s\r\n",EID_UNIQUENAME,"NAME",text);
	    break;
	case message_type_adduser:
	    if (!me)
	    {
			eventlog(eventlog_level_error,"message_bot_format","got NULL connection for %s",message_type_get_str(type));
			return -1;
	    }
	    {
		char const * tname;
		
		if(!(tname = conn_get_chatcharname(me, dst)))
			return -1;
		if (!(msgtemp = malloc(32+strlen(tname)+32)))
		{
		    eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp");
		    return -1;
		}
		sprintf(msgtemp,"%u %s %s %04x [%s]\r\n",EID_SHOWUSER,"USER",tname,conn_get_flags(me)|dstflags,conn_get_fake_clienttag(me));
		conn_unget_chatcharname(me,tname);
	    }
	    break;
	case message_type_join:
	    if (!me)
	    {
			eventlog(eventlog_level_error,"message_bot_format","got NULL connection for %s",message_type_get_str(type));
			return -1;
	    }
	    {
		char const * tname;
		
		if(!(tname = conn_get_chatcharname(me, dst)))
			return -1;
		if (!(msgtemp = malloc(32+strlen(tname)+32)))
		{
		    eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp");
		    return -1;
		}
		sprintf(msgtemp,"%u %s %s %04x [%s]\r\n",EID_JOIN,"JOIN",tname,conn_get_flags(me)|dstflags,conn_get_fake_clienttag(me));
		conn_unget_chatcharname(me,tname);
	    }
	    break;
	case message_type_part:
	    if (!me)
	    {
			eventlog(eventlog_level_error,"message_bot_format","got NULL connection for %s",message_type_get_str(type));
			return -1;
	    }
	    {
		char const * tname;
		
		if(!(tname = conn_get_chatcharname(me, dst)))
			return -1;
		if (!(msgtemp = malloc(32+strlen(tname)+32)))
		{
		    eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp");
		    return -1;
		}
		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 (!me)
	    {
		eventlog(eventlog_level_error,"message_bot_format","got NULL connection for %s",message_type_get_str(type));
		return -1;
	    }
	    if (!text)
	    {
		eventlog(eventlog_level_error,"message_bot_format","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(!(tname = conn_get_chatcharname(me, dst)))
			return -1;
		if (!(msgtemp = malloc(32+strlen(tname)+32+strlen(text))))
		{
		    eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp");
		    return -1;
		}
		sprintf(msgtemp,"%u %s %s %04x \"%s\"\r\n",EID_WHISPER,"WHISPER",tname,conn_get_flags(me)|dstflags,text);
		conn_unget_chatcharname(me,tname);
	    }
	    break;
	case message_type_talk:
	    if (!me)
	    {
		eventlog(eventlog_level_error,"message_bot_format","got NULL connection for %s",message_type_get_str(type));
		return -1;
	    }
	    if (!text)
	    {
		eventlog(eventlog_level_error,"message_bot_format","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(!(tname = conn_get_chatcharname(me, me))) /* FIXME: second should be dst but cache gets in the way */
			return -1;
		if (!(msgtemp = malloc(32+strlen(tname)+32+strlen(text))))
		{
		    eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp");
		    return -1;
		}
		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,"message_bot_format","got NULL text for %s",message_type_get_str(type));
		return -1;
	    }
	    if (dstflags&MF_X)
		return -1; /* player is ignored */
	    if (!(msgtemp = malloc(32+32+strlen(text))))
	    {
		eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp");
		return -1;
	    }
	    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,"message_bot_format","got NULL text for %s",message_type_get_str(type));
			return -1;
	    }
	    if (!(msgtemp = malloc(32+strlen(text))))
	    {
			eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp");
			return -1;
	    }
	    sprintf(msgtemp,"%u %s \"%s\"\r\n",EID_CHANNEL,"CHANNEL",text);
	    break;
	case message_type_userflags:
	    if (!me)
	    {
			eventlog(eventlog_level_error,"message_bot_format","got NULL connection for %s",message_type_get_str(type));
			return -1;
	    }
	    {
		char const * tname;
		
		if(!(tname = conn_get_chatcharname(me, dst)))
			return -1;
		if (!(msgtemp = malloc(32+strlen(tname)+16)))
		{
		    eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp");
		    return -1;
		}
		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,"message_bot_format","got NULL connection for %s",message_type_get_str(type));
			return -1;
	    }
	    if (!text)
	    {
			eventlog(eventlog_level_error,"message_bot_format","got NULL text for %s",message_type_get_str(type));
			return -1;
	    }
	    {
		char const * tname;
		
		if(!(tname = conn_get_chatcharname(me, dst)))
			return -1;
		if (!(msgtemp = malloc(32+strlen(tname)+32+strlen(text))))
		{
		    eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp");
		    return -1;
		}
		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_channelfull:
	    if (!(msgtemp = malloc(32)))
	    {
		eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp");
		return -1;
	    }
	    sprintf(msgtemp,"%u \r\n",EID_CHANNELFULL); /* FIXME */
	    break;
	case message_type_channeldoesnotexist:
	    if (!(msgtemp = malloc(32)))
	    {
		eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp");
		return -1;
	    }
	    sprintf(msgtemp,"%u \r\n",EID_CHANNELDOESNOTEXIST); /* FIXME */
	    break;
	case message_type_channelrestricted:
	    if (!(msgtemp = malloc(32)))
	    {
		eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp");
		return -1;
	    }
	    sprintf(msgtemp,"%u \r\n",EID_CHANNELRESTRICTED); /* FIXME */
	    break;
	case message_type_info:
	    if (!text)
	    {
		eventlog(eventlog_level_error,"message_bot_format","got NULL text for %s",message_type_get_str(type));
		return -1;
	    }
	    if (!(msgtemp = malloc(32+16+strlen(text))))
	    {
		eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp");
		return -1;
	    }
	    sprintf(msgtemp,"%u %s \"%s\"\r\n",EID_INFO,"INFO",text);
	    break;
	case message_type_error:
	    if (!text)
	    {
		eventlog(eventlog_level_error,"message_bot_format","got NULL text for %s",message_type_get_str(type));
		return -1;
	    }
	    if (!(msgtemp = malloc(32+16+strlen(text))))
	    {
		eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp");
		return -1;
	    }
	    sprintf(msgtemp,"%u %s \"%s\"\r\n",EID_ERROR,"ERROR",text);
	    break;
	case message_type_emote:
	    if (!me)
	    {
			eventlog(eventlog_level_error,"message_bot_format","got NULL connection for %s",message_type_get_str(type));
			return -1;
	    }
	    if (!text)
	    {
			eventlog(eventlog_level_error,"message_bot_format","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(!(tname = conn_get_chatcharname(me, me))) /* FIXME: second should be dst but cache gets in the way */
			return -1;
		if (!(msgtemp = malloc(32+strlen(tname)+32+strlen(text))))
		{
		    eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp");
		    return -1;
		}
		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,"message_bot_format","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 */
	msgtemp[MAX_MESSAGE_LEN-1] = '\n'; /* and add EOL signs - message have to be send properly */
	msgtemp[MAX_MESSAGE_LEN-2] = '\r';
    }

    {
	int retval;
	
	retval = packet_append_ntstring(packet,msgtemp);
	free(msgtemp);
	return retval;
    }
}
Exemplo n.º 2
0
extern int handle_bot_packet(t_connection * c, t_packet const * const packet)
{
    t_packet * rpacket;
    
    if (!c)
    {
	eventlog(eventlog_level_error,__FUNCTION__,"[%d] got NULL connection",conn_get_socket(c));
	return -1;
    }
    if (!packet)
    {
	eventlog(eventlog_level_error,__FUNCTION__,"[%d] got NULL packet",conn_get_socket(c));
	return -1;
    }
    if (packet_get_class(packet)!=packet_class_raw)
    {
        eventlog(eventlog_level_error,__FUNCTION__,"[%d] got bad packet (class %d)",conn_get_socket(c),(int)packet_get_class(packet));
        return -1;
    }
    
    {
	char const * const linestr=packet_get_str_const(packet,0,MAX_MESSAGE_LEN);
	
	if (packet_get_size(packet)<2) /* empty line */
	    return 0;
	if (!linestr)
	{
	    eventlog(eventlog_level_warn,__FUNCTION__,"[%d] line too long",conn_get_socket(c));
	    return 0;
	}
	
	switch (conn_get_state(c))
	{
	case conn_state_connected:
	    conn_add_flags(c,MF_PLUG);
	    conn_set_clienttag(c,CLIENTTAG_BNCHATBOT_UINT);
	    
	    {
		char const * temp=linestr;
		
		if (temp[0]=='\004') /* FIXME: no echo, ignore for now (we always do no echo) */
		    temp = &temp[1];
		
		if (temp[0]=='\0') /* empty line */
		{
		    conn_set_state(c,conn_state_bot_username); /* don't look for ^D or reset tag and flags */
		    break;
		}
		
		conn_set_state(c,conn_state_bot_password);
		
		if (conn_set_loggeduser(c,temp)<0)
		    eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not set username to \"%s\"",conn_get_socket(c),temp);
		
		{
		    char const * const msg="\r\nPassword: "******"[%d] could not create rpacket",conn_get_socket(c));
			break;
		    }
#if 1 /* don't echo */
		    packet_append_ntstring(rpacket,conn_get_loggeduser(c));
#endif
		    packet_append_ntstring(rpacket,msg);
		    conn_push_outqueue(c,rpacket);
		    packet_del_ref(rpacket);
		}
	    }
	    break;
	    
	case conn_state_bot_username:
	    conn_set_state(c,conn_state_bot_password);
	    
	    if (conn_set_loggeduser(c,linestr)<0)
		eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not set username to \"%s\"",conn_get_socket(c),linestr);
	    
	    {
		char const * const temp="\r\nPassword: "******"[%d] could not create rpacket",conn_get_socket(c));
		    break;
		}
#if 1 /* don't echo */
		packet_append_ntstring(rpacket,linestr);
#endif
		packet_append_ntstring(rpacket,temp);
		conn_push_outqueue(c,rpacket);
		packet_del_ref(rpacket);
	    }
	    break;
	    
	case conn_state_bot_password:
	    {
		char const * const tempa="\r\nLogin failed.\r\n\r\nUsername: "******"\r\nAccount has no bot access.\r\n\r\nUsername: "******"[%d] could not create rpacket",conn_get_socket(c));
			break;
		    }
		    
		    packet_append_ntstring(rpacket,tempa);
		    conn_push_outqueue(c,rpacket);
		    packet_del_ref(rpacket);
		    break;
		}
		if (connlist_find_connection_by_accountname(loggeduser))
		{
		    eventlog(eventlog_level_info,__FUNCTION__,"[%d] bot login for \"%s\" refused (already logged in)",conn_get_socket(c),loggeduser);
		    conn_set_state(c,conn_state_bot_username);
		    
		    if (!(rpacket = packet_create(packet_class_raw)))
		    {
			eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c));
			break;
		    }
		    
		    packet_append_ntstring(rpacket,tempa);
		    conn_push_outqueue(c,rpacket);
		    packet_del_ref(rpacket);
		    break;
		}
		if (!(account = accountlist_find_account(loggeduser)))
		{
			eventlog(eventlog_level_info,__FUNCTION__,"[%d] bot login for \"%s\" refused (bad account)",conn_get_socket(c),loggeduser);
			conn_set_state(c,conn_state_bot_username);
			
			if (!(rpacket = packet_create(packet_class_raw)))
			{
			    eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c));
			    break;
			}
			
			packet_append_ntstring(rpacket,tempa);
			conn_push_outqueue(c,rpacket);
			packet_del_ref(rpacket);
		    break;
		}
		if ((oldstrhash1 = account_get_pass(account)))
		{
		    if (hash_set_str(&oldpasshash1,oldstrhash1)<0)
		    {
			eventlog(eventlog_level_info,__FUNCTION__,"[%d] bot login for \"%s\" refused (corrupted passhash1?)",conn_get_socket(c),loggeduser);
			conn_set_state(c,conn_state_bot_username);
			
			if (!(rpacket = packet_create(packet_class_raw)))
			{
			    eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c));
			    break;
			}
			
			packet_append_ntstring(rpacket,tempa);
			conn_push_outqueue(c,rpacket);
			packet_del_ref(rpacket);
			break;
		    }

                    testpass = xstrdup(linestr);
		    {
			unsigned int i;
			
			for (i=0; i<strlen(testpass); i++)
			    if (isupper((int)testpass[i]))
				testpass[i] = tolower((int)testpass[i]);
		    }
		    if (bnet_hash(&trypasshash1,strlen(testpass),testpass)<0) /* FIXME: force to lowercase */
		    {
			eventlog(eventlog_level_info,__FUNCTION__,"[%d] bot login for \"%s\" refused (unable to hash password)",conn_get_socket(c), loggeduser);
			conn_set_state(c,conn_state_bot_username);

			xfree((void *)testpass);
			
			if (!(rpacket = packet_create(packet_class_raw)))
			{
			    eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c));
			    break;
			}
			
			packet_append_ntstring(rpacket,tempa);
			conn_push_outqueue(c,rpacket);
			packet_del_ref(rpacket);
			break;
		    }
		    xfree((void *)testpass);
		    if (hash_eq(trypasshash1,oldpasshash1)!=1)
		    {
			eventlog(eventlog_level_info,__FUNCTION__,"[%d] bot login for \"%s\" refused (wrong password)",conn_get_socket(c), loggeduser);
			conn_set_state(c,conn_state_bot_username);
			
			if (!(rpacket = packet_create(packet_class_raw)))
			{
			    eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c));
			    break;
			}
			
			packet_append_ntstring(rpacket,tempa);
			conn_push_outqueue(c,rpacket);
			packet_del_ref(rpacket);
			break;
		    }
		    
		    
		    if (account_get_auth_botlogin(account)!=1) /* default to false */
		    {
			eventlog(eventlog_level_info,__FUNCTION__,"[%d] bot login for \"%s\" refused (no bot access)",conn_get_socket(c), loggeduser);
			conn_set_state(c,conn_state_bot_username);
			
			if (!(rpacket = packet_create(packet_class_raw)))
			{
			    eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c));
			    break;
			}
			
			packet_append_ntstring(rpacket,tempb);
			conn_push_outqueue(c,rpacket);
			packet_del_ref(rpacket);
			break;
		    }
		    else if (account_get_auth_lock(account)==1) /* default to false */
		    {
			eventlog(eventlog_level_info,__FUNCTION__,"[%d] bot login for \"%s\" refused (this account is locked)",conn_get_socket(c), loggeduser);
			conn_set_state(c,conn_state_bot_username);
			
			if (!(rpacket = packet_create(packet_class_raw)))
			{
			    eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c));
			    break;
			}
			
			packet_append_ntstring(rpacket,tempb);
			conn_push_outqueue(c,rpacket);
			packet_del_ref(rpacket);
			break;
		    }
		    
		    eventlog(eventlog_level_info,__FUNCTION__,"[%d] \"%s\" bot logged in (correct password)",conn_get_socket(c), loggeduser);
		}
		else
		{
		    eventlog(eventlog_level_info,__FUNCTION__,"[%d] \"%s\" bot logged in (no password)",conn_get_socket(c), loggeduser);
		}
		    if (!(rpacket = packet_create(packet_class_raw))) /* if we got this far, let them log in even if this fails */
			eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c));
		    else
		    {
			packet_append_ntstring(rpacket,"\r\n");
			conn_push_outqueue(c,rpacket);
			packet_del_ref(rpacket);
		    }

			bnetd_log(loggeduser, addr_num_to_ip_str(conn_get_addr(c)), "BOT", "LOGIN", NULL, 1, 0);
		    conn_login(c,account,loggeduser);

		    message_send_text(c,message_type_uniqueid,c,loggeduser);
		    		    
		    if (conn_set_channel(c,CHANNEL_NAME_CHAT)<0)
			conn_set_channel(c,CHANNEL_NAME_BANNED); /* should not fail */
	    }
	    break;
	    
	case conn_state_loggedin:
	    {
		t_channel const * channel;
		
		conn_set_idletime(c);
		
		if ((channel = conn_get_channel(c)))
		    channel_message_log(channel,c,1,linestr);
		/* we don't log game commands currently */
		
		if (linestr[0]=='/')
		    handle_command(c,linestr);
		else
		    if (channel && !conn_quota_exceeded(c,linestr))
			channel_message_send(channel,message_type_talk,c,linestr);
		    /* else discard */
	    }
	    break;
	    
	default:
	    eventlog(eventlog_level_error,__FUNCTION__,"[%d] unknown bot connection state %d",conn_get_socket(c),(int)conn_get_state(c));
	}
    }
    
    return 0;
}
Exemplo n.º 3
0
static int message_telnet_format(t_packet * packet, t_message_type type, t_connection * me, t_connection * dst, char const * text, unsigned int dstflags)
{
    char * msgtemp;
    
    if (!packet)
    {
	eventlog(eventlog_level_error,"message_telnet_format","got NULL packet");
	return -1;
    }
    
    switch (type)
    {
    case message_type_uniqueid:
	if (!text)
	{
	    eventlog(eventlog_level_error,"message_telnet_format","got NULL text for %s",message_type_get_str(type));
	    return -1;
	}
	if (!(msgtemp = malloc(strlen(text)+32)))
	{
	    eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
	    return -1;
	}
        sprintf(msgtemp,"Your unique name: %s\r\n",text);
	break;
    case message_type_adduser:
	if (!me)
	{
	    eventlog(eventlog_level_error,"message_telnet_format","got NULL connection for %s",message_type_get_str(type));
	    return -1;
	}
	{
	    char const * tname;
	    
	    if(!(tname = conn_get_chatcharname(me, dst)))
	    	return -1;
	    if (!(msgtemp = malloc(strlen(tname)+32)))
	    {
			eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
			return -1;
	    }
	    sprintf(msgtemp,"[%s is here]\r\n",tname);
	    conn_unget_chatcharname(me,tname);
	}
	break;
    case message_type_join:
	if (!me)
	{
	    eventlog(eventlog_level_error,"message_telnet_format","got NULL connection for %s",message_type_get_str(type));
	    return -1;
	}
	{
	    char const * tname;
	    
	    if(!(tname = conn_get_chatcharname(me, dst)))
	    	return -1;
	    if (!(msgtemp = malloc(strlen(tname)+32)))
	    {
			eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
			return -1;
	    }
	    sprintf(msgtemp,"[%s enters]\r\n",tname);
	    conn_unget_chatcharname(me,tname);
	}
	break;
    case message_type_part:
	if (!me)
	{
	    eventlog(eventlog_level_error,"message_telnet_format","got NULL connection for %s",message_type_get_str(type));
	    return -1;
	}
	{
	    char const * tname;
	    
	    if(!(tname = conn_get_chatcharname(me, dst)))
	    	return -1;
	    if(!(msgtemp = malloc(strlen(tname)+32)))
	    {
			eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
			return -1;
	    }
	    sprintf(msgtemp,"[%s leaves]\r\n",tname);
	    conn_unget_chatcharname(me,tname);
	}
	break;
    case message_type_whisper:
	if (!me)
	{
	    eventlog(eventlog_level_error,"message_telnet_format","got NULL connection for %s",message_type_get_str(type));
	    return -1;
	}
	if (!text)
	{
	    eventlog(eventlog_level_error,"message_telnet_format","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;
	    
	    if(!(tname = conn_get_chatcharname(me, dst)))
	    	return -1;
	    if((newtext = escape_chars(text,strlen(text))))
	    {
			if (!(msgtemp = malloc(strlen(tname)+8+strlen(newtext)+4)))
			{
			    eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
		    	free((void *)newtext); /* avoid warning */
			    return -1;
			}
			sprintf(msgtemp,"<from %s> %s\r\n",tname,newtext);
			free((void *)newtext); /* avoid warning */
	    }
	    else
	    {
			if (!(msgtemp = malloc(16+strlen(tname))))
			{
			    eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
		    	return -1;
			}
			sprintf(msgtemp,"<from %s> \r\n",tname);
	    }
	    conn_unget_chatcharname(me,tname);
	}
	break;
    case message_type_talk:
	if (!me)
	{
	    eventlog(eventlog_level_error,"message_telnet_format","got NULL connection for %s",message_type_get_str(type));
	    return -1;
	}
	if (!text)
	{
	    eventlog(eventlog_level_error,"message_telnet_format","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;
	    
	    if(!(tname = conn_get_chatcharname(me, me))) /* FIXME: second should be dst but cache gets in the way */
	    	return -1;
	    if((newtext = escape_chars(text,strlen(text))))
	    {
		if (!(msgtemp = malloc(strlen(tname)+4+strlen(newtext)+4)))
		{
		    eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
		    return -1;
		}
		sprintf(msgtemp,"<%s> %s\r\n",tname,newtext);
		free((void *)newtext); /* avoid warning */
	    }
	    else
	    {
		if (!(msgtemp = malloc(strlen(tname)+8)))
		{
		    eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
		    return -1;
		}
		sprintf(msgtemp,"<%s> \r\n",tname);
	    }
	    conn_unget_chatcharname(me,tname);
	}
	break;
    case message_type_broadcast:
	if (!text)
	{
	    eventlog(eventlog_level_error,"message_telnet_format","got NULL text for %s",message_type_get_str(type));
	    return -1;
	}
	if (dstflags&MF_X)
	    return -1; /* player is ignored */
	{
	    char const * newtext;
	    
	    if ((newtext = escape_chars(text,strlen(text))))
	    {
		if (!(msgtemp = malloc(16+strlen(newtext)+4)))
		{
		    eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
		    return -1;
		}
		sprintf(msgtemp,"Broadcast: %s\r\n",newtext); /* FIXME: show source? */
		free((void *)newtext); /* avoid warning */
	    }
	    else
	    {
		if (!(msgtemp = malloc(16)))
		{
		    eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
		    return -1;
		}
		sprintf(msgtemp,"Broadcast: \r\n"); /* FIXME: show source? */
	    }
	}
	break;
    case message_type_channel:
	if (!text)
	{
	    eventlog(eventlog_level_error,"message_telnet_format","got NULL text for %s",message_type_get_str(type));
	    return -1;
	}
	if (!(msgtemp = malloc(strlen(text)+32)))
	{
	    eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
	    return -1;
	}
	sprintf(msgtemp,"Joining channel: \"%s\"\r\n",text);
	break;
    case message_type_userflags:
	if (!me)
	{
	    eventlog(eventlog_level_error,"message_telnet_format","got NULL connection for %s",message_type_get_str(type));
	    return -1;
	}
	/* FIXME: should we show any of these? */
	if (!(msgtemp = strdup("")))
	{
	    eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
	    return -1;
	}
	break;
    case message_type_whisperack:
	if (!me)
	{
	    eventlog(eventlog_level_error,"message_telnet_format","got NULL connection for %s",message_type_get_str(type));
	    return -1;
	}
	if (!text)
	{
	    eventlog(eventlog_level_error,"message_telnet_format","got NULL text for %s",message_type_get_str(type));
	    return -1;
	}
	{
	    char const * tname;
	    char const * newtext;
	    
	    if(!(tname = conn_get_chatcharname(me, dst)))
	    	return -1;
	    if ((newtext = escape_chars(text,strlen(text))))
	    {
		if (!(msgtemp = malloc(strlen(tname)+8+strlen(newtext)+4)))
		{
		    eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
		    return -1;
		}
		sprintf(msgtemp,"<to %s> %s\r\n",tname,newtext);
		free((void *)newtext); /* avoid warning */
	    }
	    else
	    {
		if (!(msgtemp = malloc(strlen(tname)+8+strlen(text)+4)))
		{
		    eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
		    return -1;
		}
		sprintf(msgtemp,"<to %s> %s\r\n",tname,text);
	    }
	    conn_unget_chatcharname(me,tname);
	}
	break;
    case message_type_channelfull:
	/* FIXME */
	if (!(msgtemp = strdup("")))
	{
	    eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
	    return -1;
	}
	break;
    case message_type_channeldoesnotexist:
	/* FIXME */
	if (!(msgtemp = strdup("")))
	{
	    eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
	    return -1;
	}
	break;
    case message_type_channelrestricted:
	/* FIXME */
	if (!(msgtemp = strdup("")))
	{
	    eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
	    return -1;
	}
	break;
    case message_type_info:
	if (!text)
	{
	    eventlog(eventlog_level_error,"message_telnet_format","got NULL text for %s",message_type_get_str(type));
	    return -1;
	}
	{
	    char const * newtext;
	    
	    if ((newtext = escape_chars(text,strlen(text))))
	    {
		if (!(msgtemp = malloc(strlen(newtext)+4)))
		{
		    eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
		    return -1;
		}
		sprintf(msgtemp,"%s\r\n",newtext);
		free((void *)newtext); /* avoid warning */
	    }
	    else
	    {
		if (!(msgtemp = malloc(strlen(text)+4)))
		{
		    eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
		    return -1;
		}
		sprintf(msgtemp,"%s\r\n",text);
	    }
	}
	break;
    case message_type_error:
	if (!text)
	{
	    eventlog(eventlog_level_error,"message_telnet_format","got NULL text for %s",message_type_get_str(type));
	    return -1;
	}
	{
	    char const * newtext;
	    
	    if ((newtext = escape_chars(text,strlen(text))))
	    {
		if (!(msgtemp = malloc(8+strlen(newtext)+4)))
		{
		    eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
		    return -1;
		}
		sprintf(msgtemp,"ERROR: %s\r\n",newtext);
		free((void *)newtext); /* avoid warning */
	    }
	    else
	    {
		if (!(msgtemp = malloc(8+strlen(text)+4)))
		{
		    eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
		    return -1;
		}
		sprintf(msgtemp,"ERROR: %s\r\n",text);
	    }
	}
	break;
    case message_type_emote:
	if (!me)
	{
	    eventlog(eventlog_level_error,"message_telnet_format","got NULL connection for %s",message_type_get_str(type));
	    return -1;
	}
	if (!text)
	{
	    eventlog(eventlog_level_error,"message_telnet_format","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;
	    
	    if(!(tname = conn_get_chatcharname(me, me))) /* FIXME: second should be dst but cache gets in the way */
	    	return -1;
	    if ((newtext = escape_chars(text,strlen(text))))
	    {
		if (!(msgtemp = malloc(strlen(tname)+4+strlen(newtext)+4)))
		{
		    eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
		    return -1;
		}
		sprintf(msgtemp,"<%s %s>\r\n",tname,newtext);
		free((void *)newtext); /* avoid warning */
	    }
	    else
	    {
		if (!(msgtemp = malloc(strlen(tname)+4+strlen(text)+4)))
		{
		    eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp");
		    return -1;
		}
		sprintf(msgtemp,"<%s %s>\r\n",tname,text);
	    }
	    conn_unget_chatcharname(me,tname);
	}
	break;
    default:
	eventlog(eventlog_level_error,"message_telnet_format","got bad message type %d",(int)type);
	return -1;
    }
    
    {
	int retval;
	
	retval = packet_append_ntstring(packet,msgtemp);
	free(msgtemp);
	return retval;
    }
}