lgrez.bdd
(Gestion des données)¶
lg-rez / Gestion des données
Déclaration de toutes les tables, colonnes, méthodes, et connection à la BDD
- lgrez.bdd.tables¶
Dictionnaire
{nom de la base -> table}
, automatiquement rempli parsqlalchemy.ext.declarative.declarative_base()
(via le paramètreclass_registry
).- Type
dict
[str
,base.TableBase
subclass]
- exception lgrez.bdd.SQLAlchemyError[source]¶
Alias de
sqlalchemy.exc.SQLAlchemyError
: exception de BDD générale.
- exception lgrez.bdd.DriverOperationalError¶
Alias de
psycopg2.OperationalError
: erreur levée en cas de perte de connexion avec la BDD. Seul PostreSQL est géré nativement : le cas échéant, remplacer cette exception par l’équivalent pour un autre driver.
- lgrez.bdd.connect()[source]¶
Se connecte à la base de données et prépare les objets connectés.
Utilise la variable d’environment
LGREZ_DATABASE_URI
Crée les tables si nécessaire
Prépare
config.engine
etconfig.session
.base
¶
lg-rez / bdd / Briques de connection
Métaclasse et classe de base des tables de données, fonction de connection
- class lgrez.bdd.base.TableMeta(name, bases, dic, comment=None, **kwargs)[source]¶
Métaclasse des tables de données de LG-Rez.
Sous-classe de
sqlalchemy.orm.decl_api.DeclarativeMeta
.- Cette métaclasse :
nomme automatiquement la table
cls.__name__.lower() + "s"
,ajoute une note commune aux docstrings de chaque classe,
définit des méthodes et propriétés de classe simplifiant l’utilisation des tables.
- property attrs¶
Attributs de données publics des instances (dictionnaire nom -> colonne / relationship).
- Type
Mapping[
str
,sqlalchemy.schema.Column
|sqlalchemy.orm.RelationshipProperty
]
- property columns¶
Raccourci pour
Table.__table__.columns
(pseudo-dictionnaire nom -> colonne).Comportement global de dictionnaire :
Table.columns["nom"]
-> colonne associée ;Table.columns.keys()
-> noms des colonnes ;Table.columns.values()
-> objets Column ;Table.columns.items()
-> tuples (nom, colonne) ;
MAIS itération sur les colonnes (valeurs du dictionnaire) :
list(Table.columns)
-> objets Column ;for col in Table.columns
-> objets Column.
- Type
sqlalchemy.sql.base.ImmutableColumnCollection
- find_nearest(chaine, col=None, sensi=0.25, filtre=None, solo_si_parfait=True, parfaits_only=True, match_first_word=False)[source]¶
Recherche les plus proches résultats d’une chaîne donnée.
- Paramètres
chaine (str) – motif à rechercher
col (
sqlalchemy.schema.Column
|str
) – colonne selon laquelle rechercher (défaut : colonne primaire). Doit être de type textuel.sensi (float) – score* minimal pour retenir une entrée
filtre (BinaryExpression) – argument de
query.filter()
(ex.Table.colonne == valeur
)solo_si_parfait (bool) – si
True
(défaut), renvoie uniquement le premier élément de score*1
trouvé s’il existe (ignore les autres éléments, même si>= sensi
ou même1
)parfaits_only (bool) – si
True
(défaut), ne renvoie que les éléments de score*1
si on en trouve au moins un (ignore les autres éléments, même si>= sensi
; pas d’effet sisolo_si_parfait
vautTrue
)match_first_word (bool) – si
True
, teste aussichaine
vis à vis du premier mot (caractères précédentla première espace) de chaque entrée, et conserve ce score si il est supérieur.
- Renvoie
Les entrées correspondant le mieux à
chaine
, sous forme de liste de tuples(element, score*)
triés par score* décroissant (et ce même si un seul résultat).- Type renvoyé
- Lève
ValueError –
col
inexistante ou pas de type textuelNotReadyError – session non initialisée (
lgrez.config.session
vautNone
)
*score = ratio de
difflib.SequenceMatcher
, i.e. proportion de caractères communs aux deux chaînes.Note
Les chaînes sont comparées sans tenir compte de l’accentuation ni de la casse.
- property primary_col¶
Colonne clé primaire de la table.
- Lève
ValueError – Pas de colonne clé primaire pour cette table, ou plusieurs
- Type
- property query¶
Raccourci pour
.config.session.query(Table)
.- Lève
ready_check.NotReadyError – session non initialisée (
config.session
vautNone
)- Type
- lgrez.bdd.base.autodoc_Column(*args, doc='', comment=None, **kwargs)[source]¶
Returns Python-side and SQL-side well documented Column.
Use exactly as
sqlalchemy.Column
.- Paramètres
*args – passed to
sqlalchemy.schema.Column
.**kwargs – passed to
sqlalchemy.schema.Column
.doc (str) – column description, enhanced with column infos (Python and SQL types, if nullable, primary…) and passed to
Column.doc
.comment (str) – passed to
Column.comment
; defaults todoc
(not enhanced). Set it to''
to disable comment creation.
- Renvoie
- lgrez.bdd.base.autodoc_DynamicOneToMany(tablename, *args, doc='', **kwargs)[source]¶
Returns Python-side well documented dynamic one-to-many relationship.
Represents a relationship where each element in this table is linked to a lot of elements in
tablename
, itself back- refering to one element in this table.The difference with
autodoc_OneToMany()
is that items are NOT accessible directly through class attribute, which returns a query that but must be fetched first:Examples:
Editor.books.all()
,Editor.books.filter_by(...).one()
Use exactly as
sqlalchemy.orm.dynamic_loader()
.- Paramètres
*args – passed to
sqlalchemy.orm.dynamic_loader
.**kwargs – passed to
sqlalchemy.orm.dynamic_loader
.doc (str) – relationship description, enhanced with class name and relationship type.
- Renvoie
- lgrez.bdd.base.autodoc_ManyToMany(tablename, *args, doc='', **kwargs)[source]¶
Returns Python-side well documented many-to-many relationship.
Represents a relationship where each element in this table is linked to several elements in
tablename
, itself back- refering to several elements in this table.Example:
Book.authors
(each book has several authors, an author writes several books)Use exactly as
sqlalchemy.orm.relationship()
.- Paramètres
*args – passed to
sqlalchemy.orm.relationship
.**kwargs – passed to
sqlalchemy.orm.relationship
.doc (str) – relationship description, enhanced with class name and relationship type.
- Renvoie
- lgrez.bdd.base.autodoc_ManyToOne(tablename, *args, doc='', nullable=False, **kwargs)[source]¶
Returns Python-side well documented many-to-one relationship.
Represents a relationship where each element in this table is linked to one element in
tablename
, itself back-refering to several elements in this table.Example:
Book.editor
(each book has an editor, an editor publishes several books)Use exactly as
sqlalchemy.orm.relationship()
, plus the keyword argumentnullable
(see below).- Paramètres
- Renvoie
- lgrez.bdd.base.autodoc_OneToMany(tablename, *args, doc='', **kwargs)[source]¶
Returns Python-side well documented one-to-many relationship.
Represents a relationship where each element in this table is linked to several elements in
tablename
, itself back- refering to one element in this table.Example:
Editor.books
(an editor publishes several books, each book has an editor)Use exactly as
sqlalchemy.orm.relationship()
.- Paramètres
*args – passed to
sqlalchemy.orm.relationship
.**kwargs – passed to
sqlalchemy.orm.relationship
.doc (str) – relationship description, enhanced with class name and relationship type.
- Renvoie
Table de base¶
- class lgrez.bdd.base.TableBase(**kwargs)¶
Classe de base des tables de données.
(construite par
sqlalchemy.orm.registry.generate_base()
)- add(*other)[source]¶
Enregistre l’instance dans la base de donnée et commit.
Semble équivalent à
update()
si l’instance est déjà présente en base.- Paramètres
*other – autres instances à enregistrer dans le même commit, éventuellement. Utilisation recommandée :
<Table>.add(*items)
.
Exemples
item.add()
<Table>.add(*items)
Globlament équivalent à:
config.session.add(self) config.session.add_all(other) config.session.commit()
- static update()[source]¶
Applique les modifications en attente en base (commit).
Toutes les modifications, y compris des autres instances, seront enregistrées.
Globlament équivalent à:
config.session.commit()
- delete(*other)[source]¶
Supprime l’instance de la base de données et commit.
- Paramètres
*other – autres instances à supprimer dans le même commit, éventuellement.
Exemples
item.delete()
<Table>.delete(*items)
- Lève
sqlalchemy.exc.SAWarning – l’instance a déjà été supprimmée (Warning, pas exception : ne bloque pas l’exécution).
Globlament équivalent à:
config.session.delete(self) for item in others: config.session.delete(item) config.session.commit()
Enums¶
lg-rez / bdd / Enums
Déclaration des énumérations utilisées
Énumérations (sous-classes de enum.Enum
) utilisées dans les
différentes tables du modèle de données :
- class lgrez.bdd.Statut(value)[source]¶
Enum
représentant le statut RP d’un Joueur.- vivant¶
Le joueur est en vie !
- mort¶
Le joueur est mort. RIP.
- MV¶
Le joueur est Mort-Vivant. Pas de chance.
- immortel¶
Le joueur est Immortel. Si jamais…
- class lgrez.bdd.ActionTrigger(value)[source]¶
Enum
: Déclencheur de l’ouverture/fermeture d’une Action.- temporel¶
Ouverture/fermeture à heure fixe chaque jour
- delta¶
Fermeture un délai donné après l’ouverture
- perma¶
Action utilisable en permanence
- start¶
Ouverture au lancement du jeu
- auto¶
Action automatique, fermeture dès l’ouverture
- mort¶
Ouverture à la mort
- mot_mjs¶
Ouverture/fermeture au !plot cond
- open_cond¶
À l’ouverture du vote condamné
- close_cond¶
À la fermeture du vote condamné
- open_maire¶
À l’ouverture du vote du maire
- close_maire¶
À la fermeture du vote du maire
- open_loups¶
À l’ouverture du vote des loups
- close_loups¶
À la fermeture du vote des loups
- class lgrez.bdd.CandidHaroType(value)[source]¶
Enum
pour distinguer un haro d’une candidature.- candidature¶
Candidature à la mairie
- haro¶
Haro pour le bûcher
- class lgrez.bdd.Vote(value)[source]¶
Enum
représentant les différents votes possibles.- cond¶
Vote pour le condamné du jour
- maire¶
Vote pour le nouveau maire
- loups¶
Vote pour la victime des loups
- class lgrez.bdd.UtilEtat(value)[source]¶
Enum
représentant l’état d’une utilisation d’action.- ouverte¶
Action utilisable, pas de décision prise
- remplie¶
Décision prise, encore possibilité de changer
- validee¶
Décision prise et bloquée (créneau pour agir fini)
- ignoree¶
Créneau pour agir fini sans qu’une décision soit prise
- contree¶
Utilisation validée, mais contrée par un évènement externe
- class lgrez.bdd.CibleType(value)[source]¶
Enum
représentant le type de cible d’une action.- joueur¶
La cible doit être un joueur, vivant ou mort
- vivant¶
La cible doit être un joueur vivant
- mort¶
La cible doit être un joueur mort
- role¶
La cible doit être un rôle existant
- camp¶
La cible doit être un camp (public) existant
- booleen¶
Oui/non : sert à ue action sans paramètres, à une option…
- texte¶
Permet d’entrer un texte libre
Modèle de données - Joueurs¶
lg-rez / bdd / Modèle de données
Déclaration de toutes les tables et leurs colonnes
Enregistrement des joueurs et de leurs actions publiques
Joueurs¶
- class lgrez.bdd.Joueur(**kwargs)[source]¶
Table de données des joueurs inscrits.
Les instances de cette classe correspondent aux lignes du Tableau de bord ; elles sont crées par l’inscription (
inscription.main()
) et synchronisées par!sync
.Note
Cette classe est une classe de données (sous-classe de
TableBase
) représentant la tablejoueurs
:Les propriétés et méthodes détaillées dans
TableMeta
sont utilisables (sur la classe uniquement) ;Tous les attributs ci-dessous sont du type indiqué pour les instances (entrées de BDD), mais de type
sqlalchemy.orm.attributes.InstrumentedAttribute
pour la classe elle-même.
- discord_id¶
ID Discord du joueur (clé primaire) (NOT NULL)
Type SQLAlchemy :
BigInteger()
/ Type SQL :BIGINT
- Type
- chan_id_¶
ID du chan privé Discord du joueur. (le ``_`` final indique que ce champ n’est pas synchnisé avec le Tableau de bord) (NOT NULL)
Type SQLAlchemy :
BigInteger()
/ Type SQL :BIGINT
- Type
- nom¶
Nom du joueur (demandé à l’inscription) (NOT NULL)
Type SQLAlchemy :
String(length=32)
/ Type SQL :VARCHAR(32)
- Type
- chambre¶
Emplacement du joueur (demandé à l’inscription)
Type SQLAlchemy :
String(length=200)
/ Type SQL :VARCHAR(200)
- Type
str
|None
- statut¶
Statut RP (NOT NULL) (défaut
<Statut.vivant: 1>
)Type SQLAlchemy :
Enum('vivant', 'mort', 'MV', 'immortel', name='statut')
/ Type SQL :VARCHAR(8)
- Type
- role¶
Rôle du joueur (défaut
bdd.Role.default()
) (many-to-one relationship) (NOT NULL)- Type
- camp¶
Camp du joueur (défaut
bdd.Camp.default()
) (many-to-one relationship) (NOT NULL)- Type
- votant_village¶
Le joueur participe aux votes du village ? (NOT NULL) (défaut
True
)Type SQLAlchemy :
Boolean()
/ Type SQL :BOOLEAN
- Type
- votant_loups¶
Le joueur participe au vote des loups ? (NOT NULL) (défaut
False
)Type SQLAlchemy :
Boolean()
/ Type SQL :BOOLEAN
- Type
- role_actif¶
Le joueur peut agir ? (pas chatgarouté…) (NOT NULL) (défaut
True
)Type SQLAlchemy :
Boolean()
/ Type SQL :BOOLEAN
- Type
- candidharos¶
Candidatures et haros de/contre ce joueur (one-to-many relationship)
- Type
Sequence[CandidHaro]
- bouderies¶
Appartenances aux boudoirs de ce joueur (one-to-many relationship)
- Type
Sequence[Bouderie]
- ciblages¶
Ciblages prenant ce joueur pour cible (dynamic one-to-many relationship)
- property member¶
Membre Discord correspondant à ce Joueur.
- Lève
ValueError – pas de membre correspondant
NotReadyError – bot non connecté (
config.guild
vautNone
)
- Type
- property private_chan¶
Channel privé (conversation bot) du joueur.
- Lève
ValueError – pas de channel correspondant
NotReadyError – bot non connecté (
config.guild
vautNone
)
- Type
- property actions_actives¶
Sous-ensemble de
actions
restreint aux actions actives.Élimine aussi les actions de vote (sans base).
- Type
Sequence[bdd.Action]
- est_vivant¶
bool
(instance) /sqlalchemy.sql.selectable.Exists
(classe): Le joueur est en vie ou MVtisé ?Raccourci pour
joueur.statut in {Statut.vivant, Statut.MV}
Propriété hybride (voir
Action.is_open
pour plus d’infos)
- est_mort¶
bool
(instance) /sqlalchemy.sql.selectable.Exists
(classe): Le joueur est mort ?Raccourci pour
joueur.statut == Statut.mort
Propriété hybride (voir
Action.is_open
pour plus d’infos)
- classmethod from_member(member)[source]¶
Récupère le Joueur (instance de BDD) lié à un membre Discord.
- Paramètres
member (discord.Member) – le membre concerné
- Renvoie
Le joueur correspondant.
- Type renvoyé
- Lève
ValueError – membre introuvable en base
NotReadyError – session non initialisée (
config.session
vautNone
)
- action_vote(vote)[source]¶
Retourne l“« action de vote » voulue pour ce joueur.
- Paramètres
vote (bdd.Vote) – vote pour lequel récupérer l’action
- Renvoie
Action
- Lève
RuntimeError – action non existante
CandidHaros¶
- class lgrez.bdd.CandidHaro(**kwargs)[source]¶
Table de données des candidatures et haros en cours #PhilippeCandidHaro.
Les instances sont enregistrées via
!haro
/!candid
et supprimées via!wipe
.Note
Cette classe est une classe de données (sous-classe de
TableBase
) représentant la tablecandidharos
:Les propriétés et méthodes détaillées dans
TableMeta
sont utilisables (sur la classe uniquement) ;Tous les attributs ci-dessous sont du type indiqué pour les instances (entrées de BDD), mais de type
sqlalchemy.orm.attributes.InstrumentedAttribute
pour la classe elle-même.
- id¶
Identifiant unique du candidharo, sans signification (clé primaire) (auto-incrémental)
Type SQLAlchemy :
Integer()
/ Type SQL :INTEGER
- Type
- type¶
Haro ou candidature ? (NOT NULL)
Type SQLAlchemy :
Enum('candidature', 'haro', name='candidharotype')
/ Type SQL :VARCHAR(11)
- Type
Boudoirs¶
- class lgrez.bdd.Boudoir(**kwargs)[source]¶
Table de données des boudoirs sur le serveur.
Les instances de cette classe sont crées, modifiées et supprimées par
!boudoir
.Note
Cette classe est une classe de données (sous-classe de
TableBase
) représentant la tableboudoirs
:Les propriétés et méthodes détaillées dans
TableMeta
sont utilisables (sur la classe uniquement) ;Tous les attributs ci-dessous sont du type indiqué pour les instances (entrées de BDD), mais de type
sqlalchemy.orm.attributes.InstrumentedAttribute
pour la classe elle-même.
- chan_id¶
ID Discord du salon (clé primaire) (NOT NULL)
Type SQLAlchemy :
BigInteger()
/ Type SQL :BIGINT
- Type
- nom¶
Nom du boudoir (demandé à la création) (NOT NULL)
Type SQLAlchemy :
String(length=32)
/ Type SQL :VARCHAR(32)
- Type
- ts_created¶
Timestamp de la création (NOT NULL)
Type SQLAlchemy :
DateTime()
/ Type SQL :DATETIME
- Type
- property chan¶
Salon Discord correspondant à ce boudoir.
- Lève
ValueError – pas de membre correspondant
NotReadyError – bot non connecté (
config.guild
vautNone
)
- Type
- property gerant¶
Membre du boudoir ayant les droits de gestion.
- Lève
ValueError – pas de membre avec les droits de gestion
- Type
- async add_joueur(joueur, gerant=False)[source]¶
Ajoute un joueur sur le boudoir.
Crée la
Bouderie
correspondante et modifie les permissions du salon.
- async remove_joueur(joueur)[source]¶
Retire un joueur du boudoir.
Supprime la
Bouderie
correspondante et modifie les permissions du salon.- Paramètres
joueur (Joueur) – Le joueur à ajouter.
- classmethod from_channel(channel)[source]¶
Récupère le Boudoir (instance de BDD) lié à un salon Discord.
- Paramètres
channel (discord.TextChannel) – le salon concerné
- Renvoie
Le salon correspondant.
- Type renvoyé
- Lève
ValueError – boudoir introuvable en base
NotReadyError – session non initialisée (
config.session
vautNone
)
Bouderies¶
- class lgrez.bdd.Bouderie(**kwargs)[source]¶
Table de données des appartenances aux boudoirs du serveur.
Table d’association entre
Joueur
etBoudoir
.Les instances de cette classe sont crées, modifiées et supprimées par
!boudoir
.Note
Cette classe est une classe de données (sous-classe de
TableBase
) représentant la tablebouderies
:Les propriétés et méthodes détaillées dans
TableMeta
sont utilisables (sur la classe uniquement) ;Tous les attributs ci-dessous sont du type indiqué pour les instances (entrées de BDD), mais de type
sqlalchemy.orm.attributes.InstrumentedAttribute
pour la classe elle-même.
- id¶
Identifiant unique de la bouderie, sans signification (clé primaire) (auto-incrémental)
Type SQLAlchemy :
Integer()
/ Type SQL :INTEGER
- Type
- gerant¶
Si le joueur a les droits de gestion du boudoir (NOT NULL) (défaut
False
)Type SQLAlchemy :
Boolean()
/ Type SQL :BOOLEAN
- Type
- ts_added¶
Timestamp de l’ajout du joueur au boudoir (NOT NULL)
Type SQLAlchemy :
DateTime()
/ Type SQL :DATETIME
- Type
- ts_promu¶
Timestamp de la promotion en gérant, le cas échéant
Type SQLAlchemy :
DateTime()
/ Type SQL :DATETIME
- Type
datetime.datetime
|None
Modèle de données - Jeu¶
lg-rez / bdd / Modèle de données
Déclaration de toutes les tables et leurs colonnes
Personnalisation des rôles, camps et actions liées
Rôles¶
- class lgrez.bdd.Role(**kwargs)[source]¶
Table de données des rôles.
Cette table est remplie automatiquement à partir du Google Sheet « Rôles et actions » par la commande
!fillroles
.Note
Cette classe est une classe de données (sous-classe de
TableBase
) représentant la tableroles
:Les propriétés et méthodes détaillées dans
TableMeta
sont utilisables (sur la classe uniquement) ;Tous les attributs ci-dessous sont du type indiqué pour les instances (entrées de BDD), mais de type
sqlalchemy.orm.attributes.InstrumentedAttribute
pour la classe elle-même.
- slug¶
Identifiant unique du rôle (clé primaire) (NOT NULL)
Type SQLAlchemy :
String(length=32)
/ Type SQL :VARCHAR(32)
- Type
- prefixe¶
Article du nom du rôle (
"Le "
,"La "
,"L'"
…) (NOT NULL) (défaut''
)Type SQLAlchemy :
String(length=8)
/ Type SQL :VARCHAR(8)
- Type
- nom¶
Nom (avec casse et accents) du rôle (NOT NULL)
Type SQLAlchemy :
String(length=32)
/ Type SQL :VARCHAR(32)
- Type
- camp¶
Camp auquel ce rôle est affilié à l’origine (many-to-one relationship) (NOT NULL)
(On peut avoir
joueur.camp != joueur.role.camp
si damnation, passage MV…)- Type
- actif¶
Rôle actif ? (affiché dans la liste des rôles, etc) (NOT NULL) (défaut
True
)Type SQLAlchemy :
Boolean()
/ Type SQL :BOOLEAN
- Type
- description_courte¶
Description du rôle en une ligne (NOT NULL) (défaut
''
)Type SQLAlchemy :
String(length=140)
/ Type SQL :VARCHAR(140)
- Type
- description_longue¶
Règles et background complets du rôle (NOT NULL) (défaut
''
)Type SQLAlchemy :
String(length=1800)
/ Type SQL :VARCHAR(1800)
- Type
- ciblages¶
Ciblages prenant ce rôle pour cible (dynamic one-to-many relationship)
- base_actions¶
Modèles d’actions associées (many-to-many relationship)
- Type
Sequence[BaseAction]
- property embed¶
Embed Discord présentant le rôle et ses actions.
- Type
- classmethod default()[source]¶
Retourne le rôle par défaut (celui avant attribution).
Avertissement
Un rôle de
slug
config.default_role_slug
doit être défini en base.- Renvoie
~bdd.Role
- Lève
ValueError – rôle introuvable en base
RuntimeError – session non initialisée (
config.session
vautNone
)
Camps¶
- class lgrez.bdd.Camp(**kwargs)[source]¶
Table de données des camps, publics et secrets.
Cette table est remplie automatiquement à partir du Google Sheet « Rôles et actions » par la commande
!fillroles
.Note
Cette classe est une classe de données (sous-classe de
TableBase
) représentant la tablecamps
:Les propriétés et méthodes détaillées dans
TableMeta
sont utilisables (sur la classe uniquement) ;Tous les attributs ci-dessous sont du type indiqué pour les instances (entrées de BDD), mais de type
sqlalchemy.orm.attributes.InstrumentedAttribute
pour la classe elle-même.
- slug¶
Identifiant unique du camp (clé primaire) (NOT NULL)
Type SQLAlchemy :
String(length=32)
/ Type SQL :VARCHAR(32)
- Type
- nom¶
Nom (affiché) du camp (NOT NULL)
Type SQLAlchemy :
String(length=32)
/ Type SQL :VARCHAR(32)
- Type
- description¶
Description (courte) du camp (NOT NULL) (défaut
''
)Type SQLAlchemy :
String(length=1000)
/ Type SQL :VARCHAR(1000)
- Type
- public¶
L’existance du camp (et des rôles liés) est connue de tous ? (NOT NULL) (défaut
True
)Type SQLAlchemy :
Boolean()
/ Type SQL :BOOLEAN
- Type
- emoji¶
Nom de l’emoji associé au camp (doit être le nom d’un emoji existant sur le serveur)
Type SQLAlchemy :
String(length=32)
/ Type SQL :VARCHAR(32)
- Type
str
|None
- ciblages¶
Ciblages prenant ce camp pour cible (dynamic one-to-many relationship)
- property discord_emoji¶
Emoji Discord correspondant à ce camp
- Lève
ValueError –
emoji
non défini ou manquant sur le serveurNotReadyError – bot non connecté (
config.guild
vautNone
)
- Type
- property discord_emoji_or_none¶
discord_emoji
si défini- Lève
NotReadyError – bot non connecté (
config.guild
vautNone
)- Type
discord.Emoji
|None
- property embed¶
Embed Discord présentant le camp.
- Type
- classmethod default()[source]¶
Retourne le camp par défaut (celui avant attribution).
Avertissement
Un camp de
slug
config.default_camp_slug
doit être défini en base.- Renvoie
~bdd.Camp
- Lève
ValueError – camp introuvable en base
RuntimeError – session non initialisée (
config.session
vautNone
)
Actions de base¶
- class lgrez.bdd.BaseAction(**kwargs)[source]¶
Table de données des actions définies de base (non liées à un joueur).
Cette table est remplie automatiquement à partir du Google Sheet « Rôles et actions » par la commande
!fillroles
.Note
Cette classe est une classe de données (sous-classe de
TableBase
) représentant la tablebaseactions
:Les propriétés et méthodes détaillées dans
TableMeta
sont utilisables (sur la classe uniquement) ;Tous les attributs ci-dessous sont du type indiqué pour les instances (entrées de BDD), mais de type
sqlalchemy.orm.attributes.InstrumentedAttribute
pour la classe elle-même.
- slug¶
Identifiant unique de l’action (clé primaire) (NOT NULL)
Type SQLAlchemy :
String(length=32)
/ Type SQL :VARCHAR(32)
- Type
- trigger_debut¶
Mode de déclenchement de l’ouverture de l’action (NOT NULL) (défaut
<ActionTrigger.perma: 3>
)Type SQLAlchemy :
Enum('temporel', 'delta', 'perma', 'start', 'auto', 'mort', 'mot_mjs', 'open_cond', 'close_cond', 'open_maire', 'close_maire', 'open_loups', 'close_loups', name='actiontrigger')
/ Type SQL :VARCHAR(11)
- Type
- trigger_fin¶
Mode de déclenchement de la clôture de l’action (NOT NULL) (défaut
<ActionTrigger.perma: 3>
)Type SQLAlchemy :
Enum('temporel', 'delta', 'perma', 'start', 'auto', 'mort', 'mot_mjs', 'open_cond', 'close_cond', 'open_maire', 'close_maire', 'open_loups', 'close_loups', name='actiontrigger')
/ Type SQL :VARCHAR(11)
- Type
- instant¶
L’action est instantannée (conséquence dès la prise de décision) ou non (conséquence à la fin du créneau d’action) (NOT NULL) (défaut
False
)Type SQLAlchemy :
Boolean()
/ Type SQL :BOOLEAN
- Type
- heure_debut¶
Si
trigger_debut
vauttemporel
, l’horaire associéType SQLAlchemy :
Time()
/ Type SQL :TIME
- Type
datetime.time
|None
- heure_fin¶
Si
trigger_fin
vaut -temporel
: l’horaire associé ; -delta
, l’intervalle associéType SQLAlchemy :
Time()
/ Type SQL :TIME
- Type
datetime.time
|None
- base_cooldown¶
Temps de rechargement entre deux utilisations du pouvoir (
0
si pas de cooldown) (NOT NULL) (défaut0
)Type SQLAlchemy :
Integer()
/ Type SQL :INTEGER
- Type
- base_charges¶
Nombre de charges initiales du pouvoir (
None
si illimité)Type SQLAlchemy :
Integer()
/ Type SQL :INTEGER
- Type
int
|None
- refill¶
Évènements pouvant recharger l’action, séparés par des virgules (
"weekends"
,"forgeron"
,"rebouteux"
…) (NOT NULL) (défaut''
)Type SQLAlchemy :
String(length=32)
/ Type SQL :VARCHAR(32)
- Type
- lieu¶
Attribut informatif, non exploité dans la version actuelle (Distance/Physique/Lieu/Contact/Conditionnel/None/Public)
Type SQLAlchemy :
String(length=100)
/ Type SQL :VARCHAR(100)
- Type
str
|None
- interaction_notaire¶
Attribut informatif, non exploité dans la version actuelle (Oui/Non/Conditionnel/Potion/Rapport ; None si récursif)
Type SQLAlchemy :
String(length=100)
/ Type SQL :VARCHAR(100)
- Type
str
|None
- interaction_gardien¶
Attribut informatif, non exploité dans la version actuelle (Oui/Non/Conditionnel/Taverne/Feu/MaisonClose/Précis/Cimetière/Loups ; None si récursif)
Type SQLAlchemy :
String(length=100)
/ Type SQL :VARCHAR(100)
- Type
str
|None
- mage¶
Attribut informatif, non exploité dans la version actuelle (Oui/Non/Changement de cible/…)
Type SQLAlchemy :
String(length=100)
/ Type SQL :VARCHAR(100)
- Type
str
|None
- decision_format¶
Tuer {cible}
) (NOT NULL) (défaut''
)Type SQLAlchemy :
String(length=200)
/ Type SQL :VARCHAR(200)
- Type
- Type
Description des utilisations de ces action, sous forme de texte formaté avec les noms des
BaseCiblage.slug
entre accolades (exemple
- base_ciblages¶
Ciblages de ce modèle d’action (triés par priorité) (one-to-many relationship)
- Type
Sequence[BaseCiblage]
Ciblages de base¶
- class lgrez.bdd.BaseCiblage(**kwargs)[source]¶
Table de données des modèles de ciblages des actions de base.
[TODO] Cette table est remplie automatiquement à partir du Google Sheet « Rôles et actions » par la commande
!fillroles
.Note
Cette classe est une classe de données (sous-classe de
TableBase
) représentant la tablebaseciblages
:Les propriétés et méthodes détaillées dans
TableMeta
sont utilisables (sur la classe uniquement) ;Tous les attributs ci-dessous sont du type indiqué pour les instances (entrées de BDD), mais de type
sqlalchemy.orm.attributes.InstrumentedAttribute
pour la classe elle-même.
- base_action¶
Modèle d’action définissant ce ciblage (many-to-one relationship) (NOT NULL)
- Type
- slug¶
Identifiant de la cible dans le modèle d’action (NOT NULL) (défaut
'unique'
)Type SQLAlchemy :
String(length=32)
/ Type SQL :VARCHAR(32)
- Type
- type¶
Message d’interaction au joueur au moment de choisir la cible (NOT NULL) (défaut
<CibleType.texte: 7>
)Type SQLAlchemy :
Enum('joueur', 'vivant', 'mort', 'role', 'camp', 'booleen', 'texte', name='cibletype')
/ Type SQL :VARCHAR(7)
- Type
- prio¶
Ordre (relatif) d’apparition du ciblage lors du
!action
Si deux ciblages ont la même priorité, ils seront considérés comme ayant une signification symmétrique (notamment, si
doit_changer
vautTrue
, tous les membres du groupe devront changer) ; l’ordre d’apparition dépend alors de leurslug
, par ordre alphabétique (cible1
<cible2
). (NOT NULL) (défaut1
)Type SQLAlchemy :
Integer()
/ Type SQL :INTEGER
- Type
- phrase¶
Message d’interaction au joueur au moment de choisir la cible (NOT NULL) (défaut
'Cible ?'
)Type SQLAlchemy :
String(length=1000)
/ Type SQL :VARCHAR(1000)
- Type
- obligatoire¶
Si le ciblage doit obligatoirement être renseigné (NOT NULL) (défaut
True
)Type SQLAlchemy :
Boolean()
/ Type SQL :BOOLEAN
- Type
Modèle de données - Actions¶
lg-rez / bdd / Modèle de données
Déclaration de toutes les tables et leurs colonnes
Actions, leurs utilisations et ciblages (à venir)
Actions¶
- class lgrez.bdd.Action(*args, **kwargs)[source]¶
Table de données des actions attribuées (liées à un joueur).
Les instances doivent être enregistrées via
gestion_actions.add_action()
et supprimées viagestion_actions.delete_action()
.Note
Cette classe est une classe de données (sous-classe de
TableBase
) représentant la tableactions
:Les propriétés et méthodes détaillées dans
TableMeta
sont utilisables (sur la classe uniquement) ;Tous les attributs ci-dessous sont du type indiqué pour les instances (entrées de BDD), mais de type
sqlalchemy.orm.attributes.InstrumentedAttribute
pour la classe elle-même.
- id¶
Identifiant unique de l’action, sans signification (clé primaire) (auto-incrémental)
Type SQLAlchemy :
Integer()
/ Type SQL :INTEGER
- Type
- base¶
Action de base (
None
si action de vote) (many-to-one relationship)- Type
BaseAction
|None
- vote¶
Si action de vote, vote concerné
Type SQLAlchemy :
Enum('cond', 'maire', 'loups', name='vote')
/ Type SQL :VARCHAR(5)
- Type
Vote
|None
- active¶
Si l’action est actuellement utilisable (False = archives) (NOT NULL) (défaut
True
)Type SQLAlchemy :
Boolean()
/ Type SQL :BOOLEAN
- Type
- cooldown¶
Nombre d’ouvertures avant disponiblité de l’action (NOT NULL) (défaut
0
)Type SQLAlchemy :
Integer()
/ Type SQL :INTEGER
- Type
- charges¶
Nombre de charges restantes (
None
si illimité)Type SQLAlchemy :
Integer()
/ Type SQL :INTEGER
- Type
int
|None
- utilisations¶
Utilisations de cette action (dynamic one-to-many relationship)
- Type
- property utilisation_ouverte¶
Utilisation de l’action actuellement ouverte.
Vaut
None
si aucune action n’a actuellement l’étatouverte
ouremplie
.- Lève
RuntimeError – plus d’une action a actuellement l’état
ouverte –
- Type
Utilisation
|None
- property derniere_utilisation¶
Utilisation
|None
:: Dernière utilisation de cette action (temporellement).Considère l’utilisation ouverte le cas échéant, sinon la dernière utilisation par timestamp de fermeture descendant (quelque soit son état, y comprs
contree
).Vaut
None
si l’action n’a jamais été utilisée.- Lève
RuntimeError – plus d’une action a actuellement l’état
ouverte –
- property decision¶
Description de la décision de la dernière utilisation.
Considère l’utilisation ouverte le cas échéant, sinon la dernière utilisation par timestamp de fermeture descendant.
Vaut
Utilisation.decision
, ou"<N/A>"
si il n’y a aucune utilisation de cette action.- Lève
RuntimeError – plus d’une action a actuellement l’état
ouverte –
- Type
- is_open¶
bool
(instance) /sqlalchemy.sql.selectable.Exists
(classe): L’action est ouverte (l’utilisateur peut interagir) ?I.e. l’action a au moins une utilisation
ouverte
ouremplie
.Propriété hybride (
sqlalchemy.ext.hybrid.hybrid_property
) :Sur l’instance, renvoie directement la valeur booléenne ;
Sur la classe, renvoie la clause permettant de déterminer si l’action est en attente.
Examples:
action.is_open # bool Joueur.query.filter(Joueur.actions.any(Action.is_open)).all()
- is_waiting¶
bool
(instance) /sqlalchemy.sql.selectable.Exists
(classe): L’action est ouverte et aucune décision n’a été prise ?I.e. la clause a au moins une utilisation
ouverte
.Propriété hybride (voir
is_open
pour plus d’infos)
Utilisations¶
- class lgrez.bdd.Utilisation(**kwargs)[source]¶
Table de données des utilisations des actions.
Les instances sont enregistrées via
!open
; elles n’ont pas vocation à être supprimées.Note
Cette classe est une classe de données (sous-classe de
TableBase
) représentant la tableutilisations
:Les propriétés et méthodes détaillées dans
TableMeta
sont utilisables (sur la classe uniquement) ;Tous les attributs ci-dessous sont du type indiqué pour les instances (entrées de BDD), mais de type
sqlalchemy.orm.attributes.InstrumentedAttribute
pour la classe elle-même.
- id¶
Identifiant unique de l’utilisation, sans signification (clé primaire) (auto-incrémental)
Type SQLAlchemy :
BigInteger()
/ Type SQL :BIGINT
- Type
- etat¶
État de l’utilisation (NOT NULL) (défaut
<UtilEtat.ouverte: 1>
)Type SQLAlchemy :
Enum('ouverte', 'remplie', 'validee', 'ignoree', 'contree', name='utiletat')
/ Type SQL :VARCHAR(7)
- Type
- ts_open¶
Timestamp d’ouverture de l’utilisation
Type SQLAlchemy :
DateTime()
/ Type SQL :DATETIME
- Type
datetime.datetime
|None
- ts_close¶
Timestamp de fermeture de l’utilisation
Type SQLAlchemy :
DateTime()
/ Type SQL :DATETIME
- Type
datetime.datetime
|None
- ts_decision¶
Timestamp du dernier remplissage de l’utilisation
Type SQLAlchemy :
DateTime()
/ Type SQL :DATETIME
- Type
datetime.datetime
|None
- open()[source]¶
Ouvre cette utilisation.
Modifie son
etat
, définitts_open
au temps actuel, et update.
- close()[source]¶
Clôture cette utilisation.
Modifie son
etat
, définitts_close
au temps actuel, et update.
- ciblage(slug)[source]¶
Renvoie le ciblage de base de slug voulu.
- Paramètres
slug (str) – Doit correspondre à un des slugs des bases des
ciblages
de l’utilisation.- Renvoie
- Lève
ValueError – slug non trouvé dans les
ciblages
- property cible¶
Joueur ciblé par l’utilisation, si applicable.
Cet attribut n’est accessible que si l’utilisation est d’un vote ou d’une action définissant un et une seul ciblage de type
joueur
,vivant
oumort
.Vaut
None
si l’utilisation a l’étatouverte
ouignoree
.- Lève
ValueError – l’action ne remplit pas les critères évoqués
ci-dessus –
- Type
Joueur
|None
- property decision¶
Description de la décision de cette utilisation.
Complète le template de :.bdd.BaseAction.decision_format` avec les valeurs des ciblages de l’utilisation.
Vaut
"Ne rien faire"
si l’utilisation n’a pas de ciblages, etcible
dans le cas d’un vote.- Type
- is_open¶
bool
(instance) /sqlalchemy.sql.selectable.Exists
(classe): L’utilisation est ouverte (l’utilisateur peut interagir) ?Raccourci pour
utilisation.etat in {UtilEtat.ouverte, UtilEtat.remplie}
Propriété hybride (voir
Action.is_open
pour plus d’infos)
- is_waiting¶
bool
(instance) /sqlalchemy.sql.selectable.Exists
(classe): L’utilisation est ouverte et aucune décision n’a été prise ?Raccourci pour
utilisation.etat == UtilEtat.ouverte
Propriété hybride (voir
Action.is_open
pour plus d’infos)
- is_filled¶
bool
(instance) /sqlalchemy.sql.selectable.Exists
(classe): L’utilisation est remplie (l’utilisateur a interagi avec) ?Raccourci pour
utilisation.etat in {UtilEtat.remplie, UtilEtat.validee, UtilEtat.contree}
Propriété hybride (voir
Action.is_open
pour plus d’infos)
Ciblages¶
- class lgrez.bdd.Ciblage(**kwargs)[source]¶
Table de données des cibles désignées dans les utilisations d’actions.
Les instances sont enregistrées via
!action
; elles n’ont pas vocation à être supprimées.Note
Cette classe est une classe de données (sous-classe de
TableBase
) représentant la tableciblages
:Les propriétés et méthodes détaillées dans
TableMeta
sont utilisables (sur la classe uniquement) ;Tous les attributs ci-dessous sont du type indiqué pour les instances (entrées de BDD), mais de type
sqlalchemy.orm.attributes.InstrumentedAttribute
pour la classe elle-même.
- id¶
Identifiant unique du ciblage, sans signification (clé primaire) (auto-incrémental)
Type SQLAlchemy :
Integer()
/ Type SQL :INTEGER
- Type
- base¶
Modèle de ciblage (lié au modèle d’action). Vaut
None
pour un ciblage de vote (many-to-one relationship)- Type
BaseCiblage
|None
- utilisation¶
Utilisation où ce ciblage a été fait (many-to-one relationship) (NOT NULL)
- Type
- joueur¶
Joueur désigné, si
base.type
vautjoueur
,vivant
oumort
(many-to-one relationship)- Type
Joueur
|None
- booleen¶
Valeur, si
base.type
vautbooleen
Type SQLAlchemy :
Boolean()
/ Type SQL :BOOLEAN
- Type
bool
|None
- texte¶
Valeur, si
base.type
vauttexte
Type SQLAlchemy :
String(length=1000)
/ Type SQL :VARCHAR(1000)
- Type
str
|None
- property valeur¶
Joueur
|Camp
|bool
|str
: Valeur du ciblage, selon son type.Propriété en lecture et écriture.
- Lève
ValueError – ciblage de type inconnu
- property valeur_descr¶
Description de la valeur du ciblage.
Si
valeur
vautNone
, renvoie<N/A>
- Lève
ValueError – ciblage de type inconnu
- Type
Tâches¶
- class lgrez.bdd.Tache(**kwargs)[source]¶
Table de données des tâches planifiées du bot.
Les instances doivent être enregistrées via
add()
et supprimées viadelete()
.Note
Cette classe est une classe de données (sous-classe de
TableBase
) représentant la tabletaches
:Les propriétés et méthodes détaillées dans
TableMeta
sont utilisables (sur la classe uniquement) ;Tous les attributs ci-dessous sont du type indiqué pour les instances (entrées de BDD), mais de type
sqlalchemy.orm.attributes.InstrumentedAttribute
pour la classe elle-même.
- id¶
Identifiant unique de la tâche, sans signification (clé primaire) (auto-incrémental)
Type SQLAlchemy :
Integer()
/ Type SQL :INTEGER
- Type
- timestamp¶
Moment où exécuter la tâche (NOT NULL)
Type SQLAlchemy :
DateTime()
/ Type SQL :DATETIME
- Type
- commande¶
Texte à envoyer via le webhook (généralement une commande) (NOT NULL)
Type SQLAlchemy :
String(length=2000)
/ Type SQL :VARCHAR(2000)
- Type
- action¶
Si la tâche est liée à une action, action concernée (many-to-one relationship)
- Type
Action
|None
- property handler¶
Représentation dans le bot de la tâche.
Proxy pour
config.bot.tasks[self.id]
, en lecture, écriture et suppression (del
).- Lève
RuntimeError – tâche non enregistrée dans le bot.
- Type
- async send_webhook(tries=0)[source]¶
Exécute la tâche (coroutine programmée par
execute()
).Envoie un webhook (
config.webhook
) de contenucommande
.Si une exception quelconque est levée par l’envoi du webhook, re-programme l’exécution de la tâche (
execute()
) 2 secondes après ; ce jusqu’à 5 fois, après quoi un message d’alerte est envoyé dansconfig.Channel.logs
.Si aucune exception n’est levée (succès), supprime la tâche.
- Paramètres
tries (int) – Numéro de l’essai d’envoi actuellement en cours
- execute(tries=0)[source]¶
Exécute la tâche planifiée (méthode appellée par la loop).
Programme
send_webhook()
pour exécution immédiate.- Paramètres
tries (int) – Numéro de l’essai d’envoi actuellement en cours, passé à
send_webhook()
.
- cancel()[source]¶
Annule et nettoie la tâche planifiée (sans la supprimer en base).
Si la tâche a déjà été exécutée, ne fait que nettoyer le handler.
- add(*other)[source]¶
Enregistre la tâche sur le bot et en base.
Globalement équivalent à un appel à
register()
(pour chaque élément le cas échéant) avant l’ajout en base habituel (TableBase.add
).- Paramètres
*other – autres instances à ajouter dans le même commit, éventuellement.
- delete(*other)[source]¶
Annule la tâche planifiée et la supprime en base.
Globalement équivalent à un appel à
cancel()
(pour chaque élément le cas échéant) avant la suppression en base habituelle (TableBase.add
).- Paramètres
*other – autres instances à supprimer dans le même commit, éventuellement.
Modèle de données - IA¶
lg-rez / bdd / Modèle de données
Déclaration de toutes les tables et leurs colonnes
Réactions¶
- class lgrez.bdd.Reaction(**kwargs)[source]¶
Table de données des réactions d’IA connues du bot.
Les instances sont enregistrées via
!addIA
et supprimées via!modifIA
.Note
Cette classe est une classe de données (sous-classe de
TableBase
) représentant la tablereactions
:Les propriétés et méthodes détaillées dans
TableMeta
sont utilisables (sur la classe uniquement) ;Tous les attributs ci-dessous sont du type indiqué pour les instances (entrées de BDD), mais de type
sqlalchemy.orm.attributes.InstrumentedAttribute
pour la classe elle-même.
- id¶
Identifiant unique de la réaction, sans signification (clé primaire) (auto-incrémental)
Type SQLAlchemy :
Integer()
/ Type SQL :INTEGER
- Type
- reponse¶
Réponse, suivant le format (mini-langage) personnalisé (
"txt <||> txt <&&> <##>react"
) (NOT NULL)Type SQLAlchemy :
String(length=2000)
/ Type SQL :VARCHAR(2000)
- Type
Triggers¶
- class lgrez.bdd.Trigger(**kwargs)[source]¶
Table de données des mots et expressions déclenchant l’IA du bot.
Les instances sont enregistrées via
!addIA
ou!modifIA
et supprimées via!modifIA
.Note
Cette classe est une classe de données (sous-classe de
TableBase
) représentant la tabletriggers
:Les propriétés et méthodes détaillées dans
TableMeta
sont utilisables (sur la classe uniquement) ;Tous les attributs ci-dessous sont du type indiqué pour les instances (entrées de BDD), mais de type
sqlalchemy.orm.attributes.InstrumentedAttribute
pour la classe elle-même.
- id¶
Identifiant unique du déclencheur, sans signification (clé primaire) (auto-incrémental)
Type SQLAlchemy :
Integer()
/ Type SQL :INTEGER
- Type
- trigger¶
Mots-clés / expressions (NOT NULL)
Type SQLAlchemy :
String(length=500)
/ Type SQL :VARCHAR(500)
- Type