2 * ngIRCd -- The Next Generation IRC Daemon
3 * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
5 * Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
6 * der GNU General Public License (GPL), wie von der Free Software Foundation
7 * herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
8 * der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
9 * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
10 * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
12 * $Id: irc-write.c,v 1.5 2002/05/30 16:52:21 alex Exp $
14 * irc-write.c: IRC-Texte und Befehle ueber Netzwerk versenden
31 #include "irc-write.h"
34 LOCAL CHAR *Get_Prefix PARAMS(( CLIENT *Target, CLIENT *Client ));
39 IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... )
42 IRC_WriteStrClient( Client, Format, va_alist )
49 BOOLEAN ok = CONNECTED;
52 assert( Client != NULL );
53 assert( Format != NULL );
56 va_start( ap, Format );
60 vsnprintf( buffer, 1000, Format, ap );
63 /* an den Client selber */
64 ok = IRC_WriteStrClientPrefix( Client, Client_ThisServer( ), buffer );
67 } /* IRC_WriteStrClient */
72 IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... )
75 IRC_WriteStrClientPrefix( Client, Prefix, Format, va_alist )
82 /* Text an Clients, lokal bzw. remote, senden. */
87 assert( Client != NULL );
88 assert( Format != NULL );
89 assert( Prefix != NULL );
92 va_start( ap, Format );
96 vsnprintf( buffer, 1000, Format, ap );
99 return Conn_WriteStr( Client_Conn( Client_NextHop( Client )), ":%s %s", Get_Prefix( Client_NextHop( Client ), Prefix ), buffer );
100 } /* IRC_WriteStrClientPrefix */
105 IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... )
108 IRC_WriteStrChannel( Client, Chan, Remote, Format, va_alist )
119 assert( Client != NULL );
120 assert( Format != NULL );
123 va_start( ap, Format );
127 vsnprintf( buffer, 1000, Format, ap );
130 return IRC_WriteStrChannelPrefix( Client, Chan, Client_ThisServer( ), Remote, buffer );
131 } /* IRC_WriteStrChannel */
136 IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
139 IRC_WriteStrChannelPrefix( Client, Chan, Prefix, Remote, Format, va_alist )
148 BOOLEAN sock[MAX_CONNECTIONS], is_server[MAX_CONNECTIONS], ok = CONNECTED;
155 assert( Client != NULL );
156 assert( Chan != NULL );
157 assert( Prefix != NULL );
158 assert( Format != NULL );
161 va_start( ap, Format );
165 vsnprintf( buffer, 1000, Format, ap );
168 for( i = 0; i < MAX_CONNECTIONS; i++ ) sock[i] = FALSE;
170 /* An alle Clients, die in den selben Channels sind.
171 * Dabei aber nur einmal je Remote-Server */
172 cl2chan = Channel_FirstMember( Chan );
175 c = Channel_GetClient( cl2chan );
178 if( Client_Conn( c ) <= NONE ) c = NULL;
179 else if( Client_Type( c ) == CLIENT_SERVER ) c = NULL;
181 if( c ) c = Client_NextHop( c );
183 if( c && ( c != Client ))
185 /* Ok, anderer Client */
186 s = Client_Conn( c );
188 assert( s < MAX_CONNECTIONS );
190 if( Client_Type( c ) == CLIENT_SERVER ) is_server[s] = TRUE;
191 else is_server[s] = FALSE;
193 cl2chan = Channel_NextMember( Chan, cl2chan );
197 for( i = 0; i < MAX_CONNECTIONS; i++ )
201 if( is_server[i] ) ok = Conn_WriteStr( i, ":%s %s", Client_ID( Prefix ), buffer );
202 else ok = Conn_WriteStr( i, ":%s %s", Client_Mask( Prefix ), buffer );
207 } /* IRC_WriteStrChannelPrefix */
212 IRC_WriteStrServers( CLIENT *ExceptOf, CHAR *Format, ... )
215 IRC_WriteStrServers( ExceptOf, Format, va_alist )
224 assert( Format != NULL );
227 va_start( ap, Format );
231 vsnprintf( buffer, 1000, Format, ap );
234 /* an den Client selber */
235 IRC_WriteStrServersPrefix( ExceptOf, Client_ThisServer( ), buffer );
236 } /* IRC_WriteStrServers */
241 IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... )
244 IRC_WriteStrServersPrefix( ExceptOf, Prefix, Format, va_alist )
255 assert( Format != NULL );
256 assert( Prefix != NULL );
259 va_start( ap, Format );
263 vsnprintf( buffer, 1000, Format, ap );
269 if(( Client_Type( c ) == CLIENT_SERVER ) && ( Client_Conn( c ) > NONE ) && ( c != Client_ThisServer( )) && ( c != ExceptOf ))
271 /* Ziel-Server gefunden */
272 IRC_WriteStrClientPrefix( c, Prefix, buffer );
274 c = Client_Next( c );
276 } /* IRC_WriteStrServersPrefix */
281 IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
284 IRC_WriteStrRelatedPrefix( Client, Prefix, Remote, Format, va_alist )
292 BOOLEAN sock[MAX_CONNECTIONS], is_server[MAX_CONNECTIONS], ok = CONNECTED;
293 CL2CHAN *chan_cl2chan, *cl2chan;
300 assert( Client != NULL );
301 assert( Prefix != NULL );
302 assert( Format != NULL );
305 va_start( ap, Format );
309 vsnprintf( buffer, 1000, Format, ap );
313 for( i = 0; i < MAX_CONNECTIONS; i++ ) sock[i] = FALSE;
315 /* An alle Clients, die in einem Channel mit dem "Ausloeser" sind,
316 * den Text schicken. An Remote-Server aber jeweils nur einmal. */
317 chan_cl2chan = Channel_FirstChannelOf( Client );
318 while( chan_cl2chan )
320 /* Channel des Users durchsuchen */
321 chan = Channel_GetChannel( chan_cl2chan );
322 cl2chan = Channel_FirstMember( chan );
325 c = Channel_GetClient( cl2chan );
328 if( Client_Conn( c ) <= NONE ) c = NULL;
329 else if( Client_Type( c ) == CLIENT_SERVER ) c = NULL;
331 if( c ) c = Client_NextHop( c );
333 if( c && ( c != Client ))
335 /* Ok, anderer Client */
336 s = Client_Conn( c );
338 assert( s < MAX_CONNECTIONS );
340 if( Client_Type( c ) == CLIENT_SERVER ) is_server[s] = TRUE;
341 else is_server[s] = FALSE;
343 cl2chan = Channel_NextMember( chan, cl2chan );
346 /* naechsten Channel */
347 chan_cl2chan = Channel_NextChannelOf( Client, chan_cl2chan );
351 for( i = 0; i < MAX_CONNECTIONS; i++ )
355 if( is_server[i] ) ok = Conn_WriteStr( i, ":%s %s", Client_ID( Prefix ), buffer );
356 else ok = Conn_WriteStr( i, ":%s %s", Client_Mask( Prefix ), buffer );
361 } /* IRC_WriteStrRelatedPrefix */
365 Get_Prefix( CLIENT *Target, CLIENT *Client )
367 assert( Target != NULL );
368 assert( Client != NULL );
370 if( Client_Type( Target ) == CLIENT_SERVER ) return Client_ID( Client );
371 else return Client_Mask( Client );