]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_helpop.cpp
Remove superfluous std::string()s
[user/henk/code/inspircd.git] / src / modules / m_helpop.cpp
1 /*
2  * InspIRCd -- Internet Relay Chat Daemon
3  *
4  *   Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
5  *   Copyright (C) 2005-2009 Robin Burchell <robin+git@viroteck.net>
6  *   Copyright (C) 2004-2006, 2008 Craig Edwards <craigedwards@brainbox.cc>
7  *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
8  *   Copyright (C) 2004-2005 Craig McLure <craig@chatspike.net>
9  *
10  * This file is part of InspIRCd.  InspIRCd is free software: you can
11  * redistribute it and/or modify it under the terms of the GNU General Public
12  * License as published by the Free Software Foundation, version 2.
13  *
14  * This program is distributed in the hope that it will be useful, but WITHOUT
15  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
17  * details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21  */
22
23
24 /* $ModDesc: Provides the /HELPOP command for useful information */
25
26 #include "inspircd.h"
27
28 static std::map<irc::string, std::string> helpop_map;
29
30 /** Handles user mode +h
31  */
32 class Helpop : public SimpleUserModeHandler
33 {
34  public:
35         Helpop(Module* Creator) : SimpleUserModeHandler(Creator, "helpop", 'h')
36         {
37                 oper = true;
38         }
39 };
40
41 /** Handles /HELPOP
42  */
43 class CommandHelpop : public Command
44 {
45  public:
46         CommandHelpop(Module* Creator) : Command(Creator, "HELPOP", 0)
47         {
48                 syntax = "<any-text>";
49         }
50
51         CmdResult Handle (const std::vector<std::string> &parameters, User *user)
52         {
53                 irc::string parameter("start");
54                 if (parameters.size() > 0)
55                         parameter = parameters[0].c_str();
56
57                 if (parameter == "index")
58                 {
59                         /* iterate over all helpop items */
60                         user->WriteServ("290 %s :HELPOP topic index", user->nick.c_str());
61                         for (std::map<irc::string, std::string>::iterator iter = helpop_map.begin(); iter != helpop_map.end(); iter++)
62                         {
63                                 user->WriteServ("292 %s :  %s", user->nick.c_str(), iter->first.c_str());
64                         }
65                         user->WriteServ("292 %s :*** End of HELPOP topic index", user->nick.c_str());
66                 }
67                 else
68                 {
69                         user->WriteServ("290 %s :*** HELPOP for %s", user->nick.c_str(), parameter.c_str());
70                         user->WriteServ("292 %s : -", user->nick.c_str());
71
72                         std::map<irc::string, std::string>::iterator iter = helpop_map.find(parameter);
73
74                         if (iter == helpop_map.end())
75                         {
76                                 iter = helpop_map.find("nohelp");
77                         }
78
79                         std::string value = iter->second;
80                         irc::sepstream stream(value, '\n');
81                         std::string token = "*";
82
83                         while (stream.GetToken(token))
84                         {
85                                 // Writing a blank line will not work with some clients
86                                 if (token.empty())
87                                         user->WriteServ("292 %s : ", user->nick.c_str());
88                                 else
89                                         user->WriteServ("292 %s :%s", user->nick.c_str(), token.c_str());
90                         }
91
92                         user->WriteServ("292 %s : -", user->nick.c_str());
93                         user->WriteServ("292 %s :*** End of HELPOP", user->nick.c_str());
94                 }
95                 return CMD_SUCCESS;
96         }
97 };
98
99 class ModuleHelpop : public Module
100 {
101         private:
102                 std::string  h_file;
103                 CommandHelpop cmd;
104                 Helpop ho;
105
106         public:
107                 ModuleHelpop()
108                         : cmd(this), ho(this)
109                 {
110                 }
111
112                 void init()
113                 {
114                         ReadConfig();
115                         ServerInstance->Modules->AddService(ho);
116                         ServerInstance->Modules->AddService(cmd);
117                         Implementation eventlist[] = { I_OnRehash, I_OnWhois };
118                         ServerInstance->Modules->Attach(eventlist, this, 2);
119                 }
120
121                 void ReadConfig()
122                 {
123                         helpop_map.clear();
124
125                         ConfigTagList tags = ServerInstance->Config->ConfTags("helpop");
126                         for(ConfigIter i = tags.first; i != tags.second; ++i)
127                         {
128                                 ConfigTag* tag = i->second;
129                                 irc::string key = assign(tag->getString("key"));
130                                 std::string value;
131                                 tag->readString("value", value, true); /* Linefeeds allowed */
132
133                                 if (key == "index")
134                                 {
135                                         throw ModuleException("m_helpop: The key 'index' is reserved for internal purposes. Please remove it.");
136                                 }
137
138                                 helpop_map[key] = value;
139                         }
140
141                         if (helpop_map.find("start") == helpop_map.end())
142                         {
143                                 // error!
144                                 throw ModuleException("m_helpop: Helpop file is missing important entry 'start'. Please check the example conf.");
145                         }
146                         else if (helpop_map.find("nohelp") == helpop_map.end())
147                         {
148                                 // error!
149                                 throw ModuleException("m_helpop: Helpop file is missing important entry 'nohelp'. Please check the example conf.");
150                         }
151
152                 }
153
154                 void OnRehash(User* user)
155                 {
156                         ReadConfig();
157                 }
158
159                 void OnWhois(User* src, User* dst)
160                 {
161                         if (dst->IsModeSet('h'))
162                         {
163                                 ServerInstance->SendWhoisLine(src, dst, 310, src->nick+" "+dst->nick+" :is available for help.");
164                         }
165                 }
166
167                 Version GetVersion()
168                 {
169                         return Version("Provides the /HELPOP command for useful information", VF_VENDOR);
170                 }
171 };
172
173 MODULE_INIT(ModuleHelpop)