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.1 2002/02/27 23:26:21 alex Exp $
14 * irc-write.c: IRC-Texte und Befehle ueber Netzwerk versenden
16 * $Log: irc-write.c,v $
17 * Revision 1.1 2002/02/27 23:26:21 alex
18 * - Modul aus irc.c bzw. irc.h ausgegliedert.
32 #include "irc-write.h"
35 CHAR *Get_Prefix( CLIENT *Target, CLIENT *Client );
38 GLOBAL BOOLEAN IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... )
41 BOOLEAN ok = CONNECTED;
44 assert( Client != NULL );
45 assert( Format != NULL );
47 va_start( ap, Format );
48 vsnprintf( buffer, 1000, Format, ap );
51 /* an den Client selber */
52 ok = IRC_WriteStrClientPrefix( Client, Client_ThisServer( ), buffer );
55 } /* IRC_WriteStrClient */
58 GLOBAL BOOLEAN IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... )
60 /* Text an Clients, lokal bzw. remote, senden. */
65 assert( Client != NULL );
66 assert( Format != NULL );
67 assert( Prefix != NULL );
69 va_start( ap, Format );
70 vsnprintf( buffer, 1000, Format, ap );
73 return Conn_WriteStr( Client_Conn( Client_NextHop( Client )), ":%s %s", Get_Prefix( Client_NextHop( Client ), Prefix ), buffer );
74 } /* IRC_WriteStrClientPrefix */
77 GLOBAL BOOLEAN IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... )
82 assert( Client != NULL );
83 assert( Format != NULL );
85 va_start( ap, Format );
86 vsnprintf( buffer, 1000, Format, ap );
89 return IRC_WriteStrChannelPrefix( Client, Chan, Client_ThisServer( ), Remote, buffer );
90 } /* IRC_WriteStrChannel */
93 GLOBAL BOOLEAN IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
95 BOOLEAN sock[MAX_CONNECTIONS], is_server[MAX_CONNECTIONS], ok = CONNECTED;
102 assert( Client != NULL );
103 assert( Chan != NULL );
104 assert( Prefix != NULL );
105 assert( Format != NULL );
107 va_start( ap, Format );
108 vsnprintf( buffer, 1000, Format, ap );
111 for( i = 0; i < MAX_CONNECTIONS; i++ ) sock[i] = FALSE;
113 /* An alle Clients, die in den selben Channels sind.
114 * Dabei aber nur einmal je Remote-Server */
115 cl2chan = Channel_FirstMember( Chan );
118 c = Channel_GetClient( cl2chan );
121 if( Client_Conn( c ) <= NONE ) c = NULL;
122 else if( Client_Type( c ) == CLIENT_SERVER ) c = NULL;
124 if( c ) c = Client_NextHop( c );
126 if( c && ( c != Client ))
128 /* Ok, anderer Client */
129 s = Client_Conn( c );
131 assert( s < MAX_CONNECTIONS );
133 if( Client_Type( c ) == CLIENT_SERVER ) is_server[s] = TRUE;
134 else is_server[s] = FALSE;
136 cl2chan = Channel_NextMember( Chan, cl2chan );
140 for( i = 0; i < MAX_CONNECTIONS; i++ )
144 if( is_server[i] ) ok = Conn_WriteStr( i, ":%s %s", Client_ID( Prefix ), buffer );
145 else ok = Conn_WriteStr( i, ":%s %s", Client_Mask( Prefix ), buffer );
150 } /* IRC_WriteStrChannelPrefix */
153 GLOBAL VOID IRC_WriteStrServers( CLIENT *ExceptOf, CHAR *Format, ... )
158 assert( Format != NULL );
160 va_start( ap, Format );
161 vsnprintf( buffer, 1000, Format, ap );
164 /* an den Client selber */
165 return IRC_WriteStrServersPrefix( ExceptOf, Client_ThisServer( ), buffer );
166 } /* IRC_WriteStrServers */
169 GLOBAL VOID IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... )
175 assert( Format != NULL );
176 assert( Prefix != NULL );
178 va_start( ap, Format );
179 vsnprintf( buffer, 1000, Format, ap );
185 if(( Client_Type( c ) == CLIENT_SERVER ) && ( Client_Conn( c ) > NONE ) && ( c != Client_ThisServer( )) && ( c != ExceptOf ))
187 /* Ziel-Server gefunden */
188 IRC_WriteStrClientPrefix( c, Prefix, buffer );
190 c = Client_Next( c );
192 } /* IRC_WriteStrServersPrefix */
195 GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
197 BOOLEAN sock[MAX_CONNECTIONS], is_server[MAX_CONNECTIONS], ok = CONNECTED;
198 CL2CHAN *chan_cl2chan, *cl2chan;
205 assert( Client != NULL );
206 assert( Prefix != NULL );
207 assert( Format != NULL );
209 va_start( ap, Format );
210 vsnprintf( buffer, 1000, Format, ap );
214 for( i = 0; i < MAX_CONNECTIONS; i++ ) sock[i] = FALSE;
216 /* An alle Clients, die in einem Channel mit dem "Ausloeser" sind,
217 * den Text schicken. An Remote-Server aber jeweils nur einmal. */
218 chan_cl2chan = Channel_FirstChannelOf( Client );
219 while( chan_cl2chan )
221 /* Channel des Users durchsuchen */
222 chan = Channel_GetChannel( chan_cl2chan );
223 cl2chan = Channel_FirstMember( chan );
226 c = Channel_GetClient( cl2chan );
229 if( Client_Conn( c ) <= NONE ) c = NULL;
230 else if( Client_Type( c ) == CLIENT_SERVER ) c = NULL;
232 if( c ) c = Client_NextHop( c );
234 if( c && ( c != Client ))
236 /* Ok, anderer Client */
237 s = Client_Conn( c );
239 assert( s < MAX_CONNECTIONS );
241 if( Client_Type( c ) == CLIENT_SERVER ) is_server[s] = TRUE;
242 else is_server[s] = FALSE;
244 cl2chan = Channel_NextMember( chan, cl2chan );
247 /* naechsten Channel */
248 chan_cl2chan = Channel_NextChannelOf( Client, chan_cl2chan );
252 for( i = 0; i < MAX_CONNECTIONS; i++ )
256 if( is_server[i] ) ok = Conn_WriteStr( i, ":%s %s", Client_ID( Prefix ), buffer );
257 else ok = Conn_WriteStr( i, ":%s %s", Client_Mask( Prefix ), buffer );
262 } /* IRC_WriteStrRelatedPrefix */
265 CHAR *Get_Prefix( CLIENT *Target, CLIENT *Client )
267 assert( Target != NULL );
268 assert( Client != NULL );
270 if( Client_Type( Target ) == CLIENT_SERVER ) return Client_ID( Client );
271 else return Client_Mask( Client );