Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 54 additions & 19 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,24 @@ L'objectif est de permettre des ajouts communautaires **sans compromettre la sta

## Ce que vous pouvez faire

- Ajouter une **nouvelle feature** dans `feature/<slug>/`
- Améliorer une feature existante
- Corriger un bug dans une feature
- Ajouter une **nouvelle feature** dans `features/<slug>/`
- Améliorer une features existante
- Corriger un bug dans une features
- Améliorer la documentation

## Ce que vous ne pouvez pas faire

- Modifier le core (`bot/`, `core/`)
- Modifier `enabled_features`
- Modifier la logique du loader
- Ajouter une dépendance Python
- Introduire de l'I/O au chargement d'une feature
- Ajouter une dépendance Python sans accord du staff
- Introduire de l'I/O au chargement d'une features

Toute PR hors de ces règles sera refusée.

## La collaboration

### Structure d'une feature
### Structure d'une features

Une feature doit respecter **strictement** la structure suivante :

Expand All @@ -44,13 +44,13 @@ Le `slug` :
- doit être unique
- en minuscule
- sans espace
- doit correspondre exactement à `FEATURE["slug"]`
- doit correspondre exactement à `features["slug"]`

### Contrat obligatoire

Chaque `feature.py` doit exposer ces informations :

1) `FEATURE` (constante dictionnaire)
1) `features` (constante dictionnaire)

```python
FEATURE = {
Expand All @@ -59,6 +59,8 @@ Chaque `feature.py` doit exposer ces informations :
"description": "Commande ping simple",
"requires_config": False,
"permissions": [],
"version": "0.0"
"author":"github"
}
```

Expand All @@ -69,6 +71,8 @@ Chaque `feature.py` doit exposer ces informations :
- `description` : description
- `requires_config` : booléen
- `permissions` : liste (ex : `[]`, `["send_message"]`)
- `version`: version en texte
- `author`: nom lisible

2) `register(tree, config)`

Expand All @@ -85,18 +89,46 @@ Chaque `feature.py` doit exposer ces informations :

Les opérations d'I/O sont **autorisées uniquement** dans les handlers des commandes.

### Permissions et checks

Des décorateurs globaux sont disponibles pour restreindre l'accès aux commandes.
Import : `from bot.core.checks import is_staff, is_server_admin, ...`

| Décorateur | Rôle |
|---|---|
| `@is_staff()` | Rôle staff (défini dans `.env`) |
| `@is_server_admin()` | Permission administrateur |
| `@is_server_owner()` | Propriétaire du serveur |
| `@is_server_mod()` | Modérateur (manage messages, kick, ban) |
| `@has_permissions(perm=True)` | Permission spécifique |
| `@has_any_role(id)` / `@has_all_roles(id)` | Vérification par rôle |
| `@in_channel(id)` / `@in_category(id)` | Restriction par salon/catégorie |
| `@bot_has_permissions(perm=True)` | Vérifie les permissions du bot |
| `@cooldown(rate, per)` | Limite d'utilisation |

Exemple :

```python
from bot.core.checks import is_staff

def register(tree, config):
@tree.command(name="secret", description="Commande staff only")
@is_staff()
async def secret_cmd(interaction):
await interaction.response.send_message("Staff only!", ephemeral=True)

### Commandes et conflits

- Les noms de slash commands doivent être uniques.
- Le loader refusera toute feature créant un conflit de nom.
- Il est recommandé d'utiliser un **groupe de commandes par feature**.
- Le loader refusera toute features créant un conflit de nom.
- Il est recommandé d'utiliser un **groupe de commandes par features**.

### Configuration

- Les secrets vont dans `.env` (non commités).
- La configuration fonctionnelle va dans `config.toml`.

Une feature avec `requires_config = true` doit documenter :
Une features avec `requires_config = true` doit documenter :

- les clés attendues dans `[features.<slug>]`
- leurs valeurs par défaut
Expand All @@ -106,32 +138,35 @@ Une feature avec `requires_config = true` doit documenter :
Les contributions doivent être réalisées sur **une branche dédiée** :

- ne pas travailler directement sur `main`
- utiliser la branche `dev` pour initialiser votre propre branche
- une branche = une feature ou une correction
- nommage recommandé :
- `feature/<slug>`
- `fix/<slug>`
- `features/<slug>`
- `fix-features/<slug>`

Exemples :
- `feature/say`
- `fix/ping-ephemeral`
- `features/say`
- `fix-features/ping-ephemeral`
- `fix/<slug>` est réservé aux modification du core du bot

Les Pull Requests doivent cibler la branche `main`.
Les Pull Requests doivent cibler la branche `dev`.

### Créer sa branche

```bash
git checkout -b feature/<slug>
git checkout dev
git checkout -b features/<slug>
git add .
git commit -m "Ajout de la feature <slug>"
git push -u origin feature/<slug>
git push -u origin features/<slug>
```

### Règle de Pull Request

Une PR valide doit :

- concerner une seule feature
- modifier uniquement `feature/<slug>` (et éventuellement la doc)
- modifier uniquement `features/<slug>` (et éventuellement la doc)
- ne pas modifier le core
- ne pas modifier `enabled_features`
- inclure un test manuel simple (2-3 étapes)
Expand Down