summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/modules/account.h27
-rw-r--r--src/modules/m_ircv3.cpp36
-rw-r--r--src/modules/m_services_account.cpp13
3 files changed, 40 insertions, 36 deletions
diff --git a/include/modules/account.h b/include/modules/account.h
index c00b044e4..0368127a6 100644
--- a/include/modules/account.h
+++ b/include/modules/account.h
@@ -22,16 +22,7 @@
#include <map>
#include <string>
-class AccountEvent : public Event
-{
- public:
- User* const user;
- const std::string account;
- AccountEvent(Module* me, User* u, const std::string& name)
- : Event(me, "account_login"), user(u), account(name)
- {
- }
-};
+#include "event.h"
typedef StringExtItem AccountExtItem;
@@ -39,3 +30,19 @@ inline AccountExtItem* GetAccountExtItem()
{
return static_cast<AccountExtItem*>(ServerInstance->Extensions.GetItem("accountname"));
}
+
+class AccountEventListener : public Events::ModuleEventListener
+{
+ public:
+ AccountEventListener(Module* mod)
+ : ModuleEventListener(mod, "event/account")
+ {
+ }
+
+ /** Called when a user logs in or logs out
+ * @param user User logging in or out
+ * @param newaccount New account name of the user or empty string if the user
+ * logged out
+ */
+ virtual void OnAccountChange(User* user, const std::string& newaccount) = 0;
+};
diff --git a/src/modules/m_ircv3.cpp b/src/modules/m_ircv3.cpp
index b1c04cdf5..b80c110f4 100644
--- a/src/modules/m_ircv3.cpp
+++ b/src/modules/m_ircv3.cpp
@@ -40,7 +40,7 @@ class WriteNeighboursWithExt : public User::ForEachNeighborHandler
}
};
-class ModuleIRCv3 : public Module
+class ModuleIRCv3 : public Module, public AccountEventListener
{
GenericCap cap_accountnotify;
GenericCap cap_awaynotify;
@@ -52,7 +52,9 @@ class ModuleIRCv3 : public Module
CUList last_excepts;
public:
- ModuleIRCv3() : cap_accountnotify(this, "account-notify"),
+ ModuleIRCv3()
+ : AccountEventListener(this)
+ , cap_accountnotify(this, "account-notify"),
cap_awaynotify(this, "away-notify"),
cap_extendedjoin(this, "extended-join")
{
@@ -74,25 +76,21 @@ class ModuleIRCv3 : public Module
cap_extendedjoin.HandleEvent(ev);
if (accountnotify)
- {
cap_accountnotify.HandleEvent(ev);
+ }
- if (ev.id == "account_login")
- {
- AccountEvent* ae = static_cast<AccountEvent*>(&ev);
-
- // :nick!user@host ACCOUNT account
- // or
- // :nick!user@host ACCOUNT *
- std::string line = ":" + ae->user->GetFullHost() + " ACCOUNT ";
- if (ae->account.empty())
- line += "*";
- else
- line += std::string(ae->account);
-
- WriteNeighboursWithExt(ae->user, line, cap_accountnotify.ext);
- }
- }
+ void OnAccountChange(User* user, const std::string& newaccount) CXX11_OVERRIDE
+ {
+ // :nick!user@host ACCOUNT account
+ // or
+ // :nick!user@host ACCOUNT *
+ std::string line = ":" + user->GetFullHost() + " ACCOUNT ";
+ if (newaccount.empty())
+ line += "*";
+ else
+ line += newaccount;
+
+ WriteNeighboursWithExt(user, line, cap_accountnotify.ext);
}
void OnUserJoin(Membership* memb, bool sync, bool created, CUList& excepts) CXX11_OVERRIDE
diff --git a/src/modules/m_services_account.cpp b/src/modules/m_services_account.cpp
index aac0b9ce0..26a53b4d7 100644
--- a/src/modules/m_services_account.cpp
+++ b/src/modules/m_services_account.cpp
@@ -104,9 +104,12 @@ class AChannel_M : public SimpleChannelModeHandler
class AccountExtItemImpl : public AccountExtItem
{
+ Events::ModuleEventProvider eventprov;
+
public:
AccountExtItemImpl(Module* mod)
: AccountExtItem("accountname", ExtensionItem::EXT_USER, mod)
+ , eventprov(mod, "event/account")
{
}
@@ -123,14 +126,10 @@ class AccountExtItemImpl : public AccountExtItem
user->WriteNumeric(900, "%s %s :You are now logged in as %s",
user->GetFullHost().c_str(), value.c_str(), value.c_str());
}
-
- AccountEvent(creator, user, value).Send();
- }
- else
- {
- // Logged out
- AccountEvent(creator, user, "").Send();
}
+ // If value is empty then logged out
+
+ FOREACH_MOD_CUSTOM(eventprov, AccountEventListener, OnAccountChange, (user, value));
}
};