]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_taxonomy.cpp
A few more I missed.
[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 "inspircd.h"
15 #include "users.h"
16 #include "channels.h"
17 #include "modules.h"
18
19 /* $ModDesc: Provides the /TAXONOMY command, used to view all metadata attached to a user */
20
21 /** Handle /TAXONOMY
22  */
23 class cmd_taxonomy : public command_t
24 {
25         Module* Creator;
26         bool& claimed;
27  public:
28         /* Command 'taxonomy', takes no parameters and needs no special modes */
29         cmd_taxonomy (InspIRCd* Instance, Module* maker, bool &claim) : command_t(Instance,"TAXONOMY", 'o', 1), Creator(maker), claimed(claim)
30         {
31                 this->source = "m_taxonomy.so";
32                 syntax = "<nickname>";
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_LOCALONLY;
56         }
57 };
58
59 class ModuleTaxonomy : public Module
60 {
61         cmd_taxonomy* newcommand;
62         bool claimed;
63  public:
64         ModuleTaxonomy(InspIRCd* Me)
65                 : 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 MODULE_INIT(ModuleTaxonomy)