All pastes #836124 Raw Edit

Untitled

public text v1 · immutable
#836124 ·published 2007-12-29 06:39 UTC
rendered paste body
; //--------------
; FTN //. script
;
; If you know what you're doing, feel free to edit anything below.
; However, please be advised that your changes will be lost the
; next time the script is updated.
; --------------//

alias -l ver return 0.5.1


; ###################
; # channel trigger #
; ###################

; you'd better <3 FTN-BOT!
on *:text:*--*:#feedthe.net:{
  if ($network === Darknet-IRC.net) && ($nick === FTN-BOT) {

    ; first we get the category and name
    if (14-- [ * 14] -* iswm $1-5) {
      var %cat = $strip($3,b), %name = $gettok($1-,6,2), %c = $chr(1)
      hadd -mu10 _ftn_tmp next $+($ctime,%c,%cat,%c,%name)
    }

    ; and then we get the url
    elseif (-- [ https://feedthe.net/*] -- iswm $1-) {
      var %url = $3
      if ($hget(_ftn_tmp,next)) {
        hdel _ftn_tmp next
        tokenize 1 $v1
        var %time = $1, %cat = $2, %name = $3
        if (%time) && (%cat) && (%name) && (%url) return $ntfy(%time,%cat,%name,%url)
      }
    }
  }
}

; $ntfy(ctime,category,name,url)
; this one calls the other functions
alias -l ntfy {
  var %w = @FTN, %c = @_ftn_cache, %tab = $chr(9)
  if (!$window(%c)) window -h %c
  aline %c $1 %tab $+($2,) %tab $3 %tab $4

  ; open log window automatically?
  if ($window(%w)) || ($option_get(log_auto)) {
    .ftn_log
    window -g1 %w
  }

  if ($option_get($+(cat_,$strip($2)))) {
    ; show popup notification?
    if ($option_get(popup_show)) popup $4 $2 $3

    ; play sound?
    if ($option_get(sounds_enable)) {
      if ($option_get(sounds_beep)) beep
      elseif ($option_get(sounds_dofile)) && ($isfile($option_get(sounds_file))) splay $option_get(sounds_file)
    }
  }
}


; ######################
; # popup notification #
; ######################

; /popup [url] [category] [release name-]
alias -l popup {

  ; I'm guessing here that the Windows taskbar is 30 pixels high.  this
  ; is bad and will cause overlaps when stacking multiple popups if the
  ; taskbar is any higher than my estimate, but there is simply no way
  ; for mIRC to figure out what the actual height is ;_;
  var %taskbar = 30

  var %w = @_ftn_popup, %wi = 200, %hi = 100, %x = $calc($window(-1).w - %wi - 10), %y = $calc($window(-1).h - %hi - %taskbar)
  ; stacking popups, are we?
  if ($window(%w)) {
    var %i = 1
    while ($window($+(@_ftn_popup,%i))) inc %i
    if (%i >= $int($calc(($window(-1).h - %taskbar) / %hi))) return
    var %w = $+(@_ftn_popup,%i), %y = $calc(%y - (%hi * %i))
  }
  window -hpdBn +Ld %w %x %y %wi %hi
  titlebar %w $1

  ; background
  drawrect -nrf %w 0 1 0 0 %wi %hi
  ; top
  drawtext -nrf %w 15237165 fixedsys 8 5 1 //.
  drawtext -nrf %w 12829635 arial 10 35 2 NEW UPLOAD
  drawtext -nrfo %w 16777215 arial 10 $calc(%wi - 12) 2 x
  drawline -nrf %w 15237165 1 5 17 $calc(%wi - 5) 17

  ; category + name
  var %font = arial, %size = 11
  drawtext -nrfpob %w 6974058 0 %font %size 5 25 $chr(91) $2 $+(,])
  var %i = 1, %t = $wrap($3-,%font,%size,$calc(%wi - 10),0)
  while (%i <= %t) {
    drawtext -nrf %w 16777215 %font %size 5 $calc(30 + (15 * %i)) $wrap($3-,%font,%size,$calc(%wi - 10),%i)
    inc %i
  }

  ; fade in
  if ($option_get(popup_fade)) {
    drawdot %w
    setlayer 0 %w
    window -o %w
    var %i = 5, %z = 220
    while (%i <= %z) {
      $+(.timer_ftn_fade.,%w,.,%i) -om 1 $calc(%i * 4) setlayer %i %w
      inc %i 15
    }
    $+(.timer_ftn_fadeout,.,%w) -o 1 $option_get(popup_delay) fadeout %w
  }

  ; ..or not
  else {
    drawdot %w
    window -o %w
    $+(.timer_ftn_close,.,%w) -o 1 $option_get(popup_delay) window -c %w
  }
}

