diff --git a/src/fr/SUMMARY.md b/src/fr/SUMMARY.md new file mode 100644 index 0000000..0d454ba --- /dev/null +++ b/src/fr/SUMMARY.md @@ -0,0 +1,31 @@ +# Summary + +- [About](about/about.md) + - [Features](about/features.md) + - [Goals](about/goals.md) + - [Post and Comment Ranking](about/ranking.md) + - [Guide](about/guide.md) +- [Administration](administration/administration.md) + - [Install with Docker](administration/install_docker.md) + - [Install with Ansible](administration/install_ansible.md) + - [Other Installation Methods](administration/other_installation_methods.md) + - [Configuration](administration/configuration.md) + - [Getting started with Federation](administration/federation_getting_started.md) + - [Troubleshooting](administration/troubleshooting.md) + - [Backup and Restore](administration/backup_and_restore.md) +- [Federation](federation/federation.md) + - [Federation Overview](federation/overview.md) + - [Resources](federation/resources.md) + - [Lemmy Protocol](federation/lemmy_protocol.md) +- [Client Development](client_development/client_development.md) + - [Theming Guide](client_development/theming.md) + - [API reference](client_development/api_reference.md) + - [WebSocket API](https://join.lemmy.ml/api/index.html) + - [HTTP API](client_development/http_api.md) + - [Creating a Custom Frontend](client_development/custom_frontend.md) +- [Contributing](contributing/contributing.md) + - [Docker Development](contributing/docker_development.md) + - [Local Development](contributing/local_development.md) + - [Tests](contributing/tests.md) + - [Federation Development](contributing/federation_development.md) +- [Code of Conduct](code_of_conduct.md) diff --git a/src/fr/about/about.md b/src/fr/about/about.md new file mode 100644 index 0000000..671415f --- /dev/null +++ b/src/fr/about/about.md @@ -0,0 +1,30 @@ +## À propos du pojet + +Première page|Publication +---|--- +![main screen](main_screen.png)|![chat screen](chat_screen.png) + +[Lemmy](https://github.com/LemmyNet/lemmy) est similaire à des sites comme [Reddit](https://reddit.com), [Lobste.rs](https://lobste.rs), [Raddle](https://raddle.me) ou [Hacker News](https://news.ycombinator.com/) : vous vous abonnez aux forums qui vous intéressent, vous publiez des liens et des discussions, puis vous votez et commentez. Dans les coulisses, c'est très différent : n'importe qui peut facilement gérer un serveur, et tous ces serveurs sont fédérés (pensez au courrier électronique) et connectés au même univers, appelé le [Fediverse] (https://en.wikipedia.org/wiki/Fediverse). + +Pour un agrégateur de liens, cela signifie qu'un utilisateur enregistré sur un serveur peut s'abonner à des forums sur n'importe quel autre serveur, et peut avoir des discussions avec des utilisateurs enregistrés ailleurs. + +L'objectif global est de créer une alternative facilement auto-hébergeable et décentralisée à Reddit et à d'autres agrégateurs de liens, en dehors du contrôle et de l'ingérence des entreprises. + +Chaque serveur lemmy peut définir sa propre politique de modération, en nommant des administrateurs pour l'ensemble du site et des modérateurs de communauté afin d'écarter les trolls et de favoriser un environnement sain et non toxique où chacun peut se sentir à l'aise pour contribuer. + +*Note: La Fédération est toujours en développement actif* + +### Pourquoi "Lemmy" ? + +- Lead singer from [Motörhead](https://invidio.us/watch?v=pWB5JZRGl0U). +- The old school [video game](). +- The [Koopa from Super Mario](https://www.mariowiki.com/Lemmy_Koopa). +- The [furry rodents](http://sunchild.fpwc.org/lemming-the-little-giant-of-the-north/). + +### Construit avec + +- [Rust](https://www.rust-lang.org) +- [Actix](https://actix.rs/) +- [Diesel](http://diesel.rs/) +- [Inferno](https://infernojs.org) +- [Typescript](https://www.typescriptlang.org/) diff --git a/src/fr/about/chat_screen.png b/src/fr/about/chat_screen.png new file mode 100644 index 0000000..21a452d Binary files /dev/null and b/src/fr/about/chat_screen.png differ diff --git a/src/fr/about/features.md b/src/fr/about/features.md new file mode 100644 index 0000000..41abfb0 --- /dev/null +++ b/src/fr/about/features.md @@ -0,0 +1,35 @@ +# Features + +- Open source, [AGPL License](/LICENSE). +- Auto-hébergeable, facil à déployer. + - Fourni avec [Docker](#docker) et [Ansible](#ansible). +- Interface propre et conviviale pour les téléphones portables. + - Il suffit d'un nom d'utilisateur et d'un mot de passe pour s'inscrire ! + - Prise en charge des avatars des utilisateurs. + - Mise à jour en temps réel des fils de commentaires. + - Scores de vote `(+/-)` comme l'ancien reddit. + - Thèmes, y compris clair, sombre, et solarisé. + - Emojis avec support de l'autocomplétion. Commencez en tapant `:` + - Metion des utilisateurs avec `@`, mention de la communauté avec `!`. + - Téléchargement d'images intégré dans les messages et les commentaires. + - Un message peut être composé d'un titre et de toute combinaison de texte, d'une URL ou de rien d'autre. + - Notifications, sur les réponses aux commentaires et lorsque vous êtes metionné. + - Les notifications peuvent être envoyé par courriel + - i18n / Prise en charge d l'internationalisation. + - RSS / Flux Atom pour "Tous", "Abonnés", "Boîte de réception", "Utilisateur" et "Communauté". +- Prise en charge du publipostage croisé. + - Une *recherche de messages similaires* lors de la création de nouveaux messages. Idéal pour les communautés de questions/réponses. +- Capacités de modération. + - Logs de modération publics. + - Peut épingler des messages en haut des communautés. + - Administrateurs du site et les modérateurs de communauté, qui peuvent nommer d'autres modérateurs. + - Peut verrouiller, supprimer et restaurer les messages et les commentaires. + - Peut bannir et débannir des utilisateurs des communautés et du site. + - Peut transférer le site et les communautés à d'autres. +- Peut effacer complètement vos données, en remplaçant tous les messages et commentaires. +- Prise en charge pour les messages NSFW et les communautés. +- Haute performance. + - Le serveur est écrit en rust. + - L'interface est `~80kB` gzippée. + - Front-end fonctionne sans javascript (lecture seule). + - Prise en charge d' arm64 / Raspberry Pi. diff --git a/src/fr/about/goals.md b/src/fr/about/goals.md new file mode 100644 index 0000000..21a1e18 --- /dev/null +++ b/src/fr/about/goals.md @@ -0,0 +1,41 @@ +# Objectifs + +*Cette section contient des idées et des ressources de l'équipe qui développe Lemmy*. Similaire à un bloc-notes + +- Trouver un nom / nom de code. +- Doit avoir des communautés. +- Doit avoir des commentaires en fil de discussion. +- Doit être fédéré : aimer et suivre les communautés à travers les instances. +- Doit être actualisé en temps réel : avoir un panneau de droite pour les nouveaux commentaires, et un panneau principal pour la vue complète du fil de discussion. + - Utiliser des websockets pour envoyer et recevoir des messages dans votre propre instance. + +# Questions + +- Comment fonctionne le vote ? Devrions-nous revenir à l'ancienne méthode qui consistait à compter les votes positifs et négatifs ? Ou juste un score ? +- Décider de la technologie à utiliser + - Backend : Actix, Diesel. + - Front-end : inferno, typescript et bootstrap pour le moment. +- Doit-on autoriser les robots ? +- Les commentaires / votes doivent-ils être statiques, ou ressembler à un chat, comme [flowchat ?] (https://flow-chat.com). + - Modèle à deux volets - le volet de droite contient les commentaires en direct, le volet de gauche est l'arborescence en direct. + - Sur mobile, permettre de passer de l'un à l'autre. Par défaut ? + +# Ressources / Bibliothèques potentielles + +- [Diesel to Postgres data types](https://kotiri.com/2018/01/31/postgresql-diesel-rust-types.html) +- [helpful diesel examples](http://siciarz.net/24-days-rust-diesel/) +- [Recursive query for adjacency list for nested comments](https://stackoverflow.com/questions/192220/what-is-the-most-efficient-elegant-way-to-parse-a-flat-table-into-a-tree/192462#192462) +- https://github.com/sparksuite/simplemde-markdown-editor +- [Markdown-it](https://github.com/markdown-it/markdown-it) +- [Sticky Sidebar](https://stackoverflow.com/questions/38382043/how-to-use-css-position-sticky-to-keep-a-sidebar-visible-with-bootstrap-4/49111934) +- [RXJS websocket](https://stackoverflow.com/questions/44060315/reconnecting-a-websocket-in-angular-and-rxjs/44067972#44067972) +- [Rust JWT](https://github.com/Keats/jsonwebtoken) +- [Hierarchical tree building javascript](https://stackoverflow.com/a/40732240/1655478) +- [Hot sorting discussion](https://meta.stackexchange.com/questions/11602/what-formula-should-be-used-to-determine-hot-questions) [2](https://medium.com/hacking-and-gonzo/how-reddit-ranking-algorithms-work-ef111e33d0d9) +- [Classification types.](https://www.reddit.com/r/ModeratorDuck/wiki/subreddit_classification) +- [RES expando - Possibly make this into a switching react component.](https://github.com/honestbleeps/Reddit-Enhancement-Suite/tree/d21f55c21e734f47d8ed03fe0ebce5b16653b0bd/lib/modules/hosts) +- [Temp Icon](https://www.flaticon.com/free-icon/mouse_194242) +- [Rust docker build](https://shaneutt.com/blog/rust-fast-small-docker-image-builds/) +- [Zurb mentions](https://github.com/zurb/tribute) +- [TippyJS](https://github.com/atomiks/tippyjs) +- [SQL function indexes](https://sorentwo.com/2013/12/30/let-postgres-do-the-work.html) diff --git a/src/fr/about/guide.md b/src/fr/about/guide.md new file mode 100644 index 0000000..dfd1e49 --- /dev/null +++ b/src/fr/about/guide.md @@ -0,0 +1,57 @@ +# Guide de Lemmy + +Commencez à taper... + +- `@nom_utilisateur` pour obtenir une liste de noms d'utilisateurs. +- `!a_communauté` pour obtenir une liste de communautés. +- `:emoji` pour obtenir une liste d'emojis. + +## Triage + +*Applique aux messages et aux commentaires*. + +Type | Description +--- | --- +Actif | Tendance triée en fonction du score et de l'heure du commentaire le plus récent. +Hot | Tendance de tri basée sur le score et l'heure de création du message. +Nouveau | Les éléments les plus récents. +Plus de commentaires | Les messages avec le plus de commentaires. +Nouveaux commentaires | Les messages avec les commentaires les plus récents, IE un tri de style forum. +Top | Les éléments les mieux notés dans la période donnée. + +Pour plus de détails, consultez le [Classement des messages et des commentaires] (ranking.md). + +## Modération / Administration + +Toutes les actions de modération et d'administration sur les utilisateurs sont effectuées sur les commentaires ou les messages, en cliquant sur l'icône à 3 points "Plus". + +Cela inclut : + +- Ajouter / Supprimer des modérateurs ou des administrateurs. +- Supprimer / Restaurer des commentaires. +- Bannir / Débannir des utilisateurs. + +Toutes les actions d'administration sur les communautés sont effectuées sur la barre latérale de la communauté. Actuellement, cela ne comprend que la suppression et la restauration des communautés. + +## Markdown Guide + +Tapez | ou | ... pour obtenir +--- | --- | --- +\*Italique\* | \_Italique\_ | _Italique_ +\*\*Gras\*\* | \_\_Gras\_\_ | **Gras** +\# Rubrique 1 | Rubrique 1
========= |

Rubrique 1

+\## Rubrique 2 | Rubrique 2
--------- |
Rubrique 2
+\[lien\](http://a.com) | \[lien\]\[1\]

\[1\]: http://b.org | [lien](https://commonmark.org/) +!\[Image\](http://url/a.png) | !\[Image\]\[1\]

\[1\]: http://url/b.jpg | ![Markdown](https://commonmark.org/help/images/favicon.png) +\> Citation en bloc | |
Citation en bloc
+\* Liste
\* Liste
\* Liste | \- Liste
\- Liste
\- Liste
| * Liste
* Liste
* Liste
+1\. Un
2\. Deux
3\. Trois | 1) Un
2) Deux
3) Trois | 1. Une
2. Deux
3. Trois +Règle horizontale
\--- | Règle horizontale
\*\*\* | Règle horizontale

