--- src/ngircd/channel.c | 45 +++++++++++++++++++++++++++++++-------------- src/ngircd/channel.h | 2 +- 2 files changed, 32 insertions(+), 15 deletions(-)
diff --git a/src/ngircd/channel.c b/src/ngircd/channel.c index c923404..fde51a3 100644 --- a/src/ngircd/channel.c +++ b/src/ngircd/channel.c @@ -89,7 +89,7 @@ Channel_GetListInvites(CHANNEL *c) GLOBAL void Channel_InitPredefined( void ) { - /* Vordefinierte persistente Channels erzeugen */ + /* Generate predefined persistent channels */
CHANNEL *chan; char *c; @@ -98,9 +98,10 @@ Channel_InitPredefined( void ) for( i = 0; i < Conf_Channel_Count; i++ ) { /* Ist ein Name konfiguriert? */ + /* Check for Name configuration */ if( ! Conf_Channel[i].name[0] ) continue;
- /* Gueltiger Channel-Name? */ + /* Check for invalid channel name */ if( ! Channel_IsValidName( Conf_Channel[i].name )) { Log( LOG_ERR, "Can't create pre-defined channel: invalid name: "%s"!", Conf_Channel[i].name ); @@ -108,7 +109,7 @@ Channel_InitPredefined( void ) continue; }
- /* Gibt es den Channel bereits? */ + /* Check if the channel name is already in use */ chan = Channel_Search( Conf_Channel[i].name ); if( chan ) { @@ -149,7 +150,7 @@ Channel_Exit( void ) CHANNEL *c, *c_next; CL2CHAN *cl2chan, *cl2chan_next;
- /* Channel-Strukturen freigeben */ + /* free struct Channel */ c = My_Channels; while( c ) { @@ -159,7 +160,7 @@ Channel_Exit( void ) c = c_next; }
- /* Channel-Zuordnungstabelle freigeben */ + /* Free Channel allocation table */ cl2chan = My_Cl2Chan; while( c ) { @@ -169,7 +170,14 @@ Channel_Exit( void ) } } /* Channel_Exit */
- +/** + * Join Channel + * This function lets a client join a channel. First, the function + * checks that the specified channel name is valid and that the client + * isn't already a member. If the specified channel doesn't exist, + * a new channel is created. Client is added to channel by function + * Add_Client(). + */ GLOBAL bool Channel_Join( CLIENT *Client, char *Name ) { @@ -178,6 +186,7 @@ Channel_Join( CLIENT *Client, char *Name ) assert( Client != NULL ); assert( Name != NULL );
+ /* Check that the channel name is valid */ if( ! Channel_IsValidName( Name )) { IRC_WriteStrClient( Client, ERR_NOSUCHCHANNEL_MSG, Client_ID( Client ), Name ); return false; @@ -185,25 +194,25 @@ Channel_Join( CLIENT *Client, char *Name )
chan = Channel_Search( Name ); if( chan ) { - /* Ist der Client bereits Mitglied? */ + /* Check if the client is already in the channel */ if( Get_Cl2Chan( chan, Client )) return false; } else { - /* Gibt es noch nicht? Dann neu anlegen: */ + /* If the specified channel doesn't exist, the channel is created */ chan = Channel_Create( Name ); if (!chan) return false; }
- /* User dem Channel hinzufuegen */ + /* Add user to Channel */ if( ! Add_Client( chan, Client )) return false; else return true; } /* Channel_Join */
/** - * Remove client from channel. - * This function lets a client lead a channel. First, the function checks + * Part client from channel. + * This function lets a client part from a channel. First, the function checks * if the channel exists and the client is a member of it and sends out * appropriate error messages if not. The real work is done by the function * Remove_Client(). @@ -217,25 +226,30 @@ Channel_Part(CLIENT * Client, CLIENT * Origin, const char *Name, const char *Rea assert(Name != NULL); assert(Reason != NULL);
+ /* Check that specified channel exists */ chan = Channel_Search(Name); if (!chan) { IRC_WriteStrClient(Client, ERR_NOSUCHCHANNEL_MSG, Client_ID(Client), Name); return false; } + + /* Check that the client is in the channel */ if (!Get_Cl2Chan(chan, Client)) { IRC_WriteStrClient(Client, ERR_NOTONCHANNEL_MSG, Client_ID(Client), Name); return false; }
+ + /* Part client from channel */ if (!Remove_Client(REMOVE_PART, chan, Client, Origin, Reason, true)) return false; else return true; } /* Channel_Part */
- +/* Kick user from Channel */ GLOBAL void Channel_Kick( CLIENT *Client, CLIENT *Origin, const char *Name, const char *Reason ) { @@ -246,6 +260,7 @@ Channel_Kick( CLIENT *Client, CLIENT *Origin, const char *Name, const char *Reas assert( Name != NULL ); assert( Reason != NULL );
+ /* Check that channel exists */ chan = Channel_Search( Name ); if( ! chan ) { @@ -253,26 +268,28 @@ Channel_Kick( CLIENT *Client, CLIENT *Origin, const char *Name, const char *Reas return; }
+ /* Check that user is on the specified channel */ if( ! Channel_IsMemberOf( chan, Origin )) { IRC_WriteStrClient( Origin, ERR_NOTONCHANNEL_MSG, Client_ID( Origin ), Name ); return; }
- /* Is User Channel-Operator? */ + /* Check if user has operator status */ if( ! strchr( Channel_UserModes( chan, Origin ), 'o' )) { IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Name); return; }
- /* Ist the kickED User member of channel? */ + /* Check that the client to be kicked is on the specified channel */ if( ! Channel_IsMemberOf( chan, Client )) { IRC_WriteStrClient( Origin, ERR_USERNOTINCHANNEL_MSG, Client_ID( Origin ), Client_ID( Client ), Name ); return; }
+ /* Kick Client from channel */ Remove_Client( REMOVE_KICK, chan, Client, Origin, Reason, true); } /* Channel_Kick */
diff --git a/src/ngircd/channel.h b/src/ngircd/channel.h index 1483b4a..1f78bf8 100644 --- a/src/ngircd/channel.h +++ b/src/ngircd/channel.h @@ -46,7 +46,7 @@ typedef struct _CLIENT2CHAN struct _CLIENT2CHAN *next; CLIENT *client; CHANNEL *channel; - char modes[CHANNEL_MODE_LEN]; /* User-Modes in dem Channel */ + char modes[CHANNEL_MODE_LEN]; /* User-Modes in Channel */ } CL2CHAN;
#else