]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_chanhistory.cpp
Sync helpop chmodes s and p with docs
[user/henk/code/inspircd.git] / src / modules / m_chanhistory.cpp
index 4bd230a7c649c1278717696dcb84feb4efc6d7df..3ad6b81e64c90e276b1c3caed9d6da25ff4246c1 100644 (file)
@@ -2,7 +2,7 @@
  * InspIRCd -- Internet Relay Chat Daemon
  *
  *   Copyright (C) 2018 linuxdaemon <linuxdaemon.irc@gmail.com>
- *   Copyright (C) 2013, 2017-2020 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2013, 2017-2021 Sadie Powell <sadie@witchery.services>
  *   Copyright (C) 2013 Daniel Vassdal <shutter@canternet.org>
  *   Copyright (C) 2012-2015, 2018 Attila Molnar <attilamolnar@hush.com>
  *   Copyright (C) 2012, 2019 Robby <robby@chatbelgie.be>
@@ -61,6 +61,18 @@ struct HistoryList
                , maxtime(time)
        {
        }
+
+       size_t Prune()
+       {
+               // Prune expired entries from the list.
+               if (maxtime)
+               {
+                       time_t mintime = ServerInstance->Time() - maxtime;
+                       while (!lines.empty() && lines.front().ts < mintime)
+                               lines.pop_front();
+               }
+               return lines.size();
+       }
 };
 
 class HistoryMode : public ParamMode<HistoryMode, SimpleExtItem<HistoryList> >
@@ -108,6 +120,7 @@ class HistoryMode : public ParamMode<HistoryMode, SimpleExtItem<HistoryList> >
 
                        history->maxlen = len;
                        history->maxtime = time;
+                       history->Prune();
                }
                else
                {
@@ -165,7 +178,7 @@ class ModuleChanHistory
                }
        }
 
-       void SendHistory(LocalUser* user, Channel* channel, HistoryList* list, time_t mintime)
+       void SendHistory(LocalUser* user, Channel* channel, HistoryList* list)
        {
                if (batchmanager)
                {
@@ -173,19 +186,16 @@ class ModuleChanHistory
                        batch.GetBatchStartMessage().PushParamRef(channel->name);
                }
 
-               for(std::deque<HistoryItem>::iterator i = list->lines.begin(); i != list->lines.end(); ++i)
+               for (std::deque<HistoryItem>::iterator i = list->lines.begin(); i != list->lines.end(); ++i)
                {
                        HistoryItem& item = *i;
-                       if (item.ts >= mintime)
-                       {
-                               ClientProtocol::Messages::Privmsg msg(ClientProtocol::Messages::Privmsg::nocopy, item.sourcemask, channel, item.text, item.type);
-                               for (HistoryTagMap::iterator iter = item.tags.begin(); iter != item.tags.end(); ++iter)
-                                       AddTag(msg, iter->first, iter->second);
-                               if (servertimemanager)
-                                       servertimemanager->Set(msg, item.ts);
-                               batch.AddToBatch(msg);
-                               user->Send(ServerInstance->GetRFCEvents().privmsg, msg);
-                       }
+                       ClientProtocol::Messages::Privmsg msg(ClientProtocol::Messages::Privmsg::nocopy, item.sourcemask, channel, item.text, item.type);
+                       for (HistoryTagMap::iterator iter = item.tags.begin(); iter != item.tags.end(); ++iter)
+                               AddTag(msg, iter->first, iter->second);
+                       if (servertimemanager)
+                               servertimemanager->Set(msg, item.ts);
+                       batch.AddToBatch(msg);
+                       user->Send(ServerInstance->GetRFCEvents().privmsg, msg);
                }
 
                if (batchmanager)
@@ -221,18 +231,20 @@ class ModuleChanHistory
 
        void OnUserPostMessage(User* user, const MessageTarget& target, const MessageDetails& details) CXX11_OVERRIDE
        {
+               if (target.type != MessageTarget::TYPE_CHANNEL || target.status)
+                       return;
+
                std::string ctcpname;
-               if ((target.type == MessageTarget::TYPE_CHANNEL) && (target.status == 0) && (!details.IsCTCP(ctcpname) || irc::equals(ctcpname, "ACTION")))
-               {
-                       Channel* c = target.Get<Channel>();
-                       HistoryList* list = historymode.ext.get(c);
-                       if (list)
-                       {
-                               list->lines.push_back(HistoryItem(user, details));
-                               if (list->lines.size() > list->maxlen)
-                                       list->lines.pop_front();
-                       }
-               }
+               if (details.IsCTCP(ctcpname) && !irc::equals(ctcpname, "ACTION"))
+                       return;
+
+               HistoryList* list = historymode.ext.get(target.Get<Channel>());
+               if (!list)
+                       return;
+
+               list->lines.push_back(HistoryItem(user, details));
+               if (list->lines.size() > list->maxlen)
+                       list->lines.pop_front();
        }
 
        void OnPostJoin(Membership* memb) CXX11_OVERRIDE
@@ -248,7 +260,7 @@ class ModuleChanHistory
                        return;
 
                HistoryList* list = historymode.ext.get(memb->chan);
-               if (!list)
+               if (!list || !list->Prune())
                        return;
 
                if ((prefixmsg) && (!batchcap.get(localuser)))
@@ -259,11 +271,7 @@ class ModuleChanHistory
                        memb->WriteNotice(message);
                }
 
-               time_t mintime = 0;
-               if (list->maxtime)
-                       mintime = ServerInstance->Time() - list->maxtime;
-
-               SendHistory(localuser, memb->chan, list, mintime);
+               SendHistory(localuser, memb->chan, list);
        }
 
        Version GetVersion() CXX11_OVERRIDE