Surveiller l'activité de l'utilisateur

Bonjour,

il y a t’il un moyen de surveiller l’activité des utilisateurs (des clients), ceci dans le but de déconnecter le client s’il n’y a aucune activité enregistrée au bout d’un laps de temps défini…???

Quelqu’un l’a t-il déjà mis en place?

merci

: Laurent GILET

Bonjour,

il y a t’il un moyen de surveiller l’activité des utilisateurs (des
clients), ceci dans le but de déconnecter le client s’il n’y a aucune
activité enregistrée au bout d’un laps de temps défini…???

Quelqu’un l’a t-il déjà mis en place?

merci

C’est un réglage à faire dans l’onglet client seveur du serveur

S’il s’agit de gérer ça sur un 4d client : un process local interroge la position de la souris de temps en temps, si elle est inchangée depuis un temps X, quitter 4d.

Apparemment, ça n’a pas l’air de marcher…
J’ai mis 5mn de délai et j’ai lancé un client à 23:22. à 23:40, il n’est toujours pas déconnecté…

Bonjour
Je ne veux pas dire de betise mais il me semble qu’il faut relancer le serveur apres avoir modifié de réglage.

CDLT
Didier

au lancement de la base, on fait :

APPELER SUR ÉVÉNEMENT(“Evenement”;"$GestionClavier") // process frappe clavier en action

pour enregistrer l’activité des clients (clic souris + frappes clavier)

dans la méthode événement, on fait compte l’activité du client :

<>NombreFrappes:=<>NombreFrappes+1 // cumule tous les clics et frappes clavier de l’utilisateur pour les statistiques

On lance une méthode stockée sur le serveur qui va mesurer l’inactivité (chez moi, c’est actif uniquement la nuit pour déconnecter ceux qui laissent 4D ouvert en quittant le bureau !)

voici le réglage dans les préférences :

[]28885894;“réglages des préférences”[/]

la méthode stockée :

<code 4D>
// PCESS_Inactivite_
// EXÉCUTÉ SUR LE SERVEUR
// par Mimosa le vendredi 9 février 2018 à Chiang-Mai
// appelé par : SERVEUR_demarrer avec le code suivant :

// Si (<>delai_inactivite<=0)
// // pas de vérification d’activité
// Sinon
// <>ProcessTestInactivite:=Nouveau process(“PCESS_Inactivite_”;0;“Inactivite”;*) // déconnexion des clients ayant oublié de quitter le soir
// Fin de si

// stoppé par : SERVEUR_quitter avec le code suivant :

// <>QUITTER_SERVEUR:=Vrai
// RÉACTIVER PROCESS(<>ProcessTestInactivite)
// APPELER PROCESS(<>ProcessTestInactivite)

// voir aussi : RESEAU_activiteClients

C_OBJET($bilan)
C_ENTIER LONG($nombreInactifs;$i;$n;$indice)
C_TEXTE($client;$horodatage)

LECTURE SEULEMENT(*)

Repeter

$bilan:=RESEAU_activiteClients   // analyse de la séance serveur en cours (car aucun paramétre)

Si (OB Est vide($bilan))
	
	LOG_AjoutTrace ("*** aucun client connecté...")  // sans doute aucun client n'est connecté en ce moment
	
Sinon 
	
	TABLEAU TEXTE($lesUtilisateurs;0)
	TABLEAU BOOLÉEN($lesInactifs;0)
	TABLEAU TEXTE($lesFinsTexte;0)
	TABLEAU ENTIER LONG($lesFinsActivite;0)
	
	OB LIRE TABLEAU($bilan;"utilisateurs";$lesUtilisateurs)
	OB LIRE TABLEAU($bilan;"inactifs";$lesInactifs)
	OB LIRE TABLEAU($bilan;"description";$lesFinsTexte)
	OB LIRE TABLEAU($bilan;"fin_activite";$lesFinsActivite)
	
	TABLEAU TEXTE($lesClients;0)
	TABLEAU ENTIER LONG($lesMethodes;0)
	LIRE CLIENTS INSCRITS($lesClients;$lesMethodes)  // liste des clients vraiment connectés au serveur avec un $ devant leur nom
	
	$n:=Taille tableau($lesClients)
	
	Boucle ($i;1;$n)  // on balaye la liste des clients
		
		$indice:=Chercher dans tableau($lesUtilisateurs;Sous chaîne($lesClients{$i};2))  // on saute le $ initial
		
		Au cas ou 
			: ($indice=Aucun enregistrement courant)
				
			: ($lesInactifs{$i})  // client inactif à éjecter
				
				$client:=$lesClients{$i}
				EXÉCUTER SUR CLIENT($client;"MENU_Quitter")  // le serveur va archiver sa séance automatiquement via BASE_Quitter
				FICH_DateHeure ($lesFinsActivite{$i};->$horodatage)
				LOG_AjoutTrace (BASE_LireChaineCalculee (<>Ressource1;298;$lesUtilisateurs{$i};$horodatage))  // "Éjection de Yves pour inactivité depuis 10h30 mn"
				
			Sinon   // client actif
				
				Si (<>cDEBUG)
					FICH_DateHeure ($lesFinsActivite{$i};->$horodatage)
					LOG_AjoutTrace ($lesUtilisateurs{$i}+" toujours actif "+$horodatage)
				Fin de si 
				
		Fin de cas 
		
	Fin de boucle 
