Premier commit
|
@ -0,0 +1 @@
|
|||
node_modules
|
|
@ -0,0 +1,70 @@
|
|||
Licence Libre du Québec – Permissive (LiLiQ-P)
|
||||
|
||||
Version 1.1
|
||||
|
||||
1. Préambule
|
||||
Cette licence s'applique à tout logiciel distribué dont le titulaire du droit d'auteur précise qu'il est sujet aux termes de la Licence Libre du Québec – Permissive (LiLiQ-P) (ci-après appelée la « licence »).
|
||||
|
||||
2. Définitions
|
||||
Dans la présente licence, à moins que le contexte n'indique un sens différent, on entend par:
|
||||
|
||||
« concédant » : le titulaire du droit d'auteur sur le logiciel, ou toute personne dûment autorisée par ce dernier à accorder la présente licence;
|
||||
« contributeur » : le titulaire du droit d'auteur ou toute personne autorisée par ce dernier à soumettre au concédant une contribution. Un contributeur dont sa contribution est incorporée au logiciel est considéré comme un concédant en regard de sa contribution;
|
||||
« contribution » : tout logiciel original, ou partie de logiciel original soumis et destiné à être incorporé dans le logiciel;
|
||||
« distribution » : le fait de délivrer une copie du logiciel;
|
||||
« licencié » : toute personne qui possède une copie du logiciel et qui exerce les droits concédés par la licence;
|
||||
« logiciel » : une œuvre protégée par le droit d'auteur, telle qu'un programme d'ordinateur et sa documentation, pour laquelle le titulaire du droit d'auteur a précisé qu'elle est sujette aux termes de la présente licence;
|
||||
« logiciel dérivé » : tout logiciel original réalisé par un licencié, autre que le logiciel ou un logiciel modifié, qui produit ou reproduit la totalité ou une partie importante du logiciel;
|
||||
« logiciel modifié » : toute modification par un licencié de l'un des fichiers source du logiciel ou encore tout nouveau fichier source qui incorpore le logiciel ou une partie importante de ce dernier.
|
||||
|
||||
3. Licence de droit d'auteur
|
||||
Sous réserve des termes de la licence, le concédant accorde au licencié une licence non exclusive et libre de redevances lui permettant d’exercer les droits suivants sur le logiciel :
|
||||
|
||||
1 Produire ou reproduire la totalité ou une partie importante;
|
||||
2 Exécuter ou représenter la totalité ou une partie importante en public;
|
||||
3 Publier la totalité ou une partie importante;
|
||||
4 Sous-licencier sous une autre licence libre, approuvée ou certifiée par la Free Software Foundation ou l'Open Source Initiative.
|
||||
|
||||
Cette licence est accordée sans limite territoriale et sans limite de temps.
|
||||
|
||||
L'exercice complet de ces droits est sujet à la distribution par le concédant du code source du logiciel, lequel doit être sous une forme permettant d'y apporter des modifications. Le concédant peut aussi distribuer le logiciel accompagné d'une offre de distribuer le code source du logiciel, sans frais supplémentaires, autres que ceux raisonnables afin de permettre la livraison du code source. Cette offre doit être valide pendant une durée raisonnable.
|
||||
|
||||
4. Distribution
|
||||
Le licencié peut distribuer des copies du logiciel, d'un logiciel modifié ou dérivé, sous réserve de respecter les conditions suivantes :
|
||||
|
||||
1 Le logiciel doit être accompagné d'un exemplaire de cette licence;
|
||||
2 Si le logiciel a été modifié, le licencié doit en faire la mention, de préférence dans chacun des fichiers modifiés dont la nature permet une telle mention;
|
||||
3 Les étiquettes ou mentions faisant état des droits d'auteur, des marques de commerce, des garanties ou de la paternité concernant le logiciel ne doivent pas être modifiées ou supprimées, à moins que ces étiquettes ou mentions ne soient inapplicables à un logiciel modifié ou dérivé donné.
|
||||
|
||||
5. Contributions
|
||||
Sous réserve d'une entente distincte, toute contribution soumise par un contributeur au concédant pour inclusion dans le logiciel sera soumise aux termes de cette licence.
|
||||
|
||||
6. Marques de commerce
|
||||
La licence n'accorde aucune permission particulière qui permettrait d'utiliser les marques de commerce du concédant, autre que celle requise permettant d'identifier la provenance du logiciel.
|
||||
|
||||
7. Garanties
|
||||
Sauf mention contraire, le concédant distribue le logiciel sans aucune garantie, aux risques et périls de l'acquéreur de la copie du logiciel, et ce, sans assurer que le logiciel puisse répondre à un besoin particulier ou puisse donner un résultat quelconque.
|
||||
|
||||
Sans lier le concédant d'une quelconque manière, rien n'empêche un licencié d'offrir ou d'exclure des garanties ou du support.
|
||||
|
||||
8. Responsabilité
|
||||
Le licencié est responsable de tout préjudice résultant de l'exercice des droits accordés par la licence.
|
||||
|
||||
Le concédant ne saurait être tenu responsable de dommages subis par le licencié ou par des tiers, pour quelque cause que ce soit en lien avec la licence et les droits qui y sont accordés.
|
||||
|
||||
9. Résiliation
|
||||
La présente licence est automatiquement résiliée dès que les droits qui y sont accordés ne sont pas exercés conformément aux termes qui y sont stipulés.
|
||||
|
||||
Toutefois, si le défaut est corrigé dans un délai de 30 jours de sa prise de connaissance par la personne en défaut, et qu'il s'agit du premier défaut, la licence est accordée de nouveau.
|
||||
|
||||
Pour tout défaut subséquent, le consentement exprès du concédant est nécessaire afin que la licence soit accordée de nouveau.
|
||||
|
||||
10. Version de la licence
|
||||
Le Centre de services partagés du Québec, ses ayants cause ou toute personne qu'il désigne, peuvent diffuser des versions révisées ou modifiées de cette licence. Chaque version recevra un numéro unique. Si un logiciel est déjà soumis aux termes d'une version spécifique, c'est seulement cette version qui liera les parties à la licence.
|
||||
|
||||
Le concédant peut aussi choisir de concéder la licence sous la version actuelle ou toute version ultérieure, auquel cas le licencié peut choisir sous quelle version la licence lui est accordée.
|
||||
|
||||
11. Divers
|
||||
Dans la mesure où le concédant est un ministère, un organisme public ou une personne morale de droit public, créés en vertu d'une loi de l'Assemblée nationale du Québec, la licence est régie par le droit applicable au Québec et en cas de contestation, les tribunaux du Québec seront seuls compétents.
|
||||
|
||||
La présente licence peut être distribuée sans conditions particulières. Toutefois, une version modifiée doit être distribuée sous un nom différent. Toute référence au Centre de services partagés du Québec, et, le cas échéant, ses ayant cause, doit être retirée, autre que celle permettant d'identifier la provenance de la licence.
|
|
@ -0,0 +1,3 @@
|
|||
# Retroway BBS
|
||||
|
||||
Un BBS Telidon tentant de recréer l'expérience du Videoway.
|
|
@ -0,0 +1,16 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg viewBox="0 0 512 400" xmlns="http://www.w3.org/2000/svg" fill="#802080">
|
||||
<g>
|
||||
<text x="8" y="50" fill="white" font-size="doubleheight">à propos</text>
|
||||
<line x1="0" x2="512" y1="60" y2="60" stroke="#DD50DD" />
|
||||
</g>
|
||||
<text x="8" y="70" width="496" height="320" fill="white" font-size="small" word-wrap="true">
|
||||
Qui se souvient du fameux terminal Vidéoway de Vidéotron, avec ses menus, services interactifs, et ses nombreux jeux, actif entre 1990 et 2006? Ce service est une recréation non-officielle de cette interface, créée par un fan aussi près que possible de l'original, mais remise au goût du jour, comme s'il n'avait jamais disparu.
|
||||
</text>
|
||||
<g>
|
||||
<line x1="0" x2="512" y1="375" y2="375" stroke="#DD50DD" />
|
||||
<line x1="20" x2="20" y1="375" y2="400" stroke="#A080A0" />
|
||||
<line x1="424" x2="424" y1="375" y2="400" stroke="#A080A0" />
|
||||
<text x="22" y="398" fill="white">OK <ENTRÉE><!-- MENU SUIVANT <D>--></text>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.0 KiB |
|
@ -0,0 +1,17 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg viewBox="0 0 512 400" xmlns="http://www.w3.org/2000/svg" fill="#802080">
|
||||
<g>
|
||||
<text x="8" y="50" fill="white" font-size="doubleheight">crédits</text>
|
||||
<line x1="0" x2="512" y1="60" y2="60" stroke="#DD50DD" />
|
||||
</g>
|
||||
<text x="8" y="90" width="496" height="320" fill="white" font-size="medium">Programmation</text>
|
||||
<text x="24" y="110" width="496" height="320" fill="white" font-size="normal">a39</text>
|
||||
<text x="8" y="130" width="496" height="320" fill="white" font-size="medium">Art</text>
|
||||
<text x="24" y="150" width="496" height="320" fill="white" font-size="normal">Yuki Hazuki</text>
|
||||
<g>
|
||||
<line x1="0" x2="512" y1="375" y2="375" stroke="#DD50DD" />
|
||||
<line x1="20" x2="20" y1="375" y2="400" stroke="#A080A0" />
|
||||
<line x1="424" x2="424" y1="375" y2="400" stroke="#A080A0" />
|
||||
<text x="22" y="398" fill="white">OK <ENTRÉE><!-- MENU SUIVANT <D>--></text>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 996 B |
After Width: | Height: | Size: 335 B |
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg viewBox="0 0 512 400" xmlns="http://www.w3.org/2000/svg" fill="#802080">
|
||||
<g>
|
||||
<text x="8" y="50" fill="white" font-size="doubleheight">informations</text>
|
||||
<line x1="0" x2="512" y1="60" y2="60" stroke="#DD50DD" />
|
||||
</g>
|
||||
<text x="0" y="100" width="496" height="320" fill="white"> 1 à propos
|
||||
2 nouvelles
|
||||
3 aide
|
||||
4 crédits
|
||||
|
||||
|
||||
0 menu précédent</text>
|
||||
<g>
|
||||
<line x1="0" x2="512" y1="375" y2="375" stroke="#DD50DD" />
|
||||
<line x1="20" x2="20" y1="375" y2="400" stroke="#A080A0" />
|
||||
<line x1="424" x2="424" y1="375" y2="400" stroke="#A080A0" />
|
||||
<text x="22" y="398" fill="white">CHOIX <ENTRÉE><!-- MENU SUIVANT <D>--></text>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 767 B |
|
@ -0,0 +1,72 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg viewBox="0 0 512 400" xmlns="http://www.w3.org/2000/svg" fill="#206080">
|
||||
<g>
|
||||
<rect x="1" y="0" width="126" height="98" fill="#206080" stroke="#50DDDD" />
|
||||
<polyline points="1 0 1 98 127 98" fill="transparent" stroke="black" />
|
||||
<circle cx="40" cy="33" r="8" fill="#2080A0" />
|
||||
<rect x="22" y="46" width="20" height="6" fill="#2080A0" />
|
||||
<polygon points="30 46 50 46 30 97 16 97" fill="#2080A0" />
|
||||
<text x="110" y="42" fill="white" font-size="doubleheight">1</text>
|
||||
<text x="95" y="92" fill="white" font-size="small">info</text>
|
||||
</g>
|
||||
<g>
|
||||
<rect x="129" y="0" width="126" height="98" fill="#2080A0" stroke="#50DDDD" />
|
||||
<polyline points="129 0 129 98 255 98" fill="transparent" stroke="black" />
|
||||
<text x="238" y="42" fill="white" font-size="doubleheight">2</text>
|
||||
<text x="205" y="92" fill="white" font-size="small">horloge</text>
|
||||
<circle cx="174" cy="49" r="36" stroke="#206080" stroke-width="2px" />
|
||||
<polyline points="159 49 174 49 174 25" stroke="#206080" stroke-width="2px" />
|
||||
</g>
|
||||
<g>
|
||||
<rect x="257" y="0" width="126" height="98" fill="#206080" stroke="#50DDDD" />
|
||||
<polyline points="257 0 257 98 383 98" stroke="black" />
|
||||
</g>
|
||||
<g>
|
||||
<rect x="385" y="0" width="126" height="98" fill="#2080A0" stroke="#50DDDD" />
|
||||
<polyline points="385 0 385 98 511 98" stroke="black" />
|
||||
</g>
|
||||
<g>
|
||||
<rect x="1" y="100" width="126" height="98" fill="#2080A0" stroke="#50DDDD" />
|
||||
<polyline points="1 100 1 198 127 198" stroke="black" />
|
||||
</g>
|
||||
<g>
|
||||
<rect x="129" y="100" width="126" height="98" fill="#206080" stroke="#50DDDD" />
|
||||
<polyline points="129 100 129 198 255 198" stroke="black" />
|
||||
</g>
|
||||
<g>
|
||||
<rect x="257" y="100" width="126" height="98" fill="#2080A0" stroke="#50DDDD" />
|
||||
<polyline points="257 100 257 198 383 198" stroke="black" />
|
||||
</g>
|
||||
<g>
|
||||
<rect x="385" y="100" width="126" height="98" fill="#206080" stroke="#50DDDD" />
|
||||
<polyline points="385 100 385 198 511 198" stroke="black" />
|
||||
</g>
|
||||
<g>
|
||||
<rect x="1" y="200" width="126" height="98" fill="#206080" stroke="#50DDDD" />
|
||||
<polyline points="1 200 1 298 127 298" stroke="black" />
|
||||
</g>
|
||||
<g>
|
||||
<rect x="129" y="200" width="126" height="98" fill="#2080A0" stroke="#50DDDD" />
|
||||
<polyline points="129 200 129 298 255 298" stroke="black" />
|
||||
</g>
|
||||
<g>
|
||||
<rect x="257" y="200" width="126" height="98" fill="#206080" stroke="#50DDDD" />
|
||||
<polyline points="257 200 257 298 383 298" stroke="black" />
|
||||
</g>
|
||||
<g>
|
||||
<rect x="385" y="200" width="126" height="98" fill="#2080A0" stroke="#50DDDD" />
|
||||
<polyline points="385 200 385 298 511 298" stroke="black" />
|
||||
</g>
|
||||
<g>
|
||||
<rect x="0" y="300" width="512" height="75" fill="black" />
|
||||
<!--image href="assets/videoway.svg" x="180" y="300" width="75" height="75" /-->
|
||||
<text x="150" y="335" fill="white" font-size="small">bienvenue sur</text>
|
||||
<text x="240" y="360" fill="white" font-size="small">videoway.online</text>
|
||||
</g>
|
||||
<g>
|
||||
<line x1="0" x2="512" y1="375" y2="375" stroke="#50DDDD" />
|
||||
<line x1="20" x2="20" y1="375" y2="400" stroke="#2080A0" />
|
||||
<line x1="424" x2="424" y1="375" y2="400" stroke="#2080A0" />
|
||||
<text x="22" y="398" fill="white">CHOIX <ENTRÉE><!-- MENU SUIVANT <D>--></text>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.5 KiB |
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg viewBox="0 0 512 400" xmlns="http://www.w3.org/2000/svg" fill="black">
|
||||
<text x="256" y="30" fill="white">test page</text>
|
||||
<text x="256" y="60" fill="white" font-size="small">small</text>
|
||||
<text x="256" y="90" fill="white" font-size="normal">normal</text>
|
||||
<text x="256" y="120" fill="white" font-size="medium">medium</text>
|
||||
<text x="256" y="160" fill="white" font-size="doubleheight">doubleheight</text>
|
||||
<text x="256" y="200" fill="white" font-size="double">double</text>
|
||||
<text x="0" y="10" fill="white"> !"#$%&'()*+,-./
|
||||
0123456789:;<=>?
|
||||
@ABCDEFGHIJKLMNO
|
||||
PQRSTUVWXYZ[\]^_
|
||||
`abcdefghijklmno
|
||||
pqrstuvwxyz{|}~
|
||||
¡¢£$¥#§¤‘“«←↑→↓
|
||||
°±²³×µ¶·÷’”»¼½¾¿
|
||||
―¹®©™♪─│╱╲◢◣⅛⅜⅝⅞
|
||||
ΩÆÐªĦ┼IJĿŁØŒºÞŦŊʼn
|
||||
ĸæđðħıijŀłøœßþŧŋ
|
||||
ÀÈÌÒÙàèìòùÉÍĹŃÓŔŚÚÝŹáćéģíĺńóŕśúýźÂĈÊĜĤÎĴÔŜÛŴŶâĉêĝĥîĵôŝûŵŷÃĨÑÕŨãĩñõũĀĒĪŌŪāēīōūĂĞŬăğŭĊĖĠİŻċėġżÄËÏÖÜŸäëïöüÿÅŮåůÇĢĶĻŅŖŞŢçķļņŗşţŰőűĄĘĮŲąęįųČĎĚĽŇŘŠŤŽčďěľňřšťž
|
||||
</text>
|
||||
</svg>
|
After Width: | Height: | Size: 1.1 KiB |
|
@ -0,0 +1,34 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg" xmlns:bx="https://boxy-svg.com">
|
||||
<defs/>
|
||||
<path style="fill: rgb(216, 216, 216); stroke-linecap: round; stroke-linejoin: round; stroke-width: 14px; stroke: rgb(74, 74, 150);" d="M 80.849 38.991 L 423.166 38.991"/>
|
||||
<path style="fill: rgb(216, 216, 216); stroke-linecap: round; stroke-linejoin: round; stroke-width: 14px; stroke: rgb(74, 74, 150);" d="M 81.135 317.088 L 423.452 317.088"/>
|
||||
<path style="fill: rgb(216, 216, 216); stroke-linecap: round; stroke-linejoin: round; stroke-width: 14px; stroke: rgb(74, 74, 150);" d="M 71.388 73.395 L 433.2 73.395"/>
|
||||
<path style="fill: rgb(216, 216, 216); stroke-linecap: round; stroke-linejoin: round; stroke-width: 14px; stroke: rgb(74, 74, 150);" d="M 70.815 282.62 L 432.627 282.62"/>
|
||||
<path style="fill: rgb(216, 216, 216); stroke-linecap: round; stroke-linejoin: round; stroke-width: 14px; stroke: rgb(74, 74, 150);" d="M 65.654 108.881 L 438.361 108.881"/>
|
||||
<path style="fill: rgb(216, 216, 216); stroke-linecap: round; stroke-linejoin: round; stroke-width: 14px; stroke: rgb(74, 74, 150);" d="M 66.515 247.07 L 439.222 247.07"/>
|
||||
<path style="fill: rgb(216, 216, 216); stroke-linecap: round; stroke-linejoin: round; stroke-width: 14px; stroke: rgb(74, 74, 150);" d="M 63.074 144.432 L 441.515 144.432"/>
|
||||
<path style="fill: rgb(216, 216, 216); stroke-linecap: round; stroke-linejoin: round; stroke-width: 14px; stroke: rgb(74, 74, 150);" d="M 63.073 212.666 L 441.514 212.666"/>
|
||||
<path style="fill: rgb(216, 216, 216); stroke-linecap: round; stroke-linejoin: round; stroke-width: 14px; stroke: rgb(74, 74, 150);" d="M 60.781 178.262 L 444.383 178.262"/>
|
||||
<path style="fill: rgb(216, 216, 216); stroke-linecap: round; stroke-linejoin: round; stroke-width: 24px; stroke: rgb(74, 74, 150);" d="M 111.239 39.5 L 270.069 39.5"/>
|
||||
<path style="fill: rgb(216, 216, 216); stroke-linecap: round; stroke-linejoin: round; stroke-width: 24px; stroke: rgb(74, 74, 150);" d="M 144.783 73.331 L 303.613 73.331"/>
|
||||
<path style="fill: rgb(216, 216, 216); stroke-linecap: round; stroke-linejoin: round; stroke-width: 24px; stroke: rgb(74, 74, 150);" d="M 179.187 108.308 L 338.017 108.308"/>
|
||||
<path style="fill: rgb(216, 216, 216); stroke-linecap: round; stroke-linejoin: round; stroke-width: 24px; stroke: rgb(74, 74, 150);" d="M 213.017 143.859 L 371.847 143.859"/>
|
||||
<path style="fill: rgb(216, 216, 216); stroke-linecap: round; stroke-linejoin: round; stroke-width: 24px; stroke: rgb(74, 74, 150);" d="M 246.847 177.689 L 405.677 177.689"/>
|
||||
<path style="fill: rgb(216, 216, 216); stroke-linecap: round; stroke-linejoin: round; stroke-width: 24px; stroke: rgb(74, 74, 150);" d="M 212.443 212.666 L 371.273 212.666"/>
|
||||
<path style="fill: rgb(216, 216, 216); stroke-linecap: round; stroke-linejoin: round; stroke-width: 24px; stroke: rgb(74, 74, 150);" d="M 179.186 247.07 L 338.016 247.07"/>
|
||||
<path style="fill: rgb(216, 216, 216); stroke-linecap: round; stroke-linejoin: round; stroke-width: 24px; stroke: rgb(74, 74, 150);" d="M 144.209 282.62 L 303.039 282.62"/>
|
||||
<path style="fill: rgb(216, 216, 216); stroke-linecap: round; stroke-linejoin: round; stroke-width: 24px; stroke: rgb(74, 74, 150);" d="M 111.526 317.597 L 270.356 317.597"/>
|
||||
<polygon style="fill: rgb(255, 255, 255); stroke: rgb(255, 255, 255); stroke-linecap: round; stroke-linejoin: round;" points="39.011 391.408 32.458 371.599 8.144 371.599 24.862 406.599 53.011 406.599 68.65 371.748 45.117 371.748"/>
|
||||
<rect x="72.671" y="371.897" width="21.894" height="34.405" style="stroke-linecap: round; stroke-linejoin: round; stroke: rgb(255, 255, 255); fill: rgb(255, 255, 255);"/>
|
||||
<path style="fill: rgb(255, 255, 255);" d="M 89.196 368.019 C 89.196 368.019 85.86194433292833 368.208997198175 84.027 368.168 C 81.9319326011376 368.12119100868637 79.25771972713565 368.11911281455787 77.304 367.673 C 75.69871967541536 367.30644991924464 73.99137751516946 366.7770933692031 73.07 366.004 C 72.40830313549891 365.44879494024326 71.98633433694843 364.73048138414515 71.843 364.003 C 71.69651081653538 363.259506457434 71.90680954958303 362.2235127573042 72.236 361.583 C 72.52007625629093 361.0302668755395 72.92759713820824 360.6748137376387 73.531 360.296 C 74.43618840552254 359.7277265878638 75.92258834950455 359.21620352149415 77.406 358.93 C 79.27622022786292 358.5691671758779 81.80696611034219 358.62175550249344 83.931 358.654 C 85.9612305647518 358.6848204895889 88.11101909664859 358.7285269329058 89.882 359.087 C 91.37812433977533 359.3898379808153 92.91066365791312 359.8530065693353 93.915 360.454 C 94.64754400193257 360.89235328304403 95.23522258114255 361.3508591235791 95.57 362.001 C 95.92441847408352 362.6892839892452 96.10368526512268 363.73974471025673 95.904 364.518 C 95.69469774934954 365.3337366224484 95.09026898253485 366.2032409097456 94.251 366.765 C 93.1042174161036 367.532591266275 89.196 368.019 89.196 368.019 C 89.196 368.01900000000006 89.196 368.019 89.196 368.019" bx:d="M 89.196 368.019 R 84.027 368.168 R 77.304 367.673 R 73.07 366.004 R 71.843 364.003 R 72.236 361.583 R 73.531 360.296 R 77.406 358.93 R 83.931 358.654 R 89.882 359.087 R 93.915 360.454 R 95.57 362.001 R 95.904 364.518 R 94.251 366.765 R 89.196 368.019 Z"/>
|
||||
<path style="fill: rgb(255, 255, 255);" d="M 127.928 396.672 C 126.984 396.595 125.728 396.417 124.92 395.831 C 124.076 395.219 123.433 394.03 123.026 392.993 C 122.617 391.95 122.548 390.781 122.478 389.588 C 122.402 388.284 122.478 386.62 122.653 385.471 C 122.782 384.619 122.891 383.991 123.233 383.283 C 123.62 382.481 124.196 381.425 124.966 380.959 C 125.743 380.488 126.94 380.438 127.885 380.49 C 128.798 380.54 129.81 380.732 130.547 381.226 C 131.308 381.736 131.924 382.707 132.349 383.551 C 132.759 384.364 132.936 385.189 133.091 386.183 C 133.285 387.427 133.347 389.083 133.239 390.464 C 133.136 391.78 133.062 393.266 132.5 394.287 C 131.998 395.2 130.239 396.419 130.239 396.419 C 130.239 396.419 128.742 396.739 127.928 396.672 Z M 119.414 369.652 C 108.231 369.652 99.166 378.201 99.166 388.746 C 99.166 399.291 108.231 407.84 119.414 407.84 C 130.597 407.84 139.662 399.291 139.662 388.746 C 139.662 378.201 130.597 369.652 119.414 369.652 Z"/>
|
||||
<rect x="136.342" y="358.343" width="22.491" height="48.126" style="fill: rgb(255, 255, 255); stroke: rgb(255, 255, 255); stroke-linecap: round; stroke-linejoin: round;"/>
|
||||
<polygon style="fill: rgb(255, 255, 255); stroke: rgb(255, 255, 255); stroke-linecap: round; stroke-linejoin: round; stroke-width: 3px;" points="176.759 365.912 176.853 363.38 208.742 359.534 208.93 365.912"/>
|
||||
<path style="fill: rgb(255, 255, 255);" d="M 258.907 399.436 C 258.907 399.436 260.848 397.785 261.404 396.61 C 262.052 395.239 262.106 393.287 262.22 391.546 C 262.34 389.714 262.27 387.526 262.055 385.874 C 261.884 384.561 261.701 383.476 261.238 382.387 C 260.77 381.285 260.12 379.983 259.247 379.307 C 258.444 378.686 257.319 378.397 256.308 378.331 C 255.267 378.263 253.932 378.371 253.085 378.953 C 252.195 379.565 251.598 380.983 251.171 382.031 C 250.785 382.98 250.675 383.806 250.532 384.932 C 250.338 386.458 250.253 388.658 250.338 390.386 C 250.415 391.964 250.48 393.5 250.943 394.895 C 251.393 396.252 252.058 397.846 253.034 398.657 C 253.914 399.389 255.31 399.671 256.355 399.772 C 257.251 399.859 258.907 399.436 258.907 399.436 Z M 256.487 407.676 C 251.745 407.523 244.723 407.405 240.285 406.6 C 237.081 406.019 234.29 405.76 232.179 404.158 C 230.061 402.55 228.512 400.031 227.611 396.955 C 226.333 392.59 226.529 383.778 227.532 379.781 C 228.125 377.419 228.9 375.894 230.388 374.506 C 232.112 372.898 234.629 371.93 237.718 371.176 C 242.408 370.031 250.421 370.243 256.253 370.199 C 261.463 370.16 266.913 370.046 271.053 370.755 C 274.166 371.288 276.803 371.795 279.047 373.243 C 281.262 374.673 283.32 376.472 284.465 379.341 C 286.21 383.716 286.787 393.845 285.088 398.298 C 283.913 401.377 281.561 403.312 278.83 404.859 C 275.591 406.693 266.39 407.66 266.39 407.66 C 266.39 407.66 260.19 407.796 256.487 407.676 Z"/>
|
||||
<polygon style="fill: rgb(255, 255, 255); stroke: rgb(255, 255, 255); stroke-linecap: round; stroke-linejoin: round;" points="286.289 371.432 309.377 371.432 315.695 391.247 321.597 371.221 338.045 371.221 344.152 390.298 351.108 371.01 373.143 371.01 360.383 406.529 335.402 406.529 330.029 390.087 323.916 406.74 299.247 406.74"/>
|
||||
<path style="fill: rgb(255, 255, 255);" d="M 400.53 396.587 C 399.586 396.51 398.33 396.332 397.522 395.746 C 396.678 395.134 396.035 393.945 395.628 392.908 C 395.219 391.865 395.15 390.696 395.08 389.503 C 395.004 388.199 395.08 386.535 395.255 385.386 C 395.384 384.534 395.493 383.906 395.835 383.198 C 396.222 382.396 396.798 381.34 397.568 380.874 C 398.345 380.403 399.542 380.353 400.487 380.405 C 401.4 380.455 402.412 380.647 403.149 381.141 C 403.91 381.651 404.526 382.622 404.951 383.466 C 405.361 384.279 405.538 385.104 405.693 386.098 C 405.887 387.342 405.949 388.998 405.841 390.379 C 405.738 391.695 405.664 393.181 405.102 394.202 C 404.6 395.115 402.841 396.334 402.841 396.334 C 402.841 396.334 401.344 396.654 400.53 396.587 Z M 392.016 369.567 C 380.833 369.567 371.768 378.116 371.768 388.661 C 371.768 399.206 380.833 407.755 392.016 407.755 C 403.199 407.755 412.264 399.206 412.264 388.661 C 412.264 378.116 403.199 369.567 392.016 369.567 Z"/>
|
||||
<rect x="409.014" y="371.281" width="22.013" height="35.273" style="stroke: rgb(255, 255, 255); stroke-linecap: round; stroke-linejoin: round; fill: rgb(255, 255, 255);"/>
|
||||
<polygon style="fill: rgb(255, 255, 255); stroke-linecap: round; stroke-linejoin: round; stroke: rgb(255, 255, 255);" points="434.52 371.627 457.914 371.627 464.785 389.483 472.552 371.449 495.681 371.449 469.695 419.569 445.942 419.569 453.447 405.91"/>
|
||||
<path d="M 187.401 391.862 L 222.997 391.93 C 223.162 387.347 222.521 382.034 221.381 379.176 C 220.236 376.307 218.178 374.508 215.963 373.078 C 213.719 371.63 198.379 369.995 193.169 370.034 C 187.337 370.078 176.961 370.239 172.271 371.384 C 169.182 372.138 165.041 377.254 164.448 379.616 C 163.445 383.613 163.249 392.425 164.527 396.79 C 165.428 399.866 166.977 402.385 169.095 403.993 C 171.206 405.595 173.997 405.854 177.201 406.435 C 181.639 407.24 188.661 407.358 193.403 407.511 C 197.106 407.631 203.306 407.495 203.306 407.495 C 203.306 407.495 212.507 406.528 215.746 404.694 C 218.477 403.147 220.829 401.212 222.004 398.133 C 222.219 397.569 222.398 396.913 222.543 396.19 L 198.431 396.19 C 198.396 396.277 197.872 397.146 197.833 397.229 C 197.277 398.404 196.157 398.847 196.157 398.847 C 196.157 398.847 194.167 399.694 193.271 399.607 C 192.226 399.506 190.83 399.224 189.95 398.492 C 188.974 397.681 188.309 396.087 187.859 394.73 C 187.617 394.001 187.484 392.654 187.401 391.862 Z M 188.453 383.628 C 188.487 382.468 188.555 380.146 190.009 379.059 C 191.462 377.971 194.302 378.118 195.715 379.283 C 197.128 380.449 197.116 382.634 197.109 383.726 C 197.103 384.819 197.103 384.819 197.103 384.819 C 197.103 384.819 197.103 384.819 195.656 384.814 C 194.208 384.809 191.314 384.799 189.866 384.794 C 188.419 384.789 188.419 384.789 188.419 384.789 C 188.419 384.789 188.419 384.789 188.453 383.628 Z" style="fill: rgb(255, 255, 255);"/>
|
||||
</svg>
|
After Width: | Height: | Size: 11 KiB |
|
@ -0,0 +1,94 @@
|
|||
const { Color, Point } = require("telidon");
|
||||
const Page = require("./page.js");
|
||||
|
||||
module.exports = class Menu extends Page {
|
||||
globalMenu = {
|
||||
"#": "./views/mainmenu.js",
|
||||
"#8378": "./views/test.js",
|
||||
"*": ()=>this.gotoPrev(),
|
||||
"*69": null,
|
||||
"*911": ()=>{throw new Error("Écran de la mort qui tue causé par l'utilisateur")},
|
||||
}
|
||||
|
||||
selection = "";
|
||||
menu = {};
|
||||
bgColor = new Color(0,0,0);
|
||||
fgColor = new Color(1,1,1);
|
||||
position = new Point(0.836,0);
|
||||
maxLength = 5;
|
||||
|
||||
constructor(naplps) {
|
||||
super(naplps);
|
||||
}
|
||||
|
||||
start() {
|
||||
//this.naplps.pointSetAbs(this.position);
|
||||
//this.naplps.textMode();
|
||||
}
|
||||
|
||||
data(byte) {
|
||||
if(byte == 13) {
|
||||
if(Object.keys(this.globalMenu).includes(this.selection))
|
||||
{
|
||||
if(typeof this.globalMenu[this.selection] == "function")
|
||||
this.globalMenu[this.selection]();
|
||||
else
|
||||
this.goto(this.globalMenu[this.selection]);
|
||||
}
|
||||
else if(Object.keys(this.menu).includes(this.selection))
|
||||
{
|
||||
if(typeof this.menu[this.selection] == "function")
|
||||
this.menu[this.selection]();
|
||||
else
|
||||
this.goto(this.menu[this.selection]);
|
||||
}
|
||||
else {
|
||||
this.naplps.bell();
|
||||
if(this.selection.length > 0){
|
||||
this.naplps.pdiMode();
|
||||
this.naplps.pointSetAbs(this.position);
|
||||
this.naplps.setColor(this.bgColor);
|
||||
this.naplps.textMode();
|
||||
this.naplps.write(this.selection);
|
||||
/*this.naplps.pdiMode();
|
||||
this.naplps.pointSetAbs(this.position);
|
||||
this.naplps.setColor(this.fgColor);
|
||||
this.naplps.textMode();*/
|
||||
this.selection = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
if((byte >= 48 && byte <= 57 && this.selection.length < this.maxLength) ||
|
||||
((byte == 35 || byte == 42) && this.selection.length == 0))
|
||||
{
|
||||
this.naplps.pdiMode();
|
||||
this.naplps.pointSetAbs(new Point(this.position.x + this.naplps.options.characterSize.x * this.selection.length, this.position.y));
|
||||
this.selection += String.fromCharCode(byte);
|
||||
this.naplps.textMode();
|
||||
this.naplps.writeBytes(byte);
|
||||
this.naplps.pdiMode();
|
||||
}
|
||||
if(byte == 8)
|
||||
{
|
||||
if(this.selection.length > 0)
|
||||
{
|
||||
this.naplps.pdiMode();
|
||||
this.naplps.pointSetAbs(this.position);
|
||||
this.naplps.setColor(this.bgColor);
|
||||
this.naplps.text(this.selection);
|
||||
this.naplps.pointSetAbs(this.position);
|
||||
this.naplps.setColor(this.fgColor);
|
||||
this.selection = this.selection.slice(0,-1);
|
||||
this.naplps.text(this.selection);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.naplps.bell();
|
||||
}
|
||||
}
|
||||
// TODO: if arrow keys, esc
|
||||
}
|
||||
|
||||
leave() {
|
||||
}
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
module.exports = class Page {
|
||||
/** @type Naplps */
|
||||
naplps;
|
||||
goto;
|
||||
gotoPrev;
|
||||
constructor(/** @type Naplps */naplps) {
|
||||
this.naplps = naplps;
|
||||
}
|
||||
|
||||
data(d){}
|
||||
leave(){}
|
||||
}
|
|
@ -0,0 +1,72 @@
|
|||
const { Telidon } = require("telidon");
|
||||
const fs = require("fs");
|
||||
|
||||
const curdir = process.cwd();
|
||||
|
||||
function invalidate(file) {
|
||||
if(require.cache[require.resolve(file)]) {
|
||||
require.cache[require.resolve(file)].children.forEach(c=>{
|
||||
if(c.filename.startsWith(curdir))
|
||||
invalidate(c.filename);
|
||||
});
|
||||
delete require.cache[require.resolve(file)];
|
||||
}
|
||||
}
|
||||
|
||||
function watch(file) {
|
||||
return fs.watch(file, { recursive: true }, (eventType, filename) => {
|
||||
if(eventType == 'change') invalidate(file+filename);
|
||||
});
|
||||
}
|
||||
|
||||
watch("./helpers/");
|
||||
watch("./views/");
|
||||
|
||||
var server = new Telidon({}, c=>{
|
||||
var current = null;
|
||||
var currentPage = "./views/mainmenu.js";
|
||||
var prevPage = null;
|
||||
|
||||
c.debug = true;
|
||||
c.options.multiLength = 5;
|
||||
c.init();
|
||||
|
||||
c.on("error", (err) => {
|
||||
console.error(`Caught exception: ${err.stack}\n`)
|
||||
c.cancel();
|
||||
if(current != null)
|
||||
current.leave();
|
||||
current = null;
|
||||
c.uninit();
|
||||
c.write("\r\n\x1b[44m ÉCRAN DE LA MORT QUI TUE \x1b[0m\r\n\r\n");
|
||||
c.write("Le serveur a rencontré une erreur fatale :(\r\n\r\n");
|
||||
c.write("Vous pouvez nous aider en rapportant l'erreur suivante à nos admins:\r\n\r\n");
|
||||
c.write((err.stack||"").split("\n").flatMap(a=>a.match(/.{1,80}/g)||[]).join("\r\n"));
|
||||
c.write("\r\n\r\nVous pouvez maintenant vous déconnecter et vous reconnecter de nouveau.\r\nBonne journée!\r\n");
|
||||
});
|
||||
|
||||
var goto = (page, save = true)=>{
|
||||
if(save) prevPage = currentPage;
|
||||
if(!page) page = currentPage;
|
||||
currentPage = page;
|
||||
if(current != null)
|
||||
{
|
||||
c.cancel();
|
||||
current.leave();
|
||||
}
|
||||
var pg = require(page);
|
||||
current = new pg(c);
|
||||
current.goto = goto;
|
||||
current.gotoPrev = gotoPrev;
|
||||
}
|
||||
var gotoPrev = () => {
|
||||
if(prevPage) goto(prevPage);
|
||||
}
|
||||
goto();
|
||||
c.on("data", d=>{
|
||||
if(current != null)
|
||||
current.data(d)
|
||||
});
|
||||
});
|
||||
|
||||
server.listen(8354);
|
|
@ -0,0 +1,42 @@
|
|||
{
|
||||
"name": "retrowaybbs",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"dependencies": {
|
||||
"telidon": "file:../node-telidon"
|
||||
}
|
||||
},
|
||||
"../node-iconv": {
|
||||
"name": "iconv",
|
||||
"version": "3.0.1",
|
||||
"extraneous": true,
|
||||
"license": "ISC",
|
||||
"engines": {
|
||||
"node": ">=10.0.0"
|
||||
}
|
||||
},
|
||||
"../node-telidon": {
|
||||
"name": "telidon",
|
||||
"version": "0.1.0",
|
||||
"hasInstallScript": true,
|
||||
"license": "LiLiQ-P-1.1",
|
||||
"dependencies": {
|
||||
"color-rgba": "^3.0.0",
|
||||
"iconv": "^3.0.1",
|
||||
"jsdom": "^26.1.0",
|
||||
"sharp": "^0.34.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/color-rgba": "^2.1.3",
|
||||
"@types/jsdom": "^21.1.7",
|
||||
"@types/node": "^24.0.15"
|
||||
}
|
||||
},
|
||||
"node_modules/telidon": {
|
||||
"resolved": "../node-telidon",
|
||||
"link": true
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"main": "index.js",
|
||||
"type": "commonjs",
|
||||
"dependencies": {
|
||||
"telidon": "file:../node-telidon"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
const { Color } = require("telidon");
|
||||
const Menu = require("../helpers/menu.js");
|
||||
|
||||
module.exports = class AproposMenu extends Menu {
|
||||
bgColor = new Color(0x80/255,0x20/255,0x80/255);
|
||||
menu = {
|
||||
"": "./views/info.js"
|
||||
};
|
||||
constructor(naplps) {
|
||||
super(naplps);
|
||||
naplps.nsr();
|
||||
naplps.pdiMode();
|
||||
naplps.setDomain();
|
||||
|
||||
naplps.drawSvg("assets/apropos.svg").then(_=>this.start());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
const { Color } = require("telidon");
|
||||
const Menu = require("../helpers/menu.js");
|
||||
|
||||
module.exports = class CreditsMenu extends Menu {
|
||||
bgColor = new Color(0x80/255,0x20/255,0x80/255);
|
||||
menu = {
|
||||
"": "./views/info.js"
|
||||
};
|
||||
constructor(naplps) {
|
||||
super(naplps);
|
||||
naplps.nsr();
|
||||
naplps.pdiMode();
|
||||
naplps.setDomain();
|
||||
|
||||
naplps.drawSvg("assets/credits.svg").then(_=>this.start());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
const { Color, Naplps, Point } = require("telidon");
|
||||
const Menu = require("../helpers/menu.js");
|
||||
|
||||
module.exports = class Horloge extends Menu {
|
||||
bgColor = new Color(0.125,0.5,0.5);
|
||||
fgColor = new Color(1,1,1);
|
||||
menu = {
|
||||
"": "./views/mainmenu.js"
|
||||
};
|
||||
constructor(/** @type Naplps */naplps) {
|
||||
super(naplps);
|
||||
naplps.nsr();
|
||||
naplps.pdiMode();
|
||||
naplps.options.pelSize = new Point(0.01,0.01);
|
||||
naplps.setDomain();
|
||||
naplps.setColor(new Color(0.125,0.5,0.5));
|
||||
naplps.setRectFilled([
|
||||
new Point(0,0),
|
||||
new Point(1,0.75),
|
||||
]);
|
||||
|
||||
naplps.setColor(new Color(1,1,1));
|
||||
naplps.setArcFilled([
|
||||
new Point(0.5,0.2),
|
||||
new Point(0,0.5),
|
||||
]);
|
||||
naplps.setColor(new Color(0,0,0));
|
||||
naplps.setArcOutlined([
|
||||
new Point(0.5,0.2),
|
||||
new Point(0,0.5),
|
||||
]);
|
||||
|
||||
var date = new Date();
|
||||
|
||||
this.interval = setInterval(()=>{
|
||||
naplps.pdiMode();
|
||||
naplps.doubleHeightText();
|
||||
naplps.setColor(new Color(0.125,0.5,0.5));
|
||||
naplps.pointSetAbs(new Point(0.4,0.1));
|
||||
naplps.text(date.toLocaleTimeString());
|
||||
naplps.setColor(new Color(1,1,1));
|
||||
naplps.pointSetAbs(new Point(0.5,0.45));
|
||||
var t = Math.floor((date.getTime()-date.getTimezoneOffset()*60000)/1000);
|
||||
var h = t%43200/21600*Math.PI;
|
||||
var m = t%3600/1800*Math.PI;
|
||||
var s = t%60/30*Math.PI;
|
||||
naplps.lineRel([
|
||||
new Point(Math.sin(h)*0.12,Math.cos(h)*0.12),
|
||||
new Point(-Math.sin(h)*0.12,-Math.cos(h)*0.12),
|
||||
new Point(Math.sin(m)*0.16,Math.cos(m)*0.16),
|
||||
new Point(-Math.sin(m)*0.16,-Math.cos(m)*0.16),
|
||||
new Point(Math.sin(s)*0.2,Math.cos(s)*0.2),
|
||||
]);
|
||||
date = new Date();
|
||||
naplps.setColor(new Color(1,1,1));
|
||||
naplps.pointSetAbs(new Point(0.4,0.1));
|
||||
naplps.text(date.toLocaleTimeString());
|
||||
naplps.normalText();
|
||||
naplps.setColor(new Color(0,0,0));
|
||||
naplps.pointSetAbs(new Point(0.5,0.45));
|
||||
var t = Math.floor((date.getTime()-date.getTimezoneOffset()*60000)/1000);
|
||||
var h = t%43200/21600*Math.PI;
|
||||
var m = t%3600/1800*Math.PI;
|
||||
var s = t%60/30*Math.PI;
|
||||
naplps.lineRel([
|
||||
new Point(Math.sin(h)*0.12,Math.cos(h)*0.12),
|
||||
new Point(-Math.sin(h)*0.12,-Math.cos(h)*0.12),
|
||||
new Point(Math.sin(m)*0.16,Math.cos(m)*0.16),
|
||||
new Point(-Math.sin(m)*0.16,-Math.cos(m)*0.16),
|
||||
new Point(Math.sin(s)*0.2,Math.cos(s)*0.2),
|
||||
]);
|
||||
}, 1000);
|
||||
this.start();
|
||||
}
|
||||
|
||||
leave() {
|
||||
clearInterval(this.interval);
|
||||
this.naplps.options.pelSize = new Point(0,0);
|
||||
this.naplps.setDomain();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
const { Color } = require("telidon");
|
||||
const Menu = require("../helpers/menu.js");
|
||||
|
||||
module.exports = class InfoMenu extends Menu {
|
||||
bgColor = new Color(0x80/255,0x20/255,0x80/255);
|
||||
menu = {
|
||||
"0": "./views/mainmenu.js",
|
||||
"1": "./views/apropos.js",
|
||||
"4": "./views/credits.js"
|
||||
};
|
||||
constructor(naplps) {
|
||||
super(naplps);
|
||||
naplps.nsr();
|
||||
naplps.pdiMode();
|
||||
naplps.setDomain();
|
||||
|
||||
naplps.drawSvg("assets/infomenu.svg").then(_=>this.start());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
const { Color } = require("telidon");
|
||||
const Menu = require("../helpers/menu.js");
|
||||
|
||||
module.exports = class MainMenu extends Menu {
|
||||
bgColor = new Color(0x20/255,0x60/255,0x80/255);
|
||||
menu = {
|
||||
"1": "./views/info.js",
|
||||
"2": "./views/horloge.js"
|
||||
};
|
||||
constructor(naplps) {
|
||||
super(naplps);
|
||||
naplps.nsr();
|
||||
naplps.pdiMode();
|
||||
naplps.setDomain();
|
||||
|
||||
naplps.drawSvg("assets/menu.svg").then(_=>this.start());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
const { Color } = require("telidon");
|
||||
const Menu = require("../helpers/menu.js");
|
||||
|
||||
module.exports = class TestMenu extends Menu {
|
||||
bgColor = new Color(0,0,0);
|
||||
fgColor = new Color(1,1,1);
|
||||
menu = {
|
||||
};
|
||||
constructor(naplps) {
|
||||
super(naplps);
|
||||
naplps.nsr();
|
||||
naplps.pdiMode();
|
||||
naplps.setDomain();
|
||||
|
||||
naplps.drawSvg("assets/test.svg").then(_=>this.start());
|
||||
}
|
||||
}
|