UPDATER - Actualiza la aplicacion desde la misma

Aquí pueden poner todos los programas y utilidades que hayan creado con AMS.
Seguramente abran visto que para actualizar la aplicacion hace falta tener otra dentro de la misma para que no de errores ahora bien y si usamos un bat para cerrar toda la rama de procesos de la misma y mover la actualizacion una vez descomprimida hay ya no da error he jhahahasjsadsjk

Este Updater esta basado en el Updater-NG de NikolasG los errores que tenia el suyo era que no movia todos los archivos ahora lista cada carpeta del zip y hace una lista para que actualize bien y bueno eso el otro bug era que solo cerraba la aplicacion que estabas usando para actualizar si tenias la aplicacion varias veces abierta remplazaba dos archivos y dejaba la aplicacion rip xD

tambien lo que he echo a sido una limpieza ya no funciona con xml ni usa las funciones de ams para comprobar la version he usado lua socket que es 7 veces mas rapido Bueno suerte con vuestras aplicaciones espero que no os alla dado un ictus por mi ortografia jajajaj



Aqui el modulo pero no sin antes poner a NikolasG en los agradecimientos de este post gracias ha el y ami es posible este updater tan perfecto
---ESTO REQUIERE DE LUA SOCKET
http = require("socket.http")

function lua_dostring(sLua)
local Return, Error = pcall(function(s)
return loadstring(s)();
end, sLua);
return Return, Error;
end



--#############################5.0#############################
--# www.amsspecialist.com #
--# Basado en updater-ng pero muy mejorado #
--#############################################################


-------------------------INSTALACION---------------------------



--#1 CREARSE UNA CUENTA EN HOSTINGER.ES O CUALQUIER HOSTING SUBIR EL ARCHIVO VERSION.LUA Y LA ACTUALIZACION UPDATE.ZIP

--#2 VERSION.LUA ESTARA EN LA CARPETA DEL APZ PERO AQUI OS DEJO UN EJEMPLO
--[[
NEWVER = 1 -- VERSION DE LA APLICACION
urlD = "stms.esy.es/recursos/UPDATE.ZIP" --URL DE LA ACTUALIZACION
]]


--#3 CAMBIAR ESTO
DEFINE_Url = "http://ejemplo/version.lua"; -- PONER AQUI LA URL DEL ARCHIVO VERSION.LUA
DEFINE_FileOfVersion = _SourceFolder.."\\AutoPlay\\Scripts\\version.txt"; -- ESTA SERA LA VERSION ACTUAL DE LA APLICACION EDITAR EN CADA ACTUALIZACION



--#############################################################


--ESTO ESTA PUESTO PARA SER AUTOMATICO SE ADAPTARA SOLO
DEFINE_Temporary_Folder = _TempFolder.."\\UpdaterNG";
DEFINE_Destination_Folder = _SourceFolder.."\\"
DEFINE_Path_To_The_File_To_Run_After_Upgrading = (_SourceFolder.."\\".._SourceFilename);
DEFINE_Version = TextFile.ReadToString(DEFINE_FileOfVersion);





UpdaterNG = {};
function UpdaterNG.ToUpdate()
--COMPRUEBA LA CONEXION Y SI AHI UNA NUEVA VERSION
if UpdaterNG.CheckUpdates() == "OBSOLETE" then
FileInformation = String.SplitPath(urlD);
--Descarga la actualizacion desde la url obtenida desde internet
HTTP.Download(urlD, DEFINE_Temporary_Folder.."\\"..FileInformation.Filename..FileInformation.Extension, MODE_BINARY, 20, 80, nil, nil, UPDATER_DownloadCallback);
if bCancelled then
bCancelled=false
Paragraph.SetProperties("conf_Paragraph6", {BGColor=Math.HexColorToNumber("00A240"),Text="CLICK TO UPDATE",Enabled=true});
Button.SetProperties("conf_Button124", {ButtonFile=_SourceFolder.."\\AutoPlay\\Buttons\\ref.btn"})
do return end
end

UpdaterNG.DoZIP(urlD)

