lgrez.blocs
(Blocs transversaux)¶
lg-rez / Blocs transversaux
Chaque module de lgrez.blocs
réalise une tâche non liée à une
fonctionnalité spécifique du bot : connection à un service, outils
divers…
.env
¶
lg-rez / blocs / Lecture des variables d’environnement
- lgrez.blocs.env.load(VAR_NAME)[source]¶
Lit une valeur depuis les variables d’environnement.
Les variables sont recherchées dans les variables d’environnement ; à l’import de ce module, celles-ci sont chargées par
dotenv.load_dotenv
à partir du fichier passé en premier argument en ligne de commande (.env
par défaut).Équivaut globalement à
os.getenv()
suivi d’une vérification que la variable existe.- Paramètres
VAR_NAME (str) – nom de la variable à charger (
LGREZ_...
)- Renvoie
- Lève
RuntimeError – la variable d’environnement n’est pas définie
- lgrez.blocs.env.__getattr__(attr)[source]¶
Raccourci pour accéder aux variables d’environnement.
Permet d’utiliser
blocs.env.VAR_NAME
comme raccourci pourblocs.env.load(VAR_NAME)
, à la différence près que c’est une exceptionAttributeError
qui sera levée si la variable n’est pas définie.
.gsheets
¶
lg-rez / blocs / Interfaçage Google Sheets
Connection, récupération de classeurs, modifications (implémentation de https://pypi.org/project/gspread)
- exception lgrez.blocs.gsheets.WorksheetNotFound[source]¶
Alias de
gspread.exceptions.WorksheetNotFound
: erreur levée en cas de tentative d’appel d’une feuille non existante.
- class lgrez.blocs.gsheets.Modif(row, column, val)[source]¶
Modification à appliquer à un Google Sheet.
- val¶
Nouvelle valeur
- Type
Any
- lgrez.blocs.gsheets.connect(key)[source]¶
Charge les credentials GSheets et renvoie le classeur demandé.
Nécessite la variable d’environment
LGREZ_GCP_CREDENTIALS
.- Paramètres
key (str) – ID du classeur à charger (25 caractères)
- Renvoie
gspread.models.Spreadsheet
- lgrez.blocs.gsheets.update(sheet, *modifs)[source]¶
Met à jour une feuille GSheets avec les modifications demandées.
- Paramètres
Le type de la nouvelle valeur sera interpreté par
gspread
pour donner le type GSheets adéquat à la cellule (texte, numérique, temporel…)Les entiers trop grands pour être stockés sans perte de précision (IDs des joueurs par exemple) sont convertis en
str
. LesNone
sont convertis en''
. Les membres d”Enum
sont stockés par leur nom.
- lgrez.blocs.gsheets.a_to_index(column)[source]¶
Utilitaire : convertit une colonne (« A », « B »…) en indice.
- lgrez.blocs.gsheets.get_doc_content(doc_id)[source]¶
Récupère le contenu d’un document Google Docs.
Transforme le document pour ne garder que les fragments de texte et leur mise en forme. Les paragraphes de listes à points sont transformés en ajoutant un fragment `` - `` à l’endroit adéquat ; les autres options de mise en forme des paragraphes et les autres objets GDocs sont ignorés.
- Paramètres
doc_id (str) – ID du document à récupérer (doit être public ou dans le Drive partagé avec le compte de service).
- Renvoie
Les différents fragments de texte du document et leur formattage (référence : https://developers. google.com/docs/api/reference/rest/v1/documents#TextStyle)
- Type renvoyé
- Lève
googleapiclient.errors.HttpError – ID incorrect ou document non accessible.
.one_command
¶
lg-rez / blocs / Limitation à une commande
Système maison pour ne pas pouvoir utiliser plus d’une commande à la fois
- lgrez.blocs.one_command.exempted = [<discord.ext.commands.core.Command object>, <discord.ext.commands.core.Command object>]¶
Commands exempted from one_command limitation, registered by
do_not_limit()
- Type
list[Command]
- exception lgrez.blocs.one_command.AlreadyInCommand(message=None, *args)[source]¶
Salon déjà occupé par une commande non finissable.
Exception levée lorsqu’un membre veut lancer une commande dans un salon où une commande est déjà en cours d’exécution, et que cette commande n’a pas pu être arrêtée (ou pas assez rapidement) par un message
"stop"
.Dérive de
discord.ext.commands.CheckFailure
.
- async lgrez.blocs.one_command.not_in_command(ctx)[source]¶
Check : assure qu’une commande n’est pas en cours dans ce salon.
Fonction à utiliser comme check global, pour toutes les commandes (enregistrer avec
add_check()
)- Paramètres
ctx (discord.ext.commands.Context) – contexte d’invocation de la commande.
- Renvoie
True
- Lève
- async lgrez.blocs.one_command.add_to_in_command(ctx)[source]¶
Ajoute le channel à la liste des channels dans une commande.
Fonction à appeller avant chaque appel de fonction (enregistrer avec
before_invoke()
)Elle est appellée seulement si les checks sont OK, donc pas si le salon est déjà dans
config.bot.in_command
.- Paramètres
ctx (discord.ext.commands.Context) – contexte d’invocation de la commande.
- async lgrez.blocs.one_command.remove_from_in_command(ctx)[source]¶
Retire le channel de la liste des channels dans une commande.
Fonction à appeller après chaque appel de fonction. (enregistrer avec
after_invoke()
)Elle attend 0.1 secondes avant d’enlever le joueur afin d’éviter que le bot réagisse « nativement » (IA) à un message déjà traité par un
tools.wait_for_message()
ayant mené à la fin de la commande.- Paramètres
ctx (discord.ext.commands.Context) – contexte d’invocation de la commande.
- lgrez.blocs.one_command.bypass(ctx)[source]¶
Context manager: bypass one-command limitation.
- Paramètres
ctx (discord.ext.commands.Context) – running command context.
Use in a command callback to launch a second one without problems:
with one_command.bypass(ctx): await config.bot.process_commands(some_message)
- lgrez.blocs.one_command.do_not_limit(command)[source]¶
Decorator for commands not concerned by one_command limitation.
Register the command in
one_command.exempted
.- Paramètres
command (discord.ext.commands.Command) – the command to register.
- Renvoie
.ready_check
¶
lg-rez / blocs / Ready-check
Classes to raise an exception when accessing attributes not respecting a given rule
- exception lgrez.blocs.ready_check.NotReadyError[source]¶
An attribute is tried to be accessed before it is ready.
Inherits from
RuntimeError
.
- class lgrez.blocs.ready_check.ReadyCheck[source]¶
Proxy class to prevent accessing not initialised objects.
- When accessing a class attribute, this class:
returns its value (classic behavior) if it is evaluated ready (see below);
raises a
NotReadyError
exception otherwise.
Subclass this class to implment readiness check on class attributes and define « readiness » as needed. By default, attributes are considered not ready only if their value is
None
:class NotNone(ReadyCheck): a = None # NotNone.a will raise a NotReadyError b = <any object> # NotNone.b will be the given object
Use
check_type
class-definition argument to define readiness based on attributes types (usingisinstance()
):class MustBeList(ReadyCheck, check_type=list): a = "TDB" # MustBeList.a will raise a NotReadyError b = [1, 2, 3] # MustBeList.b will be the given list
Use
check
class-definition argument to define custom readiness check (value -> bool
function):class MustBePositive(ReadyCheck, check=lambda val: val > 0): a = 0 # MustBePositive.a will raise a NotReadyError b = 37 # MustBePositive.b will be 37
If both arguments are provided, attribute type will be checked first and custom check will be called only for suitable attributes.
Attributes can be added, modified and deleted the normal way. Readiness is evaluated at access time, so changing an attribute’s value will change its readiness with no aditionnal work required.
Note
Attributes whose name start with
'_'
(private and magic attributes) are not affected and will be returned even if not ready.These classes can also implement iterating protocol to provide access to protected attributes names (order not reliable):
for name in NotNone: print(name) # Will print 'a' then 'b'
Avertissement
Class derivating from this class are not meant to be instantiated. Due to the checking proxy on class attributes, instances will not see attributes defined at class level, and attributes defined in
__init__
or after construction will not be ready-checked.This class defines no attributes or methods, but relies on a custom metaclass: you will not be able to create mixin classes from this one and a custom-metaclass one.
- classmethod get_raw(name)¶
Access to an attribute bypassing ready check
- Paramètres
name (str) – name of the attribute. This must be a public attribute (no leading underscore).
- Renvoie
The attribute value, whatever it is.
- Lève
AttributeError – if the attribute doesnt exist
.realshell
¶
lg-rez / blocs / Émulation de terminal Python (avancé)
Permet d’utiliser un terminal Python directement dans Discord (implémentation de https://pypi.org/project/asyncode).
- exception lgrez.blocs.realshell.RealShellExit[source]¶
Terminal exited (
SystemExit
catched or stop button).Derivates from
RuntimeError
.
- class lgrez.blocs.realshell.RSCommand(value)[source]¶
Enum
: Shell controll commands.These commands allow to control the shell in ways impossible with plain Discord messages: change indentation (leading spaces in messages are stripped), send empty lines, send EOF (^D).
Enum values are unicode emojis codepoints used for emoji control of the shell. Override this class (you may not define all values to disable some features) to change them.
Emojis are displayed in the same order members are defined:
- HOME¶
Reset indentation to 0.
- UNTAB¶
Decreases indentation by one level.
- TAB¶
Increases indentation by one level.
- ENTER¶
Send empty line.
- EOF¶
Send EOF signal (^D in *nix, ^Z + Enter in Windows.)
- class lgrez.blocs.realshell.RealShell(channel, locals={}, filename='!shell')[source]¶
Python shell inside LGBot.
(subclass of
asyncode.AsyncInteractiveConsole
)- Paramètres
channel (discord.TextChannel) – Chan in which run the shell (show and wait for commands). While the shell is running, every message in this channel will be interpreted and deleted by this shell.
locals – passed to
asyncode.AsyncInteractiveConsole
.filename – passed to
asyncode.AsyncInteractiveConsole
.
- async control(command, times=1)[source]¶
Applies the effect of a shell control.
- Paramètres
command (RSCommand) – shell command to compute.
times (int) – repeat the command several times. Makes sense for
RSCommand.TAB
andRSCommand.UNTAB
only.
- Renvoie
None
– if further instructions are needed.str
– if instruction is complete (push this into the shell!)
- Lève
RealShellExit – if asked to stop shell (EOF).
- async get_order()[source]¶
Waits for an order (message or reaction) from a member.
Add reactions if not present (new message) and waits for an interaction.
- Renvoie
None
– if further instructions are needed.str
– if instruction is complete (push this into the shell!)
- Lève
RealShellExit – if asked to stop shell (EOF).
- async write(data, *, refresh=False, show_caret=True)[source]¶
Method called on each print / repr / traceback…
Updates Discord message only if text ends with a prompt (
sys.ps1
orsys.ps2
); adds it to an internal buffer otherwise.
- async raw_input(prompt='')[source]¶
Method called when the shell waits for next instruction.
Calls
get_order()
until it returns astr
(or propagatesRealShellExit
) then displays it in the shell (without caret) before returning its value.
.tools
¶
lg-rez / blocs / Outils divers et variés
Récupération d’objets Discord, décorateurs pour commandes, structures d’interaction dans les channels, utilitaires d’emojis, de date/temps, de formatage…
- lgrez.blocs.tools.get(iterable, **attrs)[source]¶
Raccourci pour
discord.utils.get()
- lgrez.blocs.tools.channel(nom, must_be_found=True)[source]¶
Renvoie l’objet associé au salon
#nom
.- Paramètres
nom (str) – nom du channel (texte/vocal/catégorie) ou sa mention (détection directe par regex)
must_be_found (bool) – si
True
(défaut), raise uneValueError
si le channel#nom
n’existe pas (siFalse
, renvoieNone
)
- Renvoie
- lgrez.blocs.tools.role(nom, must_be_found=True)[source]¶
Renvoie l’objet associé au rôle
@&nom
.- Paramètres
nom (str) – nom du rôle ou sa mention (détection directe par regex)
must_be_found (bool) – si
True
(défaut), raise uneValueError
si le channel@&nom
n’existe pas (siFalse
, renvoieNone
)
- Renvoie
- lgrez.blocs.tools.member(nom, must_be_found=True)[source]¶
Renvoie l’objet associé au membre
@nom
.- Paramètres
nom (str) – nom du joueur ou sa mention (détection directe par regex)
must_be_found (bool) – si
True
(défaut), raise uneValueError
si le membre@nom
n’existe pas (siFalse
, renvoieNone
)
- Renvoie
- lgrez.blocs.tools.emoji(nom, must_be_found=True)[source]¶
Renvoie l’objet associé à l’emoji
:nom:
.- Paramètres
nom (str) – nom de l’emoji (texte/vocal/catégorie) ou son utilisation (détection directe par regex)
must_be_found (bool) – si
True
(défaut), raise uneValueError
si l’emoji:nom:
n’existe pas (siFalse
, renvoieNone
)
- Renvoie
- lgrez.blocs.tools.mention_MJ(arg)[source]¶
Renvoie la mention ou le nom du rôle MJ
Si le joueur n’est pas un MJ, renvoie la mention de
config.Role.mj
Sinon, renvoie son nom (pour ne pas rameuter tout le monde).
- exception lgrez.blocs.tools.CommandExit[source]¶
Fin de commande demandée.
Lever cette exception force l’arrêt immédiat d’une commande, et empêche le bot de réagir à nouveau.
Dérive de
RuntimeError
.
- lgrez.blocs.tools.mjs_only(func)¶
Décorateur pour commande (
discord.ext.commands.check()
) : commande exécutable uniquement par unMJ
ou un webhook (tâche planifiée)
- lgrez.blocs.tools.mjs_et_redacteurs(func)¶
Décorateur pour commandes d’IA (
discord.ext.commands.check()
) : commande exécutable par unMJ
, unRédacteur
ou un webhook (tâche planifiée)
- lgrez.blocs.tools.joueurs_only(func)¶
Décorateur pour commande (
discord.ext.commands.check()
) : commande exécutable uniquement par un joueur,vivant
oumort
.
- lgrez.blocs.tools.vivants_only(func)¶
Décorateur pour commande (
discord.ext.commands.check()
) : commande exécutable uniquement par unjoueur vivant
- lgrez.blocs.tools.private(callback)[source]¶
Décorateur : commande utilisable dans son chan privé uniquement.
Lors d’une invocation de la commande décorée hors d’un channel privé (commençant par
config.private_chan_prefix
), supprime le message d’invocation et exécute la commande dans le channel privé de l’invoqueur.Ce décorateur n’est utilisable que sur une commande définie dans un Cog. Si le joueur ayant utilisé la commande n’a pas de chan privé (pas en base), raise une
ValueError
.Utilisable en combinaison avec
joueurs_only()
etvivants_only()
(pas avec les autres attention, vu que seuls les joueurs ont un channel privé).
- async lgrez.blocs.tools.wait_for_message(check, trigger_on_commands=False, chan=None)[source]¶
Attend le premier message reçu rencontrant les critères demandés.
Surcouche de
discord.ext.commands.Bot.wait_for()
permettant d’ignorer les commandes et de réagir au mot-cléstop
.- Paramètres
check (Callable[
discord.Message
->bool
]) – fonction validant ou non chaque message.trigger_on_commands (bool) – si
False
(défaut), un message respectantcheck
sera ignoré si c’est une commande.chan (discord.TextChannel) – le channel dans lequel le message est attendu (si applicable). Si
None
, les messages d’arrêt (config.stop_keywords
) peuvent ne pas être détectés (la fonction émettera un warning en ce sens).
- Renvoie
- Lève
CommandExit – si le message est un des
config.stop_keywords
(insensible à la casse), même si il respectecheck
- async lgrez.blocs.tools.wait_for_message_here(ctx, trigger_on_commands=False)[source]¶
Attend et renvoie le premier message reçu dans <ctx>.
Surcouche de
wait_for_message()
filtrant uniquement les messages envoyés dansctx.channel
par quelqu’un d’autre que le bot.- Paramètres
ctx (discord.ext.commands.Context) – contexte d’une commande.
trigger_on_commands – passé directement à
wait_for_message()
.
- Renvoie
- async lgrez.blocs.tools.boucle_message(chan, in_message, condition_sortie, rep_message=None)[source]¶
Boucle question/réponse jusqu’à qu’une condition soit vérifiée.
- Paramètres
chan (discord.TextChannel) – salon dans lequel lancer la boucle.
condition_sortie (Callable[
discord.Message
->bool
]) – fonction validant ou non chaque message.in_message (str) – si défini, message à envoyer avant la boucle.
rep_message (str) – si défini, permet de définir un message de boucle différent de
in_message
(identique siNone
). Doit être défini siin_message
n’est pas défini.
- Renvoie
- async lgrez.blocs.tools.boucle_query(ctx, table, col=None, cible=None, filtre=None, sensi=0.5, direct_detector=None, message=None)[source]¶
Fait trouver à l’utilisateur une entrée de BDD d’après son nom.
- Paramètres
ctx (discord.ext.commands.Context) – contexte d’une commande.
table (bdd.base.TableMeta) – table dans laquelle rechercher.
col (Column) – colonne dans laquelle rechercher (passé à
find_nearest()
).cible (str) – premier essai de cible (donnée par le joueur dans l’appel à une commande, par exemple).
filtre – passé à
find_nearest()
.sensi (float) – sensibilité de la recherche (voir
find_nearest()
).direct_detector (Callable[str] ->
table
|None
) – pré-détecteur éventuel, appellé sur l’entrée utilisateur avantfind_nearest()
; si cette fonction renvoie un résultat, il est immédiatement renvoyé.message (str) – si défini (et
cible
non défini), message à envoyer avant la boucle.
- Renvoie
Instance de
table
sélectionnée
Attend que le joueur entre un nom, et boucle 5 fois au max (avant de l’insulter et de raise une erreur) pour chercher l’entrée la plus proche.
- async lgrez.blocs.tools.boucle_query_joueur(ctx, cible=None, message=None, sensi=0.5, filtre=None)[source]¶
Retourne un joueur (entrée de BDD) d’après son nom.
- Paramètres
ctx (discord.ext.commands.Context) – contexte d’une commande.
cible (str) – premier essai de cible (donnée par le joueur dans l’appel à une commande, par exemple).
message (str) – si défini (et
cible
non défini), message à envoyer avant la boucle.sensi (float) – sensibilité de la recherche (voir
find_nearest()
).filtre – passé à
find_nearest()
.
- Renvoie
Attend que le joueur entre un nom de joueur, et boucle 5 fois au max (avant de l’insulter et de raise une erreur) pour chercher le plus proche joueur dans la table
bdd.Joueur
.
- async lgrez.blocs.tools.wait_for_react_clic(message, emojis={}, *, process_text=False, text_filter=None, first_text=None, post_converter=None, trigger_all_reacts=False, trigger_on_commands=False)[source]¶
Ajoute des reacts à un message et attend une interaction.
- Paramètres
message (discord.Message) – message où ajouter les réactions.
emojis (
list
|dict
) – reacts à ajouter, éventuellement associés à une valeur qui sera retournée si clic sur l’emoji.process_text (bool) – si
True
, détecte aussi la réponse par message et retourne le texte du message (défaut :False
).text_filter (Callable[
str
->bool
]) – siprocess_text
, ne réagit qu’aux messages pour lesquelstext_filter(message)
renvoieTrue
(défaut : tous).first_text (str) – si
process_text
, texte considéré comme la première réponse textuelle reçue (si il vérifietext_filter
, les emojis ne sont pas ajoutés et cette fonction retourne directement).post_converter (Callable[
str
-> Any]) – siprocess_text
et que l’argument est défini, le message détecté est passé dans cette fonction avant d’être renvoyé.trigger_all_reacts (bool) – si
True
, détecte l’ajout de toutes les réactions (pas seulement celles dansemojis
) et renvoie l’emoji directement si il n’est pas dansemojis
(défaut :False
).trigger_on_commands (bool) – passé à
wait_for_message()
.
- Renvoie
str
– représentantle nom de l’emoji si
emojis
est une liste et clic sur une des reacts, ou sitrigger_all_reacts
vautTrue
et ajout d’une autre react ;le message reçu si
process_text
vautTrue
, quepost_converter
n’est pas défini et réaction à un message ;
- Any – représentant
la valeur associée si
emojis
est un dictionnaire et clic sur une des reacts ;la valeur retournée par
post_converter
si il est défini, queprocess_text
vautTrue
et réaction à un message.
- async lgrez.blocs.tools.yes_no(message, first_text=None)[source]¶
Demande une confirmation / question fermée à l’utilisateur.
Surcouche de
wait_for_react_clic()
: ajoute les reacts ✅ et ❎ à un message et renvoieTrue
ouFalse
en fonction de l’emoji cliqué OU de la réponse textuelle détectée.- Paramètres
message (discord.Message) – message où ajouter les réactions.
first_text (str) – passé à
wait_for_react_clic()
.
- Réponses textuelles reconnues :
Pour
True
:["oui", "o", "yes", "y", "1", "true"]
Pour
False
:["non", "n", "no", "n", "0", "false"]
ainsi que toutes leurs variations de casse.
- Renvoie
- async lgrez.blocs.tools.yes_no_maybe_i_dont_know_can_you_repeat_the_question(message, first_text=None)¶
Demande une confirmation / question fermée à l’utilisateur.
Surcouche de
wait_for_react_clic()
: ajoute les reacts ✅ et ❎ à un message et renvoieTrue
ouFalse
en fonction de l’emoji cliqué OU de la réponse textuelle détectée.- Paramètres
message (discord.Message) – message où ajouter les réactions.
first_text (str) – passé à
wait_for_react_clic()
.
- Réponses textuelles reconnues :
Pour
True
:["oui", "o", "yes", "y", "1", "true"]
Pour
False
:["non", "n", "no", "n", "0", "false"]
ainsi que toutes leurs variations de casse.
- Renvoie
- async lgrez.blocs.tools.choice(message, N, start=1, *, additionnal={})[source]¶
Demande à l’utilisateur de choisir entre plusieurs options numérotées.
Surcouche de
wait_for_react_clic()
: ajoute des reacts chiffres (1️⃣, 2️⃣, 3️⃣…) et renvoie le numéro cliqué OU détecté par réponse textuelle.- Paramètres
message (discord.Message) – message où ajouter les réactions.
N (int) – chiffre jusqu’auquel aller, inclus (
<= 10
).start (int) – chiffre auquel commencer (entre
0
etN
, défaut1
).additionnal (dict[
discord.Emoji
|str
, Any]) – emojis optionnels à ajouter après les chiffres et valeur renvoyée si cliqué.
Réponses textuelles reconnues : chiffres entre
start
etN
.- Renvoie
int
(ou la valeur associée si emoji choisi dansadditionnal
)
- async lgrez.blocs.tools.sleep(chan, tps)[source]¶
Attend un temps donné en avertissant l’utilisateur.
Pause l’exécution d’une commande en affichant l’indicateur typing ( »LGBot est en train d’écrire… ») sur un salon.
Permat d’afficher plusieurs messages d’affillée en laissant le temps de lire, tout en indiquant que le bot n’a pas fini d’écrire.
- Paramètres
chan (discord.abc.Messageable) – salon / contexte /… sur lequel attendre.
tps (float) – temps à attendre, en secondes.
- lgrez.blocs.tools.montre(heure=None)[source]¶
Renvoie l’emoji horloge le plus proche d’une heure donnée.
- lgrez.blocs.tools.emoji_chiffre(chiffre, multi=False)[source]¶
Renvoie l’emoji / les emojis chiffre correspondant à un chiffre/nombre.
- lgrez.blocs.tools.super_chiffre(chiffre, multi=False)[source]¶
Renvoie le(s) caractère(s) exposant correspondant à un chiffre/nombre.
- lgrez.blocs.tools.sub_chiffre(chiffre, multi=False)[source]¶
Renvoie le(s) caractère(s) indice correspondant à un chiffre/nombre.
- lgrez.blocs.tools.heure_to_time(heure)[source]¶
Convertit l’écriture d’une heure en objet
datetime.time
.- Paramètres
heure (str) – heure au format
HHh
,HHhMM
ouHH:MM
.- Renvoie
- Lève
ValueError – conversion impossible (mauvais format)
- lgrez.blocs.tools.time_to_heure(tps, sep='h', force_minutes=False)[source]¶
Convertit un objet
datetime.time
en heure.(version maison de
datetime.time.strftime()
)- Paramètres
tps (datetime.time) – temps à convertir.
sep (str) – séparateur heures / minutes à utiliser (défaut
"h"
).force_minutes (bool) – si
False
(défaut), les minutes ne sont indiquées que si différentes de0
.
- Renvoie
str
(""
sitps
estNone
)
- lgrez.blocs.tools.next_occurence(tps)[source]¶
Renvoie la prochaine occurence temporelle d’une heure donnée.
Renvoie le prochain timestamp arrivant DANS LES HORAIRES DU JEU : entre
tools.fin_pause()
ettools.debut_pause()
.- Paramètres
tps (datetime.time) – heure dont on veut connaître la prochaine occurence.
- Renvoie
- lgrez.blocs.tools.debut_pause()[source]¶
Renvoie le timestamp correspondant au prochain vendredi 19h.
- Renvoie
- lgrez.blocs.tools.fin_pause()[source]¶
Renvoie le timestamp correspondant au prochain dimanche 19h.
- Renvoie
- lgrez.blocs.tools.en_pause()[source]¶
Détermine si le jeu est actuellement en pause hebdomadaire.
Si il n’y a pas de pause (
fin_pause()
=debut_pause()
), renvoie toujoursFalse
.- Renvoie
- lgrez.blocs.tools.smooth_split(mess, N=1990, sep='\n', rep='')[source]¶
Sépare un message en une blocs moins longs qu’une limite donnée.
Très utile pour envoyer des messages de (potentiellement) plus de 2000 caractères (limitation Discord).
- Paramètres
mess (str) – message à découper.
N (int) – taille maximale des messages formés (défaut
1990
, pour avoir un peu de marge par rapport à la limitation, et permettre d’entourer de```
par exemple)sep (str) – caractères où séparer préférentiellement le texte (défaut : sauts de ligne). Si
mess
contient une sous-chaîne plus longue queN
ne contenant passep
, le message sera tronqué à la limite.rep (str) – chaîne ajoutée à la fin de chaque message formé (tronqué du séparateur final) (défaut : aucune).
- Renvoie
- async lgrez.blocs.tools.send_blocs(messageable, mess, *, N=1990, sep='\n', rep='')[source]¶
Envoie un message en le coupant en blocs si nécaissaire.
Surcouche de
smooth_split()
envoyant directement les messages formés.- Paramètres
messageable (discord.abc.Messageable) – objet où envoyer le message (
Context
ouTextChannel
).mess (str) – message à envoyer
N – passé à
smooth_split()
.sep – passé à
smooth_split()
.rep – passé à
smooth_split()
.
- Renvoie
La liste des messages envoyés.
- Type renvoyé
- async lgrez.blocs.tools.send_code_blocs(messageable, mess, *, N=1990, sep='\n', rep='', prefixe='', langage='')[source]¶
Envoie un (potentiellement long) message sous forme de bloc(s) de code.
Équivalent de
send_blocs()
avec formatage de chaque bloc dans un bloc de code.- Paramètres
messageable – voir
send_blocs()
.mess – voir
send_blocs()
.N – voir
send_blocs()
.sep – voir
send_blocs()
.rep – voir
send_blocs()
.prefixe (str) – texte optionnel à mettre hors des code blocs, au début du premier message.
language (str) – voir
code_bloc()
.
- Renvoie
La liste des messages envoyés.
- Type renvoyé
- async lgrez.blocs.tools.log(message, *, code=False, N=1990, sep='\n', rep='', prefixe='', langage='')[source]¶
Envoie un message dans le channel
config.Channel.logs
.Surcouche de
send_blocs()
/send_code_blocs()
.- Paramètres
message (str) – message à log.
code (bool) – si
True
, log sous forme de bloc(s) de code (défautFalse
).N – passé à
send_blocs()
/send_code_blocs()
.sep – passé à
send_blocs()
/send_code_blocs()
.rep – passé à
send_blocs()
/send_code_blocs()
.prefixe – voir
send_code_blocs()
, simplement ajouté avantmessage
sicode
vautFalse
.language – identique à
send_code_blocs()
, ignoré si code vautFalse
.
- Renvoie
La liste des messages envoyés.
- Type renvoyé
- async lgrez.blocs.tools.create_context(member, content)[source]¶
Génère le contexte associé au message d’un membre dans son chan privé.
- Paramètres
member (discord.Member) – membre dont on veut simuler l’action. Doit être inscrit en base (pour avoir un chan privé).
content (str) – message à « faire envoyer » au joueur, généralement une commande.
Utile notemment pour simuler des commandes à partir de clics sur des réactions.
- Renvoie
- lgrez.blocs.tools.remove_accents(text)[source]¶
Enlève les accents d’un chaîne, mais conserve les caractères spéciaux.
Version plus douce de
unidecode.unidecode
, conservant notemment les emojis, …
- lgrez.blocs.tools.eval_accols(rep, globals_=None, locals_=None, debug=False)[source]¶
Replace chaque bloc entouré par des
{}
par leur évaluation Python.- Paramètres
globals (dict) – variables globales du contexte d’évaluation (passé à
eval()
).locals (dict) – variables locales du contexte d’évaluation (passé à
eval()
).debug (bool) – si
True
, insère le message d’erreur (type et texte de l’exception) dans le message à l’endroit où une exception est levée durant l’évaluation (défautFalse
).
Penser à passer les
globals()
etlocals()
si besoin. Généralement, il faut passerlocals()
qui contientctx
, etc… mais pasglobals()
si on veut bénéficier de tous les modules importés danstools.py
.
- lgrez.blocs.tools.code_bloc(text, langage='')[source]¶
Formate une chaîne comme un bloc de code dans Discord.
- Paramètres
Langages supportés (non exhaustif ?) :
asciidoc
,autohotkey
,bash
,coffeescript
,cpp
(C++),cs
(C#),css
,diff
,fix
,glsl
,ini
,json
,md
, (markdown),ml
,prolog
,py
,tex
,xl
,xml
- Renvoie