]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/commands/cmd_ison.cpp
52fbcde4bcb089167189775317864564b052cf93
[user/henk/code/inspircd.git] / src / commands / cmd_ison.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd: (C) 2002-2009 InspIRCd Development Team
6  * See: http://wiki.inspircd.org/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 "commands/cmd_ison.h"
16
17 extern "C" DllExport Command* init_command(InspIRCd* Instance)
18 {
19         return new CommandIson(Instance);
20 }
21
22 /** Handle /ISON
23  */
24 CmdResult CommandIson::Handle (const std::vector<std::string>& parameters, User *user)
25 {
26         std::map<User*,User*> ison_already;
27         User *u;
28         std::string reply = std::string("303 ") + user->nick + " :";
29
30         for (unsigned int i = 0; i < parameters.size(); i++)
31         {
32                 u = ServerInstance->FindNick(parameters[i]);
33                 if (ison_already.find(u) != ison_already.end())
34                         continue;
35
36                 if (u)
37                 {
38                         reply.append(u->nick).append(" ");
39                         if (reply.length() > 450)
40                         {
41                                 user->WriteServ(reply);
42                                 reply = std::string("303 ") + user->nick + " :";
43                         }
44                         ison_already[u] = u;
45                 }
46                 else
47                 {
48                         if ((i == parameters.size() - 1) && (parameters[i].find(' ') != std::string::npos))
49                         {
50                                 /* Its a space seperated list of nicks (RFC1459 says to support this)
51                                  */
52                                 irc::spacesepstream list(parameters[i]);
53                                 std::string item;
54
55                                 while (list.GetToken(item))
56                                 {
57                                         u = ServerInstance->FindNick(item);
58                                         if (ison_already.find(u) != ison_already.end())
59                                                 continue;
60
61                                         if (u)
62                                         {
63                                                 reply.append(u->nick).append(" ");
64                                                 if (reply.length() > 450)
65                                                 {
66                                                         user->WriteServ(reply);
67                                                         reply = std::string("303 ") + user->nick + " :";
68                                                 }
69                                                 ison_already[u] = u;
70                                         }
71                                 }
72                         }
73                 }
74         }
75
76         if (!reply.empty())
77                 user->WriteServ(reply);
78
79         return CMD_SUCCESS;
80 }
81