Kepler. Documentation · Scripts 325 fonctions disponibles actuellement English

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.

FonctionUnitéExemple
Sleep(n)millisecondesSleep(500) attend une demi-seconde
SleepMs(n)millisecondesle même, sous son autre nom
SleepSec(n)secondesSleepSec(30)
SleepMin(n)minutesSleepMin(5)
SleepDur(d)une duréeSleepDur(90 * time.Second)
SleepRandMs(min, max)millisecondestirage au hasard entre les deux
SleepRandSec(min, max)secondesSleepRandSec(20, 40)
SleepRandMin(min, max)minutesSleepRandMin(3, 8) attend de 3 à 8 minutes
SleepRandHour(min, max)heuresSleepRandHour(1, 3)
SleepUntil(quand)jusqu'à une heurevoir 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

FonctionRend
Now()1 : une dateL'instant présent.
GetTimestamp()1 : un entierL'instant présent en secondes depuis 1970.
NowTimeString()1 : une chaîneL'heure courante, 15:04:05.
Clock()3 : heure, minute, seconde
Date()3 : année, mois, jour
Weekday()1 : un entierLe jour de la semaine, dimanche valant zéro.
Unix(sec, nsec)1 : une dateReconstruit 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

FonctionRend
NowInTimeRange(début, fin)1 : un booléenDit si l'heure courante est dans la plage.
DurationBetweenTimeStrings(a, b)1 : une duréeL'écart entre deux heures d'horloge.
MillisecondsBetweenTimeStrings(a, b)1 : un entierLe 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 erreurLa prochaine fois qu'il sera cette heure.
ParseNextDatetimeAt(s)2 : la date et une erreurLa 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.