From d7280771ce71dcb437d97ea6a6070d8888bf8ade Mon Sep 17 00:00:00 2001 From: Green Sky Date: Tue, 18 Jun 2024 18:42:59 +0200 Subject: [PATCH] reflect connection to server onto all contacts --- .../ircclient_contact_model.cpp | 30 +++++++++++++++++-- .../ircclient_contact_model.hpp | 1 + 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/solanaceae/ircclient_contacts/ircclient_contact_model.cpp b/src/solanaceae/ircclient_contacts/ircclient_contact_model.cpp index 61a050d..4a2a4c1 100644 --- a/src/solanaceae/ircclient_contacts/ircclient_contact_model.cpp +++ b/src/solanaceae/ircclient_contacts/ircclient_contact_model.cpp @@ -31,6 +31,8 @@ IRCClientContactModel::IRCClientContactModel( _ircc.subscribe(this, IRCClient_Event::CTCP_REQ); + _ircc.subscribe(this, IRCClient_Event::DISCONNECT); + // dont create server self etc until connect event comes for (const auto& [channel, should_join] : _conf.entries_bool("IRCClient", "autojoin")) { @@ -211,6 +213,8 @@ bool IRCClientContactModel::onEvent(const IRCClient::Events::Connect& e) { // since this might be a reconnect // and reissue joins _cr.view().each([this](const auto c, const auto& sn_c, const auto& cn_c) { + // HACK: by name + // should be by parent instead if (sn_c.name != _ircc.getServerName()) { return; } @@ -418,14 +422,13 @@ bool IRCClientContactModel::onEvent(const IRCClient::Events::Join& e) { std::cout << "IRCCCM: joined '" << joined_channel_name << "' id:" << bin2hex(channel.get().data) << "\n"; - channel.emplace_or_replace(Contact::Components::ConnectionState::State::cloud); - channel.emplace_or_replace(); channel.emplace_or_replace(); // add self to channel channel.emplace_or_replace(_self); } + channel.emplace_or_replace(Contact::Components::ConnectionState::State::cloud); auto user = getU(e.origin); if (!user.valid()) { @@ -563,3 +566,26 @@ bool IRCClientContactModel::onEvent(const IRCClient::Events::CTCP_Req& e) { return false; } + +bool IRCClientContactModel::onEvent(const IRCClient::Events::Disconnect&) { + _connected = false; + if (!_cr.valid(_server)) { + // skip if where already offline + return false; + } + _cr.get(_server).state = Contact::Components::ConnectionState::disconnected; + + // HACK: by name + _cr.view().each([this](const auto c, const auto& sn_c, auto& cs) { + // HACK: by name + // should be by parent instead + if (sn_c.name != _ircc.getServerName()) { + return; + } + + cs.state = Contact::Components::ConnectionState::disconnected; + }); + + return false; +} + diff --git a/src/solanaceae/ircclient_contacts/ircclient_contact_model.hpp b/src/solanaceae/ircclient_contacts/ircclient_contact_model.hpp index f5bcfb6..a7836ed 100644 --- a/src/solanaceae/ircclient_contacts/ircclient_contact_model.hpp +++ b/src/solanaceae/ircclient_contacts/ircclient_contact_model.hpp @@ -61,4 +61,5 @@ class IRCClientContactModel : public IRCClientEventI, public ContactModel3I { bool onEvent(const IRCClient::Events::Topic& e) override; bool onEvent(const IRCClient::Events::Quit& e) override; bool onEvent(const IRCClient::Events::CTCP_Req&) override; + bool onEvent(const IRCClient::Events::Disconnect&) override; };