All pastes #63541 Raw Edit

Stuff

public text v1 · immutable
#63541 ·published 2006-06-10 06:20 UTC
rendered paste body
; --- module autojoin


; --- load dependencies

on *:load:{
  setgroups
}


; --- unload clean

on *:unload:{
  .timerkickstart off
  .timerautojoinretry.* off
  .timerjoin.* off
  .timerautojoinslow.* off
  .timerautojoincheck.* off
}


; --- groups

on *:signal:setgroups:{
  setgroups
}
alias -l setgroups {
  setgroup autojoin_noflood $inf(autojoin,noflood)
  setgroup autojoin_recovermain $inf(autojoin,recovermain)
}


; --- register toggles

on *:signal:set.autojoin.noflood:{ setgroup autojoin_noflood $1 }
on *:signal:set.autojoin.recovermain:{ setgroup autojoin_recovermain $1 }


; --- autojoin noflood -> partall on disconnect

#autojoin_noflood off

on *:disconnect:{
  if (($status !== closing) && ($chan(0))) {
    .partall
    secho closed all channels to prevent autojoin excess flood
  }
}

#autojoin_noflood end


; --- autojoin recover main nick

#autojoin_recovermain on

on *:signal:afternickreclaim:{
  if ($timer(autojoincheck. $+ $cid)) {
    .timerautojoincheck. $+ $cid off
    autojoincheck
  }
}

#autojoin_recovermain end


; --- autojoin

on *:connect:{
  if (($inf(autojoin,recovermain)) && ($me == $anick)) {
    .timerautojoincheck. $+ $cid 1 $inf(autojoin,recovermain.secs) autojoincheck
    $reclaimnick($mnick).add
  }
  else {
    autojoincheck
  }
}
alias autojoincheck {
  .timer 1 5 $!iif(($doautojoin),secho hold left mouse button now to skip autojoin,.timerjoin. $+ $cid off)
  .timerjoin. $+ $cid 1 8 $!iif((($appactive) && ($mouse.key & 1)),secho skipping autojoin channels...,autojoin)
}
alias autojoin {
  if (!$server) { error you're not on a server | return }
  if ($inf(autojoin,kickstart)) { .timerkickstart 4 8 .timerlag -e }
  if ($inf(autojoin,retry)) {
    if (!$r.tmp(autojoin.retry)) {
      w.tmp autojoin.retry 1
      .timerautojoinretry. $+ $cid 1 $calc(60 * $inf(autojoin,retry.mins)) autojoin
    }
    else { d.tmp autojoin.retry }
  }
  if ($inf(autojoin,noflood)) { autojoinslow }
  else { autojoinnormal }
}
alias doautojoin {
  if ($cutcomchans($ch($inf(autojoin,ch)))) {
    return $true
  }
}
alias -l cutcomchans {
  var %k = $1,%o = $numtok($1,44) | while (%o) {
    if ($me ison $gettok($1,%o,44)) { %k = $remtok(%k,$gettok($1,%o,44),44) }
    dec %o
  }
  return %k
}
alias autojoinnormal {
  if ($cutcomchans($ch($inf(autojoin,ch)))) {
    var %chans,%i = 1,%k = $v1,%net = $getnet,%o = $numtok(%k,44) | while (%i <= %o) {
      if ($autojoinchannel(%net,$gettok(%k,%i,44)) !== $null) { %chans = $addtok(%chans,$v1,44) }
      inc %i
    }
    if (%chans !== $null) { .join $iif(($inf(autojoin,maximize)),-x,-n) %chans }
  }
}
alias -l autojoinchannel {
  ; $1 = network, $2 = channel
  var %i = $+($1,.,$2)
  if ($dat(autojoin,%i).exists) {
    var %type = $dat(autojoin,%i).type
    if (%type == normal) { if ($isid) { return $2 } | .join $iif(($inf(autojoin,maximize)),-x,-n) $2 }
    elseif (%type == key) { .join $iif(($inf(autojoin,maximize)),-x,-n) $2 $dat(autojoin,%i).key }
    elseif (%type == invite) { chanservinvite $2 }
    else { dbout autojoinchannel unknown autojoinchannel type :: $1- }
  }
  else { dbout autojoinchannel no such autojoin object :: $1- }
}
alias autojoinslow {
  var %chans = $cutcomchans($ch($inf(autojoin,ch)))
  if (%chans !== $null) {
    w.tmp autojoinslow %chans
    .timerautojoinslow. $+ $cid $numtok(%chans,44) 4 autojoinslowchan
  }
}
alias autojoinslowchan {
  var %chans = $r.tmp(autojoinslow)
  autojoinchannel $getnet $gettok(%chans,1,44)
  if ($deltok(%chans,1,44) !== $null) { w.tmp autojoinslow $v1 }
  else { d.tmp autojoinslow }
}


; --- autojoin key sync

on *:servermode:#:{
  autojoinsynckey $1-
}
on *:mode:#:{
  autojoinsynckey $1-
}
alias -l autojoinsynckey {
  ; $1- = modes
  if ((k isincs $1) && ($chan($chan).key !== $null) && ($isautojoin == key) && ($chan($chan).key !== $dat(autojoin,$+($getnet,.,$chan)).key)) {
    $dat(autojoin,$+($getnet,.,$chan),$chan($chan).key).keyset
  }
}


