code: func (st *stateTracker) Associate(c, n string) *ChanPrivs {
  	st.mu.Lock()
  	defer st.mu.Unlock()
  	nk, nok := st.nicks[n]
  	ch, cok := st.chans[c]
  
  	if !cok {
  		// As we can implicitly delete both nicks and channels from being
  		// tracked by dissociating one from the other, we should verify that
  		// we're not being passed an old Nick or Channel.
  		logging.Error("Tracker.Associate(): channel %s not found in "+
  			"internal state.", c)
  		return nil
  	} else if !nok {
  		logging.Error("Tracker.Associate(): nick %s not found in "+
  			"internal state.", n)
  		return nil
  	} else if _, ok := nk.isOn(ch); ok {
  		logging.Warn("Tracker.Associate(): %s already on %s.",
  			nk, ch)
  		return nil
  	}
  	cp := new(ChanPrivs)
  	ch.addNick(nk, cp)
  	nk.addChannel(ch, cp)
  	return cp.Copy()
  }
docs: // Associates an already known nick with an already known channel.