X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/3499aa48d5d1f3fe08d0160e9212dbde3c8bb32b..320a0f852891ac719c4c3349cfae836f8174bc4f:/modules/m_invite.c diff --git a/modules/m_invite.c b/modules/m_invite.c index be00603..cf475f9 100644 --- a/modules/m_invite.c +++ b/modules/m_invite.c @@ -25,12 +25,11 @@ */ #include "stdinc.h" -#include "tools.h" #include "common.h" #include "channel.h" #include "client.h" #include "hash.h" -#include "irc_string.h" +#include "match.h" #include "ircd.h" #include "numeric.h" #include "send.h" @@ -53,13 +52,13 @@ DECLARE_MODULE_AV1(invite, NULL, NULL, invite_clist, NULL, NULL, "$Revision: 343 static void add_invite(struct Channel *, struct Client *); /* m_invite() - * parv[0] - sender prefix * parv[1] - user to invite * parv[2] - channel name */ static int m_invite(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { + const char *awaymsg; struct Client *target_p; struct Channel *chptr; struct membership *msptr; @@ -111,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, @@ -157,9 +166,9 @@ m_invite(struct Client *client_p, struct Client *source_p, int parc, const char sendto_one(source_p, form_str(RPL_INVITING), me.name, source_p->name, target_p->name, parv[2]); - if(target_p->user->away) + if((awaymsg = get_metadata(target_p, "away")) != NULL) sendto_one_numeric(source_p, RPL_AWAY, form_str(RPL_AWAY), - target_p->name, target_p->user->away); + target_p->name, awaymsg); } /* invite timestamp */ else if(parc > 3 && !EmptyString(parv[3])) @@ -196,17 +205,17 @@ m_invite(struct Client *client_p, struct Client *source_p, int parc, const char static void add_invite(struct Channel *chptr, struct Client *who) { - dlink_node *ptr; + rb_dlink_node *ptr; /* already invited? */ - DLINK_FOREACH(ptr, who->user->invited.head) + RB_DLINK_FOREACH(ptr, who->user->invited.head) { if(ptr->data == chptr) return; } /* ok, if their invite list is too long, remove the tail */ - if((int)dlink_list_length(&who->user->invited) >= + if((int)rb_dlink_list_length(&who->user->invited) >= ConfigChannel.max_chans_per_user) { ptr = who->user->invited.tail; @@ -214,10 +223,10 @@ add_invite(struct Channel *chptr, struct Client *who) } /* add user to channel invite list */ - dlinkAddAlloc(who, &chptr->invites); + rb_dlinkAddAlloc(who, &chptr->invites); /* add channel to user invite list */ - dlinkAddAlloc(chptr, &who->user->invited); + rb_dlinkAddAlloc(chptr, &who->user->invited); }