@@ -48,29 +48,31 @@
48 48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
provisionedAt time.Time
49 49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
50 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
51 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// Manager provisions and maintains IRC channel topology.
52 52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
type Manager struct {
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ircAddr string
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nick string
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- password string
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- log *slog.Logger
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- policy *Policy
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- client *girc.Client
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ircAddr string
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nick string
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ password string
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ operPass string // oper password for SAMODE access
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log *slog.Logger
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ policy *Policy
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ client *girc.Client
59 60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
60 61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mu sync.Mutex
61 62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
channels map[string]channelRecord // channel name → record
62 63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
63 64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
64 65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// NewManager creates a topology Manager. nick and password are the Ergo
65 66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// credentials of the scuttlebot oper account used to manage channels.
66 67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// policy may be nil if the caller only uses the manager for ad-hoc provisioning.
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- func NewManager(ircAddr, nick, password string, policy *Policy, log *slog.Logger) *Manager {
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func NewManager(ircAddr, nick, password, operPass string, policy *Policy, log *slog.Logger) *Manager {
68 69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return &Manager{
69 70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ircAddr: ircAddr,
70 71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nick: nick,
71 72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
password: password,
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ operPass: operPass,
72 74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
policy: policy,
73 75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
log: log,
74 76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
channels: make(map[string]channelRecord),
75 77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
76 78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -96,10 +98,14 @@
96 98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SSL: false,
97 99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
})
98 100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
99 101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
connected := make(chan struct{})
100 102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
c.Handlers.AddBg(girc.CONNECTED, func(client *girc.Client, e girc.Event) {
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // OPER up for SAMODE access.
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if m.operPass != "" {
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ client.Cmd.SendRawf("OPER scuttlebot %s", m.operPass)
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
101 107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
close(connected)
102 108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
})
103 109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
104 110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
go func() {
105 111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if err := c.Connect(); err != nil {
@@ -213,16 +219,23 @@
213 219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
214 220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if ch.Topic != "" {
215 221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m.chanserv("TOPIC %s %s", ch.Name, ch.Topic)
216 222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
217 223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- // Use AMODE for persistent auto-mode on join (survives reconnects).
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // Set persistent auto-modes. Use ChanServ AMODE when possible,
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // and SAMODE (oper) as immediate fallback.
219 226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for _, nick := range ch.Ops {
220 227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m.chanserv("AMODE %s +o %s", ch.Name, nick)
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if m.operPass != "" {
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ m.client.Cmd.SendRawf("SAMODE %s +o %s", ch.Name, nick)
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
221 231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
222 232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for _, nick := range ch.Voice {
223 233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m.chanserv("AMODE %s +v %s", ch.Name, nick)
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if m.operPass != "" {
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ m.client.Cmd.SendRawf("SAMODE %s +v %s", ch.Name, nick)
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
224 237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
225 238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
226 239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// Apply channel modes (e.g. +m for moderated).
227 240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for _, mode := range ch.Modes {
228 241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m.client.Cmd.Mode(ch.Name, mode)
@@ -296,12 +309,18 @@
296 309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
297 310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
298 311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
switch strings.ToUpper(level) {
299 312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case "OP":
300 313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m.chanserv("AMODE %s +o %s", channel, nick)
314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if m.operPass != "" && m.client != nil {
315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ m.client.Cmd.SendRawf("SAMODE %s +o %s", channel, nick)
316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
301 317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case "VOICE":
302 318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m.chanserv("AMODE %s +v %s", channel, nick)
319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if m.operPass != "" && m.client != nil {
320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ m.client.Cmd.SendRawf("SAMODE %s +v %s", channel, nick)
321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
303 322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
default:
304 323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m.log.Warn("unknown access level", "level", level)
305 324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
306 325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
307 326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m.log.Info("granted channel access (AMODE)", "nick", nick, "channel", channel, "level", level)
308 327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!