]> arthur.barton.de Git - ngircd-alex.git/blob - src/ngircd/irc-op.c
- Parameter von List_Add{Invited|Banned}() erweitert.
[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.9 2002/09/08 17:06:54 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         /* Valider Client? */
48         if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
49
50         /* Falsche Anzahl Parameter? */
51         if(( Req->argc < 2) || ( Req->argc > 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
52
53         if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
54         else from = Client;
55         if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
56         
57         /* Ziel-User suchen */
58         target = Client_Search( Req->argv[1] );
59         if( ! target ) return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( from ), Req->argv[1] );
60
61         Channel_Kick( target, from, Req->argv[0], Req->argc == 3 ? Req->argv[2] : Client_ID( from ));
62         return CONNECTED;
63 } /* IRC_KICK */        
64
65
66 GLOBAL BOOLEAN
67 IRC_INVITE( CLIENT *Client, REQUEST *Req )
68 {
69         CHANNEL *chan;
70         CLIENT *target, *from;
71         BOOLEAN remember = FALSE;
72
73         assert( Client != NULL );
74         assert( Req != NULL );
75
76         /* Valider Client? */
77         if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
78
79         /* Falsche Anzahl Parameter? */
80         if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
81
82         if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
83         else from = Client;
84         if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
85         
86         /* User suchen */
87         target = Client_Search( Req->argv[0] );
88         if(( ! target ) || ( Client_Type( target ) != CLIENT_USER )) return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
89
90         chan = Channel_Search( Req->argv[1] );
91
92         if( chan )
93         {
94                 /* Der Channel existiert bereits; ist der User Mitglied? */
95                 if( ! Channel_IsMemberOf( chan, from )) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( Client ), Req->argv[1] );
96
97                 /* Ist der Channel "invite-only"? */
98                 if( strchr( Channel_Modes( chan ), 'i' ))
99                 {
100                         /* Ja. Der User muss Channel-Operator sein! */
101                         if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan ));
102                         remember = TRUE;
103                 }
104
105                 /* Ist der Ziel-User bereits Mitglied? */
106                 if( Channel_IsMemberOf( chan, target )) return IRC_WriteStrClient( from, ERR_USERONCHANNEL_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] );
107         }
108
109         /* Wenn der User gebanned ist, so muss das Invite auch gespeichert werden */
110         if( Lists_CheckBanned( target, chan )) remember = TRUE;
111
112         Log( LOG_DEBUG, "User \"%s\" invites \"%s\" to \"%s\" ...", Client_Mask( from ), Req->argv[0], Req->argv[1] );
113         if( remember )
114         {
115                 if( ! Lists_AddInvited( from, Client_Mask( target ), chan, TRUE )) return CONNECTED;
116         }
117         
118         /* an Ziel-Client forwarden ... */
119         IRC_WriteStrClientPrefix( target, from, "INVITE %s %s", Req->argv[0], Req->argv[1] );
120
121         if( Client_Conn( target ) > NONE )
122         {
123                 /* lokaler Ziel-Client, Status-Code melden */
124                 if( ! IRC_WriteStrClientPrefix( from, target, RPL_INVITING_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] )) return DISCONNECTED;
125         }
126         
127         return CONNECTED;
128 } /* IRC_INVITE */
129
130
131 /* -eof- */