summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Powell <petpow@saberuk.com>2015-11-26 04:07:50 +0000
committerPeter Powell <petpow@saberuk.com>2015-12-07 09:47:54 +0000
commitbe0d7ab72ab276f63eacc5c6600ea13e9dc0666c (patch)
treec63964222d96004fd104632c8edafc3b46199778 /src
parent91fe9afed5ee65f1d6dc1d0d3cdee628125f4d0d (diff)
Fix CAP REQ to be atomic like the standard dictates.
Reported by @dequis on IRC.
Diffstat (limited to 'src')
-rw-r--r--src/modules/m_cap.cpp16
-rw-r--r--src/modules/m_cap.h5
2 files changed, 12 insertions, 9 deletions
diff --git a/src/modules/m_cap.cpp b/src/modules/m_cap.cpp
index e9f4dae90..37478243f 100644
--- a/src/modules/m_cap.cpp
+++ b/src/modules/m_cap.cpp
@@ -72,17 +72,17 @@ class CommandCAP : public Command
reghold.set(user, 1);
Data.Send();
- if (Data.ack.size() > 0)
+ if (Data.wanted.empty())
{
- std::string AckResult = irc::stringjoiner(" ", Data.ack, 0, Data.ack.size() - 1).GetJoined();
- user->WriteServ("CAP %s ACK :%s", user->nick.c_str(), AckResult.c_str());
+ user->WriteServ("CAP %s ACK :%s", user->nick.c_str(), parameters[1].c_str());
+ return CMD_SUCCESS;
}
- if (Data.wanted.size() > 0)
- {
- std::string NakResult = irc::stringjoiner(" ", Data.wanted, 0, Data.wanted.size() - 1).GetJoined();
- user->WriteServ("CAP %s NAK :%s", user->nick.c_str(), NakResult.c_str());
- }
+ // HACK: reset all of the caps which were enabled on this user because a cap request is atomic.
+ for (std::vector<std::pair<GenericCap*, int> >::iterator iter = Data.changed.begin(); iter != Data.changed.end(); ++iter)
+ iter->first->ext.set(user, iter->second);
+
+ user->WriteServ("CAP %s NAK :%s", user->nick.c_str(), parameters[1].c_str());
}
else if (subcommand == "END")
{
diff --git a/src/modules/m_cap.h b/src/modules/m_cap.h
index 409671f48..23cf8cf69 100644
--- a/src/modules/m_cap.h
+++ b/src/modules/m_cap.h
@@ -21,6 +21,8 @@
#ifndef M_CAP_H
#define M_CAP_H
+class GenericCap;
+
class CapEvent : public Event
{
public:
@@ -35,6 +37,7 @@ class CapEvent : public Event
CapEventType type;
std::vector<std::string> wanted;
std::vector<std::string> ack;
+ std::vector<std::pair<GenericCap*, int> > changed; // HACK: clean this up before 2.2
User* user;
CapEvent(Module* sender, User* u, CapEventType capevtype) : Event(sender, "cap_request"), type(capevtype), user(u) {}
};
@@ -67,7 +70,7 @@ class GenericCap
// we can handle this, so ACK it, and remove it from the wanted list
data->ack.push_back(*it);
data->wanted.erase(it);
- ext.set(data->user, enablecap ? 1 : 0);
+ data->changed.push_back(std::make_pair(this, ext.set(data->user, enablecap ? 1 : 0)));
break;
}
}