@@ -286,10 +286,11 @@
286 286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
errCh <- err
287 287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
288 288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}()
289 289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
290 290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
go b.joinLoop(ctx, c)
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ go b.namesRefreshLoop(ctx)
291 292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
292 293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
select {
293 294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case <-ctx.Done():
294 295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
c.Close()
295 296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return nil
@@ -457,10 +458,39 @@
457 458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
func (b *Bot) RefreshNames(channel string) {
458 459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if b.client != nil {
459 460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
b.client.Cmd.SendRawf("NAMES %s", channel)
460 461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
461 462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // namesRefreshLoop periodically sends NAMES for all joined channels so
465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // girc's user tracking stays in sync with the server.
466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func (b *Bot) namesRefreshLoop(ctx context.Context) {
467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // Wait for initial connection and bot joins to settle.
468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ select {
469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case <-ctx.Done():
470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case <-time.After(30 * time.Second):
472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ticker := time.NewTicker(30 * time.Second)
474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ defer ticker.Stop()
475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for {
476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ select {
477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case <-ctx.Done():
478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case <-ticker.C:
480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b.mu.RLock()
481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ channels := make([]string, 0, len(b.joined))
482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for ch := range b.joined {
483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ channels = append(channels, ch)
484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b.mu.RUnlock()
486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for _, ch := range channels {
487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b.RefreshNames(ch)
488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
462 492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
463 493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// Users returns the current nick list for a channel — IRC connections plus
464 494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// web UI users who have posted recently within the configured TTL.
465 495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
func (b *Bot) Users(channel string) []string {
466 496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
seen := make(map[string]bool)
467 497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!