From 46482992c45c892a6e4e8fbd3a07d9cf53cfe99a Mon Sep 17 00:00:00 2001 From: pandaemonium <pandae@pvpgn.org> Date: Sun, 5 Aug 2007 17:56:45 +0000 Subject: [PATCH] make sure all ways to join a channel trigger a namesreply --- pvpgn/src/bnetd/handle_irc.cpp | 2 -- pvpgn/src/bnetd/handle_wol.cpp | 14 ++------- pvpgn/src/bnetd/irc.cpp | 57 +++++++++++++++++++++------------- pvpgn/src/bnetd/message.cpp | 20 +++++++++--- 4 files changed, 54 insertions(+), 39 deletions(-) diff --git a/pvpgn/src/bnetd/handle_irc.cpp b/pvpgn/src/bnetd/handle_irc.cpp index 1503c37..669eb15 100644 --- a/pvpgn/src/bnetd/handle_irc.cpp +++ b/pvpgn/src/bnetd/handle_irc.cpp @@ -795,8 +795,6 @@ static int _handle_join_command(t_connection * conn, int numparams, char ** para irc_send(conn,RPL_NOTOPIC,":No topic is set"); irc_send_rpl_namreply(conn,channel); - irc_send(conn,RPL_ENDOFNAMES,":End of NAMES list"); - } } } diff --git a/pvpgn/src/bnetd/handle_wol.cpp b/pvpgn/src/bnetd/handle_wol.cpp index f73b96b..2c4a7b6 100644 --- a/pvpgn/src/bnetd/handle_wol.cpp +++ b/pvpgn/src/bnetd/handle_wol.cpp @@ -880,10 +880,10 @@ static int _handle_quit_command(t_connection * conn, int numparams, char ** para static int _handle_part_command(t_connection * conn, int numparams, char ** params, char * text) { - if ((conn_wol_get_ingame(conn) == 1)) { - conn_wol_set_ingame(conn,0); + if ((conn_wol_get_ingame(conn) == 1)) { + conn_wol_set_ingame(conn,0); } - conn_set_channel(conn, NULL); /* In WOL we disconecting from the channel */ + conn_set_channel(conn, NULL); return 0; } @@ -1304,10 +1304,6 @@ static int _handle_joingame_command(t_connection * conn, int numparams, char ** irc_send_rpl_namreply(conn,channel); - if ((std::strlen(wolname)+1+std::strlen(":End of NAMES list")+1)<MAX_IRC_MESSAGE_LEN) { - snprintf(temp, sizeof(temp), "%s :End of NAMES list",wolname); - irc_send(conn,RPL_ENDOFNAMES,temp); - } } else { irc_send(conn,ERR_NOSUCHCHANNEL,":JOINGAME failed"); @@ -1390,10 +1386,6 @@ static int _handle_joingame_command(t_connection * conn, int numparams, char ** irc_send_rpl_namreply(conn,channel); - if ((std::strlen(wolname)+1+std::strlen(":End of NAMES list")+1)<MAX_IRC_MESSAGE_LEN) { - snprintf(temp, sizeof(temp), "%s :End of NAMES list", wolname); - irc_send(conn,RPL_ENDOFNAMES,temp); - } } } if (old_channel_name) xfree((void *)old_channel_name); diff --git a/pvpgn/src/bnetd/irc.cpp b/pvpgn/src/bnetd/irc.cpp index 6ca61a0..5b176bf 100644 --- a/pvpgn/src/bnetd/irc.cpp +++ b/pvpgn/src/bnetd/irc.cpp @@ -681,6 +681,7 @@ extern int irc_message_format(t_packet * packet, t_message_type type, t_connecti else msg = irc_message_preformat(&from,"JOIN","\r",irc_convert_channel(channel)); conn_unget_chatname(me,from.nick); + irc_send_rpl_namreply(me,channel); break; } else @@ -879,21 +880,17 @@ extern int irc_message_format(t_packet * packet, t_message_type type, t_connecti return -1; } -extern int irc_send_rpl_namreply(t_connection * c, t_channel const * channel) -{ +int irc_send_rpl_namreply_internal(t_connection * c, t_channel const * channel){ char temp[MAX_IRC_MESSAGE_LEN]; char const * ircname; int first = 1; t_connection * m; - if (!c) { - eventlog(eventlog_level_error,__FUNCTION__,"got NULL connection"); - return -1; - } if (!channel) { - eventlog(eventlog_level_error,__FUNCTION__,"got NULL channel"); + eventlog(eventlog_level_error,__FUNCTION__,"got NULL channel"); return -1; } + std::memset(temp,0,sizeof(temp)); ircname = irc_convert_channel(channel); if (!ircname) { @@ -958,6 +955,37 @@ extern int irc_send_rpl_namreply(t_connection * c, t_channel const * channel) conn_unget_chatname(m,name); } irc_send(c,RPL_NAMREPLY,temp); +} + +extern int irc_send_rpl_namreply(t_connection * c, t_channel const * channel) +{ + char temp[MAX_IRC_MESSAGE_LEN]; + char const * ircname; + + if (!c) { + eventlog(eventlog_level_error,__FUNCTION__,"got NULL connection"); + return -1; + } + + if (channel) { + ircname = irc_convert_channel(channel); + if (!ircname) { + eventlog(eventlog_level_error,__FUNCTION__,"channel has NULL ircname"); + return -1; + } + irc_send_rpl_namreply_internal(c, channel); + std:sprintf(temp, "%32s :End of NAMES list", ircname); + } else { + t_elem const * curr; + LIST_TRAVERSE_CONST(channellist(),curr) + { + channel = (t_channel*)elem_get_data(curr); + irc_send_rpl_namreply_internal(c, channel); + } + std::sprintf(temp, "* :End of NAMES list", ircname); + } + + irc_send(c, RPL_ENDOFNAMES, temp); return 0; } @@ -1211,25 +1239,12 @@ extern int _handle_names_command(t_connection * conn, int numparams, char ** par if (!channel) continue; /* channel doesn't exist */ irc_send_rpl_namreply(conn,channel); - ircname=irc_convert_channel(channel); - if ((std::strlen(ircname)+1+std::strlen(":End of NAMES list")+1)<MAX_IRC_MESSAGE_LEN) { - snprintf(temp, sizeof(temp), "%s :End of NAMES list",ircname); - irc_send(conn,RPL_ENDOFNAMES,temp); - } - else - irc_send(conn,RPL_ENDOFNAMES,":End of NAMES list"); } if (e) irc_unget_listelems(e); } else if (numparams==0) { - t_elem const * curr; - LIST_TRAVERSE_CONST(channellist(),curr) - { - channel = (t_channel*)elem_get_data(curr); - irc_send_rpl_namreply(conn,channel); - } - irc_send(conn,RPL_ENDOFNAMES,"* :End of NAMES list"); + irc_send_rpl_namreply(conn, NULL); } return 0; } diff --git a/pvpgn/src/bnetd/message.cpp b/pvpgn/src/bnetd/message.cpp index 5646de8..86193b6 100644 --- a/pvpgn/src/bnetd/message.cpp +++ b/pvpgn/src/bnetd/message.cpp @@ -344,7 +344,9 @@ static int message_telnet_format(t_packet * packet, t_message_type type, t_conne eventlog(eventlog_level_error,__FUNCTION__,"got NULL connection for %s",message_type_get_str(type)); return -1; } - if (me!=dst) + if (me==dst) + return -1; + else { char const * tname; @@ -721,7 +723,9 @@ static int message_bot_format(t_packet * packet, t_message_type type, t_connecti eventlog(eventlog_level_error,__FUNCTION__,"got NULL connection for %s",message_type_get_str(type)); return -1; } - if (me!=dst) + if (me==dst) + return -1; + else { char const * tname; @@ -737,7 +741,9 @@ static int message_bot_format(t_packet * packet, t_message_type type, t_connecti eventlog(eventlog_level_error,__FUNCTION__,"got NULL connection for %s",message_type_get_str(type)); return -1; } - if (me!=dst) + if (me==dst) + return -1; + else { char const * tname; @@ -987,7 +993,9 @@ static int message_bnet_format(t_packet * packet, t_message_type type, t_connect 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)); - if (me!=dst) + if (me==dst) + return -1; + else { char const * tname; char const * playerinfo; @@ -1013,7 +1021,9 @@ static int message_bnet_format(t_packet * packet, t_message_type type, t_connect 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)); - if (me!=dst) + if (me==dst) + return -1; + else { char const * tname;