; /fadeout <@window>
; all this niftyness will only work on win2k+ btw
alias -l fadeout {
  if ($window($1)) {
    var %i = 220, %z = 15
    while (%i >= %z) {
      $+(.timer_ftn_fade.,$1,.,%i) -om 1 $calc((220 - %i) * 5) setlayer %i $1
      dec %i 15
    }
    $+(.timer_ftn_close,.,$1) -om 1 $calc((220 - %i) * 5) window -c $1
  }
}

menu @_ftn_popup* {
  sclick:{
    ; x button: close popup
    if ($inrect($mouse.x,$mouse.y,$calc($window($active).w - 17),0,20,15)) window -c $active
    ; anywhere else: follow link
    elseif ($inrect($mouse.x,$mouse.y,0,20,$window($active).w,$window($active).h)) url -n $window($active).title
  }
}


; ##############
; # log window #
; ##############

; /ftn_log
alias ftn_log {
  var %w = @FTN, %c = @_ftn_cache, %h = _ftn_tmp, %sel = 1, %tab = $chr(9)
  if (!$window(%w)) {

    ; try to associate the window with the proper network
    var %x = 1, %t = $scon(0), %scon
    while (%x <= %t) {
      if ($scon(%x).network === Darknet-IRC.net) {
        %scon = %x
        break
      }
      inc %x
    }
    if (!%scon) %scon = $scon($scid($cid))

    ; open the window
    if ($version >= 6.2) scon %scon window $+(-l20k0,$iif($option_get(log_desktop),dh),$iif(!$show,n)) -t5,12,25 %w
    else scon %scon window $+(-l20k0,$iif($option_get(log_desktop),dh),$iif(!$show,n)) -t10,25 %w
    if ($option_get(log_desktop)) window -a %w

    ; set titlebar + font and fill it up!
    titlebar %w log window
    font %w 11 tahoma
    if ($hget(%h)) hdel %h search
    fill *
  }

  ; window's already open
  else {
    var %fltr = $hget(%h,filter), %sel = $sline(%w,1).ln
    .fill -d *
    hadd -m %h filter %fltr
    if ($active != %w) && ($show) window -a %w
  }

  ; fill category side-list
  clear -l %w
  var %total = $line(%c,0)
  aline -l %w All categories ( $+ %total $+ )
  sline -l %w 1

  if (%total) {
    aline -l %w $str(–,99)

    ; I need to find another way of doing this because this is slow as hell
    var %x = 1, %t = $gettok($cats,0,32)
    while (%x <= %t) {
      var %cat = $gettok($cats,%x,32)

      ; don't count nr of entries (for slow systems)
      if ($option_get(log_nocount)) aline -l %w %cat
      else {
        filter -wf %c NUL $+(*,%tab,*,%cat,*,%tab,*,%tab https://feedthe.net/*)
        if ($filtered) aline -l %w %cat ( $+ $v1 $+ )
      }

      inc %x
    }
  }

  aline -l %w $str(–,99)
  if (!$hget(%h,search)) aline -l %w Search...
  else aline -l %w Clear search
  sline -l %w %sel
}

; /fill [-d] <filter>
alias -l fill {
  ; creating a temporary hidden output window will speed up
  ; things quite a lot, as watching text get added to a window
  ; is just terribly, terribly slow in mIRC

  var %w = @FTN, %c = @_ftn_cache, %o = @_ftn_output, %t = @_ftn_tmp, %h = _ftn_tmp
  if (!$window(%c)) window -h %c
  window -h %o
  clear %o
  aline %o $sep

  ; apply previously used filter?
  if (!$show) && ($1 == -d) && ($2) {
    window -h %t
    filter -wwc %c %t $iif($hget(%h,filter),$v1,*)
    if ($hget(%h,search)) filter -wwc %t %t $+(*,%tab,*,%tab,*,$v1,*,%tab https://feedthe.net/*)
    %c = %t
    tokenize 32 $2-
  }
  else hadd -m %h filter $1-

  ; this speeds up things.. a little
  if ($option_get(log_date) == 1) hadd -m %h date_format dd/mm HH:nn
  elseif ($option_get(log_date) == 2) hadd -m %h date_format mm/dd HH:nn
  filter $+(-wkt,$iif($option_get(log_order) == 2,e)) $option_get(log_sort) 9 %c add $1-
  hdel %h date_format

  if (!$filtered) {
    aline %o No results
    aline %o $sep
  }

  ; output everything to main log window
  filter -wwc %o %w *
  window -c %o
  window -c %t
}

; returns horizontal line
alias -l sep return $+(14,$str(–,200))
; returns all possible categories, seperated by spaces
alias -l cats {
  return Anime Apps/PC-ISO Apps/PC-RiP DOX Games/DS Games/GBA Games/PC-ISO Games/PC-RiP $&
    Games/PS2 Games/PSP Games/Wii Games/X-Box Misc Movies/DVDr Movies/HD Movies/PSP Movies/SVCD $&
    Movies/VCD Movies/XviD Music Mvids TV/HD TV/XviD XXX
}

; called by /filter: niftifies log entry
alias -l add {
  var %o = @_ftn_output, %tab = $chr(9)
  tokenize 9 $1-
  aline %o $asctime($1,$hget(_ftn_tmp,date_format)) %tab $+(,$2,) %tab $+(,$3,)
  aline %o %tab %tab $+(,$4,)
  aline %o $sep
}

; menu for log window
menu @FTN {
  dclick:{
    var %w = $menu, %c = @_ftn_cache, %h = _ftn_tmp, %tab = $chr(9)
    if ($1 == 1) fill *
    elseif ($1 == $line(%w,0,1)) {

      ; search function (side-list item)
      if ($line(%w,$1,1) == Search...) {
        var %q = $$input(Search for...,eq,Search)
        .fill -d $+(*,%tab,*,%tab,*,%q,*,%tab https://feedthe.net/*)
        hadd -m %h search %q
        rline -l %w $1 Clear search
        return
      }
      ; clearing search
      else {
        fill *
        sline -l %w 1
      }
    }
    ; filtering by category
    elseif ($line(%w,$1,1) != $str(–,99)) fill $+(*,%tab,*,$gettok($v1,1,32),*,%tab,*,%tab https://feedthe.net/*)
    if ($line(%w,$1,1) != $str(–,99)) && ($line(%w,$line(%w,0,1),1) == Clear search) {
      rline -l %w $line(%w,0,1) Search...
      if ($hget(%h)) hdel %h search
    }
  }

  ; search function (right-click menu item)
  $iif($hget(_ftn_tmp,search),Clear &search,&Search...):{
    var %w = $menu, %h = _ftn_tmp, %tab = $chr(9)
    ; clearing search
    if ($hget(_ftn_tmp,search)) {
      fill *
      sline -l %w 1
      rline -l %w $line(%w,0,1) Search...
      if ($hget(%h)) hdel %h search
    }
    ; new search
    else {
      var %q = $$input(Search for...,eq,Search)
      .fill -d $+(*,%tab,*,%tab,*,%q,*,%tab https://feedthe.net/*)
      hadd -m %h search %q
      rline -l %w $line(%w,0,1) Clear search
    }
  }
  &Options...:ftn_options
  -
  Sort &by
  .$iif($option_get(log_sort) == 1,$style(1)) &Date:log_sort 1 $option_get(log_order)
  .$iif($option_get(log_sort) == 2,$style(1)) &Category:log_sort 2 $option_get(log_order)
  .$iif($option_get(log_sort) == 3,$style(1)) &Name:log_sort 3 $option_get(log_order)
  .-
  .&Order
  ..$iif($option_get(log_order) == 1,$style(1)) &Ascending:log_sort $option_get(log_sort) 1
  ..$iif($option_get(log_order) == 2,$style(1)) &Descending:log_sort $option_get(log_sort) 2
  C&lear log:{
    if ($input(Are you sure you want to permanently clear the log?,qy,FTN //. Clear Log?)) {
      var %w = @FTN, %c = @_ftn_cache
      clear %c
      ftn_log
    }
  }
  -
  .&Close log window:window -c $active
}

; /log_sort <1|2|3> <1|2>
;           <type>  <order>
;           <1=date|2=cat|3=name> <1=asc|2=desc>
alias -l log_sort {
  var %w = @FTN
  option_set log_sort $1
  option_set log_order $2
  if ($window(%w)) .fill -d *
}


; #################
; # self-updating #
; #################

alias ftn_update {
  var %s = _ftn_update.check
  if ($sock(%s)) sockclose %s
  sockopen %s ftn.ohok.nl 80
  sockmark %s $show
}

; ## update socket events ##

on *:sockopen:_ftn_update.*:{
  var %s = $sockname, %w = sockwrite -n %s, %g, %show = $sock(%s).mark
  if ($sockerr) return $iif(%show,$eval($+($,err_update_,$gettok(%s,2,46)),2))

  if (*.check iswm %s) %g = $+(/uc.php?ver=,$ver)
  if (*.changelog iswm %s) %g = /changelog.txt
  if (*.download iswm %s) %g = /ftn.mrc

  %w GET %g HTTP/1.0
  %w Host: ftn.ohok.nl
  %w User-Agent: $+(mIRC/,$version)
  %w Connection: Close
  %w
}

on *:sockread:_ftn_update.*:{
  var %s = $sockname, %dat, %read = $true, %show = $sock(%s).mark
  if ($sockerr) return $iif(%show,$eval($+($,err_update_,$gettok(%s,2,46)),2))

  ; update check
  if (*.check iswm %s) {
    while (%read) {
      sockread -f %dat
      tokenize 32 %dat
      if ($1 == X-FTN-Update:) {
        sockmark %s %show $true

        ; we've got the latest version
        if ($2 == OK) {
          if (%show) .timer 1 0 return $!input(You are running the latest version of the FTN $+(script.,$str($crlf,2),There) $&
            are no updates available at this time.,io,FTN //. Update Check)
          sockclose %s
          return
        }

        ; new version available!
        else {
          var %latest = $2, %md5 = $3
          .timer 1 0 show_update %latest %md5
          sockclose %s
          return
        }
      }
      if (!$sockbr) %read = $false
    }
  }

  ; downloading changelog or script
  elseif (*.changelog iswm %s) || (*.download iswm %s) {
    var %f = $+(",$scriptdir,\_ftn_update_data.tmp")
    while (%read) {
      sockread &dat
      if ($bvar(&dat,0)) bwrite %f -1 -1 &dat
      if (!$sockbr) %read = $false
    }
  }
}

on *:sockclose:_ftn_update.*:{
  var %s = $sockname
  tokenize 32 $sock(%s).mark

  ; never got any valid reply!
  if (*.check iswm %s) && ($1) && (!$2) return $err_update_check

  ; just finished downloading something?
  elseif (*.changelog iswm %s) || (*.download iswm %s) {
    var %f = $+(",$scriptdir,\_ftn_update_data.tmp"), %d = ftn_update

    bread %f 0 $file(%f).size &file
    bcopy &file2 1 &file $calc($bfind(&file,1,13 10 13 10) + 4) -1

    write -c %f
    bwrite %f -1 -1 &file2
    bunset &file &file2

    ; feed changelog to dialog
    if (*.changelog iswm %s) {
      if ($dialog(%d)) filter -foc %f %d 2
      .remove %f
    }

    ; just downloaded script
    elseif (*.download iswm %s) {
      tokenize 32 $sock(%s).mark

      ; md5sums don't match; reject file
      if ($md5(%f,2) !== $2) {
        .remove %f
        return $err_update_download
      }

      ; ok let's go: update and reload script
      else {
        var %script = $+(",$script,")
        dialog -x %d
        filter -ffc %f %script
        .remove %f
        .timer -m 1 250 __ftn_update_verif $1
        .reload -rs %script
      }
    }
  }
}

; ## update error messages ##

alias -l err_update_check {
  .timer 1 0 return $!input(An error occured while attempting to $&
    check for a new version of the FTN script.,ho,FTN //. Update Check)
}
alias -l err_update_changelog {
  if ($dialog(ftn_update)) did -a ftn_update 2 $& 
    $+($str($crlf,2),Failed to retrieve changelog.)
}
alias -l err_update_download {
  .timer 1 0 return $!input(An error occured while attempting to $&
    download the latest version of the FTN script.,ho,FTN //. Update Check)
  if ($dialog(ftn_update)) dialog -x ftn_update
}

; ## update dialog 'n' stuff ##

alias -l show_update {
  var %d = ftn_update, %h = _ftn_tmp
  if ($dialog(%d)) dialog -x %d
  hadd -m %h ver_latest $1
  hadd %h ver_md5 $2
  dialog -m %d %d
}

dialog -l ftn_update {
  title "FTN //. Update Check"
  size -1 -1 210 135
  option dbu
  text "A new version of the FTN script is available.", 1, 5 4 200 8
  edit "Changelog:", 2, 5 15 200 90, read multi vsbar
  text "Update to version x.x.x now? (recommended)", 3, 5 108 200 8
  button "&Update", 4, 127 119 37 12, default
  button "&Cancel", 5, 168 119 37 12, cancel
  edit "latest", 6, 0 0 0 0, hide autohs
  edit "md5", 7, 0 0 0 0, hide autohs
}

on *:dialog:ftn_update:*:*:{
  if ($devent == init) {
    var %h = _ftn_tmp
    did -ra $dname 6 $hget(%h,ver_latest)
    did -ra $dname 7 $hget(%h,ver_md5)
    hdel -w %h ver_*

    did -a $dname 2 $+($str($crlf,2),Loading..)
    did -ra $dname 3 $replace($did($dname,3),x.x.x,$did($dname,6))

    var %s = _ftn_update.changelog
    if ($sock(%s)) sockclose %s
    sockopen %s ftn.ohok.nl 80
  }
  if ($devent == sclick) && ($did == 4) {
    ; close options dialog if it is open
    if ($dialog(ftn_options)) dialog -x ftn_options

    did -ra $dname 2 Now downloading the latest version of the FTN $+(script.,$crlf,Please) wait...
    did -b $dname 4,5

    var %s = _ftn_update.download
    if ($sock(%s)) sockclose %s
    sockopen %s ftn.ohok.nl 80
    sockmark %s $did($dname,6) $did($dname,7)
  }
}

; ## update verficication ##
; /__ftn_update_verif <version>
alias __ftn_update_verif {
  if ($1 == $ver) return $input(Successfully updated the FTN script to the latest $&
    $+(version.,$str($crlf,2),You) are now running version $+($ver,.),io,FTN //. Update Complete)
  else return $input(The update seems to have failed due to reasons $+(unknown.,$str($crlf,2),You) $& 
    may want to ask for $+(support,$chr(44)) or redownload the script.,wo,FTN //. Update Error)
}


; ##################
; # options dialog #
; ##################

dialog ftn_options {
  title "FTN //. Options"
  size -1 -1 175 142
  option dbu
  tab "&Notifications", 1, 5 2 164 120
  check "&Enable popup notifications for new uploads", 5, 15 23 130 10, tab 1
  check "Use &fade in/out effects", 6, 25 35 80 10, tab 1
  text "Show notification for", 7, 26 48 54 8, tab 1
  edit "", 8, 80 47 15 10, tab 1 autohs limit 2
  text "seconds", 9, 99 48 25 8, tab 1
  check "&Play sound when a new upload is announced", 21, 15 62 130 10, tab 1
  radio "Use mIRC's /beep command", 22, 25 74 130 10, tab 1
  radio "File:", 23, 25 86 25 10, tab 1
  edit "", 24, 50 86 70 10, tab 1 read autohs
  edit "", 29, 50 86 70 10, hide tab 1 read autohs
  button "&Browse...", 25, 124 85 37 12, tab 1
  button "Category settings...", 28, 15 103 60 12, tab 1
  tab "&Log window", 2
  check "Open log window when a new upload is &announced", 10, 15 23 140 10, tab 2
  check "Show log window on &desktop", 11, 15 35 90 10, tab 2
  text "Date format:", 12, 15 75 40 8, tab 2
  combo 13, 58 74 105 50, tab 2 size drop
  text "Sort by:", 14, 15 88 40 8, tab 2
  combo 15, 58 87 50 50, tab 2 size drop
  combo 16, 113 87 50 50, tab 2 size drop
  check "Don't show number of entries per category in sidelist,", 26, 15 47 150 10, tab 2
  text "and just show all categories (speeds up processing)", 27, 23 58 140 8, tab 2
  tab "&Updates", 17
  check "&Automatically check for updates when mIRC starts", 18, 15 23 140 10, tab 17
  text "You are running version x.x.x", 19, 15 43 150 8, tab 17
  button "&Check for updates", 20, 15 53 60 12, tab 17
  button "&Cancel", 3, 132 127 37 12, cancel
  button "&OK", 4, 92 127 37 12, default ok
}

on *:dialog:ftn_options:*:*:{
  if ($devent == init) {
    ; popup tab
    if ($option_get(popup_show)) did -c $dname 5
    else did -b $dname 6-9
    if ($option_get(popup_fade)) did -c $dname 6
    did -ra $dname 8 $option_get(popup_delay)

    ; sounds stuff
    if ($option_get(sounds_enable)) did -c $dname 21
    else did -b $dname 22-25
    if ($option_get(sounds_beep)) {
      did -c $dname 22
      did -b $dname 25
    }
    elseif ($option_get(sounds_dofile)) did -c $dname 23
    did -ra $dname 29 $option_get(sounds_file)
    did -ra $dname 24 $nopath($did($dname,29))

    if (!$option_get(popup_show)) && (!$option_get(sounds_enable)) did -b $dname 28

    ; log window tab
    if ($option_get(log_auto)) did -c $dname 10
    if ($option_get(log_desktop)) did -c $dname 11
    if ($option_get(log_nocount)) did -c $dname 26
    didtok $dname 13 44 Day/Month $asctime(HH:nn) , Month/Day $asctime(HH:nn)
    did -c $dname 13 $option_get(log_date)
    didtok $dname 15 44 Date,Category,Name
    did -c $dname 15 $option_get(log_sort)
    didtok $dname 16 44 Ascending,Descending
    did -c $dname 16 $option_get(log_order)

    ; updates tab
    if ($option_get(update_auto)) did -c $dname 18
    did -ra $dname 19 $replace($did($dname,19),x.x.x,$ver)
  }

  if ($devent == sclick) {
    ; enable/disable popup notifications
    if ($did == 5) {
      if ($did($dname,5).state) did -e $dname 6-9,28
      else {
        did -b $dname 6-9
        if (!$did($dname,21).state) did -b $dname 28
      }
    }
    ; enable/disable sounds section
    if ($did == 21) {
      if ($did($dname,21).state) did -e $dname 22-25,28
      else {
        did -b $dname 22-25
        if (!$did($dname,5).state) did -b $dname 28
      }
    }
    ; enable/disable browse button
    if ($did == 22) || ($did == 23) {
      if ($did($dname,23).state) did -e $dname 25
      else did -b $dname 25
    }
    ; check for updates
    if ($did == 20) ftn_update
    ; browse for sounds
    if ($did == 25) {
      if ($sfile($+($nofile($did($dname,29)),*.mp3),Select sound file)) {
        did -ra $dname 29 $v1
        did -ra $dname 24 $nopath($v1)
        ;splay $+(",$v1,")
      }
    }
    ; category settings
    if ($did == 28) dialog -m ftn_cats ftn_cats
    ; ok button
    if ($did == 4) {
      var %w = @FTN

      option_set popup_show $did($dname,5).state
      option_set popup_fade $did($dname,6).state
      option_set popup_delay $did($dname,8)

      option_set sounds_enable $did($dname,21).state
      option_set sounds_beep $did($dname,22).state
      option_set sounds_dofile $did($dname,23).state
      option_set sounds_file $did($dname,29)

      option_set log_auto $did($dname,10).state
      ; re-open ftn log window if deemed necessary
      if ($window(%w)) && (($did($dname,11).state != $option_get(log_desktop)) || $& 
        ($did($dname,26).state != $option_get(log_nocount))) {
        option_set log_desktop $did($dname,11).state
        option_set log_nocount $did($dname,26).state
        window -c %w
        ftn_log
      }
      else {
        option_set log_desktop $did($dname,11).state
        option_set log_nocount $did($dname,26).state
      }
      option_set log_date $did($dname,13).sel

      log_sort $did($dname,15).sel $did($dname,16).sel
      option_set update_auto $did($dname,18).state
    }
  }
}


; category settings dialog

dialog -l ftn_cats {
  title "FTN //. Category Settings"
  size -1 -1 137 150
  option dbu
  text "", 1, 6 3 125 21
  list 2, 6 40 125 90, size extsel check
  button "&Cancel", 3, 93 135 37 12, cancel
  button "&Ok", 4, 53 135 37 12, ok
  text "", 5, 6 24 125 15
}

on *:dialog:ftn_cats:*:*:{
  if ($devent == init) {
    ; adding these lines by /did because I HATE having a horizontal scrollbar in my script editor
    did -ra $dname 1 For each category below, you can choose whether or not to show popup $& 
      notifications and/or play sounds for new uploads in that category.
    did -ra $dname 5 Please note: the uploads will still be listed in the log window, and $& 
      these settings obey the main ones.

    var %x = 1, %t = $gettok($cats,0,32)
    while (%x <= %t) {
      var %cat = $gettok($cats,%x,32)
      did -a $dname 2 %cat
      if ($option_get($+(cat_,%cat))) did -s $dname 2 %x
      inc %x
    }
  }

  ; OK button
  if ($devent == sclick) && ($did == 4) {
    var %x = 1, %t = $did($dname,2).lines
    while (%x <= %t) {
      option_set $+(cat_,$did($dname,2,%x)) $did($dname,2,%x).cstate
      inc %x
    }
  }
}



; ## options handling (including default options) ##

alias ftn_options {
  var %d = ftn_options
  if ($dialog(%d)) dialog -x %d
  dialog -m %d %d
}
alias -l option_get {
  var %i = $hget(ftn_options,$1)
  if (* iswm %i) return %i

  ; option defaults
  else {
    if ($1 == popup_show) return 1
    if ($1 == popup_fade) return 1
    if ($1 == popup_delay) return 5
    if ($1 == sounds_beep) return 1

    if ($1 == log_auto) return 1
    if ($1 == log_date) return 1
    if ($1 == log_sort) return 1
    if ($1 == log_order) return 1

    if ($1 == update_auto) return 1

    if (cat_* iswm $1) return 1
  }
}
alias -l option_set {
  var %h = ftn_options
  if (!$hget(%h)) hmake %h 5
  hadd %h $1 $2
}

; ## options loading/loading on start/exit ##

on *:exit:{
  var %h = ftn_options, %f = $+(",$scriptdir,\,ftn_config.db")
  if ($hget(%h)) hsave -i %h %f options
}
on *:start:{
  var %h = ftn_options, %f = $+(",$scriptdir,\,ftn_config.db")
  if ($ini(%f,options)) {
    hmake %h 5
    hload -i %h %f options
  }

  ; ## check for updates on start? ##
  if ($option_get(update_auto)) .ftn_update
}


; ###################
; # some lame menus #
; ###################

menu channel,menubar {
  -
  $iif($active == #feedthe.net,&FTN //. script)
  .&Log window:ftn_log
  .&Options...:ftn_options
}

; love and kisses,
; - thame^