# Este script funciona como un diccionario
# Para que algun usuarios pueda modificar el estado del dicionario
# debe de tener la flag +M
# Para darle esta flag a alguien solo copie en la consola ".chattr handle +M"

#########
# BINDS #
#########

bind pub - "!explicar" dic:explicar_palabra
bind pub - "!addword" dic:agregar_palabra
bind pub - "!delword" dic:borrar_palabra
bind pub - "!modificar" dic:modificar_palabra
bind pub - "!cerrar-diccionario" dic:cerrar_diccionario
bind pub - "!abrir-diccionario" dic:abrir_diccionario
bind pub - "!dayuda" dic:diccionario_ayuda
bind pub - "!dayuda-explicar" dic:diccionario_ayuda_explicar
bind pub - "!dayuda-addword" dic:diccionario_ayuda_addword
bind pub - "!dayuda-delword" dic:diccionario_ayuda_delword
bind pub - "!dayuda-modificar" dic:diccionario_ayuda_modificar
bind pub - "!dayuda-dayuda" dic:diccionario_ayuda_dayuda
bind pub - "!dayuda-cerrar-diccionario" dic:diccionario_ayuda_cerrar_diccionario
bind pub - "!dayuda-abrir-diccionario" dic:diccionario_ayuda_abrir_diccionario
bind join - "*" dic:buscar_palabra

########
# SETS #
########

set dicdatabase "logs/diccionario"
set dicestado 0

#########
# PROCS #
#########

proc dic:listtostring {list belem selem} {
 set ret [lrange $list $belem $selem]
 set ret [string trim $ret "{"]
 set ret [string trim $ret "}"]
 return $ret
}

proc dic:cerrar_diccionario {nick idx handle channel args} {
 global dicestado
 if {![matchattr $handle "M"]} {
  putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0"
  putserv "NOTICE $nick :No estas autorizado para cambiar el estado del diccionario."
  return 0
 }
 if {$dicestado==0} {
  set dicestado 1
  putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0"
  putserv "NOTICE $nick :El diccionario se ha cerrado correctamente."
  putserv "NOTICE $nick :Desde ahora no se podra seguir usando el comando '!explicar'."
  putserv "NOTICE $nick :Para abrir de nevo el diccionario utilize el comando '!abrir-diccionario'."
  return 0
 }
 if {$dicestado==1} {
  putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0"
  putserv "NOTICE $nick :El diccionario ya estaba cerrado."
  return 0
 }
}

proc dic:abrir_diccionario {nick idx handle channel args} {
 global dicestado
 if {![matchattr $handle "M"]} {
  putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0"
  putserv "NOTICE $nick :No estas autorizado para cambiar el estado del diccionario."
  return 0
 }
 if {$dicestado==1} {
  set dicestado 0
  putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0"
  putserv "NOTICE $nick :El diccionario se ha abierto correctamente."
  putserv "NOTICE $nick :Desde ahora estara habilitado el comando '!explicar'."
  putserv "NOTICE $nick :Para cerrar de nevo el diccionario utilize el comando '!cerrar-diccionario'."
  return 0
 }
 if {$dicestado==0} {
  putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0"
  putserv "NOTICE $nick :El diccionario ya estaba abierto."
  return 0
 }
}

proc dic:buscar_palabra {nick idx handle channel args} {
 global dicdatabase
 if {[getuser $handle xtra auth]=="YES"} {return 0}
 lappend llist $nick $handle
 foreach palabra $llist {
  set databaseref [open $dicdatabase r]
  while {![eof $databaseref]} {
   gets $databaseref palref
   set explicacionref [lindex [split $palref "="] 1]
   set palref [lindex [split $palref "="] 0]
   if {($palref==[string tolower $nick])&&([rand 100]>80)&&($palref!="")} {
    putserv "PRIVMSG $channel :1$palref: 1$explicacionref"
    close $databaseref
    return 0
   }
 }
 close $databaseref
 }
 return 0
}

proc dic:explicar_palabra {nick idx handle channel args} {
 global dicdatabase dicestado
 if {$dicestado==1} { 
  putserv "PRIVMSG $channel :\002$nick\002 El diccionario esta cerrado."
  return 0 
 }
 if {![file exist $dicdatabase]} { 
  set darchivo [open $dicdatabase w]
  puts -nonewline $darchivo ""
  close $darchivo
 }
 set palabra [dic:listtostring $args 0 end]
 set darchivo [open $dicdatabase r]
 set dlinea ""
 while {![eof $darchivo]} {
  gets $darchivo dlinea
  set dlinea [split $dlinea "="]
  set dpalabra [lindex $dlinea 0]
  set dexplicacion [lindex $dlinea 1]
  set palabra [string tolower $palabra]
  if {$dpalabra==$palabra} {
   putserv "PRIVMSG $channel :1$palabra: 1$dexplicacion"
   close $darchivo
   return 0
  }
 }
 close $darchivo
 putserv "PRIVMSG $channel :La palabra 1$palabra no esta en mi base de datos."
 return 0
}

