Français Solved Récupérer le temps de déconnexion :

  • Auteur de la discussion Auteur de la discussion Hugette
  • Date de début Date de début

Hugette

User
30/5/24
7
1
100
Bonjour a tous ,

Je suis en pleine création de script pour récupérer depuis combien de temps le joueur ne s'est pas connecté pour ensuite lui appliquer certaines variables :
je récupère last_seen ( de base dans la db altis life) dans mon fichier life serveur queryRequest comme ceci :

Code:
        _lastSeen = [(_queryResult select 13)] call TON_fnc_convertDateToTimestamp;
        diag_log format ["Last seen raw value: %1", _lastSeen];

        if (!(_lastSeen isEqualTo "") && !(_lastSeen isEqualTo [])) then {
            diag_log format ["Converted last seen time: %1", _lastSeen];

            if (_lastSeen <= 600) then {
                diag_log format ["Player %1 was seen within the last 10 minutes.", _uid];
            } else {
                diag_log format ["Player %1 was not seen within the last 10 minutes.", _uid];
            };
        } else {
            diag_log "No valid last seen data available.";
        };

mon fichier TON_fnc_convertDateToTimestamp; :

Code:
private["_timeStamp","_return"];
_timeStamp = param [0,"",[""]];
_return = [];

//if(_timeStamp == "") exitWith {[2024,1,1,1,1,1]};

_return pushBack parseNumber(_timeStamp select[0,4]);
_return pushBack parseNumber(_timeStamp select[5,2]);
_return pushBack parseNumber(_timeStamp select[8,2]);
_return pushBack parseNumber(_timeStamp select[11,2]);
_return pushBack parseNumber(_timeStamp select[14,2]);
_return pushBack parseNumber(_timeStamp select[17,2]);

_return;

mon erreur dans les logs :
Code:
Error in expression <e["_timeStamp","_return"];
_timeStamp = param [0,"",[""]];
_return = [];



_ret>
  Error position: <param [0,"",[""]];
_return = [];



_ret>
  Error Type Array, expected String
File life_server\Functions\customsFiles\fn_convertDateToTimestamp.sqf..., line 2
"Last seen raw value: [0,0,0,0,0,0]"
"Converted last seen time: [0,0,0,0,0,0]"
Error in expression <n time: %1", _lastSeen];

