changeset 766:80e2d5284b4a

Plugin links: make maximum count, closes #904 @20m
author David Demelier <markand@malikania.fr>
date Wed, 12 Sep 2018 22:10:34 +0200
parents 3f5e8ae58a84
children a2db884f2e4b
files plugins/links/links.cpp
diffstat 1 files changed, 18 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/plugins/links/links.cpp	Mon Aug 13 13:29:00 2018 +0200
+++ b/plugins/links/links.cpp	Wed Sep 12 22:10:34 2018 +0200
@@ -125,6 +125,8 @@
 private:
     using socket = variant<monostate, tcp::socket, stream<tcp::socket>>;
 
+    unsigned level_{0U};
+
     shared_ptr<server> server_;
     string channel_;
     string origin_;
@@ -154,10 +156,10 @@
     void timer();
     void start();
 
-    requester(io_context&, shared_ptr<server>, string, string, url);
+    requester(unsigned, io_context&, shared_ptr<server>, string, string, url);
 
 public:
-    static void run(io_context&, shared_ptr<server>, string, string, string);
+    static void run(unsigned, io_context&, shared_ptr<server>, string, string, string);
 };
 
 void requester::notify(const string& title)
@@ -199,7 +201,8 @@
     if (const auto it = res_.find(field::location); it != res_.end()) {
         const string location(it->value().data(), it->value().size());
 
-        run(timer_.get_io_service(), server_, origin_, channel_, location);
+        if (level_ < 32U)
+            run(++level_, timer_.get_io_service(), server_, origin_, channel_, location);
     } else
         parse();
 }
@@ -362,12 +365,14 @@
     resolve();
 }
 
-requester::requester(io_context& io,
+requester::requester(unsigned level,
+                     io_context& io,
                      shared_ptr<server> server,
                      string channel,
                      string origin,
                      url url)
-    : server_(move(server))
+    : level_(level)
+    , server_(move(server))
     , channel_(move(channel))
     , origin_(move(origin))
     , url_(move(url))
@@ -376,14 +381,19 @@
 {
 }
 
-void requester::run(io_context& io, shared_ptr<server> server, string origin, string channel, string link)
+void requester::run(unsigned level,
+                    io_context& io,
+                    shared_ptr<server> server,
+                    string origin,
+                    string channel,
+                    string link)
 {
     auto url = url::parse(link);
 
     if (url.protocol.empty() || url.host.empty())
         return;
 
-    shared_ptr<requester>(new requester(io, server, channel, origin, move(url)))->start();
+    shared_ptr<requester>(new requester(level, io, server, channel, origin, move(url)))->start();
 }
 
 // }}}
@@ -455,7 +465,7 @@
 
 void links_plugin::handle_message(irccd& irccd, const message_event& ev)
 {
-    requester::run(irccd.get_service(), ev.server, ev.origin, ev.channel, ev.message);
+    requester::run(0U, irccd.get_service(), ev.server, ev.origin, ev.channel, ev.message);
 }
 
 auto links_plugin::abi() -> version