proc dic:agregar_palabra {nick idx handle channel args} {
 global dicdatabase
 if {![matchattr $handle "M"]} {
  putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0"
  putserv "NOTICE $nick :No estas autorizado para agregar palabras a mi base de datos."
  return 0
 }
 if {![file exist $dicdatabase]} {
  set darchivo [open $dicdatabase w]
  puts -nonewline $darchivo ""
  close $darchivo
 }
 set args [dic:listtostring $args 0 end]
 set args [split $args "="]
 set palabra [lindex $args 0]
 set explicacion [lindex $args 1]
 set palabra [string tolower $palabra]
 set darchivo [open $dicdatabase r]
 if {($palabra=="")||($explicacion=="")} {
  putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0"
  putserv "NOTICE $nick :Hacen falta parametros requeridos."
  putserv "NOTICE $nick :uso: !addword palabra=explicacion"
  return 0
 }
 while {![eof $darchivo]} {
  gets $darchivo dlinea
  set vpalabra [lindex [split $dlinea "="] 0]
  if {$vpalabra==$palabra} {
   putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0"
   putserv "NOTICE $nick :Esa palabra ya esta agregada en mi base de datos:"
   putserv "NOTICE $nick :1$palabra: 1$explicacion"
   putserv "NOTICE $nick :Para modificarla copia '!modificar palabra=explicacion.'"
   close $darchivo
   return 0
  }
 }
 close $darchivo
 set darchivo [open $dicdatabase a]
 puts $darchivo "$palabra=$explicacion"
 close $darchivo
 putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0"
 putserv "NOTICE $nick :La palabra 1$palabra a sido agregada correctamente a mi base de datos."
 putserv "NOTICE $nick :1$palabra: 1$explicacion"
}

proc dic:borrar_palabra {nick idx handle channel args} {
 global dicdatabase
 if {![matchattr $handle "M"]} {
  putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0"
  putserv "NOTICE $nick :No estas autorizado para borrar palabras de mi base de datos."
  return 0
 }
 if {![file exist $dicdatabase]} { 
  set darchivo [open $dicdatabase w]
  puts -nonewline $darchivo ""
  close $darchivo
 }
 set palabra [dic:listtostring $args 0 end]
 set darchivo [open $dicdatabase r]
 set dlinea ""
 while {![eof $darchivo]} {
  gets $darchivo dlinea1
  set dlinea [split $dlinea1 "="]
  set dpalabra [lindex $dlinea 0]
  set dexplicacion [lindex $dlinea 1]
  set palabra [string tolower $palabra]
  if {$dpalabra!=$palabra} {
   lappend datalist $dlinea1
  } else {
 putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0"
 putserv "NOTICE $nick :1$dpalabra: 1$dexplicacion"
 putserv "NOTICE $nick :La palabra 1$palabra a sido borrada correctamente de mi base de datos."
  }
 }
 close $darchivo
 set archivo [open $dicdatabase w]
 foreach line $datalist {
  if {$line!=""} {puts $archivo $line}
 }
 close $archivo
}

proc dic:modificar_palabra {nick idx handle channel args} {
 global dicdatabase
 if {![matchattr $handle "M"]} {
  putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0"
  putserv "NOTICE $nick :No estas autorizado para modificar las palabras de mi base de datos."
  return 0
 }
 if {![file exist $dicdatabase]} { 
  set darchivo [open $dicdatabase w]
  puts -nonewline $darchivo ""
  close $darchivo
 }
 set args [dic:listtostring $args 0 end]
 set args [split $args "="]
 set palabra [lindex $args 0]
 set explicacion [lindex $args 1]
 set palabra [string tolower $palabra]
 set darchivo [open $dicdatabase r]
 if {($palabra=="")||($explicacion=="")} {
  putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0"
  putserv "NOTICE $nick :Hacen falta parametros requeridos."
  putserv "NOTICE $nick :uso: !modificar palabra=explicacion"
  return 0
 }
 set darchivo [open $dicdatabase r]
 set dlinea ""
 while {![eof $darchivo]} {
  gets $darchivo dlinea1
  set dlinea [split $dlinea1 "="]
  set dpalabra [lindex $dlinea 0]
  set dexplicacion [lindex $dlinea 1]
  set palabra [string tolower $palabra]
  if {$dpalabra!=$palabra} {
   lappend datalist $dlinea1
  } else {
   lappend datalist "$palabra=$explicacion"
   putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0"
   putserv "NOTICE $nick :1$dpalabra: 1$dexplicacion"
   putserv "NOTICE $nick :La palabra 1$palabra a sido modificada correctamente en mi base de datos."
  }
 }
 close $darchivo
 set archivo [open $dicdatabase w]
 foreach line $datalist {
  if {$line!=""} {puts $archivo $line}
 }
 close $archivo
}

