From 635feb1a9a3ece8f06e1ad620b7b5a1eb21f8a44 Mon Sep 17 00:00:00 2001 From: Sadie Powell Date: Fri, 4 Aug 2023 13:09:06 +0100 Subject: Rework how away state is stored internally. This will be necessary for implementing pre-away as well as some changes for WATCH compatibility with Unreal. --- src/modules/m_check.cpp | 4 ++-- src/modules/m_helpmode.cpp | 6 +++--- src/modules/m_hideoper.cpp | 6 +++--- src/modules/m_httpd_stats.cpp | 4 ++-- src/modules/m_ircv3.cpp | 10 +++++----- src/modules/m_spanningtree/away.cpp | 21 ++++++++------------- src/modules/m_spanningtree/main.cpp | 6 +++--- src/modules/m_spanningtree/main.h | 4 ++-- src/modules/m_watch.cpp | 12 ++++++------ 9 files changed, 34 insertions(+), 39 deletions(-) (limited to 'src/modules') diff --git a/src/modules/m_check.cpp b/src/modules/m_check.cpp index cd2a80cd8..5109c265d 100644 --- a/src/modules/m_check.cpp +++ b/src/modules/m_check.cpp @@ -182,8 +182,8 @@ public: if (targetuser->IsAway()) { /* user is away */ - context.Write("awaytime", targetuser->awaytime); - context.Write("awaymsg", targetuser->awaymsg); + context.Write("awaytime", targetuser->away->time); + context.Write("awaymsg", targetuser->away->message); } if (targetuser->IsOper()) diff --git a/src/modules/m_helpmode.cpp b/src/modules/m_helpmode.cpp index 9d783629a..32a69f59b 100644 --- a/src/modules/m_helpmode.cpp +++ b/src/modules/m_helpmode.cpp @@ -91,10 +91,10 @@ public: std::string extra; if (helper->IsAway()) { - const std::string awayperiod = Duration::ToString(ServerInstance->Time() - helper->awaytime); - const std::string awaytime = Time::ToString(helper->awaytime); + const std::string awayperiod = Duration::ToString(ServerInstance->Time() - helper->away->time); + const std::string awaytime = Time::ToString(helper->away->time); - extra = INSP_FORMAT(": away for {} [since {}] ({})", awayperiod, awaytime, helper->awaymsg); + extra = INSP_FORMAT(": away for {} [since {}] ({})", awayperiod, awaytime, helper->away->message); } auto* lhelper = IS_LOCAL(helper); diff --git a/src/modules/m_hideoper.cpp b/src/modules/m_hideoper.cpp index 83664ccec..0821ffad5 100644 --- a/src/modules/m_hideoper.cpp +++ b/src/modules/m_hideoper.cpp @@ -157,10 +157,10 @@ public: std::string extra; if (oper->IsAway()) { - const std::string awayperiod = Duration::ToString(ServerInstance->Time() - oper->awaytime); - const std::string awaytime = Time::ToString(oper->awaytime); + const std::string awayperiod = Duration::ToString(ServerInstance->Time() - oper->away->time); + const std::string awaytime = Time::ToString(oper->away->time); - extra = INSP_FORMAT(": away for {} [since {}] ({})", awayperiod, awaytime, oper->awaymsg); + extra = INSP_FORMAT(": away for {} [since {}] ({})", awayperiod, awaytime, oper->away->message); } auto* loper = IS_LOCAL(oper); diff --git a/src/modules/m_httpd_stats.cpp b/src/modules/m_httpd_stats.cpp index 0ca0f5987..5733cc9e3 100644 --- a/src/modules/m_httpd_stats.cpp +++ b/src/modules/m_httpd_stats.cpp @@ -270,8 +270,8 @@ namespace Stats if (u->IsAway()) { - serializer.Attribute("away", u->awaymsg) - .Attribute("awaytime", u->awaytime); + serializer.Attribute("away", u->away->message) + .Attribute("awaytime", u->away->time); } if (u->IsOper()) diff --git a/src/modules/m_ircv3.cpp b/src/modules/m_ircv3.cpp index 7d5382d33..4ff94ea6d 100644 --- a/src/modules/m_ircv3.cpp +++ b/src/modules/m_ircv3.cpp @@ -34,7 +34,7 @@ public: AwayMessage(User* user) : ClientProtocol::Message("AWAY", user) { - SetParams(user, user->awaymsg); + SetParams(user, user->away->message); } AwayMessage() @@ -101,7 +101,7 @@ public: if ((memb->user->IsAway()) && (awaycap.IsActive())) { awaymsg.SetSource(join); - awaymsg.SetParams(memb->user, memb->user->awaymsg); + awaymsg.SetParams(memb->user, memb->user->away->message); } } @@ -166,7 +166,7 @@ public: Monitor::WriteWatchersWithCap(monitorapi, user, accountevent, cap_accountnotify, res.GetAlreadySentId()); } - void OnUserAway(User* user) override + void OnUserAway(User* user, const std::optional& prevstate) override { if (!joinhook.awaycap.IsActive()) return; @@ -178,10 +178,10 @@ public: Monitor::WriteWatchersWithCap(monitorapi, user, awayevent, joinhook.awaycap, res.GetAlreadySentId()); } - void OnUserBack(User* user, const std::string& message) override + void OnUserBack(User* user, const std::optional& prevstate) override { // Back from away: n!u@h AWAY - OnUserAway(user); + OnUserAway(user, prevstate); } }; diff --git a/src/modules/m_spanningtree/away.cpp b/src/modules/m_spanningtree/away.cpp index edb59b21d..ec9f05041 100644 --- a/src/modules/m_spanningtree/away.cpp +++ b/src/modules/m_spanningtree/away.cpp @@ -30,22 +30,17 @@ CmdResult CommandAway::HandleRemote(::RemoteUser* u, Params& params) { + const auto prevstate = u->away; if (!params.empty()) { - if (params.size() > 1) - u->awaytime = ServerCommand::ExtractTS(params[0]); - else - u->awaytime = ServerInstance->Time(); - - u->awaymsg = params.back(); - awayevprov.Call(&Away::EventListener::OnUserAway, u); + time_t awaytime = params.size() > 1 ? ServerCommand::ExtractTS(params[0]) : 0; + u->away.emplace(params.back(), awaytime); + awayevprov.Call(&Away::EventListener::OnUserAway, u, prevstate); } else { - const std::string awaymsg = u->awaymsg; - u->awaytime = 0; - u->awaymsg.clear(); - awayevprov.Call(&Away::EventListener::OnUserBack, u, awaymsg); + u->away.reset(); + awayevprov.Call(&Away::EventListener::OnUserBack, u, prevstate); } return CmdResult::SUCCESS; } @@ -53,6 +48,6 @@ CmdResult CommandAway::HandleRemote(::RemoteUser* u, Params& params) CommandAway::Builder::Builder(User* user) : CmdBuilder(user, "AWAY") { - if (!user->awaymsg.empty()) - push_int(user->awaytime).push_last(user->awaymsg); + if (user->IsAway()) + push_int(user->away->time).push_last(user->away->message); } diff --git a/src/modules/m_spanningtree/main.cpp b/src/modules/m_spanningtree/main.cpp index 704d23ac6..999effda6 100644 --- a/src/modules/m_spanningtree/main.cpp +++ b/src/modules/m_spanningtree/main.cpp @@ -828,15 +828,15 @@ void ModuleSpanningTree::OnDelLine(User* user, XLine* x) params.Broadcast(); } -void ModuleSpanningTree::OnUserAway(User* user) +void ModuleSpanningTree::OnUserAway(User* user, const std::optional& prevstate) { if (IS_LOCAL(user) && user->IsFullyConnected()) CommandAway::Builder(user).Broadcast(); } -void ModuleSpanningTree::OnUserBack(User* user, const std::string& message) +void ModuleSpanningTree::OnUserBack(User* user, const std::optional& prevstate) { - OnUserAway(user); + OnUserAway(user, prevstate); } void ModuleSpanningTree::OnMode(User* source, User* u, Channel* c, const Modes::ChangeList& modes, ModeParser::ModeProcessFlag processflags) diff --git a/src/modules/m_spanningtree/main.h b/src/modules/m_spanningtree/main.h index 2c8558e78..6558feafb 100644 --- a/src/modules/m_spanningtree/main.h +++ b/src/modules/m_spanningtree/main.h @@ -200,8 +200,8 @@ public: void OnAddLine(User* u, XLine* x) override; void OnDelLine(User* u, XLine* x) override; ModResult OnStats(Stats::Context& stats) override; - void OnUserAway(User* user) override; - void OnUserBack(User* user, const std::string& message) override; + void OnUserAway(User* user, const std::optional& prevstate) override; + void OnUserBack(User* user, const std::optional& prevstate) override; void OnLoadModule(Module* mod) override; void OnUnloadModule(Module* mod) override; ModResult OnAcceptConnection(int newsock, ListenSocket* from, const irc::sockets::sockaddrs& client, const irc::sockets::sockaddrs& server) override; diff --git a/src/modules/m_watch.cpp b/src/modules/m_watch.cpp index 20d31aadd..fe2aaf0d1 100644 --- a/src/modules/m_watch.cpp +++ b/src/modules/m_watch.cpp @@ -59,7 +59,7 @@ class CommandWatch final { // The away state should only be sent if the client requests away notifications for a nick but 2.0 always sends them so we do that too if (target->IsAway()) - user->WriteNumeric(RPL_NOWISAWAY, target->nick, target->GetDisplayedHost(), target->GetDisplayedHost(), target->awaytime, "is away"); + user->WriteNumeric(RPL_NOWISAWAY, target->nick, target->GetDisplayedHost(), target->GetDisplayedHost(), target->away->time, "is away"); else user->WriteNumeric(RPL_NOWON, target->nick, target->GetDisplayedHost(), target->GetDisplayedHost(), target->nickchanged, "is online"); } @@ -199,8 +199,8 @@ private: void Online(User* user) { SendAlert(user, user->nick, RPL_LOGON, "arrived online", user->nickchanged); - if (!user->awaymsg.empty()) - OnUserAway(user); + if (user->IsAway()) + OnUserAway(user, std::nullopt); } void Offline(User* user, const std::string& nick) @@ -247,12 +247,12 @@ public: Offline(user, user->nick); } - void OnUserAway(User* user) override + void OnUserAway(User* user, const std::optional& prevstate) override { - SendAlert(user, user->nick, RPL_GONEAWAY, user->awaymsg.c_str(), user->awaytime); + SendAlert(user, user->nick, RPL_GONEAWAY, user->away->message.c_str(), user->away->time); } - void OnUserBack(User* user, const std::string& message) override + void OnUserBack(User* user, const std::optional& prevstate) override { SendAlert(user, user->nick, RPL_NOTAWAY, "is no longer away", ServerInstance->Time()); } -- cgit v1.3.1-10-gc9f91