summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/users.h3
-rw-r--r--src/commands.cpp96
-rw-r--r--src/inspircd.cpp2
-rw-r--r--src/users.cpp5
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;