+\`Code Inline\` avec des backticks | |`Code Inline` avec des backticks +\`\`\`
\# bloc de code
print '3 backticks ou'
print 'retrait de 4 espaces'
\`\`\` | ····\# bloc de code
····print '3 backticks ou'
····print 'retrait de 4 espaces' | \# bloc de code
print '3 backticks ou'
print 'retrait de 4 espaces' +::: spoiler caché ou trucs nsfw
*un tas de spoilers ici*
::: | |
spoiler caché ou trucs nsfw

un tas de spoilers ici

+Certains texte \~indice\~ | | Certains texte indice +Quelques texte ^indice^ | | Quelques texte indice + +[Tutoriel CommonMark](https://commonmark.org/help/tutorial/) + diff --git a/src/fr/about/main_screen.png b/src/fr/about/main_screen.png new file mode 100644 index 0000000..5d1f0c3 Binary files /dev/null and b/src/fr/about/main_screen.png differ diff --git a/src/fr/about/rank_algorithm.png b/src/fr/about/rank_algorithm.png new file mode 100644 index 0000000..c8200f9 Binary files /dev/null and b/src/fr/about/rank_algorithm.png differ diff --git a/src/fr/about/ranking.md b/src/fr/about/ranking.md new file mode 100644 index 0000000..bea4d92 --- /dev/null +++ b/src/fr/about/ranking.md @@ -0,0 +1,46 @@ +# Tendances / Chaud / Meilleur algorithme de tri (algorithme de tri) + +## Objectifs + +- Au cours de la journée, les nouveaux messages et les commentaires devraient se trouver en tête de liste, afin de pouvoir être soumis au vote. +- Après un jour ou deux, le facteur temps devrait disparaître. +- Utilisez une échelle logarithmique, car les votes ont tendance à faire boule de neige, et donc les 10 premiers votes sont tout aussi importants que les 100 suivants. + +## Implémentations + +### Reddit + +Ne tient pas compte de la durée de vie du fil de discussion, [ce qui donne aux premiers commentaires un avantage écrasant sur les derniers](https://minimaxir.com/2016/11/first-comment/), l'effet étant encore pire dans les petites communautés. Les nouveaux commentaires sont regroupés au bas du fil de discussion, ce qui a pour effet de tuer la discussion et de faire de chaque fil de discussion une course au commentaire précoce. Cela diminue la qualité de la conversation et récompense les commentaires répétitifs et les spams. + +### Hacker News + +Bien qu'il soit de loin supérieur à l'implémentation de Reddit en ce qui concerne la décroissance des scores dans le temps, l'algorithme de classement de [Hacker News](https://medium.com/hacking-and-gonzo/how-hacker-news-ranking-algorithm-works-1d9b0cf2c08d) n'utilise pas d'échelle logarithmique pour les scores. + +### Lemmy + +Contrebalance l'effet boule de neige des votes au fil du temps avec une échelle logarithmique. Annule l'avantage inhérent aux premiers commentaires tout en garantissant que les votes comptent toujours sur le long terme, sans nuire aux commentaires populaires plus anciens. + +``` +Rank = ScaleFactor * log(Max(1, 3 + Score)) / (Time + 2)^Gravity + +Score = Upvotes - Downvotes +Time = time since submission (in hours) +Gravity = Decay gravity, 1.8 is default +``` +- Lemmy utilise le même algorithme de `Rank` ci-dessus, en deux sortes : `Active`, et `Hot`. + - Actif" utilise les votes du message, et le temps du dernier commentaire (limité à deux jours). + - `Hot` utilise les votes du message, et l'heure de publication du message. +- Utilisez Max(1, score) pour vous assurer que tous les commentaires sont affectés par la dégradation du temps. +- Ajoutez 3 au score, pour que tout ce qui a moins de 3 downvotes semble nouveau. Sinon, tous les nouveaux commentaires resteraient à zéro, près du fond. +- Le signe et l'abs du score sont nécessaires pour traiter le log des scores négatifs. +- Un facteur d'échelle de 10k permet d'obtenir le rang sous forme de nombre entier. + +Un graphique du rang sur 24 heures, des scores de 1, 5, 10, 100, 1000, avec un facteur d'échelle de 10k. + +![](rank_algorithm.png) + +#### Comptage des utilisateurs actifs + +Lemmy affiche également le nombre d'utilisateurs actifs de votre site et de ses communautés. Ceux-ci sont comptés au cours du dernier jour, de la dernière semaine, du dernier mois et des six derniers mois, et sont mis en cache au démarrage de Lemmy, ainsi que toutes les heures. + +Un utilisateur actif est quelqu'un qui a posté ou commenté sur notre instance ou notre communauté au cours de la dernière période donnée. Pour le décompte des sites, seuls les utilisateurs locaux sont comptés. Pour les comptes de la communauté, les utilisateurs fédérés sont inclus. diff --git a/src/fr/administration/administration.md b/src/fr/administration/administration.md new file mode 100644 index 0000000..ee14d73 --- /dev/null +++ b/src/fr/administration/administration.md @@ -0,0 +1,11 @@ +# Infos d'administration + +Informations pour les administrateurs d'une instance Lemmy, et ceux qui veulent faire fonctionner un serveur. + +## Installation + +Lemmy a deux méthodes d'installation principales, [manuellement avec Docker](install_docker.md), et [automatiquement avec Ansible](install_ansible.md). Nous recommandons d'utiliser Ansible, car il simplifie l'installation et facilite les mises à jour. + +## Autres méthodes d'installation + +Dans certains cas, il peut être nécessaire d'utiliser [différentes méthodes d'installation](other_installation_methods.md). Mais nous ne le recommandons pas et ne pouvons pas fournir de support pour ces méthodes. diff --git a/src/fr/administration/backup_and_restore.md b/src/fr/administration/backup_and_restore.md new file mode 100644 index 0000000..0b3666f --- /dev/null +++ b/src/fr/administration/backup_and_restore.md @@ -0,0 +1,77 @@ +# Guide de sauvegarde et de restauration + +## Docker et Ansible + +Lorsque vous utilisez docker ou ansible, il devrait y avoir un dossier `volumes`, qui contient à la fois la base de données, et toutes les images. Copiez ce dossier dans la nouvelle instance pour restaurer vos données. + +### Sauvegarde incrémentale de la base de données + +Pour sauvegarder de manière incrémentielle la base de données dans un fichier `.sql`, vous pouvez exécuter : + +```bash +docker-compose exec postgres pg_dumpall -c -U lemmy > lemmy_dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql +``` +### Un exemple de script de sauvegarde + +```bash +#!/bin/sh +# DB Backup +ssh MY_USER@MY_IP "docker-compose exec postgres pg_dumpall -c -U lemmy" > ~/BACKUP_LOCATION/INSTANCE_NAME_dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql + +# Dossier Volumes Sauvegarde +rsync -avP -zz --rsync-path="sudo rsync" MY_USER@MY_IP:/LEMMY_LOCATION/volumes ~/BACKUP_LOCATION/FOLDERNAME +``` + +### Restauration de la BD + +Si vous avez besoin de restaurer à partir d'un fichier `pg_dumpall`, vous devez d'abord vider votre base de données existante. + +```bash +# Abandon de la BD existante +docker exec -i FOLDERNAME_postgres_1 psql -U lemmy -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;" + +# Restauration à partir de la sauvegarde .sql +cat db_dump.sql | docker exec -i FOLDERNAME_postgres_1 psql -U lemmy # restores the db + +# Cela peut également être nécessaire lors de l'importation d'une base de données avec un mot de passe différent. +docker exec -i FOLDERNAME_postgres_1 psql -U lemmy -c "alter user lemmy with password 'bleh'" +``` + +### Changer votre nom de domaine + +Si vous ne vous êtes pas encore fédéré, vous pouvez changer votre nom de domaine dans la base de données. **Attention : ne faites pas cela après vous être fédéré, ou cela brisera la fédération.** + +Entrez dans `psql` pour votre docker : + +`docker-compose exec postgres psql -U lemmy` + +``` +-- Post +update post set ap_id = replace (ap_id, 'ancien_domaine', 'nouveau_domaine'); +update post set url = replace (url, 'ancien_domaine', 'nouveau_domaine'); +update post set body = replace (body, 'ancien_domaine', 'nouveau_domaine'); +update post set thumbnail_url = replace (thumbnail_url, 'ancien_domaine', 'nouveau_domaine'); + +-- Comments +update comment set ap_id = replace (ap_id, 'ancien_domaine', 'nouveau_domaine'); +update comment set content = replace (content, 'ancien_domaine', 'nouveau_domaine'); + +-- User +update user_ set actor_id = replace (actor_id, 'ancien_domaine', 'nouveau_domaine'); +update user_ set inbox_url = replace (inbox_url, 'ancien_domaine', 'nouveau_domaine'); +update user_ set shared_inbox_url = replace (shared_inbox_url, 'ancien_domaine', 'nouveau_domaine'); +update user_ set avatar = replace (avatar, 'ancien_domaine', 'nouveau_domaine'); + +-- Community +update community set actor_id = replace (actor_id, 'ancien_domaine', 'nouveau_domaine'); +update community set followers_url = replace (followers_url, 'ancien_domaine', 'nouveau_domaine'); +update community set inbox_url = replace (inbox_url, 'ancien_domaine', 'nouveau_domaine'); +update community set shared_inbox_url = replace (shared_inbox_url, 'ancien_domaine', 'nouveau_domaine'); + +``` + +## Plus de ressources + +- https://stackoverflow.com/questions/24718706/backup-restore-a-dockerized-postgresql-database + + diff --git a/src/fr/administration/configuration.md b/src/fr/administration/configuration.md new file mode 100644 index 0000000..22e36bf --- /dev/null +++ b/src/fr/administration/configuration.md @@ -0,0 +1,14 @@ +# Configuration + +La configuration est basée sur le fichier [config.hjson](https://github.com/lemmynet/lemmy/blob/main/config/config.hjson). Ce fichier contient également la documentation de toutes les options disponibles. Les instructions d'installation vous indiquent comment remplacer les valeurs par défaut. + +Le fichier `config.hjson` est situé à `config/config.hjson`. Pour changer l'emplacement par défaut, vous pouvez définir la variable d'environnement `LEMMY_CONFIG_LOCATION`. + +Une variable d'environnement supplémentaire `LEMMY_DATABASE_URL` est disponible, qui peut être utilisée avec une chaîne de connexion PostgreSQL comme `postgres://lemmy:password@lemmy_db:5432/lemmy`, en passant tous les détails de connexion en une fois. + +Si le conteneur Docker n'est pas utilisé, créez manuellement la base de données spécifiée ci-dessus en exécutant les commandes suivantes : + +```bash +cd server +./db-init.sh +``` diff --git a/src/fr/administration/federation_getting_started.md b/src/fr/administration/federation_getting_started.md new file mode 100644 index 0000000..e1bc03e --- /dev/null +++ b/src/fr/administration/federation_getting_started.md @@ -0,0 +1,37 @@ +# Fédération + +Lemmy utilise le protocole ActivityPub (un standard du W3C) pour permettre la fédération entre différents serveurs (souvent appelés instances). Ceci est très similaire à la façon dont le courrier électronique fonctionne. Par exemple, si vous utilisez gmail.com, vous pouvez non seulement envoyer des e-mails à d'autres utilisateurs de gmail.com, mais aussi à yahoo.com, yandex.ru, etc. Le courrier électronique utilise le protocole SMTP pour y parvenir. Vous pouvez donc considérer ActivityPub comme un "SMTP pour les médias sociaux". La quantité d'actions différentes possibles sur les médias sociaux (poster, commenter, aimer, partager, etc.) signifie que ActivityPub est beaucoup plus compliqué que SMTP. + +Comme pour le courrier électronique, la fédération ActivityPub se fait uniquement entre serveurs. Ainsi, si vous êtes enregistré sur `enterprise.lemmy.ml`, vous ne vous connectez qu'à l'API de `enterprise.lemmy.ml`, tandis que le serveur se charge d'envoyer et de recevoir des données d'autres instances (par exemple `voyager.lemmy.ml`). Le grand avantage de cette approche est que l'utilisateur moyen n'a rien à faire pour utiliser la fédération. En fait, si vous utilisez Lemmy, vous l'utilisez probablement déjà. Une façon de le confirmer est d'aller dans une communauté ou un profil d'utilisateur. Si vous êtes sur `enterprise.lemmy.ml` et que vous voyez un utilisateur comme `@nutomic@voyager.lemmy.ml`, ou une communauté comme `!main@ds9.lemmy.ml`, alors ceux-ci sont fédérés, ce qui signifie qu'ils utilisent une instance différente de la vôtre. + +Une façon de profiter de la fédération est d'ouvrir une instance différente, comme `ds9.lemmy.ml`, et de la parcourir. Si vous voyez une communauté, un message ou un utilisateur intéressant avec lequel vous voulez interagir, copiez simplement son URL et collez-la dans la recherche de votre propre instance. Votre instance se connectera à l'autre (en supposant que la liste d'autorisation/de blocage le permette), et vous affichera directement le contenu distant, afin que vous puissiez suivre une communauté ou commenter un message. Voici quelques exemples de recherches qui fonctionnent : + +- `!main@lemmy.ml` (Communauté) +- `@nutomic@lemmy.ml` (Utilisateur) +- `https://lemmy.ml/c/programming` (Communauté) +- `https://lemmy.ml/u/nutomic` (Utilisateur) +- `https://lemmy.ml/post/123` (Publication) +- `https://lemmy.ml/comment/321` (Commentaire) + +Vous pouvez voir la liste des instances liées en suivant le lien "Instances" au bas de n'importe quelle page de Lemmy. + +## Recherche de communautés + +Si vous recherchez une communauté pour la première fois, 20 messages sont récupérés initialement. Ce n'est que si au moins un utilisateur de votre instance s'inscrit à la communauté distante que celle-ci enverra des mises à jour à votre instance. Les mises à jour incluent : + +- Nouveaux messages, commentaires +- Votes +- Modifications et suppressions de messages et de commentaires +- Actions des modérateurs + +Vous pouvez copier l'URL de la communauté depuis la barre d'adresse de votre navigateur et l'insérer dans votre champ de recherche. Attendez quelques secondes, le message apparaîtra ci-dessous. Pour l'instant, il n'y a pas d'indicateur de chargement pour la recherche, donc attendez quelques secondes si elle n'affiche "aucun résultat". + +## Récupération des messages + +Collez l'URL d'un message dans le champ de recherche de votre instance Lemmy. Attendez quelques secondes jusqu'à ce que le message apparaisse. Cette opération permet également de récupérer le profil de la communauté et celui de l'auteur du message. + +## Récupération des commentaires + +Si vous trouvez un commentaire intéressant sous un post sur une autre instance, vous pouvez trouver le symbole d'un lien sous le commentaire dans le menu à 3 points. Copiez ce lien. Il ressemble à `https://lemmy.ml/post/56382/comment/40796`. Enlevez la partie `post/XXX` et mettez-le dans votre barre de recherche. Pour cet exemple, recherchez `https://lemmy.ml/comment/40796`. Ce commentaire, tous les commentaires parents, les utilisateurs, la communauté et le message correspondant sont récupérés depuis l'instance distante, s'ils ne sont pas connus localement. + +Les commentaires parents ne sont pas récupérés ! Si vous voulez plus de commentaires sur des articles plus anciens, vous devez rechercher chacun d'entre eux comme décrit ci-dessus. diff --git a/src/fr/administration/install_ansible.md b/src/fr/administration/install_ansible.md new file mode 100644 index 0000000..e58c46c --- /dev/null +++ b/src/fr/administration/install_ansible.md @@ -0,0 +1,25 @@ +# Installation Ansible + +Ceci est la même chose que l'[installation Docker](install_docker.md), sauf qu'Ansible s'occupe de tout automatiquement. Il fait aussi des choses supplémentaires comme la configuration de TLS et de l'email pour votre instance Lemmy. + +Tout d'abord, vous devez [installer Ansible sur votre ordinateur local](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html). Vous devez également installer le [Docker SDK pour Python](https://pypi.org/project/docker/) en utilisant `pip install docker` ([plus d'informations dans la documentation Ansible](https://docs.ansible.com/ansible/latest/collections/community/docker/docker_compose_module.html#id4)). + +Exécutez ensuite les commandes suivantes sur votre ordinateur local : + +```bash +git clone https://github.com/LemmyNet/lemmy.git +cd lemmy/ansible/ +cp inventory.example inventory +nano inventory # entrez votre serveur, domaine, email de contact +# Si la commande ci-dessous échoue, vous devrez peut-être décommenter cette ligne +# Dans le fichier ansible.cfg : +# interpreter_python=/usr/bin/python3 +ansible-playbook lemmy.yml --become +``` + +Pour mettre à jour une nouvelle version, il suffit d'exécuter la commande suivante dans votre dépôt Lemmy local : +```bash +git pull origin main +cd ansible +ansible-playbook lemmy.yml --become +``` diff --git a/src/fr/administration/install_docker.md b/src/fr/administration/install_docker.md new file mode 100644 index 0000000..3163ed0 --- /dev/null +++ b/src/fr/administration/install_docker.md @@ -0,0 +1,55 @@ +# Installation de Docker + +Assurez-vous que vous avez à la fois docker et docker-compose(>=`1.24.0`) installés. Sur Ubuntu, exécutez simplement `apt install docker-compose docker.io`. Suivant, + +```bash +# créez un dossier pour les fichiers lemmy. l'emplacement n'a pas d'importance, vous pouvez le mettre où vous voulez +mkdir /lemmy +cd /lemmy + +# télécharger les fichiers de configuration par défaut +wget https://raw.githubusercontent.com/LemmyNet/lemmy/main/docker/prod/docker-compose.yml +wget https://raw.githubusercontent.com/LemmyNet/lemmy/main/docker/lemmy.hjson +wget https://raw.githubusercontent.com/LemmyNet/lemmy/main/docker/iframely.config.local.js + +# Définir les permissions correctes pour le dossier pictrs +mkdir -p volumes/pictrs +sudo chown -R 991:991 volumes/pictrs +``` + +Ouvrez votre `docker-compose.yml`, et assurez-vous que `LEMMY_EXTERNAL_HOST` pour `lemmy-ui` est réglé sur votre hôte correct. + +``` +- LEMMY_INTERNAL_HOST=lemmy:8536 +- LEMMY_EXTERNAL_HOST=votre-domaine.com +- LEMMY_HTTPS=false +``` + +Si vous souhaitez un mot de passe différent pour la base de données, vous devez également le changer dans le fichier `docker-compose.yml` **avant** votre première exécution. + +Après cela, jetez un oeil au [fichier de configuration](configuration.md) nommé `lemmy.hjson`, et ajustez-le, en particulier le nom d'hôte, et éventuellement le mot de passe de la base de données. Puis lancez : + +`docker-compose up -d` + +Vous pouvez accéder au lemmy-ui à l'adresse `http://localhost:1235`. + +Pour rendre Lemmy disponible en dehors du serveur, vous devez configurer un proxy inverse, comme Nginx. Un exemple de configuration de Nginx (https://raw.githubusercontent.com/LemmyNet/lemmy/main/ansible/templates/nginx.conf), peut être configuré avec : + +```bash +wget https://raw.githubusercontent.com/LemmyNet/lemmy/main/ansible/templates/nginx.conf +# Remplacer les {{ variables}} +# Le lemmy_port par défaut est 8536 +# Le lemmy_ui_port par défaut est 1235 +sudo mv nginx.conf /etc/nginx/sites-enabled/lemmy.conf +``` + +Vous devrez également configurer TLS, par exemple avec [Let's Encrypt](https://letsencrypt.org/). Après cela, vous devez redémarrer Nginx pour recharger la configuration. + +## Mise à jour + +Pour mettre à jour la dernière version, vous pouvez changer manuellement la version dans `docker-compose.yml`. Alternativement, récupérez la dernière version depuis notre dépôt git : + +```bash +wget https://raw.githubusercontent.com/LemmyNet/lemmy/main/docker/prod/docker-compose.yml +docker-compose up -d +``` diff --git a/src/fr/administration/other_installation_methods.md b/src/fr/administration/other_installation_methods.md new file mode 100644 index 0000000..4d3f102 --- /dev/null +++ b/src/fr/administration/other_installation_methods.md @@ -0,0 +1,15 @@ +# Autres méthodes d'installation + +Disclaimer : ces méthodes d'installation ne sont pas recommandées par les développeurs de Lemmy. Si vous rencontrez des problèmes, vous devez les résoudre vous-même ou demander aux auteurs respectifs. Si vous remarquez des bugs de Lemmy sur une instance installée de cette manière, veuillez le mentionner dans le rapport de bug. + +## Installation de Lemmy sans Docker + +Instructions pour installer Lemmy nativement, sans s'appuyer sur Docker. + +[https://lemmy.ca/post/1066](https://lemmy.ca/post/1066) + +## Installation sur Amazon Web Services (AWS) + +Ce document contient les définitions de l'infrastructure nécessaire pour déployer Lemmy sur [AWS](https://aws.amazon.com/) à l'aide de leur [Cloud Development Kit](https://docs.aws.amazon.com/cdk/latest/guide/home.html). + +[https://github.com/jetbridge/lemmy-cdk](https://github.com/jetbridge/lemmy-cdk) diff --git a/src/fr/administration/troubleshooting.md b/src/fr/administration/troubleshooting.md new file mode 100644 index 0000000..6958c44 --- /dev/null +++ b/src/fr/administration/troubleshooting.md @@ -0,0 +1,65 @@ +# Dépannage + +Différents problèmes qui peuvent survenir sur une nouvelle instance, et comment les résoudre. + +De nombreuses fonctionnalités de Lemmy dépendent d'une configuration correcte du reverse proxy. Assurez-vous que la vôtre est équivalente à notre [configuration nginx](https://github.com/LemmyNet/lemmy/blob/main/ansible/templates/nginx.conf). + +## Général + +### Logs + +Pour les problèmes frontaux, vérifiez la [console du navigateur](https://webmasters.stackexchange.com/a/77337) pour tout message d'erreur. + +Pour les logs du serveur, exécutez `docker-compose logs -f lemmy` dans votre dossier d'installation. Vous pouvez aussi faire `docker-compose logs -f lemmy lemmy-ui pictrs` pour obtenir les logs de différents services. + +Si cela ne donne pas assez d'informations, essayez de changer la ligne `RUST_LOG=error` dans `docker-compose.yml` en `RUST_LOG=info` ou `RUST_LOG=verbose`, puis faites `docker-compose restart lemmy`. + +### La création de l'utilisateur admin ne fonctionne pas + +Assurez-vous que le websocket fonctionne correctement, en vérifiant les erreurs dans la console du navigateur. Dans nginx, les en-têtes suivants sont importants pour cela : + +``` +proxy_http_version 1.1; +proxy_set_header Upgrade $http_upgrade; +proxy_set_header Connection "upgrade"; +``` + +### Erreur de limite de débit lorsque de nombreux utilisateurs accèdent au site + +Vérifiez que les en-têtes `X-Real-IP` et `X-Forwarded-For` sont envoyés à Lemmy par le reverse proxy. Sinon, il comptabilisera toutes les actions dans la limite de débit de l'IP du reverse proxy. Dans nginx, cela devrait ressembler à ceci : + +``` +proxy_set_header X-Real-IP $remote_addr; +proxy_set_header Host $host; +proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +``` + +## Fédération + +### Les autres instances ne peuvent pas récupérer les objets locaux (communauté, post, etc) + +Votre reverse proxy (par exemple nginx) doit transmettre les requêtes avec l'en-tête `Accept : application/activity+json` au backend. Ceci est géré par les lignes suivantes : + +``` +set $proxpass "http://0.0.0.0:{{ lemmy_ui_port }}"; +if ($http_accept = "application/activity+json") { +set $proxpass "http://0.0.0.0:{{ lemmy_port }}"; +} +if ($http_accept = "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") { +set $proxpass "http://0.0.0.0:{{ lemmy_port }}"; +} +proxy_pass $proxpass; +``` + +Vous pouvez vérifier qu'il fonctionne correctement en exécutant les commandes suivantes, qui devraient toutes renvoyer un JSON valide : +``` +curl -H "Accept: application/activity+json" https://your-instance.com/u/some-local-user +curl -H "Accept: application/activity+json" https://your-instance.com/c/some-local-community +curl -H "Accept: application/activity+json" https://your-instance.com/post/123 # the id of a local post +curl -H "Accept: application/activity+json" https://your-instance.com/comment/123 # the id of a local comment +``` +### La récupération d'objets distants fonctionne, mais la publication/le commentaire dans les communautés distantes échoue. + +Vérifiez que [la fédération est autorisée sur les deux instances](../federation/administration.md#instance-allowlist-and-blocklist). + +Assurez-vous également que l'heure est correctement réglée sur votre serveur. Les activités sont signées avec un horodatage et seront rejetées si l'écart est supérieur à 10 secondes. diff --git a/src/fr/client_development/api_reference.md b/src/fr/client_development/api_reference.md new file mode 100644 index 0000000..f6436c0 --- /dev/null +++ b/src/fr/client_development/api_reference.md @@ -0,0 +1,49 @@ +# API reference + +Lemmy has two, intertwined APIs: +- [WebSocket](https://join.lemmy.ml/api/index.html) +- [HTTP](http_api.md) + +This page describes concepts that are common to both. + + + +- [Basic usage](#basic-usage) +- [Data types](#data-types) + * [Lemmy types](#lemmy-types) + * [Lower-level types](#lower-level-types) +- [Default rate limits](#default-rate-limits) + + + +## Basic usage + +Request and response strings are in [JSON format](https://www.json.org). + +## Data types + +### Lemmy types + +- [Source tables, that have the columns / fields](https://github.com/LemmyNet/lemmy-js-client/blob/main/src/interfaces/source.ts) +- [Aggregates (for things like scores)](https://github.com/LemmyNet/lemmy-js-client/blob/main/src/interfaces/aggregates.ts) +- [Views - The main lemmy return types](https://github.com/LemmyNet/lemmy-js-client/blob/main/src/interfaces/views.ts) +- [Request Forms / Responses are in this folder](https://github.com/LemmyNet/lemmy-js-client/tree/main/src/interfaces/api) + +### Lower-level types + +- `?` designates an option which may be omitted in requests and not be present in responses. It will be of type ***SomeType***. +- `[SomeType]` is a list which contains objects of type ***SomeType***. +- Times and dates are timestamp strings in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. Timestamps will be UTC, your client must do the UTC to local conversion. + +## Default rate limits + +These can be edited in your `lemmy.hjson` file, by copying the relevant section from [defaults.hjson](https://github.com/LemmyNet/lemmy/blob/main/config/defaults.hjson). + +- 3 per hour for signups and community creation. +- 6 per hour for image posting. +- 6 per 10 minutes for post creation. +- 180 actions per minute for post voting and comment creation. + +Everything else is not rate-limited. + +**See also:** [rate limiting for custom front-ends](custom_frontend.md#rate-limiting). diff --git a/src/fr/client_development/client_development.md b/src/fr/client_development/client_development.md new file mode 100644 index 0000000..a5e6fef --- /dev/null +++ b/src/fr/client_development/client_development.md @@ -0,0 +1,6 @@ +# Client Development + +- [Theming Guide](client_development/theming.md) +- [API reference](client_development/api_reference.md) +- [WebSocket API](https://join.lemmy.ml/api/index.html) +- [HTTP API](client_development/http_api.md) \ No newline at end of file diff --git a/src/fr/client_development/custom_frontend.md b/src/fr/client_development/custom_frontend.md new file mode 100644 index 0000000..62c8fda --- /dev/null +++ b/src/fr/client_development/custom_frontend.md @@ -0,0 +1,66 @@ +# Creating a Custom Frontend + +The backend and frontend are completely decoupled, and run in independent Docker containers. They only communicate over the [Lemmy API](api_reference.md), which makes it quite easy to write alternative frontends. + +This creates a lot of potential for custom frontends, which could change much of the design and user experience of Lemmy. For example, it would be possible to create a frontend in the style of a traditional forum like [phpBB](https://www.phpbb.com/), or a question-and-answer site like [stackoverflow](https://stackoverflow.com/). All without having to think about database queries, authentification or ActivityPub, which you essentially get for free. + +## Development + +You can use any language to create a custom frontend. The easiest option would be forking our [official frontend](https://github.com/LemmyNet/lemmy-ui), [lemmy-lite](https://github.com/IronOxidizer/lemmy-lite), or the [lemmy-frontend-example](https://github.com/LemmyNet/lemmy-front-end-example). In any case, the principle is the same: bind to `LEMMY_EXTERNAL_HOST` (default: `localhost:8536`) and handle requests using the Lemmy API at `LEMMY_INTERNAL_HOST` (default: `lemmy:8536`). Also use `LEMMY_HTTPS` to generate links with the correct protocol. + +The next step is building a Docker image from your frontend. If you forked an existing project, it should already include a `Dockerfile` and instructions to build it. Otherwise, try searching for your language on [dockerhub](https://hub.docker.com/), official images usually have build instructions in their readme. Build a Docker image with a tag, then look for the following section in `docker/dev/docker-compose.yml`: + +``` + lemmy-ui: + image: dessalines/lemmy-ui:v0.8.10 + ports: + - "1235:1234" + restart: always + environment: + - LEMMY_INTERNAL_HOST=lemmy:8536 + - LEMMY_EXTERNAL_HOST=localhost:8536 + - LEMMY_HTTPS=false + depends_on: + - lemmy +``` + +All you need to do is replace the value for `image` with the tag of your own Docker image (and possibly the environment variables if you need different ones). Then run `./docker_update.sh`, and after compilation, your frontend will be available on `http://localhost:1235`. You can also make the same change to `docker/federation/docker-compose.yml` and run `./start-local-instances.bash` to test federation with your frontend. + +## Deploy with Docker + +After building the Docker image, you need to push it to a Docker registry (such as [dockerhub](https://hub.docker.com/)). Then update the `docker-compose.yml` on your server, replacing the `image` for `lemmy-ui`, just as described above. Run `docker-compose.yml`, and after a short wait, your instance will use the new frontend. + +Note, if your instance is deployed with Ansible, it will override `docker-compose.yml` with every run, reverting back to the default frontend. In that case you should copy the `ansible/` folder from this project to your own repository, and adjust `docker-compose.yml` directly in the repo. + +It is also possible to use multiple frontends for the same Lemmy instance, either using subdomains or subfolders. To do that, don't edit the `lemmy-ui` section in `docker-compose.yml`, but duplicate it, adjusting the name, image and port so they are distinct for each. Then edit your nginx config to pass requests to the appropriate frontend, depending on the subdomain or path. + +## Translations + +You can add the [lemmy-translations](https://github.com/LemmyNet/lemmy-translations) repository to your project as a [git submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules). That way you can take advantage of same translations used in the official frontend, and you will also receive new translations contributed via weblate. + +## Rate limiting + +Lemmy does rate limiting for many actions based on the client IP. But if you make any API calls on the server side (eg in the case of server-side rendering, or javascript pre-rendering), Lemmy will take the IP of the Docker container. Meaning that all requests come from the same IP, and get rate limited much earlier. To avoid this problem, you need to pass the headers `X-REAL-IP` and `X-FORWARDED-FOR` on to Lemmy (the headers are set by our nginx config). + +Here is an example snipped for NodeJS: + +```javascript +function setForwardedHeaders( + headers: IncomingHttpHeaders +): { [key: string]: string } { + let out = { + host: headers.host, + }; + if (headers['x-real-ip']) { + out['x-real-ip'] = headers['x-real-ip']; + } + if (headers['x-forwarded-for']) { + out['x-forwarded-for'] = headers['x-forwarded-for']; + } + + return out; +} + +let headers = setForwardedHeaders(req.headers); +let client = new LemmyHttp(httpUri, headers); +``` \ No newline at end of file diff --git a/src/fr/client_development/http_api.md b/src/fr/client_development/http_api.md new file mode 100644 index 0000000..f75e7e6 --- /dev/null +++ b/src/fr/client_development/http_api.md @@ -0,0 +1,116 @@ +# Lemmy HTTP API + + + + +- [Websocket vs HTTP API](#websocket-vs-http-api) +- [Examples](#examples) + * [TypeScript](#typescript) + * [Curl](#curl) + + [GET](#get-example) + + [POST](#post-example) +- [HTTP API exclusive features](#http-api-exclusive-features) + * [RSS/Atom feeds](#rss-atom-feeds) + * [Images](#images) + + [Create (request)](#create-request) + + [Create (response)](#create-response) + * [Delete](#delete) + + + +## WebSocket vs HTTP API +Lemmy's HTTP API is almost identical to its WebSocket API: +- **WebSocket API** needs `let send = { op: userOperation[op], data: form}` as shown in [the WebSocketAPI specification](https://join.lemmy.ml/api/index.html) +- **HTTP API** needs the form (data) at the top level, an HTTP operation (GET, PUT or POST) and endpoint (at `http(s)://host/api/v2/endpoint`). For example: + +> `POST {username_or_email: X, password: X}` + +For more information, see the [http.ts](https://github.com/LemmyNet/lemmy-js-client/blob/main/src/http.ts) file. + +[The WebSocket API](https://join.lemmy.ml/api/index.html) should be regarded as the primary source for the HTTP API since it also provides information about how to form HTTP API calls. + +## Examples + +### TypeScript + +```ts + async editComment(form: EditComment): Promise { + return this.wrapper(HttpType.Put, '/comment', form); + } +``` + +| Type | URL | Body type | Return type | +| --- | --- | --- | --- | +| `PUT` | `/comment` | `EditComment` | `CommentResponse` | + +### Curl + +**GET example** + +``` +curl "http://localhost:8536/api/v2/community/list?sort=Hot"` +``` + +**POST example** + +``` +curl -i -H \ +"Content-Type: application/json" \ +-X POST \ +-d '{ + "comment_id": 374, + "score": 1, + "auth": eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MiwiaXNzIjoidGVzdC5sZW1teS5tbCJ9.P77RX_kpz1a_geY5eCp29sl_5mAm-k27Cwnk8JcIZJk +}' \ +http://localhost:8536/api/v2/comment/like +``` + +## HTTP API exclusive features + +These features cannot be accessed from the WebSocket API: + +- [RSS/Atom feeds](#rss-atom-feeds) +- [Images](#images) + +### RSS/Atom feeds + +- All - `/feeds/all.xml?sort=Hot` +- Community - `/feeds/c/community-name.xml?sort=Hot` +- User - `/feeds/u/user-name.xml?sort=Hot` + +### Images + +Lemmy forwards image requests to a locally running Pictrs. + +`GET /pictrs/image/{filename}?format={webp, jpg, ...}&thumbnail={96}` + +*Format and thumbnail are optional.* + +#### Create (request) + +Uploaded content must be valid multipart/form-data with an image array located within the images[] key. + +`POST /pictrs/image` + +#### Create (response) + +``` +{ + "files": [ + { + "delete_token": "{token}", + "file": "{file}.jpg" + } + ], + "msg": "ok" +} +``` + +#### Delete + +`GET /pictrs/image/delete/{delete_token}/{file}` + + +# Note + +This documentation may lag behind the actual [API endpoints](https://github.com/LemmyNet/lemmy-js-client/blob/main/src/http.ts) and the API itself should be considered unstable (since it may change at any time). diff --git a/src/fr/client_development/theming.md b/src/fr/client_development/theming.md new file mode 100644 index 0000000..2610b5f --- /dev/null +++ b/src/fr/client_development/theming.md @@ -0,0 +1,19 @@ +# Theming Guide + +Lemmy uses [Bootstrap v4](https://getbootstrap.com/), and very few custom css classes, so any bootstrap v4 compatible theme should work fine. + +## Creating + +- Use a tool like [bootstrap.build](https://bootstrap.build/) to create a bootstrap v4 theme. Export the `bootstrap.min.css` once you're done, and save the `_variables.scss` too. + +## Testing + +- To test out a theme, you can either use your browser's web tools, or a plugin like stylus to copy-paste a theme, when viewing Lemmy. + +## Adding + +1. Fork the [lemmy-ui](https://github.com/LemmyNet/lemmy-ui). +1. Copy `{my-theme-name}.min.css` to `src/assets/css/themes`. (You can also copy the `_variables.scss` here if you want). +1. Go to `src/shared/utils.ts` and add `{my-theme-name}` to the themes list. +1. Test locally +1. Do a pull request with those changes. diff --git a/src/fr/code_of_conduct.md b/src/fr/code_of_conduct.md new file mode 100644 index 0000000..e399fcd --- /dev/null +++ b/src/fr/code_of_conduct.md @@ -0,0 +1,35 @@ +# Code of Conduct + +- We are committed to providing a friendly, safe and welcoming environment for all, regardless of level of experience, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, nationality, or other similar characteristic. +- Please avoid using overtly sexual aliases or other nicknames that might detract from a friendly, safe and welcoming environment for all. +- Please be kind and courteous. There’s no need to be mean or rude. +- Respect that people have differences of opinion and that every design or implementation choice carries a trade-off and numerous costs. There is seldom a right answer. +- Please keep unstructured critique to a minimum. If you have solid ideas you want to experiment with, make a fork and see how it works. +- We will exclude you from interaction if you insult, demean or harass anyone. That is not welcome behavior. We interpret the term “harassment” as including the definition in the [Citizen Code of Conduct](https://github.com/stumpsyn/policies/blob/master/citizen_code_of_conduct.md); if you have any lack of clarity about what might be included in that concept, please read their definition. In particular, we don’t tolerate behavior that excludes people in socially marginalized groups. +- Private harassment is also unacceptable. No matter who you are, if you feel you have been or are being harassed or made uncomfortable by a community member, please contact one of the channel ops or any of the Lemmy moderation team immediately. Whether you’re a regular contributor or a newcomer, we care about making this community a safe place for you and we’ve got your back. +- Likewise any spamming, trolling, flaming, baiting or other attention-stealing behavior is not welcome. + +[**Message the Moderation Team on Mastodon**](https://mastodon.social/@LemmyDev) + +[**Email The Moderation Team**](mailto:contact@lemmy.ml) + +## Moderation + +These are the policies for upholding our community’s standards of conduct. If you feel that a thread needs moderation, please contact the Lemmy moderation team . + +1. Remarks that violate the Lemmy standards of conduct, including hateful, hurtful, oppressive, or exclusionary remarks, are not allowed. (Cursing is allowed, but never targeting another user, and never in a hateful manner.) +2. Remarks that moderators find inappropriate, whether listed in the code of conduct or not, are also not allowed. +3. Moderators will first respond to such remarks with a warning, at the same time the offending content will likely be removed whenever possible. +4. If the warning is unheeded, the user will be “kicked,” i.e., kicked out of the communication channel to cool off. +5. If the user comes back and continues to make trouble, they will be banned, i.e., indefinitely excluded. +6. Moderators may choose at their discretion to un-ban the user if it was a first offense and they offer the offended party a genuine apology. +7. If a moderator bans someone and you think it was unjustified, please take it up with that moderator, or with a different moderator, in private. Complaints about bans in-channel are not allowed. +8. Moderators are held to a higher standard than other community members. If a moderator creates an inappropriate situation, they should expect less leeway than others. + +In the Lemmy community we strive to go the extra step to look out for each other. Don’t just aim to be technically unimpeachable, try to be your best self. In particular, avoid flirting with offensive or sensitive issues, particularly if they’re off-topic; this all too often leads to unnecessary fights, hurt feelings, and damaged trust; worse, it can drive people away from the community entirely. + +And if someone takes issue with something you said or did, resist the urge to be defensive. Just stop doing what it was they complained about and apologize. Even if you feel you were misinterpreted or unfairly accused, chances are good there was something you could’ve communicated better — remember that it’s your responsibility to make others comfortable. Everyone wants to get along and we are all here first and foremost because we want to talk about cool technology. You will find that people will be eager to assume good intent and forgive as long as you earn their trust. + +The enforcement policies listed above apply to all official Lemmy venues; including git repositories under [github.com/LemmyNet](https://github.com/LemmyNet) and [yerbamate.ml/LemmyNet](https://yerbamate.ml/LemmyNet), the [Matrix channel](https://matrix.to/#/!BZVTUuEiNmRcbFeLeI:matrix.org); [lemmy.ml](https://lemmy.ml) and other instances under that domain. For other projects adopting the Lemmy Code of Conduct, please contact the maintainers of those projects for enforcement. If you wish to use this code of conduct for your own project, consider explicitly mentioning your moderation policy or making a copy with your own moderation policy so as to avoid confusion. + +Adapted from the [Rust Code of Conduct](https://www.rust-lang.org/policies/code-of-conduct), which is based on the [Node.js Policy on Trolling](http://blog.izs.me/post/30036893703/policy-on-trolling) as well as the [Contributor Covenant v1.3.0](https://www.contributor-covenant.org/version/1/3/0/). diff --git a/src/fr/contributing/contributing.md b/src/fr/contributing/contributing.md new file mode 100644 index 0000000..92a363e --- /dev/null +++ b/src/fr/contributing/contributing.md @@ -0,0 +1,40 @@ +# Contributing + +Information about contributing to Lemmy, whether it is translating, testing, designing or programming. + +## Issue tracking / Repositories + +- [GitHub (for issues and pull requests)](https://github.com/LemmyNet/lemmy) +- [Gitea (only for pull requests)](https://yerbamate.ml/LemmyNet/lemmy) +- [Codeberg](https://codeberg.org/LemmyNet/lemmy) + +## Translating + +Check out [Lemmy's Weblate](https://weblate.yerbamate.ml/projects/lemmy/) for translations. You can also help by [translating this documentation](https://github.com/LemmyNet/lemmy-docs#adding-a-new-language). + + +## Architecture + +### Front end + +- The front end is written in `typescript`, using a react-like framework called [inferno](https://infernojs.org/). All UI elements are reusable `.tsx` components. +- The front end repository is [lemmy-ui](https://github.com/LemmyNet/lemmy-ui). +- The routes are at `src/shared/routes.ts`. +- The components are located in `src/shared/components`. + +### Back end + +- The back end is written in `rust`, using `diesel`, and `actix`. +- The server source code is split into main sections in `src`. These include: + - `db` - The low level database actions. + - Database additions are done using diesel migrations. Run `diesel migration generate xxxxx` to add new things. + - `api` - The high level user interactions (things like `CreateComment`) + - `routes` - The server endpoints . + - `apub` - The activitypub conversions. + - `websocket` - Creates the websocket server. + +## Linting / Formatting + +- Every front and back end commit is automatically formatted then linted using `husky`, and `lint-staged`. +- Rust with `cargo fmt` and `cargo clippy`. +- Typescript with `prettier` and `eslint`. diff --git a/src/fr/contributing/docker_development.md b/src/fr/contributing/docker_development.md new file mode 100644 index 0000000..ee035dd --- /dev/null +++ b/src/fr/contributing/docker_development.md @@ -0,0 +1,32 @@ +# Docker Development + +## Dependencies (on Ubuntu) + +```bash +sudo apt install git docker-compose +sudo systemctl start docker +git clone https://github.com/LemmyNet/lemmy +``` + +## Running + +```bash +cd docker/dev +./docker_update.sh +``` + +and go to http://localhost:1235. + +*Note: many features (like docs and pictures) will not work without using an nginx profile like that in `ansible/templates/nginx.conf`. + +To speed up the Docker compile, add the following to `/etc/docker/daemon.json` and restart Docker. +``` +{ + "features": { + "buildkit": true + } +} +``` + +If the build is still too slow, you will have to use a +[local build](local_development.md) instead. diff --git a/src/fr/contributing/federation_development.md b/src/fr/contributing/federation_development.md new file mode 100644 index 0000000..fd625d6 --- /dev/null +++ b/src/fr/contributing/federation_development.md @@ -0,0 +1,69 @@ +# Federation Development + +## Running locally + +Install the dependencies as described in [Docker development](docker_development.md). Then run the following + +```bash +cd docker/federation +./start-local-instances.bash +``` + +The federation test sets up 5 instances: + +Instance | Username | Location | Notes +--- | --- | --- | --- +lemmy-alpha | lemmy_alpha | [127.0.0.1:8540](http://127.0.0.1:8540) | federated with all other instances +lemmy-beta | lemmy_beta | [127.0.0.1:8550](http://127.0.0.1:8550) | federated with all other instances +lemmy-gamma | lemmy_gamma | [127.0.0.1:8560](http://127.0.0.1:8560) | federated with all other instances +lemmy-delta | lemmy_delta | [127.0.0.1:8570](http://127.0.0.1:8570) | only allows federation with lemmy-beta +lemmy-epsilon | lemmy_epsilon | [127.0.0.1:8580](http://127.0.0.1:8580) | uses blocklist, has lemmy-alpha blocked + +You can log into each using the instance name, and `lemmy` as the password, IE (`lemmy_alpha`, `lemmy`). + +To start federation between instances, visit one of them and search for a user, community or post, like this. Note that +the Lemmy backend runs on a different port than the frontend, so you have to increment the port number from +the URL bar by one. +- `!main@lemmy-alpha:8541` +- `http://lemmy-beta:8551/post/3` +- `@lemmy-gamma@lemmy-gamma:8561` + +Firefox containers are a good way to test them interacting. + +## Running on a server + +Note that federation is currently in alpha. **Only use it for testing**, not on any production server, and be aware that turning on federation may break your instance. + +Follow the normal installation instructions, either with [Ansible](../administration/install_ansible.md) or +[manually](../administration/install_docker.md). Then replace the line `image: dessalines/lemmy:v0.x.x` in +`/lemmy/docker-compose.yml` with `image: dessalines/lemmy:federation`. Also add the following in +`/lemmy/lemmy.hjson`: + +``` + federation: { + enabled: true + tls_enabled: true, + allowed_instances: example.com, + } +``` + +Afterwards, and whenever you want to update to the latest version, run these commands on the server: + +``` +cd /lemmy/ +sudo docker-compose pull +sudo docker-compose up -d +``` + +## Security Model + +- HTTP signature verify: This ensures that activity really comes from the activity that it claims +- check_is_apub_valid : Makes sure its in our allowed instances list +- Lower level checks: To make sure that the user that creates/updates/removes a post is actually on the same instance as that post + +For the last point, note that we are *not* checking whether the actor that sends the create activity for a post is +actually identical to the post's creator, or that the user that removes a post is a mod/admin. These things are checked +by the API code, and its the responsibility of each instance to check user permissions. This does not leave any attack +vector, as a normal instance user cant do actions that violate the API rules. The only one who could do that is the +admin (and the software deployed by the admin). But the admin can do anything on the instance, including send activities +from other user accounts. So we wouldnt actually gain any security by checking mod permissions or similar. \ No newline at end of file diff --git a/src/fr/contributing/local_development.md b/src/fr/contributing/local_development.md new file mode 100644 index 0000000..4cee134 --- /dev/null +++ b/src/fr/contributing/local_development.md @@ -0,0 +1,85 @@ +### Install build requirements +#### Ubuntu +``` +sudo apt install git cargo libssl-dev pkg-config libpq-dev yarn curl gnupg2 espeak +# install yarn +curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - +echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list +sudo apt update && sudo apt install yarn +``` + +#### macOS + +Install Rust using [the recommended option on rust-lang.org](https://www.rust-lang.org/tools/install) (rustup). + +Then, install [Homebrew](https://brew.sh/) if you don't already have it installed. + +Finally, install Node and Yarn. + +``` +brew install node yarn +``` + +### Get the back end source code +``` +git clone https://github.com/LemmyNet/lemmy.git +# or alternatively from gitea +# git clone https://yerbamate.ml/LemmyNet/lemmy.git +``` + +### Build the backend (Rust) +``` +cargo build +# for development, use `cargo check` instead) +``` + +### Get the front end source code +``` +git clone https://github.com/LemmyNet/lemmy-ui.git --recurse-submodules +``` + +### Setup postgresql +#### Ubuntu +``` +sudo apt install postgresql +sudo systemctl start postgresql + +# Either execute db-init.sh, or manually initialize the postgres database: +sudo -u postgres psql -c "create user lemmy with password 'password' superuser;" -U postgres +sudo -u postgres psql -c 'create database lemmy with owner lemmy;' -U postgres +export LEMMY_DATABASE_URL=postgres://lemmy:password@localhost:5432/lemmy +``` + +#### macOS +``` +brew install postgresql +brew services start postgresql +/usr/local/opt/postgres/bin/createuser -s postgres + +# Either execute db-init.sh, or manually initialize the postgres database: +psql -c "create user lemmy with password 'password' superuser;" -U postgres +psql -c 'create database lemmy with owner lemmy;' -U postgres +export LEMMY_DATABASE_URL=postgres://lemmy:password@localhost:5432/lemmy +``` + +### Run a local development instance +``` +cd lemmy +cargo run +``` + +Then open [localhost:1235](http://localhost:1235) in your browser. To reload back-end changes, you will have to rerun `cargo run`. You can use `cargo check` as a faster way to find compilation errors. + +To do front end development: + +``` +cd lemmy-ui +yarn +yarn dev +``` + +and go to [localhost:1234](http://localhost:1234). Front end saves should rebuild the project. + +Note that this setup doesn't include image uploads or link previews (provided by pict-rs and +iframely respectively). If you want to test those, you should use the +[Docker development](docker_development.md). diff --git a/src/fr/contributing/tests.md b/src/fr/contributing/tests.md new file mode 100644 index 0000000..8f57cb8 --- /dev/null +++ b/src/fr/contributing/tests.md @@ -0,0 +1,29 @@ +### Tests + +#### Rust + +After installing [local development dependencies](local_development.md), run the +following commands: + +```bash +psql -U lemmy -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;" +./test.sh +``` + +### Federation + +Install the [Local development dependencies](local_development.md), and add the following lines to `/etc/hosts`: + +``` +127.0.0.1 lemmy-alpha +127.0.0.1 lemmy-beta +127.0.0.1 lemmy-gamma +127.0.0.1 lemmy-delta +127.0.0.1 lemmy-epsilon +``` + +Then use the following script to run the tests: +``` +cd api_tests +./run-federation-test.bash +``` diff --git a/src/fr/federation/administration.md b/src/fr/federation/administration.md new file mode 100644 index 0000000..d1024fa --- /dev/null +++ b/src/fr/federation/administration.md @@ -0,0 +1,28 @@ +# Administration de la fédération + +Note : La fédération ActivityPub est encore en cours de développement. Nous vous recommandons de ne l'activer que sur les instances de test pour le moment. + +Pour activer la fédération, changez le paramètre `federation.enabled` en `true` dans `lemmy.hjson`, et redémarrez Lemmy. + +La fédération ne démarre pas automatiquement, mais doit être déclenchée manuellement par la recherche. Pour ce faire, vous devez entrer une référence à un objet distant, tel que : + +- `!main@lemmy.ml` (Communauté) +- `@nutomic@lemmy.ml` (Utilisateur) +- `https://lemmy.ml/c/programming` (Communauté) +- `https://lemmy.ml/u/nutomic` (Utilisateur) +- `https://lemmy.ml/post/123` (Publication) +- `https://lemmy.ml/comment/321` (Commentaire) + +Pour un aperçu du fonctionnement technique de la fédération dans Lemmy, consultez notre [Aperçu de la fédération](contributing_federation_overview.md). + +## Allowlist et blocklist de l'instance + +La section fédération de la configuration de Lemmy a deux variables `allowed_instances` et `blocked_instances`. Celles-ci contrôlent avec quelles autres instances Lemmy va se fédérer. Les deux paramètres prennent une liste de domaines séparés par des virgules, par exemple `lemmy.ml,exemple.com`. Vous pouvez modifier ces paramètres soit via `/admin`, soit directement sur le système de fichiers du serveur. + +Il est important de noter que ces paramètres n'affectent que l'envoi et la réception de données entre les instances. Si vous autorisez la fédération avec une certaine instance, puis la supprimez de la liste d'autorisation, cela n'affectera pas les données fédérées précédemment. Ces communautés, utilisateurs, messages et commentaires seront toujours affichés. Ils ne seront simplement plus mis à jour. Et même si une instance est bloquée, elle peut toujours récupérer et afficher les données publiques de votre instance. + +Par défaut, les valeurs `allowed_instances` et `blocked_instances` sont vides, ce qui signifie que Lemmy se fédérera avec toute instance compatible. Nous ne recommandons pas cela, car les outils de modération ne sont pas encore prêts à traiter les instances malveillantes. + +Ce que nous recommandons est de mettre une liste d'instances de confiance dans `allowed_instances`, et de ne se fédérer qu'avec celles-ci. Notez que les deux parties doivent s'ajouter mutuellement à leurs `allowed_instances` pour permettre une fédération bidirectionnelle. + +Alternativement, vous pouvez aussi utiliser une fédération basée sur une liste de blocage. Dans ce cas, ajoutez les domaines des instances avec lesquelles vous ne voulez *pas* vous fédérer. Vous ne pouvez définir que l'un des deux, `allowed_instances` et `blocked_instances`, car définir les deux n'a pas de sens. diff --git a/src/fr/federation/lemmy_protocol.md b/src/fr/federation/lemmy_protocol.md new file mode 100644 index 0000000..41ba116 --- /dev/null +++ b/src/fr/federation/lemmy_protocol.md @@ -0,0 +1,780 @@ +# Protocole de la Fédération Lemmy + +Le protocole Lemmy (ou protocole de la fédération Lemmy) est un sous-ensemble strict du [protocole ActivityPub](https://www.w3.org/TR/activitypub/). Toute déviation du protocole ActivityPub est un bug dans Lemmy ou dans cette documentation (ou les deux). + +Ce document s'adresse aux développeurs qui sont familiers avec les protocoles ActivityPub et ActivityStreams. Il donne un aperçu détaillé des acteurs, objets et activités utilisés par Lemmy. + +Avant de lire ce document, jetez un coup d'œil à notre [Aperçu de la fédération](contributing_federation_overview.md) pour avoir une idée du fonctionnement de la fédération Lemmy à un haut niveau. + +Lemmy ne suit pas encore la spécification ActivityPub à tous égards. Par exemple, nous ne définissons pas un contexte valide en indiquant nos champs de contexte. Nous ignorons également les champs comme `inbox`, `outbox` ou `endpoints` pour les acteurs distants, et supposons que tout est Lemmy. Pour un aperçu des déviations, lisez [#698](https://github.com/LemmyNet/lemmy/issues/698). Elles seront corrigées dans un futur proche. + +Lemmy est également très peu flexible en ce qui concerne les activités et les objets entrants. Ils doivent être exactement identiques aux exemples ci-dessous. Des choses comme avoir un tableau au lieu d'une valeur unique, ou un ID d'objet au lieu de l'objet complet entraîneront une erreur. + +Dans les tableaux suivants, le terme "obligatoire" indique si Lemmy accepte ou non une activité entrante sans ce champ. Lemmy lui-même inclura toujours tous les champs non vides. + + + +- [Contexte](#contexte) +- [Acteurs](#acteurs) + * [Communauté](#communauté) + + [Boîte de sortie communautaire](#boîte-de-sortie-communautaire) + + [Suiveurs de la communauté](#suiveurs-de-la-communauté) + + [Modérateurs de la communauté](#modérateurs-de-la-communauté) + * [Utilisateur](#utilisateur) + + [Boîte de sortie de l'utilisateur](#boîte-de-sortie-de-lutilisateur) +- [Objets](#objets) + * [Publication](#publication) + * [Commentaire](#commentaire) + * [Message privé](#message-privé) +- [Activités](#activités) + * [De l'utilisateur à la communauté](#utilisateur-à-la-communauté) + + [Suivre](#suivre) + + [Ne pas suivre](#ne-pas-suivre) + + [Créer ou mettre à jour un poste](#créer-ou-mettre-à-jour-un-message) + + [Créer ou mettre à jour un commentaire](#créer-ou-mettre-à-jour-un-commentaire) + + [Aimer le message ou le commentaire](#jaime-un-message-ou-un-commentaire) + + [Ne pas aimer le message ou le commentaire](#naime-pas-le-message-ou-le-commentaire) + + [Supprimer un message ou un commentaire](#supprimer-un-message-ou-un-commentaire) + + [Retirer un message ou le commentaire](#retirer-un-message-ou-le-commentaire) + + [Défaire](#defaire) + + [Ajouter un modérateur](#ajouter-un-mod) + + [Supprimer un modérateur](#supprimer-un-mod) + * [De la communauté à l'utilisateur](#communauté-à-lutilisateur) + + [Accepter Suivre](#accepter-un-suivi) + + [Annoncer](#annoncer) + + [Retirer ou supprimer une communauté](#retirer-ou-supprimer-une-communauté) + + [Restaurer une communauté retiré ou effacée](#rétablir-la-communauté-supprimée-ou-retirée) + * [D'utilisateur à utilisateur](#utilisateur-à-utilisateur) + + [Créer ou mettre à jour un message privé](#créer-ou-mettre-à-jour-un-message-privé) + + [Supprimer un message privé](#supprimer-un-message-privé) + + [Défaire Supprimer un message privé](#annuler-la-suppression-dun-message-privé)⏎ + + + +## Contexte + +```json +{ + "@context": [ + "https://www.w3.org/ns/activitystreams", + { + "moderators": "as:moderators", + "sc": "http://schema.org#", + "stickied": "as:stickied", + "sensitive": "as:sensitive", + "pt": "https://join.lemmy.ml#", + "comments_enabled": { + "type": "sc:Boolean", + "id": "pt:commentsEnabled" + } + }, + "https://w3id.org/security/v1" + ] +} +``` + +Le contexte est identique pour toutes les activités et tous les objets. + +## Acteurs + +### Communauté + +Un acteur automatisé. Les utilisateurs peuvent lui envoyer des messages ou des commentaires, que la communauté transmet à ses adeptes sous la forme d'un `Announce`. + +Envoie des activités à l'utilisateur : `Accept/Follow`, `Announce`. + +Reçoit des activités de l'utilisateur : `Follow`, `Undo/Follow`, `Create`, `Update`, `Like`, `Dislike`, `Remove` (seulement admin/mod), `Delete` (seul créateur), `Undo` (uniquement pour ses propres actions). + +```json +{ + "@context": ..., + "id": "https://enterprise.lemmy.ml/c/main", + "type": "Group", + "preferredUsername": "main", + "name": "The Main Community", + "sensitive": false, + "content": "Welcome to the default community!", + "mediaType": "text/html", + "source": { + "content": "Welcome to the default community!", + "mediaType": "text/markdown" + }, + "icon": { + "type": "Image", + "url": "https://enterprise.lemmy.ml/pictrs/image/Z8pFFb21cl.png" + }, + "image": { + "type": "Image", + "url": "https://enterprise.lemmy.ml/pictrs/image/Wt8zoMcCmE.jpg" + }, + "inbox": "https://enterprise.lemmy.ml/c/main/inbox", + "outbox": "https://enterprise.lemmy.ml/c/main/outbox", + "followers": "https://enterprise.lemmy.ml/c/main/followers", + "moderators": "https://enterprise.lemmy.ml/c/main/moderators", + "endpoints": { + "sharedInbox": "https://enterprise.lemmy.ml/inbox" + }, + "published": "2020-10-06T17:27:43.282386+00:00", + "updated": "2020-10-08T11:57:50.545821+00:00", + "publicKey": { + "id": "https://enterprise.lemmy.ml/c/main#main-key", + "owner": "https://enterprise.lemmy.ml/c/main", + "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9JJ7Ybp/H7iXeLkWFepg\ny4PHyIXY1TO9rK3lIBmAjNnkNywyGXMgUiiVhGyN9yU7Km8aWayQsNHOkPL7wMZK\nnY2Q+CTQv49kprEdcDVPGABi6EbCSOcRFVaUjjvRHf9Olod2QP/9OtX0oIFKN2KN\nPIUjeKK5tw4EWB8N1i5HOuOjuTcl2BXSemCQLAlXerLjT8xCarGi21xHPaQvAuns\nHt8ye7fUZKPRT10kwDMapjQ9Tsd+9HeBvNa4SDjJX1ONskNh2j4bqHHs2WUymLpX\n1cgf2jmaXAsz6jD9u0wfrLPelPJog8RSuvOzDPrtwX6uyQOl5NK00RlBZwj7bMDx\nzwIDAQAB\n-----END PUBLIC KEY-----\n" + } +} +``` + +| Nom du champ | Obligatoire | Description | +|---|---|---| +| `preferredUsername` | oui | Nom de l'acteur | +| `name` | oui | Titre de la communauté | +| `sensitive` | oui | True indique que tous les messages dans la communauté sont nsfw | +| `attributedTo` | oui | D'abord le créateur de la communauté, puis tous les autres modérateurs. | +| `content` | non | Texte pour la barre latérale de la communauté, contenant généralement une description et des règles. | +| `icon` | non | Icône, affichée à côté du nom de la communauté | +| `image` | non | Image de bannière, affichée en haut de la page de la communauté | +| `inbox` | non | URL de la boîte de réception ActivityPub | +| `outbox` | non | ActivityPub URL de la boîte de sortie, contient uniquement les 20 derniers messages, sans commentaires, votes ou autres activités. | +| `followers` | non | URL de la collection de suiveurs, contenant uniquement le nombre de suiveurs, sans référence à des suiveurs individuels. | +| `endpoints` | non | Contient l'URL de la boîte de réception partagée | +| `published` | non | Date à laquelle la communauté a été créée pour la première fois | +| `updated` | non | Date à laquelle la communauté a été modifiée pour la dernière fois | +| `publicKey` | oui | La clé publique utilisée pour vérifier les signatures de cet acteur. | + +#### Boîte de sortie communautaire + +```json +{ + "@context": ..., + "items": [ + ... + ], + "totalItems": 3, + "id": "https://enterprise.lemmy.ml/c/main/outbox", + "type": "OrderedCollection" +} +``` + +La boîte d'envoi ne contient pour l'instant que les activités Créer/Poster `Create/Post`. + +#### Suiveurs de la communauté + +```json +{ + "totalItems": 2, + "@context": ..., + "id": "https://enterprise.lemmy.ml/c/main/followers", + "type": "Collection" +} +``` + +La collection de followers est uniquement utilisée pour exposer le nombre de followers. Les identifiants des acteurs ne sont pas inclus, afin de protéger la vie privée des utilisateurs. + +#### Modérateurs de la communauté + +```json +{ + "items": [ + "https://enterprise.lemmy.ml/u/picard", + "https://enterprise.lemmy.ml/u/riker" + ], + "totalItems": 2, + "@context": ..., + "id": "https://enterprise.lemmy.ml/c/main/moderators", + "type": "OrderedCollection" +} +``` + +### Utilisateur + +Une personne, interagit principalement avec la communauté où elle envoie et reçoit des messages/commentaires. Peut également créer et modérer des communautés, et envoyer des messages privés à d'autres utilisateurs. + +Envoie des activités à la communauté : Suivre `Follow`, Annuler/Suivre `Undo/Follow`, Créer `Create`, Mettre à jour `Update`, Aimer `Like`, Ne pas aimer `Dislike`, Retirer `Remove` (seulement admin/mod), Supprimer `Delete` (seulement créateur), Défaire `Undo` (seulement pour ses propres actions). + +Reçoit des activités de la communauté : Accepter/Suivre `Accept/Follow`, Annoncer `Announce`. + +Envoie et reçoit des activités de/vers d'autres utilisateurs : Créer/Note `Create/Note`, Mettre à jour/Note `Update/Note`, Supprimer/Note `Delete/Note`, Défaire/Supprimer/Note `Undo/Delete/Note` (toutes celles relatives aux messages privés) + +```json +{ + "@context": ..., + "id": "https://enterprise.lemmy.ml/u/picard", + "type": "Person", + "preferredUsername": "picard", + "name": "Jean-Luc Picard", + "content": "The user bio", + "mediaType": "text/html", + "source": { + "content": "The user bio", + "mediaType": "text/markdown" + }, + "icon": { + "type": "Image", + "url": "https://enterprise.lemmy.ml/pictrs/image/DS3q0colRA.jpg" + }, + "image": { + "type": "Image", + "url": "https://enterprise.lemmy.ml/pictrs/image/XenaYI5hTn.png" + }, + "inbox": "https://enterprise.lemmy.ml/u/picard/inbox", + "endpoints": { + "sharedInbox": "https://enterprise.lemmy.ml/inbox" + }, + "published": "2020-10-06T17:27:43.234391+00:00", + "updated": "2020-10-08T11:27:17.905625+00:00", + "publicKey": { + "id": "https://enterprise.lemmy.ml/u/picard#main-key", + "owner": "https://enterprise.lemmy.ml/u/picard", + "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyH9iH83+idw/T4QpuRSY\n5YgQ/T5pJCNxvQWb6qcCu3gEVigfbreqZKJpOih4YT36wu4GjPfoIkbWJXcfcEzq\nMEQoYbPStuwnklpN2zj3lRIPfGLht9CAlENLWikTUoW5kZLyU6UQtOGdT2b1hDuK\nsUEn67In6qYx6pal8fUbO6X3O2BKzGeofnXgHCu7QNIuH4RPzkWsLhvwqEJYP0zG\nodao2j+qmhKFsI4oNOUCGkdJejO7q+9gdoNxAtNNKilIOwUFBYXeZJb+XGlzo0X+\n70jdJ/xQCPlPlItU4pD/0FwPLtuReoOpMzLi20oDsPXJBvn+/NJaxqDINuywcN5p\n4wIDAQAB\n-----END PUBLIC KEY-----\n" + } +} +``` + +| Nom du champ | Obligatoire | Description | +|---|---|---| +| `preferredUsername` | oui | Nom de l'acteur | +| `name` | non | Nom d'affichage de l'utilisateur | +| `content` | non | Biographie de l'utilisateur | +| `icon` | non | L'avatar de l'utilisateur, affiché à côté de son nom d'utilisateur | +| `image` | non | La bannière de l'utilisateur, affichée en haut du profil | +| `inbox` | non | URL de la boîte de réception d'ActivityPub | +| `endpoints` | non | Contient l'URL de la boîte de réception partagée | +| `published` | non | La date de l'inscription de l'utilisateur. +| `updated` | non | Date à laquelle le profil de l'utilisateur a été modifié en dernier lieu | +| `publicKey` | oui | La clé publique utilisée pour vérifier les signatures de cet acteur | + +#### Boîte de sortie de l'utilisateur + +```json +{ + "items": [], + "totalItems": 0, + "@context": ..., + "id": "http://lemmy-alpha:8541/u/lemmy_alpha/outbox", + "type": "OrderedCollection" +} +``` + +La boîte de réception de l'utilisateur n'a pas encore été implémentée et n'est qu'un substitut pour les implémentations de ActivityPub qui en ont besoin. + +## Objets + +### Publication + +Une page avec un titre, une URL facultative et un contenu textuel. L'URL mène souvent à une image, auquel cas une vignette est incluse. Chaque message appartient à une seule communauté. + +```json +{ + "@context": ..., + "id": "https://voyager.lemmy.ml/post/29", + "type": "Page", + "attributedTo": "https://voyager.lemmy.ml/u/picard", + "to": [ + "https://voyager.lemmy.ml/c/main", + "https://www.w3.org/ns/activitystreams#Public" + ], + "name": "Test thumbnail 2", + "content": "blub blub", + "mediaType": "text/html", + "source": { + "content": "blub blub", + "mediaType": "text/markdown" + }, + "url": "https://voyager.lemmy.ml:/pictrs/image/fzGwCsq7BJ.jpg", + "image": { + "type": "Image", + "url": "https://voyager.lemmy.ml/pictrs/image/UejwBqrJM2.jpg" + }, + "commentsEnabled": true, + "sensitive": false, + "stickied": false, + "published": "2020-09-24T17:42:50.396237+00:00", + "updated": "2020-09-24T18:31:14.158618+00:00" +} +``` + +| Nom du champ | Obligatoire | Description | +|---|---|---| +| `attributedTo` | oui | ID de l'utilisateur qui a créé ce message | +| `to` | oui | ID de la communauté où il a été posté | +| `name` | oui | Titre du message | +| `content` | non | Corps du message | +| `url` | non | Un lien arbitraire à partager | +| `image` | non | Miniature pour `url`, seulement présent si c'est un lien d'image | +| `commentsEnabled` | oui | False indique que le message est verrouillé, et qu'aucun commentaire ne peut être ajouté | +| `sensitive` | oui | True marque le message comme NSFW, brouille la vignette et la cache aux utilisateurs dont le paramètre NSFW est désactivé | +| `stickied` | oui | Le message est affiché en haut de la page de la communauté. | +| `published` | non | La date et l'heure de création de l'article. | +| `updated` | non | La date à laquelle le message a été édité (non présent s'il n'a jamais été édité). | + +### Commentaire + +Une réponse à un message, ou une réponse à un autre commentaire. Ne contient que du texte (y compris des références à d'autres utilisateurs ou communautés). Lemmy affiche les commentaires sous forme d'arborescence. + +```json +{ + "@context": ..., + "id": "https://enterprise.lemmy.ml/comment/95", + "type": "Note", + "attributedTo": "https://enterprise.lemmy.ml/u/picard", + "to": "https://www.w3.org/ns/activitystreams#Public", + "content": "mmmk", + "mediaType": "text/html", + "source": { + "content": "mmmk", + "mediaType": "text/markdown" + }, + "inReplyTo": [ + "https://enterprise.lemmy.ml/post/38", + "https://voyager.lemmy.ml/comment/73" + ], + "published": "2020-10-06T17:53:22.174836+00:00", + "updated": "2020-10-06T17:53:22.174836+00:00" +} +``` + +| Nom du champ | Obligatoire | Description | +|---|---|---| +| `attributedTo` | oui | ID de l'utilisateur qui a créé le commentaire | +| `to` | oui | Communauté où le commentaire a été fait | +| `content` | oui | Le texte du commentaire | +| `inReplyTo` | oui | IDs du message où ce commentaire a été fait, et du commentaire parent. S'il s'agit d'un commentaire de haut niveau, `inReplyTo` ne contient que l'article. | +| `published` | non | La date de création du commentaire. | +| `updated` | non | Date à laquelle le commentaire a été modifié (non présent s'il n'a jamais été modifié) | + +### Message privé + +Un message direct d'un utilisateur à un autre. Il ne peut pas inclure d'autres utilisateurs. Le threading n'est pas encore implémenté, donc le champ `inReplyTo` est manquant. + +```json +{ + "@context": ..., + "id": "https://enterprise.lemmy.ml/private_message/34", + "type": "Note", + "attributedTo": "https://enterprise.lemmy.ml/u/picard", + "to": "https://voyager.lemmy.ml/u/janeway", + "content": "test", + "source": { + "content": "test", + "mediaType": "text/markdown" + }, + "mediaType": "text/markdown", + "published": "2020-10-08T19:10:46.542820+00:00", + "updated": "2020-10-08T20:13:52.547156+00:00" +} +``` + +| Nom du champ | Obligatoire | Description | +|---|---|---| +| `attributedTo` | ID de l'utilisateur qui a créé ce message privé | +| `to` | ID du destinataire | +| `content` | oui | Le texte du message privé | +| `published` | non | Date à laquelle le message a été créé | +| `updated` | non | Date à laquelle le message a été modifié (non présent s'il n'a jamais été modifié) | + +## Activités + +### Utilisateur à la communauté + +#### Suivre + +Lorsque l'utilisateur clique sur "Subscribe" dans une communauté, un `Follow` est envoyé. La communauté répond automatiquement par un `Accept/Follow`. + +```json +{ + "@context": ..., + "id": "https://enterprise.lemmy.ml/activities/follow/2e4784b7-4edf-4fa1-a352-674d5d5f8891", + "type": "Follow", + "actor": "https://enterprise.lemmy.ml/u/picard", + "to": "https://ds9.lemmy.ml/c/main", + "object": "https://ds9.lemmy.ml/c/main" +} +``` + +| Nom du champ | Obligatoire | Description | +|---|---|---| +| `actor` | oui | L'utilisateur qui envoie la demande de suivi. +| `object` | oui | La communauté à suivre | + +#### Ne pas suivre + +Cliquer sur le bouton de désabonnement d'une communauté provoque l'envoi d'un `Undo/Follow`. La communauté supprime l'utilisateur de sa liste de followers après l'avoir reçu. + +```json +{ + "@context": ..., + "id": "http://lemmy-alpha:8541/activities/undo/2c624a77-a003-4ed7-91cb-d502eb01b8e8", + "type": "Undo", + "actor": "http://lemmy-alpha:8541/u/lemmy_alpha", + "to": "http://lemmy-beta:8551/c/main", + "object": { + "@context": ..., + "id": "http://lemmy-alpha:8541/activities/follow/f0d732e7-b1e7-4857-a5e0-9dc83c3f7ee8", + "type": "Follow", + "actor": "http://lemmy-alpha:8541/u/lemmy_alpha", + "object": "http://lemmy-beta:8551/c/main" + } +} +``` + +#### Créer ou mettre à jour un message + +Lorsqu'un utilisateur crée un nouveau message, celui-ci est envoyé à la communauté concernée. La modification d'un message précédemment créé envoie une activité presque identique, sauf que le type `type` est Mise à jour `Update`. Nous ne supportons pas encore les mentions dans les messages. + +```json +{ + "@context": ..., + "id": "https://enterprise.lemmy.ml/activities/create/6e11174f-501a-4531-ac03-818739bfd07d", + "type": "Create", + "actor": "https://enterprise.lemmy.ml/u/riker", + "to": "https://www.w3.org/ns/activitystreams#Public", + "cc": [ + "https://ds9.lemmy.ml/c/main/" + ], + "object": ... +} +``` + +| Nom du champ | Obligatoire | Description | +|---|---|---| +| `type` | oui | soit `Create`, soit `Update` |... +| `cc` | oui | Communauté où le message est créé | +| `object` | oui | Le message en cours de création | + +#### Créer ou mettre à jour un commentaire + +Une réponse à un article ou à un autre commentaire. Peut contenir des mentions d'autres utilisateurs. La modification d'un message précédemment créé envoie une activité presque identique, sauf que le type `type` est Mise à jour `Update`. + +```json +{ + "@context": ..., + "id": "https://enterprise.lemmy.ml/activities/create/6f52d685-489d-4989-a988-4faedaed1a70", + "type": "Create", + "actor": "https://enterprise.lemmy.ml/u/riker", + "to": "https://www.w3.org/ns/activitystreams#Public", + "tag": [{ + "type": "Mention", + "name": "@sisko@ds9.lemmy.ml", + "href": "https://ds9.lemmy.ml/u/sisko" + }], + "cc": [ + "https://ds9.lemmy.ml/c/main/", + "https://ds9.lemmy.ml/u/sisko" + ], + "object": ... +} +``` + +| Nom du champ | Obligatoire | Description | +|---|---|---| +| `tag` | non | Liste des utilisateurs mentionnés dans le commentaire (comme `@utilisateur@exemple.com`) | +| `cc`| oui | La liste des utilisateurs mentionnés dans le commentaire (par exemple, `@`). +| `object` | oui | Le commentaire en cours de création | + +#### J'aime un message ou un commentaire + +Un vote positif pour un message ou un commentaire. + +```json +{ + "@context": ..., + "id": "https://enterprise.lemmy.ml/activities/like/8f3f48dd-587d-4624-af3d-59605b7abad3", + "type": "Like", + "actor": "https://enterprise.lemmy.ml/u/riker", + "to": "https://www.w3.org/ns/activitystreams#Public", + "cc": [ + "https://ds9.lemmy.ml/c/main/" + ], + "object": "https://enterprise.lemmy.ml/p/123" +} +``` + +| Nom du champ | Obligatoire | Description | +|---|---|---| +| `cc` | oui | L'ID de la communauté où se trouve le message/commentaire. | +| `object` | oui | Le message ou le commentaire en cours de validation | + +#### N'aime pas le message ou le commentaire + +Un vote négatif pour un message ou un commentaire. + +```json +{ + "@context": ..., + "id": "https://enterprise.lemmy.ml/activities/dislike/fd2b8e1d-719d-4269-bf6b-2cadeebba849", + "type": "Dislike", + "actor": "https://enterprise.lemmy.ml/u/riker", + "to": "https://www.w3.org/ns/activitystreams#Public", + "cc": [ + "https://ds9.lemmy.ml/c/main/" + ], + "object": "https://enterprise.lemmy.ml/p/123" +} +``` + +| Nom du champ | Obligatoire | Description | +|---|---|---| +| `cc` | oui | L'ID de la communauté où se trouve le message/commentaire. | +| `object` | oui | Le message ou le commentaire en cours de validation | + +#### Supprimer un message ou un commentaire + +Supprime un message ou un commentaire précédemment créé. Ceci ne peut être fait que par le créateur original de ce message ou commentaire. + +```json +{ + "@context": ..., + "id": "https://enterprise.lemmy.ml/activities/delete/f1b5d57c-80f8-4e03-a615-688d552e946c", + "type": "Delete", + "actor": "https://enterprise.lemmy.ml/u/riker", + "to": "https://www.w3.org/ns/activitystreams#Public", + "cc": [ + "https://enterprise.lemmy.ml/c/main/" + ], + "object": "https://enterprise.lemmy.ml/post/32" +} +``` + +| Nom du champ | Obligatoire | Description | +|---|---|---| +| `cc` | oui | L'ID de la communauté où se trouve le message/commentaire. | +| `object` | oui | ID du message ou du commentaire à supprimer | + +#### Supprimer un message ou un commentaire + +Supprime un message ou un commentaire. Cela ne peut être fait que par un mod de la communauté, ou par un administrateur sur l'instance où la communauté est hébergée. + +```json +{ + "@context": ..., + "id": "https://ds9.lemmy.ml/activities/remove/aab93b8e-3688-4ea3-8212-d00d29519218", + "type": "Remove", + "actor": "https://ds9.lemmy.ml/u/sisko", + "to": "https://www.w3.org/ns/activitystreams#Public", + "cc": [ + "https://ds9.lemmy.ml/c/main/" + ], + "object": "https://enterprise.lemmy.ml/comment/32" +} +``` + +| Nom du champ | Obligatoire | Description | +|---|---|---| +| `cc` | oui | L'ID de la communauté où se trouve le message/commentaire. | +| `object` | oui | ID du message ou du commentaire à supprimer | + +#### Défaire + +Défait une activité précédente, ne peut être fait que par l'acteur `actor` de l'objet`object`. Dans le cas d'un "J'aime" `Like` ou "Je n'aime pas" `Dislike`, le nombre de votes est modifié. Dans le cas d'un Supprimer `Delete` ou Retirer `Remove`, le message/commentaire est restauré. L'objet est régénéré à partir de zéro, l'ID de l'activité et les autres champs sont donc différents. + +```json +{ + "@context": ..., + "id": "https://ds9.lemmy.ml/activities/undo/70ca5fb2-e280-4fd0-a593-334b7f8a5916", + "type": "Undo", + "actor": "https://ds9.lemmy.ml/u/sisko", + "to": "https://www.w3.org/ns/activitystreams#Public", + "cc": [ + "https://ds9.lemmy.ml/c/main/" + ], + "object": ... +} +``` + +| Nom du champ | Obligatoire | Description | +|---|---|---| +| `object` | oui | Toute activité `Like`, `Dislike`, `Delete` ou `Remove` comme décrit ci-dessus | + +#### Ajouter un mod + +Ajoute un nouveau mod (enregistré sur `ds9.lemmy.ml`) à la communauté `!main@enterprise.lemmy.ml`. Doit être envoyé par un mod existant de la communauté. + +```json +{ + "@context": ..., + "id": "https://enterprise.lemmy.ml/activities/add/531471b1-3601-4053-b834-d26718da2a06", + "type": "Add", + "cc": [ + "https://enterprise.lemmy.ml/c/main" + ], + "to": "https://www.w3.org/ns/activitystreams#Public", + "object": "https://ds9.lemmy.ml/u/sisko", + "actor": "https://enterprise.lemmy.ml/u/picard", + "target": "https://enterprise.lemmy.ml/c/main/moderators" +} +``` + +#### Supprimer un mod + +Supprime un mod existant de la communauté. Doit être envoyé par un mod existant de la communauté. + +```json +{ + "@context": ..., + "id": "https://enterprise.lemmy.ml/activities/remove/63b9a5b2-d3f8-4371-a7eb-711c7928b3c0", + "type": "Remove", + "object": "https://ds9.lemmy.ml/u/sisko", + "to": "https://www.w3.org/ns/activitystreams#Public", + "actor": "https://enterprise.lemmy.ml/u/picard", + "cc": [ + "https://enterprise.lemmy.ml/c/main" + ], + "target": "https://enterprise.lemmy.ml/c/main/moderators" +} +``` +### Communauté à l'utilisateur + +#### Accepter un suivi + +Envoyé automatiquement par la communauté en réponse à un `Follow`. En même temps, la communauté ajoute cet utilisateur à sa liste de followers. + +```json +{ + "@context": ..., + "id": "https://ds9.lemmy.ml/activities/accept/5314bf7c-dab8-4b01-baf2-9be11a6a812e", + "type": "Accept", + "actor": "https://ds9.lemmy.ml/c/main", + "to": "https://enterprise.lemmy.ml/u/picard", + "object": { + "@context": ..., + "id": "https://enterprise.lemmy.ml/activities/follow/2e4784b7-4edf-4fa1-a352-674d5d5f8891", + "type": "Follow", + "object": "https://ds9.lemmy.ml/c/main", + "actor": "https://enterprise.lemmy.ml/u/picard" + } +} +``` + +| Nom du champ | Obligatoire | Description | +|---|---|---| +| `actor` | oui | La même communauté que celle de l'activité `Follow` | +| `to` | non | L'ID de l'utilisateur qui a envoyé le `Follow` | +| `object` | oui | L'activité `Follow` précédemment envoyée | + +#### Annoncer + +Lorsque la communauté reçoit une activité de post ou de commentaire, elle l'intègre dans une `Announce` et l'envoie à tous les followers. + +```json +{ + "@context": ..., + "id": "https://ds9.lemmy.ml/activities/announce/b98382e8-6cb1-469e-aa1f-65c5d2c31cc4", + "type": "Announce", + "actor": "https://ds9.lemmy.ml/c/main", + "to": "https://www.w3.org/ns/activitystreams#Public", + "cc": [ + "https://ds9.lemmy.ml/c/main/followers" + ], + "object": ... +} +``` + +| Nom du champ | Obligatoire | Description | +|---|---|---| +| `object` | oui | Toute activité de type `Create`, `Update`, `Like`, `Dislike`, `Delete` `Remove` ou `Undo` décrite dans la section [User to Community](#user-to-community) | + +#### Retirer ou supprimer une communauté + +Un administrateur d'instance peut supprimer la communauté, ou un mod peut la supprimer. + +```json +{ + "@context": ..., + "id": "http://ds9.lemmy.ml/activities/remove/e4ca7688-af9d-48b7-864f-765e7f9f3591", + "type": "Remove", + "actor": "http://ds9.lemmy.ml/c/some_community", + "cc": [ + "http://ds9.lemmy.ml/c/some_community/followers" + ], + "to": "https://www.w3.org/ns/activitystreams#Public", + "object": "http://ds9.lemmy.ml/c/some_community" +} +``` + +| Nom du champ | Obligatoire | Description | +|---|---|---| +| `type` | oui | Soit `Remove` soit `Delete` | + +#### Rétablir la communauté supprimée ou retirée + +Rétablit le retrait ou la suppression. + +```json +{ + "@context": ..., + "id": "http://ds9.lemmy.ml/activities/like/0703668c-8b09-4a85-aa7a-f93621936901", + "type": "Undo", + "actor": "http://ds9.lemmy.ml/c/some_community", + "to": "https://www.w3.org/ns/activitystreams#Public", + "cc": [ + "http://ds9.lemmy.ml/c/testcom/followers" + ], + "object": { + "@context": ..., + "id": "http://ds9.lemmy.ml/activities/remove/1062b5e0-07e8-44fc-868c-854209935bdd", + "type": "Remove", + "actor": "http://ds9.lemmy.ml/c/some_community", + "object": "http://ds9.lemmy.ml/c/testcom", + "to": "https://www.w3.org/ns/activitystreams#Public", + "cc": [ + "http://ds9.lemmy.ml/c/testcom/followers" + ] + } +} + +``` +| Nom du champ | Obligatoire | Description | +|---|---|---| +| `object.type` | oui | Soit `Remove` ou `Delete` | + +### Utilisateur à Utilisateur + +#### Créer ou mettre à jour un message privé + +Crée un nouveau message privé entre deux utilisateurs. + +```json +{ + "@context": ..., + "id": "https://ds9.lemmy.ml/activities/create/202daf0a-1489-45df-8d2e-c8a3173fed36", + "type": "Create", + "actor": "https://ds9.lemmy.ml/u/sisko", + "to": "https://enterprise.lemmy.ml/u/riker/inbox", + "object": ... +} +``` + +| Nom du champ | Obligatoire | Description | +|---|---|---| +| `type` | oui | Soit `Create`, soit `Update` |... +| `object` | oui | A [Private Message](#private-message) | + +#### Supprimer un message privé + +Supprime un message privé précédent. + +```json +{ + "@context": ..., + "id": "https://ds9.lemmy.ml/activities/delete/2de5a5f3-bf26-4949-a7f5-bf52edfca909", + "type": "Delete", + "actor": "https://ds9.lemmy.ml/u/sisko", + "to": "https://enterprise.lemmy.ml/u/riker/inbox", + "object": "https://ds9.lemmy.ml/private_message/341" +} +``` + +#### Annuler la suppression d'un message privé + +Restaure un message privé précédemment supprimé. L'objet est régénéré à partir de zéro, l'ID d'activité et les autres champs sont donc différents. + +```json +{ + "@context": ..., + "id": "https://ds9.lemmy.ml/activities/undo/b24bc56d-5db1-41dd-be06-3f1db8757842", + "type": "Undo", + "actor": "https://ds9.lemmy.ml/u/sisko", + "to": "https://enterprise.lemmy.ml/u/riker/inbox", + "object": ... +} +``` diff --git a/src/fr/federation/overview.md b/src/fr/federation/overview.md new file mode 100644 index 0000000..9fc54ba --- /dev/null +++ b/src/fr/federation/overview.md @@ -0,0 +1,124 @@ +# Aperçu de la fédération + + +Ce document est destiné à tous ceux qui veulent savoir comment fonctionne la fédération Lemmy, sans être trop technique. Il est destiné à fournir un aperçu de haut niveau de la fédération ActivityPub dans Lemmy. Si vous implémentez ActivityPub vous-même et souhaitez être compatible avec Lemmy, lisez notre [ActivityPub API outline](contributing_apub_api_outline.md). + +## Conventions de documentation + +Pour garder les choses simples, vous verrez parfois des choses formatées comme `Create/Note`, `Delete/Event` ou `Undo/Follow`. La chose avant le slash est l'activité, et la chose après le slash est l'objet à l'intérieur de l'activité, dans une propriété `object`. Il faut donc les lire comme suit : + +* `Create/Note` : une activité `Create` contenant une `Note` dans le champ `object`. +* `Delete/Event` : une activité `Delete` contenant un `Event` dans le champ `object`. +* `Undo/Follow` : une activité `Undo` contenant un `Follow` dans le champ `object`. + +Dans Lemmy, nous utilisons certains termes spécifiques pour désigner les éléments ActivityPub. Il s'agit essentiellement de nos implémentations spécifiques de concepts ActivityPub bien connus : + +- Communauté (community) : `Group` +- Utilisateur (user) : `Person` +- Poste (post) : `Page` +- Commentaire (comment) : `Note` + +Ce document comporte trois sections principales : + +* __Philosophie de la fédération__ expose le modèle général de la manière dont le projet est censé se fédérer. +* __Les activités des utilisateurs__ décrivent les actions qu'un utilisateur peut entreprendre pour interagir. +* __Activités de la communauté__ décrit ce que la communauté fait en réponse à certaines actions de l'utilisateur. + +## Philosophie de la Fédération + +L'acteur principal de Lemmy est la communauté. Chaque communauté réside sur une seule instance, et se compose d'une liste de messages et d'une liste de followers. L'interaction principale est celle d'un utilisateur qui envoie une activité liée à un message ou à un commentaire à la boîte de réception de la communauté, qui l'annonce ensuite à tous ses suiveurs. + +Chaque communauté a un utilisateur créateur spécifique, qui est responsable de la définition des règles, de la nomination des modérateurs et de la suppression du contenu qui viole les règles. + +Outre la modération au niveau de la communauté, chaque instance dispose d'un ensemble d'utilisateurs administrateurs, qui ont le pouvoir de supprimer et d'interdire des contenus sur l'ensemble du site. + +Les utilisateurs suivent les communautés qui les intéressent, afin de recevoir des messages et des commentaires. Ils votent également sur les messages et les commentaires, et en créent de nouveaux. Les commentaires sont organisés en une structure arborescente et généralement triés par nombre de votes. Les messages directs entre utilisateurs sont également pris en charge. + +Les utilisateurs ne peuvent pas se suivre les uns les autres, et les communautés ne peuvent pas non plus suivre quoi que ce soit. + +Notre mise en œuvre de la fédération est déjà complète, mais jusqu'à présent nous ne nous sommes pas du tout concentrés sur la conformité à la spécification ActivityPub. En tant que tel, Lemmy n'est probablement pas compatible avec les implémentations qui s'attendent à envoyer et recevoir des activités valides. C'est un point que nous prévoyons de corriger dans un avenir proche. Consultez [#698](https://github.com/LemmyNet/lemmy/issues/698) pour un aperçu de nos déviations. + +## Activités des utilisateurs + +### Suivre une communauté + +Chaque page de communauté a un bouton "Suivre". Cliquer sur ce bouton déclenche l'envoi d'une activité "Suivre" `Follow` de l'utilisateur vers la boîte de réception de la communauté. La communauté répondra automatiquement par une activité "Accepter/Suivre" `Accept/Follow` dans la boîte de réception de l'utilisateur. Elle ajoutera également l'utilisateur à sa liste de suiveurs et lui transmettra toutes les activités relatives aux messages et commentaires de la communauté. + +### Annuler le suivi d'une communauté + +Après avoir suivi une communauté, le bouton "Follow" est remplacé par "Unfollow". En cliquant sur ce bouton, vous envoyez une activité Annuler/Suivre `Undo/Follow` dans la boîte de réception de la communauté. La communauté supprime l'utilisateur de sa liste de followers et ne lui envoie plus d'activités. + +### Créer un message + +Quand un utilisateur crée un nouveau message dans une communauté donnée, il est envoyé comme Créer/Page `Create/Page` à la boîte de réception de la communauté. + +### Créer un commentaire + +Quand un nouveau commentaire est créé pour un message, l'ID du message et l'ID du commentaire parent (s'il existe) +sont écrits dans le champ `in_reply_to`. Cela permet de l'assigner au bon article, et de construire +l'arbre des commentaires. Il est ensuite envoyé dans la boîte de réception de la Communauté sous le nom de Créer/Noter `Create/Note`. + +L'instance d'origine recherche également dans le commentaire toute mention d'utilisateur et envoie le `Create/Note` à ces utilisateurs. +à ces utilisateurs. + +### Modifier un message + +Modifie le contenu d'un message existant. Ne peut être fait que par l'utilisateur qui l'a créé. + +### Modifier un commentaire + +Modifie le contenu d'un commentaire existant. Ne peut être fait que par l'utilisateur qui l'a créé. + +### J'aime et je n'aime pas + +Les utilisateurs peuvent aimer ou ne pas aimer un message ou un commentaire. Ces commentaires sont envoyés sous forme de "J'aime/Page" `like/Page`, "Je n'aime pas/Note" `Dislike/Note`, etc. dans la boîte de réception de la communauté. + +### Suppression + +Le créateur d'un message, d'un commentaire ou d'une communauté peut le supprimer. La suppression est alors envoyée aux suiveurs de la communauté. L'élément est alors caché de tous les utilisateurs. + +Les mods peuvent supprimer les messages et les commentaires de leurs communautés. Les administrateurs peuvent supprimer tout message ou commentaire sur l'ensemble du site. Les communautés peuvent également être supprimées par les administrateurs. L'élément est alors caché à tous les utilisateurs. + +Les suppressions sont envoyées à tous les adeptes de la communauté, de sorte qu'elles y prennent également effet. L'exception est le cas où un administrateur supprime un élément d'une communauté qui est hébergée sur une instance différente. Dans ce cas, la suppression ne prend effet que localement. + +### Revenir sur une action précédente + +Nous ne supprimons rien de notre base de données, nous le cachons simplement aux utilisateurs. Les Communautés/Paroles/Commentaires supprimés ou retirés ont un bouton "restaurer". Ce bouton génère une activité `Undo` qui définit l'activité originale de suppression/suppression comme objet, comme `Undo/Remove/Post` ou `Undo/Delete/Community`. + +Cliquer sur le bouton "+" d'un message ou d'un commentaire déjà noté (ou sur le bouton "-" d'un message ou d'un commentaire déjà noté) génère également un `Undo`. Dans ce cas, il s'agit d'un `Undo/Like/Post` ou d'un `Undo/Dislike/Comment`. + +### Créer un message privé + +Les profils d'utilisateurs ont un bouton "Envoyer un message", qui ouvre une boîte de dialogue permettant d'envoyer un message privé à cet utilisateur. Le message est envoyé sous la forme d'une `Create/Note` dans la boîte de réception de l'utilisateur. Les messages privés ne peuvent être adressés qu'à un seul utilisateur. + +v## Modifier un message privé + +`Update/Note` modifie le texte d'un message précédemment envoyé. + +### Supprimer un message privé + +`Delete/Note` supprime un message privé. + +### Restaurer un message privé + +`Undo/Delete/Note` rétablit la suppression d'un message privé. + +## Activités de la Communauté + +La communauté est essentiellement un robot, qui n'agit qu'en réaction aux actions des utilisateurs. L'utilisateur qui a créé la communauté devient le premier modérateur, et peut ajouter d'autres modérateurs. En général, lorsque la communauté reçoit une activité valide dans sa boîte de réception, cette activité est transmise à tous ses suiveurs. + +### Accepter le suivi + +Si la communauté reçoit une activité "Follow", elle répond automatiquement par "Accept/Follow". Elle ajoute également l'utilisateur à sa liste de suiveurs. + +### Unfollow + +À la réception d'un `Undo/Follow`, la communauté supprime l'utilisateur de sa liste de followers. + +#### Annoncer + +Si la communauté reçoit une activité liée à un message ou à un commentaire (créer, mettre à jour, aimer, détester, retirer, supprimer, annuler), elle l'annoncera à ses membres. Pour cela, une Annonce est créée avec la Communauté comme acteur, et l'activité reçue comme objet. Les instances qui suivent restent ainsi informées de toutes les actions des communautés qu'elles suivent. + +### Supprimer une communauté + +Si le créateur ou un administrateur supprime la communauté, il envoie un `Delete/Group` à tous ses suiveurs. diff --git a/src/fr/federation/resources.md b/src/fr/federation/resources.md new file mode 100644 index 0000000..c5f6e68 --- /dev/null +++ b/src/fr/federation/resources.md @@ -0,0 +1,22 @@ +# Ressources de l'ActivityPub + +## Documents officiels + +- [Norme ActivityPub](https://www.w3.org/TR/activitypub/) +- [Vocabulaire de l'ActivityPub](https://www.w3.org/TR/activitystreams-vocabulary/) + +## Explications + +- [ActivityPub - one protocol to rule them all?](https://schub.io/blog/2018/02/01/activitypub-one-protocol-to-rule-them-all.html) +- [A highly opinionated guide to learning about ActivityPub](https://tinysubversions.com/notes/reading-activitypub/) +- [Activitypub implementers guide](https://socialhub.activitypub.rocks/t/draft-guide-for-new-activitypub-implementers/479) +- [Mastodon Blog: How to implement a basic ActivityPub server](https://blog.joinmastodon.org/2018/06/how-to-implement-a-basic-activitypub-server/) +- [Mastodon Blog: Implementing an ActivityPub inbox](https://blog.joinmastodon.org/2018/07/how-to-make-friends-and-verify-requests/) +- [Data storage questions](https://socialhub.activitypub.rocks/t/data-storage-questions/579) +- [Activitypub as it has been understood](https://flak.tedunangst.com/post/ActivityPub-as-it-has-been-understood) + +## Exemples et bibliothèques + +- [ActivityPub example server](https://github.com/tOkeshu/activitypub-example) +- [ActivityStreams crate](https://docs.rs/activitystreams/) +- [HTTP Signatures crate](https://git.asonix.dog/Aardwolf/http-signature-normalization)