]>
jfr.im git - irc/quakenet/newserv.git/blob - lua/lualocal.c
3 #include "../localuser/localuser.h"
4 #include "../lib/strlfunc.h"
5 #include "../core/schedule.h"
6 #include "../channel/channel.h"
7 #include "../localuser/localuserchannel.h"
13 void lua_localnickhandler(nick
*target
, int type
, void **args
);
14 void lua_reconnectlocal(void *arg
);
16 static int lua_registerlocaluser(lua_State
*ps
) {
19 char *nickname
, *ident
, *hostname
, *realname
, *account
;
22 if(!lua_isstring(ps
, 1) || !lua_isstring(ps
, 2) || !lua_isstring(ps
, 3) || !lua_isstring(ps
, 4) || !lua_isstring(ps
, 5) || !lua_isstring(ps
, 6) || !lua_isfunction(ps
, 7))
25 nickname
= (char *)lua_tostring(ps
, 1);
26 ident
= (char *)lua_tostring(ps
, 2);
27 hostname
= (char *)lua_tostring(ps
, 3);
28 realname
= (char *)lua_tostring(ps
, 4);
29 account
= (char *)lua_tostring(ps
, 5);
31 setflags(&modes
, UMODE_ALL
, (char *)lua_tostring(ps
, 6), umodeflags
, REJECT_NONE
);
33 if(!lua_lineok(nickname
) || !lua_lineok(ident
) || !lua_lineok(hostname
) || !lua_lineok(realname
) || !lua_lineok(account
))
36 l
= lua_listfromstate(ps
);
40 ln
= (lua_localnick
*)malloc(sizeof(lua_localnick
));
46 ln
->nick
= registerlocaluser(nickname
, ident
, hostname
, realname
, account
, modes
, &lua_localnickhandler
);
52 ln
->handler
= luaL_ref(ps
, LUA_REGISTRYINDEX
);
57 lua_pushlong(ps
, ln
->nick
->numeric
);
61 void lua_freelocalnick(lua_State
*ps
, lua_localnick
*l
, char *quitm
) {
63 deregisterlocaluser(l
->nick
, quitm
);
66 deleteschedule(l
->reconnect
, &lua_reconnectlocal
, l
);
68 luaL_unref(ps
, LUA_REGISTRYINDEX
, l
->handler
);
73 int lua_getlocalnickbynick(nick
*np
, lua_list
**rl
, lua_localnick
**rln
) {
77 for(l
=lua_head
;l
;l
=l
->next
)
78 for(ln
=l
->nicks
;ln
;ln
=ln
->next
)
88 static int lua_deregisterlocaluser(lua_State
*ps
) {
90 lua_localnick
*l2
, *lp
= NULL
;
94 if(!lua_islong(ps
, 1))
95 LUA_RETURN(ps
, LUA_FAIL
);
97 numeric
= lua_tolong(ps
, 1);
99 quitm
= lua_isstring(ps
, 2)?(char *)lua_tostring(ps
, 2):"localuser unregistered.";
101 l
= lua_listfromstate(ps
);
103 for(l2
=l
->nicks
;l2
;lp
=l2
,l2
=l2
->next
) {
104 if(l2
->nick
->numeric
== numeric
) {
111 lua_freelocalnick(ps
, l2
, quitm
);
112 LUA_RETURN(ps
, LUA_OK
);
116 LUA_RETURN(ps
, LUA_FAIL
);
119 void lua_deregisternicks(lua_list
*l
) {
120 struct lua_localnick
*ln
, *pn
;
122 for(ln
=l
->nicks
;ln
;ln
=pn
) {
125 lua_freelocalnick(l
->l
, ln
, "Script unloaded.");
132 void lua_localnickhandler(nick
*target
, int type
, void **args
) {
139 if(!lua_getlocalnickbynick(target
, &l
, &ln
))
144 np
= (nick
*)args
[0];
150 lua_vlpcall(l
, ln
, "irc_onmsg", "Ns", np
, p
);
155 np
= (nick
*)args
[0];
156 c
= (channel
*)args
[1];
159 if(!np
|| !p
|| !c
|| !c
->index
|| !c
->index
->name
|| !c
->index
->name
->content
)
162 lua_vlpcall(l
, ln
, "irc_onchanmsg", "Nss", np
, c
->index
->name
->content
, p
);
167 lua_vlpcall(l
, ln
, "irc_onkilled", "s", p
);
169 strlcpy(ln
->nickname
, target
->nick
, sizeof(ln
->nickname
));
170 strlcpy(ln
->ident
, target
->ident
, sizeof(ln
->ident
));
171 strlcpy(ln
->hostname
, target
->host
->name
->content
, sizeof(ln
->hostname
));
172 strlcpy(ln
->realname
, target
->realname
->name
->content
, sizeof(ln
->realname
));
173 strlcpy(ln
->account
, target
->authname
, sizeof(ln
->account
));
175 ln
->umodes
= target
->umodes
;
178 ln
->reconnect
= scheduleoneshot(time(NULL
) + 1, &lua_reconnectlocal
, ln
);
182 /* we were invited, check if someone invited us to PUBLICCHAN */
183 np
= (nick
*)args
[0];
184 c
= (channel
*)args
[1];
186 if(!c
|| !np
|| !c
->index
|| !c
->index
->name
|| !c
->index
->name
->content
)
189 lua_vlpcall(l
, ln
, "irc_oninvite", "Ns", np
, c
->index
->name
->content
);
194 void lua_reconnectlocal(void *arg
) {
196 lua_localnick
*ln
= (lua_localnick
*)arg
;
198 ln
->nick
= registerlocaluser(ln
->nickname
, ln
->ident
, ln
->hostname
, ln
->realname
, ln
->account
, ln
->umodes
, &lua_localnickhandler
);
200 ln
->reconnect
= scheduleoneshot(time(NULL
) + 1, &lua_reconnectlocal
, ln
);
204 ln
->reconnect
= NULL
;
206 if(lua_getlocalnickbynick(ln
->nick
, &l
, &ln
)) /* hacky! */
207 lua_vlpcall(l
, ln
, "irc_onkillreconnect", "");
210 static int lua_localjoin(lua_State
*ps
) {
215 if(!lua_islong(ps
, 1) || !lua_isstring(ps
, 2))
216 LUA_RETURN(ps
, LUA_FAIL
);
218 source
= getnickbynumeric(lua_tolong(ps
, 1));
220 LUA_RETURN(ps
, LUA_FAIL
);
222 chan
= (char *)lua_tostring(ps
, 2);
224 LUA_RETURN(ps
, LUA_FAIL
);
226 if(!lua_lineok(chan
))
227 LUA_RETURN(ps
, LUA_FAIL
);
229 target
= findchannel(chan
);
231 localjoinchannel(source
, target
);
233 localcreatechannel(source
, chan
);
236 LUA_RETURN(ps
, LUA_OK
);
239 static int lua_localpart(lua_State
*ps
) {
244 if(!lua_islong(ps
, 1) || !lua_isstring(ps
, 2))
245 LUA_RETURN(ps
, LUA_FAIL
);
247 source
= getnickbynumeric(lua_tolong(ps
, 1));
249 LUA_RETURN(ps
, LUA_FAIL
);
251 chan
= (char *)lua_tostring(ps
, 2);
253 if(!lua_lineok(chan
))
254 LUA_RETURN(ps
, LUA_FAIL
);
256 if(lua_isstring(ps
, 3)) {
257 reason
= (char *)lua_tostring(ps
, 3);
258 if(!lua_lineok(reason
))
259 LUA_RETURN(ps
, LUA_FAIL
);
264 target
= findchannel(chan
);
266 localpartchannel(source
, target
, reason
);
268 LUA_RETURN(ps
, LUA_FAIL
);
271 LUA_RETURN(ps
, LUA_OK
);
274 static int lua_localchanmsg(lua_State
*ps
) {
279 if(!lua_islong(ps
, 1) || !lua_isstring(ps
, 2) || !lua_isstring(ps
, 3))
280 LUA_RETURN(ps
, LUA_FAIL
);
282 source
= getnickbynumeric(lua_tolong(ps
, 1));
284 LUA_RETURN(ps
, LUA_FAIL
);
286 target
= findchannel((char *)lua_tostring(ps
, 2));
288 LUA_RETURN(ps
, LUA_FAIL
);
290 msg
= (char *)lua_tostring(ps
, 3);
293 LUA_RETURN(ps
, LUA_FAIL
);
295 sendmessagetochannel(source
, target
, "%s", msg
);
297 LUA_RETURN(ps
, LUA_OK
);
300 static int lua_localnotice(lua_State
*ps
) {
305 if(!lua_islong(ps
, 1) || !lua_islong(ps
, 2) || !lua_isstring(ps
, 3))
306 LUA_RETURN(ps
, LUA_FAIL
);
308 source
= getnickbynumeric(lua_tolong(ps
, 1));
310 LUA_RETURN(ps
, LUA_FAIL
);
312 target
= getnickbynumeric(lua_tolong(ps
, 2));
314 LUA_RETURN(ps
, LUA_FAIL
);
316 msg
= (char *)lua_tostring(ps
, 3);
319 LUA_RETURN(ps
, LUA_FAIL
);
321 sendnoticetouser(source
, target
, "%s", msg
);
323 LUA_RETURN(ps
, LUA_OK
);
326 static int lua_localprivmsg(lua_State
*ps
) {
331 if(!lua_islong(ps
, 1) || !lua_islong(ps
, 2) || !lua_isstring(ps
, 3))
332 LUA_RETURN(ps
, LUA_FAIL
);
334 source
= getnickbynumeric(lua_tolong(ps
, 1));
336 LUA_RETURN(ps
, LUA_FAIL
);
338 target
= getnickbynumeric(lua_tolong(ps
, 2));
340 LUA_RETURN(ps
, LUA_FAIL
);
342 msg
= (char *)lua_tostring(ps
, 3);
345 LUA_RETURN(ps
, LUA_FAIL
);
347 sendmessagetouser(source
, target
, "%s", msg
);
349 LUA_RETURN(ps
, LUA_OK
);
352 static int lua_localovmode(lua_State
*l
) {
355 int state
= 0, add
, realmode
, ignoring
= 0;
358 if(!lua_islong(l
, 1) || !lua_isstring(l
, 2) || !lua_istable(l
, 3))
359 LUA_RETURN(l
, LUA_FAIL
);
361 source
= getnickbynumeric(lua_tolong(l
, 1));
363 LUA_RETURN(l
, LUA_FAIL
);
365 chan
= findchannel((char *)lua_tostring(l
, 2));
367 LUA_RETURN(l
, LUA_FAIL
);
369 localsetmodeinit(&changes
, chan
, source
);
373 while(lua_next(l
, 3)) {
377 if(!lua_isboolean(l
, -1)) {
380 add
= (int)lua_toboolean(l
, -1);
382 } else if((state
== 1) && !ignoring
) {
383 if(!lua_isstring(l
, -1)) {
386 char *mode
= (char *)lua_tostring(l
, -1);
387 if((*mode
== 'o') && add
) {
389 } else if (*mode
== 'o') {
391 } else if((*mode
== 'v') && add
) {
393 } else if (*mode
== 'v') {
394 realmode
= MC_DEVOICE
;
399 } else if((state
== 2) && !ignoring
) {
400 if(lua_islong(l
, -1)) {
401 nick
*target
= getnickbynumeric(lua_tolong(l
, -1));
403 localdosetmode_nick(&changes
, target
, realmode
);
409 state
= (state
+ 1) % 3;
412 localsetmodeflush(&changes
, 1);
414 LUA_RETURN(l
, LUA_OK
);
417 static int lua_localumodes(lua_State
*ps
) {
422 if(!lua_islong(ps
, 1) || !lua_isstring(ps
, 2))
423 LUA_RETURN(ps
, LUA_FAIL
);
425 np
= getnickbynumeric(lua_tolong(ps
, 1));
427 LUA_RETURN(ps
, LUA_FAIL
);
429 modes
= (char *)lua_tostring(ps
, 2);
431 setflags(&newmodes
, UMODE_ALL
, modes
, umodeflags
, REJECT_NONE
);
433 localusersetumodes(np
, newmodes
);
434 LUA_RETURN(ps
, LUA_OK
);
437 static int lua_localtopic(lua_State
*ps
) {
442 if(!lua_islong(ps
, 1) || !lua_isstring(ps
, 2) || !lua_isstring(ps
, 3))
443 LUA_RETURN(ps
, LUA_FAIL
);
445 np
= getnickbynumeric(lua_tolong(ps
, 1));
447 LUA_RETURN(ps
, LUA_FAIL
);
449 cp
= findchannel((char *)lua_tostring(ps
, 2));
451 LUA_RETURN(ps
, LUA_FAIL
);
453 topic
= (char *)lua_tostring(ps
, 3);
454 if(!topic
|| !lua_lineok(topic
))
455 LUA_RETURN(ps
, LUA_FAIL
);
457 localsettopic(np
, cp
, topic
);
459 LUA_RETURN(ps
, LUA_OK
);
462 static int lua_localban(lua_State
*ps
) {
470 if(!lua_islong(ps
, 1) || !lua_isstring(ps
, 2) || !lua_isstring(ps
, 3))
471 LUA_RETURN(ps
, LUA_FAIL
);
473 if(lua_isboolean(ps
, 4) && lua_toboolean(ps
, 4))
476 source
= getnickbynumeric(lua_tolong(ps
, 1));
478 cp
= findchannel((char *)lua_tostring(ps
, 2));
480 LUA_RETURN(ps
, LUA_FAIL
);
482 mask
= lua_tostring(ps
, 3);
483 if(!mask
|| !mask
[0] || !lua_lineok(mask
))
484 LUA_RETURN(ps
, LUA_FAIL
);
486 localsetmodeinit(&changes
, cp
, source
);
487 localdosetmode_ban(&changes
, mask
, dir
);
488 localsetmodeflush(&changes
, 1);
490 LUA_RETURN(ps
, LUA_OK
);
493 static int lua_localkick(lua_State
*ps
) {
494 const char *n
, *msg
, *chan
;
499 if(!lua_islong(ps
, 1) || !lua_isstring(ps
, 2) || !lua_isstring(ps
, 3) || !lua_isstring(ps
, 4))
500 LUA_RETURN(ps
, LUA_FAIL
);
502 source
= getnickbynumeric(lua_tolong(ps
, 1));
503 chan
= lua_tostring(ps
, 2);
504 n
= lua_tostring(ps
, 3);
505 msg
= lua_tostring(ps
, 4);
507 LUA_RETURN(ps
, LUA_FAIL
);
509 if(lua_isboolean(ps
, 4) && !lua_toboolean(ps
, 4))
512 np
= getnickbynick(n
);
514 LUA_RETURN(ps
, LUA_FAIL
);
516 if(dochecks
&& (IsOper(np
) || IsXOper(np
) || IsService(np
)))
517 LUA_RETURN(ps
, LUA_FAIL
);
519 cp
= findchannel((char *)chan
);
521 LUA_RETURN(ps
, LUA_FAIL
);
524 LUA_RETURN(ps
, LUA_FAIL
);
526 localkickuser(source
, cp
, np
, msg
);
528 LUA_RETURN(ps
, LUA_OK
);
531 void lua_registerlocalcommands(lua_State
*l
) {
532 lua_register(l
, "irc_localregisteruser", lua_registerlocaluser
);
533 lua_register(l
, "irc_localderegisteruser", lua_deregisterlocaluser
);
534 lua_register(l
, "irc_localjoin", lua_localjoin
);
535 lua_register(l
, "irc_localpart", lua_localpart
);
536 lua_register(l
, "irc_localchanmsg", lua_localchanmsg
);
537 lua_register(l
, "irc_localnotice", lua_localnotice
);
538 lua_register(l
, "irc_localprivmsg", lua_localprivmsg
);
540 lua_register(l
, "irc_localovmode", lua_localovmode
);
541 lua_register(l
, "irc_localtopic", lua_localtopic
);
543 lua_register(l
, "irc_localban", lua_localban
);
544 lua_register(l
, "irc_localkick", lua_localkick
);
545 lua_register(l
, "irc_localumodes", lua_localumodes
);