Bonjour à tous,

N'étant pas programmeur, je viens solliciter un peu d'assistance pour faire une petite modification
d'un code qui fait un contrôle d'accès à un serveur de jeux. Désolé si c'est un peu long, la modif
devait se faire plus vite que la présente rédaction mais je ne vois pas comment être plus court
pour faciliter la compréhension de ma demande qui se résume surtout à de la syntaxe, il me faut donc bien décrire la situation.

Ainsi actuellement, le contrôle consiste en la vérification que le joueur à un certain niveau de points, cela fonctionne bien.

Structurellement, j'ai :

- un fichier JoueurInfos.php qui contient notamment une classe JoueurInfos avec :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
public $id_j;
public $nbrPoints;
public $pseudo;
public $ready;
public $rank;
- un fichier Master.php qui gère notamment l'accès au serveur avec d'une part une fonction pour la
récupération des points de l'utilisateur dans la db :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function getPoints($id_j)
        {
                $msg = " - getPoints : récupération du nombre de points pour le joueur id_joomla $id_j => ";
                $sql = "
                        SELECT cb_points
                        FROM
                                ".self::$prefbdd."_comprofiler cb
                        WHERE
                                cb.id = $id_j ";
                $recordset = self::$DB->query($sql);
                $nb = $recordset->recordCount();
                $r = $recordset->fetchAssoc();
 
                $msg .= $r['cb_points'];
                $this->debugLog($msg);
 
                return $r['cb_points'];
        }
... et d'autre part, le code proprement dit pour le contrôle avec pour principal :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$joueur = new JoueurInfos;
$joueur->id_j = self::$guestJoomla[$login];
$joueur->nbrPoints = $this->getPoints($joueur->id_j); // Récupération des points de l'utilisateur
$joueur->ready = false;
$joueur->best = -1;
$joueur->pseudo = self::supMiseEnForme($player->nickName);
$this->joueurs[$login] = $joueur;
 
if ($joueur->nbrPoints < self::$minPoints)
{
	$msg = self::$prefPlayer.'Attention, vous n\'avez pas assez de points pour accéder à ce serveur';
    $this->connection->chatSendServerMessage($msg,$login,true);
    $this->debugLog('* PlayerConnect : '.$msg);
}
else
{
	$msg = self::$prefPlayer.'Vous pourrez participer à la prochaine map';
    $this->connection->chatSendServerMessage($msg,$login,true);
    $this->debugLog('* PlayerConnect : '.$msg);
}

Ce test "if" vérifie donc que le joueur a bien les points nécessaires, je voudrais maintenant ajouter avant cette vérification,
un test que le joueur a bien un abonnement payant actif pris sur mon site sous joomla 2.5.8 et akeeba subsriptions
3.1.0
. La table est _akeebasubs_subscriptions et les champs utiles:

- akeebasubs_level_id qui donne le numéro de l'abonnement créé dans akeeba, il faut savoir qu'un des abo est gratuit,
tous les autres payants. La valeur level_id de l'abo gratuit est 16.

- publish_down qui est la date de fin d'un abo

- enabled qui dit si un abo est actif (valeur à 1) ou non (valeur à 0) mais attention qu'une valeur à 0 ne veut pas
dire que l'abo est expiré car l'utilisateur peut prendre un renouvellement avant la fin de son abo en cours, de sorte
que la table aura une entrée pour cet utilisateur mais le champ "enabled" sera à 0 car l'abo n'aura pas encore commencé.
C'est à ça que sert ici la valeur de "publish_down" pour vérifier si c'est un renouvellement (date de fin se termine après
date courante) ou si c'est un abo expiré (date de fin se termine avant date courante)

Ainsi pour vérifier que l'utilisateur a bien un abo payant en cours, je récupère par la fin de la table (car elle incrémente de 1 à chaque
nouvel abo pris par un utilisateur), le premier enregistrement relatif à l'utilisateur courant et après récup des données via les fonctions,
je comptais modifier le "if" ci-dessus pour arriver à ceci:

si c'est un abo gratuit // tout utilisateur s'inscrit d'abord avec un abo gratuit donc il n'y en a qu'un possible par
compte donc si le système le trouve, c'est qu'il n'y a jamais eu d'abo payants depuis.
"Désolé, pas d'abonnement payant actif"

sinon si c'est un payant mais enabled à 0, est-ce un renouvellement ?
si abo termmine avant date courante
"Désolé, abonnement expiré"

sinon si assez de points... // et ici le test des points qu'il y avait avant

Alors en code ça donnerait (à corriger pour la syntaxe que je ne connais pas naturellement):

- dans le fichier JoueurInfos.php, ajouter

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
public $akLevelId // pour le num de l'abo
public $pubDown  // pour la date de fin de l'abo
public $statusAbo  // pour récup la valeur de enabled
- créer une fonction getStatusAbo pour récupérer les valeurs des champs akeebasubs_level_id, publish_down et enabled :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function getStatusAbo($id_j)
{
	$msg = " - getStatusAbo : récupération du status d'abonnement pour le joueur id_joomla $id_j => ";
	$sql = "
    SELECT akeebasubs_level_id, publish_down, enabled 
    FROM
		".self::$prefbdd."_akeebasubs_subscriptions s
    WHERE
		s.user_id = $id_j
    ORDER BY akeebasubs_subscription_id DESC LIMIT 1 "
 
	$recordset = self::$DB->query($sql);
	$nb = $recordset->recordCount();
    $r = $recordset->fetchAssoc();
	$msg .= $r['akeebasubs_level_id', 'publish_down', 'enabled'];
    $this->debugLog($msg);
	return $r['akeebasubs_level_id', 'publish_down', 'enabled'];
- modifier le test d'accès proprement dit pour arriver à :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$joueur = new JoueurInfos;
$joueur->id_j = self::$guestJoomla[$login];
 
$joueur->akLevelId, pubDown, statusAbo = $this->getStatusAbo($joueur->id_j); // ici on récupère les valeurs Abo
$joueur->nbrPoints = $this->getPoints($joueur->id_j); // ici on récupère les points de l'utilisateur
 
$joueur->ready = false;
$joueur->best = -1;
$joueur->pseudo = self::supMiseEnForme($player->nickName);
$this->joueurs[$login] = $joueur;
 
// Ici le changement de la condition
 
if ($joueur->akLevelId == 16) // si c'est un abo gratuit
{
	$msg = self::$prefPlayer.'Désolé, pas d\'abonnement actif !';
	$this->connection->chatSendServerMessage($msg,$login,true);
	$this->debugLog('* PlayerConnect : '.$msg);
}
 
elseif ($joueur->statusAbo == 0) // sinon si c'est un payant mais enabled à 0, est-ce un renouvellement ?
{
	if ($joueur->pubDown < date_courante) // si abo termmine avant date courante
	{
		$msg = self::$prefPlayer.'Désolé, votre abonnement est expiré !';
		$this->connection->chatSendServerMessage($msg,$login,true);
		$this->debugLog('* PlayerConnect : '.$msg);
}
 
	elseif ($joueur->nbrPoints < self::$minPoints) // sinon test des points et poursuite du code
			...

Voilà, je ne sais pas ce que je pourrait dire de plus, ce n'est pas compliqué pour qui connaît PHP,
ce qui n'est pas mon cas donc si on pouvait me dire si ma logique est bonne et en plus m'aider à
"orthographier" ça correctement, ce serait génial...

Merci de votre aide...