]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_cap.cpp
Support CAP LS
[user/henk/code/inspircd.git] / src / modules / m_cap.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd: (C) 2002-2008 InspIRCd Development Team
6  * See: http://www.inspircd.org/wiki/index.php/Credits
7  *
8  * This program is free but copyrighted software; see
9  *            the file COPYING for details.
10  *
11  * ---------------------------------------------------
12  */
13
14 #include "inspircd.h"
15 #include "m_cap.h"
16
17 /* $ModDesc: Provides a pointless /dalinfo command, demo module */
18
19 /*
20  *          std::string type;
21  *                   std::vector<std::string> parameters;
22  *                            User* user;
23  *                                     Module* creator;
24  */
25
26 /** Handle /CAP
27  */
28 class CommandCAP : public Command
29 {
30         Module* Creator;
31  public:
32         /* Command 'dalinfo', takes no parameters and needs no special modes */
33         CommandCAP (InspIRCd* Instance, Module* mod) : Command(Instance,"CAP", 0, 1, true), Creator(mod)
34         {
35                 this->source = "m_cap.so";
36         }
37
38         CmdResult Handle (const char* const* parameters, int pcnt, User *user)
39         {
40                 irc::string subcommand = parameters[0];
41                 if (subcommand == "REQ")
42                 {
43                         CapData Data;
44                         Data.type = parameters[1];
45                         Data.user = user;
46                         Data.creator = this->Creator;
47                         Data.parameter = (pcnt > 1 ? parameters[1] : "");
48
49                         user->Extend("CAP_REGHOLD");
50                         Event event((char*) &Data, (Module*)this->Creator, "cap_req");
51                         event.Send(this->ServerInstance);
52                 }
53                 else if (subcommand == "END")
54                 {
55                         user->Shrink("CAP_REGHOLD");
56                 }
57                 else if (subcommand == "LS")
58                 {
59                         CapData Data;
60                         user->Extend("CAP_REGHOLD");
61                         Data.type = "LS";
62                         Data.user = user;
63                         Data.creator = this->Creator;
64                         Data.parameter.clear();
65
66                         Event event((char*) &Data, (Module*)this->Creator, "cap_ls");
67                         event.Send(this->ServerInstance);
68
69                         user->WriteServ("CAP * LS :%s", Data.parameter.c_str());
70                 }
71                 else
72                 {
73                         user->WriteServ("410 %s %s :Invalid CAP subcommand", user->nick, subcommand.c_str());
74                 }
75                 return CMD_FAILURE;
76         }
77 };
78
79 class ModuleCAP : public Module
80 {
81         CommandCAP* newcommand;
82  public:
83         ModuleCAP(InspIRCd* Me)
84                 : Module(Me)
85         {
86                 // Create a new command
87                 newcommand = new CommandCAP(ServerInstance, this);
88                 ServerInstance->AddCommand(newcommand);
89
90                 Implementation eventlist[] = { I_OnCheckReady, I_OnCleanup, I_OnUserDisconnect, I_OnRequest };
91                 ServerInstance->Modules->Attach(eventlist, this, 5);
92         }
93
94         virtual bool OnCheckReady(User* user)
95         {
96                 /* Users in CAP state get held until CAP END */
97                 if (user->GetExt("CAP_REGHOLD"))
98                         return true;
99
100                 return false;
101         }
102
103         virtual ~ModuleCAP()
104         {
105         }
106
107         virtual Version GetVersion()
108         {
109                 return Version(1, 1, 0, 0, VF_VENDOR, API_VERSION);
110         }
111 };
112
113 MODULE_INIT(ModuleCAP)
114