Dial-up App for Internet Connect

This app lets you connect to the internet via Internet Connect, then logs time spent connected and the money that time represents (you’d have to change that acording to your telephone company, function ‘calcular_gasto(hora_al_conectar, dia_al_conectar, tiempo_conectado)’ should be changed. As you will notice, everything is in spanish (variable names and comments of course). Once compiled you have to save it as an ‘stay open application’ since it depends pretty much on the idle handler. If you have any comments let me know.

OS version: OS X

(* Connect 3.0 *)
property Prog_Version : "Connect 3.0"
property Data_File_NAME : "Data.txt"
property Log_File_NAME : "Internet Log 3.0.txt"
property number_size : 10 -- Leading zeros. Se agregan hasta este número.
property Quiere_Nuevo_Log : false

global enter, tiempo_conectado, Dia_Conectar, Hora_Conectar, Hora_en_segundos_Conectar, Dia_de_semana_Conectar, source_file, Log_File

on run
	set enter to (return as string)
	set tiempo_conectado to 0
	
	set {source_file, Log_File} to my Check_Rutas()
	-- con esto ya deberían estar chequeados los archivos y listos para operar. 
	-- supuestamente no hay errores y todo anda, asique puedo seguir con el resto.
	-- si hay un error es porque alguien editó alguno de los archivos y se perdió la estructura a la cual responde este programa.
	
	(* genero datos para conectar.
		- fecha y hora al conectar. 
		- dia de la semana.
		- hora en segundos.*)
	set Dia_Conectar to my fecha()
	set Hora_Conectar to do shell script "date +%H:%M"
	set Hora_en_segundos_Conectar to time of (current date)
	set Dia_de_semana_Conectar to weekday of (current date)
	
	try
		tell application "Internet Connect"
			connect
			close window 1
			repeat until state of status of current configuration is equal to 8
				-- nada, es solo para que se quede haciendo algo hasta que la conección esté realmente establecida.
				-- probando saqué que 0 es desconectado, 2 es marcando, 4 conectando, 7 autentificando, 8 conectado y 10 desconectando
				-- o al menos eso parece, según la secuencia de cosas que dice la ventana de Internet Connect y los resultados de AS.
			end repeat
		end tell
		tell application "System Events" to set visible of process "Internet Connect" to false
	end try
end run

on reopen
	try
		set Gasto_Local to (my Leer_Linea(Log_File, -1)) as number
	on error -- solo va a dar error si es la primera vez que se conecta para este archivo log.
		set Gasto_Local to 0
	end try
	set Quiere_Nuevo_Log to my Mostrar_Boton(Gasto_Local, Hora_en_segundos_Conectar, Dia_de_semana_Conectar)
end reopen

on idle
	tell application "Internet Connect"
		if (state of status of current configuration is equal to 8) then -- si el estado que devolvió "Internet Connect" es  ocho quiere decir que sigo conectado
			set tiempo_conectado to (seconds connected of status of current configuration)
		else -- si no, me desconecté y entonces tengo que cerrar los archivos con los datos que levanté hasta ahora
			tell me to quit
		end if
	end tell
	return 10 -- actualizo el tiempo conectado cada 10 segundos
end idle

on quit
	tell application "Internet Connect"
		ignoring application responses
			quit
		end ignoring
	end tell
	
	set tiempo_conectado to tiempo_conectado + 20 -- es lo que tarda entre que le levanta el tubo el
	-- servidor y que efectivamente estoy conectado que a los efectos de mi programa es algo significante
	-- (redondeé para abajo, la vez que medi me dió algo de 25 segundos)
	-- (alta programación la mía, medi una sola vez!!)
	
	(* recopilo datos de conecciones anteriores.
	- gasto anterior y tiempo anterior. (locales y absolutos) *)
	set Tiempo_Absoluto to (my Leer_Linea(source_file, 3)) as integer
	set Gasto_Absoluto to (my Leer_Linea(source_file, 4)) as number
	-- estos dos no pueden dar error porque la inicialización del archivo data
	-- ya incluye los contadores, que siempre están en el mismo lugar.
	try
		set Tiempo_Local to (my Leer_Linea(Log_File, -2)) as integer
		set Gasto_Local to (my Leer_Linea(Log_File, -1)) as number
	on error -- solo va a dar error si es la primera vez que se conecta para este archivo log.
		set Tiempo_Local to 0
		set Gasto_Local to 0
	end try
	
	set gasto_conectado to (my calcular_gasto(Hora_en_segundos_Conectar, Dia_de_semana_Conectar, tiempo_conectado))
	
	(* genero datos al desconectar.
	- hora al desconecarse.
	- nuevo tiempo local (la suma del anterior más el conectado actual, según "Internet Connect")
	- nuevo gasto local (la suma del anterior más el calculado con el tiempo conectado.) *)
	set Hora_Desconectar to do shell script "date +%H:%M"
	set Nuevo_Tiempo_Local to Tiempo_Local + tiempo_conectado
	set Nuevo_Gasto_Local to Gasto_Local + gasto_conectado
	
	(* genero nuevos datos absolutos.
	- tiempo absoluto anterior más el tiempo conectado actual.
	- gasto absoluto anterior más el gasto para la conección actual. *)
	set Nuevo_Tiempo_Absoluto to Tiempo_Absoluto + tiempo_conectado
	set nuevo_gasto_absoluto to Gasto_Absoluto + gasto_conectado
	
	(*
	Hasta acá tengo los siguientes datos:
	- Tiempo_Absoluto (en segundos, antes de conectar)					--> ya lo usé para calcular 'Nuevo_Tiempo_Absoluto'
	- Gasto_Absoluto (número real, antes de conectar)						--> ya lo usé para calcular 'Nuevo_Gasto_Aboluto'

	- Tiempo_Local (en segundos, antes de conectar)						--> ya lo usé para calcular 'Nuevo_Tiempo_Local'
	- Gasto_Local (número real, antes de conectar)						--> ya lo usé para calcular 'Nuevo_Gasto_Local'

	- Hora_en_segundos_Conectar (en segundos, al conectar)				--> ya lo usé para calcular 'gasto_conectar'
	- Dia_de_semana_Conectar (dia de la semana, Monday, Tuesday...)		--> ya lo usé para calcular 'gasto_conectar'
	
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
	
	- Para grabar los datos en Path al source_file
		- Nuevo_Tiempo_Absoluto (Tiempo_Absoluto + tiempo_conectado) 	--> listo para grabar (en segundos)
		- Nuevo_Gasto_Aboluto (Gasto_Absoluto + gasto_conectado)		--> listo para grabar (en número)
		- Quiere_Nuevo_Log (1 ó 0, según Mostrar_Boton())				--> falta evaluar y hacer el cambio si está en 1.
	
	- Para grabar los datos en Path al Log_File
		- Dia_Conectar (Fecha completa)								--> listo para grabar.
		- Hora_Conectar (la hora al conectar en formato HH:MM)			--> falta agregar "Se conectó a internet a las     " antes.
		- Hora_Desconectar (la hora al desconectar en formato HH:MM)		--> falta agregar "Se desconectó de internet a las " antes.
		- tiempo_conectado (en segundos, según "Internet Connect")		--> falta convertir a formato horas en forma parcial.
		- gasto_conectado (en número)									--> falta agregar "Su gasto fué de: $" antes.
	
		- Nuevo_Tiempo_Local (Tiempo_Local + tiempo_conectado)			--> falta convertir a formato horas en forma total.
		- Nuevo_Gasto_Local (Gasto_Local + gasto_conectado)				--> falta agregar "Su gasto fué de: $" antes.

––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

	 Primero grabo el archivo Log, porque tal vez después lo renombre, asique quiero terminar primero con los datos que van en él.
	- guardo datos.
	- registro de la conección actual en el archivo log.
		- fecha.
		- usuario.	
		- hora de conección.
		- hora de desconección.
		- tiempo conectado.
		- gasto.	 *)
	
	set Log_Linea0 to "_________________________________________"
	set Log_Linea1 to Dia_Conectar
	-- No tengo idea que hace esto próximo, lo bajé de internet. Sé lo que hace, devuelve el nombre de usuario logeado actualmente, pero no sé como.
	set Log_Linea2 to do shell script "niutil -readprop . /users/`whoami` realname"
	set Log_Linea3 to ("Se conectó a internet a las     " & Hora_Conectar) as string
	set Log_Linea4 to ("Se desconectó de internet a las " & Hora_Desconectar) as string
	set Log_Linea5 to my convertir_a_formato_horas(tiempo_conectado, "parcial")
	set Log_Linea6 to ("Su gasto fué de: $" & gasto_conectado) as string
	
	set Log_Linea8 to my convertir_a_formato_horas(Nuevo_Tiempo_Local, "total")
	set Log_Linea9 to ("El gasto total es de: $" & my llenar_ceros(Nuevo_Gasto_Local, 6)) as string
	set Log_Linea10 to my llenar_ceros(Nuevo_Tiempo_Local, number_size)
	set Log_Linea11 to my llenar_ceros(Nuevo_Gasto_Local, number_size)
	
	set Datos_Log_File to (Log_Linea0 & enter & Log_Linea1 & enter & Log_Linea2 & enter & Log_Linea3 & enter & Log_Linea4 & enter & Log_Linea5 & enter & Log_Linea6 & enter & enter & Log_Linea8 & enter & Log_Linea9 & enter & Log_Linea10 & enter & Log_Linea11) as text
	
	if (Nuevo_Tiempo_Local = tiempo_conectado) then -- es la primera vez que se escribe un log para este archivo de registro.
		my Guardar_Log(Log_File, Datos_Log_File, eof)
	else
		set Starting_Point to -(count of characters of (my Leer_Linea(Log_File, -1) & enter & my Leer_Linea(Log_File, -2) & enter & my Leer_Linea(Log_File, -3) & enter & my Leer_Linea(Log_File, -4))) as integer
		my Guardar_Log(Log_File, Datos_Log_File, Starting_Point)
	end if
	
	(* Ahora grabo el archivo Data.
	- tiempo y gasto absoluto en el archivo data.
	- (cambio de nombre del archivo log actual y cambio del contador de archivos log en el archivo data) *)
	my Reemplazar_Linea(source_file, 3, my llenar_ceros(Nuevo_Tiempo_Absoluto, number_size))
	my Reemplazar_Linea(source_file, 4, my llenar_ceros(nuevo_gasto_absoluto, number_size))
	if (Quiere_Nuevo_Log = 1) then
		set Contador_de_Logs to (my Leer_Linea(source_file, 5) as integer)
		set Nuevo_Nombre to (Contador_de_Logs & " - Logs al " & (do shell script "date +%d/%m/%y") & ".txt") as string
		tell application "Finder" to set the name of Log_File to Nuevo_Nombre
		my Reemplazar_Linea(source_file, 5, Contador_de_Logs + Quiere_Nuevo_Log)
	end if
	
	-- Chequeo las rutas nuevamente para crear el archivo log en caso de que haya cambiado de archivo de registro.
	-- De esta manera el nuevo archivo empieza el mismo día que termina el archivo anterior y no quedan espacios temporales "en blanco". 
	set {source_file, Log_File} to my Check_Rutas()
	
	continue quit
end quit

on Mostrar_Boton(Gasto_Local, hora_al_conectar, dia_al_conectar)
	set boton to ""
	set GaveUp to false
	if not Quiere_Nuevo_Log then set Cambio_de_Log to false
	tell application "Internet Connect" to set Velocidad to (speed of status of current configuration) as string
	activate
	repeat until (boton is equal to "Desconectarse") or GaveUp
		if not Cambio_de_Log then
			display dialog "Pulse \"Mi consumo?\" para consultar el tiempo de conección para el archivo de registros corriente, \"Cambiar Log\" para cambiar de archivo de registro." & enter & ¬
				"La velocidad de conección es: " & Velocidad buttons {"Mi consumo?", "Cambiar Log"} default button 1 with icon stop giving up after 10
			set {boton, GaveUp} to the {(button returned of the result) as text, gave up of the result}
		else if Cambio_de_Log then
			display dialog "Pulse \"Mi consumo?\" para consultar el tiempo de conección para el archivo de registros corriente." & enter & "La velocidad de conección es: " & Velocidad ¬
				buttons {"Mi consumo?"} default button 1 with icon stop giving up after 10
			set {boton, GaveUp} to the {(button returned of the result) as text, gave up of the result}
		end if
		if boton is equal to "Mi consumo?" then
			tell application "Internet Connect" to set tiempo_temporal to (seconds connected of status of current configuration)
			set gasto_temporal to Gasto_Local + (my calcular_gasto(hora_al_conectar, dia_al_conectar, tiempo_temporal))
			display dialog my convertir_a_formato_horas(tiempo_temporal, "total") & enter & "Su gasto es de $" & gasto_temporal buttons {"OK"} default button 1 giving up after 5
		else if boton is equal to "Cambiar Log" then
			set Cambio_de_Log to true
		end if
	end repeat
	return Cambio_de_Log
end Mostrar_Boton

--––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
(* Las siguientes subrutinas serían las correspondientes al arhivo Utiles.scpt de manera que:
Contiene varios handlers utilitarios:
 - Llenar_Ceros(un_numero, hasta_este_valor) 
 - Fecha()
 - Dia_en_Castellano()
 - Mes_en_Castellano()
 - convertir_a_formato_horas(segundos, total_o_parcial) 
 - calcular_gasto(hora_al_conectar, dia_al_conectar, tiempo_conectado)
set Utiles to load script (((Source_Object_Folder & "Utiles.scpt") as text) as alias) *)
--––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

(* Completa un numero con ceros adelante hasta
que quede de "hasta_este_valor" caracteres.*)
on llenar_ceros(un_numero, hasta_este_valor)
	set largo to count of characters of (un_numero as text)
	if hasta_este_valor > largo then
		repeat with i from 1 to (hasta_este_valor - largo)
			set un_numero to "0" & un_numero
		end repeat
	end if
	return un_numero as text
end llenar_ceros

(* Esta rutina muestra la fecha en castellano *)
on fecha()
	-- do shell script "date  +%d:%m:%y-%H.%M:%S"
	set dia_del_mes to day of (current date)
	set dia to my Dia_en_Castellano()
	set mes to my Mes_en_Castellano()
	set mostrar_fecha to (dia & " " & dia_del_mes as string) & " de " & mes & " de " & (year of (current date)) & "."
end fecha

to Dia_en_Castellano() -- no se puede hacer como el de los meses, porque el día podría ser mayor que 7 y no encontraría el item i de dias_esp
	set dia to the weekday of (current date)
	set dias_esp to {"Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"}
	set dias_ing to {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}
	repeat with i from 1 to 7
		if dia is equal to (item i of dias_ing) then set dia to (item i of dias_esp)
	end repeat
	return dia
end Dia_en_Castellano

to Mes_en_Castellano()
	set mes_esp to {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"}
	set este_mes to (do shell script "date +%m") as integer
	set mes to item este_mes of mes_esp
	return mes
end Mes_en_Castellano

on convertir_a_formato_horas(segundos, total_o_parcial) -- recibe un numero XXXXXX y lo traduce a formato HH:MM:SS.
	set dias to segundos div 86400 -- calculo la cantidad de dias que pasaron
	set segundos to segundos - (86400 * dias) -- le saco a segundos los dias que pasaron para calcular las horas restantes
	set horas to segundos div (60 * 60) -- calculo la cantidad de horas (sobre el tiempo restante)
	set minutos to (segundos - (horas * (60 * 60))) div 60 -- calculo la cantidad de minutos
	set segundos to (segundos - (horas * (60 * 60)) - (minutos * 60)) -- y la de segundos
	
	if (dias < 10) then set dias to ("0" & dias) as string
	if (horas < 10) then set horas to ("0" & horas) as string
	if (minutos < 10) then set minutos to ("0" & minutos) as string
	if (segundos < 10) then set segundos to ("0" & segundos) as string
	if total_o_parcial is equal to "total" then
		return ("Estuvo " & dias & " dias, " & horas & ":" & minutos & ":" & segundos & " horas conectado.") as string
	else if total_o_parcial is equal to "parcial" then
		return ("Estuvo " & horas & ":" & minutos & ":" & segundos & " horas conectado.") as string
	end if
end convertir_a_formato_horas

(* Esta función calcula el gasto en pesos correspondiente al tiempo de conección. El costo del minuto de conección es el siguiente:
Los primeros 12 minutos se cobran $0.023 independientemente de la banda horaria. El minuto en banda horaria normal se cobra
$0.011 y el minuto en banda horaria reducida se cobra $0.009. El cálculo se hace según estos horarios de banda reducida:
Lunes - Viernes: desde las 19 Hs hasta las 8 Hs del día siguiente. Sábados: desde las 13 Hs en adelante. Domingos: todo el día. 
Todas las variables deben recibirse en segundos, por ejemplo (60000, Monday, 3600) correspondería a haberse conectado un
lunes a las 16:40 Hs. durante una hora.*)
to calcular_gasto(hora_al_conectar, dia_al_conectar, tiempo_conectado)
	if (tiempo_conectado = 0) then return 0
	set hora_al_conectar to (hora_al_conectar div minutes)
	set tiempo_conectado to ((tiempo_conectado div minutes) + 1) -- el (+1) es porque fracciona por minuto y si me pasé un segundo cobra el minuto entero.
	set Semana_Habil to {Monday, Tuesday, Wednesday, Thursday, Friday}
	set las_diecinueve to ((19 * hours) div minutes) -- están en minutos. Sería la cantidad de minutos desde que empezó el día.
	set las_trece to ((13 * hours) div minutes) -- están en minutos. Sería la cantidad de minutos desde que empezó el día.
	set las_ocho to ((8 * hours) div minutes) -- están en minutos. Sería la cantidad de minutos desde que empezó el día.
	set el_gasto to 0 as real
	if (tiempo_conectado ? 12) then -- si me conecté más de 12 minutos.
		set el_gasto to el_gasto + (0.023 * 12)
		set tiempo_conectado to (tiempo_conectado - 12)
		if (tiempo_conectado = 0) then return el_gasto -- para el caso particular que me haya conectado EXACTAMENTE 12 minutos.... en fin
		set hora_al_conectar to (hora_al_conectar + 12) -- "retoco" la hora de conección para futuras cuentas.
	else
		return tiempo_conectado * 0.023
	end if
	(* con esto ya desconté los 12 minutos iniciales. Ahora el resto se cobra dependiendo de la banda horaria, asique necesito más trabajo. *)
	set Minutos_Contados to 0
	if (dia_al_conectar is in Semana_Habil) then
		repeat until Minutos_Contados is equal to tiempo_conectado
			if ((hora_al_conectar + Minutos_Contados) < las_diecinueve) and ((hora_al_conectar + Minutos_Contados) ? las_ocho) then
				set Minutos_Contados to Minutos_Contados + 1
				set el_gasto to el_gasto + 0.011
			else if ((hora_al_conectar + Minutos_Contados) ? las_diecinueve) or ((hora_al_conectar + Minutos_Contados) < las_ocho) then
				set Minutos_Contados to Minutos_Contados + 1
				set el_gasto to el_gasto + 0.009
			end if
		end repeat
	else if (dia_al_conectar is equal to Saturday) then
		repeat until Minutos_Contados is equal to tiempo_conectado
			if ((hora_al_conectar + Minutos_Contados) ? las_trece) and ((hora_al_conectar + Minutos_Contados) ? las_ocho) then
				set Minutos_Contados to Minutos_Contados + 1
				set el_gasto to el_gasto + 0.011
			else if ((hora_al_conectar + Minutos_Contados) > las_trece) then
				set Minutos_Contados to Minutos_Contados + 1
				set el_gasto to el_gasto + 0.009
			end if
		end repeat
	else if (dia_al_conectar is equal to Sunday) then
		set el_gasto to tiempo_conectado * 0.009
	end if
	return el_gasto as real
end calcular_gasto

--––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
(* Las siguientes subrutinas serían las correspondientes al arhivo Inicio.scpt de manera que:
Contiene los handlers para inicializar el programa.
 - Check_Rutas()
 - Inicializar_Archivo(path_to_file, File_Type)
set Inicio to load script (((Source_Object_Folder & "Inicio.scpt") as text) as alias) *)
--––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

(* Esta rutina chequea que los archivos necesarios para poder guardar los logs
existan, que estén bien inicializados. De no ser así crea lo necesario, pregunta
al usuario por la ruta donde guardar los logs, etc. Los archivos que se crean
son: "Data.txt", "Internet Log 2.1.txt" y una carpeta "Connect 2.1:" *)
to Check_Rutas()
	set path_to_library to (path to "dlib" from user domain) -- la ruta a la librería del usuario actual.
	
	-- existe la carpeta "Connect 2.1:" ?
	try
		set source_folder to ((path_to_library & Prog_Version & ":") as text) as alias
	on error
		tell application "Finder" to make new folder at path_to_library with properties {name:Prog_Version}
		set source_folder to ((path_to_library & Prog_Version & ":") as text) as alias
		-- si no, creo la carpeta y la establezco como alias.
	end try
	-- si existía la carpeta, tengo que ver si existe el archivo "Data.txt".
	-- si no existía, tampoco existía "Data.txt".
	try
		set source_file to ((source_folder & Data_File_NAME) as text) as alias
		-- si existía "Data" entonces debería estar definida la ruta al archivo log (no sé si estará el archivo)
	on error
		set source_file to my Inicializar_Archivo(source_folder, "Data")
	end try
	set Path_Log_File to (my Leer_Linea(source_file, 2))
	try
		set Log_File to ((Path_Log_File & Log_File_NAME) as text) as alias
	on error
		set Log_File to my Inicializar_Archivo(Path_Log_File, "Log")
	end try
	return {source_file, Log_File}
end Check_Rutas

(* Esta rutina se encarga de completar cada archivo creado con
la información necesaria para poder operar correctamente. El
archivo de datos se inicializa con la fecha de creación y los
contadores generales y el archivo de logs con la fecha de creación. *)
to Inicializar_Archivo(path_to_file, file_type)
	if file_type is equal to "Data" then
		activate -- recupero la atención en caso de que el usuario haya clickeado sobre otra aplicación
		set Path_to_Logfile to choose folder with prompt "Elija la carpeta donde se grabarán los archivos de registro."
		-- primero pido la ruta donde se grabarán los logs y luego creo el archivo data, porque si el usuario cancela 
		-- en la ventana del choose folder se suspende el programa y queda mal inicializado el archivo.
		set source_file to my Crear_Archivo(path_to_file, Data_File_NAME)
		-- ahora establezco los datos para "Data.txt" y los guardo en el archivo.
		set Datos_Source_File to "Creado el " & my fecha() & enter & (Path_to_Logfile as text) & enter & my llenar_ceros(0, number_size) & enter & my llenar_ceros(0, number_size) & enter & my llenar_ceros(1, 5)
		my Guardar_Log(source_file, Datos_Source_File, eof)
		return source_file
	else if file_type is equal to "Log" then
		set Log_File to my Crear_Archivo(path_to_file, Log_File_NAME)
		set Datos_Log_File to "Empezado el " & my fecha() & enter
		my Guardar_Log(Log_File, Datos_Log_File, eof)
		-- creo el archivo 'Log' y le escribo la fecha actual.
		return Log_File
	end if
end Inicializar_Archivo

--––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
(* Las siguientes subrutinas serían las correspondientes al arhivo FileEdit.scpt de manera que:
Contiene los handlers que hacen manejo de archivos. Los handlers son: 
 - Leer_Linea(Ruta_al_Archivo, Linea_a_Leer)
 - Reemplazar_Linea(Ruta_al_Archivo, Esta_Linea, Info) -- Esta_Linea puede ser un número negativo; (-1) sería la última linea, (-2) la anteúltima, etc.
 - Crear_Archivo(Ruta_al_Archivo, Nombre)
 - Guardar_Log(Ruta_al_Archivo, Datos, Inicio)
set FileEdit to load script (((Source_Object_Folder & "FileEdit.scpt") as text) as alias) *)
--––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

on Leer_Linea(path_to_file, line_to_read)
	try
		paragraph line_to_read of (read path_to_file)
	on error
		return ""
	end try
end Leer_Linea

to Reemplazar_Linea(path_to_file, this_line, info)
	set oldParagraphs to {}
	try -- el try es por si no hay nada en el archivo, que da error "eof found"
		--> get contents of actual file 
		set oldParagraphs to paragraphs of (read path_to_file)
	end try
	--> replace contents of old file with new contents 
	if this_line ? (count of items of oldParagraphs) then set item this_line of oldParagraphs to info
	
	--> coerce list of paragraphs to text again 
	set AppleScript's text item delimiters to return
	set newParagraphs to oldParagraphs as text
	set AppleScript's text item delimiters to {""}
	
	--> write new contents to file 
	set fileRef to (open for access path_to_file with write permission)
	set eof of fileRef to 0 --> delete contents 
	write newParagraphs to fileRef
	close access fileRef
end Reemplazar_Linea

to Crear_Archivo(path_to_file, Nombre)
	set Full_Path to (path_to_file & Nombre) as text
	try
		set Full_Path to Full_Path as alias
		-- chequeo que el archivo exista, si existe devuelvo (??)
	on error
		open for access file Full_Path with write permission
		set Full_Path to Full_Path as alias
		close access Full_Path
		-- creo el archivo, lo establezco como alias y cierro su acceso, si no se pudre todo.
	end try
	return Full_Path
	-- devuelvo su alias.
end Crear_Archivo

(* La siguiente función guarda "Datos" en un "archivo" del cuál se debe recibir el alias, a partir de la
posición "donde" del archivo, que puede o no pisar información anterior, no se preocupa por advertir
al usuario. El acceso se abre y se cierra en la misma función, asique no debería haber problema. *)
on Guardar_Log(path_to_file, Datos, Inicio) -- "donde" vendría a ser la posición en el archivo = 5,215,(-10), (-52), eof, etc.
	try
		try
			set Inicio to (Inicio as integer) -- podría ser "eof", que no se puede castear a integer.
		end try
		set path_to_file to path_to_file as alias -- para prevenir la creación de un archivo, de eso ya me encargué antes en el programa
		open for access path_to_file with write permission
		write Datos to path_to_file starting at Inicio
		close access path_to_file
	on error
		try
			close access path_to_file
		end try
	end try
end Guardar_Log