Jump to content

Dernière connexion


Recommended Posts

Posted

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

  • Moderators
Posted

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.

Posted

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 :)

  • Moderators
Posted

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.

Posted

Enfaite, j'aimerai le résultat suivant en RFC 2822, par exemple mon timestamp donne Sat, 10 Oct 2015 10:07:57 via timestampgenerator.com, et j'aimerai avoir genre "Samedi 10 Octobre à 15h"

  • Moderators
Posted
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 

Posted

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 ?

  • Moderators
Posted

%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.

Posted

Ah d'acc, du coup, pour mon horloge j'aurai pu utilser ce système au lieu de surcharger les lignes avec if minutes < 10 then ajouter 0 devant les minutes.

Merci.

  • Moderators
Posted

Oui tu aurais pu utiliser ça, c'est juste que ça tiens en 1 seule ligne mais au niveau performance, la différence est plus qu'insignifiante. Je pense quand même que ton if est plus performant que le string.format

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...