Peace and Protection — File Browser

PeaceandProtectionv4.22.8 / PeaceandProtectionv4.22.8 / Peace-and-Protection-master / script / protedit.mrc

protedit.mrc — 27.17 KB — Download this file

; #= P&P.temp -rs
; ########################################
; Peace and Protection
; Protection system editing (channel)
; ########################################

; Channel protection config dialog

alias _protedit if ($_ischan($1)) { set -u %.editing $1 | set -u %.create 1 } | elseif (($1 == $null) && ($active ischan)) { set -u %.editing $active | set -u %.create 0 } | _dialog -md chanprot chanprot
dialog chanprot {
  title "Channel Protection"
  icon script\pnp.ico
  option dbu
  size -1 -1 250 175

  list 250, 1 1 1 1, hide

  box "Channel:", 249, 2 2 245 25

  text "&Edit protection for:", 248, 5 13 52 10, right

  combo 247, 60 11 85 100, drop sort

  button "&Add...", 246, 150 11 45 10
  button "&Remove...", 245, 200 11 40 10

  text "&Editing settings for:", 244, 5 34 52 10, right

  combo 243, 60 32 85 100, drop

  box "", 242, 2 45 245 108

  text "User will be punished for:", 33, 7 55 125 8

  text "", 1, 6 67 42 8, right
  combo 2, 50 65 46 60, drop
  edit "", 3, 100 65 20 11
  text "", 4, 121 67 35 8
  text "", 5, 121 67 70 8
  edit "", 6, 156 65 17 11
  text "", 7, 174 67 27 8
  button "&Actions...", 8, 205 65 37 10

  text "", 9, 6 80 42 8, right
  combo 10, 50 78 46 60, drop
  edit "", 11, 100 78 20 11
  text "", 12, 121 80 35 8
  text "", 13, 121 80 70 8
  edit "", 14, 156 78 17 11
  text "", 15, 174 80 27 8
  button "&Actions...", 16, 205 78 37 10

  text "", 17, 6 93 42 8, right
  combo 18, 50 91 46 60, drop
  edit "", 19, 100 91 20 11
  text "", 20, 121 93 35 8
  text "", 21, 121 93 70 8
  edit "", 22, 156 91 17 11
  text "", 23, 174 93 27 8
  button "&Actions...", 24, 205 91 37 10

  text "", 25, 6 106 42 8, right
  combo 26, 50 104 46 60, drop
  edit "", 27, 100 104 20 11
  text "", 28, 121 106 35 8
  text "", 29, 121 106 70 8
  edit "", 30, 156 104 17 11
  text "", 31, 174 106 27 8
  button "&Actions...", 32, 205 104 37 10

  box "Advanced", 34, 3 82 243 5, hide
  check "&Enable mass join flood protection: Temporarily set modes", 35, 8 96 142 8, 3state hide
  edit "", 53, 151 94 20 11, autohs hide
  text "for:", 54, 172 96 10 8, hide
  edit "", 36, 7 105 15 11, hide
  text "percent joins within", 37, 23 107 71 8, hide
  edit "", 38, 94 105 17 11, hide
  text "seconds (min.", 39, 113 107 42 8, hide
  edit "", 40, 155 105 17 11, hide
  text "joins, max.", 41, 173 107 35 8, hide
  edit "", 42, 209 105 17 11, hide
  text "joins)", 43, 227 107 15 8, hide
  check "&Enable channel limit protection: Maintain channel limit of:", 44, 8 126 150 8, 3state hide
  edit "", 45, 7 135 15 11, hide
  text "percent extra, refresh after", 46, 23 137 71 8, hide
  edit "", 47, 94 135 17 11, hide
  text "seconds (min.", 48, 113 137 42 8, hide
  edit "", 49, 155 135 17 11, hide
  text "extra, max.", 50, 173 137 35 8, hide
  edit "", 51, 209 135 17 11, hide
  text "extra)", 52, 227 137 15 8, hide

  check "&Detect bans against you", 55, 50 93 67 8, 3state hide
  check "&Ignore bans of *!*@*", 56, 122 93 65 8, 3state hide
  check "&Detect clones only if same ident", 57, 50 105 100 8, 3state hide
  check "&Deop unrecognized users who become opped", 58, 50 117 125 8, 3state hide
  check "&Deop unrecognized users opped by a server", 59, 50 129 125 8, 3state hide

  text "r", 60, 1 1 1 1, hide

  check "&One topic equals", 61, 35 119 65 8, 3state hide
  edit "", 62, 100 117 20 11, hide
  text "lines", 63, 121 119 50 8, hide
  check "&Sound requests equal", 64, 35 131 65 8, 3state hide
  edit "", 65, 100 130 20 11, hide
  text "lines", 66, 121 132 50 8, hide

  text "r", 67, 1 1 1 1, hide

  check "&Invalid DCC protection enabled", 68, 50 92 100 8, 3state hide
  check "&CTCPs will actually be 'counted' as this many CTCPs for flood detection:", 69, 7 108 177 8, 3state hide
  text "PING:", 70, 17 119 22 8, hide
  text "ECHO:", 71, 17 130 22 8, hide
  text "TIME:", 72, 17 141 22 8, hide
  text "VERSION:", 73, 62 119 35 8, hide
  text "USERINFO:", 74, 62 130 35 8, hide
  text "CLIENTINFO:", 75, 62 141 35 8, hide
  text "SOUND:", 76, 125 119 25 8, hide
  text "XDCC:", 77, 125 130 25 8, hide
  text "DCC:", 78, 125 141 25 8, hide
  text "FINGER:", 79, 177 119 25 8, hide
  text "Other:", 80, 177 130 25 8, hide
  text "Replies:", 81, 177 141 25 8, hide
  edit "", 82, 35 117 20 11, hide
  edit "", 83, 35 128 20 11, hide
  edit "", 84, 35 139 20 11, hide
  edit "", 85, 97 117 20 11, hide
  edit "", 86, 97 128 20 11, hide
  edit "", 87, 97 139 20 11, hide
  edit "", 88, 150 117 20 11, hide
  edit "", 89, 150 128 20 11, hide
  edit "", 90, 150 139 20 11, hide
  edit "", 91, 202 117 20 11, hide
  edit "", 92, 202 128 20 11, hide
  edit "", 93, 202 139 20 11, hide

  check "&Detect mode of +l 1", 94, 50 119 153 8, 3state hide
  button "&Actions...", 96, 205 117 37 10, hide
  check "&Detect two or more of: +k, +l, and +i, set in one line", 95, 50 131 153 8, 3state hide
  button "&Actions...", 97, 205 130 37 10, hide

  check "&Enable word 'kicks', group one", 98, 50 66 85 8, 3state hide
  button "&Words...", 99, 137 65 50 10, hide
  check "&Enable word 'kicks', group two", 100, 50 79 85 8, 3state hide
  button "&Words...", 101, 137 78 50 10, hide
  check "&Scan users for 'bad' channels", 102, 50 92 85 8, 3state hide
  button "&Channels...", 103, 137 91 50 10, hide

  check "&Enforce bans (kick any non-op who is banned)", 118, 50 55 125 8, 3state hide
  check "&Ops immune from text protections", 119, 50 66 125 8, 3state hide
  check "&Halfops immune from text protections", 121, 50 75 127 8, 3state hide
  check "&Voiced users immune from text protections", 120, 50 84 125 8, 3state hide
  check "&Text protections enabled (according to settings)", 109, 50 95 150 8, 3state hide
  check "&CTCP/DCC protections enabled (according to settings)", 110, 50 104 150 8, 3state hide
  check "&All other protections enabled (according to settings)", 111, 50 113 150 8, 3state hide
  text "&Allow", 112, 57 126 15 8, hide
  edit "", 113, 72 124 20 11, hide
  text "seconds before moving to next action", 114, 95 126 125 8, hide
  text "&Wait", 115, 57 138 15 8, hide
  edit "", 116, 72 136 20 11, hide
  text "seconds before resetting to first action", 117, 95 138 125 8, hide

  text "(note- attributes include colors, bold, underline, etc)", 122, 40 117 150 8, hide

  button "OK", 241, 15 158 27 12, OK default
  button "Cancel", 240, 50 158 27 12, cancel
  button "&Help", 239, 85 158 27 12, disable

  edit "", 238, 1 1 1 1, hide autohs
  edit "", 235, 1 1 1 1, hide autohs
  edit "", 234, 1 1 1 1, hide autohs

  text "Note:", 236, 130 160 17 10, right
  check "= use global default settings", 237, 150 160 100 8, 3state
}
on *:DIALOG:chanprot:init:*:{
  did -cu chanprot 237
  did -a chanprot 250 * $hget(pnp.config,cflags)
  did -ac chanprot 247 ( $+ Default settings $+ )

  window -hl @.chanprot
  filter -fw $_cfg(cfgvar.dat) @.chanprot cflags.*
  var %chan,%num = 1
  :loop1
  if ($line(@.chanprot,%num)) {
    %chan = $right($gettok($ifmatch,1,32),-7)
    if (%.editing == %chan) { did -ac chanprot 247 %chan | unset %.editing }
    else did -a chanprot 247 %chan
    did -a chanprot 250 %chan $gettok($line(@.chanprot,%num),2-,32)
    inc %num | goto loop1
  }
  window -c @.chanprot
  if ((%.editing) && (%.create)) {
    did -ac chanprot 247 %.editing
    did -a chanprot 250 %.editing $_p2s($str(?,80))
  }

  unset %.editing %.create

  %num = 2
  :loop2
  loadbuf -otprotlvl chanprot %num script\dlgtext.dat
  if (%num < 26) { inc %num 8 | goto loop2 }

  loadbuf -otprotcat chanprot 243 script\dlgtext.dat

  if ($_dlgi(chanprot) isnum) %num = $ifmatch
  else %num = 7
  _findcurrsel
  did -c chanprot 243 %num
  _showsetn %num
  _loadother
}
on *:DIALOG:chanprot:sclick:241:{
  _dlgw chanprot $did(243).sel
  ; save settings, remove any channels that were deleted
  _saveother
  _saveset

  `set cflags $gettok($did(250,1),2-,32)

  window -hl @.chanprot
  filter -fw $_cfg(cfgvar.dat) @.chanprot cflags.*
  var %doing,%filter,%chan,%num = 2
  :loop1
  if ($did(250,%num) != $null) {
    %chan = cflags. $+ $gettok($ifmatch,1,32)
    if ($gettok($ifmatch,2-,32) != $_p2s($str(?,80))) {
      `set %chan $gettok($did(250,%num),2-,32)
      %chan = %chan *
      %filter = $fline(@.chanprot,%chan,0)
      :loop1b
      if (%filter) {
        if ($gettok($line(@.chanprot,$fline(@.chanprot,%chan,%filter)),1,32) == $gettok(%chan,1,32)) dline @.chanprot $fline(@.chanprot,%chan,%filter)
        else { dec %filter | goto loop1b }
      }
    }
    else `set %chan
    inc %num |  goto loop1
  }

  window -hl @.actions
  loadbuf @.actions $_cfg(actions.dat)

  :loop2
  if ($line(@.chanprot,1) != $null) {
    %chan = $gettok($ifmatch,1,32)
    `set %chan
    %chan = $right(%chan,-7)
    `set wordk1. $+ %chan
    `set wordk2. $+ %chan
    `set pervscan. $+ %chan

    %doing = * $+ %chan *
    %filter = $fline(@.actions,%doing,0)
    :loop2b
    if (%filter) {
      if ($right($gettok($line(@.actions,$fline(@.actions,%doing,%filter)),1,32),$len(%chan)) == %chan) dline @.actions $fline(@.actions,%doing,%filter)
      dec %filter | goto loop2b
    }

    dline @.chanprot 1
    goto loop2
  }

  savebuf @.actions $_cfg(actions.dat)
  close -@ @.actions @.chanprot
  _upd.prot

  _unload protedit
}
on *:DIALOG:chanprot:sclick:240:_unload protedit
on *:DIALOG:chanprot:sclick:237:did -cu chanprot 237
on *:DIALOG:chanprot:sclick:243:_saveset | _showsetn $did($did).sel
on *:DIALOG:chanprot:sclick:247:{
  _saveother
  _saveset
  _findcurrsel
  _showset $did(238)
  _loadother
}
alias -l _findcurrsel {
  if ($left($did(chanprot,247,$did(chanprot,247).sel),1) == $chr(40)) {
    did -c chanprot 250 1
    did -o chanprot 235 1 *
  }
  else {
    did -o chanprot 235 1 $did(chanprot,247,$did(chanprot,247).sel)
    var %num = 1
    :loop
    if ($gettok($did(chanprot,250,%num),1,32) == $did(chanprot,235)) did -c chanprot 250 %num
    else { inc %num |  goto loop }
  }
  did -o chanprot 234 1 $gettok($did(chanprot,250,$did(chanprot,250).sel),2-,32)
}
on *:DIALOG:chanprot:sclick:96:_pae model $did(235)
on *:DIALOG:chanprot:sclick:97:_pae tover $did(235)
on *:DIALOG:chanprot:sclick:99:_wcled wordk1. $did(235) Word
on *:DIALOG:chanprot:sclick:101:_wcled wordk2. $did(235) Word
on *:DIALOG:chanprot:sclick:103:_wcled pervscan. $did(235) Channel
on *:DIALOG:chanprot:sclick:246:_saveother | _saveset | _cpar a
on *:DIALOG:chanprot:sclick:245:_saveother | _saveset | _cpar r
alias -l _cpar {
  if ($1 == r) {
    if ($did(chanprot,235) == *) _error You cannot delete the default settings.
    _okcancel 1 Delete channel-specific settings for $did(chanprot,235) $+ ?
    did -d chanprot 247 $did(chanprot,247).sel
    did -d chanprot 250 $did(chanprot,250).sel
    did -c chanprot 247 $did(chanprot,247).lines
    _findcurrsel
  }
  else {
    var %newchan = $_rentry($chr(35),0,$active,New channel to edit protection settings for?)
    if (!$_ischan(%newchan)) _error That is not a valid channel name.
    var %num = $did(chanprot,250).lines
    :loop1
    if ($gettok($did(chanprot,250,%num),1,32) == %newchan) _error That channel already has protection settings.Select it from the drop-down menu to edit the settings.
    elseif (%num > 1) { dec %num |  goto loop1 }
    if ($did(chanprot,247).lines == 1) var %basedon = ( $+ Default settings $+ )
    else {
      _ssplay Question
      var %basedon = $$dialog(paddchan,paddchan,-4)
    }
    if ($left(%basedon,1) == $chr(40)) %basedon = $_p2s($str(?,80))
    else {
      %num = 1
      :loop2
      if ($gettok($did(chanprot,250,%num),1,32) == %basedon) %basedon = $gettok($did(chanprot,250,%num),2-,32)
      else { inc %num |  goto loop2 }
    }
    did -ac chanprot 247 %newchan
    did -ac chanprot 250 %newchan %basedon
    did -o chanprot 235 1 %newchan
    did -o chanprot 234 1 %basedon
  }
  _showset $did(chanprot,238)
  _loadother
}
on *:DIALOG:chanprot:sclick:*:{
  if ($did < 1) return
  if (($did($did).state == 2) && ($did(235) == *)) did -u chanprot $did
  var %from,%where
  if ($did < 33) {
    if (8 // $did) {
      ; Punishments button
      %from = $gettok($did(238),$calc($did / 8 + 1),32)
      _pae $gettok(%from,$numtok(%from,44),44) $did(235)
    }
    else {
      ; Pre-set values
      %where = $calc($did - ($did % 8) + 3)
      %from = $gettok($did(238),$calc($int($calc($did / 8)) + 2),32)
      if ($did($did).sel == 1) { did -on chanprot %where 1 0 | did -on chanprot $calc(%where + 3) 1 0 }
      elseif ($did($did).sel < 5) {
        did -on chanprot %where 1 $gettok(%from,$calc(2 + $did($did).sel * 2),44)
        did -on chanprot $calc(%where + 3) 1 $gettok(%from,$calc(3 + $did($did).sel * 2),44)
      }
      elseif ($did($did).sel == 6) {
        did -om chanprot %where 1 $gettok($did(250,1),$calc($gettok(%from,2,44) + 1),32)
        did -om chanprot $calc(%where + 3) 1 $gettok($did(250,1),$calc($gettok(%from,4,44) + 1),32)
      }
      else did -n chanprot %where $+ , $+ $calc(%where + 3)
    }
  }
  elseif ($did == 69) _sclicktrigset 69 33,34,35,36,37,38,39,40,41,42,43,44 82,83,84,85,86,87,88,89,90,91,92,93
  elseif ($did == 35) _sclicktrigset 35 3,60,63,61,62 53,36,38,40,42
  elseif ($did == 44) _sclicktrigset 44 65,68,66,67 45,47,49,51
  elseif ($did == 61) _sclicktrigset 61 20 62
  elseif ($did == 64) _sclicktrigset 64 21 65
}
on *:DIALOG:chanprot:edit:*:if ($did < 30) did -c chanprot $calc($did - ($did % 8) + 2) 5
alias -l _sclicktrigset {
  var %num = $numtok($2,44)
  :loop
  did $iif($did($1).state != 1,-m,-n) $+ $iif($did(235) != *,o) chanprot $gettok($3,%num,44) 1 $gettok($did(250,1),$calc(1 + $gettok($2,%num,44)),32)
  if (%num > 1) { dec %num | goto loop }
}
alias -l _showsetn {
  if ($1 == 1) _showset 98-103 wordk1 wordk2 pervscan
  elseif ($1 == 2) _showset 68-93 Onesite $+ :,29,CTCPs,30,seconds,6,15,4,15,3,20,ctcp Allsites $+ :,31,CTCPs,32,seconds,8,5,6,8,4,10,allc invdcc
  elseif ($1 == 3) _showset 34-54 Joining/parting:,57,joins/parts,58,seconds,6,10,5,15,4,20,joinp
  elseif ($1 == 4) _showset 55-59 Nickflood:,4,nickchanges,5,seconds,5,10,4,15,3,15,nick Clones:,1,maxusersfromonesite,0,0,4,-,3,-,2,-,clones banyou
  elseif ($1 == 5) _showset 109-121
  elseif ($1 == 6) _showset 94-97 Massdeop:,46,deops,47,seconds,7,10,5,10,3,10,deop Masskick:,48,kicks,49,seconds,8,10,6,10,4,10,kick Massban:,50,bannedusers,51,seconds,8,8,6,8,4,8,mbanu Massban:,52,bans,53,seconds,9,8,6,8,3,8,mbanb
  elseif ($1 == 7) _showset 61-66 Textflood:,6,bytes,7,seconds,2000,8,1200,10,750,12,text Textscroll:,8,lines,9,seconds,10,10,8,12,6,12,scroll Repeating:,10,repeats,11,seconds,4,60,3,120,2,180,repeat Noticeflood:,12,lines,13,seconds,5,15,4,20,3,30,notice
  else _showset 122 Toomanycaps:,14,percentof,15,letters,90,30,80,20,60,10,caps Attributeflood:,17,attributes,18,seconds,250,10,150,15,75,20,attrfl Attributeabuse:,19,attributesinoneline,0,0,100,-,50,-,20,-,attrab
}
alias -l _showset {
  var %todo,%bit,%opt,%sec,%flags = $did(chanprot,234),%defflags = $gettok($did(chanprot,250,1),2-,32),%num = 2,%where = 1

  if ($did(chanprot,235) == *) did -h chanprot 236,237
  else did -v chanprot 236,237

  %num = 2 | %where = 1
  :loop1
  %todo = $ [ $+ [ %num ] ]
  if ($numtok(%todo,44) > 1) {
    if ($did(chanprot,235) == *) { if ($did(chanprot,$calc(%where + 1)).lines > 5) did -d chanprot $calc(%where + 1) 6 }
    else { if ($did(chanprot,$calc(%where + 1)).lines < 6) did -a chanprot $calc(%where + 1) Global default }

    %bit = $gettok($did(chanprot,234),$gettok(%todo,2,44),32)
    if ($gettok(%todo,4,44)) %sec = $gettok($did(chanprot,234),$ifmatch,32)
    else %sec = -

    if ((%bit == 0) || (%sec == 0)) { %bit = 0 | %sec = 0 | %opt = 1 }
    elseif ((%bit == ?) || (%sec == ?)) { %opt = 6 | %bit = $gettok($gettok($did(chanprot,250,1),2-,32),$gettok(%todo,2,44),32) | %sec = $gettok($gettok($did(chanprot,250,1),2-,32),$gettok(%todo,4,44),32) }
    elseif ((%bit == $gettok(%todo,6,44)) && (%sec == $gettok(%todo,7,44))) %opt = 2
    elseif ((%bit == $gettok(%todo,8,44)) && (%sec == $gettok(%todo,9,44))) %opt = 3
    elseif ((%bit == $gettok(%todo,10,44)) && (%sec == $gettok(%todo,11,44))) %opt = 4
    else %opt = 5

    did -va chanprot %where & $+ $_p2s($gettok(%todo,1,44))
    did -vc chanprot $calc(%where + 1) %opt
    did -vo $+ $iif(%opt == 6,m,n) chanprot $calc(%where + 2) 1 %bit
    if ($gettok(%todo,4,44)) {
      did -va chanprot $calc(%where + 3) $_p2s($gettok(%todo,3,44))
      did -h chanprot $calc(%where + 4)
      did -vo $+ $iif(%opt == 6,m,n) chanprot $calc(%where + 5) 1 %sec
      did -va chanprot $calc(%where + 6) $_p2s($gettok(%todo,5,44))
    }
    else {
      did -h chanprot $calc(%where + 3) $+ , $+ $calc(%where + 5) $+ , $+ $calc(%where + 6)
      did -va chanprot $calc(%where + 4) $_p2s($gettok(%todo,3,44))
    }
    did -v chanprot $calc(%where + 7)
    inc %where 8
  }
  else {
    :loop2 | did -h chanprot %where | if (8 \\ %where) { inc %where | goto loop2 } | inc %where
    if (%todo) did -v chanprot $calc(%where - 1)
  }
  if (%where < 32) { inc %num | goto loop1 }

  did $iif($numtok($2,44) > 1,-v,-h) chanprot 33

  %where = $gettok($did(chanprot,238),1,32)
  did -o chanprot 238 1 $1-

  if (%where == $1) return
  if (%where) _bulkdid -h chanprot $replace(%where,-,$chr(32))
  if ($1) _bulkdid -v chanprot $replace($1,-,$chr(32))
}
alias -l _saveset {
  var %todo,%bit,%sec,%num = 2,%where = 1,%flags = $did(234)

  :loop
  %todo = $gettok($did(238),%num,32)
  if ($numtok(%todo,44) > 1) {
    %bit = $calc($did($calc(%where + 2)))
    if ($gettok(%todo,4,44)) {
      %sec = $calc($did($calc(%where + 5)))
      if ($did($calc(%where + 1)).sel == 6) { %bit = ? | %sec = ? }
      elseif ((%bit == 0) || (%sec == 0)) { %bit = 0 | %sec = 0 }
      %flags = $puttok($puttok(%flags,%bit,$gettok(%todo,2,44),32),%sec,$gettok(%todo,4,44),32)
    }
    else {
      if ($did($calc(%where + 1)).sel == 6) %bit = ?
      %flags = $puttok(%flags,%bit,$gettok(%todo,2,44),32)
    }
  }
  if (%num < 5) { inc %where 8 | inc %num | goto loop }
  did -o chanprot 234 1 %flags
  did -oc chanprot 250 $did(250).sel $did(235) %flags
}
alias -l _loadother {
  ; Checkboxes
  var %bit,%num = 1
  :loop
  %bit = $gettok($did(chanprot,234),$gettok(24 25 22 74 54 55 45 56 2 69 70 71 72 73 77 78 23 80,%num,32),32)
  did $iif(%bit == ?,-cu,$iif(%bit == 1,-c,-u)) chanprot $gettok(98 100 102 68 94 95 55 56 57 119 120 109 110 111 58 59 118 121,%num,32)
  if (%num < 18) { inc %num | goto loop }

  ; Checkboxes with associated editboxs
  _loadtrigset 28 69 33,34,35,36,37,38,39,40,41,42,43,44 82,83,84,85,86,87,88,89,90,91,92,93
  _loadtrigset 59 35 3,60,63,61,62 53,36,38,40,42
  _loadtrigset 64 44 65,68,66,67 45,47,49,51
  _loadtrigset 20 61 20 62
  _loadtrigset 21 64 21 65

  ; Misc
  if ($gettok($did(chanprot,234),75,32) != ?) did -o chanprot 113 1 $ifmatch
  else did -o chanprot 113 1 $gettok($did(chanprot,250,1),76,32)
  if ($gettok($did(chanprot,234),76,32) != ?) did -o chanprot 116 1 $ifmatch
  else did -o chanprot 116 1 $gettok($did(chanprot,250,1),77,32)
}
alias -l _loadtrigset {
  var %use,%bit,%todo
  if ($gettok($did(chanprot,234),$1,32) == ?) { did -cu chanprot $2 | %use = $gettok($did(chanprot,250,1),2-,32) | %bit = m }
  elseif ($gettok($did(chanprot,234),$1,32) == 0) { did -u chanprot $2 | %use = $did(chanprot,234) | %bit = m }
  else { did -c chanprot $2 | %use = $did(chanprot,234) | %bit = n }
  var %num = $numtok($3,44)
  :loop
  %todo = $gettok(%use,$gettok($3,%num,44),32)
  if (%todo == ?) %todo = $gettok($did(chanprot,250,1),$calc(1 + $gettok($3,%num,44)),32)
  did -o $+ %bit chanprot $gettok($4,%num,44) 1 $_p2s(%todo)
  if (%num > 1) { dec %num | goto loop }
}
alias -l _saveother {
  ; save other settings
  var %bit,%num = 1
  %.flags = $did(234)

  ; Checkboxes
  %num = 1
  :loop
  %bit = $did($gettok(98 100 102 68 94 95 55 56 57 119 120 109 110 111 58 59 118 121,%num,32)).state
  if (%bit == 2) %bit = ?
  %.flags = $puttok(%.flags,%bit,$gettok(24 25 22 74 54 55 45 56 2 69 70 71 72 73 77 78 23 80,%num,32),32)
  if (%num < 18) { inc %num | goto loop }

  ; Checkboxes with associated editboxs
  _savetrigset 28 69 33,34,35,36,37,38,39,40,41,42,43,44 82,83,84,85,86,87,88,89,90,91,92,93
  _savetrigset 59 35 3,60,63,61,62 53,36,38,40,42
  _savetrigset 64 44 65,68,66,67 45,47,49,51
  _savetrigset2 61 62 20
  _savetrigset2 64 65 21

  ; Misc
  if ($did(235) == *) { %bit = $iif($did(113) isnum,$did(113),6) | %num = $iif($did(116) isnum,$did(116),300) }
  else {
    %bit = $iif(($did(113) isnum) && ($did(113) != $gettok($did(chanprot,250,1),76,32)),$did(113),?)
    %num = $iif(($did(116) isnum) && ($did(116) != $gettok($did(chanprot,250,1),77,32)),$did(116),?)
  }

  %.flags = $puttok($puttok(%.flags,%bit,75,32),%num,76,32)

  did -o chanprot 234 1 %.flags
  did -oc chanprot 250 $did(250).sel $did(235) %.flags
  unset %.flags
}
alias -l _savetrigset {
  if ($did($2).state == 2) var %bit = ?
  else var %bit = $did($2).state
  %.flags = $puttok(%.flags,%bit,$1,32)
  var %num = $numtok($3,44)
  :loop
  if ($did($2).state == 2) %bit = ?
  else %bit = $did($gettok($4,%num,44))
  if ($gettok($4,%num,44) == 53) { %bit = $_s2p(%bit) | if (%bit == $null) %bit = + }
  elseif (%bit !isnum) { if ($did(235) == *) %bit = 0 | else %bit = ? }
  %.flags = $puttok(%.flags,%bit,$gettok($3,%num,44),32)
  if (%num > 1) { dec %num | goto loop }
}
alias -l _savetrigset2 {
  if ($did($1).state == 0) var %bit = 0
  elseif ($did($1).state == 2) var %bit = ?
  elseif ($did($2) isnum) var %bit = $did($2)
  else var %bit = 1
  %.flags = $puttok(%.flags,%bit,$3,32)
}

; Punishment editing
alias -l _pae {
  set -u %.protect $1 | set -u %.chan $2
  _dialog -am protact protact
}
dialog protact {
  title "Protection Actions (Punishments)"
  icon script\pnp.ico
  option dbu
  size -1 -1 142 117

  text "&Actions: (used successively for repeat violators)", 1, 2 2 125 10

  list 2, 2 12 100 75
  list 3, 2 12 100 75, hide disable

  button "&Edit...", 4, 105 11 35 12, default
  button "&Add...", 5, 105 27 35 12
  button "&Del", 6, 105 43 35 12
  button "&Up", 7, 105 59 35 12
  button "&Down", 8, 105 75 35 12

  check "&Use global default actions", 9, 5 89 100 10

  button "OK", 10, 2 102 35 12, OK
  button "Cancel", 11, 67 102 35 12, cancel

  edit "", 12, 1 1 1 1, hide autohs
}
on *:DIALOG:protact:sclick:10:{
  window -hl @.actions
  loadbuf @.actions $_cfg(actions.dat)
  var %doing,%filter,%num = 1
  :loop1
  %doing = $gettok($did(12),1,32) $+ %num $+ $gettok($did(12),2,32) *
  %filter = $fline(@.actions,%doing,0)
  :loop1b
  if (%filter) {
    if ($gettok($line(@.actions,$fline(@.actions,%doing,%filter)),1,32) == $gettok(%doing,1,32)) { dline @.actions $fline(@.actions,%doing,%filter) | inc %num | goto loop1 }
    dec %filter | goto loop1b
  }
  %num = 1
  if (($did(9).state == 0) || ($gettok($did(12),2,32) == *)) {
    :loop2
    if ($did(2,%num)) {
      aline @.actions $gettok($did(12),1,32) $+ %num $+ $gettok($did(12),2,32) $_convact1($gettok($ifmatch,1,32)) $_convact2($gettok($ifmatch,2,32)) $right($left($gettok($ifmatch,3-,32),-1),-1)
      inc %num | goto loop2
    }
  }
  savebuf @.actions $_cfg(actions.dat)
  window -c @.actions
}
on *:DIALOG:protact:init:*:{
  did -a protact 12 %.protect %.chan

  if (%.chan == *) { 
    _loadpa %.protect * 2
    did -cb protact 9
  }
  else {
    _loadpa %.protect %.chan 2 | _loadpa %.protect * 3
    if ($read($result,tns,%.protect $+ 1 $+ %.chan) == $null) { _visprota -h -v -b | did -c protact 9 }
  }

  unset %.protect %.chan
}
alias -l _loadpa {
  var %num = 1,%file = $_cfg(actions.dat)

  did -r protact $3
  :loop
  if ($read(%file,tns,$1 $+ %num $+ $2) != $null) {
    did -a protact $3 $_dispact($ifmatch)
    inc %num | goto loop
  }

  return %file
}
alias -l _dispact tokenize 32 $1- | return $gettok(* mode+i mode+m mode+im warn warn-chan warn-self warn-ops warn-msg,$1,32) $gettok((custom) bk bk0 bk2 cb deop fk kick tempban warn warn-chan warn-self warn-ops warn-msg,$2,32) " $+ $3- $+ "
alias -l _convact1 return $findtok(* mode+i mode+m mode+im warn warn-chan warn-self warn-ops warn-msg,$1,1,32)
alias -l _convact2 return $findtok((custom) bk bk0 bk2 cb deop fk kick tempban warn warn-chan warn-self warn-ops warn-msg,$1,1,32)
alias -l _visprota did $1 protact 2 | did $2 protact 3 | did $3 protact 4,5,6,7,8
on *:DIALOG:protact:sclick:9:{
  if ($did(9).state) _visprota -h -v -b
  else _visprota -v -h -e
}
on *:DIALOG:protact:dclick:2:_paed e
on *:DIALOG:protact:sclick:4:_paed e
on *:DIALOG:protact:sclick:5:_paed a
on *:DIALOG:protact:sclick:6:if ($did(protact,2).sel isnum) did -d protact 2 $ifmatch
on *:DIALOG:protact:sclick:7:if ($did(protact,2).sel > 1) { did -i protact 2 $calc($ifmatch + 1) $did(protact,2,$calc($ifmatch - 1)) | did -d protact 2 $calc($ifmatch - 1) }
on *:DIALOG:protact:sclick:8:if (($did(protact,2).sel) && ($did(protact,2).sel < $did(protact,2).lines)) { did -i protact 2 $ifmatch $did(protact,2,$calc($ifmatch + 1)) | did -d protact 2 $calc($ifmatch + 2) }
alias -l _paed {
  set %.protect $gettok($did(protact,12),1,32)
  if ($1 == e) {
    set %.toedit $$did(protact,2,$did(protact,2).sel)
    _ssplay Dialog
    did -oc protact 2 $did(protact,2).sel $$dialog(paedit,paedit,-4)
  }
  else {
    set %.toedit * kick ""
    _ssplay Dialog
    if ($did(protact,2).sel isnum) did -ic protact 2 $calc($did(protact,2).sel + 1) $$dialog(paedit,paedit,-4)
    else did -ac protact 2 $$dialog(paedit,paedit,-4)
  }
}

dialog paedit {
  title "Action (Punishment)"
  icon script\pnp.ico
  option dbu
  size -1 -1 130 102
  text "&Action to perform on offender:", 1, 2 2 100 10
  combo 2, 2 12 125 75, drop
  text "&Message for action: (recommended)", 3, 2 27 100 10
  edit "", 4, 2 37 125 11, autohs
  text "&Second action to perform: (optional)", 5, 2 52 100 10
  combo 6, 2 62 125 75, drop
  button "OK", 7, 5 85 35 12, OK
  button "Cancel", 8, 47 85 35 12, cancel
  button "&Help", 9, 90 85 35 12, disable
  edit "", 10, 1 1 1 1, hide result autohs
  edit "", 12, 1 1 1 1, hide autohs
  edit "", 13, 1 1 1 1, hide autohs
}
on *:DIALOG:paedit:init:*:{
  did -o paedit 12 1 %.protect
  loadbuf -otpunish1 paedit 2 script\dlgtext.dat
  loadbuf -otpunish2 paedit 6 script\dlgtext.dat
  did -c paedit 2 $_convact2($gettok(%.toedit,2,32))
  did -c paedit 6 $_convact1($gettok(%.toedit,1,32))
  did -a paedit 4 $right($left($gettok(%.toedit,3-,32),-1),-1)
  if ($did(4) == $null) did -o paedit 4 1 $read(script\punish2.dat,ts,$did(12))
  did -o paedit 13 1 $mid(ckkkkdkkknwsw,$did(2).sel,1)
  if ($did(13) == d) { did -b paedit 3 | did -br paedit 4 }
  unset %.protect %.toedit
}
on *:DIALOG:paedit:sclick:2:{
  var %categ = $mid(ckkkkdkkknwswn,$did(2).sel,1)
  if (%categ != $did(13)) {
    did -a paedit 3 $iif(%categ == c,Command to perform:,Message for action: $chr(40) $+ recommended $+ $chr(41))
    did -o paedit 13 1 %categ
    if (%categ == d) { did -b paedit 3 | did -br paedit 4 | return }
    did -e paedit 3,4
    did -o paedit 4 1 $_protwarnmsg(%categ,$did(12))
  }
}
on *:DIALOG:paedit:sclick:7:{
  if (($did(4)) && ($did(2).sel != 6)) did -a paedit 10 $_dispact($did(6).sel,$did(2).sel,$did(4))
  else did -a paedit 10 $_dispact($did(6).sel,$did(2).sel)
}