@@ -24,18 +24,21 @@
24 24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Name string
25 25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
26 26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// Topic is the initial channel topic (shared state header).
27 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Topic string
28 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- // Ops is a list of nicks to grant +o (channel operator) status.
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // Ops is a list of nicks to grant +o (channel operator) status via AMODE.
30 30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Ops []string
31 31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- // Voice is a list of nicks to grant +v status.
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // Voice is a list of nicks to grant +v status via AMODE.
33 33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Voice []string
34 34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
35 35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// Autojoin is a list of bot nicks to invite after provisioning.
36 36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Autojoin []string
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // Modes is a list of channel modes to set (e.g. "+m" for moderated).
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Modes []string
37 40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
38 41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
39 42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// channelRecord tracks a provisioned channel for TTL-based reaping.
40 43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
type channelRecord struct {
41 44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
name string
@@ -207,15 +210,21 @@
207 210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
208 211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if ch.Topic != "" {
209 212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m.chanserv("TOPIC %s %s", ch.Name, ch.Topic)
210 213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
211 214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // Use AMODE for persistent auto-mode on join (survives reconnects).
212 216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for _, nick := range ch.Ops {
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- m.chanserv("ACCESS %s ADD %s OP", ch.Name, nick)
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ m.chanserv("AMODE %s +o %s", ch.Name, nick)
214 218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
215 219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for _, nick := range ch.Voice {
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- m.chanserv("ACCESS %s ADD %s VOICE", ch.Name, nick)
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ m.chanserv("AMODE %s +v %s", ch.Name, nick)
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // Apply channel modes (e.g. +m for moderated).
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for _, mode := range ch.Modes {
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ m.client.Cmd.Mode(ch.Name, mode)
217 226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
218 227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
219 228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if len(ch.Autojoin) > 0 {
220 229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m.Invite(ch.Name, ch.Autojoin)
221 230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -274,27 +283,37 @@
274 283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m.log.Info("reaping expired ephemeral channel", "channel", rec.name, "age", now.Sub(rec.provisionedAt).Round(time.Minute))
275 284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m.DropChannel(rec.name)
276 285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
277 286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
278 287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- // GrantAccess sets a ChanServ ACCESS entry for nick on the given channel.
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- // level is "OP" or "VOICE". If level is empty, no access is granted.
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // GrantAccess sets a ChanServ AMODE entry for nick on the given channel.
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // level is "OP" or "VOICE". AMODE persists across reconnects — ChanServ
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // automatically applies the mode every time the nick joins.
281 291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
func (m *Manager) GrantAccess(nick, channel, level string) {
282 292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if m.client == nil || level == "" {
283 293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
284 294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- m.chanserv("ACCESS %s ADD %s %s", channel, nick, level)
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- m.log.Info("granted channel access", "nick", nick, "channel", channel, "level", level)
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch strings.ToUpper(level) {
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case "OP":
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ m.chanserv("AMODE %s +o %s", channel, nick)
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case "VOICE":
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ m.chanserv("AMODE %s +v %s", channel, nick)
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ default:
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ m.log.Warn("unknown access level", "level", level)
302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ m.log.Info("granted channel access (AMODE)", "nick", nick, "channel", channel, "level", level)
287 305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
288 306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- // RevokeAccess removes a ChanServ ACCESS entry for nick on the given channel.
307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // RevokeAccess removes ChanServ AMODE entries for nick on the given channel.
290 308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
func (m *Manager) RevokeAccess(nick, channel string) {
291 309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if m.client == nil {
292 310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
293 311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- m.chanserv("ACCESS %s DEL %s", channel, nick)
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- m.log.Info("revoked channel access", "nick", nick, "channel", channel)
312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ m.chanserv("AMODE %s -o %s", channel, nick)
313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ m.chanserv("AMODE %s -v %s", channel, nick)
314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ m.log.Info("revoked channel access (AMODE)", "nick", nick, "channel", channel)
296 315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
297 316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
298 317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
func (m *Manager) chanserv(format string, args ...any) {
299 318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
msg := fmt.Sprintf(format, args...)
300 319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m.client.Cmd.Message("ChanServ", msg)
301 320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!