]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_watch.cpp
Sync helpop chmodes s and p with docs
[user/henk/code/inspircd.git] / src / modules / m_watch.cpp
index bdd4b2b15414797720e20ac17fb94f24e73e787b..803bd2c40f2f540470d771c130a5a2e9f9652734 100644 (file)
@@ -1,6 +1,8 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
+ *   Copyright (C) 2019 Robby <robby@chatbelgie.be>
+ *   Copyright (C) 2017-2018 Sadie Powell <sadie@witchery.services>
  *   Copyright (C) 2016 Attila Molnar <attilamolnar@hush.com>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
@@ -18,6 +20,7 @@
 
 
 #include "inspircd.h"
+#include "modules/away.h"
 
 #define INSPIRCD_MONITOR_MANAGER_ONLY
 #include "m_monitor.cpp"
@@ -36,7 +39,8 @@ enum
        RPL_ENDOFWATCHLIST = 607,
        // RPL_CLEARWATCH = 608, // unused
        RPL_NOWISAWAY = 609,
-       ERR_TOOMANYWATCH = 512
+       ERR_TOOMANYWATCH = 512,
+       ERR_INVALIDWATCHNICK = 942
 };
 
 class CommandWatch : public SplitCommand
@@ -53,12 +57,12 @@ class CommandWatch : public SplitCommand
                {
                        // The away state should only be sent if the client requests away notifications for a nick but 2.0 always sends them so we do that too
                        if (target->IsAway())
-                               user->WriteNumeric(RPL_NOWISAWAY, "%s %s %s %lu :is away", target->nick.c_str(), target->ident.c_str(), target->dhost.c_str(), (unsigned long)target->awaytime);
+                               user->WriteNumeric(RPL_NOWISAWAY, target->nick, target->ident, target->GetDisplayedHost(), (unsigned long)target->awaytime, "is away");
                        else
-                               user->WriteNumeric(RPL_NOWON, "%s %s %s %lu :is online", target->nick.c_str(), target->ident.c_str(), target->dhost.c_str(), (unsigned long)target->age);
+                               user->WriteNumeric(RPL_NOWON, target->nick, target->ident, target->GetDisplayedHost(), (unsigned long)target->age, "is online");
                }
                else if (show_offline)
-                       user->WriteNumeric(RPL_NOWOFF, "%s * * 0 :is offline", nick.c_str());
+                       user->WriteNumeric(RPL_NOWOFF, nick, "*", "*", "0", "is offline");
        }
 
        void HandlePlus(LocalUser* user, const std::string& nick)
@@ -67,12 +71,12 @@ class CommandWatch : public SplitCommand
                if (result == IRCv3::Monitor::Manager::WR_TOOMANY)
                {
                        // List is full, send error numeric
-                       user->WriteNumeric(ERR_TOOMANYWATCH, "%s :Too many WATCH entries", nick.c_str());
+                       user->WriteNumeric(ERR_TOOMANYWATCH, nick, "Too many WATCH entries");
                        return;
                }
                else if (result == IRCv3::Monitor::Manager::WR_INVALIDNICK)
                {
-                       user->WriteNumeric(942, "%s :Invalid nickname", nick.c_str());
+                       user->WriteNumeric(ERR_INVALIDWATCHNICK, nick, "Invalid nickname");
                        return;
                }
                else if (result != IRCv3::Monitor::Manager::WR_OK)
@@ -88,9 +92,9 @@ class CommandWatch : public SplitCommand
 
                User* target = IRCv3::Monitor::Manager::FindNick(nick);
                if (target)
-                       user->WriteNumeric(RPL_WATCHOFF, "%s %s %s %lu :stopped watching", target->nick.c_str(), target->ident.c_str(), target->dhost.c_str(), (unsigned long)target->age);
+                       user->WriteNumeric(RPL_WATCHOFF, target->nick, target->ident, target->GetDisplayedHost(), (unsigned long)target->age, "stopped watching");
                else
-                       user->WriteNumeric(RPL_WATCHOFF, "%s * * 0 :stopped watching", nick.c_str());
+                       user->WriteNumeric(RPL_WATCHOFF, nick, "*", "*", "0", "stopped watching");
        }
 
        void HandleList(LocalUser* user, bool show_offline)
@@ -102,7 +106,7 @@ class CommandWatch : public SplitCommand
                        const IRCv3::Monitor::Entry* entry = *i;
                        SendOnlineOffline(user, entry->GetNick(), show_offline);
                }
-               user->WriteNumeric(RPL_ENDOFWATCHLIST, ":End of WATCH list");
+               user->WriteNumeric(RPL_ENDOFWATCHLIST, "End of WATCH list");
        }
 
        void HandleStats(LocalUser* user)
@@ -111,7 +115,7 @@ class CommandWatch : public SplitCommand
 
                // Do not show how many clients are watching this nick, it's pointless
                const IRCv3::Monitor::WatchedList& list = manager.GetWatched(user);
-               user->WriteNumeric(RPL_WATCHSTAT, ":You have %lu and are on 0 WATCH entries", (unsigned long)list.size());
+               user->WriteNumeric(RPL_WATCHSTAT, InspIRCd::Format("You have %lu and are on 0 WATCH entries", (unsigned long)list.size()));
 
                Numeric::Builder<' '> out(user, RPL_WATCHLIST);
                for (IRCv3::Monitor::WatchedList::const_iterator i = list.begin(); i != list.end(); ++i)
@@ -120,7 +124,7 @@ class CommandWatch : public SplitCommand
                        out.Add(entry->GetNick());
                }
                out.Flush();
-               user->WriteNumeric(RPL_ENDOFWATCHLIST, ":End of WATCH S");
+               user->WriteNumeric(RPL_ENDOFWATCHLIST, "End of WATCH S");
        }
 
  public:
@@ -131,10 +135,10 @@ class CommandWatch : public SplitCommand
                , manager(managerref)
        {
                allow_empty_last_param = false;
-               syntax = "[<C|L|S|l|+<nick1>|-<nick>>]";
+               syntax = "C|L|l|S|(+|-)<nick> [(+|-)<nick>]+";
        }
 
-       CmdResult HandleLocal(const std::vector<std::string>& parameters, LocalUser* user)
+       CmdResult HandleLocal(LocalUser* user, const Params& parameters) CXX11_OVERRIDE
        {
                if (parameters.empty())
                {
@@ -178,7 +182,9 @@ class CommandWatch : public SplitCommand
        }
 };
 
-class ModuleWatch : public Module
+class ModuleWatch
+       : public Module
+       , public Away::EventListener
 {
        IRCv3::Monitor::Manager manager;
        CommandWatch cmd;
@@ -189,11 +195,12 @@ class ModuleWatch : public Module
                if (!list)
                        return;
 
-               std::string text = InspIRCd::Format("%s %s %s %lu :%s", nick.c_str(), user->ident.c_str(), user->dhost.c_str(), (unsigned long) shownts, numerictext);
+               Numeric::Numeric num(numeric);
+               num.push(nick).push(user->ident).push(user->GetDisplayedHost()).push(ConvToStr(shownts)).push(numerictext);
                for (IRCv3::Monitor::WatcherList::const_iterator i = list->begin(); i != list->end(); ++i)
                {
                        LocalUser* curr = *i;
-                       curr->WriteNumeric(numeric, text);
+                       curr->WriteNumeric(num);
                }
        }
 
@@ -209,7 +216,8 @@ class ModuleWatch : public Module
 
  public:
        ModuleWatch()
-               : manager(this, "watch")
+               : Away::EventListener(this)
+               , manager(this, "watch")
                , cmd(this, manager)
        {
        }
@@ -217,7 +225,7 @@ class ModuleWatch : public Module
        void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
        {
                ConfigTag* tag = ServerInstance->Config->ConfValue("watch");
-               cmd.maxwatch = tag->getInt("maxwatch", 30, 1);
+               cmd.maxwatch = tag->getUInt("maxwatch", 30, 1);
        }
 
        void OnPostConnect(User* user) CXX11_OVERRIDE
@@ -243,14 +251,14 @@ class ModuleWatch : public Module
                Offline(user, user->nick);
        }
 
-       ModResult OnSetAway(User* user, const std::string& awaymsg) CXX11_OVERRIDE
+       void OnUserAway(User* user) CXX11_OVERRIDE
        {
-               if (awaymsg.empty())
-                       SendAlert(user, user->nick, RPL_NOTAWAY, "is no longer away", ServerInstance->Time());
-               else
-                       SendAlert(user, user->nick, RPL_GONEAWAY, awaymsg.c_str(), user->awaytime);
+               SendAlert(user, user->nick, RPL_GONEAWAY, user->awaymsg.c_str(), user->awaytime);
+       }
 
-               return MOD_RES_PASSTHRU;
+       void OnUserBack(User* user) CXX11_OVERRIDE
+       {
+               SendAlert(user, user->nick, RPL_NOTAWAY, "is no longer away", ServerInstance->Time());
        }
 
        void On005Numeric(std::map<std::string, std::string>& tokens) CXX11_OVERRIDE
@@ -260,7 +268,7 @@ class ModuleWatch : public Module
 
        Version GetVersion() CXX11_OVERRIDE
        {
-               return Version("Provides WATCH support", VF_VENDOR);
+               return Version("Adds the /WATCH command which allows users to find out when their friends are connected to the server.", VF_VENDOR);
        }
 };