mirror of
https://github.com/celisej567/abaddon.git
synced 2026-09-13 20:18:50 +03:00
update rate limit indicator on failed message send
this happens when you start the client while already rate-limited
This commit is contained in:
@@ -365,7 +365,7 @@ void ChatWindow::ScrollToBottom() {
|
||||
x->set_value(x->get_upper());
|
||||
}
|
||||
|
||||
void ChatWindow::OnMessageSendFail(const std::string &nonce) {
|
||||
void ChatWindow::OnMessageSendFail(const std::string &nonce, float retry_after) {
|
||||
for (auto [id, widget] : m_id_to_widget) {
|
||||
if (auto *container = dynamic_cast<ChatMessageItemContainer *>(widget); container->Nonce == nonce) {
|
||||
container->SetFailed();
|
||||
|
||||
@@ -54,7 +54,7 @@ protected:
|
||||
void ScrollToBottom();
|
||||
bool m_should_scroll_to_bottom = true;
|
||||
|
||||
void OnMessageSendFail(const std::string &nonce);
|
||||
void OnMessageSendFail(const std::string &nonce, float retry_after);
|
||||
|
||||
Gtk::Box *m_main;
|
||||
Gtk::ListBox *m_list;
|
||||
|
||||
@@ -25,6 +25,7 @@ RateLimitIndicator::RateLimitIndicator()
|
||||
}
|
||||
|
||||
Abaddon::Get().GetDiscordClient().signal_message_create().connect(sigc::mem_fun(*this, &RateLimitIndicator::OnMessageCreate));
|
||||
Abaddon::Get().GetDiscordClient().signal_message_send_fail().connect(sigc::mem_fun(*this, &RateLimitIndicator::OnMessageSendFail));
|
||||
}
|
||||
|
||||
void RateLimitIndicator::SetActiveChannel(Snowflake id) {
|
||||
@@ -109,3 +110,15 @@ void RateLimitIndicator::OnMessageCreate(const Message &message) {
|
||||
UpdateIndicator();
|
||||
}
|
||||
}
|
||||
|
||||
void RateLimitIndicator::OnMessageSendFail(const std::string &nonce, float retry_after) {
|
||||
if (retry_after != 0) { // failed to rate limit
|
||||
const auto msg = Abaddon::Get().GetDiscordClient().GetMessage(nonce);
|
||||
const auto channel_id = msg->ChannelID;
|
||||
const auto channel = *Abaddon::Get().GetDiscordClient().GetChannel(channel_id);
|
||||
const auto rate_limit = *channel.RateLimitPerUser;
|
||||
const auto sent_time = std::chrono::steady_clock::now() - std::chrono::duration<int>(rate_limit - std::lroundf(retry_after + 0.5f)); // + 0.5 will ceil it
|
||||
m_times[channel_id] = sent_time;
|
||||
UpdateIndicator();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ private:
|
||||
int GetRateLimit() const;
|
||||
bool UpdateIndicator();
|
||||
void OnMessageCreate(const Message &message);
|
||||
void OnMessageSendFail(const std::string &nonce, float rate_limit);
|
||||
|
||||
Gtk::Image m_img;
|
||||
Gtk::Label m_label;
|
||||
|
||||
Reference in New Issue
Block a user