on *:start:l.start
on *:exit:l.stop
alias l.start {
  if (!$hget(lockin)) {
    hmake lockin
    if ($isfile(lockin.hsh)) hload lockin lockin.hsh
    .enable #lockin
    return * Started lock-in
  }
}
alias l.stop {
  if ($hget(lockin)) {
    hsave -o lockin lockin.hsh
    hfree lockin
    .disable #lockin
    return * Halted lock-in
  }
}
alias l.check {
  if ($hget(lockin,$1).item) {
    return $hget(lockin,$1)
  }
}
alias l.add {
  if ($hget(lockin)) {
    if (!$l.check($1)) {
      hadd lockin $1 $iif($left($2,1) == $chr(35),$2,$chr(35))
    }
    elseif ($2) {
      var %chans = $addtok($l.check($1),$2,32)
      hadd lockin $1 %chans
    }
    if ($hget(lockin,$1)) && ($group(#actvmon) == on) l.aupdate
  }
}
alias l.del {
  if ($hget(lockin)) {
    if ($l.check($1)) { 
      if ($2 isin $v1) {
        var %chans = $remove($hget(lockin,$1),$2)
        if (%chans) hadd lockin $1 %chans
        else hdel lockin $1
      }
      else hdel lockin $1
      .notify -r $1
    }
  }
}
menu nicklist {
  Lock-in
  .$iif($group(#lockin) == on,Dis,En) $+ able: $($iif($group(#lockin) == on,l.stop,l.start),2)
  .$hget(lockin,0).item item(s):return
  .-
  .$iif($group(#actvmon) == on,$style(1)) Active Monitor:{
    $iif($group(#actvmon) == on,l.adowndate,l.aupdate)
    $+(.,$iif($group(#actvmon) == on,dis,en),able) #actvmon
  }
  .$iif($group(#actvmon) != on || !$l.check($1),$style(2)) Options
  ..$iif($group(#lockin) != on,$style(2)) Update:l.aupdate
  ..-
  ..$iif($notify($1).note == lockin,Delete,Add) :.notify $iif($notify($1).note == lockin,-r) $1 lockin
  .-
  .$iif($chan isin $l.check($1),Remove,Add) : $iif($chan isin $l.check($1),l.del $1 $chan,l.add $1 $chan)
  .$iif(!$l.check($1),$style(2)) Channels
  ..$l.check($1) :return
}
#lockin on
on !*:part:#:{
  var %chans = $l.check($nick)
  if ($chan isin %chans) {
    if (o isincs $usermode) {
      sajoin $nick $chan
    }
  }
}
on *:kick:#:{
  var %chans = $l.check($knick)
  if ($chan isin %chans) {
    if (o isincs $usermode) {
      sajoin $knick $chan
    }
  }
}
#lockin end
alias l.aupdate {
  var %n = 1,%chans
  while ($hget(lockin,%n).item) {
    if (!$notify($v1)) .notify $hget(lockin,%n).item lockin
    inc %n
  }
}
alias l.adowndate {
  var %n = 1
  while ($notify(%n).note == lockin) {
    .notify -r $notify(%n)
    inc %n
  }
}
#actvmon off
on ^*:notify:{
  if ($notify($nick).note == lockin) && $l.check($nick) {
    var %n = 1
    while ($gettok($l.check($nick),%n,32)) {
      sajoin $nick $v1
      inc %n
    }
  }
  haltdef
}
#actvmon end
