2000-09-29 23:59:51 +00:00
/*
dump . c : proxy plugin - output all information about irc session
2001-12-07 15:39:30 +00:00
Copyright ( C ) 1999 - 2001 Timo Sirainen
2000-09-29 23:59:51 +00:00
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
2007-05-08 18:41:10 +00:00
You should have received a copy of the GNU General Public License along
with this program ; if not , write to the Free Software Foundation , Inc . ,
51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA .
2000-09-29 23:59:51 +00:00
*/
2000-11-06 02:29:01 +00:00
# include "module.h"
2000-09-29 23:59:51 +00:00
# include "network.h"
2005-08-24 19:25:47 +00:00
# include "net-sendbuffer.h"
2000-09-29 23:59:51 +00:00
# include "settings.h"
2001-07-25 20:07:10 +00:00
# include "irssi-version.h"
2004-08-20 00:03:40 +00:00
# include "recode.h"
2000-09-29 23:59:51 +00:00
2000-11-06 02:29:01 +00:00
# include "irc-servers.h"
# include "irc-channels.h"
# include "irc-nicklist.h"
# include "modes.h"
void proxy_outdata ( CLIENT_REC * client , const char * data , . . . )
2000-09-29 23:59:51 +00:00
{
2000-11-06 02:29:01 +00:00
va_list args ;
char * str ;
2000-09-29 23:59:51 +00:00
2000-11-06 02:29:01 +00:00
g_return_if_fail ( client ! = NULL ) ;
g_return_if_fail ( data ! = NULL ) ;
2000-09-29 23:59:51 +00:00
2000-11-06 02:29:01 +00:00
va_start ( args , data ) ;
2000-09-29 23:59:51 +00:00
2000-11-06 02:29:01 +00:00
str = g_strdup_vprintf ( data , args ) ;
2005-08-24 19:25:47 +00:00
net_sendbuffer_send ( client - > handle , str , strlen ( str ) ) ;
2000-11-06 02:29:01 +00:00
g_free ( str ) ;
va_end ( args ) ;
2000-09-29 23:59:51 +00:00
}
2000-11-06 02:29:01 +00:00
void proxy_outdata_all ( IRC_SERVER_REC * server , const char * data , . . . )
2000-09-29 23:59:51 +00:00
{
2000-11-06 02:29:01 +00:00
va_list args ;
GSList * tmp ;
char * str ;
int len ;
2000-09-29 23:59:51 +00:00
2000-11-06 02:29:01 +00:00
g_return_if_fail ( server ! = NULL ) ;
g_return_if_fail ( data ! = NULL ) ;
2000-09-29 23:59:51 +00:00
2000-11-06 02:29:01 +00:00
va_start ( args , data ) ;
2000-09-29 23:59:51 +00:00
2000-11-06 02:29:01 +00:00
str = g_strdup_vprintf ( data , args ) ;
len = strlen ( str ) ;
for ( tmp = proxy_clients ; tmp ! = NULL ; tmp = tmp - > next ) {
CLIENT_REC * rec = tmp - > data ;
if ( rec - > connected & & rec - > server = = server )
2005-08-24 19:25:47 +00:00
net_sendbuffer_send ( rec - > handle , str , len ) ;
2000-11-06 02:29:01 +00:00
}
g_free ( str ) ;
va_end ( args ) ;
}
void proxy_outserver ( CLIENT_REC * client , const char * data , . . . )
{
va_list args ;
char * str ;
g_return_if_fail ( client ! = NULL ) ;
g_return_if_fail ( data ! = NULL ) ;
va_start ( args , data ) ;
str = g_strdup_vprintf ( data , args ) ;
2015-07-25 02:41:26 -04:00
proxy_outdata ( client , " :%s!%s@proxy %s \r \n " , client - > nick ,
2000-11-06 02:29:01 +00:00
settings_get_str ( " user_name " ) , str ) ;
g_free ( str ) ;
va_end ( args ) ;
}
2001-10-19 11:28:56 +00:00
void proxy_outserver_all ( IRC_SERVER_REC * server , const char * data , . . . )
2000-11-06 02:29:01 +00:00
{
va_list args ;
GSList * tmp ;
char * str ;
g_return_if_fail ( server ! = NULL ) ;
g_return_if_fail ( data ! = NULL ) ;
va_start ( args , data ) ;
str = g_strdup_vprintf ( data , args ) ;
for ( tmp = proxy_clients ; tmp ! = NULL ; tmp = tmp - > next ) {
CLIENT_REC * rec = tmp - > data ;
if ( rec - > connected & & rec - > server = = server ) {
2015-07-25 02:41:26 -04:00
proxy_outdata ( rec , " :%s!%s@proxy %s \r \n " , rec - > nick ,
2000-11-06 02:29:01 +00:00
settings_get_str ( " user_name " ) , str ) ;
}
}
g_free ( str ) ;
va_end ( args ) ;
2001-10-19 11:28:56 +00:00
}
2000-11-06 02:29:01 +00:00
void proxy_outserver_all_except ( CLIENT_REC * client , const char * data , . . . )
{
va_list args ;
GSList * tmp ;
char * str ;
g_return_if_fail ( client ! = NULL ) ;
g_return_if_fail ( data ! = NULL ) ;
va_start ( args , data ) ;
str = g_strdup_vprintf ( data , args ) ;
for ( tmp = proxy_clients ; tmp ! = NULL ; tmp = tmp - > next ) {
CLIENT_REC * rec = tmp - > data ;
if ( rec - > connected & & rec ! = client & &
rec - > server = = client - > server ) {
2015-07-25 02:41:26 -04:00
proxy_outdata ( rec , " :%s!%s@proxy %s \r \n " , rec - > nick ,
2000-11-06 02:29:01 +00:00
settings_get_str ( " user_name " ) , str ) ;
}
}
g_free ( str ) ;
va_end ( args ) ;
}
2000-11-09 21:26:55 +00:00
static void create_names_start ( GString * str , IRC_CHANNEL_REC * channel ,
CLIENT_REC * client )
{
2009-02-08 17:57:19 +00:00
g_string_printf ( str , " :%s 353 %s %c %s : " ,
2000-11-09 21:40:22 +00:00
client - > proxy_address , client - > nick ,
channel_mode_is_set ( channel , ' p ' ) ? ' * ' :
channel_mode_is_set ( channel , ' s ' ) ? ' @ ' : ' = ' ,
channel - > name ) ;
2000-11-09 21:26:55 +00:00
}
2000-11-06 02:29:01 +00:00
static void dump_join ( IRC_CHANNEL_REC * channel , CLIENT_REC * client )
{
GSList * tmp , * nicks ;
GString * str ;
2000-11-09 21:26:55 +00:00
int first ;
2004-12-07 17:48:21 +00:00
char * recoded ;
2000-11-06 02:29:01 +00:00
proxy_outserver ( client , " JOIN %s " , channel - > name ) ;
str = g_string_new ( NULL ) ;
2000-11-09 21:26:55 +00:00
create_names_start ( str , channel , client ) ;
2000-11-06 02:29:01 +00:00
2000-11-09 21:26:55 +00:00
first = TRUE ;
2000-11-06 02:29:01 +00:00
nicks = nicklist_getnicks ( CHANNEL ( channel ) ) ;
for ( tmp = nicks ; tmp ! = NULL ; tmp = tmp - > next ) {
NICK_REC * nick = tmp - > data ;
2000-11-09 21:26:55 +00:00
if ( str - > len > = 500 ) {
2015-09-20 21:01:25 +02:00
g_string_append ( str , " \r \n " ) ;
2001-10-19 11:37:13 +00:00
proxy_outdata ( client , " %s " , str - > str ) ;
2000-11-09 21:26:55 +00:00
create_names_start ( str , channel , client ) ;
first = TRUE ;
}
2000-11-09 21:43:10 +00:00
if ( first )
2000-11-09 21:26:55 +00:00
first = FALSE ;
2000-11-09 21:43:10 +00:00
else
g_string_append_c ( str , ' ' ) ;
2000-11-06 02:29:01 +00:00
2008-11-28 00:16:51 +00:00
if ( nick - > prefixes [ 0 ] )
g_string_append_c ( str , nick - > prefixes [ 0 ] ) ;
2000-11-06 02:29:01 +00:00
g_string_append ( str , nick - > nick ) ;
}
g_slist_free ( nicks ) ;
2015-07-25 02:41:26 -04:00
g_string_append_c ( str , ' \ r \ n ' ) ;
2001-10-19 11:37:13 +00:00
proxy_outdata ( client , " %s " , str - > str ) ;
2000-11-06 02:29:01 +00:00
g_string_free ( str , TRUE ) ;
2015-07-25 02:41:26 -04:00
proxy_outdata ( client , " :%s 366 %s %s :End of /NAMES list. \r \n " ,
2000-11-09 21:40:22 +00:00
client - > proxy_address , client - > nick , channel - > name ) ;
2000-11-06 02:29:01 +00:00
if ( channel - > topic ! = NULL ) {
2004-12-07 17:48:21 +00:00
/* this is needed because the topic may be encoded into other charsets internaly */
2004-12-20 13:59:15 +00:00
recoded = recode_out ( SERVER ( client - > server ) , channel - > topic , channel - > name ) ;
2015-07-25 02:41:26 -04:00
proxy_outdata ( client , " :%s 332 %s %s :%s \r \n " ,
2000-11-09 21:40:22 +00:00
client - > proxy_address , client - > nick ,
2004-12-07 17:48:21 +00:00
channel - > name , recoded ) ;
g_free ( recoded ) ;
2004-12-07 17:02:40 +00:00
if ( channel - > topic_time > 0 )
2015-07-25 02:41:26 -04:00
proxy_outdata ( client , " :%s 333 %s %s %s %d \r \n " ,
2004-12-07 17:02:40 +00:00
client - > proxy_address , client - > nick ,
channel - > name , channel - > topic_by , channel - > topic_time ) ;
2000-11-06 02:29:01 +00:00
}
2000-09-29 23:59:51 +00:00
}
2001-12-07 15:58:58 +00:00
void proxy_client_reset_nick ( CLIENT_REC * client )
{
if ( client - > server = = NULL | |
2015-04-07 22:39:05 -03:00
g_strcmp0 ( client - > nick , client - > server - > nick ) = = 0 )
2001-12-07 15:58:58 +00:00
return ;
2015-07-25 02:41:26 -04:00
proxy_outdata ( client , " :%s!proxy NICK :%s \r \n " ,
2001-12-07 15:58:58 +00:00
client - > nick , client - > server - > nick ) ;
g_free ( client - > nick ) ;
client - > nick = g_strdup ( client - > server - > nick ) ;
}
2004-01-24 21:59:10 +00:00
static void proxy_dump_data_005 ( gpointer key , gpointer value , gpointer context )
2004-01-20 10:57:57 +00:00
{
2004-08-19 23:24:24 +00:00
if ( * ( char * ) value ! = ' \0 ' )
2009-02-08 17:22:42 +00:00
g_string_append_printf ( context , " %s=%s " , ( char * ) key , ( char * ) value ) ;
2004-08-19 23:24:24 +00:00
else
2009-02-08 17:22:42 +00:00
g_string_append_printf ( context , " %s " , ( char * ) key ) ;
2004-01-20 10:57:57 +00:00
}
2001-12-07 15:39:30 +00:00
void proxy_dump_data ( CLIENT_REC * client )
2000-09-29 23:59:51 +00:00
{
2004-08-31 22:32:58 +00:00
GString * isupport_out , * paramstr ;
char * * paramlist , * * tmp ;
int count ;
2004-01-20 10:57:57 +00:00
2004-08-31 22:32:58 +00:00
proxy_client_reset_nick ( client ) ;
2000-09-29 23:59:51 +00:00
2000-11-06 02:29:01 +00:00
/* welcome info */
2015-07-25 02:41:26 -04:00
proxy_outdata ( client , " :%s 001 %s :Welcome to the Internet Relay Network %s!%s@proxy \r \n " , client - > proxy_address , client - > nick , client - > nick , settings_get_str ( " user_name " ) ) ;
proxy_outdata ( client , " :%s 002 %s :Your host is irssi-proxy, running version %s \r \n " , client - > proxy_address , client - > nick , PACKAGE_VERSION ) ;
proxy_outdata ( client , " :%s 003 %s :This server was created ... \r \n " , client - > proxy_address , client - > nick ) ;
2000-11-06 23:27:46 +00:00
if ( client - > server = = NULL | | ! client - > server - > emode_known )
2015-07-25 02:41:26 -04:00
proxy_outdata ( client , " :%s 004 %s %s %s oirw abiklmnopqstv \r \n " , client - > proxy_address , client - > nick , client - > proxy_address , PACKAGE_VERSION ) ;
2000-11-06 02:29:01 +00:00
else
2015-07-25 02:41:26 -04:00
proxy_outdata ( client , " :%s 004 %s %s %s oirw abeIiklmnopqstv \r \n " , client - > proxy_address , client - > nick , client - > proxy_address , PACKAGE_VERSION ) ;
2004-01-20 10:57:57 +00:00
2004-03-03 00:26:30 +00:00
if ( client - > server ! = NULL & & client - > server - > isupport_sent ) {
2004-01-20 10:57:57 +00:00
isupport_out = g_string_new ( NULL ) ;
g_hash_table_foreach ( client - > server - > isupport , proxy_dump_data_005 , isupport_out ) ;
2004-08-31 22:32:58 +00:00
if ( isupport_out - > len > 0 )
g_string_truncate ( isupport_out , isupport_out - > len - 1 ) ;
proxy_outdata ( client , " :%s 005 %s " , client - > proxy_address , client - > nick ) ;
paramstr = g_string_new ( NULL ) ;
paramlist = g_strsplit ( isupport_out - > str , " " , - 1 ) ;
count = 0 ;
tmp = paramlist ;
for ( ; ; tmp + + ) {
if ( * tmp ! = NULL ) {
2009-02-08 17:22:42 +00:00
g_string_append_printf ( paramstr , " %s " , * tmp ) ;
2004-08-31 22:32:58 +00:00
if ( + + count < 15 )
continue ;
}
count = 0 ;
if ( paramstr - > len > 0 )
g_string_truncate ( paramstr , paramstr - > len - 1 ) ;
2015-07-25 02:41:26 -04:00
g_string_append_printf ( paramstr , " :are supported by this server \r \n " ) ;
2004-08-31 22:32:58 +00:00
proxy_outdata ( client , " %s " , paramstr - > str ) ;
g_string_truncate ( paramstr , 0 ) ;
2009-02-08 17:57:19 +00:00
g_string_printf ( paramstr , " :%s 005 %s " , client - > proxy_address , client - > nick ) ;
2004-08-31 22:32:58 +00:00
if ( * tmp = = NULL | | tmp [ 1 ] = = NULL )
break ;
}
2004-01-20 10:57:57 +00:00
g_string_free ( isupport_out , TRUE ) ;
2004-08-31 22:32:58 +00:00
g_string_free ( paramstr , TRUE ) ;
g_strfreev ( paramlist ) ;
2004-01-20 10:57:57 +00:00
}
2015-07-25 02:41:26 -04:00
proxy_outdata ( client , " :%s 251 %s :There are 0 users and 0 invisible on 1 servers \r \n " , client - > proxy_address , client - > nick ) ;
proxy_outdata ( client , " :%s 255 %s :I have 0 clients, 0 services and 0 servers \r \n " , client - > proxy_address , client - > nick ) ;
proxy_outdata ( client , " :%s 422 %s :MOTD File is missing \r \n " , client - > proxy_address , client - > nick ) ;
2000-11-06 02:29:01 +00:00
2000-11-06 23:27:46 +00:00
/* user mode / away status */
if ( client - > server ! = NULL ) {
2001-11-11 22:41:03 +00:00
if ( client - > server - > usermode ! = NULL ) {
proxy_outserver ( client , " MODE %s :+%s " ,
client - > server - > nick ,
client - > server - > usermode ) ;
}
2000-11-09 21:40:22 +00:00
if ( client - > server - > usermode_away ) {
2015-07-25 02:41:26 -04:00
proxy_outdata ( client , " :%s 306 %s :You have been marked as being away \r \n " ,
2000-11-09 21:40:22 +00:00
client - > proxy_address , client - > nick ) ;
}
2000-11-06 02:29:01 +00:00
2000-11-06 23:27:46 +00:00
/* Send channel joins */
g_slist_foreach ( client - > server - > channels , ( GFunc ) dump_join , client ) ;
}
2000-09-29 23:59:51 +00:00
}