diff options
-rw-r--r-- | include/users.h | 3 | ||||
-rw-r--r-- | src/commands.cpp | 96 | ||||
-rw-r--r-- | src/inspircd.cpp | 2 | ||||
-rw-r--r-- | src/users.cpp | 5 |
4 files changed, 65 insertions, 41 deletions
diff --git a/include/users.h b/include/users.h index 681f5d4b4..2dda51984 100644 --- a/include/users.h +++ b/include/users.h @@ -308,6 +308,9 @@ class userrec : public connection */ void FlushWriteBuf(); + /** Returns the list of channels this user has been invited to but has not yet joined. + */ + InvitedList* GetInviteList(); }; /** A lightweight userrec used by WHOWAS diff --git a/src/commands.cpp b/src/commands.cpp index 692dcd223..d81f493a6 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -463,59 +463,75 @@ void handle_pass(char **parameters, int pcnt, userrec *user) void handle_invite(char **parameters, int pcnt, userrec *user) { - userrec* u = Find(parameters[0]); - chanrec* c = FindChan(parameters[1]); - - if ((!c) || (!u)) + if (pcnt == 2) { - if (!c) + userrec* u = Find(parameters[0]); + chanrec* c = FindChan(parameters[1]); + + if ((!c) || (!u)) { - WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[1]); + if (!c) + { + WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[1]); + } + else + { + if (c->binarymodes & CM_INVITEONLY) + { + WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]); + } + } + + return; } - else + + if (c->binarymodes & CM_INVITEONLY) { - if (c->binarymodes & CM_INVITEONLY) + if (cstatus(user,c) < STATUS_HOP) { - WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]); + WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, c->name); + return; } } + if (has_channel(u,c)) + { + WriteServ(user->fd,"443 %s %s %s :Is already on channel %s",user->nick,u->nick,c->name,c->name); + return; + } + if (!has_channel(user,c)) + { + WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, c->name); + return; + } - return; - } + int MOD_RESULT = 0; + FOREACH_RESULT(OnUserPreInvite(user,u,c)); + if (MOD_RESULT == 1) { + return; + } - if (c->binarymodes & CM_INVITEONLY) + u->InviteTo(c->name); + WriteFrom(u->fd,user,"INVITE %s :%s",u->nick,c->name); + WriteServ(user->fd,"341 %s %s %s",user->nick,u->nick,c->name); + + // i token must go to ALL servers!!! + char buffer[MAXBUF]; + snprintf(buffer,MAXBUF,"i %s %s %s",u->nick,user->nick,c->name); + NetSendToAll(buffer); + } + else { - if (cstatus(user,c) < STATUS_HOP) + // pinched from ircu - invite with not enough parameters shows channels + // youve been invited to but haven't joined yet. + InvitedList* il = user->GetInviteList(); + for (InvitedList::iterator i = il->begin(); i != il->end(); i++) { - WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, c->name); - return; + if (i->channel) { + WriteServ(user->fd,"346 %s :%s",user->nick,i->channel); + } } + WriteServ(user->fd,"347 %s :End of INVITE list",user->nick); } - if (has_channel(u,c)) - { - WriteServ(user->fd,"443 %s %s %s :Is already on channel %s",user->nick,u->nick,c->name,c->name); - return; - } - if (!has_channel(user,c)) - { - WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, c->name); - return; - } - - int MOD_RESULT = 0; - FOREACH_RESULT(OnUserPreInvite(user,u,c)); - if (MOD_RESULT == 1) { - return; - } - - u->InviteTo(c->name); - WriteFrom(u->fd,user,"INVITE %s :%s",u->nick,c->name); - WriteServ(user->fd,"341 %s %s %s",user->nick,u->nick,c->name); - - // i token must go to ALL servers!!! - char buffer[MAXBUF]; - snprintf(buffer,MAXBUF,"i %s %s %s",u->nick,user->nick,c->name); - NetSendToAll(buffer); } void handle_topic(char **parameters, int pcnt, userrec *user) diff --git a/src/inspircd.cpp b/src/inspircd.cpp index d5778e804..3430990eb 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -3553,7 +3553,7 @@ void SetupCommandTable(void) createcommand("ISON",handle_ison,0,0,"<core>"); createcommand("SUMMON",handle_summon,0,0,"<core>"); createcommand("USERS",handle_users,0,0,"<core>"); - createcommand("INVITE",handle_invite,0,2,"<core>"); + createcommand("INVITE",handle_invite,0,0,"<core>"); createcommand("PASS",handle_pass,0,1,"<core>"); createcommand("TRACE",handle_trace,'o',0,"<core>"); createcommand("WHOWAS",handle_whowas,0,1,"<core>"); diff --git a/src/users.cpp b/src/users.cpp index 7a8878106..6fca08abc 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -85,6 +85,11 @@ bool userrec::IsInvited(char* channel) return false; } +InvitedList* userrec::GetInviteList() +{ + return &invites; +} + void userrec::InviteTo(char* channel) { Invited i; |