Temps et attente
Un script qui ne dort jamais martèle le jeu et se fait remarquer. Ces fonctions servent à espacer ce qu'il fait, et à savoir quelle heure il est.
Attendre
Dix fonctions, une seule idée : suspendre le script. Elles diffèrent par l'unité, et c'est la source d'erreur la plus fréquente.
| Fonction | Unité | Exemple |
|---|---|---|
Sleep(n) | millisecondes | Sleep(500) attend une demi-seconde |
SleepMs(n) | millisecondes | le même, sous son autre nom |
SleepSec(n) | secondes | SleepSec(30) |
SleepMin(n) | minutes | SleepMin(5) |
SleepDur(d) | une durée | SleepDur(90 * time.Second) |
SleepRandMs(min, max) | millisecondes | tirage au hasard entre les deux |
SleepRandSec(min, max) | secondes | SleepRandSec(20, 40) |
SleepRandMin(min, max) | minutes | SleepRandMin(3, 8) attend de 3 à 8 minutes |
SleepRandHour(min, max) | heures | SleepRandHour(1, 3) |
SleepUntil(quand) | jusqu'à une heure | voir plus bas |
Toutes rendent une valeur, une erreur, que l'on peut ignorer sans risque.
SleepSec(30)
SleepRandSec(20, 40) // préférez le hasard : un intervalle régulier se voit
Le piège de SleepRandMin
SleepRandMin compte des minutes. Certains scripts venus d'ailleurs lui passaient des millisecondes, parce qu'elle les comptait ainsi chez Ninja.
SleepRandMin(200, 800) // ✗ vous attendez de 3 h 20 à 13 h 20
SleepRandMs(200, 800) // ✓ vous attendez de 200 à 800 millisecondes
Rien ne vous avertira : le script dort, simplement, et vous croyez qu'il est bloqué. Le robot écrit tout de même une ligne au journal la première fois qu'un script appelle cette fonction, avec la durée retenue. Si vous y lisez « 437 minutes » alors que vous en attendiez quatre cents millisecondes, vous tenez votre coupable.
Dormir jusqu'à une heure
SleepUntil accepte deux formes, une chaîne d'horloge ou une date.
SleepUntil("03:30:00") // la prochaine fois qu'il sera 3 h 30
quand, err = GetNextDatetimeAt(3, 30, 0) // rend DEUX valeurs
if err == nil { SleepUntil(quand) } // ne l'imbriquez jamais dans SleepUntil(...)
Les deux écritures "03:30:00" et "03:30" sont acceptées.
N'imbriquez pas GetNextDatetimeAt dans SleepUntil. GetNextDatetimeAt rend deux valeurs, la date et une erreur ; écrite en argument direct d'un autre appel, anko les emballe dans une seule tranche, que SleepUntil ne sait pas lire. Le script ne dort pas, et l'échec passe inaperçu si vous n'avez pas récupéré l'erreur - voir le premier piège.
Avec une chaîne, si l'heure est déjà passée aujourd'hui, l'attente vise le lendemain. Un script qui programme sa nuit à trois heures du matin en plein après-midi attend la nuit, il ne repart pas en arrière.
Une attente s'interrompt
Toutes ces fonctions écoutent l'arrêt du script. Si vous cliquez sur Arrêter pendant que le script dort huit heures, il s'arrête tout de suite : il n'y a pas à attendre la fin de la temporisation. C'est aussi vrai quand le robot s'éteint.
Savoir l'heure
| Fonction | Rend | |
|---|---|---|
Now() | 1 : une date | L'instant présent. |
GetTimestamp() | 1 : un entier | L'instant présent en secondes depuis 1970. |
NowTimeString() | 1 : une chaîne | L'heure courante, 15:04:05. |
Clock() | 3 : heure, minute, seconde | |
Date() | 3 : année, mois, jour | |
Weekday() | 1 : un entier | Le jour de la semaine, dimanche valant zéro. |
Unix(sec, nsec) | 1 : une date | Reconstruit une date depuis un horodatage. |
h, m, s = Clock() // trois cibles, pas une
a, mo, j = Date()
if Weekday() == 0 { Print("dimanche") }
Clock et Date rendent trois valeurs. Écrites avec une seule cible, elles vous donnent une tranche de trois éléments, et vos comparaisons échouent en silence. Voir le premier piège.
Comparer et mesurer
| Fonction | Rend | |
|---|---|---|
NowInTimeRange(début, fin) | 1 : un booléen | Dit si l'heure courante est dans la plage. |
DurationBetweenTimeStrings(a, b) | 1 : une durée | L'écart entre deux heures d'horloge. |
MillisecondsBetweenTimeStrings(a, b) | 1 : un entier | Le même, en millisecondes. |
ShortDur(d) | 1 : une chaîne | Écrit une durée lisiblement, 2h15m. |
GetNextDatetimeAt(h, m, s) | 2 : la date et une erreur | La prochaine fois qu'il sera cette heure. |
ParseNextDatetimeAt(s) | 2 : la date et une erreur | La même, depuis "03:30:00". |
if NowInTimeRange("23:00:00", "07:00:00") {
Print("c'est la nuit") // la plage passe minuit, c'est prévu
}
Pour GetNextDatetimeAt, reprenez l'exemple vu plus haut, dans « Dormir jusqu'à une heure ».
NowInTimeRange gère les plages qui franchissent minuit : 23:00 à 07:00 se lit comme on l'attend. En revanche elle ne valide pas l'horaire qu'on lui donne : "25:00:00" ne provoque pas d'erreur, elle répond simplement faux. C'est le comportement de Ninja, gardé tel quel.