else
Paragraph.SetProperties("conf_Paragraph6", {BGColor=Math.HexColorToNumber("C0004B"),Text="NO SE PUDO ACTUALIZAR"});
end
end


function UpdaterNG.DoZIP(zip)
--Separa el nombre del archivo
FileInformation = String.SplitPath(zip);
--Extrae la actualizacion
Paragraph.SetText("conf_Paragraph6", "DESCOMPRIMIENDO ZIP")
Zip.Extract(DEFINE_Temporary_Folder.."\\"..FileInformation.Filename..FileInformation.Extension, {"*.*"}, DEFINE_Temporary_Folder.."\\unzip\\", true, true, "", ZIP_OVERWRITE_NEVER, nil);
Paragraph.SetText("conf_Paragraph6", "REINICIANDO")
--Numera el contenido del zip descargado para hacer una lista
str=""
for i,v in pairs(Zip.GetContents(DEFINE_Temporary_Folder.."\\"..FileInformation.Filename..FileInformation.Extension, true)) do
--Crea las carpetas que no exisian en la antigua version
if Folder.DoesExist(String.SplitPath(v).Folder) == false then
Folder.Create(_SourceFolder.."\\"..v);
end
--Hace la lista
str=str..[[move "]]..DEFINE_Temporary_Folder..[[\unzip\"]]..v..' "'..DEFINE_Destination_Folder..v..'"\r\n'
end
--hace un .bat para cerrar la aplicacion y todas sus ventanas despues mueve los archivos y ejecuta la aplicacion
TextFile.WriteFromString(DEFINE_Temporary_Folder.."\\MoveUpdate.bat", [[
Taskkill /F /IM ]].. _SourceFilename ..'\r\n'.. [[
@ECHO OFF
]]..'\r\n'.. str ..[[
start]]..' "" "'..DEFINE_Path_To_The_File_To_Run_After_Upgrading..'"\r\n'..[[
DEL "%~f0"
]], false);
--EJECUTA EL .BAT
File.Run(DEFINE_Temporary_Folder.."\\MoveUpdate.bat", "", "", SW_HIDE, false);
end


function UpdaterNG.CheckUpdates()
--COMPRUEBA LA CONEXION
if UpdaterNG.Conect() then
UpdaterNG.Refresh()--obtiene la version mas reciente asi como la url de donde descargarla
--Comprobamos si ahi actualizaciones
if DEFINE_Version >= NEWVER then
Paragraph.SetProperties("conf_Paragraph6", {Text="ATUALIZADO",Enabled=false,BGColor=Math.HexColorToNumber("1E88E5")});
SUP="UPDATED"
else
Paragraph.SetProperties("conf_Paragraph6", {BGColor=Math.HexColorToNumber("00A240"),Text="CLICK TO UPDATE",Enabled=true});
SUP="OBSOLETE"
end
else
Paragraph.SetProperties("conf_Paragraph6", {BGColor=Math.HexColorToNumber("C0004B"),Text="SIN CONEXION"});
SUP="NO INTERNET"
end
return SUP
end

function UpdaterNG.Refresh()
--esto simplemente coje el texto de la url y lo ejecuta como codigo lua
lua_dostring(http.request(DEFINE_Url))
end

function UpdaterNG.Conect()
--comprueba la conexion
if HTTP.GetConnectionState().Connected then
con=true
else
con=false
end
return con
end



function UPDATER_DownloadCallback(BytesSoFar, TotalBytes, TransferRate)--ESTA FUNCION ES TAN SIMPLE QUE NI LA EXPLICO
if(TotalBytes ~= 0)then
strProgress = "Descargando: "..Math.Round(BytesSoFar/TotalBytes * 100) .."%"
strkbs = String.GetFormattedSize(string.format('%.1f', TransferRate)*1024, FMTSIZE_AUTOMATIC, true);
strKbsRate = 'Speed: '..strkbs
else
strProgressText,strKbsRate,strProgress = '','','';
end
Paragraph.SetText("conf_Paragraph6", strProgress..' '..strKbsRate);
Button.SetProperties("conf_Button124", {ButtonFile=_SourceFolder.."\\AutoPlay\\Buttons\\cwer.btn"})

if bCancelled then
Updating=false
return false;

else
Updating=true
return true;

end
end
bCancelled = false;




HIDE: ON
Hidebb Message Hidden Description
Excelente!! Muchas gracias amigo por tomarte el tiempo de leer mi mensaje y de hacer esto. Un abrazo Grande :)
Hola amigo, como estas? Como haces para arrastrar la ventana? Porque coloco ese código y no hace nada en mi programa. Desde ya muchas gracias!!
Interesante.

Muchas Gracias.
Gracias
CeVil escribió:Hola amigo, como estas? Como haces para arrastrar la ventana? Porque coloco ese código y no hace nada en mi programa. Desde ya muchas gracias!!
Esto bien, la ventana se arrastra porque el objeto esta desabilitado , ese codigo en si no ara nada deves configurarlo y eso tienes un ejemplo descargate el apz para entender el codigo
Guanj escribió:
CeVil escribió:Hola amigo, como estas? Como haces para arrastrar la ventana? Porque coloco ese código y no hace nada en mi programa. Desde ya muchas gracias!!
Esto bien, la ventana se arrastra porque el objeto esta desabilitado , ese codigo en si no ara nada deves configurarlo y eso tienes un ejemplo descargate el apz para entender el codigo
Si, descargue la apz, pero veo el codigo y no lo entiendo. No sabes si hay algun tutorial?

Porque aqui me aparece que se mueve el objeto imput1:
Imagen

Y aqui solo me parece el codigo del boton cerrar.. Cual seria el codigo para que se mueva el programa entero? Aclaro que tiene muchas paginas:

Imagen

Te agradecería mucho tu ayuda porque mi programa no tiene para mover las ventanas, dado que no me gusta la barra de arriba. Un abrazo amigo y perdón que sea tan molesto!!
Gracias
Mira bien todo el proyecto sobre todo la carpeta Scripts ahí estan los codigos

Jajajajja estos codigos ignoralos son de mi antiguo proyecto ahí no cumplen ninguna funcion ademas como se ve ese objeto esta Disabled

Imagen

Imagen

Dentro del archivo UPDATER-NG.LUA ahí un breve tutorial, Suerte cualquier cosa mas pregunta .
El problema del método del .BAT, es que no se tiene control de los archivos, podrían no moverse correctamente de carpeta a carpeta, y otros, si se quiere mantener el Updater en la misma aplicación recomiendo crear un .EXE con ams que sustituya al .BAT, también en publicado este [url=viewtopic.php?f=18&t=3698]Updater</url>, que en mi opinión es mas simple de configurar que versiones anteriores, ademas que se puede usar con aplicación que no tienen por que estar echas con ams.
no se men yo lo veo bien este aun no me ha dado ningun fallo tengo una aplicacion con el mismo updater 3 meses y nosecuantas versiones xDD ami llevar un exe y que pese mas no me agrada

las cosas que veo mal
*6 MB QUE PESA EL PROGRAMA
*ERRORES SI AHI APLICACIONES CON LA APLICACION ABIERTA
*no tienes control sobre el archivo a descargar
*no puedes modificar el updater
*el usuario ve incomodo cambiar de interface

las cosas que veo mal de lo mio son
*lo complicado que es el codigo ha algunos les cuesta mucho entender
6 mbs no es nada...
A que errores te refieres? así los puedo solucionar en alguna versión posterior.
A que te refieres con control sobre el archivo al descargar?.
En los archivos que descargas del post esta el Source para hacerle cualquier virguería.

Repito, usar el bat en un entorno controlado o de pruebas esta bien, pero en uso real puede haber problemas con el antivirus, el sistema permisos de windows y demás cosas que pueden hacer que falle y no pase los archivos, o pase algunos y otros no, solución remplazar el bat por un exe con el que puedes tener mas control... también se podría hacer un bat mejor...(de cualquier manera al final es lo que a uno le parezca o le sea mas practico).


PD: aclaración, el método es secuencial(Pensado para una cantidad grande de actualización y de gran peso cada una), El método usado por Guanj, es básicamente bajar un solo archivo, esto ya lo discutimos en otro post con rafa, al bajar un solo archivo posiblemente termines bajando un archivo mas pesado innecesariamente, me explico: supongamos que modificas el archivo YO.TXT, al mes siguiente actualizas de nuevo tu aplicación, esta vez modificas el archivo TU.TXT, ahora tienes que si o si agregar el archivo YO.TXT y TU.TXT a tu actualización, ya que evidentemente si hay un usuario de tu aplicación que no se descargo la primera actualización y si la segundo tendrá el archivo TU.TXT actualizado pero no el YO.TXT.
No no da error en antivirus ni necesita permisos elevados para ejecutarse ya que no edita archivos del sistema tienes razon con que puede mejorar... por ejemplo la manera de listar archivos para remplazarlos y tambien es de descarga secuencial como si usaras un exe tambien necesitarias algo que aclarara la version si te digo la verdad yo lo veo estable para uso no es de pruevas (No a fallado) veo que es decision del usuario elegir pero esto es el futuro xD asta podria actualizar la aplicacion por partes por ejemplo los archivos de la carpeta Scripts remplazarlos todos y reiniciar yo le veo muchas posibilidades no esta tan encerrado como un exe esto es puro codigo hazme caso pueba intentando actualizar una aplicacion 10 veces y veras bueno suerte adios men.
Deje 2 preguntas my friend


A que errores te refieres? así los puedo solucionar en alguna versión posterior.
A que te refieres con control sobre el archivo al descargar?.
errores en la aplicacion tu por ejemplo tienes abierta la aplicacion y no puedes actualizar y lo de controlar el archivo a descargar quiere decir cambiar el enlace de descarga cuando quieras sin que se quede sin poder actualizar ademas yo puedo cambiarle el updater al usuario tu piensa que lo que hace obtener la version es una ejecucion de codigo lua osea que tengo mas control sobre la aplicacion tambien

el updater en exe si sirve solo sirve si haces la aplicacion con otra cosa que no sea autoplay media studio por ejemplo una aplicacion en c+ o pyton
Bueno vamos por partes por que no entiendo nada...

Primero el Updater.exe si se puede usar con ams, que no sepas como es otra cosa, Funciona con la función
_CommandLineArgs

Con ams hay que usar la función
File.Run
yo puse un ejemplo usando un archivo .BAT, incluso se podría hasta con un acceso directo.

Segundo cuando se ejecuta el Updater.exe se cierra la aplicación que le definas en los parámetros.

En cuanto a cambiar el enlace de descargar... no entiendo, en tu caso puedes cambiar el enlace al archivo de actualización, actualizando tu aplicación obviamente, en el caso del Updater.exe es lo mismo solo que cambias el enlace al archivo .XML, que contiene todos los enlaces a las actualizaciones, entonces... no se cual es la diferencia.

Por ultimo c+?


Yo para cuestionar tu trabajo mire el código y el funcionamiento del mismo, en tu caso esta claro que no viste ni el ejemplo del mio.


Ahora la parte que me gusta, todos sabemos quien eres, cuenta tras cuenta y sigues sin usar las putas comas...
Tu ha callar que ibas buscando gente que probara tu ***** de updater porque se te olvido poner el tag hide, Yo aquí solo vengo a aportar así como todos así que si vienes a buscar pelea ya te puedes ir ha otro lado.
No iba buscando gente, solo una persona que probara, algún tarado que haga el trabajo por mi...

PD: se nota que pasaste el texto por un corrector, los acentos y demás, es muy obvio que no escribes así, mas cuando se lee los comentarios del código que expones a principio del post, no vengo buscando pelea pedazo de mononeuronal, lees una mala palabra/palabra mal sonante y te pones nervioso... :beer-1414022661:
Si es el nuevo corrector que detecta donde poner comas y todo.
No me interesan tus gustos...