X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/82f8e812f5f3df9a23b58dff2024f83237280b9d..82c11fc45cb57fc31f3dbfd97bd578865a0683ce:/modules/core/m_join.c diff --git a/modules/core/m_join.c b/modules/core/m_join.c index 79ab428..67360be 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 $"); @@ -67,9 +74,10 @@ static void remove_ban_list(struct Channel *chptr, struct Client *source_p, rb_dlink_list * list, char c, int mems); static char modebuf[MODEBUFLEN]; +static char omodebuf[MODEBUFLEN]; static char parabuf[MODEBUFLEN]; static const char *para[MAXMODEPARAMS]; -static char *mbuf; +static char *mbuf, *ombuf; static int pargs; /* @@ -85,6 +93,33 @@ 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; + + if(!MyClient(target_p)) + return 0; + + user_join(&me, target_p, parv[2], NULL); + return 0; +} + /* * ms_join * parv[1] = channel TS @@ -122,6 +157,7 @@ ms_join(struct Client *client_p, struct Client *source_p, int parc, const char * return 0; mbuf = modebuf; + ombuf = omodebuf; mode.key[0] = mode.forward[0] = '\0'; mode.mode = mode.limit = mode.join_num = mode.join_time = 0; @@ -190,7 +226,12 @@ ms_join(struct Client *client_p, struct Client *source_p, int parc, const char * ":%s MODE %s %s %s", source_p->servptr->name, chptr->chname, modebuf, parabuf); - *modebuf = *parabuf = '\0'; + if(*omodebuf != '\0') + sendto_channel_local(ONLY_OPERS, chptr, + ":%s MODE %s %s %s", + source_p->servptr->name, + chptr->chname, modebuf, parabuf); + *omodebuf = *modebuf = *parabuf = '\0'; } if(!IsMember(source_p, chptr)) @@ -249,7 +290,7 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char if(*parv[2] == '&') return 0; - modebuf[0] = parabuf[0] = mode.key[0] = mode.forward[0] = '\0'; + omodebuf[0] = modebuf[0] = parabuf[0] = mode.key[0] = mode.forward[0] = '\0'; pargs = mode.mode = mode.limit = mode.join_num = mode.join_time = 0; /* Hide connecting server on netburst -- jilles */ @@ -259,6 +300,7 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char fakesource_p = source_p; mbuf = modebuf; + ombuf = omodebuf; newts = atol(parv[1]); s = parv[3]; @@ -457,7 +499,11 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char sendto_channel_local(ALL_MEMBERS, chptr, ":%s MODE %s %s %s", fakesource_p->name, chptr->chname, modebuf, parabuf); - *modebuf = *parabuf = '\0'; + if(*omodebuf != '\0') + sendto_channel_local(ONLY_OPERS, chptr, ":%s MODE %s %s %s", + fakesource_p->name, chptr->chname, omodebuf, parabuf); + + *omodebuf = *modebuf = *parabuf = '\0'; if(parv[3][0] != '0' && keep_new_modes) modes = channel_modes(chptr, source_p); @@ -469,6 +515,7 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char ptr_uid = buf_uid + mlen_uid; mbuf = modebuf; + ombuf = omodebuf; para[0] = para[1] = para[2] = para[3] = empty; pargs = 0; len_nick = len_uid = 0; @@ -488,11 +535,11 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char { fl = 0; - for (i = 0; i < 2; i++) + for (i = 0; i < 4; i++) { if(*s == '!') { - fl |= CHFL_OWNER; + fl |= CHFL_ADMIN; s++; } else if(*s == '@') @@ -530,7 +577,7 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char if(keep_new_modes) { - if(fl & CHFL_OWNER) + if(fl & CHFL_ADMIN) { *ptr_uid++ = '!'; len_nick++; @@ -576,7 +623,7 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char /* If anyone can think of a way to do this that doesn't make babies cry * I would love to hear it - Taros */ - if(fl & CHFL_OWNER) + if(fl & CHFL_ADMIN) { *mbuf++ = 'a'; para[pargs++] = target_p->name; @@ -648,7 +695,7 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char para[pargs++] = target_p->name; } } - if(fl & CHFL_CHANOP) + else if(fl & CHFL_CHANOP) { *mbuf++ = 'o'; para[pargs++] = target_p->name; @@ -698,7 +745,7 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char para[pargs++] = target_p->name; } } - if(fl & CHFL_HALFOP) + else if(fl & CHFL_HALFOP) { *mbuf++ = 'h'; para[pargs++] = target_p->name; @@ -777,7 +824,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); @@ -799,7 +846,7 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char static void set_final_mode(struct Mode *mode, struct Mode *oldmode) { - int dir = MODE_QUERY; + int dir = MODE_QUERY, odir = MODE_QUERY; char *pbuf = parabuf; int len; int i; @@ -809,12 +856,25 @@ set_final_mode(struct Mode *mode, struct Mode *oldmode) { if((mode->mode & chmode_flags[i]) && !(oldmode->mode & chmode_flags[i])) { - if(dir != MODE_ADD) + if (chmode_table[i].set_func == chm_hidden) + { + if(odir != MODE_ADD) + { + *ombuf++ = '+'; + odir = MODE_ADD; + } + *ombuf++ = i; + } + else { - *mbuf++ = '+'; - dir = MODE_ADD; + if(dir != MODE_ADD) + { + *mbuf++ = '+'; + dir = MODE_ADD; + } + *mbuf++ = i; + } - *mbuf++ = i; } } @@ -823,12 +883,24 @@ set_final_mode(struct Mode *mode, struct Mode *oldmode) { if((oldmode->mode & chmode_flags[i]) && !(mode->mode & chmode_flags[i])) { - if(dir != MODE_DEL) + if(chmode_table[i].set_func == chm_hidden) + { + if(odir != MODE_DEL) + { + *ombuf++ = '-'; + odir = MODE_DEL; + } + *ombuf++ = i; + } + else { - *mbuf++ = '-'; - dir = MODE_DEL; + if(dir != MODE_DEL) + { + *mbuf++ = '-'; + dir = MODE_DEL; + } + *mbuf++ = i; } - *mbuf++ = i; } } @@ -903,7 +975,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) { @@ -947,9 +1019,9 @@ remove_our_modes(struct Channel *chptr, struct Client *source_p) /* If anyone can think of a way to do this that doesn't make babies cry * I would love to hear it - Taros */ - if(is_owner(msptr)) + if(is_admin(msptr)) { - msptr->flags &= ~CHFL_OWNER; + msptr->flags &= ~CHFL_ADMIN; lpara[count++] = msptr->client_p->name; *mbuf++ = 'a';