Jump to content

Dernière connexion


Recommended Posts

Bonsoir,

A court d'idée, la fatigue, j'ai demandé à un pote un élément en plus, à mettre dans une tableau concernant des factions.

Il m'a proposé: la dernière connexion.

Seulement, comme j'ai dis, la fatigue m'atteind, et je ne sais pas du tout comment faire pour arriver à faire ce genre de choses.

Passer par une requête SQL qui stock dans la base de donnée une variable avec la dernière connexion? Le soucis étant que getTime renvoie seulement l'heure et les minutes.

Des idées?

J'ai vu que cette partie devenait active, j'en profite! :D

Link to comment
  • Moderators

Rien de plus simple, pour travailler avec des dates, il faut manipuler ce qu'on appelle des timestamps.

Un timestamp est un nombre qui correspond au nombre de secondes qui s'est écoulé depuis le 1er Janvier 1970.

Par exemple le timestamp 1443657600 correspond au 1er Octobre 2015.

Pour récupérer ce timestamp, tu vas devoir utiliser getRealTime qui te renvoi par défaut un tableau qui va contenir le timestamp (et d'autres choses) correspondant à la date, l'heure et la seconde actuelles.

Tu n'as absolument pas dit quelle base de donnée tu utilisais (SQLite ? MySQL)

Pour MySQL, il faut créer une nouvelle colonne de type INTEGER et cocher la case unsigned (non signé).

Lorsque le joueur se déconnecte:

local currentTime = getRealTime() 
local timestamp = currentTime.timestamp 

et tu saves timestamp dans sa colonne.

Lorsque le joueur se connecte, tu récupères le timestamp dans une variable genre lastConnectionTimestamp.

Vu que c'est pour l'afficher dans un tableau ou panel, tu en as besoin côté client donc on va mettre un petit element data sur le joueur pour stocker notre lastConnectionTimestamp:

setElementData(thePlayer, "lastConnectionTimestamp", lastConnectionTimestamp) 

Un element data est par défaut synchronisé entre le serverside et le clientside.

Du côté client il ne te reste plus qu'à convertir le timstamp en date et afficher cette date dans ton tableau:

local lastConnectionTimestamp = getElementData(localPlayer, "lastConnectionTimestamp") 
local lastConnectionDate = getRealTime(lastConnectionTimestamp) 

lastConnectionDate.monthday pour le numéro du jour.

lastConnectionDate.month pour le numéro du mois.

lastConnectionDate.year+1900 pour l'année (oui il est basé sur l'an 1900 celui là d'après le wiki oO).

lastConnectionDate.hour pour l'heure.

lastConnectionDate.minute pour les minutes.

lastConnectionDate.second pour les secondes.(à toi de voir si t'as besoin d'un affichage aussi précis : D).

N'hésite pas à redemander si tu n'as pas compris un passage.

Link to comment

J'ai réussi, en procédent comme suis:

Quand le joueur se connecte, alors on lui attribue le setElementData comme tu as dis:

setElementData ( source, "lastConnectionTimestamp", query["lastConnection"]) 

Ensuite, dès qu'il se déco', on attrape le timestamp et on l'insère dans la variable.

local currentTime = getRealTime() 
local timestamp = currentTime.timestamp 
mysql:query("UPDATE compte SET lastConnection='".. timestamp.."' WHERE nom='".. quittingPlayerName .."'") 

Seulement, quand je fais une commande afin de récupérer le monthday, le month, l'hour et les minutes, ça m'affiche ça:

Timestamp: day = 10, month = 9 ......... hour = 10, minute = 5

Alors que sur la base de donnée, j'ai bien mon timestamp 1444464349 qui correspond à Sat, 10 Oct 2015 10:07:57 +0200 via le site que tu as donné timestampgenerator.com

J'ai trouvé plusieurs articles que je regarderais tout à l'heure, les voici:

http://stackoverflow.com/questions/4105 ... -timestamp

http://sql.sh/107-cast-timestamp-date

Au faite, j'utilise MySQL :)

Link to comment
  • Moderators

Seulement, quand je fais une commande afin de récupérer le monthday, le month, l'hour et les minutes, ça m'affiche ça:

Timestamp: day = 10, month = 9 ......... hour = 10, minute = 5

Bah oui, c'est le résultat attendu, quel est le problème ? Je veux bien comprendre que c'est pas le résultat que tu voulais, mais dans ce cas facilite moi la tâche en me disant exactement le résultat que tu souhaites avoir avec ce timestamp.

Si tu veux pas le numéro du mois en chiffre mais en lettre, il va falloir que tu l'as convertisse, c'est pas compliqué mais ça dépends de la langue utilisé sur ton serveur. Mais avec ce qu'on a déjà, il est facile de faire un affichage comme ceci: 10/10/2015 10:05

Si ton problème est que le mois devrait être 10 et non pas 9, c'est parce que les mois sont compté à partir de 0 (Janvier) jusqu'à 11 (Décembre).

J'attends ta réponse pour savoir réellement quel est le problème avec ça.

Link to comment
  • Moderators
j'aimerai avoir genre "Samedi 10 Octobre à 15h"

Ok je vois, je t'ai fais la fonction de conversion en français et je me suis permis de rajouter l'année et les minutes:

local _months = {"Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"} 
local _weekdays = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"} 
function timeToFr(t) 
    local year = t.year+1900 
    local monthFr = _months[t.month+1] 
    local weekdayFr = _weekdays[t.weekday+1] 
    local day = t.monthday 
    local hours = t.hour -- à toi de voir si tu veux le forcer sur 2 chiffres 
    local minutes = string.format("%02d", t.minute) -- force sur 2 chiffres 
    return string.format("%s %s %s %s %sh%s", weekdayFr, day, monthFr, year, hours, minutes) 
end 

Exemple d'utilisation:

local date = getRealTime(1444464349) 
outputChatBox(timeToFr(date)) -- Samedi 10 Octobre 2015 10h05 

Link to comment

En gros, c'est les arguments de getRealTime traduit avec des tables?

Je ne comprends juste pas les deux dernières lignes, enfin, le %02d signifie que tu veux deux chiffre parce que %02 ?

Ensuite, le string.format("%s %s %s %s %sh%s", ...) signifie que tu veux, sur la première ligne, le weekday, ensuite, le day, ensuite, le month, ensuite, le year puis l'hours puis les minutes? Sauf qu'on est en GMT +2 en France, je dois juste rajouter +2 quoi ?

Link to comment
  • Moderators

%02d signifie que je veux afficher un nombre (`d`) avec au moins deux chiffres (`2`) et rajouter des zeros si ce n'est pas le cas (`0`).

Exemples:

string.format("%02d", 5) -- "05" 
string.format("%02d", 10) -- "10" 
string.format("%02d", 123) -- "123" 

getRealTime utilise la date du système qui fait tourner le script dans lequel il est utilisé.

Donc une date récupéré depuis un système en GMT+2, convertit en timestamp et sauvegardé en db, sera aussi en GMT+2 lorsqu'on fera la manipulation inverse si le système reste en GMT+2.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...