1 /* +------------------------------------+
2 * | Inspire Internet Relay Chat Daemon |
3 * +------------------------------------+
5 * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
7 * <brain@chatspike.net>
8 * <Craig@chatspike.net>
10 * Written by Craig Edwards, Craig McLure, and others.
11 * This program is free but copyrighted software; see
12 * the file COPYING for details.
14 * ---------------------------------------------------
25 #include "helperfuncs.h"
28 /* $ModDesc: Provides support for the /watch command */
32 class watchentry : public classbase
39 typedef std::vector<watchentry*> watchlist;
42 class cmd_watch : public command_t
45 cmd_watch() : command_t("WATCH",0,0)
47 this->source = "m_watch.so";
50 void Handle (const char** parameters, int pcnt, userrec *user)
54 for (watchlist::iterator q = watches.begin(); q != watches.end(); q++)
56 watchentry* a = (watchentry*)(*q);
57 if (a->watcher == user)
59 userrec* targ = Srv->FindNick(a->target);
62 WriteServ(user->fd,"604 %s %s %s %s %lu :is online",user->nick,targ->nick,targ->ident,targ->dhost,targ->age);
66 WriteServ(user->fd,"607 %s :End of WATCH list",user->nick);
70 for (int x = 0; x < pcnt; x++)
72 const char *nick = parameters[x];
73 if (!strcasecmp(nick,"C"))
80 for (watchlist::iterator q = watches.begin(); q != watches.end(); q++)
82 watchentry* a = (watchentry*)(*q);
83 if (a->watcher == user)
93 else if (!strcasecmp(nick,"L"))
95 for (watchlist::iterator q = watches.begin(); q != watches.end(); q++)
97 watchentry* a = (watchentry*)(*q);
98 if (a->watcher == user)
100 userrec* targ = Srv->FindNick(a->target);
103 WriteServ(user->fd,"604 %s %s %s %s %lu :is online",user->nick,targ->nick,targ->ident,targ->dhost,targ->age);
107 WriteServ(user->fd,"607 %s :End of WATCH list",user->nick);
109 else if (!strcasecmp(nick,"S"))
111 std::string list = "";
112 for (watchlist::iterator q = watches.begin(); q != watches.end(); q++)
114 watchentry* a = (watchentry*)(*q);
115 if (a->watcher == user)
117 list.append(" ").append(a->target);
120 char* l = (char*)list.c_str();
123 WriteServ(user->fd,"606 %s :%s",user->nick,l);
124 WriteServ(user->fd,"607 %s :End of WATCH S",user->nick);
126 else if (nick[0] == '-')
128 // removing an item from the list
130 irc::string n1 = nick;
131 for (watchlist::iterator q = watches.begin(); q != watches.end(); q++)
133 watchentry* b = (watchentry*)(*q);
134 if (b->watcher == user)
136 irc::string n2 = b->target.c_str();
137 userrec* a = Srv->FindNick(b->target);
140 WriteServ(user->fd,"602 %s %s %s %s %lu :stopped watching",user->nick,a->nick,a->ident,a->dhost,a->age);
144 WriteServ(user->fd,"602 %s %s * * 0 :stopped watching",user->nick,b->target.c_str());
155 else if (nick[0] == '+')
158 irc::string n1 = nick;
160 for (watchlist::iterator q = watches.begin(); q != watches.end(); q++)
162 watchentry* a = (watchentry*)(*q);
163 if (a->watcher == user)
165 irc::string n2 = a->target.c_str();
168 // already on watch list
175 watchentry* w = new watchentry();
178 watches.push_back(w);
179 log(DEBUG,"*** Added %s to watchlist of %s",nick,user->nick);
181 userrec* a = Srv->FindNick(nick);
184 WriteServ(user->fd,"604 %s %s %s %s %lu :is online",user->nick,a->nick,a->ident,a->dhost,a->age);
188 WriteServ(user->fd,"605 %s %s * * 0 :is offline",user->nick,nick);
197 class Modulewatch : public Module
199 cmd_watch* mycommand;
202 Modulewatch(Server* Me)
206 mycommand = new cmd_watch();
207 Srv->AddCommand(mycommand);
210 void Implements(char* List)
212 List[I_OnUserQuit] = List[I_OnGlobalConnect] = List[I_OnUserPostNick] = List[I_On005Numeric] = 1;
215 virtual void OnUserQuit(userrec* user, const std::string &reason)
217 log(DEBUG,"*** WATCH: On global quit: user %s",user->nick);
218 irc::string n2 = user->nick;
219 for (watchlist::iterator q = watches.begin(); q != watches.end(); q++)
221 watchentry* a = (watchentry*)(*q);
222 irc::string n1 = a->target.c_str();
225 log(DEBUG,"*** WATCH: On global quit: user %s is in notify of %s",user->nick,a->watcher->nick);
226 WriteServ(a->watcher->fd,"601 %s %s %s %s %lu :went offline",a->watcher->nick,user->nick,user->ident,user->dhost,time(NULL));
233 for (watchlist::iterator q = watches.begin(); q != watches.end(); q++)
235 watchentry* a = (watchentry*)(*q);
236 if (a->watcher == user)
247 virtual void OnGlobalConnect(userrec* user)
249 irc::string n2 = user->nick;
250 log(DEBUG,"*** WATCH: On global connect: user %s",user->nick);
251 for (watchlist::iterator q = watches.begin(); q != watches.end(); q++)
253 watchentry* a = (watchentry*)(*q);
254 irc::string n1 = a->target.c_str();
257 log(DEBUG,"*** WATCH: On global connect: user %s is in notify of %s",user->nick,a->watcher->nick);
258 WriteServ(a->watcher->fd,"600 %s %s %s %s %lu :arrived online",a->watcher->nick,user->nick,user->ident,user->dhost,user->age);
263 virtual void OnUserPostNick(userrec* user, const std::string &oldnick)
265 irc::string n2 = oldnick.c_str();
266 irc::string n3 = user->nick;
267 log(DEBUG,"*** WATCH: On global nickchange: old nick: %s new nick: %s",oldnick.c_str(),user->nick);
268 for (watchlist::iterator q = watches.begin(); q != watches.end(); q++)
270 watchentry* a = (watchentry*)(*q);
271 irc::string n1 = a->target.c_str();
272 // changed from a nick on the watchlist to one that isnt
275 log(DEBUG,"*** WATCH: On global nickchange: old nick %s was on notify list of %s",oldnick.c_str(),a->watcher->nick);
276 WriteServ(a->watcher->fd,"601 %s %s %s %s %lu :went offline",a->watcher->nick,oldnick.c_str(),user->ident,user->dhost,time(NULL));
280 // changed from a nick not on notify to one that is
281 log(DEBUG,"*** WATCH: On global nickchange: new nick %s is on notify list of %s",user->nick,a->watcher->nick);
282 WriteServ(a->watcher->fd,"600 %s %s %s %s %lu :arrived online",a->watcher->nick,user->nick,user->ident,user->dhost,user->age);
287 virtual void On005Numeric(std::string &output)
289 // we don't really have a limit...
290 output = output + " WATCH=999";
293 virtual ~Modulewatch()
297 virtual Version GetVersion()
299 return Version(1,0,0,1,VF_VENDOR);
304 class ModulewatchFactory : public ModuleFactory
311 ~ModulewatchFactory()
315 virtual Module * CreateModule(Server* Me)
317 return new Modulewatch(Me);
323 extern "C" void * init_module( void )
325 return new ModulewatchFactory;