diff options
author | Sadie Powell <sadie@witchery.services> | 2024-08-29 13:14:39 +0100 |
---|---|---|
committer | Sadie Powell <sadie@witchery.services> | 2024-08-29 13:14:39 +0100 |
commit | 58a78e9aa50f0d61cecc42d9833542fe99cbed1d (patch) | |
tree | 3a0538d2023292fe94fe0acd3ab469b31b22fabe | |
parent | a3edb09eda6da745b630c935c8e7a1188e9dade9 (diff) |
Allow server admins to require that a display nick drops last.
Closes #348.
-rw-r--r-- | data/anope.example.conf | 1 | ||||
-rw-r--r-- | data/nickserv.example.conf | 6 | ||||
-rw-r--r-- | modules/nickserv/nickserv.cpp | 3 | ||||
-rw-r--r-- | modules/nickserv/ns_drop.cpp | 6 |
4 files changed, 16 insertions, 0 deletions
diff --git a/data/anope.example.conf b/data/anope.example.conf index 4d8220d2e..4abaff3e3 100644 --- a/data/anope.example.conf +++ b/data/anope.example.conf @@ -746,6 +746,7 @@ log * nickserv/cert - Can modify other users certificate lists * nickserv/confirm - Can confirm other users nicknames * nickserv/drop - Can drop other users nicks + * nickserv/drop/display - Allows dropping display nicks when preservedisplay is enabled * nickserv/drop/override - Allows dropping nicks without using a confirmation code * nickserv/recover - Can recover other users nicks * operserv/config - Can modify services's configuration diff --git a/data/nickserv.example.conf b/data/nickserv.example.conf index 31e1a2d50..8d24cde57 100644 --- a/data/nickserv.example.conf +++ b/data/nickserv.example.conf @@ -219,6 +219,12 @@ module * This directive is optional. If not set it defaults to 50. */ maxpasslen = 50 + + /* + * Whether all of the secondary nicks of a nick group have to expire or be + dropped before the display nick can expire or be dropped. + */ + preservedisplay = no } /* diff --git a/modules/nickserv/nickserv.cpp b/modules/nickserv/nickserv.cpp index a8ffa51e6..fc02ff50d 100644 --- a/modules/nickserv/nickserv.cpp +++ b/modules/nickserv/nickserv.cpp @@ -536,6 +536,9 @@ public: if (nickserv_expire && Anope::CurTime - na->last_seen >= nickserv_expire) expire = true; + if (na->nc->na == na && na->nc->aliases->size() > 1 && Config->GetModule("nickserv")->Get<bool>("preservedisplay")) + expire = false; + FOREACH_MOD(OnPreNickExpire, (na, expire)); if (expire) diff --git a/modules/nickserv/ns_drop.cpp b/modules/nickserv/ns_drop.cpp index c35792060..6042bf326 100644 --- a/modules/nickserv/ns_drop.cpp +++ b/modules/nickserv/ns_drop.cpp @@ -57,6 +57,12 @@ public: return; } + if (na->nc->na == na && na->nc->aliases->size() > 1 && Config->GetModule("nickserv")->Get<bool>("preservedisplay") && !source.HasPriv("nickserv/drop/display")) + { + source.Reply(_("You may not drop \002%s\002 as it is the display nick for the account."), na->nick.c_str()); + return; + } + auto *code = dropcode.Get(na); if (params.size() < 2 || ((!code || !code->equals_ci(params[1])) && (!source.HasPriv("nickserv/drop/override") || params[1] != "OVERRIDE"))) { |