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/>.
27 class CapEvent : public Event
31 std::vector<std::string> wanted;
32 std::vector<std::string> ack;
35 CapEvent(Module* sender, const std::string& t) : Event(sender, t) {}
42 const std::string cap;
43 GenericCap(Module* parent, const std::string &Cap) : ext("cap_" + Cap, parent), cap(Cap)
45 ServerInstance->Extensions.Register(&ext);
48 void HandleEvent(Event& ev)
50 CapEvent *data = static_cast<CapEvent*>(&ev);
51 if (ev.id == "cap_req")
53 std::vector<std::string>::iterator it;
54 if ((it = std::find(data->wanted.begin(), data->wanted.end(), cap)) != data->wanted.end())
56 // we can handle this, so ACK it, and remove it from the wanted list
57 data->ack.push_back(*it);
58 data->wanted.erase(it);
59 ext.set(data->user, 1);
62 else if (ev.id == "cap_ls")
64 data->wanted.push_back(cap);
66 else if (ev.id == "cap_list")
68 if (ext.get(data->user))
69 data->wanted.push_back(cap);
71 else if (ev.id == "cap_clear")
73 data->ack.push_back("-" + cap);
74 ext.set(data->user, 0);