aboutsummaryrefslogtreecommitdiff
path: root/src/modules
diff options
context:
space:
mode:
authorGravatar Sadie Powell2023-08-04 13:09:06 +0100
committerGravatar Sadie Powell2023-08-04 13:14:49 +0100
commit635feb1a9a3ece8f06e1ad620b7b5a1eb21f8a44 (patch)
treead84709d188e70bf3e8aab74d85c59e40a711e12 /src/modules
parentFix an inverted condition in the DNSBL module. (diff)
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.
Diffstat (limited to 'src/modules')
-rw-r--r--src/modules/m_check.cpp4
-rw-r--r--src/modules/m_helpmode.cpp6
-rw-r--r--src/modules/m_hideoper.cpp6
-rw-r--r--src/modules/m_httpd_stats.cpp4
-rw-r--r--src/modules/m_ircv3.cpp10
-rw-r--r--src/modules/m_spanningtree/away.cpp21
-rw-r--r--src/modules/m_spanningtree/main.cpp6
-rw-r--r--src/modules/m_spanningtree/main.h4
-rw-r--r--src/modules/m_watch.cpp12
9 files changed, 34 insertions, 39 deletions
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<AwayState>& 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<AwayState>& 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<AwayState>& 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<AwayState>& 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<AwayState>& prevstate) override;
+ void OnUserBack(User* user, const std::optional<AwayState>& 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<AwayState>& 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<AwayState>& prevstate) override
{
SendAlert(user, user->nick, RPL_NOTAWAY, "is no longer away", ServerInstance->Time());
}