]> arthur.barton.de Git - ngircd-alex.git/blob - src/ngircd/irc-op.c
- Parser auf Befehlstabelle umgestellt.
[ngircd-alex.git] / src / ngircd / irc-op.c
1 /*
2  * ngIRCd -- The Next Generation IRC Daemon
3  * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
4  *
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.
11  *
12  * $Id: irc-op.c,v 1.10 2002/11/30 15:04:57 alex Exp $
13  *
14  * irc-op.c: Befehle zur Channel-Verwaltung
15  */
16
17
18 #include "portab.h"
19
20 #include "imp.h"
21 #include <assert.h>
22 #include <string.h>
23 #include <stdio.h>
24
25 #include "conn.h"
26 #include "client.h"
27 #include "channel.h"
28 #include "defines.h"
29 #include "irc-write.h"
30 #include "lists.h"
31 #include "log.h"
32 #include "messages.h"
33 #include "parse.h"
34
35 #include "exp.h"
36 #include "irc-op.h"
37
38
39 GLOBAL BOOLEAN
40 IRC_KICK( CLIENT *Client, REQUEST *Req )
41 {
42         CLIENT *target, *from;
43         
44         assert( Client != NULL );
45         assert( Req != NULL );
46
47         /* Falsche Anzahl Parameter? */
48         if(( Req->argc < 2) || ( Req->argc > 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
49
50         if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
51         else from = Client;
52         if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
53         
54         /* Ziel-User suchen */
55         target = Client_Search( Req->argv[1] );
56         if( ! target ) return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( from ), Req->argv[1] );
57
58         Channel_Kick( target, from, Req->argv[0], Req->argc == 3 ? Req->argv[2] : Client_ID( from ));
59         return CONNECTED;
60 } /* IRC_KICK */        
61
62
63 GLOBAL BOOLEAN
64 IRC_INVITE( CLIENT *Client, REQUEST *Req )
65 {
66         CHANNEL *chan;
67         CLIENT *target, *from;
68         BOOLEAN remember = FALSE;
69
70         assert( Client != NULL );
71         assert( Req != NULL );
72
73         /* Falsche Anzahl Parameter? */
74         if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
75
76         if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
77         else from = Client;
78         if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
79         
80         /* User suchen */
81         target = Client_Search( Req->argv[0] );
82         if(( ! target ) || ( Client_Type( target ) != CLIENT_USER )) return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
83
84         chan = Channel_Search( Req->argv[1] );
85
86         if( chan )
87         {
88                 /* Der Channel existiert bereits; ist der User Mitglied? */
89                 if( ! Channel_IsMemberOf( chan, from )) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( Client ), Req->argv[1] );
90
91                 /* Ist der Channel "invite-only"? */
92                 if( strchr( Channel_Modes( chan ), 'i' ))
93                 {
94                         /* Ja. Der User muss Channel-Operator sein! */
95                         if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan ));
96                         remember = TRUE;
97                 }
98
99                 /* Ist der Ziel-User bereits Mitglied? */
100                 if( Channel_IsMemberOf( chan, target )) return IRC_WriteStrClient( from, ERR_USERONCHANNEL_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] );
101         }
102
103         /* Wenn der User gebanned ist, so muss das Invite auch gespeichert werden */
104         if( Lists_CheckBanned( target, chan )) remember = TRUE;
105
106         Log( LOG_DEBUG, "User \"%s\" invites \"%s\" to \"%s\" ...", Client_Mask( from ), Req->argv[0], Req->argv[1] );
107         if( remember )
108         {
109                 if( ! Lists_AddInvited( from, Client_Mask( target ), chan, TRUE )) return CONNECTED;
110         }
111         
112         /* an Ziel-Client forwarden ... */
113         IRC_WriteStrClientPrefix( target, from, "INVITE %s %s", Req->argv[0], Req->argv[1] );
114
115         if( Client_Conn( target ) > NONE )
116         {
117                 /* lokaler Ziel-Client, Status-Code melden */
118                 if( ! IRC_WriteStrClientPrefix( from, target, RPL_INVITING_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] )) return DISCONNECTED;
119         }
120         
121         return CONNECTED;
122 } /* IRC_INVITE */
123
124
125 /* -eof- */