]> arthur.barton.de Git - ngircd-alex.git/blob - src/ngircd/irc.c
- erste IRC-Befehle zu implementieren begonnen.
[ngircd-alex.git] / src / ngircd / irc.c
1 /*
2  * ngIRCd -- The Next Generation IRC Daemon
3  * Copyright (c)2001 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 comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
11  *
12  * $Id: irc.c,v 1.2 2001/12/23 21:57:16 alex Exp $
13  *
14  * irc.c: IRC-Befehle
15  *
16  * $Log: irc.c,v $
17  * Revision 1.2  2001/12/23 21:57:16  alex
18  * - erste IRC-Befehle zu implementieren begonnen.
19  *
20  * Revision 1.1  2001/12/14 08:13:43  alex
21  * - neues Modul begonnen :-)
22  */
23
24
25 #include <portab.h>
26 #include "global.h"
27
28 #include <imp.h>
29 #include <assert.h>
30 #include <stdarg.h>
31 #include <stdio.h>
32 #include <string.h>
33
34 #include "client.h"
35 #include "log.h"
36 #include "messages.h"
37 #include "parse.h"
38
39 #include <exp.h>
40 #include "irc.h"
41
42
43 LOCAL BOOLEAN Check_Valid_User( CLIENT *Client );
44
45
46 GLOBAL VOID IRC_Init( VOID )
47 {
48 } /* IRC_Init */
49
50
51 GLOBAL VOID IRC_Exit( VOID )
52 {
53 } /* IRC_Exit */
54
55
56 GLOBAL VOID IRC_WriteStr_Client( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... )
57 {
58         /* Text an Clients, lokal bzw. remote, senden. */
59
60         CHAR buffer[1000];
61         va_list ap;
62
63         assert( Client != NULL );
64         assert( Format != NULL );
65
66         va_start( ap, Format );
67
68         if( Client->conn_id != NONE )
69         {
70                 /* Lokaler Client */
71                 vsnprintf( buffer, 1000, Format, ap );
72                 if( Prefix ) Conn_WriteStr( Client->conn_id, ":%s %s", Prefix->host, buffer );
73                 else Conn_WriteStr( Client->conn_id, buffer );
74         }
75         else
76         {
77                 /* Remote-Client */
78                 Log( LOG_DEBUG, "not implemented: IRC_WriteStr_Client()" );
79         }
80         va_end( ap );
81 } /* IRC_WriteStr_Client */
82
83
84 GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req )
85 {
86         assert( Client != NULL );
87         assert( Req != NULL );
88
89         IRC_WriteStr_Client( Client, This_Server, ERR_UNKNOWNCOMMAND_MSG, Req->command );
90         return TRUE;
91 } /* IRC_PASS */
92
93
94 GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req )
95 {
96         assert( Client != NULL );
97         assert( Req != NULL );
98
99         if( Client->type == CLIENT_UNKNOWN || Client->type == CLIENT_PASS )
100         {
101                 /* Neuer Client */
102                 if( Req->argc == 1 )
103                 {
104                         if( strlen( Req->argv[0] ) <= CLIENT_NICK_LEN )
105                         {
106                                 /* Client-Nick registrieren */
107                                 strcpy( Client->nick, Req->argv[0] );
108                                 Client->type = CLIENT_NICK;
109                         }
110                         else IRC_WriteStr_Client( Client, This_Server, ERR_ERRONEUSNICKNAME_MSG, Req->argv[0] );
111                 }
112                 else IRC_WriteStr_Client( Client, This_Server, ERR_NEEDMOREPARAMS_MSG );
113         }
114         else if( Client->type == CLIENT_USER )
115         {
116                 /* Nick-Aenderung eines Users */
117                 if( ! Check_Valid_User( Client )) return TRUE;
118                 Log( LOG_DEBUG, "not implemented: IRC_NICK()" );
119         }
120         else IRC_WriteStr_Client( Client, This_Server, ERR_ALREADYREGISTRED_MSG );
121
122         return TRUE;
123 } /* IRC_NICK */
124
125
126 GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req )
127 {
128         assert( Client != NULL );
129         assert( Req != NULL );
130
131         if( Client->type == CLIENT_NICK )
132         {
133                 if( Req->argc == 4 )
134                 {
135                         strncpy( Client->user, Req->argv[0], CLIENT_USER_LEN );
136                         Client->user[CLIENT_USER_LEN] = '\0';
137                         strncpy( Client->name, Req->argv[3], CLIENT_NAME_LEN );
138                         Client->name[CLIENT_NAME_LEN] = '\0';
139                         Log( LOG_INFO, "User \"%s!%s@%s\" (%s) registered.", Client->nick, Client->user, Client->host, Client->name );
140                         IRC_WriteStr_Client( Client, This_Server, RPL_WELCOME_MSG, Client->nick, Client->user, Client->host );
141                         IRC_WriteStr_Client( Client, This_Server, RPL_YOURHOST_MSG, This_Server->host );
142                         IRC_WriteStr_Client( Client, This_Server, RPL_CREATED_MSG );
143                         IRC_WriteStr_Client( Client, This_Server, RPL_MYINFO_MSG );
144                 }
145                 else IRC_WriteStr_Client( Client, This_Server, ERR_NEEDMOREPARAMS_MSG );
146         }
147         else if( Client->type == CLIENT_USER || Client->type == CLIENT_SERVER || Client->type == CLIENT_SERVICE )
148         {
149                 IRC_WriteStr_Client( Client, This_Server, ERR_ALREADYREGISTRED_MSG );
150         }
151         else IRC_WriteStr_Client( Client, This_Server, ERR_NOTREGISTERED_MSG );
152
153         return TRUE;
154 } /* IRC_USER */
155
156
157 LOCAL BOOLEAN Check_Valid_User( CLIENT *Client )
158 {
159         assert( Client != NULL );
160
161         if( Client->type != CLIENT_USER )
162         {
163                 IRC_WriteStr_Client( Client, This_Server, ERR_NOTREGISTERED_MSG );
164                 return FALSE;
165         }
166         else return TRUE;
167 } /* Check_Valid_User */
168
169
170 /* -eof- */