Fin de si 

PCESS_EndormirProcess (<>delai_inactivite*60*60)  // endormi jusqu'au nombre de minutes spécifié dans <>delai_inactivite

Jusque (<>QUITTER_SERVEUR) // jusqu’à ce que l’on quitte l’application

<>ProcessTestInactivite:=0 // fin du process

</code 4D>

et la méthode qui mesure l’activité (piste à adapter selon la méthode dont vous enregistrer les séances) :

<code 4D>
// RESEAU_activiteClients ( { numéro séance serveur ; heure courante } ) -> OBJ des inactifs
// par Mimosa le jeudi 8 février 2018 à Chiang-Mai
// analyse une séance serveur donnée ou bien la séance en cours par défaut
// appelé périodiquement par PCESS_Inactivite_
// voir aussi : POLE_GrapheActivite LTG_Reset

C_OBJET($0;$retour)
C_ENTIER LONG($1;$NumeroUtilisateur;$i;$n;$j;$p;$IDseanceServeur;$indice;$timeStampActuel;$secondes;$nombreUsers)
C_HEURE($2;$maintenant;$heureFin;$debutNuit;$finNuit)
C_DATE($date)
C_BOOLÉEN($active)
C_TEXTE($log)

$IDseanceServeur:=<>NumeroSeanceServeur
$maintenant:=Heure courante()
$timeStampActuel:=BASE_TimeStamp (Date du jour(
);$maintenant)

$active:=Vrai

Si (Nombre de paramètres>=1)

$IDseanceServeur:=$1
$active:=Faux

Si (Nombre de paramètres>=2)
	$maintenant:=$2
Fin de si 

Fin de si

LECTURE SEULEMENT([Preferences])
TOUT SÉLECTIONNER([Preferences])

$debutNuit:=[Preferences]DEBUT_NUIT
$finNuit:=[Preferences]FIN_NUIT
$delaiInactivite:=[Preferences]DELAI_INACTIVITE_CLIENT

Au cas ou

: ($delaiInactivite=0)
	
	  // le test d'inactivité n'a pas été demandé dans les préférences
	
: ($maintenant<$debutNuit) & ($maintenant>$finNuit) & (Nombre de paramètres=0)  // test uniquement pour la séance courante
	
	  // pas de test durant les heures de travail
	
