Peace & Protection 4.00 — File Browser

PeaceProtection4.00v4.0 / PeaceProtection4.00v4.0 / SCRIPT / ADDON.MRC

ADDON.MRC — 16.52 KB — Download this file

; #= P&P -rs
; ########################################
; Peace & Protection
; Addon support
; ########################################

;
; Addons
;

alias addons addon
alias addon {
  var %addon,%num,%steps,%cur,%file,%count,%loadto,%cmd
  if ($1) {
    if ($2 == $null) _qhelp /addon $1
    %addon = $replace($_rel.fn($2-),/,\)
    if ($_averify(%addon) == 0) _error That is not a valid P&P addon.The file may be corrupted or for a later version of P&P.
  }
  if ($1 == d) {
    ; delete
    if ($istok(%!addon.ids, [ $readini -n %addon addon id ] ,32)) _error That addon is installed!Uninstall it before deleting.
    _okcancel 1 Delete the $readini -n %addon addon name addon entirely?

    ; Delete, phase one (leave .ppa for last)
    %count = 1
    :loopD1
    %file = $readini -n %addon files %count
    if (%file) {
      %file = $nofile(%addon) $+ %file
      if (%file != %addon) {
        .remove " $+ %file $+ "
        if ($exists(%file)) _error Unable to delete ' $+ %file $+ '
      }
      inc %count
      goto loopD1
    }

    ; Delete, phase two
    %count = 1
    :loopD2
    %file = $readini -n %addon other %count
    if (%file) {
      %file = $nofile(%addon) $+ %file
      .remove " $+ %file $+ "
      if ($exists(%file)) _error Unable to delete ' $+ %file $+ '
      inc %count
      goto loopD2
    }

    ; Last file
    .remove " $+ %addon $+ "
    if ($exists(%addon)) _error Unable to delete ' $+ %addon $+ '
    disps Addon ' $+ %addon $+ ' successfully deleted.
    if ($dialog(addons)) _recurse addon
    halt
  }
  if ($1 == i) {
    if ($_averify2(%addon)) _error One or more required files are missing.The file ' $+ $ifmatch $+ ' is missing.
    if ($istok(%!addon.ids, [ $readini -n %addon addon id ] ,32)) _error That addon is already installed!Uninstall it or restart P&P if you are having problems.

    _progress.1 Installing $readini -n %addon addon name

    ; Count files to be loaded
    %count = 1
    :loopL2
    if ($readini -n %addon files %count) { inc %count | goto loopL2 }
    dec %count

    ; Prepare meter
    %steps = $calc(%count + 3) | %cur = 1
    %loadto = $script(0) - 2

    ; Load 3.20 compatibility?
    if (($readini -n %addon addon ppver < 4.00) && ($script(addon320.mrc) == $null)) {
      _progress.2 $int($calc(%cur / %steps * 100)) Loading 3.20 compatibility...
      .load -rs $+ %loadto script\addon320.mrc
      _broadcast .load -rs script\addon320.mrc
    }

    ; Load addon files
    %num = 1
    :loopL3
    %file = $nofile(%addon) $+ [ $readini -n %addon files %num ]
    _progress.2 $int($calc(%cur / %steps * 100)) Loading %file
    .load -rs $+ %loadto " $+ %file $+ "
    _broadcast .load -rs $+ %loadto " $+ %file $+ "
    inc %loadto
    inc %cur
    if (%num < %count) { inc %num | goto loopL3 }

    ; Cleanup (notify other mircs, update loaded states)
    _progress.2 $int($calc(%cur / %steps * 100)) Cleaning up
    inc %cur
    %!addon.ids = $addtok(%!addon.ids, [ $readini -n %addon addon id ] ,32)
    %!addon.codes = $addtok(%!addon.codes, [ $readini -n %addon addon code ] ,32)
    _cfgxw addons ids %!addon.ids
    _cfgxw addons [ $readini -n %addon addon id ] %addon
    _broadcast % $+ !addon.ids = %!addon.ids
    _broadcast % $+ !addon.codes = %!addon.codes
    if ($readini -n %addon addon ppver < 4.00) {
      _pnp320compat
      _broadcast _pnp320compat
    }

    ; Popups and interfaces
    _progress.2 $int($calc(%cur / %steps * 100)) Updating popups
    _apopups
    %!addon.i = $_addon.names(4)

    _progress.2 100 Addon installed!
    %cmd = $readini -n %addon addon config
    if ($dialog(addons)) _recurse addon
    if (%cmd) { window -c @Progress | %cmd }
    halt
  }
  if ($1 == u) {
    if ($istok(%!addon.ids, [ $readini -n %addon addon id ] ,32) == $null) _error That addon is not installed!Restart P&P if you are having problems.

    ; Unload command? Clear vars? Windows? Dialogs? Timers?
    %cmd = $readini -n %addon addon unload | if (%cmd) %cmd
    %cmd = $readini -n %addon addon vars | if (%cmd) unset [ %cmd ]
    %cmd = $readini -n %addon addon windows
    if (%cmd) {
      var %windows = $window(0)
      :loopW
      if (%windows) {
        if ($_searchtok(%cmd,$window(%windows),32)) {
          _dowcleanup $window(%windows)
          window -c $window(%windows)
        }
        dec %windows | goto loopW
      }
    }
    %cmd = $readini -n %addon addon dialogs
    if (%cmd) {
      var %dialogs = $dialog(0)
      :loopD
      if (%dialogs) {
        if ($_searchtok(%cmd,$dialog(%dialogs),32)) dialog -x $dialog(%dialogs)
        dec %dialogs | goto loopD
      }
    }
    %cmd = $readini -n %addon addon timers
    if (%cmd) {
      var %timer = $numtok(%cmd,32)
      :loopT
      if (%timer) {
        .timer [ $+ [ $gettok(%cmd,%timer,32) ] ] off
        dec %timer | goto loopT
      }
    }
    %cmd = $readini -n %addon addon sockets
    if (%cmd) {
      var %socks = $numtok(%cmd,32)
      :loopS
      if (%socks) {
        sockclose $gettok(%cmd,%socks,32)
        dec %socks | goto loopS
      }
    }
    %cmd = $readini -n %addon addon vars2
    if (%cmd) {
      var %vars = $numtok(%cmd,32)
      :loopV
      if (%vars) {
        `set $gettok(%cmd,%vars,32)
        dec %vars | goto loopV
      }
    }

    _progress.1 Uninstalling $readini -n %addon addon name

    ; Count files to be unloaded
    %count = 1
    :loopU1
    if ($readini -n %addon files %count) { inc %count | goto loopU1 }
    dec %count

    ; Prepare meter
    %steps = $calc(%count + 3) | %cur = 1

    ; Unload addon files
    %num = 1
    :loopU2
    %file = $script( [ $readini -n %addon files %num ] )
    _progress.2 $int($calc(%cur / %steps * 100)) Unloading %file
    .timer 1 0 .unload -rs " $+ %file $+ "
    _broadcast .unload -rs " $+ %file $+ "
    inc %cur
    if (%num < %count) { inc %num | goto loopU2 }

    ; Cleanup (notify other mircs, update loaded states)
    _progress.2 $int($calc(%cur / %steps * 100)) Cleaning up
    inc %cur
    %!addon.ids = $remtok(%!addon.ids, [ $readini -n %addon addon id ] ,32)
    %!addon.codes = $remtok(%!addon.codes, [ $readini -n %addon addon code ] ,32)
    _cfgxw addons ids %!addon.ids
    _cfgxw addons $readini -n %addon addon id
    _broadcast % $+ !addon.ids = %!addon.ids
    _broadcast % $+ !addon.codes = %!addon.codes

    ; Popups and interfaces
    _progress.2 $int($calc(%cur / %steps * 100)) Updating popups
    _apopups
    %!addon.i = $_addon.names(4)

    _progress.2 100 Addon uninstalled!
    if ($dialog(addons)) _recurse addon
    halt
  }
  if ($1 == n) {
    if ($window(@Addon)) { clear @Addon | window -a @Addon }
    else _window 2.1 -alkd -t11 @Addon $_center(450,320) @Addon
    titlebar @Addon Info - $2-
    aline @Addon Addon:	 $+ $:h( [ $readini -n %addon addon name ] )
    if ($readini -n %addon addon version != $null) aline @Addon Version:	 $+ $ifmatch
    aline @Addon For PnP:	 $+ $readini -n %addon addon ppver
    if ($readini -n %addon addon author != $null) aline @Addon Author:	 $+ $ifmatch
    if ($readini -n %addon addon email != $null) aline @Addon E-Mail:	 $+ $:s($ifmatch) (double-click to e-mail)
    if ($readini -n %addon addon url != $null) aline @Addon Homepage:	 $+ $:s($ifmatch) (double-click to visit)
    if ($readini -n %addon notes 1 != $null) {
      aline @Addon $chr(9)
      aline @Addon Info:	 $+ $ifmatch
      %num = 2
      :notes | %cmd = $readini -n %addon notes %num | if (%cmd != $null) { aline @Addon 	 $+ $iif($ifmatch != -,$ifmatch, ) | inc %num | goto notes }
    }
    if ($readini -n %addon addon group != $null) {
      aline @Addon $chr(9)
      aline @Addon Group:	 $+ $ifmatch
    }
    aline @Addon $chr(9)
    aline @Addon Addon file:	 $+ $nofile($2-) $+ $:s($nopath($2-))
    aline @Addon Scripts:	 $+ $nofile($2-) $+ $:s( [ $readini -n %addon files 1 ] )
    %num = 2
    :files
    if ($readini -n %addon files %num != $null) { aline @Addon 	 $+ $nofile($2-) $+ $:s($ifmatch) | inc %num | goto files }
    %num = 1
    :other
    %cmd = $readini -n %addon other %num
    if (%cmd != $null) { aline @Addon $iif(%num == 1,Other files:) $+ 	  $+ $nofile($2-) $+ $:s(%cmd) | inc %num | goto other }
    aline @Addon $chr(9)
    aline @Addon (Double-click a filename to view it in notepad)
    window -b @Addon
    halt
  }
  if ($1 == c) {
    if ($istok(%!addon.ids, [ $readini -n %addon addon id ] ,32) == $null) _error That addon is not installed!You cannot configure an addon that is not installed.
    %cmd = $readini -n %addon addon config
    if (%cmd == $null) _doerror Sorry- This addon has no configuration.Check the addon's documentation for assistance.
    %cmd
    halt
  }
  if ($1 == h) {
    if ($istok(%!addon.ids, [ $readini -n %addon addon id ] ,32) == $null) _error That addon is not installed!You cannot get help on an addon that is not installed.
    %cmd = $readini -n %addon addon help
    if (%cmd == $null) _doerror Sorry- This addon has no defined help.Try reading any text files that came with the addon.
    %cmd
    halt
  }
  window -hnl @.files
  %num = $findfile($mircdir,*.ppa,0,@.files)
  %num = $line(@.files,0)
  if (%num == 0) { window -c @.files | _error No addon files found!Unzip any addons to $mircdiraddons\ and try again. }
  if ($dialog(addons)) { did -r addons 1,2 | dialog -v addons }
  else dialog -md addons addons
  var %error = 0
  :loopF
  %file = $line(@.files,%num)
  %cur = $readini -n %file addon ppver
  if (%cur > $:bver) %error = 2 %file
  elseif (%cur !isnum) %error = 1 %file
  else did -a addons $iif($istok(%!addon.ids, [ $readini -n %file addon id ] ,32),1,2) $readini -n %file addon name $chr(160) ( $+ %file $+ )
  if (%num > 1) { dec %num | goto loopF }
  window -c @.files

  if (1* iswm %error) $_doerror($gettok(%error,2-,32),Erroneous addon file!This is not a legitimate P&P addon, or the file is corrupted.)
  if (2* iswm %error) $_doerror($gettok(%error,2-,32),Unusable addon file!This addon is for P&P, [ $readini -n [ $gettok(%error,2-,32) ] addon ppver ] ,.)
}
alias _averify if (($readini -n $1- addon ppver !isnum) || ($readini -n $1- addon ppver > $:bver) || ($readini -n $1- addon id == $null) || ($readini -n $1- addon code == $null) || ($readini -n $1- addon name == $null) || ($readini -n $1- files 1 == $null)) return 0 | return 1
alias _averify2 {
  var %num = 1
  :loop1
  var %file = $readini -n $1- files %num
  if (%file) {
    %file = $nofile($1-) $+ %file
    if ($exists(%file)) { inc %num | goto loop1 }
    return %file
  }
  %num = 1
  :loop2
  %file = $readini -n $1- other %num
  if (%file) {
    %file = $nofile($1-) $+ %file
    if ($exists(%file)) { inc %num | goto loop2 }
    return %file
  }
  return
}
; Update addon popups
alias _apopups {
  var %num = 1,%mtypes = nicklist query channel status
  :winp
  var %bit = $gettok(%mtypes,%num,32)
  window -hl @.adpopups $+ %bit
  aline -hl @.adpopups $+ %bit menu %bit $chr(123)
  aline -hl @.adpopups $+ %bit Misc.
  if (%num < 4) { inc %num | goto winp }

  window -hl @.adpopups
  aline @.adpopups ; #= P&P -rs 0
  aline @.adpopups ; ########################################
  aline @.adpopups ; Peace & Protection
  aline @.adpopups ; Addon popups (*auto-generated*)
  aline @.adpopups ; ########################################
  aline @.adpopups menu menubar $chr(123)

  window -hls @.apops

  ; Get addon names
  var %file,%name,%pop,%popup,%cfg,%help,%num = $numtok(%!addon.ids,32)
  if (%num < 1) { aline @.adpopups $!iif(($mouse.key & 2) || ($mid(%`popups.1,9,1) != 0),Addons...):addon | goto nope }

  aline @.adpopups $!iif(($mouse.key & 2) || ($mid(%`popups.1,8,1) != 0),Addons)

  :loop1
  %file = $_cfgx(addons,$gettok(%!addon.ids,%num,32))
  %name = $readini -n %file addon popup
  if (%name == $null) %name = $readini -n %file addon name
  aline @.apops %name $+  $+ %file
  if (%num > 1) { dec %num | goto loop1 }

  ; Write popups
  %num = 1
  :loop2
  %name = $line(@.apops,%num)
  if (%name) {
    aline @.adpopups . $+ $gettok(%name,1,127)
    %file = $gettok(%name,2,127)

    ; Special popups?
    %pop = 1
    :loop3
    %popup = $readini -n %file menu %pop
    if (%popup != $null) { aline @.adpopups .. $+ %popup | inc %pop | goto loop3 }

    ; Misc. popups?
    var %mtype = 1
    :loopmt
    var %bit = $gettok(%mtypes,%mtype,32),%pop = 1
    :loopmt2
    %popup = $readini -n %file %bit %pop
    if (%popup != $null) { aline @.adpopups $+ %bit . $+ %popup | inc %pop | goto loopmt2 }
    if (%mtype < 4) { inc %mtype | goto loopmt }

    %cfg = $readini -n %file addon config
    %help = $readini -n %file addon help

    aline @.adpopups ..-
    if (%cfg != $null) aline @.adpopups ..Configure...: $+ %cfg
    if (%help != $null) aline @.adpopups ..Help...: $+ %help
    aline @.adpopups ..-
    aline @.adpopups ..Info...:addon n %file
    aline @.adpopups ..Uninstall:addon u %file

    inc %num | goto loop2
  }

  aline @.adpopups .-
  aline @.adpopups .More...:addon
  :nope
  aline @.adpopups $chr(125)

  savebuf @.adpopups $_cfg(adpopups.mrc)

  %num = 1
  :winp2
  %bit = $gettok(%mtypes,%num,32)
  loadbuf -t $+ %bit @.adpopups $+ %bit script\miscmenu.dat
  aline @.adpopups $+ %bit $chr(125)
  savebuf -a @.adpopups $+ %bit $_cfg(adpopups.mrc)
  window -c @.adpopups $+ %bit
  if (%num < 4) { inc %num | goto winp2 }

  close -@ @.apops @.adpopups

  _broadcastp .unload -rs " $!+ $!script(adpopups.mrc) $!+ " $chr(124) .load -rs2 $_cfg(adpopups.mrc)
  .timer 1 0 .unload -rs " $+ $script(adpopups.mrc) $+ " $chr(124) .load -rs2 $_cfg(adpopups.mrc)
}

menu @Addon {
  dclick:{
    var %type,%payload,%num = $1
    :loop
    if ($left($line(@Addon,%num),1) == $chr(9)) { dec %num | goto loop }
    %type = $gettok($line(@Addon,%num),1,9)
    %payload = $strip($remtok($line(@Addon,$1),%type,1,9))
    if (%type == E-Mail:) mailto $gettok(%payload,1,32)
    elseif (%type == Homepage:) http $gettok(%payload,1,32)
    elseif ((%type == Addon file:) || (%type == Other files:) || (%type == Scripts:)) run notepad.exe %payload
  }
}

;
; Addon dialog
;

dialog addons {
  title "P&P Addons"
  size -1 -1 400 364

  box "Installed &addons", 11, 10 10 380 150
  list 1, 20 30 230 140, sort
  button "I&nformation...", 101, 260 30 120 25, default
  button "&Uninstall", 102, 260 62 120 25
  button "&Configure...", 103, 260 94 120 25
  button "&Help on addon...", 104, 260 126 120 25

  box "&More addons", 12, 10 170 380 150
  list 2, 20 190 230 140, sort
  button "In&formation...", 201, 260 190 120 25
  button "&Install", 205, 260 222 120 25
  button "&Delete...", 206, 260 254 120 25

  button "Cl&ose", 21, 110 330 80 25, cancel
  button "H&elp", 22, 210 330 80 25, disable
}
on *:DIALOG:addons:sclick:1:did -t $dname 101 | did -u $dname 2
on *:DIALOG:addons:sclick:2:did -t $dname 201 | did -u $dname 1
on *:DIALOG:addons:dclick:*:var %addon = $did($did,$did($did).sel) | addon n $left($gettok(%addon,$numtok(%addon,40),40),-1)
on *:DIALOG:addons:sclick:21:return
on *:DIALOG:addons:sclick:*:{
  var %addon = $did($left($did,1),$did($left($did,1)).sel)
  if (%addon == $null) return
  _juryrig addon $mid(nuchid,$right($did,1),1) $left($gettok(%addon,$numtok(%addon,40),40),-1)
}

;
; Addon info identifier- (loaded)
;

; $_addon.names(n)
; 1 = names (commaspace sep)
; 2 = id/ver pairs (space sep)
; 3 = codes (space sep)
; 4 = calculate interfaces (returns interfaces available)
alias _addon.names {
  var %ln,%get,%id,%ppa,%names,%num = 1,%addons = $_cfgx(addons,ids),%old
  if ($1 == 4) unset %!addon.i.*
  if (%addons) {
    :loop
    %id = $gettok(%addons,%num,32)
    %ppa = $_cfgx(addons,%id)
    if ($exists(%ppa)) {
      if ($1 == 1) %names = %names $readini -n %ppa addon name $+ ,
      elseif ($1 == 2) %names = %names %id $+ / $+ $readini -n %ppa addon version
      elseif ($1 == 3) %names = %names $readini -n %ppa addon code
      else {
        %ln = $read -s[interfaces] %ppa
        %ln = $readn + 1
        :loop2
        %get = $read -nl [ $+ [ %ln ] ] %ppa
        if (([* !iswm %get) && (#* !iswm %get) && (%get)) {
          %names = $addtok(%names,$gettok($ifmatch,1,61),32)
          %old = %!addon.i. [ $+ [ $gettok($ifmatch,1,61) ] ]
          %!addon.i. [ $+ [ $gettok($ifmatch,1,61) ] ] = $addtok(%old,$gettok($ifmatch,2-,61),44)
          inc %ln
          goto loop2
        }
      }
    }
    if (%num < $numtok(%addons,32)) { inc %num | goto loop }
    if ($1 == 1) return $left(%names,-1)
    return %names
  }
  return
}