; --- autojoin channel popup menu

alias -l autojoinswap {
  ; $1 = channel, $2 = type
  if (($2 == key) && (!$channelisautojoinoftype($1,$2))) { tokenize 32 $1-2 $$innput(enterkey) }
  if ($toggleautojoinchannel($1,$2,$3)) {
    aecho added $cborder($1) to the $cbrack($2 autojoin list) $iif(($2 == key),$csvu(with key,$3))
  }
  else {
    aecho $cborder($1) is no longer autojoined
  }
}
alias -l isautojoin {
  ; !$1-
  if ($chn(autojoin).getsafe) { return $dat(autojoin,$+($getnet,.,$chan)).type }
}
alias -l channelisautojoinoftype {
  ; $1 = channel, $2 = type
  if (($dat(autojoin,$+($getnet,.,$1)).exists) && ($dat(autojoin,$+($getnet,.,$1)).type == $2)) { return 1 }
}
alias -l remchannelfromautojoin {
  ; $1 = channel
  if ($ch(autojoin,$1).is) { $ch(autojoin,$1).toggle }
  if ($dat(autojoin,$+($getnet,.,$1)).exists) {
    $dat(autojoin,$+($getnet,.,$1)).del
  }
}
alias -l toggleautojoinchannel {
  ; $1 = channel, $2 = type, $?3 = key
  var %removefromautojoin = $channelisautojoinoftype($1,$2)
  remchannelfromautojoin $1
  if (!%removefromautojoin) {
    $ch_addchanneltoservice($1,autojoin)
    if ($2 == key) { $new($+($getnet,.,$1),type $2,key $3).autojoin }
    else { $new($+($getnet,.,$1),type $2).autojoin }
    return 1
  }
}


; --- popup autojoin

#autojoin_popup on

menu channel {
  $iif(($isautojoin),$style(1)) autojoin
  .$iif(($isautojoin == normal),$style(1)) normal autojoin { autojoinswap $chan normal }
  .$iif(($isautojoin == key),$style(1)) key autojoin { autojoinswap $chan key }
  .$iif(($isautojoin == invite),$style(1)) chanserv invite autojoin { autojoinswap $chan invite }
  .-
  .settings... { autojoinsettings }
  .this system is $bord($enof($inf(autojoin,on))) { togglesets on autojoin the autojoin system }
}
menu status {
  autojoin
  .$iif((($$server) && ($$doautojoin)),autojoin now) { autojoin }
  .settings... { autojoinsettings }
  .-
  .this system is $bord($enof($inf(autojoin,on))) { togglesets on autojoin the autojoin system }
}
alias -l autojoinsettings {
  dopen general
  did -fu general 314
}

#autojoin_popup end