Bonjour à tous, créatiens !
Pour un projet en cours j'ai ressorti et dépoussiéré mon script de téléchargement de fichiers. Et j'ai fait la découverte sensationnelle d'une API permettant de résumer ce script en ... 3 lignes.
- Code: Tout sélectionner
#-------------------------------------------------------------------------------
# Mise à jour
#-------------------------------------------------------------------------------
# vers.0.2 par Berka rgss.1
#-------------------------------------------------------------------------------
Url="http://rpgruby.olympe-network.com/berka"
ROOT=Dir.pwd << "/"
Mauvurl="L'url de téléchargement est incorrect"
Deconnect="Pas de connexion internet"
module Net
UDTF=Win32API.new('urlmon','URLDownloadToFile','lpplp','l')
IVU=Win32API.new('urlmon','IsValidURL','ppl','l')
IIO=Win32API.new('url','InetIsOffline','l','l')
WPPS=Win32API.new('kernel32','WritePrivateProfileString','pppp','l')
GPPS=Win32API.new('kernel32','GetPrivateProfileString','pppplp','l')
#------------------------------------------------
module HTTP
module_function
def download(url,int)
print(Deconnect)if Net::IIO.call(0)!=0
print(Mauvurl)if Net::IVU.call(nil,url,0)!=1
Graphics.update
Net::UDTF.call(0,url,int,0,0)==0
end
end
#------------------------------------------------
def self.update(version,path)
return [false,""]if !Net::HTTP.download("#{Url}/#{path}/vers.rgss","#{path}.upd")
$majfich=File.readlines("#{path}.upd")
File.delete("#{path}.upd")
$vers=($majfich).shift.split(':')[-1].to_f
ok=$vers>version.to_f
return [ok,ok ? $vers : " "]
end
#------------------------------------------------
def self.get_version
GPPS.call("Game","Vers","",v="\0"*16,16,".//Game.ini")
v.delete!("\0")
v=="" ? v="0" : v
end
#------------------------------------------------
def self.set_version
WPPS.call("Game","Vers",$vers.to_s,".//Game.ini")
end
#------------------------------------------------
def self.dl
$err/$majfich.size
end
#------------------------------------------------
def self.dl_patch(path)
$err=0
$majfich.each{|f|f.chomp!
$err+=1 if Net::HTTP.download("#{Url}/#{path}/"+f,ROOT+f)
}
self.set_version
return $err,$majfich.size
end
end
Voila pour le script, à coller au dessus de main.
Certaines fonctions ont disparues, comme la progression, mais j'y travaille. La vérification du téléchargement laisse aussi à désirer.
Alors. Comment marche ce script ?
Il y a deux phases:
1) La configuration du serveur FTPVous vous connectez sur le serveur, puis vous créez un dossier, il contiendra tous vos projets (et chacun contiendra les versions). Perso, je fais un sous répertoire nommé berka à la racine de mon
ftp. C'est disponible ici par protocole http:
Citer:
http://rpgruby.olympe-network.com/berka
Dans ce dossier berka, je vais crée un dossier
projet1. il contiendra la mise à jour de mon superbe projet1
Citer:
http://rpgruby.olympe-network.com/berka/projet1
Ensuite, dans ce dossier, je vais créer un fichier, nommé
vers.rgss. Ce fichier a une structure particulière:
- Code: Tout sélectionner
version:5.1
Data/Actors.rxdata
Data/Animations.rxdata
Data/Areas.rxdata
Data/Armors.rxdata
Data/Classes.rxdata
Graphics/System/Image.png
A la première ligne, c'est le numéro de votre dernière version en ligne. Celle qui sera téléchargée.
Ensuite, viennent les chemins de tous les fichiers téléchargeables. Remarquez que la structure est la meme que celle d'un projet basique. Respectez cette structure pour mettre vos fichiers sur le ftp, faites comme si vous copiez directement le répertoire de votre projet sur le serveur.
Pour servir d'exemple, je vous envoie mon ftp:
http://rpgruby.olympe-network.com/berka/creator/Enfin, quelques précisions: le système est sensible à la casse: vérifiez les majuscules. Et chmodez tous les fichiers à 755.
Voila pour le serveur.
2) La configuration du projetLe plus simple est de placer ces quelques commandes juste après le begin du script main.
Il faut tout d'abord vérifier la présence d'une mise à jour en ligne:
- Code: Tout sélectionner
maj_dispo=Net.update(Net.get_version,'projet1')
souvenez-vous ! "projet1" est le nom du sous dossier de tout à l'heure !
Net.get_version récupère la version du projet du joueur.
Net.update évalue les deux versions: joueur/serveur et autorise le téléchargement si la version du serveur est plus récente.
on enferme le tout dans une variable:
maj_dispoelle contiendra un booléen d'autorisation, ainsi que le numéro de la dernière version disponible.
C'est bon, on peu lancer le téléchargement:
- Code: Tout sélectionner
Net.dl_patch('projet1') if maj_dispo[0]
Si l'autorisation est accordée, on va lancer le téléchargement des fichiers de 'projet1'
Voila, votre jeu, après un cours instant sera à jour: vous n'aurez qu'à relancer le jeu, ou appuyer sur F12 pour voir les nouveautés.
3) Détails techniques, pour les amateurs:Il faut que je thread le tout, pour éviter le blocage du jeu.
Le numéro de version est stocké dans le fichier Game.ini
Et en bonus voici un petit programme ruby qui vous préparera un fichier vers.rgss tout prêt à copier sur votre serveur ftp ! Placez le dans votre projet et lancez le avec ruby:
- Code: Tout sélectionner
require "Win32API"
GPPS=Win32API.new('kernel32','GetPrivateProfileString','pppplp','l')
class String
def liste_rep(f="")
f="" if f=="/"
(Dir.open(self).sort-[".", ".."]).each{|fichier|
case File.ftype(self+fichier)
when "directory" then (self+fichier+"/").liste_rep(fichier+"/")
when "file" then $fichier << f+fichier+"
" if f !=""
end
}
end
end
$fichier=File.open("vers.rgss","w")
GPPS.call("Game","Vers","",v="\0"*16,16,".//Game.ini")
$fichier << "version:#{v.delete!("\0")}
"
"./".liste_rep
$fichier.close
J'espère que ce script vous sera utile, et je suis ouvert à toute question,
berka