2 * InspIRCd -- Internet Relay Chat Daemon
4 * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
5 * Copyright (C) 2008 Craig Edwards <craigedwards@brainbox.cc>
7 * This file is part of InspIRCd. InspIRCd is free software: you can
8 * redistribute it and/or modify it under the terms of the GNU General Public
9 * License as published by the Free Software Foundation, version 2.
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
26 class CapEvent : public Event
38 std::vector<std::string> wanted;
39 std::vector<std::string> ack;
40 std::vector<std::pair<GenericCap*, int> > changed; // HACK: clean this up before 2.2
42 CapEvent(Module* sender, User* u, CapEventType capevtype) : Event(sender, "cap_request"), type(capevtype), user(u) {}
49 const std::string cap;
50 GenericCap(Module* parent, const std::string &Cap) : ext("cap_" + Cap, parent), cap(Cap)
52 ServerInstance->Modules->AddService(ext);
55 void HandleEvent(Event& ev)
57 if (ev.id != "cap_request")
60 CapEvent *data = static_cast<CapEvent*>(&ev);
61 if (data->type == CapEvent::CAPEVENT_REQ)
63 for (std::vector<std::string>::iterator it = data->wanted.begin(); it != data->wanted.end(); ++it)
67 bool enablecap = ((*it)[0] != '-');
68 if (((enablecap) && (*it == cap)) || (*it == "-" + cap))
70 // we can handle this, so ACK it, and remove it from the wanted list
71 data->ack.push_back(*it);
72 data->wanted.erase(it);
73 data->changed.push_back(std::make_pair(this, ext.set(data->user, enablecap ? 1 : 0)));
78 else if (data->type == CapEvent::CAPEVENT_LS)
80 data->wanted.push_back(cap);
82 else if (data->type == CapEvent::CAPEVENT_LIST)
84 if (ext.get(data->user))
85 data->wanted.push_back(cap);
87 else if (data->type == CapEvent::CAPEVENT_CLEAR)
89 data->ack.push_back("-" + cap);
90 ext.set(data->user, 0);