SEF
changeset 24:f9eb5c484259
Premiere version de sentinel
- envoie confirmation OK
- finalisation inscription presque OK
+ BUGFIX tour : augmentation XP meme pour non-dirigeants
- envoie confirmation OK
- finalisation inscription presque OK
+ BUGFIX tour : augmentation XP meme pour non-dirigeants
| author | Jogo <jogo@matabio.net> |
|---|---|
| date | Fri Jul 10 15:14:57 2009 +0200 (2009-07-10) |
| parents | 03cc93766a9b |
| children | f4f5fda6c39b |
| files | cgi/inscription db.sql mails/confirmation sentinel templates/static/inscription tour |
line diff
1.1 --- a/cgi/inscription Sun Jun 28 22:35:44 2009 +0200 1.2 +++ b/cgi/inscription Fri Jul 10 15:14:57 2009 +0200 1.3 @@ -94,6 +94,61 @@ 1.4 dès qu'il y aura une place de libre sur le jeu. }); 1.5 } 1.6 }, 1.7 + 1.8 + confirm => sub { 1.9 + local $dbh->{RaiseError} = 1; 1.10 + my $code = param('c'); 1.11 + 1.12 + eval { 1.13 + die 'Code impossible.' 1.14 + unless (length($code) == 23); 1.15 + my $id = hex substr($code, -7, 7); 1.16 + $code = substr($code, 0, 16); 1.17 + 1.18 + $sth = $dbh->prepare( 1.19 + q{ SELECT confirm IS NOT NULL 1.20 + FROM Inscriptions 1.21 + WHERE id = ? 1.22 + } 1.23 + ); 1.24 + $sth->execute($id); 1.25 + my ($deja_confirme) = $sth->fetchrow_array(); 1.26 + die 'Code inconnu.' 1.27 + unless defined($deja_confirme); 1.28 + die 'Déjà confirmé.' 1.29 + if $deja_confirme; 1.30 + 1.31 + $dbh->do( 1.32 + q{ UPDATE Inscriptions 1.33 + SET confirm = $2 1.34 + WHERE id = $1 1.35 + }, undef, 1.36 + $id, $code 1.37 + ); 1.38 + }; 1.39 + 1.40 + if ($@) { 1.41 + if ($DBI::err) { 1.42 + $s->add_err(q{ 1.43 + Impossible d'enregistrer votre confirmation. 1.44 + Il y a eu une erreur de la base de donnée. 1.45 + Vous pouvez contactez le gestionnaire 1.46 + en lui précisant l'erreur rencontrée : } 1.47 + . $DBI::errstr); 1.48 + } 1.49 + else { 1.50 + $s->add_err($@); 1.51 + } 1.52 + 1.53 + } else { 1.54 + $s->add_msg( 1.55 + q{ Votre confirmation a été enregistrée. 1.56 + Si le code que vous avez fourni est correct, 1.57 + vous allez recevoir un mail d'inscription rapidement. 1.58 + } 1.59 + ); 1.60 + } 1.61 + }, 1.62 } 1.63 ); 1.64
2.1 --- a/db.sql Sun Jun 28 22:35:44 2009 +0200 2.2 +++ b/db.sql Fri Jul 10 15:14:57 2009 +0200 2.3 @@ -525,6 +525,7 @@ 2.4 ); 2.5 2.6 GRANT SELECT, INSERT, UPDATE ON Joueurs TO apache; 2.7 +GRANT SELECT, INSERT ON Joueurs TO sentinel; 2.8 2.9 CREATE TABLE Cookies ( 2.10 id BIGSERIAL PRIMARY KEY, 2.11 @@ -567,7 +568,7 @@ 2.12 id SERIAL PRIMARY KEY, 2.13 nom TEXT NOT NULL UNIQUE, 2.14 mail TEXT NOT NULL UNIQUE, 2.15 - confirm VARCHAR(32) 2.16 + confirm VARCHAR(16) 2.17 ); 2.18 2.19 GRANT SELECT, INSERT, UPDATE ON Inscriptions TO apache; 2.20 @@ -577,7 +578,7 @@ 2.21 CREATE TABLE Confirmations ( 2.22 est INTEGER PRIMARY KEY REFERENCES Inscriptions(id), 2.23 mail TEXT NOT NULL UNIQUE, 2.24 - confirm VARCHAR(32) NOT NULL, 2.25 + confirm VARCHAR(16) NOT NULL, 2.26 stamp TIMESTAMP(0) DEFAULT current_timestamp(0) NOT NULL 2.27 ); 2.28
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/mails/confirmation Fri Jul 10 15:14:57 2009 +0200 3.3 @@ -0,0 +1,13 @@ 3.4 + Bonjour, 3.5 + 3.6 + Vous avez demandé à vous inscrire au jeu $€₣ sous le nom <TMPL_VAR nom>. Afin de confirmer cette inscription nous vous invitons à cliquer sur le liens ci-dessous : 3.7 + 3.8 +<TMPL_VAR url>?action=confirm&c=<TMPL_VAR code> 3.9 + 3.10 + Vous pouvez aussi vous rendre sur le site, à la page "inscription", et donner le code <TMPL_VAR code>. 3.11 + 3.12 + Vous devez confirmer votre inscription dans les <TMPL_VAR delay> jours à compter de l'envoie de ce message électronique. 3.13 + 3.14 + Si vous ne vous êtes pas inscrit au jeu $€₣, ne faites rien. Votre adresse sera effacée de nos serveur dans <TMPL_VAR delay> jours. 3.15 + 3.16 + Bonne journée,
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 4.2 +++ b/sentinel Fri Jul 10 15:14:57 2009 +0200 4.3 @@ -0,0 +1,301 @@ 4.4 +#! /usr/bin/perl 4.5 + 4.6 +use strict; 4.7 +use warnings; 4.8 + 4.9 +############################################################ 4.10 +# Constantes 4.11 +############################################################ 4.12 +use Readonly; 4.13 + 4.14 +Readonly my $DB_BASE => 'jogo'; 4.15 +Readonly my $DB_USER => 'sentinel'; 4.16 +Readonly my $DB_PASS => ''; 4.17 + 4.18 +Readonly my $URL_INSCRIPTION => 'http://ardus.matabio.net/cgi/sef/inscription'; 4.19 + 4.20 +Readonly my $MAINTENEUR_MAIL => 'jogo@matabio.net'; 4.21 +Readonly my $MAIL_FROM => 'sef@matabio.net'; 4.22 +Readonly my $MAIL_CHARSET => 'UTF8'; 4.23 +Readonly my $MAIL_MAILER => 'SEF Sentinel'; 4.24 + 4.25 +Readonly my $TEMPLATE_BASE => 'mails'; 4.26 + 4.27 +Readonly my $CONFIRMATION_DELAY => 3; # en jours 4.28 +Readonly my $NEW_JOUEUR_SOLDE => 10000; 4.29 +Readonly my $NEW_JOUEUR_RM_DELAY => 3; # en jours 4.30 +Readonly my $NEW_JOUEUR_EVENEMENT => 'vient enfin de rejoindre $€₣'; 4.31 + 4.32 +Readonly my $INSCR_ID => 0; 4.33 +Readonly my $INSCR_NOM => 1; 4.34 +Readonly my $INSCR_MAIL => 2; 4.35 + 4.36 + 4.37 +############################################################ 4.38 +# Main 4.39 +############################################################ 4.40 + 4.41 +use DBI; 4.42 +my $dbh 4.43 + = DBI->connect("dbi:Pg:dbname=$DB_BASE", $DB_USER, $DB_PASS, 4.44 + { RaiseError => 1, PrintError => 0 }) 4.45 + or die 'Unable to connect to database'; 4.46 +my $sth; 4.47 +my $rows; 4.48 + 4.49 + 4.50 +############################################################ 4.51 +# Inscriptions Réelles 4.52 +############################################################ 4.53 + 4.54 +# Nettoyage paranoïde 4.55 +$rows = $dbh->do( 4.56 + q{ DELETE FROM Inscriptions 4.57 + USING Confirmations c 4.58 + WHERE c.est = inscriptions.id 4.59 + AND c.mail != inscriptions.mail 4.60 + } 4.61 +); 4.62 +plog($rows, 'hack du mail'); 4.63 + 4.64 +# Verif confirmations 4.65 +$rows = $dbh->do( 4.66 + q{ UPDATE Inscriptions i 4.67 + SET confirm = NULL 4.68 + FROM Confirmations c 4.69 + WHERE i.id = c.est 4.70 + AND i.confirm != c.confirm 4.71 + } 4.72 +); 4.73 +plog($rows, 'confirmations fausses'); 4.74 + 4.75 +# prepare loop inscription réelle 4.76 +my $select = $dbh->prepare( 4.77 + q{ SELECT i.id, i.nom, i.mail 4.78 + FROM Inscriptions i 4.79 + JOIN Confirmations c ON c.est = i.id 4.80 + WHERE i.confirm = c.confirm 4.81 + } 4.82 +); 4.83 +my $ins_investisseur = $dbh->prepare( 4.84 + q{ INSERT INTO Investisseurs (nom, solde) 4.85 + VALUES (?, ?) 4.86 + RETURNING id 4.87 + } 4.88 +); 4.89 +my $ins_joueur = $dbh->prepare( 4.90 + q{ INSERT INTO Joueurs (est, mail, passwd, passage) 4.91 + VALUES (?, ?, ?, current_timestamp(0) - interval ?) 4.92 + } 4.93 +); 4.94 +my $del_inscription = $dbh->prepare( 4.95 + q{ DELETE FROM Inscriptions 4.96 + WHERE id = ? 4.97 + } 4.98 +); 4.99 +my $ins_evenement = $dbh->prepare( 4.100 + q{ INSERT INTO Evenements (invest, private, info) 4.101 + VALUES (?, 0, ?) 4.102 + } 4.103 +); 4.104 + 4.105 +# loop inscription réelle 4.106 +$rows = 0; 4.107 +$select->execute(); 4.108 +while (defined(my $inscription = $select->fetchrow_arrayref())) { 4.109 + my $passwd; 4.110 + 4.111 + $dbh->begin_work(); 4.112 + eval { 4.113 + $ins_investisseur->execute($inscription->[$INSCR_NOM], 4.114 + $NEW_JOUEUR_SOLDE); 4.115 + my ($invest_id) = $ins_investisseur->fetchrow_array(); 4.116 + die 'investisseurs.id undef' unless defined($invest_id); 4.117 + 4.118 + $passwd = new_passwd(12); 4.119 + $ins_joueur->execute( 4.120 + $invest_id, $inscription->[$INSCR_MAIL], 4.121 + $passwd, "$NEW_JOUEUR_RM_DELAY days" 4.122 + ); 4.123 + 4.124 + $ins_evenement->execute($invest_id, $NEW_JOUEUR_EVENEMENT); 4.125 + 4.126 + send_rep( 4.127 + { template => 'inscription', 4.128 + To => $inscription->[$INSCR_MAIL], 4.129 + nom => $inscription->[$INSCR_NOM], 4.130 + passwd => $passwd, 4.131 + delay => $NEW_JOUEUR_RM_DELAY, 4.132 + } 4.133 + ); 4.134 + 4.135 + $dbh->commit(); 4.136 + }; 4.137 + 4.138 + if ($@) { 4.139 + $dbh->rollback(); 4.140 + send_rep( 4.141 + { template => 'erreur', 4.142 + To => $inscription->[$INSCR_MAIL], 4.143 + erreur => $@, 4.144 + deleted => 1, 4.145 + } 4.146 + ); 4.147 + } 4.148 + else { 4.149 + $rows += 1; 4.150 + } 4.151 + 4.152 + $del_inscription->execute($inscription->[$INSCR_ID]); 4.153 +} 4.154 + 4.155 +plog($rows, 'nouveaux joueurs'); 4.156 + 4.157 +############################################################ 4.158 +# Envoie Code Confirmation 4.159 +############################################################ 4.160 + 4.161 +# Effacement des vieilles confirmations 4.162 +$rows = $dbh->do( 4.163 + q{ DELETE FROM Confirmations 4.164 + WHERE stamp < current_timestamp(0) - ?::interval 4.165 + }, undef, "$CONFIRMATION_DELAY days" 4.166 +); 4.167 +plog($rows, 'confirmations périmées'); 4.168 + 4.169 +# Compte des joueurs et des confirmé, et maximum 4.170 +my $places_prises 4.171 + = ($dbh->selectrow_array(q{ SELECT count(*) FROM Joueurs }))[0] 4.172 + + ($dbh->selectrow_array(q{ SELECT count(*) FROM Confirmations }))[0]; 4.173 +my $places_disponibles 4.174 + = ($dbh->selectrow_array(q{ SELECT joueurs FROM Parametres }))[0] 4.175 + - $places_prises; 4.176 + 4.177 +# Envoie de $places_disponibles confirmation 4.178 +if ($places_disponibles > 0) { 4.179 + my $select = $dbh->prepare( 4.180 + q{ SELECT id, nom, mail 4.181 + FROM Inscriptions 4.182 + WHERE confirm IS NULL 4.183 + ORDER BY id ASC 4.184 + LIMIT ? 4.185 + } 4.186 + ); 4.187 + my $ins_confirmation = $dbh->prepare( 4.188 + q{ INSERT INTO Confirmations (est, mail, confirm) 4.189 + VALUES (?, ?, ?) 4.190 + } 4.191 + ); 4.192 + 4.193 + $select->execute($places_disponibles); 4.194 + $rows = 0; 4.195 + while (defined(my $inscription = $select->fetchrow_arrayref())) { 4.196 + my $confirm = new_passwd(16); 4.197 + 4.198 + $dbh->begin_work(); 4.199 + eval { 4.200 + $ins_confirmation->execute($inscription->[$INSCR_ID], 4.201 + $inscription->[$INSCR_MAIL], $confirm); 4.202 + 4.203 + my $code = sprintf('%s%.7x', $confirm, $inscription->[$INSCR_ID]); 4.204 + send_rep( 4.205 + { template => 'confirmation', 4.206 + To => $inscription->[$INSCR_MAIL], 4.207 + nom => $inscription->[$INSCR_NOM], 4.208 + code => $code, 4.209 + url => $URL_INSCRIPTION, 4.210 + delay => $CONFIRMATION_DELAY, 4.211 + } 4.212 + ); 4.213 + 4.214 + $dbh->commit(); 4.215 + }; 4.216 + 4.217 + if ($@) { 4.218 + $dbh->rollback(); 4.219 + print STDERR $@; 4.220 + send_rep( 4.221 + { template => 'erreur', 4.222 + To => $inscription->[$INSCR_MAIL], 4.223 + erreur => $@, 4.224 + deleted => 1, 4.225 + } 4.226 + ); 4.227 + } 4.228 + else { 4.229 + $rows += 1; 4.230 + } 4.231 + } 4.232 + 4.233 + plog($rows, 'confirmations envoyées'); 4.234 +} 4.235 + 4.236 + 4.237 +############################################################ 4.238 +# Fonctions 4.239 +############################################################ 4.240 + 4.241 +sub plog { 4.242 + # Type : private 4.243 + # Descr : say what happends if integer > 0 4.244 + # Params: integer, string 4.245 + # Return: nothing 4.246 + # Throws: nothing 4.247 + my ($num, $txt) = @_; 4.248 + if ($num > 0) { 4.249 + printf "%d %s\n", $num, $txt; 4.250 + } 4.251 +} 4.252 + 4.253 +use Jogo::MkPass qw( mk_pass ); 4.254 + 4.255 +sub new_passwd { 4.256 + # Type : private 4.257 + # Descr : crée une chaine aléatoire 4.258 + # Params: taille de la chaine 4.259 + # Return: la chaine 4.260 + # Throws: nothing 4.261 + my ($total_size) = @_; 4.262 + my $nalpha_size = int($total_size / 4); 4.263 + return mk_pass($total_size, $total_size, $nalpha_size); 4.264 +} 4.265 + 4.266 +use Mail::Mailer qw( sendmail ); 4.267 +use HTML::Template; 4.268 + 4.269 +sub send_rep { 4.270 + # Type : private 4.271 + # Descr : envoie un mail 4.272 + # Params: hashref 4.273 + # Return: nothing 4.274 + # Throws: ? 4.275 + # Todo : cf. Mail::Builder::Simple ou faire un module 4.276 + my ($param) = @_; 4.277 + 4.278 + my $mail = Mail::Mailer->new(); 4.279 + $mail->open( 4.280 + { From => $MAIL_FROM, 4.281 + 'Content-Type' => "text/plain; charset=$MAIL_CHARSET", 4.282 + 'X-Mailer' => $MAIL_MAILER, 4.283 + map { $_ => $param->{$_} } 4.284 + grep {/^[A-Z]/} 4.285 + keys %$param 4.286 + } 4.287 + ); 4.288 + 4.289 + my $template = HTML::Template->new( 4.290 + filename => $param->{template}, 4.291 + path => [$TEMPLATE_BASE], 4.292 + die_on_bad_params => 0, 4.293 + blind_cache => 1, 4.294 + ); 4.295 + $template->param($param); 4.296 + $template->param(mainteneur_mail => $MAINTENEUR_MAIL); 4.297 + 4.298 + my $body = $template->output(); 4.299 + $body =~ s/(\S)\n([^\s:]+\s)/$1 $2/gs; 4.300 + $body =~ s/([^\n]{70,80}?)\s/$1\n/gs; 4.301 + 4.302 + print $mail $body; 4.303 + $mail->close(); 4.304 +}
5.1 --- a/templates/static/inscription Sun Jun 28 22:35:44 2009 +0200 5.2 +++ b/templates/static/inscription Fri Jul 10 15:14:57 2009 +0200 5.3 @@ -16,9 +16,9 @@ 5.4 vous pouvez entrer le code ici pour finaliser votre inscription.</p> 5.5 <form action="<TMPL_VAR cgi_base>/inscription"><dl> 5.6 <dt>Code de confirmation : <dd> 5.7 - <input type="text" name="code" size=38> 5.8 + <input type="text" name="c" size=24> 5.9 </dl> 5.10 - <button type="submit" name="action" value="confirmation">Finaliser</button> 5.11 + <button type="submit" name="action" value="confirm">Finaliser</button> 5.12 </form> 5.13 </div> 5.14
6.1 --- a/tour Sun Jun 28 22:35:44 2009 +0200 6.2 +++ b/tour Fri Jul 10 15:14:57 2009 +0200 6.3 @@ -516,6 +516,14 @@ 6.4 WHERE d.dirigeant = est 6.5 AND passage > p.debut 6.6 }); 6.7 +$rows += $dbh->do(q{ 6.8 +UPDATE Joueurs 6.9 +SET experience = experience + 1 6.10 +WHERE est NOT IN ( 6.11 + SELECT DISTINCT dirigeant 6.12 + FROM Societes 6.13 + ) 6.14 +}); 6.15 plog('%d enrichissement de l\'expèrience', $rows) if ($rows > 0); 6.16 6.17 # Nettoyage des Mouvements
