#!/usr/bin/perl -w # ce petit script prends tous les appareils des tables fighter et bomber de la base dif # et dessine les pions AF de ces appareils dans des fichiers png séparés # en utilisant les morceaux qui sont dans le même répertoire (plans, cocardes ...) # et quelques polices # Dans le détail, le script lit les appareils # dans la base de données MySQL # puis pour chacun crée un script pour convert # nommé convert.bash # qui crée un fichier image # nommé aircraft.png # qui est ensuite copié dans le répertoire # dif/af/ { ################################################################################# # arguments ################################################################################# @ARGV = (@ARGV, "") ; # lectue des arguments de la ligne de commande if ($ARGV[0] eq "-h"){ # si on demande de l'aide avec -h print "\n".'pions Air Force v0.1 -- Charles Cordier'."\n\t\t\t" ; print '[charles.cordier@laposte.net]'."\n\n" ; print "\t".'-h cette aide'."\n" ; print "\t".'-w [condition] clause WHERE'."\n\n" ; print "\t".'-f force'."\n\n" ; exit ; }elsif($ARGV[0] eq "-f"){ # si on force la réécriture des fichiers images $where="2" ; print "forcing all aircrafts\n" ; }elsif($ARGV[0] eq "-w"){ # si on inclut une clause WHERE pour la requète MySQL $where=$ARGV[1] || 1 ; print "forcing WHERE $where\n" ; }else{ # par défaut, on sélectionne tous les appareils et on se contente de mettre à jour print "running on all aircrafts\n" ; $where="1" ; } ################################################################################# # corps de programme ################################################################################# # on fixe le path pour le script $dif="/home/sharl/public_html/dif" ; chdir("$dif/script/") ; use DBI ; # module Perl-MySQL $dbh = DBI->connect( # handle de database "DBI:mysql:database=dif;host=localhost", "root", "", {'RaiseError' => 1} ); # connexion à la base # on cherche tous les appareils de fighter $query = "SELECT" ." IF(service.code='aa',fighter.code,bomber.code) AS code" .",IF(service.code='aa',fighter.name,bomber.name) AS name" .",IF(service.code='aa',fighter.service,bomber.service) AS service" .",IF(service.code='aa',fighter.plan,bomber.plan) AS plan" .",unix_timestamp()-unix_timestamp(IF(service.code='aa',fighter.touch,bomber.touch)) AS touch" ." FROM service, fighter LEFT JOIN bomber ON 1" # grosse astuce pour avoir les appareils des tables fighte et bomber ensembles ." WHERE service.code in ('aa','an')" ." AND fighter.module='sharl'" ." AND bomber.module='sharl'" ." AND $where" # la clause supplémentaire éventuelle ." GROUP BY code" ." ORDER BY code" ; # print $query ; $sth = $dbh->prepare($query) ; $res = $sth->execute ; # parcours des appareils while($res=$sth->fetchrow_hashref()){ # verif que tout est ok unless ( ($$res{'code'}) and (-f "plan/$$res{'plan'}" && -r "plan/$$res{'plan'}") and (-r $$res{'service'}.".gif") ){ if(1){ print "code : ".(($$res{'code'}) || 0)."\n" ; # PB d'avion sans code print "plan : ".((-f "plan/$$res{'plan'}" && -r "plan/$$res{'plan'}") || 0)."\n" ; # PB de plan introuvable print "service : ".((-r $$res{'service'}.".gif") || 0)."\n" ; # PB de cocarde introuvable } next ; } ; # prépare les valeurs du format convert $service='"'.$$res{'service'}.'.gif"' ; # la cocarde $plan='"plan/'.$$res{'plan'}.'"' ; # le plan # place le plan de l'avion $offset=`file plan/$$res{'plan'}` ; $offset=~m#(\d+)\s*x\s*(\d+)\s*$# ; # $offset est une variable muette ici $w = 28*sqrt($1) ; $h = $w*$2/$1 ; $offset="0,0" ; # taille des polices pour le nom $name='"'.$$res{'name'}.' "' ; $name_size="850" ; # parcours des pilotes for($pilot=12 ; $pilot<=12 ; $pilot++){ if($pilot<10){ $_pilot="0" ; }else{ $_pilot="" ; } $pilot_name='"'.$pilot.'"' ; # on sort si pas de modification recente if( ($where eq '1') && (-e "$dif/af/".$$res{'code'}."-".$_pilot.$pilot.".png") && (-M "$dif/af/".$$res{'code'}."-".$_pilot.$pilot.".png" < int($$res{'touch'})/24/3600) && (-M "$dif/af/".$$res{'code'}."-".$_pilot.$pilot.".png" < -M "plan/$$res{'plan'}") ){ print "\t.\n" ; next ; } print "\t".$$res{'code'}."-".$_pilot.$pilot.".png\n" ; # prépare le script de convert open(CONVERT,">convert.bash") || die "can\'t write convert.bash." ; write CONVERT ; close (CONVERT) || die "can\'t close convert.bash" ; chmod(0775,"convert.bash") || die "can\'t chmod convert.bash" ; # éxecute le script convert `./convert.bash` ; # sauvegarde aircraft.png vers dif/af/ $convert="mv aircraft.png $dif/af/".$$res{'code'}."-".$_pilot.$pilot.".png" ; `$convert` ; # sauvegarde de s-aircraft # efface le script de convert unlink ("convert.bash") || die "can\'t delete convert.bash." ; } # fin du parcours des pilotes print "\n" ; } # fin parcours des appareils # efface le aircraft.png unlink ("aircraft.png") ; } # fin du script ################################################################################# # le format de sortie du script pour convert ################################################################################# format CONVERT = # copie de fichier de base cp generic-af.png aircraft.png ; # plan convert -draw 'gravity Center image Over @<<<<<<<<<<<<<<<<<< @<<<<,@<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<' aircraft.png aircraft.png ; $offset,$w,$h,$plan # insigne convert -draw 'gravity SouthWest image Over 24,24 196,196 @<<<<<<<<<' aircraft.png aircraft.png ; $service # texte de l'appareil convert -font "-adobe-utopia-medium-i-normal-*-*-@<<-*-*-p-*-iso8859-1" -fill black -draw 'gravity NorthEast text 6,-18 @<<<<<<<<<<<<<<<<<' aircraft.png aircraft.png ; $name_size,$name # texte du pilote convert -font "-*-rcaf_60sqo_ath-medium-r-normal-*-*-1500-*-*-*-*-*-*" -fill black -draw 'gravity SouthEast text 24,24 @<<<<<<<<<<<<<<<<<' aircraft.png aircraft.png ; $pilot_name .