From 7d30b18136eecbdf2089e5d5877c7e41c6f4bcb6 Mon Sep 17 00:00:00 2001 From: Shane Synan Date: Mon, 5 Sep 2016 16:26:44 -0500 Subject: [PATCH] Implement custom rate limits Add custom rate limits flag and settings. > In database, add 'usecustommessagerate', 'messagerateburstsize', 'messageratedelay', and 'unlimitedmessagerate' to 'network' table, defaulting to the values already used. This modifies schema, requiring a version bump, changes to migration scripts, etc. Use 4 upgrade scripts as SQLite does not support adding multiple columns at once. > In protocol, add 'useCustomMessageRate', 'msgRateBurstSize', 'msgRateMessageDelay', and 'unlimitedMessageRate' to Network, configuring custom rate limits. Add 'CustomRateLimits' feature flag so the client can tell users about needing to upgrade their core to get this feature. If rate limits set to unlimited, disable the token bucket timer and send messages immediately. Otherwise, modify the existing token bucket variables according to the new limits. The defaults are unchanged. Add "Use Custom Rate Limits" checkbox to network "Connection" tab with an explanatory tooltip warning against setting too low of rate limits. Tooltip is modified and checkbox disabled if the core does not support the feature. Testing: > Database schema handling SQLite new install - works SQLite upgrade - works SQLite migrate to Postgres - works Postgres new install - works Postgres upgrade - works > Client/core connections New client, new core - works New client, old core - works, custom rates grayed out Old client, new core - works, custom rates reset + disabled on edit (Unfortunately there's no way to use a boolean and tell if the client is old, or actually disabling custom rate limits. Would need the work-in-progress ClientFeature system 'esainane' designed) --- src/common/network.cpp | 95 ++++- src/common/network.h | 135 +++++++ src/common/quassel.h | 3 +- src/core/SQL/PostgreSQL/18/insert_network.sql | 3 - .../PostgreSQL/18/migrate_write_network.sql | 2 - .../{18 => 19}/delete_backlog_by_uid.sql | 0 .../{18 => 19}/delete_backlog_for_buffer.sql | 0 .../{18 => 19}/delete_backlog_for_network.sql | 0 .../{18 => 19}/delete_buffer_for_bufferid.sql | 0 .../{18 => 19}/delete_buffers_by_uid.sql | 0 .../{18 => 19}/delete_buffers_for_network.sql | 0 .../PostgreSQL/{18 => 19}/delete_identity.sql | 0 .../delete_ircservers_for_network.sql | 0 .../PostgreSQL/{18 => 19}/delete_network.sql | 0 .../{18 => 19}/delete_networks_by_uid.sql | 0 .../PostgreSQL/{18 => 19}/delete_nicks.sql | 0 .../{18 => 19}/delete_quasseluser.sql | 0 .../PostgreSQL/{18 => 19}/insert_buffer.sql | 0 .../PostgreSQL/{18 => 19}/insert_identity.sql | 0 .../PostgreSQL/{18 => 19}/insert_message.sql | 0 src/core/SQL/PostgreSQL/19/insert_network.sql | 12 + .../SQL/PostgreSQL/{18 => 19}/insert_nick.sql | 0 .../{18 => 19}/insert_quasseluser.sql | 0 .../PostgreSQL/{18 => 19}/insert_sender.sql | 0 .../PostgreSQL/{18 => 19}/insert_server.sql | 0 .../{18 => 19}/insert_user_setting.sql | 0 .../{18 => 19}/migrate_write_backlog.sql | 0 .../{18 => 19}/migrate_write_buffer.sql | 0 .../{18 => 19}/migrate_write_identity.sql | 0 .../migrate_write_identity_nick.sql | 0 .../{18 => 19}/migrate_write_ircserver.sql | 0 .../PostgreSQL/19/migrate_write_network.sql | 8 + .../{18 => 19}/migrate_write_quasseluser.sql | 0 .../{18 => 19}/migrate_write_sender.sql | 0 .../{18 => 19}/migrate_write_usersetting.sql | 0 .../PostgreSQL/{18 => 19}/select_authuser.sql | 0 .../{18 => 19}/select_bufferByName.sql | 0 .../{18 => 19}/select_bufferExists.sql | 0 .../{18 => 19}/select_buffer_by_id.sql | 0 .../select_buffer_lastseen_messages.sql | 0 .../select_buffer_markerlinemsgids.sql | 0 .../PostgreSQL/{18 => 19}/select_buffers.sql | 0 .../{18 => 19}/select_buffers_for_network.sql | 0 .../{18 => 19}/select_checkidentity.sql | 0 .../{18 => 19}/select_connected_networks.sql | 0 .../{18 => 19}/select_identities.sql | 0 .../{18 => 19}/select_internaluser.sql | 0 .../PostgreSQL/{18 => 19}/select_messages.sql | 0 .../{18 => 19}/select_messagesAll.sql | 0 .../{18 => 19}/select_messagesAllNew.sql | 0 .../{18 => 19}/select_messagesNewerThan.sql | 0 .../{18 => 19}/select_messagesRange.sql | 0 .../{18 => 19}/select_networkExists.sql | 0 .../{18 => 19}/select_network_awaymsg.sql | 0 .../{18 => 19}/select_network_usermode.sql | 0 .../19/select_networks_for_user.sql | 5 +- .../PostgreSQL/{18 => 19}/select_nicks.sql | 0 .../{18 => 19}/select_persistent_channels.sql | 0 .../PostgreSQL/{18 => 19}/select_senderid.sql | 0 .../{18 => 19}/select_servers_for_network.sql | 0 .../{18 => 19}/select_user_setting.sql | 0 .../PostgreSQL/{18 => 19}/select_userid.sql | 0 .../{18 => 19}/setup_000_quasseluser.sql | 0 .../{18 => 19}/setup_010_sender.sql | 0 .../{18 => 19}/setup_020_identity.sql | 0 .../{18 => 19}/setup_030_identity_nick.sql | 0 .../{18 => 19}/setup_040_network.sql | 4 + .../{18 => 19}/setup_050_buffer.sql | 0 .../{18 => 19}/setup_060_backlog.sql | 0 .../{18 => 19}/setup_070_coreinfo.sql | 0 .../{18 => 19}/setup_080_ircservers.sql | 0 .../{18 => 19}/setup_090_backlog_idx.sql | 0 .../{18 => 19}/setup_100_user_setting.sql | 0 .../{18 => 19}/setup_110_alter_sender_seq.sql | 0 .../setup_120_alter_messageid_seq.sql | 0 .../{18 => 19}/update_backlog_bufferid.sql | 0 .../{18 => 19}/update_buffer_lastseen.sql | 0 .../update_buffer_markerlinemsgid.sql | 0 .../{18 => 19}/update_buffer_name.sql | 0 .../update_buffer_persistent_channel.sql | 0 .../update_buffer_set_channel_key.sql | 0 .../PostgreSQL/{18 => 19}/update_identity.sql | 0 .../PostgreSQL/{18 => 19}/update_network.sql | 4 + .../{18 => 19}/update_network_connected.sql | 0 .../{18 => 19}/update_network_set_awaymsg.sql | 0 .../update_network_set_usermode.sql | 0 .../{18 => 19}/update_user_setting.sql | 0 .../PostgreSQL/{18 => 19}/update_username.sql | 0 .../{18 => 19}/update_userpassword.sql | 0 ..._alter_network_add_ratelimit_usecustom.sql | 1 + ..._alter_network_add_ratelimit_burstsize.sql | 1 + ..._002_alter_network_add_ratelimit_delay.sql | 1 + ..._alter_network_add_ratelimit_unlimited.sql | 1 + src/core/SQL/SQLite/19/insert_network.sql | 4 - .../{19 => 20}/delete_backlog_by_uid.sql | 0 .../{19 => 20}/delete_backlog_for_buffer.sql | 0 .../{19 => 20}/delete_backlog_for_network.sql | 0 .../{19 => 20}/delete_buffer_for_bufferid.sql | 0 .../{19 => 20}/delete_buffers_by_uid.sql | 0 .../{19 => 20}/delete_buffers_for_network.sql | 0 .../SQL/SQLite/{19 => 20}/delete_identity.sql | 0 .../delete_ircservers_for_network.sql | 0 .../SQL/SQLite/{19 => 20}/delete_network.sql | 0 .../{19 => 20}/delete_networks_by_uid.sql | 0 .../SQL/SQLite/{19 => 20}/delete_nicks.sql | 0 .../SQLite/{19 => 20}/delete_quasseluser.sql | 0 .../SQL/SQLite/{19 => 20}/insert_buffer.sql | 0 .../SQL/SQLite/{19 => 20}/insert_identity.sql | 0 .../SQL/SQLite/{19 => 20}/insert_message.sql | 0 src/core/SQL/SQLite/20/insert_network.sql | 11 + .../SQL/SQLite/{19 => 20}/insert_nick.sql | 0 .../SQLite/{19 => 20}/insert_quasseluser.sql | 0 .../SQL/SQLite/{19 => 20}/insert_sender.sql | 0 .../SQL/SQLite/{19 => 20}/insert_server.sql | 0 .../SQLite/{19 => 20}/insert_user_setting.sql | 0 .../{19 => 20}/migrate_read_backlog.sql | 0 .../SQLite/{19 => 20}/migrate_read_buffer.sql | 0 .../{19 => 20}/migrate_read_identity.sql | 0 .../{19 => 20}/migrate_read_identity_nick.sql | 0 .../{19 => 20}/migrate_read_ircserver.sql | 0 .../{19 => 20}/migrate_read_network.sql | 3 +- .../{19 => 20}/migrate_read_quasseluser.sql | 0 .../SQLite/{19 => 20}/migrate_read_sender.sql | 0 .../{19 => 20}/migrate_read_usersetting.sql | 0 .../SQL/SQLite/{19 => 20}/select_authuser.sql | 0 .../SQLite/{19 => 20}/select_bufferByName.sql | 0 .../SQLite/{19 => 20}/select_bufferExists.sql | 0 .../SQLite/{19 => 20}/select_buffer_by_id.sql | 0 .../select_buffer_lastseen_messages.sql | 0 .../select_buffer_markerlinemsgids.sql | 0 .../SQL/SQLite/{19 => 20}/select_buffers.sql | 0 .../{19 => 20}/select_buffers_for_merge.sql | 0 .../{19 => 20}/select_buffers_for_network.sql | 0 .../{19 => 20}/select_checkidentity.sql | 0 .../{19 => 20}/select_connected_networks.sql | 0 .../SQLite/{19 => 20}/select_identities.sql | 0 .../SQLite/{19 => 20}/select_internaluser.sql | 0 .../SQL/SQLite/{19 => 20}/select_messages.sql | 0 .../SQLite/{19 => 20}/select_messagesAll.sql | 0 .../{19 => 20}/select_messagesAllNew.sql | 0 .../{19 => 20}/select_messagesNewerThan.sql | 0 .../{19 => 20}/select_messagesNewestK.sql | 0 .../{19 => 20}/select_networkExists.sql | 0 .../{19 => 20}/select_network_awaymsg.sql | 0 .../{19 => 20}/select_network_usermode.sql | 0 .../20}/select_networks_for_user.sql | 5 +- .../SQL/SQLite/{19 => 20}/select_nicks.sql | 0 .../{19 => 20}/select_persistent_channels.sql | 0 .../{19 => 20}/select_servers_for_network.sql | 0 .../SQLite/{19 => 20}/select_user_setting.sql | 0 .../SQL/SQLite/{19 => 20}/select_userid.sql | 0 .../{19 => 20}/setup_000_quasseluser.sql | 0 .../SQLite/{19 => 20}/setup_010_sender.sql | 0 .../SQLite/{19 => 20}/setup_020_network.sql | 4 + .../SQLite/{19 => 20}/setup_030_buffer.sql | 0 .../{19 => 20}/setup_040_buffer_idx.sql | 0 .../{19 => 20}/setup_050_buffer_cname_idx.sql | 0 .../SQLite/{19 => 20}/setup_060_backlog.sql | 0 .../SQLite/{19 => 20}/setup_070_coreinfo.sql | 0 .../{19 => 20}/setup_080_ircservers.sql | 0 .../{19 => 20}/setup_090_backlog_idx.sql | 0 .../{19 => 20}/setup_100_backlog_idx2.sql | 0 .../{19 => 20}/setup_110_buffer_user_idx.sql | 0 .../{19 => 20}/setup_120_user_setting.sql | 0 .../SQLite/{19 => 20}/setup_130_identity.sql | 0 .../{19 => 20}/setup_140_identity_nick.sql | 0 .../{19 => 20}/update_backlog_bufferid.sql | 0 .../{19 => 20}/update_buffer_lastseen.sql | 0 .../update_buffer_markerlinemsgid.sql | 0 .../SQLite/{19 => 20}/update_buffer_name.sql | 0 .../update_buffer_persistent_channel.sql | 0 .../update_buffer_set_channel_key.sql | 0 .../SQL/SQLite/{19 => 20}/update_identity.sql | 0 .../SQL/SQLite/{19 => 20}/update_network.sql | 4 + .../{19 => 20}/update_network_connected.sql | 0 .../{19 => 20}/update_network_set_awaymsg.sql | 0 .../update_network_set_usermode.sql | 0 .../SQLite/{19 => 20}/update_user_setting.sql | 0 .../SQL/SQLite/{19 => 20}/update_username.sql | 0 .../SQLite/{19 => 20}/update_userpassword.sql | 0 ..._alter_network_add_ratelimit_usecustom.sql | 1 + ..._alter_network_add_ratelimit_burstsize.sql | 1 + ..._002_alter_network_add_ratelimit_delay.sql | 1 + ..._alter_network_add_ratelimit_unlimited.sql | 1 + src/core/abstractsqlstorage.h | 6 + src/core/corenetwork.cpp | 128 ++++++- src/core/corenetwork.h | 55 ++- src/core/postgresqlstorage.cpp | 15 + src/core/sql.qrc | 348 +++++++++--------- src/core/sqlitestorage.cpp | 15 + .../settingspages/networkssettingspage.cpp | 51 +++ .../settingspages/networkssettingspage.ui | 197 +++++++++- 192 files changed, 921 insertions(+), 204 deletions(-) delete mode 100644 src/core/SQL/PostgreSQL/18/insert_network.sql delete mode 100644 src/core/SQL/PostgreSQL/18/migrate_write_network.sql rename src/core/SQL/PostgreSQL/{18 => 19}/delete_backlog_by_uid.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/delete_backlog_for_buffer.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/delete_backlog_for_network.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/delete_buffer_for_bufferid.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/delete_buffers_by_uid.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/delete_buffers_for_network.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/delete_identity.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/delete_ircservers_for_network.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/delete_network.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/delete_networks_by_uid.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/delete_nicks.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/delete_quasseluser.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/insert_buffer.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/insert_identity.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/insert_message.sql (100%) create mode 100644 src/core/SQL/PostgreSQL/19/insert_network.sql rename src/core/SQL/PostgreSQL/{18 => 19}/insert_nick.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/insert_quasseluser.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/insert_sender.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/insert_server.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/insert_user_setting.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/migrate_write_backlog.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/migrate_write_buffer.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/migrate_write_identity.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/migrate_write_identity_nick.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/migrate_write_ircserver.sql (100%) create mode 100644 src/core/SQL/PostgreSQL/19/migrate_write_network.sql rename src/core/SQL/PostgreSQL/{18 => 19}/migrate_write_quasseluser.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/migrate_write_sender.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/migrate_write_usersetting.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_authuser.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_bufferByName.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_bufferExists.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_buffer_by_id.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_buffer_lastseen_messages.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_buffer_markerlinemsgids.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_buffers.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_buffers_for_network.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_checkidentity.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_connected_networks.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_identities.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_internaluser.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_messages.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_messagesAll.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_messagesAllNew.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_messagesNewerThan.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_messagesRange.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_networkExists.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_network_awaymsg.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_network_usermode.sql (100%) rename src/core/SQL/{SQLite => PostgreSQL}/19/select_networks_for_user.sql (60%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_nicks.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_persistent_channels.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_senderid.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_servers_for_network.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_user_setting.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/select_userid.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/setup_000_quasseluser.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/setup_010_sender.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/setup_020_identity.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/setup_030_identity_nick.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/setup_040_network.sql (79%) rename src/core/SQL/PostgreSQL/{18 => 19}/setup_050_buffer.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/setup_060_backlog.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/setup_070_coreinfo.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/setup_080_ircservers.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/setup_090_backlog_idx.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/setup_100_user_setting.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/setup_110_alter_sender_seq.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/setup_120_alter_messageid_seq.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/update_backlog_bufferid.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/update_buffer_lastseen.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/update_buffer_markerlinemsgid.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/update_buffer_name.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/update_buffer_persistent_channel.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/update_buffer_set_channel_key.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/update_identity.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/update_network.sql (79%) rename src/core/SQL/PostgreSQL/{18 => 19}/update_network_connected.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/update_network_set_awaymsg.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/update_network_set_usermode.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/update_user_setting.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/update_username.sql (100%) rename src/core/SQL/PostgreSQL/{18 => 19}/update_userpassword.sql (100%) create mode 100644 src/core/SQL/PostgreSQL/19/upgrade_000_alter_network_add_ratelimit_usecustom.sql create mode 100644 src/core/SQL/PostgreSQL/19/upgrade_001_alter_network_add_ratelimit_burstsize.sql create mode 100644 src/core/SQL/PostgreSQL/19/upgrade_002_alter_network_add_ratelimit_delay.sql create mode 100644 src/core/SQL/PostgreSQL/19/upgrade_003_alter_network_add_ratelimit_unlimited.sql delete mode 100644 src/core/SQL/SQLite/19/insert_network.sql rename src/core/SQL/SQLite/{19 => 20}/delete_backlog_by_uid.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/delete_backlog_for_buffer.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/delete_backlog_for_network.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/delete_buffer_for_bufferid.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/delete_buffers_by_uid.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/delete_buffers_for_network.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/delete_identity.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/delete_ircservers_for_network.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/delete_network.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/delete_networks_by_uid.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/delete_nicks.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/delete_quasseluser.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/insert_buffer.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/insert_identity.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/insert_message.sql (100%) create mode 100644 src/core/SQL/SQLite/20/insert_network.sql rename src/core/SQL/SQLite/{19 => 20}/insert_nick.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/insert_quasseluser.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/insert_sender.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/insert_server.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/insert_user_setting.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/migrate_read_backlog.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/migrate_read_buffer.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/migrate_read_identity.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/migrate_read_identity_nick.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/migrate_read_ircserver.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/migrate_read_network.sql (74%) rename src/core/SQL/SQLite/{19 => 20}/migrate_read_quasseluser.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/migrate_read_sender.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/migrate_read_usersetting.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_authuser.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_bufferByName.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_bufferExists.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_buffer_by_id.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_buffer_lastseen_messages.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_buffer_markerlinemsgids.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_buffers.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_buffers_for_merge.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_buffers_for_network.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_checkidentity.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_connected_networks.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_identities.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_internaluser.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_messages.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_messagesAll.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_messagesAllNew.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_messagesNewerThan.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_messagesNewestK.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_networkExists.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_network_awaymsg.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_network_usermode.sql (100%) rename src/core/SQL/{PostgreSQL/18 => SQLite/20}/select_networks_for_user.sql (60%) rename src/core/SQL/SQLite/{19 => 20}/select_nicks.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_persistent_channels.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_servers_for_network.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_user_setting.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/select_userid.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/setup_000_quasseluser.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/setup_010_sender.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/setup_020_network.sql (78%) rename src/core/SQL/SQLite/{19 => 20}/setup_030_buffer.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/setup_040_buffer_idx.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/setup_050_buffer_cname_idx.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/setup_060_backlog.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/setup_070_coreinfo.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/setup_080_ircservers.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/setup_090_backlog_idx.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/setup_100_backlog_idx2.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/setup_110_buffer_user_idx.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/setup_120_user_setting.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/setup_130_identity.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/setup_140_identity_nick.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/update_backlog_bufferid.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/update_buffer_lastseen.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/update_buffer_markerlinemsgid.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/update_buffer_name.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/update_buffer_persistent_channel.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/update_buffer_set_channel_key.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/update_identity.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/update_network.sql (79%) rename src/core/SQL/SQLite/{19 => 20}/update_network_connected.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/update_network_set_awaymsg.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/update_network_set_usermode.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/update_user_setting.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/update_username.sql (100%) rename src/core/SQL/SQLite/{19 => 20}/update_userpassword.sql (100%) create mode 100644 src/core/SQL/SQLite/20/upgrade_000_alter_network_add_ratelimit_usecustom.sql create mode 100644 src/core/SQL/SQLite/20/upgrade_001_alter_network_add_ratelimit_burstsize.sql create mode 100644 src/core/SQL/SQLite/20/upgrade_002_alter_network_add_ratelimit_delay.sql create mode 100644 src/core/SQL/SQLite/20/upgrade_003_alter_network_add_ratelimit_unlimited.sql diff --git a/src/common/network.cpp b/src/common/network.cpp index b1e4519a..4e14af4f 100644 --- a/src/common/network.cpp +++ b/src/common/network.cpp @@ -50,6 +50,10 @@ Network::Network(const NetworkId &networkid, QObject *parent) _autoReconnectInterval(60), _autoReconnectRetries(10), _unlimitedReconnectRetries(false), + _useCustomMessageRate(false), + _messageRateBurstSize(5), + _messageRateDelay(2200), + _unlimitedMessageRate(false), _codecForServer(0), _codecForEncoding(0), _codecForDecoding(0), @@ -112,6 +116,10 @@ NetworkInfo Network::networkInfo() const info.autoReconnectRetries = autoReconnectRetries(); info.unlimitedReconnectRetries = unlimitedReconnectRetries(); info.rejoinChannels = rejoinChannels(); + info.useCustomMessageRate = useCustomMessageRate(); + info.messageRateBurstSize = messageRateBurstSize(); + info.messageRateDelay = messageRateDelay(); + info.unlimitedMessageRate = unlimitedMessageRate(); return info; } @@ -138,6 +146,15 @@ void Network::setNetworkInfo(const NetworkInfo &info) if (info.autoReconnectRetries != autoReconnectRetries()) setAutoReconnectRetries(info.autoReconnectRetries); if (info.unlimitedReconnectRetries != unlimitedReconnectRetries()) setUnlimitedReconnectRetries(info.unlimitedReconnectRetries); if (info.rejoinChannels != rejoinChannels()) setRejoinChannels(info.rejoinChannels); + // Custom rate limiting + if (info.useCustomMessageRate != useCustomMessageRate()) + setUseCustomMessageRate(info.useCustomMessageRate); + if (info.messageRateBurstSize != messageRateBurstSize()) + setMessageRateBurstSize(info.messageRateBurstSize); + if (info.messageRateDelay != messageRateDelay()) + setMessageRateDelay(info.messageRateDelay); + if (info.unlimitedMessageRate != unlimitedMessageRate()) + setUnlimitedMessageRate(info.unlimitedMessageRate); } @@ -676,6 +693,56 @@ void Network::setRejoinChannels(bool rejoin) } +void Network::setUseCustomMessageRate(bool useCustomRate) +{ + if (_useCustomMessageRate != useCustomRate) { + _useCustomMessageRate = useCustomRate; + SYNC(ARG(useCustomRate)) + emit configChanged(); + emit useCustomMessageRateSet(_useCustomMessageRate); + } +} + + +void Network::setMessageRateBurstSize(quint32 burstSize) +{ + if (burstSize < 1) { + // Can't go slower than one message at a time + qWarning() << "Received invalid setMessageRateBurstSize data, cannot have zero message " + "burst size!" << burstSize; + return; + } + if (_messageRateBurstSize != burstSize) { + _messageRateBurstSize = burstSize; + SYNC(ARG(burstSize)) + emit configChanged(); + emit messageRateBurstSizeSet(_messageRateBurstSize); + } +} + + +void Network::setMessageRateDelay(quint32 messageDelay) +{ + if (_messageRateDelay != messageDelay) { + _messageRateDelay = messageDelay; + SYNC(ARG(messageDelay)) + emit configChanged(); + emit messageRateDelaySet(_messageRateDelay); + } +} + + +void Network::setUnlimitedMessageRate(bool unlimitedRate) +{ + if (_unlimitedMessageRate != unlimitedRate) { + _unlimitedMessageRate = unlimitedRate; + SYNC(ARG(unlimitedRate)) + emit configChanged(); + emit unlimitedMessageRateSet(_unlimitedMessageRate); + } +} + + void Network::addSupport(const QString ¶m, const QString &value) { if (!_supports.contains(param)) { @@ -1001,7 +1068,11 @@ NetworkInfo::NetworkInfo() autoReconnectInterval(60), autoReconnectRetries(20), unlimitedReconnectRetries(false), - rejoinChannels(true) + rejoinChannels(true), + useCustomMessageRate(false), + messageRateBurstSize(5), + messageRateDelay(2200), + unlimitedMessageRate(false) { } @@ -1028,6 +1099,11 @@ bool NetworkInfo::operator==(const NetworkInfo &other) const if (autoReconnectRetries != other.autoReconnectRetries) return false; if (unlimitedReconnectRetries != other.unlimitedReconnectRetries) return false; if (rejoinChannels != other.rejoinChannels) return false; + // Custom rate limiting + if (useCustomMessageRate != other.useCustomMessageRate) return false; + if (messageRateBurstSize != other.messageRateBurstSize) return false; + if (messageRateDelay != other.messageRateDelay) return false; + if (unlimitedMessageRate != other.unlimitedMessageRate) return false; return true; } @@ -1061,6 +1137,11 @@ QDataStream &operator<<(QDataStream &out, const NetworkInfo &info) i["AutoReconnectRetries"] = info.autoReconnectRetries; i["UnlimitedReconnectRetries"] = info.unlimitedReconnectRetries; i["RejoinChannels"] = info.rejoinChannels; + // Custom rate limiting + i["UseCustomMessageRate"] = info.useCustomMessageRate; + i["MessageRateBurstSize"] = info.messageRateBurstSize; + i["MessageRateDelay"] = info.messageRateDelay; + i["UnlimitedMessageRate"] = info.unlimitedMessageRate; out << i; return out; } @@ -1090,6 +1171,11 @@ QDataStream &operator>>(QDataStream &in, NetworkInfo &info) info.autoReconnectRetries = i["AutoReconnectRetries"].toInt(); info.unlimitedReconnectRetries = i["UnlimitedReconnectRetries"].toBool(); info.rejoinChannels = i["RejoinChannels"].toBool(); + // Custom rate limiting + info.useCustomMessageRate = i["UseCustomMessageRate"].toBool(); + info.messageRateBurstSize = i["MessageRateBurstSize"].toUInt(); + info.messageRateDelay = i["MessageRateDelay"].toUInt(); + info.unlimitedMessageRate = i["UnlimitedMessageRate"].toBool(); return in; } @@ -1103,7 +1189,12 @@ QDebug operator<<(QDebug dbg, const NetworkInfo &i) << " useSasl = " << i.useSasl << " saslAccount = " << i.saslAccount << " saslPassword = " << i.saslPassword << " useAutoReconnect = " << i.useAutoReconnect << " autoReconnectInterval = " << i.autoReconnectInterval << " autoReconnectRetries = " << i.autoReconnectRetries << " unlimitedReconnectRetries = " << i.unlimitedReconnectRetries - << " rejoinChannels = " << i.rejoinChannels << ")"; + << " rejoinChannels = " << i.rejoinChannels + << " useCustomMessageRate = " << i.useCustomMessageRate + << " messageRateBurstSize = " << i.messageRateBurstSize + << " messageRateDelay = " << i.messageRateDelay + << " unlimitedMessageRate = " << i.unlimitedMessageRate + << ")"; return dbg.space(); } diff --git a/src/common/network.h b/src/common/network.h index bbcd268c..969c3b9b 100644 --- a/src/common/network.h +++ b/src/common/network.h @@ -74,6 +74,11 @@ class Network : public SyncableObject Q_PROPERTY(quint16 autoReconnectRetries READ autoReconnectRetries WRITE setAutoReconnectRetries) Q_PROPERTY(bool unlimitedReconnectRetries READ unlimitedReconnectRetries WRITE setUnlimitedReconnectRetries) Q_PROPERTY(bool rejoinChannels READ rejoinChannels WRITE setRejoinChannels) + // Custom rate limiting + Q_PROPERTY(bool useCustomMessageRate READ useCustomMessageRate WRITE setUseCustomMessageRate) + Q_PROPERTY(quint32 msgRateBurstSize READ messageRateBurstSize WRITE setMessageRateBurstSize) + Q_PROPERTY(quint32 msgRateMessageDelay READ messageRateDelay WRITE setMessageRateDelay) + Q_PROPERTY(bool unlimitedMessageRate READ unlimitedMessageRate WRITE setUnlimitedMessageRate) public : enum ConnectionState { @@ -207,6 +212,44 @@ public : inline bool unlimitedReconnectRetries() const { return _unlimitedReconnectRetries; } inline bool rejoinChannels() const { return _rejoinChannels; } + // Custom rate limiting + + /** + * Gets whether or not custom rate limiting is used + * + * @return True if custom rate limiting is enabled, otherwise false. + */ + inline bool useCustomMessageRate() const { return _useCustomMessageRate; } + + /** + * Gets maximum number of messages to send without any delays + * + * @return + * @parblock + * Maximum number of messages to send without any delays. A value of 1 disables message + * bursting. + * @endparblock + */ + inline quint32 messageRateBurstSize() const { return _messageRateBurstSize; } + + /** + * Gets the delay between messages after the maximum number of undelayed messages have been sent + * + * @return + * @parblock + * Delay in milliseconds between messages after the maximum number of undelayed messages have + * been sent. + * @endparblock + */ + inline quint32 messageRateDelay() const { return _messageRateDelay; } + + /** + * Gets whether or not all rate limiting is disabled, e.g. for IRC bridges + * + * @return If true, disable rate limiting, otherwise apply configured limits. + */ + inline bool unlimitedMessageRate() const { return _unlimitedMessageRate; } + NetworkInfo networkInfo() const; void setNetworkInfo(const NetworkInfo &); @@ -297,6 +340,48 @@ public slots: void setUnlimitedReconnectRetries(bool); void setRejoinChannels(bool); + // Custom rate limiting + + /** + * Sets whether or not custom rate limiting is used. + * + * Setting limits too low may get you disconnected from the server! + * + * @param[in] useCustomRate If true, use custom rate limits, otherwise use Quassel defaults. + */ + void setUseCustomMessageRate(bool useCustomRate); + + /** + * Sets maximum number of messages to send without any delays + * + * @param[in] burstSize + * @parblock + * Maximum number of messages to send without any delays. A value of 1 disables message + * bursting. Cannot be less than 1 as sending 0 messages at a time accomplishes nothing. + * @endparblock + */ + void setMessageRateBurstSize(quint32 burstSize); + + /** + * Sets the delay between messages after the maximum number of undelayed messages have been sent + * + * @param[in] messageDelay + * @parblock + * Delay in milliseconds between messages after the maximum number of undelayed messages have + * been sent. + * @endparblock + */ + void setMessageRateDelay(quint32 messageDelay); + + /** + * Sets whether or not all rate limiting is disabled, e.g. for IRC bridges + * + * Don't use with most normal networks. + * + * @param[in] unlimitedRate If true, disable rate limiting, otherwise apply configured limits. + */ + void setUnlimitedMessageRate(bool unlimitedRate); + void setCodecForServer(const QByteArray &codecName); void setCodecForEncoding(const QByteArray &codecName); void setCodecForDecoding(const QByteArray &codecName); @@ -431,6 +516,44 @@ signals: // void unlimitedReconnectRetriesSet(bool); // void rejoinChannelsSet(bool); + // Custom rate limiting (can drive other slots) + + /** + * Signals enabling or disabling custom rate limiting + * + * @see Network::useCustomMessageRate() + * + * @param[out] useCustomRate + */ + void useCustomMessageRateSet(const bool useCustomRate); + + /** + * Signals a change in maximum number of messages to send without any delays + * + * @see Network::messageRateBurstSize() + * + * @param[out] burstSize + */ + void messageRateBurstSizeSet(const quint32 burstSize); + + /** + * Signals a change in delay between messages after the max. undelayed messages have been sent + * + * @see Network::messageRateDelay() + * + * @param[out] messageDelay + */ + void messageRateDelaySet(const quint32 messageDelay); + + /** + * Signals enabling or disabling all rate limiting + * + * @see Network::unlimitedMessageRate() + * + * @param[out] unlimitedRate + */ + void unlimitedMessageRateSet(const bool unlimitedRate); + // void codecForServerSet(const QByteArray &codecName); // void codecForEncodingSet(const QByteArray &codecName); // void codecForDecodingSet(const QByteArray &codecName); @@ -524,6 +647,12 @@ private: bool _unlimitedReconnectRetries; bool _rejoinChannels; + // Custom rate limiting + bool _useCustomMessageRate; /// If true, use custom rate limits, otherwise use defaults + quint32 _messageRateBurstSize; /// Maximum number of messages to send without any delays + quint32 _messageRateDelay; /// Delay in ms. for messages when max. burst messages sent + bool _unlimitedMessageRate; /// If true, disable rate limiting, otherwise apply limits + QTextCodec *_codecForServer; QTextCodec *_codecForEncoding; QTextCodec *_codecForDecoding; @@ -572,6 +701,12 @@ struct NetworkInfo { bool unlimitedReconnectRetries; bool rejoinChannels; + // Custom rate limiting + bool useCustomMessageRate; /// If true, use custom rate limits, otherwise use defaults + quint32 messageRateBurstSize; /// Maximum number of messages to send without any delays + quint32 messageRateDelay; /// Delay in ms. for messages when max. burst messages sent + bool unlimitedMessageRate; /// If true, disable rate limiting, otherwise apply limits + bool operator==(const NetworkInfo &other) const; bool operator!=(const NetworkInfo &other) const; }; diff --git a/src/common/quassel.h b/src/common/quassel.h index b705d595..3305009d 100644 --- a/src/common/quassel.h +++ b/src/common/quassel.h @@ -73,8 +73,9 @@ public: PasswordChange = 0x0010, CapNegotiation = 0x0020, /// IRCv3 capability negotiation, account tracking VerifyServerSSL = 0x0040, /// IRC server SSL validation + CustomRateLimits = 0x0080, /// IRC server custom message rate limits - NumFeatures = 0x0040 + NumFeatures = 0x0080 }; Q_DECLARE_FLAGS(Features, Feature) diff --git a/src/core/SQL/PostgreSQL/18/insert_network.sql b/src/core/SQL/PostgreSQL/18/insert_network.sql deleted file mode 100644 index 56fbef8e..00000000 --- a/src/core/SQL/PostgreSQL/18/insert_network.sql +++ /dev/null @@ -1,3 +0,0 @@ -INSERT INTO network (userid, networkname, identityid, servercodec, encodingcodec, decodingcodec, userandomserver, perform, useautoidentify, autoidentifyservice, autoidentifypassword, useautoreconnect, autoreconnectinterval, autoreconnectretries, unlimitedconnectretries, rejoinchannels, usesasl, saslaccount, saslpassword) -VALUES (:userid, :networkname, :identityid, :servercodec, :encodingcodec, :decodingcodec, :userandomserver, :perform, :useautoidentify, :autoidentifyservice, :autoidentifypassword, :useautoreconnect, :autoreconnectinterval, :autoreconnectretries, :unlimitedconnectretries, :rejoinchannels, :usesasl, :saslaccount, :saslpassword) -RETURNING networkid diff --git a/src/core/SQL/PostgreSQL/18/migrate_write_network.sql b/src/core/SQL/PostgreSQL/18/migrate_write_network.sql deleted file mode 100644 index 45576eeb..00000000 --- a/src/core/SQL/PostgreSQL/18/migrate_write_network.sql +++ /dev/null @@ -1,2 +0,0 @@ -INSERT INTO network (networkid, userid, networkname, identityid, encodingcodec, decodingcodec, servercodec, userandomserver, perform, useautoidentify, autoidentifyservice, autoidentifypassword, useautoreconnect, autoreconnectinterval, autoreconnectretries, unlimitedconnectretries, rejoinchannels, connected, usermode, awaymessage, attachperform, detachperform, usesasl, saslaccount, saslpassword) -VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) diff --git a/src/core/SQL/PostgreSQL/18/delete_backlog_by_uid.sql b/src/core/SQL/PostgreSQL/19/delete_backlog_by_uid.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/delete_backlog_by_uid.sql rename to src/core/SQL/PostgreSQL/19/delete_backlog_by_uid.sql diff --git a/src/core/SQL/PostgreSQL/18/delete_backlog_for_buffer.sql b/src/core/SQL/PostgreSQL/19/delete_backlog_for_buffer.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/delete_backlog_for_buffer.sql rename to src/core/SQL/PostgreSQL/19/delete_backlog_for_buffer.sql diff --git a/src/core/SQL/PostgreSQL/18/delete_backlog_for_network.sql b/src/core/SQL/PostgreSQL/19/delete_backlog_for_network.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/delete_backlog_for_network.sql rename to src/core/SQL/PostgreSQL/19/delete_backlog_for_network.sql diff --git a/src/core/SQL/PostgreSQL/18/delete_buffer_for_bufferid.sql b/src/core/SQL/PostgreSQL/19/delete_buffer_for_bufferid.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/delete_buffer_for_bufferid.sql rename to src/core/SQL/PostgreSQL/19/delete_buffer_for_bufferid.sql diff --git a/src/core/SQL/PostgreSQL/18/delete_buffers_by_uid.sql b/src/core/SQL/PostgreSQL/19/delete_buffers_by_uid.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/delete_buffers_by_uid.sql rename to src/core/SQL/PostgreSQL/19/delete_buffers_by_uid.sql diff --git a/src/core/SQL/PostgreSQL/18/delete_buffers_for_network.sql b/src/core/SQL/PostgreSQL/19/delete_buffers_for_network.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/delete_buffers_for_network.sql rename to src/core/SQL/PostgreSQL/19/delete_buffers_for_network.sql diff --git a/src/core/SQL/PostgreSQL/18/delete_identity.sql b/src/core/SQL/PostgreSQL/19/delete_identity.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/delete_identity.sql rename to src/core/SQL/PostgreSQL/19/delete_identity.sql diff --git a/src/core/SQL/PostgreSQL/18/delete_ircservers_for_network.sql b/src/core/SQL/PostgreSQL/19/delete_ircservers_for_network.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/delete_ircservers_for_network.sql rename to src/core/SQL/PostgreSQL/19/delete_ircservers_for_network.sql diff --git a/src/core/SQL/PostgreSQL/18/delete_network.sql b/src/core/SQL/PostgreSQL/19/delete_network.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/delete_network.sql rename to src/core/SQL/PostgreSQL/19/delete_network.sql diff --git a/src/core/SQL/PostgreSQL/18/delete_networks_by_uid.sql b/src/core/SQL/PostgreSQL/19/delete_networks_by_uid.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/delete_networks_by_uid.sql rename to src/core/SQL/PostgreSQL/19/delete_networks_by_uid.sql diff --git a/src/core/SQL/PostgreSQL/18/delete_nicks.sql b/src/core/SQL/PostgreSQL/19/delete_nicks.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/delete_nicks.sql rename to src/core/SQL/PostgreSQL/19/delete_nicks.sql diff --git a/src/core/SQL/PostgreSQL/18/delete_quasseluser.sql b/src/core/SQL/PostgreSQL/19/delete_quasseluser.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/delete_quasseluser.sql rename to src/core/SQL/PostgreSQL/19/delete_quasseluser.sql diff --git a/src/core/SQL/PostgreSQL/18/insert_buffer.sql b/src/core/SQL/PostgreSQL/19/insert_buffer.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/insert_buffer.sql rename to src/core/SQL/PostgreSQL/19/insert_buffer.sql diff --git a/src/core/SQL/PostgreSQL/18/insert_identity.sql b/src/core/SQL/PostgreSQL/19/insert_identity.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/insert_identity.sql rename to src/core/SQL/PostgreSQL/19/insert_identity.sql diff --git a/src/core/SQL/PostgreSQL/18/insert_message.sql b/src/core/SQL/PostgreSQL/19/insert_message.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/insert_message.sql rename to src/core/SQL/PostgreSQL/19/insert_message.sql diff --git a/src/core/SQL/PostgreSQL/19/insert_network.sql b/src/core/SQL/PostgreSQL/19/insert_network.sql new file mode 100644 index 00000000..d91f23c5 --- /dev/null +++ b/src/core/SQL/PostgreSQL/19/insert_network.sql @@ -0,0 +1,12 @@ +INSERT INTO network (userid, networkname, identityid, servercodec, encodingcodec, decodingcodec, + userandomserver, perform, useautoidentify, autoidentifyservice, + autoidentifypassword, useautoreconnect, autoreconnectinterval, + autoreconnectretries, unlimitedconnectretries, rejoinchannels, usesasl, + saslaccount, saslpassword, usecustomessagerate, messagerateburstsize, + messageratedelay, unlimitedmessagerate) +VALUES (:userid, :networkname, :identityid, :servercodec, :encodingcodec, :decodingcodec, + :userandomserver, :perform, :useautoidentify, :autoidentifyservice, :autoidentifypassword, + :useautoreconnect, :autoreconnectinterval, :autoreconnectretries, :unlimitedconnectretries, + :rejoinchannels, :usesasl, :saslaccount, :saslpassword, :usecustomessagerate, + :messagerateburstsize, :messageratedelay, :unlimitedmessagerate) +RETURNING networkid diff --git a/src/core/SQL/PostgreSQL/18/insert_nick.sql b/src/core/SQL/PostgreSQL/19/insert_nick.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/insert_nick.sql rename to src/core/SQL/PostgreSQL/19/insert_nick.sql diff --git a/src/core/SQL/PostgreSQL/18/insert_quasseluser.sql b/src/core/SQL/PostgreSQL/19/insert_quasseluser.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/insert_quasseluser.sql rename to src/core/SQL/PostgreSQL/19/insert_quasseluser.sql diff --git a/src/core/SQL/PostgreSQL/18/insert_sender.sql b/src/core/SQL/PostgreSQL/19/insert_sender.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/insert_sender.sql rename to src/core/SQL/PostgreSQL/19/insert_sender.sql diff --git a/src/core/SQL/PostgreSQL/18/insert_server.sql b/src/core/SQL/PostgreSQL/19/insert_server.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/insert_server.sql rename to src/core/SQL/PostgreSQL/19/insert_server.sql diff --git a/src/core/SQL/PostgreSQL/18/insert_user_setting.sql b/src/core/SQL/PostgreSQL/19/insert_user_setting.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/insert_user_setting.sql rename to src/core/SQL/PostgreSQL/19/insert_user_setting.sql diff --git a/src/core/SQL/PostgreSQL/18/migrate_write_backlog.sql b/src/core/SQL/PostgreSQL/19/migrate_write_backlog.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/migrate_write_backlog.sql rename to src/core/SQL/PostgreSQL/19/migrate_write_backlog.sql diff --git a/src/core/SQL/PostgreSQL/18/migrate_write_buffer.sql b/src/core/SQL/PostgreSQL/19/migrate_write_buffer.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/migrate_write_buffer.sql rename to src/core/SQL/PostgreSQL/19/migrate_write_buffer.sql diff --git a/src/core/SQL/PostgreSQL/18/migrate_write_identity.sql b/src/core/SQL/PostgreSQL/19/migrate_write_identity.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/migrate_write_identity.sql rename to src/core/SQL/PostgreSQL/19/migrate_write_identity.sql diff --git a/src/core/SQL/PostgreSQL/18/migrate_write_identity_nick.sql b/src/core/SQL/PostgreSQL/19/migrate_write_identity_nick.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/migrate_write_identity_nick.sql rename to src/core/SQL/PostgreSQL/19/migrate_write_identity_nick.sql diff --git a/src/core/SQL/PostgreSQL/18/migrate_write_ircserver.sql b/src/core/SQL/PostgreSQL/19/migrate_write_ircserver.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/migrate_write_ircserver.sql rename to src/core/SQL/PostgreSQL/19/migrate_write_ircserver.sql diff --git a/src/core/SQL/PostgreSQL/19/migrate_write_network.sql b/src/core/SQL/PostgreSQL/19/migrate_write_network.sql new file mode 100644 index 00000000..979370f0 --- /dev/null +++ b/src/core/SQL/PostgreSQL/19/migrate_write_network.sql @@ -0,0 +1,8 @@ +INSERT INTO network (networkid, userid, networkname, identityid, encodingcodec, decodingcodec, + servercodec, userandomserver, perform, useautoidentify, autoidentifyservice, + autoidentifypassword, useautoreconnect, autoreconnectinterval, + autoreconnectretries, unlimitedconnectretries, rejoinchannels, connected, + usermode, awaymessage, attachperform, detachperform, usesasl, saslaccount, + saslpassword, usecustomessagerate, messagerateburstsize, messageratedelay, + unlimitedmessagerate) +VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) diff --git a/src/core/SQL/PostgreSQL/18/migrate_write_quasseluser.sql b/src/core/SQL/PostgreSQL/19/migrate_write_quasseluser.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/migrate_write_quasseluser.sql rename to src/core/SQL/PostgreSQL/19/migrate_write_quasseluser.sql diff --git a/src/core/SQL/PostgreSQL/18/migrate_write_sender.sql b/src/core/SQL/PostgreSQL/19/migrate_write_sender.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/migrate_write_sender.sql rename to src/core/SQL/PostgreSQL/19/migrate_write_sender.sql diff --git a/src/core/SQL/PostgreSQL/18/migrate_write_usersetting.sql b/src/core/SQL/PostgreSQL/19/migrate_write_usersetting.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/migrate_write_usersetting.sql rename to src/core/SQL/PostgreSQL/19/migrate_write_usersetting.sql diff --git a/src/core/SQL/PostgreSQL/18/select_authuser.sql b/src/core/SQL/PostgreSQL/19/select_authuser.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_authuser.sql rename to src/core/SQL/PostgreSQL/19/select_authuser.sql diff --git a/src/core/SQL/PostgreSQL/18/select_bufferByName.sql b/src/core/SQL/PostgreSQL/19/select_bufferByName.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_bufferByName.sql rename to src/core/SQL/PostgreSQL/19/select_bufferByName.sql diff --git a/src/core/SQL/PostgreSQL/18/select_bufferExists.sql b/src/core/SQL/PostgreSQL/19/select_bufferExists.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_bufferExists.sql rename to src/core/SQL/PostgreSQL/19/select_bufferExists.sql diff --git a/src/core/SQL/PostgreSQL/18/select_buffer_by_id.sql b/src/core/SQL/PostgreSQL/19/select_buffer_by_id.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_buffer_by_id.sql rename to src/core/SQL/PostgreSQL/19/select_buffer_by_id.sql diff --git a/src/core/SQL/PostgreSQL/18/select_buffer_lastseen_messages.sql b/src/core/SQL/PostgreSQL/19/select_buffer_lastseen_messages.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_buffer_lastseen_messages.sql rename to src/core/SQL/PostgreSQL/19/select_buffer_lastseen_messages.sql diff --git a/src/core/SQL/PostgreSQL/18/select_buffer_markerlinemsgids.sql b/src/core/SQL/PostgreSQL/19/select_buffer_markerlinemsgids.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_buffer_markerlinemsgids.sql rename to src/core/SQL/PostgreSQL/19/select_buffer_markerlinemsgids.sql diff --git a/src/core/SQL/PostgreSQL/18/select_buffers.sql b/src/core/SQL/PostgreSQL/19/select_buffers.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_buffers.sql rename to src/core/SQL/PostgreSQL/19/select_buffers.sql diff --git a/src/core/SQL/PostgreSQL/18/select_buffers_for_network.sql b/src/core/SQL/PostgreSQL/19/select_buffers_for_network.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_buffers_for_network.sql rename to src/core/SQL/PostgreSQL/19/select_buffers_for_network.sql diff --git a/src/core/SQL/PostgreSQL/18/select_checkidentity.sql b/src/core/SQL/PostgreSQL/19/select_checkidentity.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_checkidentity.sql rename to src/core/SQL/PostgreSQL/19/select_checkidentity.sql diff --git a/src/core/SQL/PostgreSQL/18/select_connected_networks.sql b/src/core/SQL/PostgreSQL/19/select_connected_networks.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_connected_networks.sql rename to src/core/SQL/PostgreSQL/19/select_connected_networks.sql diff --git a/src/core/SQL/PostgreSQL/18/select_identities.sql b/src/core/SQL/PostgreSQL/19/select_identities.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_identities.sql rename to src/core/SQL/PostgreSQL/19/select_identities.sql diff --git a/src/core/SQL/PostgreSQL/18/select_internaluser.sql b/src/core/SQL/PostgreSQL/19/select_internaluser.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_internaluser.sql rename to src/core/SQL/PostgreSQL/19/select_internaluser.sql diff --git a/src/core/SQL/PostgreSQL/18/select_messages.sql b/src/core/SQL/PostgreSQL/19/select_messages.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_messages.sql rename to src/core/SQL/PostgreSQL/19/select_messages.sql diff --git a/src/core/SQL/PostgreSQL/18/select_messagesAll.sql b/src/core/SQL/PostgreSQL/19/select_messagesAll.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_messagesAll.sql rename to src/core/SQL/PostgreSQL/19/select_messagesAll.sql diff --git a/src/core/SQL/PostgreSQL/18/select_messagesAllNew.sql b/src/core/SQL/PostgreSQL/19/select_messagesAllNew.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_messagesAllNew.sql rename to src/core/SQL/PostgreSQL/19/select_messagesAllNew.sql diff --git a/src/core/SQL/PostgreSQL/18/select_messagesNewerThan.sql b/src/core/SQL/PostgreSQL/19/select_messagesNewerThan.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_messagesNewerThan.sql rename to src/core/SQL/PostgreSQL/19/select_messagesNewerThan.sql diff --git a/src/core/SQL/PostgreSQL/18/select_messagesRange.sql b/src/core/SQL/PostgreSQL/19/select_messagesRange.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_messagesRange.sql rename to src/core/SQL/PostgreSQL/19/select_messagesRange.sql diff --git a/src/core/SQL/PostgreSQL/18/select_networkExists.sql b/src/core/SQL/PostgreSQL/19/select_networkExists.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_networkExists.sql rename to src/core/SQL/PostgreSQL/19/select_networkExists.sql diff --git a/src/core/SQL/PostgreSQL/18/select_network_awaymsg.sql b/src/core/SQL/PostgreSQL/19/select_network_awaymsg.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_network_awaymsg.sql rename to src/core/SQL/PostgreSQL/19/select_network_awaymsg.sql diff --git a/src/core/SQL/PostgreSQL/18/select_network_usermode.sql b/src/core/SQL/PostgreSQL/19/select_network_usermode.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_network_usermode.sql rename to src/core/SQL/PostgreSQL/19/select_network_usermode.sql diff --git a/src/core/SQL/SQLite/19/select_networks_for_user.sql b/src/core/SQL/PostgreSQL/19/select_networks_for_user.sql similarity index 60% rename from src/core/SQL/SQLite/19/select_networks_for_user.sql rename to src/core/SQL/PostgreSQL/19/select_networks_for_user.sql index 9bef4054..a5395dc7 100644 --- a/src/core/SQL/SQLite/19/select_networks_for_user.sql +++ b/src/core/SQL/PostgreSQL/19/select_networks_for_user.sql @@ -1,6 +1,7 @@ SELECT networkid, networkname, identityid, servercodec, encodingcodec, decodingcodec, userandomserver, perform, useautoidentify, autoidentifyservice, autoidentifypassword, - useautoreconnect, autoreconnectinterval, autoreconnectretries, unlimitedconnectretries, rejoinchannels, - usesasl, saslaccount, saslpassword + useautoreconnect, autoreconnectinterval, autoreconnectretries, unlimitedconnectretries, + rejoinchannels, usesasl, saslaccount, saslpassword, usecustomessagerate, + messagerateburstsize, messageratedelay, unlimitedmessagerate FROM network WHERE userid = :userid diff --git a/src/core/SQL/PostgreSQL/18/select_nicks.sql b/src/core/SQL/PostgreSQL/19/select_nicks.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_nicks.sql rename to src/core/SQL/PostgreSQL/19/select_nicks.sql diff --git a/src/core/SQL/PostgreSQL/18/select_persistent_channels.sql b/src/core/SQL/PostgreSQL/19/select_persistent_channels.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_persistent_channels.sql rename to src/core/SQL/PostgreSQL/19/select_persistent_channels.sql diff --git a/src/core/SQL/PostgreSQL/18/select_senderid.sql b/src/core/SQL/PostgreSQL/19/select_senderid.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_senderid.sql rename to src/core/SQL/PostgreSQL/19/select_senderid.sql diff --git a/src/core/SQL/PostgreSQL/18/select_servers_for_network.sql b/src/core/SQL/PostgreSQL/19/select_servers_for_network.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_servers_for_network.sql rename to src/core/SQL/PostgreSQL/19/select_servers_for_network.sql diff --git a/src/core/SQL/PostgreSQL/18/select_user_setting.sql b/src/core/SQL/PostgreSQL/19/select_user_setting.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_user_setting.sql rename to src/core/SQL/PostgreSQL/19/select_user_setting.sql diff --git a/src/core/SQL/PostgreSQL/18/select_userid.sql b/src/core/SQL/PostgreSQL/19/select_userid.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/select_userid.sql rename to src/core/SQL/PostgreSQL/19/select_userid.sql diff --git a/src/core/SQL/PostgreSQL/18/setup_000_quasseluser.sql b/src/core/SQL/PostgreSQL/19/setup_000_quasseluser.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/setup_000_quasseluser.sql rename to src/core/SQL/PostgreSQL/19/setup_000_quasseluser.sql diff --git a/src/core/SQL/PostgreSQL/18/setup_010_sender.sql b/src/core/SQL/PostgreSQL/19/setup_010_sender.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/setup_010_sender.sql rename to src/core/SQL/PostgreSQL/19/setup_010_sender.sql diff --git a/src/core/SQL/PostgreSQL/18/setup_020_identity.sql b/src/core/SQL/PostgreSQL/19/setup_020_identity.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/setup_020_identity.sql rename to src/core/SQL/PostgreSQL/19/setup_020_identity.sql diff --git a/src/core/SQL/PostgreSQL/18/setup_030_identity_nick.sql b/src/core/SQL/PostgreSQL/19/setup_030_identity_nick.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/setup_030_identity_nick.sql rename to src/core/SQL/PostgreSQL/19/setup_030_identity_nick.sql diff --git a/src/core/SQL/PostgreSQL/18/setup_040_network.sql b/src/core/SQL/PostgreSQL/19/setup_040_network.sql similarity index 79% rename from src/core/SQL/PostgreSQL/18/setup_040_network.sql rename to src/core/SQL/PostgreSQL/19/setup_040_network.sql index 8515c95f..bc6815b3 100644 --- a/src/core/SQL/PostgreSQL/18/setup_040_network.sql +++ b/src/core/SQL/PostgreSQL/19/setup_040_network.sql @@ -24,5 +24,9 @@ CREATE TABLE network ( awaymessage varchar(256), -- away message to restore (empty if not away) attachperform text, -- perform list for on attach detachperform text, -- perform list for on detach + usecustomessagerate boolean NOT NULL DEFAULT FALSE, -- Custom rate limiting + messagerateburstsize INTEGER NOT NULL DEFAULT 5, -- Maximum messages at once + messageratedelay INTEGER NOT NULL DEFAULT 2200, -- Delay between future messages (milliseconds) + unlimitedmessagerate boolean NOT NULL DEFAULT FALSE, -- Disable rate limits UNIQUE (userid, networkname) ) diff --git a/src/core/SQL/PostgreSQL/18/setup_050_buffer.sql b/src/core/SQL/PostgreSQL/19/setup_050_buffer.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/setup_050_buffer.sql rename to src/core/SQL/PostgreSQL/19/setup_050_buffer.sql diff --git a/src/core/SQL/PostgreSQL/18/setup_060_backlog.sql b/src/core/SQL/PostgreSQL/19/setup_060_backlog.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/setup_060_backlog.sql rename to src/core/SQL/PostgreSQL/19/setup_060_backlog.sql diff --git a/src/core/SQL/PostgreSQL/18/setup_070_coreinfo.sql b/src/core/SQL/PostgreSQL/19/setup_070_coreinfo.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/setup_070_coreinfo.sql rename to src/core/SQL/PostgreSQL/19/setup_070_coreinfo.sql diff --git a/src/core/SQL/PostgreSQL/18/setup_080_ircservers.sql b/src/core/SQL/PostgreSQL/19/setup_080_ircservers.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/setup_080_ircservers.sql rename to src/core/SQL/PostgreSQL/19/setup_080_ircservers.sql diff --git a/src/core/SQL/PostgreSQL/18/setup_090_backlog_idx.sql b/src/core/SQL/PostgreSQL/19/setup_090_backlog_idx.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/setup_090_backlog_idx.sql rename to src/core/SQL/PostgreSQL/19/setup_090_backlog_idx.sql diff --git a/src/core/SQL/PostgreSQL/18/setup_100_user_setting.sql b/src/core/SQL/PostgreSQL/19/setup_100_user_setting.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/setup_100_user_setting.sql rename to src/core/SQL/PostgreSQL/19/setup_100_user_setting.sql diff --git a/src/core/SQL/PostgreSQL/18/setup_110_alter_sender_seq.sql b/src/core/SQL/PostgreSQL/19/setup_110_alter_sender_seq.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/setup_110_alter_sender_seq.sql rename to src/core/SQL/PostgreSQL/19/setup_110_alter_sender_seq.sql diff --git a/src/core/SQL/PostgreSQL/18/setup_120_alter_messageid_seq.sql b/src/core/SQL/PostgreSQL/19/setup_120_alter_messageid_seq.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/setup_120_alter_messageid_seq.sql rename to src/core/SQL/PostgreSQL/19/setup_120_alter_messageid_seq.sql diff --git a/src/core/SQL/PostgreSQL/18/update_backlog_bufferid.sql b/src/core/SQL/PostgreSQL/19/update_backlog_bufferid.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/update_backlog_bufferid.sql rename to src/core/SQL/PostgreSQL/19/update_backlog_bufferid.sql diff --git a/src/core/SQL/PostgreSQL/18/update_buffer_lastseen.sql b/src/core/SQL/PostgreSQL/19/update_buffer_lastseen.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/update_buffer_lastseen.sql rename to src/core/SQL/PostgreSQL/19/update_buffer_lastseen.sql diff --git a/src/core/SQL/PostgreSQL/18/update_buffer_markerlinemsgid.sql b/src/core/SQL/PostgreSQL/19/update_buffer_markerlinemsgid.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/update_buffer_markerlinemsgid.sql rename to src/core/SQL/PostgreSQL/19/update_buffer_markerlinemsgid.sql diff --git a/src/core/SQL/PostgreSQL/18/update_buffer_name.sql b/src/core/SQL/PostgreSQL/19/update_buffer_name.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/update_buffer_name.sql rename to src/core/SQL/PostgreSQL/19/update_buffer_name.sql diff --git a/src/core/SQL/PostgreSQL/18/update_buffer_persistent_channel.sql b/src/core/SQL/PostgreSQL/19/update_buffer_persistent_channel.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/update_buffer_persistent_channel.sql rename to src/core/SQL/PostgreSQL/19/update_buffer_persistent_channel.sql diff --git a/src/core/SQL/PostgreSQL/18/update_buffer_set_channel_key.sql b/src/core/SQL/PostgreSQL/19/update_buffer_set_channel_key.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/update_buffer_set_channel_key.sql rename to src/core/SQL/PostgreSQL/19/update_buffer_set_channel_key.sql diff --git a/src/core/SQL/PostgreSQL/18/update_identity.sql b/src/core/SQL/PostgreSQL/19/update_identity.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/update_identity.sql rename to src/core/SQL/PostgreSQL/19/update_identity.sql diff --git a/src/core/SQL/PostgreSQL/18/update_network.sql b/src/core/SQL/PostgreSQL/19/update_network.sql similarity index 79% rename from src/core/SQL/PostgreSQL/18/update_network.sql rename to src/core/SQL/PostgreSQL/19/update_network.sql index d2dea840..e087e557 100644 --- a/src/core/SQL/PostgreSQL/18/update_network.sql +++ b/src/core/SQL/PostgreSQL/19/update_network.sql @@ -13,6 +13,10 @@ useautoreconnect = :useautoreconnect, autoreconnectinterval = :autoreconnectinterval, autoreconnectretries = :autoreconnectretries, unlimitedconnectretries = :unlimitedconnectretries, +usecustomessagerate = :usecustomessagerate, +messagerateburstsize = :messagerateburstsize, +messageratedelay = :messageratedelay, +unlimitedmessagerate = :unlimitedmessagerate, rejoinchannels = :rejoinchannels, usesasl = :usesasl, saslaccount = :saslaccount, diff --git a/src/core/SQL/PostgreSQL/18/update_network_connected.sql b/src/core/SQL/PostgreSQL/19/update_network_connected.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/update_network_connected.sql rename to src/core/SQL/PostgreSQL/19/update_network_connected.sql diff --git a/src/core/SQL/PostgreSQL/18/update_network_set_awaymsg.sql b/src/core/SQL/PostgreSQL/19/update_network_set_awaymsg.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/update_network_set_awaymsg.sql rename to src/core/SQL/PostgreSQL/19/update_network_set_awaymsg.sql diff --git a/src/core/SQL/PostgreSQL/18/update_network_set_usermode.sql b/src/core/SQL/PostgreSQL/19/update_network_set_usermode.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/update_network_set_usermode.sql rename to src/core/SQL/PostgreSQL/19/update_network_set_usermode.sql diff --git a/src/core/SQL/PostgreSQL/18/update_user_setting.sql b/src/core/SQL/PostgreSQL/19/update_user_setting.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/update_user_setting.sql rename to src/core/SQL/PostgreSQL/19/update_user_setting.sql diff --git a/src/core/SQL/PostgreSQL/18/update_username.sql b/src/core/SQL/PostgreSQL/19/update_username.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/update_username.sql rename to src/core/SQL/PostgreSQL/19/update_username.sql diff --git a/src/core/SQL/PostgreSQL/18/update_userpassword.sql b/src/core/SQL/PostgreSQL/19/update_userpassword.sql similarity index 100% rename from src/core/SQL/PostgreSQL/18/update_userpassword.sql rename to src/core/SQL/PostgreSQL/19/update_userpassword.sql diff --git a/src/core/SQL/PostgreSQL/19/upgrade_000_alter_network_add_ratelimit_usecustom.sql b/src/core/SQL/PostgreSQL/19/upgrade_000_alter_network_add_ratelimit_usecustom.sql new file mode 100644 index 00000000..6b84d19f --- /dev/null +++ b/src/core/SQL/PostgreSQL/19/upgrade_000_alter_network_add_ratelimit_usecustom.sql @@ -0,0 +1 @@ +ALTER TABLE network ADD COLUMN usecustomessagerate boolean NOT NULL DEFAULT FALSE diff --git a/src/core/SQL/PostgreSQL/19/upgrade_001_alter_network_add_ratelimit_burstsize.sql b/src/core/SQL/PostgreSQL/19/upgrade_001_alter_network_add_ratelimit_burstsize.sql new file mode 100644 index 00000000..5ad4f7c0 --- /dev/null +++ b/src/core/SQL/PostgreSQL/19/upgrade_001_alter_network_add_ratelimit_burstsize.sql @@ -0,0 +1 @@ +ALTER TABLE network ADD COLUMN messagerateburstsize INTEGER NOT NULL DEFAULT 5 diff --git a/src/core/SQL/PostgreSQL/19/upgrade_002_alter_network_add_ratelimit_delay.sql b/src/core/SQL/PostgreSQL/19/upgrade_002_alter_network_add_ratelimit_delay.sql new file mode 100644 index 00000000..ea96477a --- /dev/null +++ b/src/core/SQL/PostgreSQL/19/upgrade_002_alter_network_add_ratelimit_delay.sql @@ -0,0 +1 @@ +ALTER TABLE network ADD COLUMN messageratedelay INTEGER NOT NULL DEFAULT 2200 diff --git a/src/core/SQL/PostgreSQL/19/upgrade_003_alter_network_add_ratelimit_unlimited.sql b/src/core/SQL/PostgreSQL/19/upgrade_003_alter_network_add_ratelimit_unlimited.sql new file mode 100644 index 00000000..fa943a18 --- /dev/null +++ b/src/core/SQL/PostgreSQL/19/upgrade_003_alter_network_add_ratelimit_unlimited.sql @@ -0,0 +1 @@ +ALTER TABLE network ADD COLUMN unlimitedmessagerate boolean NOT NULL DEFAULT FALSE diff --git a/src/core/SQL/SQLite/19/insert_network.sql b/src/core/SQL/SQLite/19/insert_network.sql deleted file mode 100644 index 4d9ff015..00000000 --- a/src/core/SQL/SQLite/19/insert_network.sql +++ /dev/null @@ -1,4 +0,0 @@ -INSERT INTO network (userid, networkname, identityid, servercodec, encodingcodec, decodingcodec, userandomserver, - perform, useautoidentify, autoidentifyservice, autoidentifypassword, useautoreconnect, autoreconnectinterval, autoreconnectretries, unlimitedconnectretries, rejoinchannels, usesasl, saslaccount, saslpassword) -VALUES (:userid, :networkname, :identityid, :servercodec, :encodingcodec, :decodingcodec, :userandomserver, - :perform, :useautoidentify, :autoidentifyservice, :autoidentifypassword, :useautoreconnect, :autoreconnectinterval, :autoreconnectretries, :unlimitedconnectretries, :rejoinchannels, :usesasl, :saslaccount, :saslpassword) diff --git a/src/core/SQL/SQLite/19/delete_backlog_by_uid.sql b/src/core/SQL/SQLite/20/delete_backlog_by_uid.sql similarity index 100% rename from src/core/SQL/SQLite/19/delete_backlog_by_uid.sql rename to src/core/SQL/SQLite/20/delete_backlog_by_uid.sql diff --git a/src/core/SQL/SQLite/19/delete_backlog_for_buffer.sql b/src/core/SQL/SQLite/20/delete_backlog_for_buffer.sql similarity index 100% rename from src/core/SQL/SQLite/19/delete_backlog_for_buffer.sql rename to src/core/SQL/SQLite/20/delete_backlog_for_buffer.sql diff --git a/src/core/SQL/SQLite/19/delete_backlog_for_network.sql b/src/core/SQL/SQLite/20/delete_backlog_for_network.sql similarity index 100% rename from src/core/SQL/SQLite/19/delete_backlog_for_network.sql rename to src/core/SQL/SQLite/20/delete_backlog_for_network.sql diff --git a/src/core/SQL/SQLite/19/delete_buffer_for_bufferid.sql b/src/core/SQL/SQLite/20/delete_buffer_for_bufferid.sql similarity index 100% rename from src/core/SQL/SQLite/19/delete_buffer_for_bufferid.sql rename to src/core/SQL/SQLite/20/delete_buffer_for_bufferid.sql diff --git a/src/core/SQL/SQLite/19/delete_buffers_by_uid.sql b/src/core/SQL/SQLite/20/delete_buffers_by_uid.sql similarity index 100% rename from src/core/SQL/SQLite/19/delete_buffers_by_uid.sql rename to src/core/SQL/SQLite/20/delete_buffers_by_uid.sql diff --git a/src/core/SQL/SQLite/19/delete_buffers_for_network.sql b/src/core/SQL/SQLite/20/delete_buffers_for_network.sql similarity index 100% rename from src/core/SQL/SQLite/19/delete_buffers_for_network.sql rename to src/core/SQL/SQLite/20/delete_buffers_for_network.sql diff --git a/src/core/SQL/SQLite/19/delete_identity.sql b/src/core/SQL/SQLite/20/delete_identity.sql similarity index 100% rename from src/core/SQL/SQLite/19/delete_identity.sql rename to src/core/SQL/SQLite/20/delete_identity.sql diff --git a/src/core/SQL/SQLite/19/delete_ircservers_for_network.sql b/src/core/SQL/SQLite/20/delete_ircservers_for_network.sql similarity index 100% rename from src/core/SQL/SQLite/19/delete_ircservers_for_network.sql rename to src/core/SQL/SQLite/20/delete_ircservers_for_network.sql diff --git a/src/core/SQL/SQLite/19/delete_network.sql b/src/core/SQL/SQLite/20/delete_network.sql similarity index 100% rename from src/core/SQL/SQLite/19/delete_network.sql rename to src/core/SQL/SQLite/20/delete_network.sql diff --git a/src/core/SQL/SQLite/19/delete_networks_by_uid.sql b/src/core/SQL/SQLite/20/delete_networks_by_uid.sql similarity index 100% rename from src/core/SQL/SQLite/19/delete_networks_by_uid.sql rename to src/core/SQL/SQLite/20/delete_networks_by_uid.sql diff --git a/src/core/SQL/SQLite/19/delete_nicks.sql b/src/core/SQL/SQLite/20/delete_nicks.sql similarity index 100% rename from src/core/SQL/SQLite/19/delete_nicks.sql rename to src/core/SQL/SQLite/20/delete_nicks.sql diff --git a/src/core/SQL/SQLite/19/delete_quasseluser.sql b/src/core/SQL/SQLite/20/delete_quasseluser.sql similarity index 100% rename from src/core/SQL/SQLite/19/delete_quasseluser.sql rename to src/core/SQL/SQLite/20/delete_quasseluser.sql diff --git a/src/core/SQL/SQLite/19/insert_buffer.sql b/src/core/SQL/SQLite/20/insert_buffer.sql similarity index 100% rename from src/core/SQL/SQLite/19/insert_buffer.sql rename to src/core/SQL/SQLite/20/insert_buffer.sql diff --git a/src/core/SQL/SQLite/19/insert_identity.sql b/src/core/SQL/SQLite/20/insert_identity.sql similarity index 100% rename from src/core/SQL/SQLite/19/insert_identity.sql rename to src/core/SQL/SQLite/20/insert_identity.sql diff --git a/src/core/SQL/SQLite/19/insert_message.sql b/src/core/SQL/SQLite/20/insert_message.sql similarity index 100% rename from src/core/SQL/SQLite/19/insert_message.sql rename to src/core/SQL/SQLite/20/insert_message.sql diff --git a/src/core/SQL/SQLite/20/insert_network.sql b/src/core/SQL/SQLite/20/insert_network.sql new file mode 100644 index 00000000..ec5a212c --- /dev/null +++ b/src/core/SQL/SQLite/20/insert_network.sql @@ -0,0 +1,11 @@ +INSERT INTO network (userid, networkname, identityid, servercodec, encodingcodec, decodingcodec, + userandomserver, perform, useautoidentify, autoidentifyservice, + autoidentifypassword, useautoreconnect, autoreconnectinterval, + autoreconnectretries, unlimitedconnectretries, rejoinchannels, usesasl, + saslaccount, saslpassword, usecustomessagerate, messagerateburstsize, + messageratedelay, unlimitedmessagerate) +VALUES (:userid, :networkname, :identityid, :servercodec, :encodingcodec, :decodingcodec, + :userandomserver, :perform, :useautoidentify, :autoidentifyservice, :autoidentifypassword, + :useautoreconnect, :autoreconnectinterval, :autoreconnectretries, :unlimitedconnectretries, + :rejoinchannels, :usesasl, :saslaccount, :saslpassword, :usecustomessagerate, + :messagerateburstsize, :messageratedelay, :unlimitedmessagerate) diff --git a/src/core/SQL/SQLite/19/insert_nick.sql b/src/core/SQL/SQLite/20/insert_nick.sql similarity index 100% rename from src/core/SQL/SQLite/19/insert_nick.sql rename to src/core/SQL/SQLite/20/insert_nick.sql diff --git a/src/core/SQL/SQLite/19/insert_quasseluser.sql b/src/core/SQL/SQLite/20/insert_quasseluser.sql similarity index 100% rename from src/core/SQL/SQLite/19/insert_quasseluser.sql rename to src/core/SQL/SQLite/20/insert_quasseluser.sql diff --git a/src/core/SQL/SQLite/19/insert_sender.sql b/src/core/SQL/SQLite/20/insert_sender.sql similarity index 100% rename from src/core/SQL/SQLite/19/insert_sender.sql rename to src/core/SQL/SQLite/20/insert_sender.sql diff --git a/src/core/SQL/SQLite/19/insert_server.sql b/src/core/SQL/SQLite/20/insert_server.sql similarity index 100% rename from src/core/SQL/SQLite/19/insert_server.sql rename to src/core/SQL/SQLite/20/insert_server.sql diff --git a/src/core/SQL/SQLite/19/insert_user_setting.sql b/src/core/SQL/SQLite/20/insert_user_setting.sql similarity index 100% rename from src/core/SQL/SQLite/19/insert_user_setting.sql rename to src/core/SQL/SQLite/20/insert_user_setting.sql diff --git a/src/core/SQL/SQLite/19/migrate_read_backlog.sql b/src/core/SQL/SQLite/20/migrate_read_backlog.sql similarity index 100% rename from src/core/SQL/SQLite/19/migrate_read_backlog.sql rename to src/core/SQL/SQLite/20/migrate_read_backlog.sql diff --git a/src/core/SQL/SQLite/19/migrate_read_buffer.sql b/src/core/SQL/SQLite/20/migrate_read_buffer.sql similarity index 100% rename from src/core/SQL/SQLite/19/migrate_read_buffer.sql rename to src/core/SQL/SQLite/20/migrate_read_buffer.sql diff --git a/src/core/SQL/SQLite/19/migrate_read_identity.sql b/src/core/SQL/SQLite/20/migrate_read_identity.sql similarity index 100% rename from src/core/SQL/SQLite/19/migrate_read_identity.sql rename to src/core/SQL/SQLite/20/migrate_read_identity.sql diff --git a/src/core/SQL/SQLite/19/migrate_read_identity_nick.sql b/src/core/SQL/SQLite/20/migrate_read_identity_nick.sql similarity index 100% rename from src/core/SQL/SQLite/19/migrate_read_identity_nick.sql rename to src/core/SQL/SQLite/20/migrate_read_identity_nick.sql diff --git a/src/core/SQL/SQLite/19/migrate_read_ircserver.sql b/src/core/SQL/SQLite/20/migrate_read_ircserver.sql similarity index 100% rename from src/core/SQL/SQLite/19/migrate_read_ircserver.sql rename to src/core/SQL/SQLite/20/migrate_read_ircserver.sql diff --git a/src/core/SQL/SQLite/19/migrate_read_network.sql b/src/core/SQL/SQLite/20/migrate_read_network.sql similarity index 74% rename from src/core/SQL/SQLite/19/migrate_read_network.sql rename to src/core/SQL/SQLite/20/migrate_read_network.sql index 52cdc67b..cccaed9c 100644 --- a/src/core/SQL/SQLite/19/migrate_read_network.sql +++ b/src/core/SQL/SQLite/20/migrate_read_network.sql @@ -2,5 +2,6 @@ SELECT networkid, userid, networkname, identityid, encodingcodec, decodingcodec, userandomserver, perform, useautoidentify, autoidentifyservice, autoidentifypassword, useautoreconnect, autoreconnectinterval, autoreconnectretries, unlimitedconnectretries, rejoinchannels, connected, usermode, awaymessage, attachperform, detachperform, - usesasl, saslaccount, saslpassword + usesasl, saslaccount, saslpassword, usecustomessagerate, messagerateburstsize, + messageratedelay, unlimitedmessagerate FROM network diff --git a/src/core/SQL/SQLite/19/migrate_read_quasseluser.sql b/src/core/SQL/SQLite/20/migrate_read_quasseluser.sql similarity index 100% rename from src/core/SQL/SQLite/19/migrate_read_quasseluser.sql rename to src/core/SQL/SQLite/20/migrate_read_quasseluser.sql diff --git a/src/core/SQL/SQLite/19/migrate_read_sender.sql b/src/core/SQL/SQLite/20/migrate_read_sender.sql similarity index 100% rename from src/core/SQL/SQLite/19/migrate_read_sender.sql rename to src/core/SQL/SQLite/20/migrate_read_sender.sql diff --git a/src/core/SQL/SQLite/19/migrate_read_usersetting.sql b/src/core/SQL/SQLite/20/migrate_read_usersetting.sql similarity index 100% rename from src/core/SQL/SQLite/19/migrate_read_usersetting.sql rename to src/core/SQL/SQLite/20/migrate_read_usersetting.sql diff --git a/src/core/SQL/SQLite/19/select_authuser.sql b/src/core/SQL/SQLite/20/select_authuser.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_authuser.sql rename to src/core/SQL/SQLite/20/select_authuser.sql diff --git a/src/core/SQL/SQLite/19/select_bufferByName.sql b/src/core/SQL/SQLite/20/select_bufferByName.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_bufferByName.sql rename to src/core/SQL/SQLite/20/select_bufferByName.sql diff --git a/src/core/SQL/SQLite/19/select_bufferExists.sql b/src/core/SQL/SQLite/20/select_bufferExists.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_bufferExists.sql rename to src/core/SQL/SQLite/20/select_bufferExists.sql diff --git a/src/core/SQL/SQLite/19/select_buffer_by_id.sql b/src/core/SQL/SQLite/20/select_buffer_by_id.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_buffer_by_id.sql rename to src/core/SQL/SQLite/20/select_buffer_by_id.sql diff --git a/src/core/SQL/SQLite/19/select_buffer_lastseen_messages.sql b/src/core/SQL/SQLite/20/select_buffer_lastseen_messages.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_buffer_lastseen_messages.sql rename to src/core/SQL/SQLite/20/select_buffer_lastseen_messages.sql diff --git a/src/core/SQL/SQLite/19/select_buffer_markerlinemsgids.sql b/src/core/SQL/SQLite/20/select_buffer_markerlinemsgids.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_buffer_markerlinemsgids.sql rename to src/core/SQL/SQLite/20/select_buffer_markerlinemsgids.sql diff --git a/src/core/SQL/SQLite/19/select_buffers.sql b/src/core/SQL/SQLite/20/select_buffers.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_buffers.sql rename to src/core/SQL/SQLite/20/select_buffers.sql diff --git a/src/core/SQL/SQLite/19/select_buffers_for_merge.sql b/src/core/SQL/SQLite/20/select_buffers_for_merge.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_buffers_for_merge.sql rename to src/core/SQL/SQLite/20/select_buffers_for_merge.sql diff --git a/src/core/SQL/SQLite/19/select_buffers_for_network.sql b/src/core/SQL/SQLite/20/select_buffers_for_network.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_buffers_for_network.sql rename to src/core/SQL/SQLite/20/select_buffers_for_network.sql diff --git a/src/core/SQL/SQLite/19/select_checkidentity.sql b/src/core/SQL/SQLite/20/select_checkidentity.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_checkidentity.sql rename to src/core/SQL/SQLite/20/select_checkidentity.sql diff --git a/src/core/SQL/SQLite/19/select_connected_networks.sql b/src/core/SQL/SQLite/20/select_connected_networks.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_connected_networks.sql rename to src/core/SQL/SQLite/20/select_connected_networks.sql diff --git a/src/core/SQL/SQLite/19/select_identities.sql b/src/core/SQL/SQLite/20/select_identities.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_identities.sql rename to src/core/SQL/SQLite/20/select_identities.sql diff --git a/src/core/SQL/SQLite/19/select_internaluser.sql b/src/core/SQL/SQLite/20/select_internaluser.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_internaluser.sql rename to src/core/SQL/SQLite/20/select_internaluser.sql diff --git a/src/core/SQL/SQLite/19/select_messages.sql b/src/core/SQL/SQLite/20/select_messages.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_messages.sql rename to src/core/SQL/SQLite/20/select_messages.sql diff --git a/src/core/SQL/SQLite/19/select_messagesAll.sql b/src/core/SQL/SQLite/20/select_messagesAll.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_messagesAll.sql rename to src/core/SQL/SQLite/20/select_messagesAll.sql diff --git a/src/core/SQL/SQLite/19/select_messagesAllNew.sql b/src/core/SQL/SQLite/20/select_messagesAllNew.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_messagesAllNew.sql rename to src/core/SQL/SQLite/20/select_messagesAllNew.sql diff --git a/src/core/SQL/SQLite/19/select_messagesNewerThan.sql b/src/core/SQL/SQLite/20/select_messagesNewerThan.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_messagesNewerThan.sql rename to src/core/SQL/SQLite/20/select_messagesNewerThan.sql diff --git a/src/core/SQL/SQLite/19/select_messagesNewestK.sql b/src/core/SQL/SQLite/20/select_messagesNewestK.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_messagesNewestK.sql rename to src/core/SQL/SQLite/20/select_messagesNewestK.sql diff --git a/src/core/SQL/SQLite/19/select_networkExists.sql b/src/core/SQL/SQLite/20/select_networkExists.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_networkExists.sql rename to src/core/SQL/SQLite/20/select_networkExists.sql diff --git a/src/core/SQL/SQLite/19/select_network_awaymsg.sql b/src/core/SQL/SQLite/20/select_network_awaymsg.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_network_awaymsg.sql rename to src/core/SQL/SQLite/20/select_network_awaymsg.sql diff --git a/src/core/SQL/SQLite/19/select_network_usermode.sql b/src/core/SQL/SQLite/20/select_network_usermode.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_network_usermode.sql rename to src/core/SQL/SQLite/20/select_network_usermode.sql diff --git a/src/core/SQL/PostgreSQL/18/select_networks_for_user.sql b/src/core/SQL/SQLite/20/select_networks_for_user.sql similarity index 60% rename from src/core/SQL/PostgreSQL/18/select_networks_for_user.sql rename to src/core/SQL/SQLite/20/select_networks_for_user.sql index 9bef4054..a5395dc7 100644 --- a/src/core/SQL/PostgreSQL/18/select_networks_for_user.sql +++ b/src/core/SQL/SQLite/20/select_networks_for_user.sql @@ -1,6 +1,7 @@ SELECT networkid, networkname, identityid, servercodec, encodingcodec, decodingcodec, userandomserver, perform, useautoidentify, autoidentifyservice, autoidentifypassword, - useautoreconnect, autoreconnectinterval, autoreconnectretries, unlimitedconnectretries, rejoinchannels, - usesasl, saslaccount, saslpassword + useautoreconnect, autoreconnectinterval, autoreconnectretries, unlimitedconnectretries, + rejoinchannels, usesasl, saslaccount, saslpassword, usecustomessagerate, + messagerateburstsize, messageratedelay, unlimitedmessagerate FROM network WHERE userid = :userid diff --git a/src/core/SQL/SQLite/19/select_nicks.sql b/src/core/SQL/SQLite/20/select_nicks.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_nicks.sql rename to src/core/SQL/SQLite/20/select_nicks.sql diff --git a/src/core/SQL/SQLite/19/select_persistent_channels.sql b/src/core/SQL/SQLite/20/select_persistent_channels.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_persistent_channels.sql rename to src/core/SQL/SQLite/20/select_persistent_channels.sql diff --git a/src/core/SQL/SQLite/19/select_servers_for_network.sql b/src/core/SQL/SQLite/20/select_servers_for_network.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_servers_for_network.sql rename to src/core/SQL/SQLite/20/select_servers_for_network.sql diff --git a/src/core/SQL/SQLite/19/select_user_setting.sql b/src/core/SQL/SQLite/20/select_user_setting.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_user_setting.sql rename to src/core/SQL/SQLite/20/select_user_setting.sql diff --git a/src/core/SQL/SQLite/19/select_userid.sql b/src/core/SQL/SQLite/20/select_userid.sql similarity index 100% rename from src/core/SQL/SQLite/19/select_userid.sql rename to src/core/SQL/SQLite/20/select_userid.sql diff --git a/src/core/SQL/SQLite/19/setup_000_quasseluser.sql b/src/core/SQL/SQLite/20/setup_000_quasseluser.sql similarity index 100% rename from src/core/SQL/SQLite/19/setup_000_quasseluser.sql rename to src/core/SQL/SQLite/20/setup_000_quasseluser.sql diff --git a/src/core/SQL/SQLite/19/setup_010_sender.sql b/src/core/SQL/SQLite/20/setup_010_sender.sql similarity index 100% rename from src/core/SQL/SQLite/19/setup_010_sender.sql rename to src/core/SQL/SQLite/20/setup_010_sender.sql diff --git a/src/core/SQL/SQLite/19/setup_020_network.sql b/src/core/SQL/SQLite/20/setup_020_network.sql similarity index 78% rename from src/core/SQL/SQLite/19/setup_020_network.sql rename to src/core/SQL/SQLite/20/setup_020_network.sql index efa1f8d1..60417a73 100644 --- a/src/core/SQL/SQLite/19/setup_020_network.sql +++ b/src/core/SQL/SQLite/20/setup_020_network.sql @@ -24,5 +24,9 @@ CREATE TABLE network ( awaymessage TEXT, -- away message to restore (empty if not away) attachperform TEXT, -- perform list for on attach detachperform TEXT, -- perform list for on detach + usecustomessagerate INTEGER NOT NULL DEFAULT 0, -- BOOL - Custom rate limiting + messagerateburstsize INTEGER NOT NULL DEFAULT 5, -- Maximum messages at once + messageratedelay INTEGER NOT NULL DEFAULT 2200, -- Delay between future messages (milliseconds) + unlimitedmessagerate INTEGER NOT NULL DEFAULT 0, -- BOOL - Disable rate limits UNIQUE (userid, networkname) ) diff --git a/src/core/SQL/SQLite/19/setup_030_buffer.sql b/src/core/SQL/SQLite/20/setup_030_buffer.sql similarity index 100% rename from src/core/SQL/SQLite/19/setup_030_buffer.sql rename to src/core/SQL/SQLite/20/setup_030_buffer.sql diff --git a/src/core/SQL/SQLite/19/setup_040_buffer_idx.sql b/src/core/SQL/SQLite/20/setup_040_buffer_idx.sql similarity index 100% rename from src/core/SQL/SQLite/19/setup_040_buffer_idx.sql rename to src/core/SQL/SQLite/20/setup_040_buffer_idx.sql diff --git a/src/core/SQL/SQLite/19/setup_050_buffer_cname_idx.sql b/src/core/SQL/SQLite/20/setup_050_buffer_cname_idx.sql similarity index 100% rename from src/core/SQL/SQLite/19/setup_050_buffer_cname_idx.sql rename to src/core/SQL/SQLite/20/setup_050_buffer_cname_idx.sql diff --git a/src/core/SQL/SQLite/19/setup_060_backlog.sql b/src/core/SQL/SQLite/20/setup_060_backlog.sql similarity index 100% rename from src/core/SQL/SQLite/19/setup_060_backlog.sql rename to src/core/SQL/SQLite/20/setup_060_backlog.sql diff --git a/src/core/SQL/SQLite/19/setup_070_coreinfo.sql b/src/core/SQL/SQLite/20/setup_070_coreinfo.sql similarity index 100% rename from src/core/SQL/SQLite/19/setup_070_coreinfo.sql rename to src/core/SQL/SQLite/20/setup_070_coreinfo.sql diff --git a/src/core/SQL/SQLite/19/setup_080_ircservers.sql b/src/core/SQL/SQLite/20/setup_080_ircservers.sql similarity index 100% rename from src/core/SQL/SQLite/19/setup_080_ircservers.sql rename to src/core/SQL/SQLite/20/setup_080_ircservers.sql diff --git a/src/core/SQL/SQLite/19/setup_090_backlog_idx.sql b/src/core/SQL/SQLite/20/setup_090_backlog_idx.sql similarity index 100% rename from src/core/SQL/SQLite/19/setup_090_backlog_idx.sql rename to src/core/SQL/SQLite/20/setup_090_backlog_idx.sql diff --git a/src/core/SQL/SQLite/19/setup_100_backlog_idx2.sql b/src/core/SQL/SQLite/20/setup_100_backlog_idx2.sql similarity index 100% rename from src/core/SQL/SQLite/19/setup_100_backlog_idx2.sql rename to src/core/SQL/SQLite/20/setup_100_backlog_idx2.sql diff --git a/src/core/SQL/SQLite/19/setup_110_buffer_user_idx.sql b/src/core/SQL/SQLite/20/setup_110_buffer_user_idx.sql similarity index 100% rename from src/core/SQL/SQLite/19/setup_110_buffer_user_idx.sql rename to src/core/SQL/SQLite/20/setup_110_buffer_user_idx.sql diff --git a/src/core/SQL/SQLite/19/setup_120_user_setting.sql b/src/core/SQL/SQLite/20/setup_120_user_setting.sql similarity index 100% rename from src/core/SQL/SQLite/19/setup_120_user_setting.sql rename to src/core/SQL/SQLite/20/setup_120_user_setting.sql diff --git a/src/core/SQL/SQLite/19/setup_130_identity.sql b/src/core/SQL/SQLite/20/setup_130_identity.sql similarity index 100% rename from src/core/SQL/SQLite/19/setup_130_identity.sql rename to src/core/SQL/SQLite/20/setup_130_identity.sql diff --git a/src/core/SQL/SQLite/19/setup_140_identity_nick.sql b/src/core/SQL/SQLite/20/setup_140_identity_nick.sql similarity index 100% rename from src/core/SQL/SQLite/19/setup_140_identity_nick.sql rename to src/core/SQL/SQLite/20/setup_140_identity_nick.sql diff --git a/src/core/SQL/SQLite/19/update_backlog_bufferid.sql b/src/core/SQL/SQLite/20/update_backlog_bufferid.sql similarity index 100% rename from src/core/SQL/SQLite/19/update_backlog_bufferid.sql rename to src/core/SQL/SQLite/20/update_backlog_bufferid.sql diff --git a/src/core/SQL/SQLite/19/update_buffer_lastseen.sql b/src/core/SQL/SQLite/20/update_buffer_lastseen.sql similarity index 100% rename from src/core/SQL/SQLite/19/update_buffer_lastseen.sql rename to src/core/SQL/SQLite/20/update_buffer_lastseen.sql diff --git a/src/core/SQL/SQLite/19/update_buffer_markerlinemsgid.sql b/src/core/SQL/SQLite/20/update_buffer_markerlinemsgid.sql similarity index 100% rename from src/core/SQL/SQLite/19/update_buffer_markerlinemsgid.sql rename to src/core/SQL/SQLite/20/update_buffer_markerlinemsgid.sql diff --git a/src/core/SQL/SQLite/19/update_buffer_name.sql b/src/core/SQL/SQLite/20/update_buffer_name.sql similarity index 100% rename from src/core/SQL/SQLite/19/update_buffer_name.sql rename to src/core/SQL/SQLite/20/update_buffer_name.sql diff --git a/src/core/SQL/SQLite/19/update_buffer_persistent_channel.sql b/src/core/SQL/SQLite/20/update_buffer_persistent_channel.sql similarity index 100% rename from src/core/SQL/SQLite/19/update_buffer_persistent_channel.sql rename to src/core/SQL/SQLite/20/update_buffer_persistent_channel.sql diff --git a/src/core/SQL/SQLite/19/update_buffer_set_channel_key.sql b/src/core/SQL/SQLite/20/update_buffer_set_channel_key.sql similarity index 100% rename from src/core/SQL/SQLite/19/update_buffer_set_channel_key.sql rename to src/core/SQL/SQLite/20/update_buffer_set_channel_key.sql diff --git a/src/core/SQL/SQLite/19/update_identity.sql b/src/core/SQL/SQLite/20/update_identity.sql similarity index 100% rename from src/core/SQL/SQLite/19/update_identity.sql rename to src/core/SQL/SQLite/20/update_identity.sql diff --git a/src/core/SQL/SQLite/19/update_network.sql b/src/core/SQL/SQLite/20/update_network.sql similarity index 79% rename from src/core/SQL/SQLite/19/update_network.sql rename to src/core/SQL/SQLite/20/update_network.sql index 84c81959..00e9f83e 100644 --- a/src/core/SQL/SQLite/19/update_network.sql +++ b/src/core/SQL/SQLite/20/update_network.sql @@ -14,6 +14,10 @@ autoreconnectinterval = :autoreconnectinterval, autoreconnectretries = :autoreconnectretries, unlimitedconnectretries = :unlimitedconnectretries, rejoinchannels = :rejoinchannels, +usecustomessagerate = :usecustomessagerate, +messagerateburstsize = :messagerateburstsize, +messageratedelay = :messageratedelay, +unlimitedmessagerate = :unlimitedmessagerate, usesasl = :usesasl, saslaccount = :saslaccount, saslpassword = :saslpassword diff --git a/src/core/SQL/SQLite/19/update_network_connected.sql b/src/core/SQL/SQLite/20/update_network_connected.sql similarity index 100% rename from src/core/SQL/SQLite/19/update_network_connected.sql rename to src/core/SQL/SQLite/20/update_network_connected.sql diff --git a/src/core/SQL/SQLite/19/update_network_set_awaymsg.sql b/src/core/SQL/SQLite/20/update_network_set_awaymsg.sql similarity index 100% rename from src/core/SQL/SQLite/19/update_network_set_awaymsg.sql rename to src/core/SQL/SQLite/20/update_network_set_awaymsg.sql diff --git a/src/core/SQL/SQLite/19/update_network_set_usermode.sql b/src/core/SQL/SQLite/20/update_network_set_usermode.sql similarity index 100% rename from src/core/SQL/SQLite/19/update_network_set_usermode.sql rename to src/core/SQL/SQLite/20/update_network_set_usermode.sql diff --git a/src/core/SQL/SQLite/19/update_user_setting.sql b/src/core/SQL/SQLite/20/update_user_setting.sql similarity index 100% rename from src/core/SQL/SQLite/19/update_user_setting.sql rename to src/core/SQL/SQLite/20/update_user_setting.sql diff --git a/src/core/SQL/SQLite/19/update_username.sql b/src/core/SQL/SQLite/20/update_username.sql similarity index 100% rename from src/core/SQL/SQLite/19/update_username.sql rename to src/core/SQL/SQLite/20/update_username.sql diff --git a/src/core/SQL/SQLite/19/update_userpassword.sql b/src/core/SQL/SQLite/20/update_userpassword.sql similarity index 100% rename from src/core/SQL/SQLite/19/update_userpassword.sql rename to src/core/SQL/SQLite/20/update_userpassword.sql diff --git a/src/core/SQL/SQLite/20/upgrade_000_alter_network_add_ratelimit_usecustom.sql b/src/core/SQL/SQLite/20/upgrade_000_alter_network_add_ratelimit_usecustom.sql new file mode 100644 index 00000000..6cde931c --- /dev/null +++ b/src/core/SQL/SQLite/20/upgrade_000_alter_network_add_ratelimit_usecustom.sql @@ -0,0 +1 @@ +ALTER TABLE network ADD COLUMN usecustomessagerate INTEGER NOT NULL DEFAULT 0 diff --git a/src/core/SQL/SQLite/20/upgrade_001_alter_network_add_ratelimit_burstsize.sql b/src/core/SQL/SQLite/20/upgrade_001_alter_network_add_ratelimit_burstsize.sql new file mode 100644 index 00000000..5ad4f7c0 --- /dev/null +++ b/src/core/SQL/SQLite/20/upgrade_001_alter_network_add_ratelimit_burstsize.sql @@ -0,0 +1 @@ +ALTER TABLE network ADD COLUMN messagerateburstsize INTEGER NOT NULL DEFAULT 5 diff --git a/src/core/SQL/SQLite/20/upgrade_002_alter_network_add_ratelimit_delay.sql b/src/core/SQL/SQLite/20/upgrade_002_alter_network_add_ratelimit_delay.sql new file mode 100644 index 00000000..ea96477a --- /dev/null +++ b/src/core/SQL/SQLite/20/upgrade_002_alter_network_add_ratelimit_delay.sql @@ -0,0 +1 @@ +ALTER TABLE network ADD COLUMN messageratedelay INTEGER NOT NULL DEFAULT 2200 diff --git a/src/core/SQL/SQLite/20/upgrade_003_alter_network_add_ratelimit_unlimited.sql b/src/core/SQL/SQLite/20/upgrade_003_alter_network_add_ratelimit_unlimited.sql new file mode 100644 index 00000000..4380e45f --- /dev/null +++ b/src/core/SQL/SQLite/20/upgrade_003_alter_network_add_ratelimit_unlimited.sql @@ -0,0 +1 @@ +ALTER TABLE network ADD COLUMN unlimitedmessagerate INTEGER NOT NULL DEFAULT 0 diff --git a/src/core/abstractsqlstorage.h b/src/core/abstractsqlstorage.h index 06d19b71..0ae14046 100644 --- a/src/core/abstractsqlstorage.h +++ b/src/core/abstractsqlstorage.h @@ -188,6 +188,12 @@ public: int autoreconnectretries; bool unlimitedconnectretries; bool rejoinchannels; + // Custom rate limiting + bool usecustommessagerate; + int messagerateburstsize; + int messageratedelay; + bool unlimitedmessagerate; + // ... bool connected; QString usermode; QString awaymessage; diff --git a/src/core/corenetwork.cpp b/src/core/corenetwork.cpp index 76f430cb..6f2c285f 100644 --- a/src/core/corenetwork.cpp +++ b/src/core/corenetwork.cpp @@ -72,7 +72,7 @@ CoreNetwork::CoreNetwork(const NetworkId &networkid, CoreSession *session) connect(&_autoReconnectTimer, SIGNAL(timeout()), this, SLOT(doAutoReconnect())); connect(&_autoWhoTimer, SIGNAL(timeout()), this, SLOT(sendAutoWho())); connect(&_autoWhoCycleTimer, SIGNAL(timeout()), this, SLOT(startAutoWhoCycle())); - connect(&_tokenBucketTimer, SIGNAL(timeout()), this, SLOT(fillBucketAndProcessQueue())); + connect(&_tokenBucketTimer, SIGNAL(timeout()), this, SLOT(checkTokenBucket())); connect(&socket, SIGNAL(connected()), this, SLOT(socketInitialized())); connect(&socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketError(QAbstractSocket::SocketError))); @@ -84,6 +84,13 @@ CoreNetwork::CoreNetwork(const NetworkId &networkid, CoreSession *session) #endif connect(this, SIGNAL(newEvent(Event *)), coreSession()->eventManager(), SLOT(postEvent(Event *))); + // Custom rate limiting + // These react to the user changing settings in the client + connect(this, SIGNAL(useCustomMessageRateSet(bool)), SLOT(updateRateLimiting())); + connect(this, SIGNAL(messageRateBurstSizeSet(quint32)), SLOT(updateRateLimiting())); + connect(this, SIGNAL(messageRateDelaySet(quint32)), SLOT(updateRateLimiting())); + connect(this, SIGNAL(unlimitedMessageRateSet(bool)), SLOT(updateRateLimiting())); + // IRCv3 capability handling // These react to CAP messages from the server connect(this, SIGNAL(capAdded(QString)), this, SLOT(serverCapAdded(QString))); @@ -301,12 +308,18 @@ void CoreNetwork::userInput(BufferInfo buf, QString msg) void CoreNetwork::putRawLine(const QByteArray s, const bool prepend) { - if (_tokenBucket > 0) { + if (_tokenBucket > 0 || (_skipMessageRates && _msgQueue.size() == 0)) { + // If there's tokens remaining, ... + // Or rate limits don't apply AND no messages are in queue (to prevent out-of-order), ... + // Send the message now. writeToSocket(s); } else { + // Otherwise, queue the message for later if (prepend) { + // Jump to the start, skipping other messages _msgQueue.prepend(s); } else { + // Add to back, waiting in order _msgQueue.append(s); } } @@ -529,11 +542,10 @@ void CoreNetwork::socketInitialized() socket.setSocketOption(QAbstractSocket::KeepAliveOption, true); - // TokenBucket to avoid sending too much at once - _messageDelay = 2200; // this seems to be a safe value (2.2 seconds delay) - _burstSize = 5; - _tokenBucket = _burstSize; // init with a full bucket - _tokenBucketTimer.start(_messageDelay); + // Update the TokenBucket with specified rate-limiting settings + updateRateLimiting(); + // Fill up the token bucket as we're connecting from scratch + resetTokenBucket(); // Request capabilities as per IRCv3.2 specifications // Older servers should ignore this; newer servers won't downgrade to RFC1459 @@ -916,6 +928,85 @@ void CoreNetwork::setPingInterval(int interval) _pingTimer.setInterval(interval * 1000); } + +/******** Custom Rate Limiting ********/ + +void CoreNetwork::updateRateLimiting() +{ + // Always reset the delay and token bucket (safe-guard against accidentally starting the timer) + + if (useCustomMessageRate()) { + // Custom message rates enabled. Let's go for it! + + _messageDelay = messageRateDelay(); + + _burstSize = messageRateBurstSize(); + if (_burstSize < 1) { + qWarning() << "Invalid messageRateBurstSize data, cannot have zero message burst size!" + << _burstSize; + // Can't go slower than one message at a time + _burstSize = 1; + } + + if (_tokenBucket > _burstSize) { + // Don't let the token bucket exceed the maximum + _tokenBucket = _burstSize; + // To fill up the token bucket, use resetRateLimiting(). Don't do that here, otherwise + // changing the rate-limit settings while connected to a server will incorrectly reset + // the token bucket. + } + + // Toggle the timer according to whether or not rate limiting is enabled + // If we're here, useCustomMessageRate is true. Thus, the logic becomes + // _skipMessageRates = (useCustomMessageRate && unlimitedMessageRate) + _skipMessageRates = unlimitedMessageRate(); + if (_skipMessageRates) { + // If the message queue already contains messages, they need sent before disabling the + // timer. Set the timer to a rapid pace and let it disable itself. + if (_msgQueue.size() > 0) { + qDebug() << "Outgoing message queue contains messages while disabling rate " + "limiting. Sending remaining queued messages..."; + // Promptly run the timer again to clear the messages. Rate limiting is disabled, + // so nothing should cause this to block.. in theory. However, don't directly call + // fillBucketAndProcessQueue() in order to keep it on a separate thread. + // + // TODO If testing shows this isn't needed, it can be simplified to a direct call. + // Hesitant to change it without a wide variety of situations to verify behavior. + _tokenBucketTimer.start(100); + } else { + // No rate limiting, disable the timer + _tokenBucketTimer.stop(); + } + } else { + // Rate limiting enabled, enable the timer + _tokenBucketTimer.start(_messageDelay); + } + } else { + // Custom message rates disabled. Go for the default. + + _skipMessageRates = false; // Enable rate-limiting by default + // TokenBucket to avoid sending too much at once + _messageDelay = 2200; // This seems to be a safe value (2.2 seconds delay) + _burstSize = 5; // 5 messages at once + if (_tokenBucket > _burstSize) { + // Don't let the token bucket exceed the maximum + _tokenBucket = _burstSize; + // To fill up the token bucket, use resetRateLimiting(). Don't do that here, otherwise + // changing the rate-limit settings while connected to a server will incorrectly reset + // the token bucket. + } + // Rate limiting enabled, enable the timer + _tokenBucketTimer.start(_messageDelay); + } +} + +void CoreNetwork::resetTokenBucket() +{ + // Fill up the token bucket to the maximum + _tokenBucket = _burstSize; +} + + /******** IRCv3 Capability Negotiation ********/ void CoreNetwork::serverCapAdded(const QString &capability) @@ -1274,12 +1365,30 @@ void CoreNetwork::sslErrors(const QList &sslErrors) #endif // HAVE_SSL +void CoreNetwork::checkTokenBucket() +{ + if (_skipMessageRates) { + if (_msgQueue.size() == 0) { + // Message queue emptied; stop the timer and bail out + _tokenBucketTimer.stop(); + return; + } + // Otherwise, we're emptying the queue, continue on as normal + } + + // Process whatever messages are pending + fillBucketAndProcessQueue(); +} + + void CoreNetwork::fillBucketAndProcessQueue() { + // If there's less tokens than burst size, refill the token bucket by 1 if (_tokenBucket < _burstSize) { _tokenBucket++; } + // As long as there's tokens available and messages remaining, sending messages from the queue while (_msgQueue.size() > 0 && _tokenBucket > 0) { writeToSocket(_msgQueue.takeFirst()); } @@ -1290,7 +1399,10 @@ void CoreNetwork::writeToSocket(const QByteArray &data) { socket.write(data); socket.write("\r\n"); - _tokenBucket--; + if (!_skipMessageRates) { + // Only subtract from the token bucket if message rate limiting is enabled + _tokenBucket--; + } } diff --git a/src/core/corenetwork.h b/src/core/corenetwork.h index 906f60ae..509df19d 100644 --- a/src/core/corenetwork.h +++ b/src/core/corenetwork.h @@ -268,6 +268,34 @@ public slots: bool cipherUsesCBC(const QString &target); #endif + // Custom rate limiting (can be connected to signals) + + /** + * Update rate limiting according to Network configuration + * + * Updates the token bucket and message queue timer according to the network configuration, such + * as on first load, or after changing settings. + * + * Calling this will reset any ongoing queue delays. If messages exist in the queue when rate + * limiting is disabled, messages will be quickly sent (100 ms) with new messages queued to send + * until the queue is cleared. + * + * @see Network::useCustomMessageRate() + * @see Network::messageRateBurstSize() + * @see Network::messageRateDelay() + * @see Network::unlimitedMessageRate() + */ + void updateRateLimiting(); + + /** + * Resets the token bucket up to the maximum + * + * Call this if the connection's been reset after calling updateRateLimiting() if needed. + * + * @see CoreNetwork::updateRateLimiting() + */ + void resetTokenBucket(); + // IRCv3 capability negotiation (can be connected to signals) /** @@ -381,6 +409,23 @@ private slots: void sslErrors(const QList &errors); #endif + /** + * Check the message token bucket + * + * If rate limiting is disabled and the message queue is empty, this disables the token bucket + * timer. Otherwise, a queued message will be sent. + * + * @see CoreNetwork::fillBucketAndProcessQueue() + */ + void checkTokenBucket(); + + /** + * Top up token bucket and send as many queued messages as possible + * + * If there's any room for more tokens, add to the token bucket. Separately, if there's any + * messages to send, send until there's no more tokens or the queue is empty, whichever comes + * first. + */ void fillBucketAndProcessQueue(); void writeToSocket(const QByteArray &data); @@ -463,10 +508,12 @@ private: const int maxCapRequestLength = 100; QTimer _tokenBucketTimer; - int _messageDelay; // token refill speed in ms - int _burstSize; // size of the token bucket - int _tokenBucket; // the virtual bucket that holds the tokens - QList _msgQueue; + // No need for int type as one cannot travel into the past (at least not yet, Doc) + quint32 _messageDelay; /// Token refill speed in ms + quint32 _burstSize; /// Size of the token bucket + quint32 _tokenBucket; /// The virtual bucket that holds the tokens + QList _msgQueue; /// Queue of messages waiting to be sent + bool _skipMessageRates; /// If true, skip all message rate limits QString _requestedUserModes; // 2 strings separated by a '-' character. first part are requested modes to add, the second to remove diff --git a/src/core/postgresqlstorage.cpp b/src/core/postgresqlstorage.cpp index 57904787..d6b82440 100644 --- a/src/core/postgresqlstorage.cpp +++ b/src/core/postgresqlstorage.cpp @@ -697,6 +697,11 @@ void PostgreSqlStorage::bindNetworkInfo(QSqlQuery &query, const NetworkInfo &inf query.bindValue(":autoreconnectretries", info.autoReconnectRetries); query.bindValue(":unlimitedconnectretries", info.unlimitedReconnectRetries); query.bindValue(":rejoinchannels", info.rejoinChannels); + // Custom rate limiting + query.bindValue(":usecustomessagerate", info.useCustomMessageRate); + query.bindValue(":messagerateburstsize", info.messageRateBurstSize); + query.bindValue(":messageratedelay", info.messageRateDelay); + query.bindValue(":unlimitedmessagerate", info.unlimitedMessageRate); if (info.networkId.isValid()) query.bindValue(":networkid", info.networkId.toInt()); } @@ -843,6 +848,11 @@ QList PostgreSqlStorage::networks(UserId user) net.useSasl = networksQuery.value(16).toBool(); net.saslAccount = networksQuery.value(17).toString(); net.saslPassword = networksQuery.value(18).toString(); + // Custom rate limiting + net.useCustomMessageRate = networksQuery.value(19).toBool(); + net.messageRateBurstSize = networksQuery.value(20).toUInt(); + net.messageRateDelay = networksQuery.value(21).toUInt(); + net.unlimitedMessageRate = networksQuery.value(22).toBool(); serversQuery.bindValue(":networkid", net.networkId.toInt()); safeExec(serversQuery); @@ -1927,6 +1937,11 @@ bool PostgreSqlMigrationWriter::writeMo(const NetworkMO &network) bindValue(22, network.usesasl); bindValue(23, network.saslaccount); bindValue(24, network.saslpassword); + // Custom rate limiting + bindValue(25, network.usecustommessagerate); + bindValue(26, network.messagerateburstsize); + bindValue(27, network.messageratedelay); + bindValue(28, network.unlimitedmessagerate); return exec(); } diff --git a/src/core/sql.qrc b/src/core/sql.qrc index 01b45559..be7a8437 100644 --- a/src/core/sql.qrc +++ b/src/core/sql.qrc @@ -73,180 +73,188 @@ ./SQL/SQLite/17/upgrade_001_alter_network_add_sasl.sql ./SQL/SQLite/17/upgrade_002_alter_network_add_sasl.sql ./SQL/SQLite/18/upgrade_000_alter_quasseluser_add_passwordversion.sql - ./SQL/SQLite/19/delete_backlog_by_uid.sql - ./SQL/SQLite/19/delete_backlog_for_buffer.sql - ./SQL/SQLite/19/delete_backlog_for_network.sql - ./SQL/SQLite/19/delete_buffer_for_bufferid.sql - ./SQL/SQLite/19/delete_buffers_by_uid.sql - ./SQL/SQLite/19/delete_buffers_for_network.sql - ./SQL/SQLite/19/delete_identity.sql - ./SQL/SQLite/19/delete_ircservers_for_network.sql - ./SQL/SQLite/19/delete_networks_by_uid.sql - ./SQL/SQLite/19/delete_network.sql - ./SQL/SQLite/19/delete_nicks.sql - ./SQL/SQLite/19/delete_quasseluser.sql - ./SQL/SQLite/19/insert_buffer.sql - ./SQL/SQLite/19/insert_identity.sql - ./SQL/SQLite/19/insert_message.sql - ./SQL/SQLite/19/insert_network.sql - ./SQL/SQLite/19/insert_nick.sql - ./SQL/SQLite/19/insert_quasseluser.sql - ./SQL/SQLite/19/insert_sender.sql - ./SQL/SQLite/19/insert_server.sql - ./SQL/SQLite/19/insert_user_setting.sql - ./SQL/SQLite/19/migrate_read_backlog.sql - ./SQL/SQLite/19/migrate_read_buffer.sql - ./SQL/SQLite/19/migrate_read_identity_nick.sql - ./SQL/SQLite/19/migrate_read_identity.sql - ./SQL/SQLite/19/migrate_read_ircserver.sql - ./SQL/SQLite/19/migrate_read_network.sql - ./SQL/SQLite/19/migrate_read_quasseluser.sql - ./SQL/SQLite/19/migrate_read_sender.sql - ./SQL/SQLite/19/migrate_read_usersetting.sql - ./SQL/SQLite/19/select_authuser.sql - ./SQL/SQLite/19/select_buffer_by_id.sql - ./SQL/SQLite/19/select_bufferByName.sql - ./SQL/SQLite/19/select_bufferExists.sql - ./SQL/SQLite/19/select_buffer_lastseen_messages.sql - ./SQL/SQLite/19/select_buffer_markerlinemsgids.sql - ./SQL/SQLite/19/select_buffers_for_merge.sql - ./SQL/SQLite/19/select_buffers_for_network.sql - ./SQL/SQLite/19/select_buffers.sql - ./SQL/SQLite/19/select_checkidentity.sql - ./SQL/SQLite/19/select_connected_networks.sql - ./SQL/SQLite/19/select_identities.sql - ./SQL/SQLite/19/select_internaluser.sql - ./SQL/SQLite/19/select_messagesAllNew.sql - ./SQL/SQLite/19/select_messagesAll.sql - ./SQL/SQLite/19/select_messagesNewerThan.sql - ./SQL/SQLite/19/select_messagesNewestK.sql - ./SQL/SQLite/19/select_messages.sql - ./SQL/SQLite/19/select_network_awaymsg.sql - ./SQL/SQLite/19/select_networkExists.sql - ./SQL/SQLite/19/select_networks_for_user.sql - ./SQL/SQLite/19/select_network_usermode.sql - ./SQL/SQLite/19/select_nicks.sql - ./SQL/SQLite/19/select_persistent_channels.sql - ./SQL/SQLite/19/select_servers_for_network.sql - ./SQL/SQLite/19/select_userid.sql - ./SQL/SQLite/19/select_user_setting.sql - ./SQL/SQLite/19/setup_000_quasseluser.sql - ./SQL/SQLite/19/setup_010_sender.sql - ./SQL/SQLite/19/setup_020_network.sql - ./SQL/SQLite/19/setup_030_buffer.sql - ./SQL/SQLite/19/setup_040_buffer_idx.sql - ./SQL/SQLite/19/setup_050_buffer_cname_idx.sql - ./SQL/SQLite/19/setup_060_backlog.sql - ./SQL/SQLite/19/setup_070_coreinfo.sql - ./SQL/SQLite/19/setup_080_ircservers.sql - ./SQL/SQLite/19/setup_090_backlog_idx.sql - ./SQL/SQLite/19/setup_100_backlog_idx2.sql - ./SQL/SQLite/19/setup_110_buffer_user_idx.sql - ./SQL/SQLite/19/setup_120_user_setting.sql - ./SQL/SQLite/19/setup_130_identity.sql - ./SQL/SQLite/19/setup_140_identity_nick.sql - ./SQL/SQLite/19/update_backlog_bufferid.sql - ./SQL/SQLite/19/update_buffer_lastseen.sql - ./SQL/SQLite/19/update_buffer_markerlinemsgid.sql - ./SQL/SQLite/19/update_buffer_name.sql - ./SQL/SQLite/19/update_buffer_persistent_channel.sql - ./SQL/SQLite/19/update_buffer_set_channel_key.sql - ./SQL/SQLite/19/update_identity.sql - ./SQL/SQLite/19/update_network_connected.sql - ./SQL/SQLite/19/update_network_set_awaymsg.sql - ./SQL/SQLite/19/update_network_set_usermode.sql - ./SQL/SQLite/19/update_network.sql - ./SQL/SQLite/19/update_username.sql - ./SQL/SQLite/19/update_userpassword.sql - ./SQL/SQLite/19/update_user_setting.sql ./SQL/SQLite/19/upgrade_000_alter_ircserver_add_sslverify.sql + ./SQL/SQLite/20/delete_backlog_by_uid.sql + ./SQL/SQLite/20/delete_backlog_for_buffer.sql + ./SQL/SQLite/20/delete_backlog_for_network.sql + ./SQL/SQLite/20/delete_buffer_for_bufferid.sql + ./SQL/SQLite/20/delete_buffers_by_uid.sql + ./SQL/SQLite/20/delete_buffers_for_network.sql + ./SQL/SQLite/20/delete_identity.sql + ./SQL/SQLite/20/delete_ircservers_for_network.sql + ./SQL/SQLite/20/delete_networks_by_uid.sql + ./SQL/SQLite/20/delete_network.sql + ./SQL/SQLite/20/delete_nicks.sql + ./SQL/SQLite/20/delete_quasseluser.sql + ./SQL/SQLite/20/insert_buffer.sql + ./SQL/SQLite/20/insert_identity.sql + ./SQL/SQLite/20/insert_message.sql + ./SQL/SQLite/20/insert_network.sql + ./SQL/SQLite/20/insert_nick.sql + ./SQL/SQLite/20/insert_quasseluser.sql + ./SQL/SQLite/20/insert_sender.sql + ./SQL/SQLite/20/insert_server.sql + ./SQL/SQLite/20/insert_user_setting.sql + ./SQL/SQLite/20/migrate_read_backlog.sql + ./SQL/SQLite/20/migrate_read_buffer.sql + ./SQL/SQLite/20/migrate_read_identity_nick.sql + ./SQL/SQLite/20/migrate_read_identity.sql + ./SQL/SQLite/20/migrate_read_ircserver.sql + ./SQL/SQLite/20/migrate_read_network.sql + ./SQL/SQLite/20/migrate_read_quasseluser.sql + ./SQL/SQLite/20/migrate_read_sender.sql + ./SQL/SQLite/20/migrate_read_usersetting.sql + ./SQL/SQLite/20/select_authuser.sql + ./SQL/SQLite/20/select_buffer_by_id.sql + ./SQL/SQLite/20/select_bufferByName.sql + ./SQL/SQLite/20/select_bufferExists.sql + ./SQL/SQLite/20/select_buffer_lastseen_messages.sql + ./SQL/SQLite/20/select_buffer_markerlinemsgids.sql + ./SQL/SQLite/20/select_buffers_for_merge.sql + ./SQL/SQLite/20/select_buffers_for_network.sql + ./SQL/SQLite/20/select_buffers.sql + ./SQL/SQLite/20/select_checkidentity.sql + ./SQL/SQLite/20/select_connected_networks.sql + ./SQL/SQLite/20/select_identities.sql + ./SQL/SQLite/20/select_internaluser.sql + ./SQL/SQLite/20/select_messagesAllNew.sql + ./SQL/SQLite/20/select_messagesAll.sql + ./SQL/SQLite/20/select_messagesNewerThan.sql + ./SQL/SQLite/20/select_messagesNewestK.sql + ./SQL/SQLite/20/select_messages.sql + ./SQL/SQLite/20/select_network_awaymsg.sql + ./SQL/SQLite/20/select_networkExists.sql + ./SQL/SQLite/20/select_networks_for_user.sql + ./SQL/SQLite/20/select_network_usermode.sql + ./SQL/SQLite/20/select_nicks.sql + ./SQL/SQLite/20/select_persistent_channels.sql + ./SQL/SQLite/20/select_servers_for_network.sql + ./SQL/SQLite/20/select_userid.sql + ./SQL/SQLite/20/select_user_setting.sql + ./SQL/SQLite/20/setup_000_quasseluser.sql + ./SQL/SQLite/20/setup_010_sender.sql + ./SQL/SQLite/20/setup_020_network.sql + ./SQL/SQLite/20/setup_030_buffer.sql + ./SQL/SQLite/20/setup_040_buffer_idx.sql + ./SQL/SQLite/20/setup_050_buffer_cname_idx.sql + ./SQL/SQLite/20/setup_060_backlog.sql + ./SQL/SQLite/20/setup_070_coreinfo.sql + ./SQL/SQLite/20/setup_080_ircservers.sql + ./SQL/SQLite/20/setup_090_backlog_idx.sql + ./SQL/SQLite/20/setup_100_backlog_idx2.sql + ./SQL/SQLite/20/setup_110_buffer_user_idx.sql + ./SQL/SQLite/20/setup_120_user_setting.sql + ./SQL/SQLite/20/setup_130_identity.sql + ./SQL/SQLite/20/setup_140_identity_nick.sql + ./SQL/SQLite/20/update_backlog_bufferid.sql + ./SQL/SQLite/20/update_buffer_lastseen.sql + ./SQL/SQLite/20/update_buffer_markerlinemsgid.sql + ./SQL/SQLite/20/update_buffer_name.sql + ./SQL/SQLite/20/update_buffer_persistent_channel.sql + ./SQL/SQLite/20/update_buffer_set_channel_key.sql + ./SQL/SQLite/20/update_identity.sql + ./SQL/SQLite/20/update_network_connected.sql + ./SQL/SQLite/20/update_network_set_awaymsg.sql + ./SQL/SQLite/20/update_network_set_usermode.sql + ./SQL/SQLite/20/update_network.sql + ./SQL/SQLite/20/update_username.sql + ./SQL/SQLite/20/update_userpassword.sql + ./SQL/SQLite/20/update_user_setting.sql + ./SQL/SQLite/20/upgrade_000_alter_network_add_ratelimit_usecustom.sql + ./SQL/SQLite/20/upgrade_001_alter_network_add_ratelimit_burstsize.sql + ./SQL/SQLite/20/upgrade_002_alter_network_add_ratelimit_delay.sql + ./SQL/SQLite/20/upgrade_003_alter_network_add_ratelimit_unlimited.sql ./SQL/PostgreSQL/15/upgrade_000_alter_buffer_add_markerlinemsgid.sql ./SQL/PostgreSQL/16/upgrade_000_alter_network_add_sasl.sql ./SQL/PostgreSQL/17/upgrade_000_alter_quasseluser_add_passwordversion.sql - ./SQL/PostgreSQL/18/delete_backlog_by_uid.sql - ./SQL/PostgreSQL/18/delete_backlog_for_buffer.sql - ./SQL/PostgreSQL/18/delete_backlog_for_network.sql - ./SQL/PostgreSQL/18/delete_buffer_for_bufferid.sql - ./SQL/PostgreSQL/18/delete_buffers_by_uid.sql - ./SQL/PostgreSQL/18/delete_buffers_for_network.sql - ./SQL/PostgreSQL/18/delete_identity.sql - ./SQL/PostgreSQL/18/delete_ircservers_for_network.sql - ./SQL/PostgreSQL/18/delete_networks_by_uid.sql - ./SQL/PostgreSQL/18/delete_network.sql - ./SQL/PostgreSQL/18/delete_nicks.sql - ./SQL/PostgreSQL/18/delete_quasseluser.sql - ./SQL/PostgreSQL/18/insert_buffer.sql - ./SQL/PostgreSQL/18/insert_identity.sql - ./SQL/PostgreSQL/18/insert_message.sql - ./SQL/PostgreSQL/18/insert_network.sql - ./SQL/PostgreSQL/18/insert_nick.sql - ./SQL/PostgreSQL/18/insert_quasseluser.sql - ./SQL/PostgreSQL/18/insert_sender.sql - ./SQL/PostgreSQL/18/insert_server.sql - ./SQL/PostgreSQL/18/insert_user_setting.sql - ./SQL/PostgreSQL/18/migrate_write_backlog.sql - ./SQL/PostgreSQL/18/migrate_write_buffer.sql - ./SQL/PostgreSQL/18/migrate_write_identity_nick.sql - ./SQL/PostgreSQL/18/migrate_write_identity.sql - ./SQL/PostgreSQL/18/migrate_write_ircserver.sql - ./SQL/PostgreSQL/18/migrate_write_network.sql - ./SQL/PostgreSQL/18/migrate_write_quasseluser.sql - ./SQL/PostgreSQL/18/migrate_write_sender.sql - ./SQL/PostgreSQL/18/migrate_write_usersetting.sql - ./SQL/PostgreSQL/18/select_authuser.sql - ./SQL/PostgreSQL/18/select_buffer_by_id.sql - ./SQL/PostgreSQL/18/select_bufferByName.sql - ./SQL/PostgreSQL/18/select_bufferExists.sql - ./SQL/PostgreSQL/18/select_buffer_lastseen_messages.sql - ./SQL/PostgreSQL/18/select_buffer_markerlinemsgids.sql - ./SQL/PostgreSQL/18/select_buffers_for_network.sql - ./SQL/PostgreSQL/18/select_buffers.sql - ./SQL/PostgreSQL/18/select_checkidentity.sql - ./SQL/PostgreSQL/18/select_connected_networks.sql - ./SQL/PostgreSQL/18/select_identities.sql - ./SQL/PostgreSQL/18/select_internaluser.sql - ./SQL/PostgreSQL/18/select_messagesAllNew.sql - ./SQL/PostgreSQL/18/select_messagesAll.sql - ./SQL/PostgreSQL/18/select_messagesNewerThan.sql - ./SQL/PostgreSQL/18/select_messagesRange.sql - ./SQL/PostgreSQL/18/select_messages.sql - ./SQL/PostgreSQL/18/select_network_awaymsg.sql - ./SQL/PostgreSQL/18/select_networkExists.sql - ./SQL/PostgreSQL/18/select_networks_for_user.sql - ./SQL/PostgreSQL/18/select_network_usermode.sql - ./SQL/PostgreSQL/18/select_nicks.sql - ./SQL/PostgreSQL/18/select_persistent_channels.sql - ./SQL/PostgreSQL/18/select_senderid.sql - ./SQL/PostgreSQL/18/select_servers_for_network.sql - ./SQL/PostgreSQL/18/select_userid.sql - ./SQL/PostgreSQL/18/select_user_setting.sql - ./SQL/PostgreSQL/18/setup_000_quasseluser.sql - ./SQL/PostgreSQL/18/setup_010_sender.sql - ./SQL/PostgreSQL/18/setup_020_identity.sql - ./SQL/PostgreSQL/18/setup_030_identity_nick.sql - ./SQL/PostgreSQL/18/setup_040_network.sql - ./SQL/PostgreSQL/18/setup_050_buffer.sql - ./SQL/PostgreSQL/18/setup_060_backlog.sql - ./SQL/PostgreSQL/18/setup_070_coreinfo.sql - ./SQL/PostgreSQL/18/setup_080_ircservers.sql - ./SQL/PostgreSQL/18/setup_090_backlog_idx.sql - ./SQL/PostgreSQL/18/setup_100_user_setting.sql - ./SQL/PostgreSQL/18/setup_110_alter_sender_seq.sql - ./SQL/PostgreSQL/18/setup_120_alter_messageid_seq.sql - ./SQL/PostgreSQL/18/update_backlog_bufferid.sql - ./SQL/PostgreSQL/18/update_buffer_lastseen.sql - ./SQL/PostgreSQL/18/update_buffer_markerlinemsgid.sql - ./SQL/PostgreSQL/18/update_buffer_name.sql - ./SQL/PostgreSQL/18/update_buffer_persistent_channel.sql - ./SQL/PostgreSQL/18/update_buffer_set_channel_key.sql - ./SQL/PostgreSQL/18/update_identity.sql - ./SQL/PostgreSQL/18/update_network_connected.sql - ./SQL/PostgreSQL/18/update_network_set_awaymsg.sql - ./SQL/PostgreSQL/18/update_network_set_usermode.sql - ./SQL/PostgreSQL/18/update_network.sql - ./SQL/PostgreSQL/18/update_username.sql - ./SQL/PostgreSQL/18/update_userpassword.sql - ./SQL/PostgreSQL/18/update_user_setting.sql ./SQL/PostgreSQL/18/upgrade_000_alter_ircserver_add_sslverify.sql + ./SQL/PostgreSQL/19/delete_backlog_by_uid.sql + ./SQL/PostgreSQL/19/delete_backlog_for_buffer.sql + ./SQL/PostgreSQL/19/delete_backlog_for_network.sql + ./SQL/PostgreSQL/19/delete_buffer_for_bufferid.sql + ./SQL/PostgreSQL/19/delete_buffers_by_uid.sql + ./SQL/PostgreSQL/19/delete_buffers_for_network.sql + ./SQL/PostgreSQL/19/delete_identity.sql + ./SQL/PostgreSQL/19/delete_ircservers_for_network.sql + ./SQL/PostgreSQL/19/delete_networks_by_uid.sql + ./SQL/PostgreSQL/19/delete_network.sql + ./SQL/PostgreSQL/19/delete_nicks.sql + ./SQL/PostgreSQL/19/delete_quasseluser.sql + ./SQL/PostgreSQL/19/insert_buffer.sql + ./SQL/PostgreSQL/19/insert_identity.sql + ./SQL/PostgreSQL/19/insert_message.sql + ./SQL/PostgreSQL/19/insert_network.sql + ./SQL/PostgreSQL/19/insert_nick.sql + ./SQL/PostgreSQL/19/insert_quasseluser.sql + ./SQL/PostgreSQL/19/insert_sender.sql + ./SQL/PostgreSQL/19/insert_server.sql + ./SQL/PostgreSQL/19/insert_user_setting.sql + ./SQL/PostgreSQL/19/migrate_write_backlog.sql + ./SQL/PostgreSQL/19/migrate_write_buffer.sql + ./SQL/PostgreSQL/19/migrate_write_identity_nick.sql + ./SQL/PostgreSQL/19/migrate_write_identity.sql + ./SQL/PostgreSQL/19/migrate_write_ircserver.sql + ./SQL/PostgreSQL/19/migrate_write_network.sql + ./SQL/PostgreSQL/19/migrate_write_quasseluser.sql + ./SQL/PostgreSQL/19/migrate_write_sender.sql + ./SQL/PostgreSQL/19/migrate_write_usersetting.sql + ./SQL/PostgreSQL/19/select_authuser.sql + ./SQL/PostgreSQL/19/select_buffer_by_id.sql + ./SQL/PostgreSQL/19/select_bufferByName.sql + ./SQL/PostgreSQL/19/select_bufferExists.sql + ./SQL/PostgreSQL/19/select_buffer_lastseen_messages.sql + ./SQL/PostgreSQL/19/select_buffer_markerlinemsgids.sql + ./SQL/PostgreSQL/19/select_buffers_for_network.sql + ./SQL/PostgreSQL/19/select_buffers.sql + ./SQL/PostgreSQL/19/select_checkidentity.sql + ./SQL/PostgreSQL/19/select_connected_networks.sql + ./SQL/PostgreSQL/19/select_identities.sql + ./SQL/PostgreSQL/19/select_internaluser.sql + ./SQL/PostgreSQL/19/select_messagesAllNew.sql + ./SQL/PostgreSQL/19/select_messagesAll.sql + ./SQL/PostgreSQL/19/select_messagesNewerThan.sql + ./SQL/PostgreSQL/19/select_messagesRange.sql + ./SQL/PostgreSQL/19/select_messages.sql + ./SQL/PostgreSQL/19/select_network_awaymsg.sql + ./SQL/PostgreSQL/19/select_networkExists.sql + ./SQL/PostgreSQL/19/select_networks_for_user.sql + ./SQL/PostgreSQL/19/select_network_usermode.sql + ./SQL/PostgreSQL/19/select_nicks.sql + ./SQL/PostgreSQL/19/select_persistent_channels.sql + ./SQL/PostgreSQL/19/select_senderid.sql + ./SQL/PostgreSQL/19/select_servers_for_network.sql + ./SQL/PostgreSQL/19/select_userid.sql + ./SQL/PostgreSQL/19/select_user_setting.sql + ./SQL/PostgreSQL/19/setup_000_quasseluser.sql + ./SQL/PostgreSQL/19/setup_010_sender.sql + ./SQL/PostgreSQL/19/setup_020_identity.sql + ./SQL/PostgreSQL/19/setup_030_identity_nick.sql + ./SQL/PostgreSQL/19/setup_040_network.sql + ./SQL/PostgreSQL/19/setup_050_buffer.sql + ./SQL/PostgreSQL/19/setup_060_backlog.sql + ./SQL/PostgreSQL/19/setup_070_coreinfo.sql + ./SQL/PostgreSQL/19/setup_080_ircservers.sql + ./SQL/PostgreSQL/19/setup_090_backlog_idx.sql + ./SQL/PostgreSQL/19/setup_100_user_setting.sql + ./SQL/PostgreSQL/19/setup_110_alter_sender_seq.sql + ./SQL/PostgreSQL/19/setup_120_alter_messageid_seq.sql + ./SQL/PostgreSQL/19/update_backlog_bufferid.sql + ./SQL/PostgreSQL/19/update_buffer_lastseen.sql + ./SQL/PostgreSQL/19/update_buffer_markerlinemsgid.sql + ./SQL/PostgreSQL/19/update_buffer_name.sql + ./SQL/PostgreSQL/19/update_buffer_persistent_channel.sql + ./SQL/PostgreSQL/19/update_buffer_set_channel_key.sql + ./SQL/PostgreSQL/19/update_identity.sql + ./SQL/PostgreSQL/19/update_network_connected.sql + ./SQL/PostgreSQL/19/update_network_set_awaymsg.sql + ./SQL/PostgreSQL/19/update_network_set_usermode.sql + ./SQL/PostgreSQL/19/update_network.sql + ./SQL/PostgreSQL/19/update_username.sql + ./SQL/PostgreSQL/19/update_userpassword.sql + ./SQL/PostgreSQL/19/update_user_setting.sql + ./SQL/PostgreSQL/19/upgrade_000_alter_network_add_ratelimit_usecustom.sql + ./SQL/PostgreSQL/19/upgrade_001_alter_network_add_ratelimit_burstsize.sql + ./SQL/PostgreSQL/19/upgrade_002_alter_network_add_ratelimit_delay.sql + ./SQL/PostgreSQL/19/upgrade_003_alter_network_add_ratelimit_unlimited.sql diff --git a/src/core/sqlitestorage.cpp b/src/core/sqlitestorage.cpp index c8f57d10..53601e0f 100644 --- a/src/core/sqlitestorage.cpp +++ b/src/core/sqlitestorage.cpp @@ -658,6 +658,11 @@ void SqliteStorage::bindNetworkInfo(QSqlQuery &query, const NetworkInfo &info) query.bindValue(":autoreconnectretries", info.autoReconnectRetries); query.bindValue(":unlimitedconnectretries", info.unlimitedReconnectRetries ? 1 : 0); query.bindValue(":rejoinchannels", info.rejoinChannels ? 1 : 0); + // Custom rate limiting + query.bindValue(":usecustomessagerate", info.useCustomMessageRate ? 1 : 0); + query.bindValue(":messagerateburstsize", info.messageRateBurstSize); + query.bindValue(":messageratedelay", info.messageRateDelay); + query.bindValue(":unlimitedmessagerate", info.unlimitedMessageRate ? 1 : 0); if (info.networkId.isValid()) query.bindValue(":networkid", info.networkId.toInt()); } @@ -854,6 +859,11 @@ QList SqliteStorage::networks(UserId user) net.useSasl = networksQuery.value(16).toInt() == 1 ? true : false; net.saslAccount = networksQuery.value(17).toString(); net.saslPassword = networksQuery.value(18).toString(); + // Custom rate limiting + net.useCustomMessageRate = networksQuery.value(19).toInt() == 1 ? true : false; + net.messageRateBurstSize = networksQuery.value(20).toUInt(); + net.messageRateDelay = networksQuery.value(21).toUInt(); + net.unlimitedMessageRate = networksQuery.value(22).toInt() == 1 ? true : false; serversQuery.bindValue(":networkid", net.networkId.toInt()); safeExec(serversQuery); @@ -1887,6 +1897,11 @@ bool SqliteMigrationReader::readMo(NetworkMO &network) network.usesasl = value(22).toInt() == 1 ? true : false; network.saslaccount = value(23).toString(); network.saslpassword = value(24).toString(); + // Custom rate limiting + network.usecustommessagerate = value(25).toInt() == 1 ? true : false; + network.messagerateburstsize = value(26).toInt(); + network.messageratedelay = value(27).toUInt(); + network.unlimitedmessagerate = value(28).toInt() == 1 ? true : false; return true; } diff --git a/src/qtui/settingspages/networkssettingspage.cpp b/src/qtui/settingspages/networkssettingspage.cpp index 7976cca4..5ac2795b 100644 --- a/src/qtui/settingspages/networkssettingspage.cpp +++ b/src/qtui/settingspages/networkssettingspage.cpp @@ -104,6 +104,15 @@ NetworksSettingsPage::NetworksSettingsPage(QWidget *parent) connect(ui.reconnectRetries, SIGNAL(valueChanged(int)), this, SLOT(widgetHasChanged())); connect(ui.unlimitedRetries, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); connect(ui.rejoinOnReconnect, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); + + // Core features can change during a reconnect. Always connect these here, delaying testing for + // the core feature flag in load(). + connect(ui.useCustomMessageRate, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); + connect(ui.messageRateBurstSize, SIGNAL(valueChanged(int)), this, SLOT(widgetHasChanged())); + connect(ui.messageRateDelay, SIGNAL(valueChanged(double)), this, SLOT(widgetHasChanged())); + connect(ui.unlimitedMessageRate, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); + + // Add additional widgets here //connect(ui., SIGNAL(), this, SLOT(widgetHasChanged())); //connect(ui., SIGNAL(), this, SLOT(widgetHasChanged())); @@ -158,10 +167,38 @@ void NetworksSettingsPage::save() void NetworksSettingsPage::load() { reset(); + + // Handle UI dependent on core feature flags here + if (Client::coreFeatures() & Quassel::CustomRateLimits) { + // Custom rate limiting supported, allow toggling + ui.useCustomMessageRate->setEnabled(true); + // Reset tooltip to default. + ui.useCustomMessageRate->setToolTip(QString("%1").arg( + tr("

Override default message rate limiting.

" + "

Setting limits too low may get you disconnected" + " from the server!

"))); + // If changed, update the message below! + } else { + // Custom rate limiting not supported, disallow toggling + ui.useCustomMessageRate->setEnabled(false); + // Split up the message to allow re-using translations: + // [Original tool-tip] + // [Bold 'does not support feature' message] + // [Specific version needed and feature details] + ui.useCustomMessageRate->setToolTip(QString("%1
%2
%3").arg( + tr("

Override default message rate limiting.

" + "

Setting limits too low may get you disconnected" + " from the server!

"), + tr("Your Quassel core does not support this feature"), + tr("You need a Quassel core v0.13.0 or newer in order to " + "modify message rate limits."))); + } + foreach(NetworkId netid, Client::networkIds()) { clientNetworkAdded(netid); } ui.networkList->setCurrentRow(0); + setChangedState(false); } @@ -526,6 +563,14 @@ void NetworksSettingsPage::displayNetwork(NetworkId id) ui.reconnectRetries->setValue(info.autoReconnectRetries); ui.unlimitedRetries->setChecked(info.unlimitedReconnectRetries); ui.rejoinOnReconnect->setChecked(info.rejoinChannels); + // Custom rate limiting + ui.unlimitedMessageRate->setChecked(info.unlimitedMessageRate); + // Set 'ui.useCustomMessageRate' after 'ui.unlimitedMessageRate' so if the latter is + // disabled, 'ui.messageRateDelayFrame' will remain disabled. + ui.useCustomMessageRate->setChecked(info.useCustomMessageRate); + ui.messageRateBurstSize->setValue(info.messageRateBurstSize); + // Convert milliseconds (integer) into seconds (double) + ui.messageRateDelay->setValue(info.messageRateDelay / 1000.0f); } else { // just clear widgets @@ -575,6 +620,12 @@ void NetworksSettingsPage::saveToNetworkInfo(NetworkInfo &info) info.autoReconnectRetries = ui.reconnectRetries->value(); info.unlimitedReconnectRetries = ui.unlimitedRetries->isChecked(); info.rejoinChannels = ui.rejoinOnReconnect->isChecked(); + // Custom rate limiting + info.useCustomMessageRate = ui.useCustomMessageRate->isChecked(); + info.messageRateBurstSize = ui.messageRateBurstSize->value(); + // Convert seconds (double) into milliseconds (integer) + info.messageRateDelay = static_cast((ui.messageRateDelay->value() * 1000)); + info.unlimitedMessageRate = ui.unlimitedMessageRate->isChecked(); } diff --git a/src/qtui/settingspages/networkssettingspage.ui b/src/qtui/settingspages/networkssettingspage.ui index 5fa1c469..5b931604 100644 --- a/src/qtui/settingspages/networkssettingspage.ui +++ b/src/qtui/settingspages/networkssettingspage.ui @@ -7,7 +7,7 @@ 0 0 510 - 505 + 553 @@ -218,8 +218,7 @@ - - + .. @@ -373,7 +372,7 @@ Note that Quassel IRC automatically rejoins channels, so /join will rarely be ne Connection - + @@ -496,6 +495,154 @@ Note that Quassel IRC automatically rejoins channels, so /join will rarely be ne + + + + true + + + Tooltip not yet loaded - to modify tooltip, edit NetworksSettingsPage::load() + + + Use Custom Rate Limits + + + true + + + false + + + + + + + + Max. messages at once: + + + + + + + Maximum number of messages to send without any delays + + + 1 + + + 999 + + + 5 + + + + + + + <html><head/><body><p>Disable all rate limiting, e.g. for IRC bridges.</p><p>Don't use with most normal networks.</p></body></html> + + + Unlimited + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + 1 + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + Wait + + + + + + + <html><head/><body><p>Delay between messages after the maximum number of undelayed messages have been sent.</p></body></html> + + + s + + + 0.010000000000000 + + + 0.100000000000000 + + + 2.200000000000000 + + + + + + + between future messages + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + @@ -504,7 +651,7 @@ Note that Quassel IRC automatically rejoins channels, so /join will rarely be ne 20 - 79 + 1 @@ -810,8 +957,16 @@ Unless you *really* know what you do, leave this as ISO-8859-1! reconnectRetries unlimitedRetries rejoinOnReconnect + useCustomMessageRate + messageRateBurstSize + unlimitedMessageRate + messageRateDelay + autoIdentify autoIdentifyService autoIdentifyPassword + sasl + saslAccount + saslPassword useCustomEncodings sendEncoding recvEncoding @@ -835,5 +990,37 @@ Unless you *really* know what you do, leave this as ISO-8859-1! + + unlimitedMessageRate + toggled(bool) + messageRateBurstSize + setDisabled(bool) + + + 332 + 392 + + + 249 + 393 + + + + + unlimitedMessageRate + toggled(bool) + messageRateDelayFrame + setDisabled(bool) + + + 332 + 392 + + + 262 + 428 + + + -- 2.20.1