proc dic:diccionario_ayuda {nick idx handle channel args} {
 global dicestado
 set diccionarioayuda ""
 putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0."
 putserv "NOTICE $nick :Ayuda Comandos de DICCIONARIO by 4BaRDaHL"
 if {[matchattr $handle M]} {
  if {$dicestado==0} {
   putserv "NOTICE $nick : - 1!cerrar-diccionario - "
  }
  if {$dicestado==1} {
   putserv "NOTICE $nick : - 1!abrir-diccionario - "
  }
  putserv "NOTICE $nick : - 1!addword - 1!delword - 1!modificar - "
 }
 if {$dicestado==0} {
  putserv "NOTICE $nick : - 1!explicar - "
 }
 putserv "NOTICE $nick : - 1!dayuda - 1!dayuda-comando - "
 putserv "NOTICE $nick :Para obtener ayuda sobre un comando especifico copie '1!dayuda-comando'"
 putserv "NOTICE $nick :DICCIONARIO by 4BaRDaHL 1v2.0."
}

proc dic:diccionario_ayuda_addword {nick idx handle channel args} {
 global diccionarioayuda
 set diccionarioayuda ""
 if {[matchattr $handle M]} {
  putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0."
  putserv "NOTICE $nick :Ayuda Comandos de DICCIONARIO by 4BaRDaHL"
  putserv "NOTICE $nick : - 1!addword palabra=descripcion Agrega la palabra y su descripcion a la base de datos del diccionario para luego poder ser explicada mediante el comando '!explicar'"
  putserv "NOTICE $nick :DICCIONARIO by 4BaRDaHL 1v2.0."
 }
}

proc dic:diccionario_ayuda_explicar {nick idx handle channel args} {
 global diccionarioayuda
 set diccionarioayuda ""
 putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0."
 putserv "NOTICE $nick :Ayuda Comandos de DICCIONARIO by 4BaRDaHL"
 putserv "NOTICE $nick : - 1!explicar palabra Busca la palabra en la base de datos del diccionario y si esta existe da la explicacion de esta palabra en el canal."
 putserv "NOTICE $nick :DICCIONARIO by 4BaRDaHL 1v2.0."
}

proc dic:diccionario_ayuda_delword {nick idx handle channel args} {
 global diccionarioayuda
 set diccionarioayuda ""
 if {[matchattr $handle M]} {
  putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0."
  putserv "NOTICE $nick :Ayuda Comandos de DICCIONARIO by 4BaRDaHL"
  putserv "NOTICE $nick : - 1!delword palabra Busca la palabra en la base de datos del diccinario y si esta existe la elimina."
  putserv "NOTICE $nick :DICCIONARIO by 4BaRDaHL 1v2.0."
 }
}

proc dic:diccionario_ayuda_modificar {nick idx handle channel args} {
 global diccionarioayuda
 set diccionarioayuda ""
 if {[matchattr $handle M]} {
  putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0."
  putserv "NOTICE $nick :Ayuda Comandos de DICCIONARIO by 4BaRDaHL"
  putserv "NOTICE $nick : - 1!modificar palabra=nuevadescripcion Busca la palabra en la base de datos del diccionario y si esta existe cambia su descripcion por la nueva descripcion."
  putserv "NOTICE $nick :DICCIONARIO by 4BaRDaHL 1v2.0."
 }
}

proc dic:diccionario_ayuda_dayuda {nick idx handle channel args} {
 global diccionarioayuda
 set diccionarioayuda ""
 putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0."
 putserv "NOTICE $nick :Ayuda Comandos de DICCIONARIO by 4BaRDaHL"
 putserv "NOTICE $nick : - 1!dayuda-comando Muestra la ayuda de un comando determinado."
 putserv "NOTICE $nick :DICCIONARIO by 4BaRDaHL 1v2.0."
}

proc dic:diccionario_ayuda_abrir_diccionario {nick idx handle channel args} {
 global diccionarioayuda
 set diccionarioayuda ""
 putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0."
 putserv "NOTICE $nick :Ayuda Comandos de DICCIONARIO by 4BaRDaHL"
 putserv "NOTICE $nick : - 1!abrir-diccionario Abre el diccionario para que pueda ser utilizado con el comando '!explicar'."
 putserv "NOTICE $nick :DICCIONARIO by 4BaRDaHL 1v2.0."
}

proc dic:diccionario_ayuda_cerrar_diccionario {nick idx handle channel args} {
 global diccionarioayuda
 set diccionarioayuda ""
 putserv "NOTICE $nick :DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0."
 putserv "NOTICE $nick :Ayuda Comandos de DICCIONARIO by 4BaRDaHL"
 putserv "NOTICE $nick : - 1!cerrar-diccionario Cierra el diccionario para evitar que este sea usado con el comando '!explicar'."
 putserv "NOTICE $nick :DICCIONARIO by 4BaRDaHL 1v2.0."
}

#######
# LOG #
#######

set diccionario(cargado) 1
putlog "DICCIONARIO by 1BaRDaHL * 1bardahl@linuxmail.org 1v2.0 cargado."

#################
# FINAL DEL TCL #
#################