X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/ac408af6cba5a230c66186d4389e60766c3a74a4..45b9f1cbc0e0be0cc8801be9f61796fa603ad462:/modules/m_invite.c diff --git a/modules/m_invite.c b/modules/m_invite.c index 91254ad..6ed4471 100644 --- a/modules/m_invite.c +++ b/modules/m_invite.c @@ -39,6 +39,7 @@ #include "parse.h" #include "modules.h" #include "packet.h" +#include "tgchange.h" static int m_invite(struct Client *, struct Client *, int, const char **); @@ -109,6 +110,16 @@ m_invite(struct Client *client_p, struct Client *source_p, int parc, const char return 0; } + if(((MyConnect(source_p) && !IsExemptResv(source_p)) || + (MyConnect(target_p) && !IsExemptResv(target_p))) && + hash_find_resv(parv[2])) + { + sendto_one_numeric(source_p, ERR_BADCHANNAME, + form_str(ERR_BADCHANNAME), + parv[2]); + return 0; + } + if((chptr = find_channel(parv[2])) == NULL) { sendto_one_numeric(source_p, ERR_NOSUCHCHANNEL, @@ -142,6 +153,14 @@ m_invite(struct Client *client_p, struct Client *source_p, int parc, const char return 0; } + if (IsSetNoInvite(target_p)) + { + sendto_one_numeric(source_p, ERR_NOINVITE, + form_str(ERR_NOINVITE), + target_p->name); + return 0; + } + /* store invites when they could affect the ability to join * for +l/+j just check if the mode is set, this varies over time */ @@ -152,6 +171,14 @@ m_invite(struct Client *client_p, struct Client *source_p, int parc, const char if(MyConnect(source_p)) { + if (ConfigFileEntry.target_change && !IsOper(source_p) && + !find_allowing_channel(source_p, target_p) && + !add_target(source_p, target_p)) + { + sendto_one(source_p, form_str(ERR_TARGCHANGE), + me.name, source_p->name, target_p->name); + return 0; + } sendto_one(source_p, form_str(RPL_INVITING), me.name, source_p->name, target_p->name, parv[2]); @@ -169,6 +196,34 @@ m_invite(struct Client *client_p, struct Client *source_p, int parc, const char if(MyConnect(target_p)) { + if(!IsOper(source_p) && (IsSetCallerId(target_p) || + (IsSetRegOnlyMsg(target_p) && !source_p->user->suser[0])) && + !accept_message(source_p, target_p)) + { + if (IsSetRegOnlyMsg(target_p) && !source_p->user->suser[0]) + { + sendto_one_numeric(source_p, ERR_NONONREG, + form_str(ERR_NONONREG), + target_p->name); + return 0; + } + else + { + /* instead of sending RPL_UMODEGMSG, + * just let the invite through + */ + if((target_p->localClient->last_caller_id_time + + ConfigFileEntry.caller_id_wait) >= rb_current_time()) + { + sendto_one_numeric(source_p, ERR_TARGUMODEG, + form_str(ERR_TARGUMODEG), + target_p->name); + return 0; + } + target_p->localClient->last_caller_id_time = rb_current_time(); + } + } + add_reply_target(target_p, source_p); sendto_one(target_p, ":%s!%s@%s INVITE %s :%s", source_p->name, source_p->username, source_p->host, target_p->name, chptr->chname);