]>
jfr.im git - irc/quakenet/newserv.git/blob - control/control.c
2 * This is the first client module for newserv :)
4 * A very simple bot which should give people some ideas for how to
5 * implement stuff on this thing
8 #include "../irc/irc_config.h"
9 #include "../parser/parser.h"
10 #include "../localuser/localuser.h"
11 #include "../localuser/localuserchannel.h"
12 #include "../nick/nick.h"
13 #include "../lib/sstring.h"
14 #include "../core/config.h"
15 #include "../irc/irc.h"
16 #include "../lib/splitline.h"
17 #include "../channel/channel.h"
18 #include "../lib/flags.h"
19 #include "../core/schedule.h"
20 #include "../lib/base64.h"
21 #include "../core/modules.h"
32 CommandTree
* controlcmds
;
34 void handlemessages ( nick
* target
, int messagetype
, void ** args
);
35 int controlstatus ( void * sender
, int cargc
, char ** cargv
);
36 void controlconnect ( void * arg
);
37 int controlwhois ( void * sender
, int cargc
, char ** cargv
);
38 int controlchannel ( void * sender
, int cargc
, char ** cargv
);
39 int relink ( void * sender
, int cargc
, char ** cargv
);
40 int die ( void * sender
, int cargc
, char ** cargv
);
41 int controlinsmod ( void * sender
, int cargc
, char ** cargv
);
42 int controlrmmod ( void * sender
, int cargc
, char ** cargv
);
43 int controlrehash ( void * sender
, int cargc
, char ** cargv
);
44 int controlshowcommands ( void * sender
, int cargc
, char ** cargv
);
45 int controlreload ( void * sender
, int cargc
, char ** cargv
);
48 controlcmds
= newcommandtree ();
50 addcommandtotree ( controlcmds
, "status" , 10 , 1 ,& controlstatus
);
51 addcommandtotree ( controlcmds
, "whois" , 10 , 1 ,& controlwhois
);
52 addcommandtotree ( controlcmds
, "channel" , 10 , 1 ,& controlchannel
);
53 addcommandtotree ( controlcmds
, "relink" , 10 , 1 ,& relink
);
54 addcommandtotree ( controlcmds
, "die" , 10 , 1 ,& die
);
55 addcommandtotree ( controlcmds
, "insmod" , 10 , 1 ,& controlinsmod
);
56 addcommandtotree ( controlcmds
, "rmmod" , 10 , 1 ,& controlrmmod
);
57 addcommandtotree ( controlcmds
, "rehash" , 10 , 1 ,& controlrehash
);
58 addcommandtotree ( controlcmds
, "showcommands" , 10 , 0 ,& controlshowcommands
);
59 addcommandtotree ( controlcmds
, "reload" , 10 , 1 ,& controlreload
);
61 scheduleoneshot ( time ( NULL
)+ 1 ,& controlconnect
, NULL
);
64 void registercontrolcmd ( const char * name
, int level
, int maxparams
, CommandHandler handler
) {
65 addcommandtotree ( controlcmds
, name
, level
, maxparams
, handler
);
68 int deregistercontrolcmd ( const char * name
, CommandHandler handler
) {
69 return deletecommandfromtree ( controlcmds
, name
, handler
);
72 void controlconnect ( void * arg
) {
73 sstring
* cnick
, * myident
, * myhost
, * myrealname
, * myauthname
;
76 cnick
= getcopyconfigitem ( "control" , "nick" , "C" , NICKLEN
);
77 myident
= getcopyconfigitem ( "control" , "ident" , "control" , NICKLEN
);
78 myhost
= getcopyconfigitem ( "control" , "hostname" , myserver
-> content
, HOSTLEN
);
79 myrealname
= getcopyconfigitem ( "control" , "realname" , "NewServ Control Service" , REALLEN
);
80 myauthname
= getcopyconfigitem ( "control" , "authname" , "C" , ACCOUNTLEN
);
82 mynick
= registerlocaluser ( cnick
-> content
, myident
-> content
, myhost
-> content
, myrealname
-> content
, myauthname
-> content
, UMODE_SERVICE
| UMODE_DEAF
| UMODE_OPER
| UMODE_ACCOUNT
,& handlemessages
);
83 cp
= findchannel ( "#twilightzone" );
85 localcreatechannel ( mynick
, "#twilightzone" );
87 localjoinchannel ( mynick
, cp
);
88 localgetops ( mynick
, cp
);
94 freesstring ( myrealname
);
95 freesstring ( myauthname
);
98 void handlestats ( int hooknum
, void * arg
) {
99 sendmessagetouser ( mynick
, statsnick
, " %s " ,( char *) arg
);
102 int controlstatus ( void * sender
, int cargc
, char ** cargv
) {
103 unsigned int level
= 5 ;
105 statsnick
=( nick
*) sender
;
108 level
= strtoul ( cargv
[ 0 ], NULL
, 10 );
111 registerhook ( HOOK_CORE_STATSREPLY
,& handlestats
);
112 triggerhook ( HOOK_CORE_STATSREQUEST
,( void *) level
);
113 deregisterhook ( HOOK_CORE_STATSREPLY
,& handlestats
);
117 int controlrehash ( void * sender
, int cargc
, char ** cargv
) {
118 nick
* np
=( nick
*) sender
;
120 controlreply ( np
, "Rehashing the config file." );
123 triggerhook ( HOOK_CORE_REHASH
,( void *) 0 );
127 int controlwhois ( void * sender
, int cargc
, char ** cargv
) {
134 sendmessagetouser ( mynick
,( nick
*) sender
, "Usage: whois <user>" );
138 if ( cargv
[ 0 ][ 0 ]== '#' ) {
139 if (!( target
= getnickbynumericstr ( cargv
[ 0 ]+ 1 ))) {
140 sendmessagetouser ( mynick
, sender
, "Sorry, couldn't find numeric %s " , cargv
[ 0 ]+ 1 );
144 if (( target
= getnickbynick ( cargv
[ 0 ]))== NULL
) {
145 sendmessagetouser ( mynick
,( nick
*) sender
, "Sorry, couldn't find that user" );
150 sendmessagetouser ( mynick
,( nick
*) sender
, "Nick : %s " , target
-> nick
);
151 sendmessagetouser ( mynick
,( nick
*) sender
, "Numeric : %s " , longtonumeric ( target
-> numeric
, 5 ));
152 sendmessagetouser ( mynick
,( nick
*) sender
, "User@Host : %s @ %s ( %d user(s) on this host)" , target
-> ident
, target
-> host
-> name
-> content
, target
-> host
-> clonecount
);
153 if ( IsSetHost ( target
)) {
154 if ( target
-> shident
) {
155 sendmessagetouser ( mynick
,( nick
*) sender
, "Fakehost : %s @ %s " , target
-> shident
-> content
, target
-> sethost
-> content
);
157 sendmessagetouser ( mynick
,( nick
*) sender
, "Fakehost : %s " , target
-> sethost
-> content
);
160 sendmessagetouser ( mynick
,( nick
*) sender
, "Timestamp : %l u" , target
-> timestamp
);
161 sendmessagetouser ( mynick
,( nick
*) sender
, "IP address: %d . %d . %d . %d " ,( target
-> ipaddress
)>> 24 ,( target
-> ipaddress
>> 16 )& 255 , ( target
-> ipaddress
>> 8 )& 255 , target
-> ipaddress
& 255 );
162 sendmessagetouser ( mynick
,( nick
*) sender
, "Realname : %s ( %d user(s) have this realname)" , target
-> realname
-> name
-> content
, target
-> realname
-> usercount
);
163 if ( target
-> umodes
) {
164 sendmessagetouser ( mynick
,( nick
*) sender
, "Umode(s) : %s " , printflags ( target
-> umodes
, umodeflags
));
166 if ( IsAccount ( target
)) {
167 sendmessagetouser ( mynick
,( nick
*) sender
, "Account : %s " , target
-> authname
);
168 if ( target
-> accountts
)
169 sendmessagetouser ( mynick
,( nick
*) sender
, "AccountTS : %l d" , target
-> accountts
);
171 if ( target
-> channels
-> cursi
== 0 ) {
172 sendmessagetouser ( mynick
,( nick
*) sender
, "Channels : none" );
173 } else if ( target
-> channels
-> cursi
> 50 ) {
174 sendmessagetouser ( mynick
,( nick
*) sender
, "Channels : - (total: %d )" , target
-> channels
-> cursi
);
177 channels
=( channel
**) target
-> channels
-> content
;
178 for ( i
= 0 ; i
<= target
-> channels
-> cursi
; i
++) {
179 if (!(( i
== target
-> channels
-> cursi
) || (( 70 - strlen ( buf
))< channels
[ i
]-> index
-> name
-> length
&& strlen ( buf
)> 0 ))) {
180 strcat ( buf
, channels
[ i
]-> index
-> name
-> content
);
183 if ( strlen ( buf
)== 0 ) {
186 sendmessagetouser ( mynick
,( nick
*) sender
, "Channels : %s " , buf
);
197 int controlinsmod ( void * sender
, int cargc
, char ** cargv
) {
199 sendmessagetouser ( mynick
,( nick
*) sender
, "Usage: insmod <modulename>" );
203 switch ( insmod ( cargv
[ 0 ])) {
205 sendmessagetouser ( mynick
,( nick
*) sender
, "Unable to load module %s " , cargv
[ 0 ]);
209 sendmessagetouser ( mynick
,( nick
*) sender
, "Module %s already loaded, or name not valid" , cargv
[ 0 ]);
213 sendmessagetouser ( mynick
,( nick
*) sender
, "Module %s loaded." , cargv
[ 0 ]);
217 sendmessagetouser ( mynick
,( nick
*) sender
, "An unknown error occured." );
222 int controlrmmod ( void * sender
, int cargc
, char ** cargv
) {
224 sendmessagetouser ( mynick
,( nick
*) sender
, "Usage: insmod <modulename>" );
228 switch ( rmmod ( cargv
[ 0 ])) {
230 sendmessagetouser ( mynick
,( nick
*) sender
, "Module %s is not loaded." , cargv
[ 0 ]);
234 sendmessagetouser ( mynick
,( nick
*) sender
, "Module %s unloaded." , cargv
[ 0 ]);
238 sendmessagetouser ( mynick
,( nick
*) sender
, "An unknown error occured." );
243 int controlreload ( void * sender
, int cargc
, char ** cargv
) {
245 sendmessagetouser ( mynick
,( nick
*) sender
, "Usage: reload <modulename>" );
249 controlrmmod ( sender
, cargc
, cargv
);
250 return controlinsmod ( sender
, cargc
, cargv
);
253 int relink ( void * sender
, int cargc
, char ** cargv
) {
255 sendmessagetouser ( mynick
,( nick
*) sender
, "You must give a reason." );
259 irc_send ( " %s SQ %s 0 : %s " , mynumeric
-> content
, myserver
-> content
, cargv
[ 0 ]);
265 int die ( void * sender
, int cargc
, char ** cargv
) {
267 sendmessagetouser ( mynick
,( nick
*) sender
, "You must give a reason." );
271 irc_send ( " %s SQ %s 0 : %s " , mynumeric
-> content
, myserver
-> content
, cargv
[ 0 ]);
277 int controlchannel ( void * sender
, int cargc
, char ** cargv
) {
286 sendmessagetouser ( mynick
,( nick
*) sender
, "Usage: channel #chan" );
290 if (( cp
= findchannel ( cargv
[ 0 ]))== NULL
) {
291 sendmessagetouser ( mynick
,( nick
*) sender
, "Couldn't find channel: %s " , cargv
[ 0 ]);
296 sprintf ( buf2
, " %d " , cp
-> limit
);
299 sendmessagetouser ( mynick
,( nick
*) sender
, "Channel : %s " , cp
-> index
-> name
-> content
);
301 sendmessagetouser ( mynick
,( nick
*) sender
, "Topic : %s " , cp
-> topic
-> content
);
302 sendmessagetouser ( mynick
,( nick
*) sender
, "T-time : %l d [ %s \]" , cp
-> topictime
, ctime (&( cp
-> topictime
)));
304 sendmessagetouser ( mynick
,( nick
*) sender
, "Mode(s) : %s %s%s%s " , printflags ( cp
-> flags
, cmodeflags
), IsLimit ( cp
)? buf2
: "" ,
305 IsLimit ( cp
)? " " : "" , IsKey ( cp
)? cp
-> key
-> content
: "" );
306 sendmessagetouser ( mynick
,( nick
*) sender
, "Users : %d (hash size %d , utilisation %.1f%%); %d unique hosts" ,
307 cp
-> users
-> totalusers
, cp
-> users
-> hashsize
,(( float )( 100 * cp
-> users
-> totalusers
)/ cp
-> users
-> hashsize
),
308 countuniquehosts ( cp
));
312 for ( j
= 0 ; j
<= cp
-> users
-> hashsize
; j
++) {
313 if ( i
== 4 || j
== cp
-> users
-> hashsize
) {
315 sendmessagetouser ( mynick
,( nick
*) sender
, "Users : %s " , buf
);
319 if ( j
== cp
-> users
-> hashsize
)
322 if ( cp
-> users
-> content
[ j
]!= nouser
) {
323 np
= getnickbynumeric ( cp
-> users
-> content
[ j
]);
324 sprintf (& buf
[ i
* 18 ], " %c%c %-15s " , cp
-> users
-> content
[ j
]& CUMODE_VOICE
? '+' : ' ' ,
325 cp
-> users
-> content
[ j
]& CUMODE_OP
? '@' : ' ' , np
? np
-> nick
: "!BUG-NONICK!" );
332 for ( cbp
= cp
-> bans
; cbp
; cbp
= cbp
-> next
) {
333 sendmessagetouser ( mynick
,( nick
*) sender
, "Ban : %s " , bantostringdebug ( cbp
));
338 int controlshowcommands ( void * sender
, int cargc
, char ** cargv
) {
339 nick
* np
=( nick
*) sender
;
340 Command
* cmdlist
[ 100 ];
343 n
= getcommandlist ( controlcmds
, cmdlist
, 100 );
345 controlreply ( np
, "The following commands are registered at present:" );
348 controlreply ( np
, " %s (level %d )" , cmdlist
[ i
]-> command
-> content
, cmdlist
[ i
]-> level
);
351 controlreply ( np
, "End of list." );
355 void handlemessages ( nick
* target
, int messagetype
, void ** args
) {
361 switch ( messagetype
) {
364 /* If it's a message, first arg is nick and second is message */
365 sender
=( nick
*) args
[ 0 ];
367 Error ( "control" , ERR_INFO
, "From: %s ! %s @ %s : %s " , sender
-> nick
, sender
-> ident
, sender
-> host
-> name
-> content
, ( char *) args
[ 1 ]);
369 /* Split the line into params */
370 cargc
= splitline (( char *) args
[ 1 ], cargv
, 50 , 0 );
377 cmd
= findcommandintree ( controlcmds
, cargv
[ 0 ], 1 );
379 sendmessagetouser ( mynick
, sender
, "Unknown command." );
383 if ( cmd
-> level
>= 10 && ! IsOper ( sender
)) {
384 sendmessagetouser ( mynick
, sender
, "You need to be opered to use this command." );
388 /* If we were doing "authed user tracking" here we'd put a check in for authlevel */
390 /* Check the maxargs */
391 if ( cmd
-> maxparams
<( cargc
- 1 )) {
392 /* We need to do some rejoining */
393 rejoinline ( cargv
[ cmd
-> maxparams
], cargc
-( cmd
-> maxparams
));
394 cargc
=( cmd
-> maxparams
)+ 1 ;
397 ( cmd
-> handler
)(( void *) sender
, cargc
- 1 ,&( cargv
[ 1 ]));
401 /* someone killed me? Bastards */
402 scheduleoneshot ( time ( NULL
)+ 1 ,& controlconnect
, NULL
);
411 void controlreply ( nick
* target
, char * message
, ... ) {
419 va_start ( va
, message
);
420 vsnprintf ( buf
, 512 , message
, va
);
423 sendmessagetouser ( mynick
, target
, " %s " , buf
);
426 void controlchanmsg ( channel
* cp
, char * message
, ...) {
434 va_start ( va
, message
);
435 vsnprintf ( buf
, 512 , message
, va
);
438 sendmessagetochannel ( mynick
, cp
, " %s " , buf
);
441 void controlnotice ( nick
* target
, char * message
, ... ) {
449 va_start ( va
, message
);
450 vsnprintf ( buf
, 512 , message
, va
);
453 sendnoticetouser ( mynick
, target
, " %s " , buf
);