Check inventory script/fr

Script de contrôle d'inventaire
Avant 2022, les viewers acceptaient toute forme d'inventaire en dehors des configurations complètement mal formées. Cela a maintenant changé avec un nouveau code ajouté aux viewers conçu pour valider si la structure de l'inventaire est correctement configurée. Malheureusement, en raison de bogues et de changements dans OpenSim, certains anciens inventaires  d'utilisateurs créés avant 2015 présentent des structures problématiques qui peuvent entraîner l'échec du chargement de l'inventaire ou le blocage complet de la connexion. Ce script vise à donner aux administrateurs de grille un moyen de valider l'inventaire d'un utilisateur ou de tous les utilisateurs pour voir lesquels sont susceptibles de rencontrer des problèmes et ce qui ne va pas exactement. Ici, nous décrivons également les étapes et les outils permettant de résoudre ces problèmes.

Le script
Actuellement ce script est partagé via un gist github par souci de commodité. Veuillez s'il vous plaît diriger les problèmes ou les demandes via  IRC

Script de contrôle de l'inventaire

Usage
Le script nécessite un serveur sur lequel est installé PHP7.4.


 * Ouvrez le script avec votre éditeur favori et vérifiez la configuration des variables $database_info en haut du code. Configurez-les pour vous connecter à la base de données de votre grille contenant la table inventoryfolders.


 * Exécutez le script ainsi  php check_inventory.php FirstName LastName Ceci lancera le script pour rechercher des erreurs fatales liées à l'inventaire d'un utilisateur.


 * Exécuter le script ainsi  php check_inventory.php FirstName LastName true Ceci va rechercher les doublons optionnels de dossiers du même type.

Le script peut également être exécuté pour tous les utilisateurs, mais la sortie sera assez grande. Si possible, il est préférable d'envoyer la sortie vers un fichier.

 php check_inventory.php everyone true Cette commande exécutera le script en recherchant les doublons optionnels de dossiers du même type pour tous les utilisateurs de la table UserAccounts.

'''Si cela semble compliqué ou dangereux, c'est parce que modifier directement la base de données l'est généralement. Si vous préférez laisser cette tâche à quelqu'un de plus expérimenté, n'hésitez pas à demander de l'aide sur IRC ou à contacter l'un des nombreux fournisseurs de services OpenSim hébergés.'''

Comment résoudre les problèmes
La configuration de l'inventaire est conçue pour avoir un seul dossier racine, appelé "My Inventory". Tous les dossiers doivent être placés sous ce dossier.

Les dossiers habituels pour les vêtements, les objets et même la corbeille ont des types spécifiques conçus pour leur donner leurs icônes et fournir un moyen de trier les objets entrants en conséquence. Un seul ensemble de ces dossiers est censé exister, mais OpenSim en ajoute un deuxième à l'inventaire, sous le dossier "My Suitcase" utilisé pour le protocole HG1.0.

Vous pouvez en savoir plus sur les types de dossiers dans la documentation de la base de données

Pour résoudre ces problèmes, il faut remettre la structure de l'inventaire dans la configuration correcte acceptée par les viewers. Pour ce faire, vous devez modifier la table de la base de données inventoryfolders. Cela peut être fait à partir de la ligne de commande ou via des programmes externes tels que DBeaver ou Navicat, selon ce que vous préférez.

Créer une sauvegarde
À l'aide d'outils tels que sqldump ou les outils de base de données susmentionnés, créez d'abord une sauvegarde de la table inventoryfolders avant de procéder à des modifications de la table !

Trouver l'utilisateur
Utilisez soit des filtres, soit une requête SQL pour sélectionner uniquement l'utilisateur qui nous intéresse, filtré par "AgentID" dans les dossiers d'inventaire.

 SELECT * FROM inventoryfolders WHERE `AgentID` = 'user-uuid' ;

Vérifiez les dossiers concernés
Le script vérifiera les dossiers qui ne sont pas de type "-1", ce qui signifie un dossier normal qu'un utilisateur pourrait créer. Pour récupérer uniquement ces dossiers, ajoutez un filtre pour ne montrer que les dossiers qui ne sont pas de ce type.

 SELECT * FROM inventoryfolders WHERE `AgentID` = 'user-uuid' AND `type` != '-1' ;

Trouver les doublons
Il est maintenant facile de trouver les dossiers sous "My Suitcase". Vous devriez voir le dossier "My Inventory" dans l'ensemble des lignes sélectionnées, en indiquant également le parentFolderID, qui devrait être une clé nulle, c'est-à-dire "00000000-0000-0000-0000-000000000000". Vous pouvez également voir son folderID ici. Cet UUID sera celui que tous les autres dossiers d'inventaire, tels que Vêtements, Objets et Corbeille, afficheront dans leur parentFolderID respectif. Cela crée une hiérarchie qui commence par "My Inventory" et qui descend en cascade vers tous les dossiers de la structure de l'inventaire.

Maintenant, en filtrant la requête par le nom du dossier, on peut facilement voir les doublons et leur parentFolderID qui ne pointe pas vers "My Inventory" mais vers le dossier "My Suitcase" et son folderID.

 SELECT * FROM inventoryfolders WHERE `AgentID` = 'user-uuid' AND `type` != '-1' ORDER BY folderName DESC;

Observez, le dossier parent du dossier "My Suitcase" est également le dossier "My Inventory".

Supprimer les doublons
À moins que vous n'utilisiez le protocole HG1.0 et le dossier "My Suitcase" pour partager des objets sur l'hypergrid sans exposer tout votre inventaire, vous n'avez pas besoin de ce dossier ou de ses sous-dossiers.

Cependant, supprimer entièrement le dossier alors qu'il peut contenir des éléments que l'utilisateur y a placés n'est peut-être pas la meilleure idée. Au lieu de cela, il suffit de changer le type de chaque dossier dupliqué en "-1" pour en faire des dossiers normaux.

 UPDATE inventoryfolders SET `type` = '-1' WHERE `AgentID` = 'user-uuid' AND `parentFolderID` != 'folderID of My Inventory' AND `parentFolderID` != '00000000-0000-0000-0000-000000000000';

Si le dossier parent n'est pas "My Inventory" ou le dossier racine lui-même, tous les dossiers seront de type "-1" pour cet utilisateur spécifique, ce qui modifiera tous les sous-dossiers de "My Suitcase".

Vérification des mauvais dossiers racines
Les nouvelles versions d'OpenSim placent le dossier "My Suitcase" dans un type qui n'entre pas en conflit, généralement le type "100", mais les anciennes versions l'ont placé dans le type "8" ou "9", ce qui provoque une erreur fatale. Pour résoudre ce problème, changez le type en "100".

 UPDATE inventoryfolders SET `type` = '100' WHERE `AgentID` = 'user-uuid' AND `folderName` = 'My Suitcase';

Dans certains cas, le dossier " My Inventory " peut encore être de l'ancien type " 9 ", ce qui pose également des problèmes. Pour résoudre ce problème, il faut le remplacer par le type "8".

 UPDATE inventoryfolders SET `type` = '8' WHERE `AgentID` = 'user-uuid' AND `folderName` = 'My Inventory';

Ces requêtes peuvent, mais ne devraient probablement pas, être exécutées pour tous les utilisateurs en omettant la clause where spécifiant l'UUID de l'agent. '''Nous vous suggérons fortement d'examiner l'inventaire de chaque utilisateur séparément et d'apporter les modifications nécessaires !