Peace and Protection — File Browser

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

addon.mrc — 17.34 KB — Download this file

; #= P&P -rs
; ########################################
; Peace and 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 PnP addon.The file may be corrupted or for a later version of PnP.
  }
  if ($1 == d) {
    ; delete
    if ($istok($hget(pnp,addon.ids),$readini(%addon,n,addon,id),32)) _error That addon is installed!Uninstall it before deleting.
    _okcancel 1 Delete the $readini(%addon,n,addon,name) addon entirely?

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

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

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

    _progress.1 Installing $readini(%addon,n,addon,name)

    ; Count files to be loaded
    %count = 1
    :loopL2
    if ($readini(%addon,n,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(%addon,n,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
      _broadcastp .load -rs script\addon320.mrc
    }

    ; Cleanup (notify other mircs, update loaded states)
    _progress.2 $int($calc(%cur / %steps * 100)) Cleaning up
    inc %cur
    hadd pnp addon.ids $addtok($hget(pnp,addon.ids),$readini(%addon,n,addon,id),32)
    _cfgxw addons ids $hget(pnp,addon.ids)
    _cfgxw addons $readini(%addon,n,addon,id) %addon
    _broadcastp hadd pnp addon.ids $hget(pnp,addon.ids)
    if ($readini(%addon,n,addon,ppver) < 4.00) {
      _pnp320compat
      _broadcastp _pnp320compat
    }

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

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

    _progress.2 100 Addon installed!
    %cmd = $readini(%addon,n,addon,config)
    if ($dialog(addons)) _recurse addon
    if ((%cmd) && (k !isin $1)) { window -c @Progress | _juryrig2 %cmd }
    return
  }
  if ($1 == u) {
    if ($istok($hget(pnp,addon.ids),$readini(%addon,n,addon,id),32) == $false) _error That addon is not installed!Restart PnP if you are having problems.

    ; Unload command? Clear vars? Windows? Dialogs? Timers? Hash settings?
    %cmd = $readini(%addon,n,addon,unload) | if (%cmd) %cmd
    %cmd = $readini(%addon,n,addon,vars) | if (%cmd) unset [ %cmd ]
    %cmd = $readini(%addon,n,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(%addon,n,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(%addon,n,addon,timers)
    if (%cmd) {
      var %timer = $numtok(%cmd,32)
      :loopT
      if (%timer) {
        .timer [ $+ [ $gettok(%cmd,%timer,32) ] ] off
        dec %timer | goto loopT
      }
    }
    %cmd = $readini(%addon,n,addon,sockets)
    if (%cmd) {
      var %socks = $numtok(%cmd,32)
      :loopS
      if (%socks) {
        sockclose $gettok(%cmd,%socks,32)
        dec %socks | goto loopS
      }
    }
    ; Delete from config vars
    %cmd = $readini(%addon,n,addon,vars2)
    if (%cmd) {
      var %vars = $numtok(%cmd,32)
      :loopV
      if (%vars) {
        `set $gettok(%cmd,%vars,32)
        dec %vars | goto loopV
      }
    }
    ; Delete from cid-specific hashes
    %cmd = $readini(%addon,n,addon,hashcid)
    if (%cmd) {
      var %scon = $scon(0)
      while (%scon >= 1) {
        var %vars = $numtok(%cmd,32)
        :loopH1
        if (%vars) {
          hdel -w pnp. $+ $scon(%scon) $gettok(%cmd,%vars,32)
          dec %vars | goto loopH1
        }
        dec %scon
      }
    }
    ; Delete from pnp hash
    %cmd = $readini(%addon,n,addon,hashpnp)
    if (%cmd) {
      var %vars = $numtok(%cmd,32)
      :loopH2
      if (%vars) {
        hdel -w pnp $gettok(%cmd,%vars,32)
        dec %vars | goto loopH2
      }
    }

    _progress.1 Uninstalling $readini(%addon,n,addon,name)

    ; Count files to be unloaded
    %count = 1
    :loopU1
    if ($readini(%addon,n,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(%addon,n,files,%num))
    _progress.2 $int($calc(%cur / %steps * 100)) Unloading %file
    .timer -mio 1 0 .unload -rs " $+ %file $+ "
    _broadcastp .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
    hadd pnp addon.ids $remtok($hget(pnp,addon.ids),$readini(%addon,n,addon,id),32)
    _cfgxw addons ids $hget(pnp,addon.ids)
    _cfgxw addons $readini(%addon,n,addon,id)
    _broadcastp hadd pnp addon.ids $hget(pnp,addon.ids)

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

    _progress.2 100 Addon uninstalled!
    if ($dialog(addons)) _recurse addon
    return
  }
  if ($1 == n) {
    if ($dialog(addoninfo) == $null) {
      set -u %.addon %addon
      _ssplay Dialog
      var %junk = $dialog(addoninfo,addoninfo,-4)
    }
    return
  }
  if ($1 == c) {
    if ($istok($hget(pnp,addon.ids),$readini(%addon,n,addon,id),32) == $false) _error That addon is not installed!Restart PnP if you are having problems.
    %cmd = $readini(%addon,n,addon,config)
    if (%cmd == $null) _doerror Sorry- This addon has no configuration.Check the addon's documentation for assistance.
    _juryrig2 %cmd
    return
  }
  if ($1 == h) {
    if ($istok($hget(pnp,addon.ids),$readini(%addon,n,addon,id),32) == $false) _error That addon is not installed!Restart PnP if you are having problems.
    %cmd = $readini(%addon,n,addon,help)
    if (%cmd == $null) _doerror Sorry- This addon has no defined help.Try reading any text files that came with the addon.
    _juryrig2 %cmd
    return
  }
  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 -ma addons addons
  var %error = 0
  :loopF
  %file = $line(@.files,%num)
  %cur = $readini(%file,n,addon,ppver)
  if (%cur > $:bver) %error = 2 %file
  elseif (%cur !isnum) %error = 1 %file
  else did -a addons $iif(($istok($hget(pnp,addon.ids),$readini(%file,n,addon,id),32)) && ($script($readini(%file,n,files,1)) == %file),1,2) $readini(%file,n,addon,name) $chr(160) ( $+ %file $+ )
  if (%num > 1) { dec %num | goto loopF }
  window -c @.files

  if (1* iswm %error) $_doerror($gettok(%error,2-,32),That is not a valid PnP addon.The file may be corrupted or for a later version of PnP.)
  if (2* iswm %error) $_doerror($gettok(%error,2-,32),Unusable addon file!This addon is for PnP $readini($gettok(%error,2-,32),n,addon,ppver) $+ .)
}
alias _averify if (($readini($1-,n,addon,ppver) !isnum) || ($readini($1-,n,addon,ppver) > $:bver) || ($readini($1-,n,addon,id) == $null) || ($readini($1-,n,addon,name) == $null) || ($readini($1-,n,files,1) == $null)) return 0 | return 1
alias _averify2 {
  var %num = 1
  :loop1
  var %file = $readini($1-,n,files,%num)
  if (%file) {
    %file = $nofile($1-) $+ %file
    if ($exists(%file)) { inc %num | goto loop1 }
    return %file
  }
  %num = 1
  :loop2
  %file = $readini($1-,n,other,%num)
  if (%file) {
    %file = $nofile($1-) $+ %file
    if ($exists(%file)) { inc %num | goto loop2 }
    return %file
  }
  return
}

; Update addon popups
on *:SIGNAL:PNP.TRANSLATE:{ _apopups }
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 ; $chr(124)  Peace and Protection                $chr(124)
  aline @.adpopups ; $chr(124)  Addon popups (*auto-generated*)     $chr(124)
  aline @.adpopups ; `======================================'
  aline @.adpopups menu menubar $chr(123)

  window -hls @.apops

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

  aline @.adpopups $!iif(($mouse.key & 2) || ($mid($hget(pnp.config,popups.1),9,1) != 0),Addons)

  :loop1
  %file = $_cfgx(addons,$gettok($hget(pnp,addon.ids),%num,32))
  %name = $readini(%file,n,addon,popup)
  if (%name == $null) %name = $readini(%file,n,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(%file,n,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(%file,n,%bit,%pop)
    if (%popup != $null) { aline @.adpopups $+ %bit . $+ %popup | inc %pop | goto loopmt2 }
    if (%mtype < 4) { inc %mtype | goto loopmt }

    %cfg = $readini(%file,n,addon,config)
    %help = $readini(%file,n,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)
  ; Only write if greater than 3 lines
  if ($line(@.adpopups $+ %bit,0) > 3) savebuf -a @.adpopups $+ %bit $_cfg(adpopups.mrc)
  window -c @.adpopups $+ %bit
  if (%num < 4) { inc %num | goto winp2 }

  close -@ @.apops @.adpopups

  _broadcastp .reload -rs2 $_cfg(adpopups.mrc)
  .reload -rs2 $_cfg(adpopups.mrc)
}

;
; Addon dialog
;

dialog addons {
  title "PnP Addons"
  icon script\pnp.ico
  option dbu
  size -1 -1 200 182

  box "Installed addons", 11, 5 5 190 75
  list 1, 10 15 115 70, sort
  button "&Information...", 101, 130 15 60 12, default
  button "&Uninstall", 102, 130 31 60 12
  button "&Configure...", 103, 130 47 60 12
  button "&Help on addon...", 104, 130 63 60 12

  box "More addons", 12, 5 85 190 75
  list 2, 10 95 115 70, sort
  button "&Information...", 201, 130 95 60 12
  button "&Install", 205, 130 111 60 12
  button "&Delete...", 206, 130 127 60 12

  button "&Close", 21, 55 165 40 12, cancel
  button "&Help", 22, 105 165 40 12, 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:*:if ($did < 1) return | 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:101,102,103,104,201,205,206:{
  var %addon = $did($left($did,1),$did($left($did,1)).sel)
  if (%addon == $null) return
  addon $mid(nuchid,$right($did,1),1) $mid(%addon,$calc($pos(%addon,$chr(160),1) + 3),-1)
}

;
; Addon info identifier- (loaded)
;

; $_addon.names(n)
; 1 = names (commaspace sep)
; 2 = id/ver pairs (space sep)
; 3 = calculate interfaces (returns interfaces available)
alias _addon.names {
  var %ln,%get,%id,%ppa,%names,%num = 1,%addons = $_cfgx(addons,ids),%old
  if ($1 == 3) hdel -w pnp addon.i.*
  if (%addons) {
    :loop
    %id = $gettok(%addons,%num,32)
    %ppa = $_cfgx(addons,%id)
    if ($exists(%ppa)) {
      if ($1 == 1) %names = %names $readini(%ppa,n,addon,name) $+ ,
      elseif ($1 == 2) %names = %names %id $+ / $+ $readini(%ppa,n,addon,version)
      else {
        %ln = $read(%ppa,s,[interfaces])
        if ($readn) {
          %ln = $readn + 1
          :loop2
          %get = $read(%ppa,n,%ln)
          if (([* !iswm %get) && (#* !iswm %get) && (%get)) {
            %names = $addtok(%names,$gettok($ifmatch,1,61),32)
            %old = $hget(pnp,addon.i. $+ $gettok($ifmatch,1,61))
            hadd pnp 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
}

;
; Addon info dialog
;

dialog addoninfo {
  title "PnP Addons"
  icon script\pnp.ico
  option dbu
  size -1 -1 200 170

  text "Addon:", 2, 2 5 40 8, right
  text "", 12, 45 5 150 8
  text "Version:", 3, 2 13 40 8, right
  text "", 13, 45 13 150 8
  text "For PnP:", 4, 2 21 40 8, right
  text "", 14, 45 21 150 8
  text "Author:", 5, 2 29 40 8, right
  text "", 15, 45 29 150 8
  text "E-Mail:", 6, 2 37 40 8, right
  link "", 16, 45 37 150 8
  text "Homepage:", 7, 2 45 40 8, right
  link "", 17, 45 45 150 8
  text "Info:", 8, 2 55 40 8, right
  edit "", 18, 45 53 150 50, multi read return vsbar
  text "Addon file(s):", 9, 2 106 40 8, right
  text "(Double-click a filename to view it)", 10, 2 117 40 24, right disable
  list 19, 45 105 150 50

  button "Close", 1, 45 153 50 12, cancel default
}
on *:DIALOG:addoninfo:init:*:{
  var %load = name version ppver author email url
  var %tok = 1
  while ($gettok(%load,%tok,32)) {
    if ($readini(%.addon,n,addon,$ifmatch) != $null) {
      did -ra $dname $calc(11 + %tok) $ifmatch
      did -v $dname $calc(1 + %tok)
    }
    else {
      did -r $dname $calc(11 + %tok)
      did -h $dname $calc(1 + %tok)
    }
    inc %tok
  }
  if ($readini(%.addon,n,addon,group) != $null) did -ra $dname 14 $did(14) ( $+ $ifmatch $+ )
  did -r $dname 18
  if ($readini(%.addon,n,notes,1) != $null) {
    did -a $dname 18 $ifmatch
    var %line = 2
    while ($readini(%.addon,n,notes,%line) != $null) {
      did -a $dname 18 $crlf $+ $crlf $+ $ifmatch
      inc %line
    }
  }
  did -r $dname 19
  _ddadd $dname 19 $lower($_truename.fn(%.addon))
  var %line = 1
  while ($readini(%.addon,n,files,%line)) {
    _ddadd $dname 19 $lower($_truename.fn($nofile(%.addon) $+ $ifmatch))
    inc %line
  }
  %line = 1
  while ($readini(%.addon,n,other,%line)) {
    _ddadd $dname 19 $lower($_truename.fn($nofile(%.addon) $+ $ifmatch))
    inc %line
  }
  did -z $dname 19
  unset %.addon
}
on *:DIALOG:addoninfo:sclick:16:mailto $did(16)
on *:DIALOG:addoninfo:sclick:17:http $did(17)
on *:DIALOG:addoninfo:dclick:19:edit $did(19).seltext