Commit e9cb283c authored by Mathieu Loiseau's avatar Mathieu Loiseau
Browse files

with LexInnova proto support+bug correction

parent d207d74d
......@@ -134,7 +134,7 @@ class diviner_game
private function selectpartie(){
$res = false;
try{
$recordingFactory = new ItemFactory($this->diviner,$this->userlang);
$recordingFactory = new ItemFactory($this->diviner,$this->user->langGame);
$this->raisin = $recordingFactory->get_recording(ItemFactory::VALID_RECORDING_NOT_ME);
if(is_object($this->raisin)){
// construction de l'adresse de l'enregistrement à  partir du nom du fichier son
......
......@@ -105,7 +105,7 @@ class druid_arbitrage
//Cas par défaut (clique sur arbitrer)
else{
$this->partie=false;
$recordingFactory = new ItemFactory($this->druid,$this->userlang);
$recordingFactory = new ItemFactory($this->druid,$this->user->langGame);
$this->raisin = $recordingFactory->get_recording(ItemFactory::LIMBO_RECORDING_ME_IF_POSSIBLE);
if(is_object($this->raisin) && file_exists("enregistrements/".$this->raisin->cheminEnregistrement)){
//construction de l'adresse de l'enregistrement à partir du nom du fichier
......
......@@ -5,7 +5,8 @@ class LexInnovaLink{
private $lexiconUrl = "http://totoro.imag.fr/lexinnova/api/Lexinnova@user@/@lang@/cdm-headword/*/cdm-headword/?strategy=NOT_EQUAL" ;
private $content ;
private $lang_codes = array("es"=>"esp",
"fr"=>"fre");
"fr"=>"fre",
"en"=>"eng");
public function __construct($user){
......@@ -14,7 +15,13 @@ class LexInnovaLink{
array($this->user->username,
$this->lang_codes[$this->user->langGame]),
$this->lexiconUrl);
$this->content = simplexml_load_file($this->lexiconUrl);
$headers = get_headers($this->lexiconUrl, 1);
if($headers[0] == 'HTTP/1.1 200 OK'){
$this->content = simplexml_load_file($this->lexiconUrl);
}
else{
$this->content = false ;
}
}
public function has_content(){
......@@ -29,6 +36,18 @@ class LexInnovaLink{
return $result;
}
//returns a string formatted for an SQL query
public function list_entries(){
$result = "";
foreach ($this->content->xpath('d:entry/d:key') as $element){
if($result != ""){
$result .= ", ";
}
$result .= "'".$element."'";
}
return "($result)";
}
public function __toString(){
$result = "";
foreach ($this->content->xpath('d:entry/d:key') as $element){
......
......@@ -50,7 +50,7 @@ class oracle_alea_exist
private function selectcarte(){
// récupération de plusieurs cartes possibles
$cardFactory = new ItemFactory($this->oracle,$this->userlang);
$cardFactory = new ItemFactory($this->oracle,$this->user->langGame);
$card = $cardFactory->get_card(ItemFactory::CARD_NOT_ME);
if(is_object($card) && get_class($card)=="Card"){
//echo "<script>window.alert('C bon ça');</script>";
......
<?php
require_once('./models/card.class.php');
class oracle_card_alea
{
private $submit = false;
private $errors = array();
private $encoding = "UTF-8";
private $res='';
private $result= '';
private $mode = '';
public $tableau = '';
private $boobool = true;
private $time;
private $card;
private $mot = '';
private $tabou1 = '';
private $tabou2 = '';
private $tabou3 = '';
private $tabou4 = '';
private $tabou5 = '';
private $nivcarte = '';
private $userlang = '';
private $user= '';
private $oracle= '';
public function set_mode($mode)
{
$this->mode = $mode;
}
public function process()
{
if ( $this->init() )
{
$this->crawler();
return $this->display();
}
return false;
}
public function init()
{
$this->submit = isset($_POST['submit_form']);
$this->userlvl = userlvl::getInstance();
$this->time = $this->userlvl->get_time();
//quand on a appuyé sur "valider", récupération du formulaire
if ( $this->submit )
{
$this->res['mot'] = isset($_POST['mot']) ? trim($_POST['mot']) : '';
$this->res['nivcarte'] = isset($_POST['nivcarte']) ? trim($_POST['nivcarte']) : '';
$this->res['tabou1'] = isset($_POST['tabou1']) ? trim($_POST['tabou1']) : '';
$this->res['tabou2'] = isset($_POST['tabou2']) ? trim($_POST['tabou2']) : '';
$this->res['tabou3'] = isset($_POST['tabou3']) ? trim($_POST['tabou3']) : '';
$this->res['tabou4'] = isset($_POST['tabou4']) ? trim($_POST['tabou4']) : '';
$this->res['tabou5'] = isset($_POST['tabou5']) ? trim($_POST['tabou5']) : '';
$this->et_c_est_le_temps_qui_court = date("d/m/Y H:i");
}
// initialisation du booléen de codiion finale d'acceptation de la génération
$this->boobool = true;
// récupération des informations relatives à l'utilisateur: userid, et sa langue.
$this->user = user::getInstance();
$this->oracle = $this->user->id;
$this->userlang = $this->user->userlang;
// la génération automatique de carte n'existe qu'en français pour l'instant
if ($this->userlang !== 'fr'){
array_push( $this->errors,'no_card_active');
}
return true;
}
public function crawler()
{
if ( (($this->submit) && ($this->boobool == false)) || (!$this->submit)) // si on a appuyé sur valider mais que la carte est mauvaise (rechargement de la page) ou qu'on n'a pas encore appuyé sur valider
{
include_once('controllers/simple_html_dom.php');
// fonction aléatoire entre 0 et 100 000
$alea = mt_rand(0, 100000);
$target_url = 'http://www.jeuxdemots.org/rezo-xml.php?gotermrelid='.$alea;
$html = new simple_html_dom();
$html->load_file($target_url);
$motatrouver='';
$listemot = '';
foreach($html->find('body') as $post){
$post= iconv("ISO-8859-1", "UTF-8", $post);
$posts = $post ? explode('<br>', $post) : array();
foreach ($posts as $wpost){
$findmot = '&lt;mot-formate&gt;'; // pour trouver le mot à trouver
$findme = '&quot; tid=&quot;'; // pour trouver les mots tabous
$mos = strpos($wpost, $findmot);
$pos = strpos($wpost, $findme);
// Notez notre utilisation de ===. == ne fonctionnerait pas comme attendu
// car la position de 'a' est la 0-ième (premier) caractère.
if ($mos !== false) {
$pos1=strpos($wpost, '&lt;mot-formate&gt;');
$pos2=strpos($wpost, '&lt;/mot-formate&gt;');
$motatrouver=substr($wpost, $pos1+19, ($pos2-($pos1+19)));
// echo "mot à trouver : ".$word.'<br />';
$listemot = $motatrouver;
}
if ($pos !== false) {
$pos1=strpos($wpost, '&quot;&gt;');
$pos2=strpos($wpost, '&lt;/rel&gt;');
$tabword=substr($wpost, $pos1+10, ($pos2-($pos1+10)));
// récupération de la balise de relation pour affinage futur du crawler
$pos3=strpos($wpost, '&lt;rel type=&quot;');
$pos4=strpos($wpost, '&quot; poids');
$tabbalise=substr($wpost, $pos3+19, ($pos4-($pos3+19)));
//ici appel d'une fonction de tri qui renvoie vrai ou faux selon si le mot est acceptable comme mot tabou
// test de $motatrouver dans $tabword, test de "_" dans $tabword, test de /^[A-Za-z]/ (s'il n'y a que des chiffres)
// si au moins une de ces conditions est vrai alors la fonction renvoie false et le mot n'est pas ajouté.
if ($this->checkmottab($motatrouver,$tabword,$tabbalise,$listemot)==true){
//test extérieur car la fonction renvoie juste vrai. remplace "patate>89621" par "patate" tout court
$tabword = preg_replace ('/\&gt;[0-9]+/', '' , $tabword);
$listemot = $listemot.",".$tabword;
}
}
}
//changement d'encodage à faire ici
$this->tableau = $listemot ? explode(',', $listemot) : array();
//Si la carte n'a pas 5 mots tabous, on ne la valide pas.
if (!isset($this->tableau[5]))
{
$this->boobool = false;
}else{
// carte acceptée
//adaptation à la page display qui utilise $res
$this->res['mot'] = $this->tableau[0];
$this->res['tabou1'] = $this->tableau[1];
$this->res['tabou2'] = $this->tableau[2];
$this->res['tabou3'] = $this->tableau[3];
$this->res['tabou4'] = $this->tableau[4];
$this->res['tabou5'] = $this->tableau[5];
$this->boobool =true;
}
}
}
}
private function checkmottab($a,$b,$c,$d) //$a = $motatrouver, $b = $tabword, $c = $tabbalise, $d = $listemot
{
$inclusiondash = strpos($b, '_'); //supprime tout ce qui commence par "_"
if($inclusiondash !== false){
return false;
}
$tagset = strpos($c, 'r_pos'); //supprime ce qui n'est que tag (Nom+Masc+Sing)
if($tagset !== false){
return false;
}
$inclusionmot = stripos($b, $a);//supprime tous les tabword contenant le mot à trouver: à affiner car on pourrait garder le reste
if($inclusionmot !== false){
return false;
}
$racinemot= substr($a,0,4); //récupère les 4 premiers caractères du mots (racine) si le mot ne fait que 3 lettres ça prend les trois lettres
$inclusionracine = stripos($b,$racinemot);
if($inclusionracine !== false){ // Si le mot tabou a la même racine que le mot à trouver
// L'idéal serait d'arriver à garder certains mots des locutions au lieu de les supprimer mais cette
//condition ne marche pas:
//~ $locution = preg_match($a.' W+ w+',$b); // Vérfification de locution, si s'en est une ($motatrouver de blabla):
//~ if (($locution !== false)){
//~ $b = preg_replace ($a.' W+ ', '' , $b);// remplace "$motatrouver de " par rien et ne garde que le "blabla".
//~ }else{
return false; //sinon c'est juste un mot de la même famille
//~ }
}
$suitepointschiffres = preg_match('/::/',$b); //enlève les suites du genre ":::112905:56362"
if (($suitepointschiffres == 1)){
return false;
}
$racinetab= substr($b,0,4); //récupère les 4 premiers caractères du mots (racine) si le mot ne fait que 3 lettres ça prend les trois lettres
$doublon = stripos($d,$racinetab); // recherche du mot tabou dans la liste des mots tabous déjà enregistrés
if (($doublon !== false)){
return false;
}
return true;
}
private function display()
{
if (!$this->boobool) //carte non validée
{
//on relance la procédure de génération
$this->process();
}else{
if(isset($_POST['submit_form'])) //carte validée, enregistrement dans la BD
{
if ( !$this->submit || $this->errors )
{
return false;
}
// insertion de la carte
$forbidden = array();
for($i=1;isset($this->res['tabou'.$i]);$i++){
array_push($forbidden,$this->res['tabou'.$i]);
}
$carte = new Card($this->userlang, NULL,
$this->res['nivcarte'], "nom", $this->oracle, $this->res['mot'], $forbidden, Array()/*, './views/card.inline.display.php'*/);
$carte->store();
$this->card = $carte ;
unset($this->res);
// affichage de la carte
include('./views/oracle.card.display.html');
}else{
//si carte pas encore validée, c'est le premier passage dans la page : affichage de la page génération de carte
include('./views/oracle.alea.html');
}
}
return true;
}
}
?>
<?php
require_once("lexInnova.class.php");
require_once("./controllers/lexInnova.class.php");
unset($_SESSION["idCard"]);
class oracle_menu_game
{
......@@ -25,9 +26,20 @@ class oracle_menu_game
private function init()
{
$this->user = user::getInstance();
/*useless*/
$this->oracle = $this->user->id;
$this->userlang = $this->user->userlang;
/*Lexicon*/
$this->lexicon = new LexInnovaLink($this->user);
if($this->lexicon->count_entries() > 0){
require_once("./models/item.factory.class.php");
$cardFactory = new ItemFactory($this->oracle,$this->user->langGame);
$card_id = $cardFactory->get_card_id(ItemFactory::CARD_FROM_LEXICON,
$this->lexicon->list_entries());
if($card_id != -1){
$_SESSION["idCard"] = $card_id;
}
}
return true;
}
......
......@@ -6,6 +6,7 @@ class ItemFactory //a quick and dirty class…
{ //…to encapsulate some "complicated" frequent queries
const ANY = 1;
const CARD_NOT_ME = 2;
const CARD_FROM_LEXICON = 5;
const VALID_RECORDING_NOT_ME = 3;
const LIMBO_RECORDING_ME_IF_POSSIBLE = 4;
private $db;
......@@ -32,8 +33,14 @@ class ItemFactory //a quick and dirty class…
}
}
private function generate_query($queryType){
private function generate_query($queryType, $parameter = NULL, $forOne = true){
$res = true;
if($forOne){
$forOne = "LIMIT 1";
}
else{
$forOne="";
}
switch ($queryType) {
case self::CARD_NOT_ME:
$this->query = "SELECT `cartes`.`idCarte` as `zeId` FROM `cartes` WHERE
......@@ -43,7 +50,7 @@ class ItemFactory //a quick and dirty class…
SELECT `enregistrement`.`carteID` as`cardId` FROM `enregistrement` WHERE `enregistrement`.`idOracle`='$this->user_id'
UNION SELECT `enregistrement`.`carteID` as`cardId` FROM `arbitrage`,`enregistrement` WHERE `arbitrage`.`enregistrementID` = `enregistrement`.`enregistrementID` AND `arbitrage`.`idDruide`='$this->user_id'
UNION SELECT `enregistrement`.`carteID` as`cardId` FROM `parties`,`enregistrement` WHERE `parties`.`enregistrementID` = `enregistrement`.`enregistrementID` AND `parties`.`idDevin`='$this->user_id'
) ORDER BY RAND() LIMIT 1;";
) ORDER BY RAND() $forOne;";
break;
case self::LIMBO_RECORDING_ME_IF_POSSIBLE:
$this->query = "SELECT `enregistrement`.*, IF(
......@@ -58,7 +65,7 @@ class ItemFactory //a quick and dirty class…
AND `enregistrement`.`validation` = 'limbo'
AND `enregistrement`.`carteID` = `cartes`.`idCarte`
AND `cartes`.`langue` = '$this->lang'
ORDER BY `poids` DESC, RAND() LIMIT 1";
ORDER BY `poids` DESC, RAND() $forOne;";
break;
case self::VALID_RECORDING_NOT_ME:
......@@ -71,7 +78,25 @@ class ItemFactory //a quick and dirty class…
AND `enregistrement`.`carteID` NOT IN (
SELECT `enregistrement`.`carteID` as`cardId` FROM `arbitrage`,`enregistrement` WHERE `arbitrage`.`enregistrementID` = `enregistrement`.`enregistrementID` AND `arbitrage`.`idDruide`='$this->user_id'
UNION SELECT `enregistrement`.`carteID` as`cardId` FROM `parties`,`enregistrement` WHERE `parties`.`enregistrementID` = `enregistrement`.`enregistrementID` AND `parties`.`idDevin`='$this->user_id'
) ORDER BY RAND() LIMIT 1;";
) ORDER BY RAND() $forOne;";
break;
case self::CARD_FROM_LEXICON: //ICITE tester la requête l'intégrer à innova class pour pouvoir allouer la variable de session et faire l'affichage en fonction de son existence(disabled ou non) et de celle du dico (pas d'affichage)
if(isset($parameter)){
$this->query = "SELECT `cartes`.`idCarte` as `zeId` FROM `cartes` WHERE
`cartes`.`langue`='$this->lang'
AND `cartes`.`idDruide` != '$this->user_id'
AND `cartes`.`idCarte` NOT IN (
SELECT `enregistrement`.`carteID` as`cardId` FROM `enregistrement` WHERE `enregistrement`.`idOracle`='$this->user_id'
UNION SELECT `enregistrement`.`carteID` as`cardId` FROM `arbitrage`,`enregistrement` WHERE `arbitrage`.`enregistrementID` = `enregistrement`.`enregistrementID` AND `arbitrage`.`idDruide`='$this->user_id'
UNION SELECT `enregistrement`.`carteID` as`cardId` FROM `parties`,`enregistrement` WHERE `parties`.`enregistrementID` = `enregistrement`.`enregistrementID` AND `parties`.`idDevin`='$this->user_id'
)
AND ( `cartes`.`mot` IN $parameter
OR `cartes`.`idCarte` IN (SELECT `idCarte` FROM `mots_interdits` WHERE `mots_interdits`.`mot` IN $parameter)
) ORDER BY RAND() $forOne;";
}
else{
$res = false;
}
break;
default:
$res = false;
......@@ -82,8 +107,8 @@ class ItemFactory //a quick and dirty class…
//returns a card object if the query yields 1 result and the number
//of result otherwise, this should only be 0
public function get_card($queryType){
if($this->generate_query($queryType)){
public function get_card($queryType, $parameter = NULL){
if($this->generate_query($queryType, $parameter)){
$this->db->query($this->query);
$res = $this->db->affected_rows();
if($res == 1){
......@@ -96,8 +121,24 @@ class ItemFactory //a quick and dirty class…
return $res;
}
public function get_recording($queryType){
if($this->generate_query($queryType)){
public function get_card_id($queryType, $parameter = NULL){
if($this->generate_query($queryType, $parameter)){
$this->db->query($this->query);
if($this->db->affected_rows() == 1){
$res = $this->db->fetch_object()->zeId;
}
else{
$res = -1;
}
}
else{
throw new Exception("Not a proper query type '$queryType'.");
}
return $res;
}
public function get_recording($queryType, $parameter = NULL){
if($this->generate_query($queryType,$parameter)){
$this->db->query($this->query);
$res = $this->db->affected_rows();
if($res == 1){
......
......@@ -43,12 +43,16 @@ include('./sys/load_iso.php');
</li>
<?php
}
$disable="";
if($this->lexicon->count_entries()==0){
$disable = 'disabled="disabled"';
if($this->lexicon->has_content()){
if(isset($_SESSION["idCard"])){
$disable="";
}
else{
$disable = 'disabled="disabled"';
}
echo "<li type='button' $disable class='btn btn-primary btn-lg btn-block'>
<a href='?mode=oracle.byid' title='card from personal lexicon'>".$lang['card_lexinno'].'</a></li>';
}
echo "<li type='button' $disable class='btn btn-primary btn-lg btn-block'>
<a href='?mode=oracle.card.alea' title='card_alea'>".$lang['card_lexinno'].'</a></li>';
?>
<li type="button" class="btn btn-primary btn-lg btn-block">
<a href="?mode=oracle.byid" title="card_byid"><?php echo $lang['card_by_id']; ?></a>
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment