X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/c1c91f9438713b71a0b8b7cc9104458c7a6a3b47..33736ea75f5e27e1137abbe3dfedf856c064b7ef:/modules/core/m_join.c diff --git a/modules/core/m_join.c b/modules/core/m_join.c index 5e2ab29..81a6281 100644 --- a/modules/core/m_join.c +++ b/modules/core/m_join.c @@ -21,7 +21,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * - * $Id: m_join.c 3494 2007-05-27 13:07:27Z jilles $ */ #include "stdinc.h" @@ -43,20 +42,28 @@ #include "chmode.h" static int m_join(struct Client *, struct Client *, int, const char **); +static int me_svsjoin(struct Client *, struct Client *, int, const char **); static int ms_join(struct Client *, struct Client *, int, const char **); static int ms_sjoin(struct Client *, struct Client *, int, const char **); +struct module_modes ModuleModes; + struct Message join_msgtab = { "JOIN", 0, 0, 0, MFLG_SLOW, {mg_unreg, {m_join, 2}, {ms_join, 2}, mg_ignore, mg_ignore, {m_join, 2}} }; +struct Message svsjoin_msgtab = { + "SVSJOIN", 0, 0, 0, MFLG_SLOW, + {mg_ignore, mg_ignore, mg_ignore, mg_ignore, {me_svsjoin, 3}, mg_ignore} +}; + struct Message sjoin_msgtab = { "SJOIN", 0, 0, 0, MFLG_SLOW, {mg_unreg, mg_ignore, mg_ignore, {ms_sjoin, 4}, mg_ignore, mg_ignore} }; -mapi_clist_av1 join_clist[] = { &join_msgtab, &sjoin_msgtab, NULL }; +mapi_clist_av1 join_clist[] = { &join_msgtab, &svsjoin_msgtab, &sjoin_msgtab, NULL }; DECLARE_MODULE_AV1(join, NULL, NULL, join_clist, NULL, NULL, "$Revision: 3494 $"); @@ -86,6 +93,30 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p return 0; } +/* + * me_svsjoin - small function to allow services to forcejoin clients, mainly for ns_ajoin + * parv[1] = user to act on (join to a channel) + * parv[2] = channel + * This does allow opers to "forcejoin" users to channels with operserv/raw or by writing a + * custom module (where they can make it not log anything), but the former bitches that it's + * being used and the latter...Can probably be done anyway with enough hackyness if this + * command didn't exist so it's not all that bad. + */ +static int +me_svsjoin(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) +{ + struct Client *target_p; + + if(!(source_p->flags & FLAGS_SERVICE)) + return 0; + + if((target_p = find_person(parv[1])) == NULL) + return 0; + + user_join(&me, target_p, parv[2], NULL); + return 0; +} + /* * ms_join * parv[1] = channel TS @@ -790,7 +821,7 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char CheckEmpty(para[2]), CheckEmpty(para[3])); } - if(!joins && !(chptr->mode.mode & MODE_PERMANENT) && isnew) + if(!joins && !(chptr->mode.mode & ModuleModes.MODE_PERMANENT) && isnew) { destroy_channel(chptr); @@ -941,7 +972,7 @@ set_final_mode(struct Mode *mode, struct Mode *oldmode) len = rb_sprintf(pbuf, "%d:%d ", mode->join_num, mode->join_time); pbuf += len; } - if(mode->forward[0] && strcmp(oldmode->forward, mode->forward) && ConfigChannel.use_forward) + if(mode->forward[0] && strcmp(oldmode->forward, mode->forward) && ModuleModes.MODE_FORWARD) { if(dir != MODE_ADD) {