Add lazy inactivity-expiry for accounts and channels
Accounts and channels now carry a last-activity stamp and are dropped once inactive past a configured threshold. A login stamps the account, a join stamps the channel — both coalesced to at most one log entry per day so routine traffic doesn't bloat the log, and stamps replicate so activity on any node keeps a record alive network-wide. Expiry is lazy in the proven style: a periodic pass computes it from the stored stamps with no per-record timer, reusing the same relation the vhost and suspension expiries use. The sweep spares operator accounts, accounts with a live session, occupied channels, and anything an operator has pinned with the new NOEXPIRE command (NickServ NOEXPIRE <account>, ChanServ NOEXPIRE <#channel>, both Priv::Admin). Each expiry is announced to the audit channel and clears the channel's +r. Configured under [expire] (accounts_days / channels_days); a zero or omitted field leaves that kind never expiring, and omitting the section disables expiry entirely.
This commit is contained in:
parent
698d604954
commit
253d4c2a2d
11 changed files with 413 additions and 13 deletions
|
|
@ -34,6 +34,7 @@ mod confirm;
|
|||
mod ajoin;
|
||||
#[path = "suspend.rs"]
|
||||
mod suspend;
|
||||
mod noexpire;
|
||||
#[path = "password.rs"]
|
||||
mod password;
|
||||
|
||||
|
|
@ -79,7 +80,8 @@ impl Service for NickServ {
|
|||
Some("AJOIN") => ajoin::handle(me, from, args, ctx, db),
|
||||
Some("SUSPEND") => suspend::handle(me, from, args, ctx, net, db, true),
|
||||
Some("UNSUSPEND") => suspend::handle(me, from, args, ctx, net, db, false),
|
||||
Some("HELP") => ctx.notice(me, from.uid, "NickServ looks after your nickname. Commands: \x02REGISTER\x02 <password> [email], \x02IDENTIFY\x02 [account] <password>, \x02INFO\x02 [account], \x02ALIST\x02, \x02GROUP\x02/\x02GLIST\x02/\x02UNGROUP\x02, \x02GHOST\x02 <nick> [password], \x02SET\x02 PASSWORD|EMAIL, \x02AJOIN\x02 ADD|DEL|LIST, \x02RESETPASS\x02 <account>, \x02CONFIRM\x02 <code>, \x02DROP\x02 <password>, \x02LOGOUT\x02, \x02CERT\x02 ADD|DEL|LIST <password> [fingerprint]. Operators also have \x02SUSPEND\x02/\x02UNSUSPEND\x02."),
|
||||
Some("NOEXPIRE") => noexpire::handle(me, from, args, ctx, db),
|
||||
Some("HELP") => ctx.notice(me, from.uid, "NickServ looks after your nickname. Commands: \x02REGISTER\x02 <password> [email], \x02IDENTIFY\x02 [account] <password>, \x02INFO\x02 [account], \x02ALIST\x02, \x02GROUP\x02/\x02GLIST\x02/\x02UNGROUP\x02, \x02GHOST\x02 <nick> [password], \x02SET\x02 PASSWORD|EMAIL, \x02AJOIN\x02 ADD|DEL|LIST, \x02RESETPASS\x02 <account>, \x02CONFIRM\x02 <code>, \x02DROP\x02 <password>, \x02LOGOUT\x02, \x02CERT\x02 ADD|DEL|LIST <password> [fingerprint]. Operators also have \x02SUSPEND\x02/\x02UNSUSPEND\x02 and \x02NOEXPIRE\x02 <account> {ON|OFF}."),
|
||||
Some(other) => ctx.notice(me, from.uid, format!("I don't know the command \x02{other}\x02. Try \x02HELP\x02.")),
|
||||
None => {}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue