{"id":27695068,"url":"https://github.com/outadoc/minipavi-kotlin","last_synced_at":"2025-10-04T20:39:39.533Z","repository":{"id":269886551,"uuid":"908371449","full_name":"outadoc/minipavi-kotlin","owner":"outadoc","description":"SDK pour le développement de services Minitel sur la plateforme MiniPavi en Kotlin.","archived":false,"fork":false,"pushed_at":"2025-01-11T00:12:42.000Z","size":3171,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-25T14:15:11.161Z","etag":null,"topics":["kotlin","ktor","minipavi","minitel","videotex"],"latest_commit_sha":null,"homepage":"https://outadoc.github.io/minipavi-kotlin/","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/outadoc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-12-25T22:31:40.000Z","updated_at":"2025-03-01T16:25:09.000Z","dependencies_parsed_at":"2024-12-26T23:22:25.443Z","dependency_job_id":"df1dc676-dfc4-48d4-bdba-f23d63af4c5c","html_url":"https://github.com/outadoc/minipavi-kotlin","commit_stats":null,"previous_names":["outadoc/minipavi-kotlin"],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outadoc%2Fminipavi-kotlin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outadoc%2Fminipavi-kotlin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outadoc%2Fminipavi-kotlin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outadoc%2Fminipavi-kotlin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/outadoc","download_url":"https://codeload.github.com/outadoc/minipavi-kotlin/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250831516,"owners_count":21494380,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["kotlin","ktor","minipavi","minitel","videotex"],"created_at":"2025-04-25T14:15:13.929Z","updated_at":"2025-10-04T20:39:34.497Z","avatar_url":"https://github.com/outadoc.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MiniPavi-Kotlin\n\nSDK pour le développement de services [Minitel][1] sur la plateforme [MiniPavi][2] en\nKotlin.\n\n## Pourquoi ?\n\nMiniPavi propose une API ainsi qu'un SDK pour le développement de services Minitel en PHP.\n\nPHP, c'est sympa, mais mon truc, c'est Kotlin. Pourquoi ne donc pas proposer un SDK pour Kotlin se reposant sur l'API de\nMiniPavi, et permettre à mes ami·e·s développeur·euse·s Kotlin de créer des services Minitel ?\n\nVous trouverez donc ici le résultat de ces efforts : un SDK Kotlin pour MiniPavi, vous permettant **enfin** d'allier vos\ncompétences en Kotlin et votre amour pour le GiscardPunk.\n\n### Non mais, pourquoi ?\n\nPourquoi pas ?\n\n## Services d'exemple\n\nVous pouvez consulter le contenu du module [`sample`](sample) pour voir comment utiliser le SDK à l'aide d'exemples\nconcrets.\n\n## Services en ligne\n\n- [`5422*MINITUS`](https://github.com/outadoc/minitus) : Motus-like sur Minitel, avec un nouveau mot à trouver chaque jour.\n\n## Utilisation du SDK\n\nTout d'abord, je vous invite à lire la documentation de MiniPavi, disponible [sur son site][2] ainsi que [sur son dépôt\nGitHub][3]. Vous y trouverez des informations essentielles sur la topologie de MiniPavi. En lisant cette documentation,\ngardez en tête que vous pouvez substituer les références au développement PHP, que vous pourrez effectuer en Kotlin à la\nplace.\n\nMiniPavi-Kotlin est conçue pour être utilisée avec le framework Ktor. MiniPavi va appeler votre service, qui construira\nsa réponse avec le SDK, et la renverra à MiniPavi.\n\nAjoutez la dépendance à MiniPavi-Kotlin dans votre projet :\n\n```toml\n# libs.versions.toml\n\n[versions]\nminipavi-kotlin = \"x.y.z\"\n\n[libraries]\nminipavi-core = { module = \"com.github.outadoc.minipavi-kotlin:core\", version.ref = \"minipavi-kotlin\" }\nminipavi-videotex = { module = \"com.github.outadoc.minipavi-kotlin:videotex\", version.ref = \"minipavi-kotlin\" }\n```\n\n```kotlin\n// settings.gradle.kts\n\ndependencyResolutionManagement {\n    repositories {\n        maven(\"https://jitpack.io\")\n    }\n}\n```\n\n```kotlin\n// build.gradle.kts\n\ndependencies {\n    implementation(libs.minipavi.core)\n    implementation(libs.minipavi.videotex)\n}\n```\n\nCommencez par créer un serveur Ktor de base. Je vous recommande encore une fois de suivre la [documentation de Ktor][4]\nsi vous n'êtes pas familièr·e avec ce framework.\n\n```kotlin\nimport io.ktor.server.application.Application\nimport io.ktor.server.engine.embeddedServer\nimport io.ktor.server.netty.Netty\n\nfun main() {\n    embeddedServer(\n        Netty,\n        port = 8080,\n        host = \"0.0.0.0\",\n        module = Application::module,\n    ).start(wait = true)\n}\n\nfun Application.module() {\n    TODO(\"Votre service sera ici\")\n}\n```\n\nEnsuite, vous aurez besoin de définir une structure qui représentera l'état d'une session utilisateur.\nCet état pourra être persisté au cours de la session, et peut être aussi simple ou aussi complexe que vous le souhaitez,\ndu moment qu'il peut être serialisé et désérialisé par [`kotlinx.serialization`][5].\n\n```kotlin\nimport kotlinx.serialization.Serializable\n\n// Un état tout simple, constant, pour une application stateless\n@Serializable\nobject EtatSimple\n\n// Un état un peu plus complexe, avec un compteur\n@Serializable\ndata class EtatCompteur(val nbVisites: Int)\n\n// Une structure avec plusieurs états définis\n@Serializable\nsealed class Etat {\n    @Serializable\n    @SerialName(\"formulaire\")\n    data object Formulaire : Etat()\n\n    @Serializable\n    @SerialName(\"resultat\")\n    data class AffichageResultat(\n        val nom: String,\n        val prenom: String,\n    ) : Etat()\n}\n```\n\nUne fois que vous avez votre état, vous pouvez commencer à définir votre service.\n\n```kotlin\nimport fr.outadoc.minipavi.core.ktor.minitelService\nimport fr.outadoc.minipavi.core.model.ServiceResponse\nimport io.ktor.server.application.Application\n\nfun Application.module() {\n    // Le module ktor de tout à l'heure. On lui ajoute notre service.\n    helloWorld()\n}\n\nfun Application.helloWorld() {\n    minitelService\u003cEtatSimple\u003e(\n        path = \"/\",\n        version = \"0.1\",\n        initialState = { EtatSimple },\n    ) { request -\u003e\n        TODO(\"Votre logique de service sera ici\")\n    }\n}\n```\n\nLe paramètre `request` de la lambda contient le contenu de la requête envoyée par la passerelle MiniPavi.\nVous pouvez également accéder aux autres informations de la requête comme n'importe quelle définition de `Route` de\nKtor.\n\nIl ne vous reste plus qu'à construire votre réponse, en renvoyant une `ServiceResponse` :\n\n```kotlin\nimport fr.outadoc.minipavi.core.ktor.minitelService\nimport fr.outadoc.minipavi.core.model.ServiceResponse\nimport fr.outadoc.minipavi.videotex.buildVideotex\nimport io.ktor.server.application.Application\nimport kotlinx.serialization.Serializable\n\n@Serializable\nobject EtatSimple\n\nfun Application.helloWorld() {\n    minitelService\u003cEtatSimple\u003e(\n        path = \"/\",\n        version = \"0.1\",\n        initialState = { EtatSimple },\n    ) { request -\u003e\n        ServiceResponse(\n            state = EtatSimple,\n            content =\n                buildVideotex {\n                    appendLine(\"Bonjour le monde !\")\n                },\n        )\n    }\n}\n```\n\nLa fonction `buildVideotex` vous permet de construire une réponse au format Vidéotex.\nVous pouvez y ajouter du texte, des couleurs, des caractères spéciaux, etc.\nElle est disponible dans le module `videotex`.\n\nEt voilà. Plus qu'à lancer votre serveur, et à le connecter à MiniPavi. 🎉\n\n[1]: https://fr.wikipedia.org/wiki/Minitel\n\n[2]: https://www.minipavi.fr/\n\n[3]: https://github.com/ludosevilla/minipavi\n\n[4]: https://ktor.io/docs/server-create-a-new-project.html\n\n[5]: https://github.com/Kotlin/kotlinx.serialization\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foutadoc%2Fminipavi-kotlin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foutadoc%2Fminipavi-kotlin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foutadoc%2Fminipavi-kotlin/lists"}