Aller au contenu
  • 1

Problème pour attribuer une permission selement le samedi et dimanche avec Skript


Question

Posté(e) (modifié)

Bonjour à tous,

Je rencontre un problème avec mon script Skript qui doit attribuer une permission uniquement le week-end (samedi et dimanche) à tous les joueurs, et la retirer les autres jours.

Voici ce que j'ai essayé

 

every 5 minutes:
    loop all players:
        set {_now} to now
        
        if {_now} is 'Saturday' or {_now} is 'Sunday':
            if loop-player does not have permission "shopguiplus.shops.weekend":
                execute console command "lp user %loop-player% permission set shopguiplus.shops.weekend true"
        else:
            if loop-player has permission "shopguiplus.shops.weekend":
                execute console command "lp user %loop-player% permission unset shopguiplus.shops.weekend"

 

 

 

Le souci est que la ligne if {_now} is 'Saturday' or {_now} is 'Sunday': ne fonctionne pas (erreur « can't understand this expression »), je pense que Skript ne reconnaît pas cette syntaxe.

Est-ce que quelqu’un saurait comment récupérer correctement le jour de la semaine en Skript, ou une autre méthode pour activer cette permission uniquement le samedi et dimanche ?

Merci beaucoup pour votre aide !

Modifié par Mamadoug
  • J'aime 1

2 réponses à cette question

Messages recommandés

  • 1
Posté(e)

Salut @Mamadoug,

Je te partage ici une solution fonctionnelle en bas de page, que j’ai codée pour répondre précisément à ton besoin:
attribuer une permission uniquement le week-end (samedi/dimanche), et la retirer sinon..... 🙂

Comprend d'où venait ton erreur:
Le problème rencontré est que Skript ne comprend pas la condition :

# output: Can't understand this condition: '{_now} is 'Saturday' or {_now} is 'Sunday''
set {_now} to now
if {_now} is 'Saturday' or {_now} is 'Sunday':

Skript ne sait ni reconnaître le jour de la semaine, ni interpréter "Saturday" comme une constante magique...
Donc il faut calculer nous-mêmes le jour de la semaine à partir de la date ! On va y aller par étapes.


Étape 1 – Comprendre ce qu’on a : l'expression now (Skript Hub - Documentation)
Skript implémente l'expression now, qui donne l’instant actuel (avec jour, mois, année, heure, minute).
Mais il ne donne pas le jour de la semaine directement comme tu peux le voir dans l'output ci-dessous....

Citation

# output: 12/07/2025 00:11
send "%now formatted as "dd/M/yy HH:MM z"%" to sender 

👉 On a donc besoin de transformer now en quelque chose qu’on peut analyser... du texte par exemple.

Étape 2 – Obtenir les composantes de la date
La date donnée par now ressemble à ça : 12/07/2025 00:11
On crée une fonction formatDate() qui transforme/découpe ce texte en une liste : [12, 07, 2025, 00, 11] -> [jour, mois, année, heure, minute]

set {_date::*} to "%{_d}%" split by "/"

Cela nous permet de séparer jour, mois, année, ce qui est indispensable pour la suite.

Étape 3 – Utiliser les maths : l'algorithme de Zeller Pourquoi ?
Puisqu’on n’a pas de fonction pour trouver le jour de la semaine directement dans Skript,
on fait comme les anciens : on le calcule mathématiquement à partir de la date..
Ce qui donne cette formule pour notre calendrier géorgien:

image.png.ca797b2ca72db15d2f99b6af37e013e7.png
L'idée de Zeller : On prend le jour (q), le mois (m), et "l’année" (K), et on fait des opérations mathématiques.
Ici en fonction de la valeur de h, nous pouvons en déduire du jours de la semaine car cette formule donne le jour de la semaine
sous forme d’un nombre de 0 à 6 
:

Pour chaque valeur de h, interpréter de la manière suivante :
0 : "Saturday"  # Samedi
1 : "Sunday"    # Dimanche
2 : "Monday"    # Lundi
3 : "Tuesday"   # Mardi
4 : "Wednesday" # Mercredi
5 : "Thursday"  # Jeudi
6 : "Friday"    # Vendredi

Je ne vais pas détailler plus loin, si tu veux savoir plus au niveau de la transcription de cette formule mathématique
en langage de programmation, voici une ressource qui te sera utile: 
Zeller's Congruence | Find the Day for a Date - GeeksforGeeks

Étape 4 – On écrit getDayOfTheWeek(d: date)
Cette fonction prend la date, applique l’algorithme de Zeller, et retourne une chaîne de caractères : "Monday", "Tuesday", ..., "Sunday"
Maintenant, on peut poser une vraie question lisible :

if getDayOfTheWeek(now) is "Sunday":

Nous avons donc codé cette formule dans la fonction getDayOfTheWeek() qui prend en paramètre une date et qui retourne en fonction de la valeur de h, le jour de la semaine en anglais.

Étape 5 – Créer une fonction isWeekend(date)
Comme on veut rendre la chose plus simple à lire et à réutiliser, on crée une fonction dédiée:

 

function isWeekend(d: date) :: boolean:
set {_day} to getDayOfTheWeek({_d})
if {_day} is "Saturday": 
	return true
else if {_day} is "Sunday":
	return true
else:
	return false

On pourra ensuite écrire: 

if isWeekend(now) is true:

Et ça veut bien dire : si on est samedi ou dimanche 🙂

Étape 6 – Implémenter ces fonctions dans ton code
Tu voulais faire une boucle qui ajoute les permissions régulièrement en fonction du jour de la semaine pour tous les joueurs mais plutôt que de vérifier toutes les 5 minutes pour tous les joueurs connectés, on va vérifier au moment où chaque joueur rejoint le serveur 😄
Pourquoi c’est mieux ?

  • Moins de charge serveur : pas de boucle inutile.
  • Pas besoin de timer ou de tâche répétitive.
  • La permission est attribuée dès que le joueur arrive, ce qui suffit dans la plupart des cas.
on join:
    if isWeekend(now) is true:
        # Donner la permission si le joueur ne l'a pas
        if player does not have permission "shopguiplus.shops.weekend":
            execute console command "lp user %player% permission set shopguiplus.shops.weekend true"
    else:
        # Retirer la permission si le joueur l'a
        if player has permission "shopguiplus.shops.weekend":
            execute console command "lp user %player% permission unset shopguiplus.shops.weekend"


Voilà, j’espère que tout ça t’aura été utile et que tu auras appris quelque chose au passage 🙂
notamment sur comment contourner les limites de Skript en utilisant un peu de logique mathématique (merci Zeller 😄).
En tout cas, ton idée de départ était bonne, il ne manquait qu’une manière un peu plus technique de l’implémenter.
Je te laisse tester tout ça, normalement le code disponible juste en dessous est plug-and-play,
et si jamais tu veux aller plus loin (déclenchement à minuit, commande manuelle, etc...), je serai ravi de t’aider à peaufiner.

Bonne chance pour ton projet et bon week-end… si c’en est un 😉


Code/Solution ICI:
Révéler le code:

Révélation
# This command shows the date with the day of the week
# Output example: Saturday 12/07/2025 00:11
command /now:
    trigger:
        set {_date} to now formatted as "dd/M/yy HH:MM z"
        send "%getDayOfTheWeek({_date})% %{_date}%" to sender

# This function returns the day of the week for a given date
# Uses the Zeller's Congruence algorithm to calculate the day of the week
# Ref: https://fr.wikipedia.org/wiki/D%C3%A9termination_du_jour_de_la_semaine
function getDayOfTheWeek(d: date) :: string:
    set {_date::*} to formatDate({_d})
    set {_day} to {_date::1}
    set {_month} to {_date::2}
    set {_year} to {_date::3}
    if {_month} is "January":
        set {_month} to 13
        set {_year} to {_year} - 1
    else if {_month} is "February":
        set {_month} to 14
        set {_year} to {_year} - 1
    else:
        set {_month} to {_month} + 1
    set {_k} to modulo({_year}, 100)
    set {_j} to {_year} / 100
    set {_f} to {_day} + (13 * ({_month} + 1)) / 5 + {_k} + {_k} / 4 + {_j} / 4 - (2 * {_j})
    set {_f} to modulo({_f}, 7)
    if {_f} is 0:
        return "Saturday"
    else if {_f} is 1:
        return "Sunday"
    else if {_f} is 2:
        return "Monday"
    else if {_f} is 3:
        return "Tuesday"
    else if {_f} is 4:
        return "Wednesday"
    else if {_f} is 5:
        return "Thursday"
    else:
        return "Friday"

# Check if the date is a weekend (Saturday or Sunday)
function isWeekend(d: date) :: boolean:
    set {_day} to getDayOfTheWeek({_d})
    if {_day} is "Saturday":
        return true
    else if {_day} is "Sunday":
        return true
    else:
        return false

# Returns a formatted date as a list of strings
# Format: [day, month, year, hour, minute]
# {_value::1} = day, {_value::2} = month, {_value::3} = year, {_value::4} = hour, {_value::5} = minute
# Ref: https://skript-mc.fr/forum/topic/14832-r%C3%A9cup%C3%A9r%C3%A9-des-informations-sur-une-date-novice/
function formatDate(d: date) :: objects: 
    set {_date::*} to "%{_d}%" split by "/"
    set {_day} to {_date::1}
    set {_month} to {_date::2}
    set {_t::*} to "%{_date::3}%" split by " "
    set {_year} to {_t::1}
    set {_time::*} to {_t::2} split by ":"
    set {_hour} to {_time::1}
    set {_minute} to {_time::2}
    add {_day} to {_value::*}
    add {_month} to {_value::*}
    add {_year} to {_value::*}
    add {_hour} to {_value::*}
    add {_minute} to {_value::*}
    return {_value::*}

# Skript modulo function
# https://skript-mc.fr/forum/topic/16351-skript-modulo/#findComment-131599
function modulo(n1: number, n2: number) :: number:
	set {_divise} to round down ({_n1} / {_n2})
	set {_multiple} to {_n2} * {_divise}
	set {_modulo} to ({_n1} - {_multiple})
	return {_modulo}

# Ressources mention spéciale:
# date() function : https://skripthub.net/docs/?id=2116
# utilisation des fonction : https://skripthub.net/tutorials/9

# PS: Je rajoute ici ton skript c'est plug and play, il n'y a pas de problème pour l'utiliser.
on join:      
    # Attention voici le format que prend la fonction date() selon la doc "date(YYYY, MM, DD, HH, mm)" 
    # Ref: https://skripthub.net/docs/?id=2116
    if isWeekend(now) is true: 
        if player does not have permission "shopguiplus.shops.weekend":
            execute console command "lp user %player% permission set shopguiplus.shops.weekend true"
        else if player has permission "shopguiplus.shops.weekend":
            execute console command "lp user %player% permission unset shopguiplus.shops.weekend"

 

 

 

  • J'aime 1
  • 0
Posté(e)

Salut pas besoin de te casser la tête pour rien comme la réponse précédente.

Tu as juste besoin de faire:

.....
	set {_now} to "%now formatted as "EEEE"%"
	if {_now} is "samedi" or "dimache":
		.....

Et il y a une erreur dans ton skript au fait que tu n'as pas besoin de répèté le {now} is... dans ton or, tu mets juste les 2 choix possibles comme j'ai fais et ça marche 🙂

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.