if (_lastSeen <= 600) then {
diag_log format ["Player >
  Error position: <<= 600) then {
diag_log format ["Player >
  Error <=: Type Array, expected Number,Not a Number
File life_server\Functions\MySQL\fn_queryRequest.sqf..., line 135
,

si quelqu'un aurait l'amabilité de m'aider car la je n'y vois aucune solution j'ai peut être les yeux trop dans le fichier hahahaha
 
--- Ce message a été généré automatiquement par ChatGPT, le contenu peut être incorrect. Veuillez lire le message avec précaution ! ---

Bonjour,

Il semble que l'erreur provienne de la fonction TON_fnc_convertDateToTimestamp. Assurez-vous que le format de date en entrée est correct pour éviter les problèmes de type Array vs String. Vérifiez également que le résultat renvoyé par cette fonction est bien un tableau contenant des nombres. Vous pouvez ajouter des diagnostics supplémentaires pour mieux comprendre le problème.

N'hésitez pas à me tenir au courant si vous avez besoin de plus d'assistance. Bonne programmation !

--- Pour continuer la discussion avec ChatGPT, cliquez sur "Répondre" en bas à droite de ce message. Sinon, attendez que quelqu'un vous réponde. ---
 
Salut, Je n'ai pas trop compris pourquoi tu convertis un tableau en un autre tableau de manière étrange. Extdb te retourne la date sous forme de tableau en SQF, de la même manière que tu peux la voir dans ta base de données. Pour ce qui est de ton problème, je pense que la meilleure solution est de comparer la date directement dans ta requête SQL :
[CODE lang="sql" title="code sql"]SELECT last_seen < NOW() - INTERVAL 6 DAY
FROM players
WHERE uid = '1';
[/CODE]


en sqf ça donne ça :
[CODE lang="diff" title="code sqf"]private _query_tcheck_last = format ["SELECT last_seen < NOW() - INTERVAL 6 DAY FROM players WHERE pid = '%1'", _uid];
if (([_query_tcheck_last, 2] call DB_fnc_asyncCall) isEqualTo 1) then {
diag_log format ["Le joueur uid : %1 ne c'est pas connecté les 6 dernier jour", _uid];
};
[/CODE]
 
je pourrais donc faire comme ceci :
Code:
private _query_tcheck_last = format ["SELECT last_seen < NOW() - INTERVAL 10 MINUTE FROM players WHERE pid = '%1'", _uid];


Salut, Je n'ai pas trop compris pourquoi tu convertis un tableau en un autre tableau de manière étrange. Extdb te retourne la date sous forme de tableau en SQF, de la même manière que tu peux la voir dans ta base de données. Pour ce qui est de ton problème, je pense que la meilleure solution est de comparer la date directement dans ta requête SQL :
[CODE lang="sql" title="code sql"]SELECT last_seen < NOW() - INTERVAL 6 DAY
FROM players
WHERE uid = '1';
[/CODE]


en sqf ça donne ça :
[CODE lang="diff" title="code sqf"]private _query_tcheck_last = format ["SELECT last_seen < NOW() - INTERVAL 6 DAY FROM players WHERE pid = '%1'", _uid];
if (([_query_tcheck_last, 2] call DB_fnc_asyncCall) isEqualTo 1) then {
diag_log format ["Le joueur uid : %1 ne c'est pas connecté les 6 dernier jour", _uid];
};
[/CODE]
 
Oui, je corrige juste mon exemple, j'ai oublié qu'extdb renvoie obligatoirement un tableau :

[CODE title="code sqf"]private _query_tcheck_last = format ["SELECT last_seen < NOW() - INTERVAL 10 MINUTE FROM players WHERE pid = '%1'", _uid];
if ((([_query_tcheck_last, 2] call DB_fnc_asyncCall) select 0) isEqualTo 1) then {
diag_log format ["Le joueur uid : %1 ...", _uid];
};
[/CODE]
 
Maintenant ce pose un autre problème avec cette manière , j'aimerais faire en sorte d'envoyer la valeur last_seen à
_queryResult remoteExec ["SOCK_fnc_requestReceived",_ownerID];

Pour que dans le requestReceveid je puisse verifier si cela fait + de 10 minute ou non et en fonction faire spawn le joueur à sa dernière position connu ou lui ouvrir le menu de spawn classique et qu'il choisisse sa vile
 
Il faut rajouter la colonne last_seen dans ton select de ta requête sql, et ensuite l'ajouter dans la teableau _queryResult. Comme ceci à la fin de ton fichier :
[CODE title="code sqf"]private _query_tcheck_last = format ["SELECT last_seen < NOW() - INTERVAL 10 MINUTE, last_seen FROM players WHERE pid = '%1'", _uid];
private _result_last_seen = [_query_tcheck_last, 2] call DB_fnc_asyncCall;

_queryResult pushBack (_result_last_seen select 1);

if ((_result_last_seen select 0) isEqualTo 1) then {
diag_log format ["Le joueur uid : %1 ...", _uid];
};

_queryResult remoteExec ["SOCK_fnc_requestReceived",_ownerID];
[/CODE]
 
je peux donc le recuperer comme ceci dans le requestReceveid : ?
Code:
        if (LIFE_SETTINGS(getNumber,"save_civilian_position") isEqualTo 1) then {
            life_is_alive = _this select 10;
            life_civ_position = _this select 11;
           _result_last_seen = _this select 13;

            if (life_is_alive) then {
                if !(count life_civ_position isEqualTo 3) then {diag_log format ["[requestReceived] Bad position received. Data: %1",life_civ_position];life_is_alive =false;};
                if (life_civ_position distance (getMarkerPos "respawn_civilian") < 300) then {life_is_alive = false;};
            };
        };
 
finalement tout bien reflechis je crois que je le recupere mal
Code:
 _result_last_seen = _this select 13;
j'ai donc ajouter last_seen a ma requette _query
Code:
    case civilian: {format ["SELECT pid, name, cash, bankacc, adminlevel, donorlevel, civ_licenses, arrested, civ_gear, civ_stats, civ_alive, civ_position, playtime, last_seen < NOW() - INTERVAL 10 MINUTE FROM players WHERE pid='%1'",_uid];};
 
Est-ce que tu peux envoyer tes fichiers fn_queryRequest.sqf et fn_requestReceived.sqf en entier ?

Peut-être qu'il faut faire comme ça :
Code:
case civilian: {format ["SELECT pid, name, cash, bankacc, adminlevel, donorlevel, civ_licenses, arrested, civ_gear, civ_stats, civ_alive, civ_position, playtime, (last_seen < NOW() - INTERVAL 10 MINUTE) AS lastSeenCheck FROM players WHERE pid='%1'",_uid];};
 
Bonjour tout dabord merci pour ta reponse et voici
Code:
#include "\life_server\script_macros.hpp"
private ["_uid","_side","_query","_queryResult","_tickTime","_tmp"];
_uid = [_this,0,"",[""]] call BIS_fnc_param;
_side = [_this,1,sideUnknown,[civilian]] call BIS_fnc_param;
_ownerID = [_this,2,objNull,[objNull]] call BIS_fnc_param;

if (isNull _ownerID) exitWith {};

if (LIFE_SETTINGS(getNumber,"player_deathLog") isEqualTo 1) then {
    _ownerID addMPEventHandler ["MPKilled", {_this call fn_whoDoneIt}];
};

_ownerID = owner _ownerID;

_query = switch (_side) do {
    case west: {format ["SELECT pid, name, cash, bankacc, adminlevel, donorlevel, cop_licenses, coplevel, cop_gear, blacklist, cop_stats, playtime FROM players WHERE pid='%1'",_uid];};
    case civilian: {format ["SELECT pid, name, cash, bankacc, adminlevel, donorlevel, civ_licenses, arrested, civ_gear, civ_stats, civ_alive, civ_position, playtime, last_seen FROM players WHERE pid='%1'",_uid];};
    case independent: {format ["SELECT pid, name, cash, bankacc, adminlevel, donorlevel, med_licenses, mediclevel, med_gear, med_stats, playtime FROM players WHERE pid='%1'",_uid];};
};

_tickTime = diag_tickTime;
_queryResult = [_query,2] call DB_fnc_asyncCall;

if (EXTDB_SETTING(getNumber,"DebugMode") isEqualTo 1) then {
    diag_log "------------- Client Query Request -------------";
    diag_log format ["QUERY: %1",_query];
    diag_log format ["Time to complete: %1 (in seconds)",(diag_tickTime - _tickTime)];
    diag_log format ["Result: %1",_queryResult];
    diag_log "------------------------------------------------";
};

if (_queryResult isEqualType "") exitWith {
    [] remoteExecCall ["SOCK_fnc_insertPlayerInfo",_ownerID];
};

if (count _queryResult isEqualTo 0) exitWith {
    [] remoteExecCall ["SOCK_fnc_insertPlayerInfo",_ownerID];
};

_tmp = _queryResult select 2;
_queryResult set[2,[_tmp] call DB_fnc_numberSafe];
_tmp = _queryResult select 3;
_queryResult set[3,[_tmp] call DB_fnc_numberSafe];

_new = [(_queryResult select 6)] call DB_fnc_mresToArray;
if (_new isEqualType "") then {_new = call compile format ["%1", _new];};
_queryResult set[6,_new];


_old = _queryResult select 6;
for "_i" from 0 to (count _old)-1 do {
    _data = _old select _i;
    _old set[_i,[_data select 0, ([_data select 1,1] call DB_fnc_bool)]];
};

_queryResult set[6,_old];

_new = [(_queryResult select 8)] call DB_fnc_mresToArray;
if (_new isEqualType "") then {_new = call compile format ["%1", _new];};
_queryResult set[8,_new];
switch (_side) do {
    case west: {
        _queryResult set[9,([_queryResult select 9,1] call DB_fnc_bool)];
        _new = [(_queryResult select 10)] call DB_fnc_mresToArray;
        if (_new isEqualType "") then {_new = call compile format ["%1", _new];};
        _queryResult set[10,_new];
        _new = [(_queryResult select 11)] call DB_fnc_mresToArray;
        if (_new isEqualType "") then {_new = call compile format ["%1", _new];};
        _index = TON_fnc_playtime_values_request find [_uid, _new];
        if (_index != -1) then {
            TON_fnc_playtime_values_request set[_index,-1];
            TON_fnc_playtime_values_request = TON_fnc_playtime_values_request - [-1];
            TON_fnc_playtime_values_request pushBack [_uid, _new];
        } else {
            TON_fnc_playtime_values_request pushBack [_uid, _new];
        };
        [_uid,_new select 0] call TON_fnc_setPlayTime;
    };

    case civilian: {
        _queryResult set[7,([_queryResult select 7,1] call DB_fnc_bool)];
        _new = [(_queryResult select 9)] call DB_fnc_mresToArray;
        if (_new isEqualType "") then {_new = call compile format ["%1", _new];};
        _queryResult set[9,_new];
        _queryResult set[10,([_queryResult select 10,1] call DB_fnc_bool)];
        _new = [(_queryResult select 11)] call DB_fnc_mresToArray;
        if (_new isEqualType "") then {_new = call compile format ["%1", _new];};
        _queryResult set[11,_new];
        _new = [(_queryResult select 12)] call DB_fnc_mresToArray;
        if (_new isEqualType "") then {_new = call compile format ["%1", _new];};
        _index = TON_fnc_playtime_values_request find [_uid, _new];
        if (_index != -1) then {
            TON_fnc_playtime_values_request set[_index,-1];
            TON_fnc_playtime_values_request = TON_fnc_playtime_values_request - [-1];
            TON_fnc_playtime_values_request pushBack [_uid, _new];
        } else {
            TON_fnc_playtime_values_request pushBack [_uid, _new];
        };
        [_uid,_new select 2] call TON_fnc_setPlayTime;


        _lastSeen = [(_queryResult select 13)] call TON_fnc_convertDateToTimestamp;
        diag_log format ["Last seen raw value: %1", _lastSeen];

        _houseData = _uid spawn TON_fnc_fetchPlayerHouses;
        waitUntil {scriptDone _houseData};
        _queryResult pushBack (missionNamespace getVariable [format ["houses_%1",_uid],[]]);
        _gangData = _uid spawn TON_fnc_queryPlayerGang;
        waitUntil{scriptDone _gangData};
        _queryResult pushBack (missionNamespace getVariable [format ["gang_%1",_uid],[]]);
    };

    case independent: {
        //Parse Stats
        _new = [(_queryResult select 9)] call DB_fnc_mresToArray;
        if (_new isEqualType "") then {_new = call compile format ["%1", _new];};
        _queryResult set[9,_new];

        //Playtime
        _new = [(_queryResult select 10)] call DB_fnc_mresToArray;
        if (_new isEqualType "") then {_new = call compile format ["%1", _new];};
        _index = TON_fnc_playtime_values_request find [_uid, _new];
        if !(_index isEqualTo -1) then {
            TON_fnc_playtime_values_request set[_index,-1];
            TON_fnc_playtime_values_request = TON_fnc_playtime_values_request - [-1];
            TON_fnc_playtime_values_request pushBack [_uid, _new];
        } else {
            TON_fnc_playtime_values_request pushBack [_uid, _new];
        };
        [_uid,_new select 1] call TON_fnc_setPlayTime;
    };
};

publicVariable "TON_fnc_playtime_values_request";

_keyArr = missionNamespace getVariable [format ["%1_KEYS_%2",_uid,_side],[]];
_queryResult pushBack _keyArr;

_queryResult remoteExec ["SOCK_fnc_requestReceived",_ownerID];

mon requestReceveid :

Code:
#include "..\..\script_macros.hpp"
private _count = count _this;
life_session_tries = life_session_tries + 1;
if (life_session_completed) exitWith {}; //Why did this get executed when the client already initialized? Fucking arma...
if (life_session_tries > 3) exitWith {cutText[localize "STR_Session_Error","BLACK FADED"]; 0 cutFadeOut 999999999;};

0 cutText [localize "STR_Session_Received","BLACK FADED"];
0 cutFadeOut 9999999;

//Error handling and junk..
if (isNil "_this") exitWith {[] call SOCK_fnc_insertPlayerInfo;};
if (_this isEqualType "") exitWith {[] call SOCK_fnc_insertPlayerInfo;};
if (count _this isEqualTo 0) exitWith {[] call SOCK_fnc_insertPlayerInfo;};
if ((_this select 0) isEqualTo "Error") exitWith {[] call SOCK_fnc_insertPlayerInfo;};
if (!(getPlayerUID player isEqualTo (_this select 0))) exitWith {[] call SOCK_fnc_dataQuery;};

//Lets make sure some vars are not set before hand.. If they are get rid of them, hopefully the engine purges past variables but meh who cares.
if (!isServer && (!isNil "life_adminlevel" || !isNil "life_coplevel" || !isNil "life_donorlevel")) exitWith {
    [profileName,getPlayerUID player,"VariablesAlreadySet"] remoteExecCall ["SPY_fnc_cookieJar",RSERV];
    [profileName,format ["Variables set before client initialization...\nlife_adminlevel: %1\nlife_coplevel: %2\nlife_donorlevel: %3",life_adminlevel,life_coplevel,life_donorlevel]] remoteExecCall ["SPY_fnc_notifyAdmins",RCLIENT];
    sleep 0.9;
    failMission "SpyGlass";
};

//Parse basic player information.
CASH = parseNumber (_this select 2);
BANK = parseNumber (_this select 3);
CONST(life_adminlevel,(_this select 4));
if (LIFE_SETTINGS(getNumber,"donor_level") isEqualTo 1) then {
    CONST(life_donorlevel,(_this select 5));
} else {
    CONST(life_donorlevel,0);
};

//Loop through licenses
if (count (_this select 6) > 0) then {
    {missionNamespace setVariable [(_x select 0),(_x select 1)];} forEach (_this select 6);
};

//Parse side specific information.
switch (playerSide) do {
    case west: {
        CONST(life_coplevel,(_this select 7));
        CONST(life_medicLevel,0);
        life_blacklisted = _this select 9;
        if (LIFE_SETTINGS(getNumber,"save_playerStats") isEqualTo 1) then {
            life_hunger = ((_this select 10) select 0);
            life_thirst = ((_this select 10) select 1);
            player setDamage ((_this select 10) select 2);
        };
    };

    case civilian: {
        life_is_arrested = _this select 7;
        CONST(life_coplevel, 0);
        CONST(life_medicLevel, 0);
        life_houses = _this select (_count - 3);
        if (LIFE_SETTINGS(getNumber,"save_playerStats") isEqualTo 1) then {
            life_hunger = ((_this select 9) select 0);
            life_thirst = ((_this select 9) select 1);
            player setDamage ((_this select 9) select 2);
        };

        //Position
        if (LIFE_SETTINGS(getNumber,"save_civilian_position") isEqualTo 1) then {
            life_is_alive = _this select 10;
            life_civ_position = _this select 11;
            _respawnStatus = _this select 13;
            if (life_is_alive) then {
                if !(count life_civ_position isEqualTo 3) then {diag_log format ["[requestReceived] Bad position received. Data: %1",life_civ_position];life_is_alive =false;};
                if (life_civ_position distance (getMarkerPos "respawn_civilian") < 300) then {life_is_alive = false;};
                if (_respawnStatus >= 600) then {
                    life_is_alive = false;
                };
            };
        };

        {
            _house = nearestObject [(call compile format ["%1",(_x select 0)]), "House"];
            life_vehicles pushBack _house;
        } forEach life_houses;

        life_gangData = _this select (_count - 2);
        if !(count life_gangData isEqualTo 0) then {
            [] spawn life_fnc_initGang;
        };
        [] spawn life_fnc_initHouses;
    };

    case independent: {
        CONST(life_medicLevel,(_this select 7));
        CONST(life_coplevel,0);
        if (LIFE_SETTINGS(getNumber,"save_playerStats") isEqualTo 1) then {
            life_hunger = ((_this select 9) select 0);
            life_thirst = ((_this select 9) select 1);
            player setDamage ((_this select 9) select 2);
        };
    };
};

life_gear = _this select 8;
call life_fnc_loadGear;

if (count (_this select (_count - 1)) > 0) then {
    {life_vehicles pushBack _x;} forEach (_this select (_count - 1));
};

life_session_completed = true;
 
Dernière édition:
finalement tout bien reflechis je crois que je le recupere mal
Code:
 _result_last_seen = _this select 13;
j'ai donc ajouter last_seen a ma requette _query
Code:
    case civilian: {format ["SELECT pid, name, cash, bankacc, adminlevel, donorlevel, civ_licenses, arrested, civ_gear, civ_stats, civ_alive, civ_position, playtime, last_seen < NOW() - INTERVAL 10 MINUTE FROM players WHERE pid='%1'",_uid];};
Salut, Oui c'est la meilleure solution en termes d'optimisation... Mais je ne conseille pas cette solution à tout le monde, car il y a un grand risque que la requête ait déjà été changée et donc ce ne soit pas le même index que l'on sélectionne. Ce n'est donc pas idéal pour faire un tutoriel le plus simple possible :/