]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_taxonomy.cpp
c573e77610d03e1505f62d857f1c84f53280f886
[user/henk/code/inspircd.git] / src / modules / m_taxonomy.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd: (C) 2002-2007 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 <stdio.h>
15 #include "users.h"
16 #include "channels.h"
17 #include "modules.h"
18 #include "inspircd.h"
19
20 /* $ModDesc: Provides the /TAXONOMY command, used to view all metadata attached to a user */
21
22 /** Handle /WOOT
23  */
24 class cmd_taxonomy : public command_t
25 {
26         Module* Creator;
27         bool& claimed;
28  public:
29         /* Command 'taxonomy', takes no parameters and needs no special modes */
30         cmd_taxonomy (InspIRCd* Instance, Module* maker, bool &claim) : command_t(Instance,"TAXONOMY", 'o', 1), Creator(maker), claimed(claim)
31         {
32                 this->source = "m_taxonomy.so";
33         }
34
35         CmdResult Handle (const char** parameters, int pcnt, userrec *user)
36         {
37                 userrec* dest = ServerInstance->FindNick(parameters[0]);
38                 if (dest)
39                 {
40                         std::deque<std::string> list;
41                         list.clear();
42                         user->GetExtList(list);
43                         user->WriteServ("304 " + std::string(user->nick) + ":TAXONOMY ITEMS " + std::string(dest->nick) + " " +ConvToStr(list.size()));
44                         for (unsigned int j = 0; j < list.size(); j++)
45                         {
46                                 claimed = false;
47                                 FOREACH_MOD(I_OnSyncUserMetaData, OnSyncUserMetaData(user, Creator, dest, list[j], true));
48                                 if (!claimed)
49                                 {
50                                         user->WriteServ("304 " + std::string(user->nick) + ":TAXONOMY METADATA " + list[j] + " = <unknown>");
51                                 }
52                         }
53                         user->WriteServ("304 " + std::string(user->nick) + ":TAXONOMY END");
54                 }
55                 return CMD_FAILURE;
56         }
57 };
58
59 class ModuleTaxonomy : public Module
60 {
61         cmd_taxonomy* newcommand;
62         bool claimed;
63  public:
64         ModuleTaxonomy(InspIRCd* Me)
65                 : Module::Module(Me)
66         {
67                 
68                 // Create a new command
69                 newcommand = new cmd_taxonomy(ServerInstance, this, claimed);
70                 ServerInstance->AddCommand(newcommand);
71         }
72
73         void Implements(char* List)
74         {
75                 List[I_ProtoSendMetaData] = 1;
76         }
77
78         void ProtoSendMetaData(void* opaque, int target_type, void* target, const std::string &extname, const std::string &extdata)
79         {
80                 if (target_type == TYPE_USER)
81                 {
82                         userrec* spool = (userrec*)opaque;
83                         std::string taxstr = "304 " + std::string(spool->nick) + ":TAXONOMY METADATA "+extname+" = "+extdata;
84                         spool->WriteServ(taxstr);
85                         claimed = true;
86                 }
87         }
88
89         virtual ~ModuleTaxonomy()
90         {
91         }
92
93         virtual Version GetVersion()
94         {
95                 return Version(1, 1, 0, 0, VF_VENDOR, API_VERSION);
96         }
97 };
98
99
100 class ModuleTaxonomyFactory : public ModuleFactory
101 {
102  public:
103         ModuleTaxonomyFactory()
104         {
105         }
106         
107         ~ModuleTaxonomyFactory()
108         {
109         }
110         
111         virtual Module * CreateModule(InspIRCd* Me)
112         {
113                 return new ModuleTaxonomy(Me);
114         }
115         
116 };
117
118
119 extern "C" void * init_module( void )
120 {
121         return new ModuleTaxonomyFactory;
122 }
123