code: func (st *stateTracker) Dissociate(c, n string) {
  	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.Dissociate(): channel %s not found in "+
  			"internal state.", c)
  	} else if !nok {
  		logging.Error("Tracker.Dissociate(): nick %s not found in "+
  			"internal state.", n)
  	} else if _, ok := nk.isOn(ch); !ok {
  		logging.Warn("Tracker.Dissociate(): %s not on %s.",
  			nk.nick, ch.name)
  	} else if nk == st.me {
  		// I'm leaving the channel for some reason, so it won't be tracked.
  		st.delChannel(ch)
  	} else {
  		// Remove the nick from the channel and the channel from the nick.
  		ch.delNick(nk)
  		nk.delChannel(ch)
  		if len(nk.chans) == 0 {
  			// We're no longer in any channels with this nick.
  			st.delNick(nk)
  		}
  	}
  }
docs: // Dissociates an already known nick from an already known channel.
  // Does some tidying up to stop tracking nicks we're no longer on
  // any common channels with, and channels we're no longer on.