diff options
author | louiz’ <louiz@louiz.org> | 2018-08-23 15:21:12 +0200 |
---|---|---|
committer | louiz’ <louiz@louiz.org> | 2018-08-23 22:18:49 +0200 |
commit | 7d0df9b6ddee8db69ea0a511f031f32a4537a749 (patch) | |
tree | 86b1105169b6bf7ea5eea88fac3ec75597231d38 /src | |
parent | 6c431b64d050a13853ebf3715fb6bf7986c0cff1 (diff) | |
download | biboumi-7d0df9b6ddee8db69ea0a511f031f32a4537a749.tar.gz biboumi-7d0df9b6ddee8db69ea0a511f031f32a4537a749.tar.bz2 biboumi-7d0df9b6ddee8db69ea0a511f031f32a4537a749.tar.xz biboumi-7d0df9b6ddee8db69ea0a511f031f32a4537a749.zip |
Disable the throttle limit if negative
Also, invalid values result in -1 being set
Diffstat (limited to 'src')
-rw-r--r-- | src/database/database.hpp | 4 | ||||
-rw-r--r-- | src/irc/irc_client.cpp | 2 | ||||
-rw-r--r-- | src/irc/irc_client.hpp | 2 | ||||
-rw-r--r-- | src/utils/tokens_bucket.hpp | 12 | ||||
-rw-r--r-- | src/xmpp/biboumi_adhoc_commands.cpp | 6 |
5 files changed, 17 insertions, 9 deletions
diff --git a/src/database/database.hpp b/src/database/database.hpp index 5fabadd..4a413be 100644 --- a/src/database/database.hpp +++ b/src/database/database.hpp @@ -86,8 +86,8 @@ class Database struct Address: Column<std::string> { static constexpr auto name = "address_"; }; - struct ThrottleLimit: Column<unsigned long int> { static constexpr auto name = "throttlelimit_"; - ThrottleLimit(): Column<unsigned long int>(10) {} }; + struct ThrottleLimit: Column<long int> { static constexpr auto name = "throttlelimit_"; + ThrottleLimit(): Column<long int>(10) {} }; using MucLogLineTable = Table<Id, Uuid, Owner, IrcChanName, IrcServerName, Date, Body, Nick>; using MucLogLine = MucLogLineTable::RowType; diff --git a/src/irc/irc_client.cpp b/src/irc/irc_client.cpp index 78d0fbf..2835a33 100644 --- a/src/irc/irc_client.cpp +++ b/src/irc/irc_client.cpp @@ -1291,7 +1291,7 @@ bool IrcClient::abort_on_invalid_cert() const } #endif -std::size_t IrcClient::get_throttle_limit() const +long int IrcClient::get_throttle_limit() const { #ifdef USE_DATABASE return Database::get_irc_server_options(this->bridge.get_bare_jid(), this->hostname).col<Database::ThrottleLimit>(); diff --git a/src/irc/irc_client.hpp b/src/irc/irc_client.hpp index aa314f8..1653225 100644 --- a/src/irc/irc_client.hpp +++ b/src/irc/irc_client.hpp @@ -402,7 +402,7 @@ private: */ Resolver dns_resolver; TokensBucket tokens_bucket; - std::size_t get_throttle_limit() const; + long int get_throttle_limit() const; }; diff --git a/src/utils/tokens_bucket.hpp b/src/utils/tokens_bucket.hpp index 03af015..2992e21 100644 --- a/src/utils/tokens_bucket.hpp +++ b/src/utils/tokens_bucket.hpp @@ -17,7 +17,7 @@ class TokensBucket { public: - TokensBucket(std::size_t max_size, std::chrono::milliseconds fill_duration, std::function<bool()> callback, std::string name): + TokensBucket(long int max_size, std::chrono::milliseconds fill_duration, std::function<bool()> callback, std::string name): limit(max_size), tokens(limit), callback(std::move(callback)) @@ -29,6 +29,8 @@ public: bool use_token() { + if (this->limit < 0) + return true; if (this->tokens > 0) { this->tokens--; @@ -38,19 +40,21 @@ public: return false; } - void set_limit(std::size_t limit) + void set_limit(long int limit) { this->limit = limit; } private: - std::size_t limit; + long int limit; std::size_t tokens; std::function<bool()> callback; void add_token() { - if (this->callback() && this->tokens != limit) + if (this->limit < 0) + return; + if (this->callback() && this->tokens != static_cast<decltype(this->tokens)>(this->limit)) this->tokens++; } }; diff --git a/src/xmpp/biboumi_adhoc_commands.cpp b/src/xmpp/biboumi_adhoc_commands.cpp index 45557aa..7c31f36 100644 --- a/src/xmpp/biboumi_adhoc_commands.cpp +++ b/src/xmpp/biboumi_adhoc_commands.cpp @@ -494,7 +494,11 @@ void ConfigureIrcServerStep2(XmppComponent& xmpp_component, AdhocSession& sessio else if (field->get_tag("var") == "throttle_limit" && value) { - options.col<Database::ThrottleLimit>() = std::stoul(value->get_inner()); + try { + options.col<Database::ThrottleLimit>() = std::stol(value->get_inner()); + } catch (const std::logic_error&) { + options.col<Database::ThrottleLimit>() = -1; + } Bridge* bridge = biboumi_component.find_user_bridge(session.get_owner_jid()); if (bridge) { |