####################################################
# by wiebe @ QuakeNet
#
####################################################

setudef flag decode

####################################################
# decode:help:msg
####################################################
bind msgm lomn|lomn "help decode" decode:help:msgm
proc decode:help:msgm { n u h t } {
  lappend o "decode: usage decode <\$decode(...)>  -  as given in mIRC"
  lappend o "decode: usage decode <string> \[u|m\]  -  u=uuencode (default), m=mime"
  lappend o "decode: decodes the given string"
  if {[string equal [info procs cnotice] ""]} { foreach l $o { puthelp "NOTICE $n :$l" }
  } else { foreach l $o { cnotice $n $l puthelp "decode: " } }
  putcmdlog "($n!$u) !$h! HELP decode"
  return 1
}


####################################################
# decode:msg
####################################################
bind msg lomn|lomn decode decode:msg
proc decode:msg { n u h t } {
  if {[string equal $t ""]} {
    lappend o "decode: usage decode <\$decode(...)>  -  as given in mIRC"
    lappend o "decode: usage decode <string> \[u|m\]  -  u=uuencode (default), m=mime"
  } else { set o [decode:decode $t] }
  if {[string equal [info procs cnotice] ""]} { foreach l $o { puthelp "NOTICE $n :$l" }
  } else { foreach l $o { cnotice $n $l puthelp "decode: " } }
  return 1
}


####################################################
# decode:dcc
####################################################
bind dcc -|- decode decode:dcc
proc decode:dcc { h i t } {
  if {[string equal $t ""]} {
    lappend o "decode: usage decode <\$decode(...)>  -  as given in mIRC"
    lappend o "decode: usage decode <string> \[u|m\]  -  u=uuencode (default), m=mime"
    lappend o "decode: decodes the given string"
  } else { set o [decode:decode $t] }
  foreach l $o { putidx $i $l }
  return 1
}


####################################################
# decode:decode
####################################################
proc decode:decode { t } {
  set t [split $t]; set d [lindex $t 0]; set m [lindex $t 1]; set r ""
  if {![string match -nocase {[mu]} $m]} { set m u }
  if {[string match -nocase "\$decode(?*)" $d]} {
    set d [string range $d 8 end-1]
    if {[string match -nocase {*?,[mu]} $d]} {
      set m [string range $d end end]; set d [string range $d 0 end-2]
    } elseif {![string match -nocase "*?,*" $d]} {
      set m u; set d [string range $d 0 end-2]      
    } else { set m "" }
  }
  if {[string equal -nocase $m "u"]} {
    if {[catch {set r [::uuencode::decode [string range $d 1 end]]}]} {
      putlog "ERROR using uuencode.tcl, perhaps you have not loaded it?"
    }
    if {![string equal $r ""]} { set r "decode: decoded using uuencode: $r" }
  } elseif {[string equal -nocase $m "m"]} {
    if {[catch {set r [::base64::decode $d]}]} {
      putlog "ERROR using base64.tcl, perhaps you have not loaded it?"
    }
    if {![string equal $r ""]} { set r "decode: decoded using mime: $r" }
  }
  if {[string equal $r ""]} { lappend o "decode: unable to decode given string"
  } else { lappend o $r }
  return $o
}


####################################################
# decode:pubm
####################################################
bind pubm -|- "% *\$??code(?*)*" decode:pubm
proc decode:pubm { n u h c t } {
  if {![validchan $c]} { return 0 }
  if {![channel get $c decode]} { return 0 }
  if {![string match -nocase "*\$decode(?*)*" $t] && ![string match -nocase "*\$encode(?*)*" $t]} { return 0 }
  set l [split [string tolower $t]]; set t [split $t]
  lappend r [lsearch -glob -all $l "*\$decode(?*)*"]
  lappend r [lsearch -glob -all $l "*\$encode(?*)*"]
  set z "ERROR using base64.tcl, perhaps you have not loaded it?"
  foreach e $r {
    if {[string equal $e ""]} { continue }
    set d [lindex $t $e]
    if {[string equal $d ""]} { continue }
    set m ""
    if {[string match -nocase "*\$decode(?*)*" $d]} { set m "\$decode("; set x 0 }
    if {[string match -nocase "*\$encode(?*)*" $d]} { set m "\$encode("; set x 1 }
    if {[string equal $m ""]} { continue }
    set d [string range $d [expr [string first $m $d] +8] [expr [string last ) $d] -1]]
    if {[string match "*?,m" $d]} { set m m } else { set m u }
    set d [join [lrange [split $d ,] 0 end-1] ,]
    if {[string equal $m "m"]} {
      if {$x} { if {[catch {set s [::base64::encode $d]}]} { putlog $z }
      } else { if {[catch {set s [::base64::decode $d]}]} { putlog $z } }
    } else {
      if {$x} { if {[catch {set s [::uuencode::encode $d]}]} { putlog $z }
      } else { if {[catch {set s [::uuencode::decode $d]}]} { putlog $z } }
    }
putloglev 3 $c "DECODE: $c $n ($u): $s"
  }
  return 0
}


set scriptdb(decode) {
  "provides decode command to safely decode strings with mime (base64) or uuencode, same as mIRC's $encode / $decode identifier"
}