Sinon   // c'est la nuit, on regarde ceux qui sont inactifs
	
	Si ($active)  // signifie séance en cours par défaut
		
		CHERCHER([Seances];[Seances]NUMERO_INTERNE>$IDseanceServeur;*)  // connexions depuis le lancement du serveur
		CHERCHER([Seances]; & ;[Seances]CRASH=$active)  // qui sont encore actives
		
	Sinon   // test d'une séance particulière
		
		CHERCHER([Seances];[Seances]NUMERO_INTERNE=$IDseanceServeur)
		$timeStampActuel:=[Seances]TIMESTAMP_FERMETURE  // comparaison par rapport à la fin de la session dans ce cas
		
		CHERCHER([Seances];[Seances]NUMERO_INTERNE>$IDseanceServeur)
		$date:=DATE_DecodeTimestamp ($timeStampActuel)
		ALERTE(Chaîne($date))
		
	Fin de si 
	
	TABLEAU TEXTE($Users;0)
	VALEURS DISTINCTES([Seances]NOM_UTILISATEUR;$Users)  // le tableau est automatiquement trié
	
	TRIER([Seances];[Seances]NUMERO_INTERNE;>)
	
	TABLEAU TEXTE($lesUtilisateurs;0)
	TABLEAU ENTIER LONG($lesDebuts;0)
	TABLEAU TEXTE($lesLogs;0)
	SÉLECTION VERS TABLEAU([Seances]NOM_UTILISATEUR;$lesUtilisateurs;[Seances]TIMESTAMP_OUVERTURE;$lesDebuts;[Seances]ACTIVITE_SESSION;$lesLogs)
	
	$indice:=Chercher dans tableau($lesUtilisateurs;"4D Serveur")  // séance serveur suivante (ou toute la suite)
	
	Si ($indice=Aucun enregistrement courant)
		
		  // c'est en principe le cas pour la session courante
		
	Sinon   // on a demandé l'analyse d'une session serveur particulière
		
		  // on ne conserve que les connexions de la session serveur demandée :
		
		TABLEAU TEXTE($lesUtilisateurs;$indice-1)
		TABLEAU ENTIER LONG($lesDebuts;$indice-1)
		TABLEAU TEXTE($lesLogs;$indice-1)
		
	Fin de si 
	
	$n:=Taille tableau($lesUtilisateurs)  // toutes les connexions durant la session
	
	TABLEAU TEXTE($Users;0)
	COPIER TABLEAU($lesUtilisateurs;$Users)
	$nombreUsers:=ARRAY_ValeursDistinctes (->$Users)  // les utilisateurs de cette session
	TRIER TABLEAU($Users)
	
	  // on va calculer les timestamps de dernière activité dans $lesFins :
	
	TABLEAU ENTIER LONG($lesFins;$n)
	TABLEAU TEXTE($lesFinsTexte;$n)
	
	Boucle ($i;1;$n)
		
		$log:=$lesLogs{$i}
		$p:=Longueur($log)/7
		
		  // TABLEAU ENTIER LONG($lesTranches;$p)
		TABLEAU ENTIER LONG($lesActivites;$p)
		
		Boucle ($j;1;$p)
			  // $lesTranches{$j}:=Num(Sous chaîne($log;7*($j-1)+1;4)) // si on veut un jour les tranches des minutes...
			$lesActivites{$j}:=Num(Sous chaîne($log;7*($j-1)+5;3))
		Fin de boucle 
		
		$lesActivites{0}:=MAXLONG  // sentinelle d'arrêt
		$j:=$p+1  // on part de la fin du log
		
		Repeter 
			
			$j:=$j-1
			
		Jusque ($lesActivites{$j}#0)  // dernière activité pour cet utilisateur
		
		$lesFins{$i}:=$lesDebuts{$i}+($j*3*60)  // 3 = nombre de minutes dans PCESS_Archivage, on calcule QUAND a été écrite cette tranche
		FICH_DateHeure ($lesFins{$i};->$lesFinsTexte{$i})  // date et heure en clair de fin du travail pour cet utilisateur et séance
		
	Fin de boucle 
	
	TRIER TABLEAU($lesFins;$lesFinsTexte;$lesUtilisateurs;<)  // récentes activités au début des tableaux
	
	$n:=Taille tableau($Users)
	$message:=""
	
	TABLEAU ENTIER LONG($lesFinsActivite;$n)
	TABLEAU BOOLÉEN($lesInactifs;$n)
	TABLEAU TEXTE($lesFinsTexte;$n)
	
	Boucle ($i;1;$n)
		
		$indice:=Chercher dans tableau($lesUtilisateurs;$Users{$i})
		
		$lesFinsActivite{$i}:=$lesFins{$indice}  // date et heure de la dernière activité
		$secondes:=$timeStampActuel-$lesFinsActivite{$i}  // durée de l'inactivité depuis lors
		$lesFinsTexte{$i}:=DATE_TimeToString ($secondes)  // description en clair du délai d'inactivité : "1h 25 mn" par exemple
		$lesInactifs{$i}:=($secondes>($delaiInactivite*60))  // vrai si trop longtemps inactif par rapport au délai demandé
		
		$message:=$message+" ["+$Users{$i}+" "+$lesFinsTexte{$i}+"]"
		
	Fin de boucle 
	
	  // FIXER TEXTE DANS CONTENEUR($message)
	
	Si ($n>0)  // si au moins un client connecté, on affiche le bilan d'activités
		LOG_AjoutTrace ("INACTIVITÉS :"+$message)
	Fin de si 
	
	  // renvoie tous ces tableaux dans un objet :
	
	OB FIXER TABLEAU($retour;"utilisateurs";$lesUtilisateurs)
	OB FIXER TABLEAU($retour;"inactifs";$lesInactifs)
	OB FIXER TABLEAU($retour;"description";$lesFinsTexte)
	OB FIXER TABLEAU($retour;"fin_activite";$lesFinsActivite)

Fin de cas

$0:=$retour

</code 4D>

On peut ainsi voir l’activité d’un utilisateur durant sa journée (somme des frappes et clics ) :

[]28885924;“Analyse”[/]

merci pour toutes ces réponses

: Herve LE MARCHAND

On peut ainsi voir l’activité d’un utilisateur durant sa journée
(somme des frappes et clics ) :
Big brother tout ça !

A propos de big brother, avez-vous remarqué que 4D Forum vous demande de vous re-authentifier chaque fois que votre adresse IP change ?

Oui. Mieux vaut en avoir une fixe :wink: