- bei INVITE wurde im Antwort-Status-Code das falsche Prefix verschickt.
[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.7 2002/07/25 11:36:16 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_BAN( CLIENT *Client, REQUEST *Req )
68 {
69         assert( Client != NULL );
70         assert( Req != NULL );
71
72         /* Valider Client? */
73         if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
74
75         /* Keine Parameter? */
76         if( Req->argc < 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
77
78         return CONNECTED;
79 } /* IRC_BAN */ 
80
81
82 GLOBAL BOOLEAN
83 IRC_INVITE( CLIENT *Client, REQUEST *Req )
84 {
85         CHANNEL *chan;
86         CLIENT *target, *from;
87         BOOLEAN remember = FALSE;
88
89         assert( Client != NULL );
90         assert( Req != NULL );
91
92         /* Valider Client? */
93         if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
94
95         /* Falsche Anzahl Parameter? */
96         if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
97
98         if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
99         else from = Client;
100         if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
101         
102         /* User suchen */
103         target = Client_Search( Req->argv[0] );
104         if(( ! target ) || ( Client_Type( target ) != CLIENT_USER )) return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
105
106         chan = Channel_Search( Req->argv[1] );
107
108         if( chan )
109         {
110                 /* Der Channel existiert bereits; ist der User Mitglied? */
111                 if( ! Channel_IsMemberOf( chan, from )) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( Client ), Req->argv[1] );
112
113                 /* Ist der Channel "invite-only"? */
114                 if( strchr( Channel_Modes( chan ), 'i' ))
115                 {
116                         /* Ja. Der User muss Channel-Operator sein! */
117                         if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan ));
118                         remember = TRUE;
119                 }
120
121                 /* Ist der Ziel-User bereits Mitglied? */
122                 if( Channel_IsMemberOf( chan, target )) return IRC_WriteStrClient( from, ERR_USERONCHANNEL_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] );
123
124         }
125
126         Log( LOG_DEBUG, "User \"%s\" invites \"%s\" to \"%s\" ...", Client_Mask( from ), Req->argv[0], Req->argv[1] );
127         if( remember )
128         {
129                 if( ! Lists_AddInvited( Client_Mask( target ), chan, TRUE )) return CONNECTED;
130         }
131         
132         /* an Ziel-Client forwarden ... */
133         IRC_WriteStrClientPrefix( target, from, "INVITE %s %s", Req->argv[0], Req->argv[1] );
134
135         if( Client_Conn( target ) > NONE )
136         {
137                 /* lokaler Ziel-Client, Status-Code melden */
138                 if( ! IRC_WriteStrClientPrefix( from, target, RPL_INVITING_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] )) return DISCONNECTED;
139         }
140         
141         return CONNECTED;
142 } /* IRC_INVITE */
143
144
145 /* -eof- */