@ -0,0 +1 @@ |
|||||||
|
/.vs/ |
@ -0,0 +1,3 @@ |
|||||||
|
{ |
||||||
|
"liveServer.settings.port": 5501 |
||||||
|
} |
@ -0,0 +1,2 @@ |
|||||||
|
DO NOT USE THIS CODE OR LOOK AT IT IF YOU ARE NOT ALLOWED TO |
||||||
|
IF YOU DO YOU CAN USE OR TEACH THE KNOWLEAGE YOU ACQUEIRED. |
@ -0,0 +1,15 @@ |
|||||||
|
# Skamcraft |
||||||
|
|
||||||
|
## Start |
||||||
|
* Start with live server in VsCode to get full functionnality. |
||||||
|
* Start with php : |
||||||
|
``` bash |
||||||
|
cd /.../Skamcraft |
||||||
|
php -S 127.0.0.1:80 |
||||||
|
``` |
||||||
|
|
||||||
|
## Norm |
||||||
|
* ``` ; ``` at the end of each line. |
||||||
|
* snack_case for functions and variables. |
||||||
|
* UpperCamelCase for Classes. |
||||||
|
* all in english. |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 287 KiB |
After Width: | Height: | Size: 969 KiB |
Before Width: | Height: | Size: 209 KiB After Width: | Height: | Size: 209 KiB |
After Width: | Height: | Size: 315 KiB |
After Width: | Height: | Size: 203 KiB |
After Width: | Height: | Size: 135 B |
After Width: | Height: | Size: 767 B |
After Width: | Height: | Size: 579 B |
After Width: | Height: | Size: 729 B |
After Width: | Height: | Size: 675 B |
After Width: | Height: | Size: 545 KiB |
@ -0,0 +1,15 @@ |
|||||||
|
/* Copyright © 2023 Entreprise SkamKraft */ |
||||||
|
|
||||||
|
|
||||||
|
.ext-modal[open] { |
||||||
|
animation: myFadeIn 2.0s ease normal; |
||||||
|
} |
||||||
|
|
||||||
|
@keyframes myFadeIn{ |
||||||
|
from { |
||||||
|
bottom: 100%; |
||||||
|
} |
||||||
|
to { |
||||||
|
bottom: 0%; |
||||||
|
} |
||||||
|
} |
@ -1,165 +0,0 @@ |
|||||||
/* Copyright © 2023 Entreprise SkamCraft */ |
|
||||||
|
|
||||||
/* @font-face { |
|
||||||
font-family: M42; |
|
||||||
src: url(/fonts/m42.TTF); |
|
||||||
} */ |
|
||||||
|
|
||||||
* { |
|
||||||
font-family: "Montserrat", sans-serif; |
|
||||||
font-size: 16px; |
|
||||||
color: #ffffff; |
|
||||||
margin: 0; |
|
||||||
padding: 0; |
|
||||||
text-decoration: none; |
|
||||||
list-style: none; |
|
||||||
} |
|
||||||
|
|
||||||
body { |
|
||||||
background-color: #212121; |
|
||||||
} |
|
||||||
|
|
||||||
.logo { |
|
||||||
display: flex; |
|
||||||
justify-content: center; |
|
||||||
align-items: center; |
|
||||||
} |
|
||||||
|
|
||||||
.logo img { |
|
||||||
width: 80px; |
|
||||||
padding: 20px; |
|
||||||
} |
|
||||||
|
|
||||||
.logo h4 { |
|
||||||
font-size: 30px; |
|
||||||
} |
|
||||||
|
|
||||||
.form { |
|
||||||
--input-focus: #a37b03; |
|
||||||
--font-color: #323232; |
|
||||||
--font-color-sub: #666666; |
|
||||||
--bg-color: beige; |
|
||||||
--main-color: black; |
|
||||||
padding: 20px; |
|
||||||
background: #eab308; |
|
||||||
display: flex; |
|
||||||
flex-direction: column; |
|
||||||
align-items: center; |
|
||||||
justify-content: center; |
|
||||||
text-align: center; |
|
||||||
gap: 20px; |
|
||||||
border-radius: 20px; |
|
||||||
border: 2px solid var(--main-color); |
|
||||||
box-shadow: 4px 4px var(--main-color); |
|
||||||
width: 20%; |
|
||||||
margin: auto; |
|
||||||
margin-top: 10%; |
|
||||||
} |
|
||||||
|
|
||||||
.title { |
|
||||||
color: var(--font-color); |
|
||||||
font-weight: 900; |
|
||||||
font-size: 20px; |
|
||||||
} |
|
||||||
|
|
||||||
.title span { |
|
||||||
color: var(--font-color-sub); |
|
||||||
font-weight: 600; |
|
||||||
font-size: 17px; |
|
||||||
} |
|
||||||
|
|
||||||
.input { |
|
||||||
width: 250px; |
|
||||||
height: 40px; |
|
||||||
border-radius: 5px; |
|
||||||
border: 2px solid var(--main-color); |
|
||||||
background-color: var(--bg-color); |
|
||||||
box-shadow: 4px 4px var(--main-color); |
|
||||||
font-size: 15px; |
|
||||||
font-weight: 600; |
|
||||||
color: var(--font-color); |
|
||||||
padding: 5px 10px; |
|
||||||
outline: none; |
|
||||||
} |
|
||||||
|
|
||||||
.input::placeholder { |
|
||||||
color: var(--font-color-sub); |
|
||||||
opacity: 0.8; |
|
||||||
} |
|
||||||
|
|
||||||
.input:focus { |
|
||||||
border: 2px solid var(--input-focus); |
|
||||||
} |
|
||||||
|
|
||||||
.select * { |
|
||||||
color: var(--main-color); |
|
||||||
} |
|
||||||
|
|
||||||
.button-confirm { |
|
||||||
width: 120px; |
|
||||||
height: 40px; |
|
||||||
border-radius: 5px; |
|
||||||
border: 2px solid var(--main-color); |
|
||||||
background-color: var(--bg-color); |
|
||||||
box-shadow: 4px 4px var(--main-color); |
|
||||||
font-size: 17px; |
|
||||||
font-weight: 600; |
|
||||||
color: var(--font-color); |
|
||||||
cursor: pointer; |
|
||||||
} |
|
||||||
|
|
||||||
.button-confirm:active { |
|
||||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); |
|
||||||
} |
|
||||||
|
|
||||||
.link-connection { |
|
||||||
position: relative; |
|
||||||
display: inline-block; |
|
||||||
} |
|
||||||
|
|
||||||
.link-connection:hover { |
|
||||||
cursor: pointer; |
|
||||||
text-underline-offset: 2px; |
|
||||||
text-decoration: underline; |
|
||||||
transform: scale(1.1); |
|
||||||
transition: 0.3s; |
|
||||||
} |
|
||||||
|
|
||||||
.alert { |
|
||||||
position: fixed; |
|
||||||
left: 50%; |
|
||||||
transform: translateX(-50%); |
|
||||||
bottom: 10%; |
|
||||||
border-radius: 0.5rem; |
|
||||||
border-width: 0.25rem; |
|
||||||
border-color: #ef4444; |
|
||||||
background-color: #fee2e2; |
|
||||||
padding: 1rem; |
|
||||||
width: 300px; |
|
||||||
max-width: 90%; |
|
||||||
text-align: center; |
|
||||||
} |
|
||||||
|
|
||||||
.alert-inner { |
|
||||||
display: flex; |
|
||||||
align-items: center; |
|
||||||
gap: 0.5rem; |
|
||||||
color: #ef4444; |
|
||||||
} |
|
||||||
|
|
||||||
.icon { |
|
||||||
height: 1.25rem; |
|
||||||
width: 1.25rem; |
|
||||||
fill: #d94848; |
|
||||||
} |
|
||||||
|
|
||||||
.message { |
|
||||||
color: #d94848; |
|
||||||
font-weight: 500; |
|
||||||
} |
|
||||||
|
|
||||||
.content { |
|
||||||
margin-top: 0.5rem; |
|
||||||
font-size: 0.875rem; |
|
||||||
color: #d94848; |
|
||||||
} |
|
@ -1,96 +0,0 @@ |
|||||||
/* Copyright © 2023 Entreprise SkamCraft */ |
|
||||||
|
|
||||||
* { |
|
||||||
font-family: "Inter", sans-serif; |
|
||||||
box-sizing: border-box; |
|
||||||
overflow: hidden; |
|
||||||
background-color: #272727; |
|
||||||
} |
|
||||||
|
|
||||||
body, |
|
||||||
html { |
|
||||||
height: 100%; |
|
||||||
display: flex; |
|
||||||
flex-direction: column; |
|
||||||
} |
|
||||||
|
|
||||||
/* Menu */ |
|
||||||
.menu { |
|
||||||
display: flex; |
|
||||||
align-items: center; |
|
||||||
justify-content: space-between; |
|
||||||
} |
|
||||||
|
|
||||||
.title-section { |
|
||||||
color: white; |
|
||||||
display: flex; |
|
||||||
align-items: center; |
|
||||||
padding-left: 10px; |
|
||||||
} |
|
||||||
|
|
||||||
.title-section img { |
|
||||||
max-width: 80px; |
|
||||||
max-height: 50px; |
|
||||||
} |
|
||||||
|
|
||||||
.page-change-button { |
|
||||||
padding-left: 10px; |
|
||||||
} |
|
||||||
|
|
||||||
button { |
|
||||||
margin: 2px; |
|
||||||
color: black; |
|
||||||
background-color: white; |
|
||||||
border: 2px solid white; |
|
||||||
border-radius: 10px; |
|
||||||
} |
|
||||||
|
|
||||||
button:hover { |
|
||||||
border-color: #eab308; |
|
||||||
background-color: #eab308; |
|
||||||
transition: all 1s; |
|
||||||
} |
|
||||||
|
|
||||||
main { |
|
||||||
flex: 1; |
|
||||||
} |
|
||||||
|
|
||||||
#credits { |
|
||||||
background-color: white; |
|
||||||
border: 2px solid white; |
|
||||||
border-radius: 10px; |
|
||||||
color: black; |
|
||||||
} |
|
||||||
|
|
||||||
/* Footer */ |
|
||||||
footer { |
|
||||||
color: white; |
|
||||||
} |
|
||||||
|
|
||||||
footer p { |
|
||||||
display: flex; |
|
||||||
justify-content: center; |
|
||||||
margin-bottom: 0px; |
|
||||||
} |
|
||||||
|
|
||||||
/* Modal */ |
|
||||||
.modal-content { |
|
||||||
color: white; |
|
||||||
} |
|
||||||
|
|
||||||
#exampleModal { |
|
||||||
color: white; |
|
||||||
background-color: rgba(255, 255, 255, 0.1) |
|
||||||
} |
|
||||||
|
|
||||||
#modal-footer { |
|
||||||
background-color: #272727; |
|
||||||
} |
|
||||||
|
|
||||||
#status { |
|
||||||
color: orange; |
|
||||||
} |
|
||||||
|
|
||||||
#revenu { |
|
||||||
color: white |
|
||||||
} |
|
@ -0,0 +1,195 @@ |
|||||||
|
/* Copyright © 2023 Entreprise SkamKraft */ |
||||||
|
|
||||||
|
:root { |
||||||
|
--main-back-color: rgb(143, 143, 143); |
||||||
|
--second-back-color: black; |
||||||
|
} |
||||||
|
|
||||||
|
@font-face { |
||||||
|
font-family: M42; |
||||||
|
src: url("/assets/fonts/m42.TTF"); |
||||||
|
} |
||||||
|
|
||||||
|
* { |
||||||
|
box-sizing: border-box; |
||||||
|
} |
||||||
|
|
||||||
|
body { |
||||||
|
background-image: url("/assets/img/background.jpg"); |
||||||
|
font-family: 'M42'; |
||||||
|
font-size: 7px; |
||||||
|
margin: 0px; |
||||||
|
padding: 0px; |
||||||
|
} |
||||||
|
|
||||||
|
/* Main */ |
||||||
|
.container { |
||||||
|
color: white; |
||||||
|
background-color: rgba(0, 0, 0, 0.726); |
||||||
|
display: flex; |
||||||
|
margin: 10px; |
||||||
|
width: fit-content; |
||||||
|
margin: auto; |
||||||
|
margin-top: 10px; margin-bottom: 30px; |
||||||
|
flex-direction: column; |
||||||
|
align-items: center; |
||||||
|
border: 4px solid rgba(68, 68, 68, 0.575); |
||||||
|
} |
||||||
|
|
||||||
|
.max-container { |
||||||
|
background-color: rgba(0, 0, 0, 0.726); |
||||||
|
color: white; |
||||||
|
display: flex; |
||||||
|
margin: 10px; |
||||||
|
width: 95%; |
||||||
|
margin: auto; |
||||||
|
margin-top: 10px; margin-bottom: 30px; |
||||||
|
flex-direction: column; |
||||||
|
align-items: center; |
||||||
|
border: 4px solid rgba(68, 68, 68, 0.575); |
||||||
|
} |
||||||
|
|
||||||
|
.con-title { |
||||||
|
font-size: 15px; |
||||||
|
border-bottom: 2px solid black; |
||||||
|
} |
||||||
|
|
||||||
|
.btn { |
||||||
|
padding: 10px; |
||||||
|
font-size: 8px; |
||||||
|
font-family: 'M42'; |
||||||
|
color: white; |
||||||
|
border: none; |
||||||
|
border-radius: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.btn-val { |
||||||
|
background-color: rgba(0, 0, 255, 0.637); |
||||||
|
} |
||||||
|
|
||||||
|
.btn-cancel { |
||||||
|
background-color: rgba(255, 0, 0, 0.699); |
||||||
|
} |
||||||
|
|
||||||
|
/*footer*/ |
||||||
|
footer { |
||||||
|
position: fixed; |
||||||
|
width: 100%; |
||||||
|
bottom: 0; |
||||||
|
display: flex; |
||||||
|
justify-content: center; |
||||||
|
background-color: var(--second-back-color); |
||||||
|
color: white; |
||||||
|
} |
||||||
|
|
||||||
|
/*nav bar*/ |
||||||
|
.nav-nav { |
||||||
|
--nav-img-width: 100px; |
||||||
|
background-color: var(--second-back-color); |
||||||
|
display: flex; |
||||||
|
justify-content: space-between; |
||||||
|
align-items: center; |
||||||
|
} |
||||||
|
|
||||||
|
.nav-nav .nav-brand { |
||||||
|
display: flex; |
||||||
|
justify-content: center; |
||||||
|
align-items: center; |
||||||
|
} |
||||||
|
|
||||||
|
.nav-nav .nav-brand img { |
||||||
|
width: var(--nav-img-width); |
||||||
|
} |
||||||
|
|
||||||
|
.nav-nav .nav-links { |
||||||
|
--links-color: rgb(0,0,0); |
||||||
|
--links-backcolor: rgb(255, 123, 71); |
||||||
|
--links-border-color: rgb(255, 173, 118); |
||||||
|
height: 70%; |
||||||
|
display: flex; |
||||||
|
justify-content: space-between; |
||||||
|
} |
||||||
|
|
||||||
|
.nav-link { |
||||||
|
margin-right: 10px; |
||||||
|
background-color: var(--links-backcolor); |
||||||
|
color: var(--links-color); |
||||||
|
border: 4px solid var(--links-border-color); |
||||||
|
list-style: none; |
||||||
|
display: flex; |
||||||
|
justify-content: center; |
||||||
|
align-items: center; |
||||||
|
box-shadow: 3px 2px white; |
||||||
|
} |
||||||
|
|
||||||
|
.stats { |
||||||
|
color: white; |
||||||
|
} |
||||||
|
|
||||||
|
/* General */ |
||||||
|
.smooth { |
||||||
|
padding: 5px; |
||||||
|
padding-left: 10px; |
||||||
|
padding-right: 10px; |
||||||
|
border-radius: 5px; |
||||||
|
} |
||||||
|
|
||||||
|
.in-big { |
||||||
|
font-family: 'M42'; |
||||||
|
font-size: 6px; |
||||||
|
padding: 5px; |
||||||
|
width: 100%; |
||||||
|
margin-bottom: 10px; |
||||||
|
border-radius: 5px; |
||||||
|
border: none; |
||||||
|
} |
||||||
|
|
||||||
|
.errors p { |
||||||
|
background-color: rgba(255, 56, 56, 0.733); |
||||||
|
border: 3px solid rgb(255, 111, 111); |
||||||
|
padding: 10px; |
||||||
|
color: white; |
||||||
|
border-radius: 5px; |
||||||
|
text-align: center; |
||||||
|
} |
||||||
|
|
||||||
|
/* Modal */ |
||||||
|
.ext-modal { |
||||||
|
background-color: rgba(255, 255, 255, 0.767); |
||||||
|
border-radius: 10px; |
||||||
|
padding: 50px; |
||||||
|
} |
||||||
|
|
||||||
|
.my-modal { |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
align-items: center; |
||||||
|
} |
||||||
|
|
||||||
|
.modal-title { |
||||||
|
font-size: 15px; |
||||||
|
margin-bottom: 40px; |
||||||
|
} |
||||||
|
|
||||||
|
.show-token { |
||||||
|
width: fit-content; |
||||||
|
border: 2px solid black; |
||||||
|
border-radius: 10px; |
||||||
|
padding: 30px; |
||||||
|
font-size: 5px; |
||||||
|
white-space:pre-wrap; |
||||||
|
word-break:break-word; |
||||||
|
} |
||||||
|
|
||||||
|
.my-modal #timer { |
||||||
|
text-align: center; |
||||||
|
border: 1px solid black; |
||||||
|
border-radius: 10px; |
||||||
|
width: 10%; |
||||||
|
padding: 5px; |
||||||
|
margin-bottom: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
#canvas { |
||||||
|
border-radius: 10px; |
||||||
|
} |
@ -0,0 +1,11 @@ |
|||||||
|
/* Copyright © 2023 Entreprise SkamKraft */ |
||||||
|
|
||||||
|
#block-content { |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.modal-disable::backdrop { |
||||||
|
background-color: rgba(0, 0, 0, 0.493); |
||||||
|
} |
||||||
|
|
After Width: | Height: | Size: 318 B |
@ -0,0 +1,16 @@ |
|||||||
|
<!-- Copyright © 2023 Entreprise SkamKraft --> |
||||||
|
<nav class="nav-nav"> |
||||||
|
<div class="nav-brand"> |
||||||
|
<img src="assets/logo/logoblancnotext.png" /> |
||||||
|
</div> |
||||||
|
<div class="stats"></div> |
||||||
|
<ul class="nav-links"> |
||||||
|
<li class="nav-link smooth" id="systems-link">Systems</li> |
||||||
|
<li class="nav-link smooth" id="login-link">Log in</li> |
||||||
|
<li class="nav-link smooth" id="reg-link">New Agent</li> |
||||||
|
</ul> |
||||||
|
</nav> |
||||||
|
<main id="block-content"></main> |
||||||
|
<footer> |
||||||
|
<p>Skamcraft Sarl</p> |
||||||
|
</footer> |
@ -0,0 +1,11 @@ |
|||||||
|
<!-- Copyright © 2023 Entreprise SkamKraft --> |
||||||
|
|
||||||
|
<div class="container smooth"> |
||||||
|
<p class="con-title">Login</p> |
||||||
|
<input type="text" placeholder="Agent token" id="in-token" class="in-big"> |
||||||
|
<div class="grp-btn"> |
||||||
|
<button class="btn btn-val" id="val">Validate</button> |
||||||
|
<button class="btn btn-cancel" id="cancel">Cancel</button> |
||||||
|
</div> |
||||||
|
<div class="errors"></div> |
||||||
|
</div> |
@ -0,0 +1,9 @@ |
|||||||
|
<!-- Copyright © 2023 Entreprise SkamKraft --> |
||||||
|
|
||||||
|
<div class="my-modal"> |
||||||
|
<p class="modal-title">Login success</p> |
||||||
|
<div> |
||||||
|
<button id="ok" class="btn btn-val">Continue</button> |
||||||
|
<button id="forget_login" class="btn btn-cancel">Forget agent</button> |
||||||
|
</div> |
||||||
|
</div> |
@ -0,0 +1,12 @@ |
|||||||
|
<!-- Copyright © 2023 Entreprise SkamKraft --> |
||||||
|
|
||||||
|
<div class="container smooth"> |
||||||
|
<p class="con-title">New Agent</p> |
||||||
|
<input type="text" placeholder="Name" id="in-name" class="in-big"> |
||||||
|
<input type="text" placeholder="Faction" id="in-faction" class="in-big"> |
||||||
|
<div class="grp-btn"> |
||||||
|
<button class="btn btn-val" id="val">Validate</button> |
||||||
|
<button class="btn btn-cancel" id="cancel">Cancel</button> |
||||||
|
</div> |
||||||
|
<div class="errors"></div> |
||||||
|
</div> |
@ -0,0 +1,10 @@ |
|||||||
|
<!-- Copyright © 2023 Entreprise SkamKraft --> |
||||||
|
|
||||||
|
<div class="my-modal"> |
||||||
|
<p class="modal-title">Login success</p> |
||||||
|
<p class="show-token"></p> |
||||||
|
<div> |
||||||
|
<button id="ok" class="btn btn-val">Continue</button> |
||||||
|
<button id="forget_reg" class="btn btn-cancel">Forget agent</button> |
||||||
|
</div> |
||||||
|
</div> |
@ -0,0 +1,5 @@ |
|||||||
|
<!-- Copyright © 2023 Entreprise SkamKraft --> |
||||||
|
<div class="container smooth"> |
||||||
|
<p class="con-title">Bienvenue sur SkamCraft</p> |
||||||
|
<p class="con-content">Application client pour l'API Space Tarders.</p> |
||||||
|
</div> |
@ -0,0 +1,5 @@ |
|||||||
|
<!-- Copyright © 2023 Entreprise SkamKraft --> |
||||||
|
<div class="max-container smooth"> |
||||||
|
<p class="con-title" id="sys-name"></p> |
||||||
|
<canvas id="canvas"></canvas> |
||||||
|
</div> |
@ -0,0 +1,5 @@ |
|||||||
|
<!-- Copyright © 2023 Entreprise SkamKraft --> |
||||||
|
<div class="max-container smooth"> |
||||||
|
<p class="con-title">Systems</p> |
||||||
|
<canvas id="canvas"></canvas> |
||||||
|
</div> |
Before Width: | Height: | Size: 35 KiB |
@ -1,59 +1,15 @@ |
|||||||
<!-- Copyright © 2023 Entreprise SkamKraft --> |
|
||||||
|
|
||||||
<!DOCTYPE html> |
<!DOCTYPE html> |
||||||
<html lang="fr" class="html-index"> |
<html lang="en"> |
||||||
|
<head> |
||||||
<head> |
<title></title> |
||||||
<meta charset="UTF-8" /> |
<link rel="stylesheet" href="css/style.css"> |
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
<link rel="stylesheet" href="css/ui.css"> |
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
<link rel="stylesheet" href="css/animation.css"> |
||||||
<link rel="preconnect" href="https://fonts.googleapis.com" /> |
<script src="js/lib/fabric.js"></script> |
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> |
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script> |
||||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@500&display=swap" rel="stylesheet" /> |
<script type="module" src="js/index.js" defer></script> |
||||||
<script src="https://code.jquery.com/jquery-3.7.1.min.js" |
</head> |
||||||
integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script> |
<body> |
||||||
<script type="module" src="scripts/main.js" defer></script> |
|
||||||
<link rel="stylesheet" href="/css/global.css" /> |
</body> |
||||||
<link rel="icon" href="" /> |
|
||||||
<title>SkamCraft</title> |
|
||||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" |
|
||||||
integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous"> |
|
||||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" |
|
||||||
integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" |
|
||||||
crossorigin="anonymous"></script> |
|
||||||
</head> |
|
||||||
|
|
||||||
<body> |
|
||||||
<header id="header"> |
|
||||||
<div class="menu"> |
|
||||||
<div class="title-section"> |
|
||||||
<img src="img/Skamkraft.png" alt="Logo AppleTech.svg" /> |
|
||||||
<p>SkamCraft</p> |
|
||||||
<div class="page-change-button"> |
|
||||||
<button id="btn-contract">Mes contracts</button> |
|
||||||
<button id="btn-faction">Ma faction</button> |
|
||||||
<button id="btn-ship">Mes vaisseaux</button> |
|
||||||
<button id="btn-system">Systeme</button> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
<div class="title-section"> |
|
||||||
<p id="credits">N/A Credtis</p> |
|
||||||
<button id="btn-logout">Se deconnecter</button> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
<hr /> |
|
||||||
</header> |
|
||||||
|
|
||||||
<main> |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</main> |
|
||||||
|
|
||||||
<footer id="footer"> |
|
||||||
<hr /> |
|
||||||
<p>SkamKraft © 2023</p> |
|
||||||
</footer> |
|
||||||
</body> |
|
||||||
|
|
||||||
</html> |
</html> |
@ -0,0 +1,9 @@ |
|||||||
|
import menu_mod from "./menu_mod.js"; |
||||||
|
|
||||||
|
export default function home(temp_engine) { |
||||||
|
temp_engine.after_render(menu_mod); |
||||||
|
temp_engine.render("templates/home.html"); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,54 @@ |
|||||||
|
import { Modal } from "../skama_code/ui/modal.js"; |
||||||
|
import { Auth } from "../skama_code/auth/auth.js"; |
||||||
|
import { My } from "../skama_code/api/agent.js"; |
||||||
|
import home from "./home.js"; |
||||||
|
import menu_mod from "./menu_mod.js"; |
||||||
|
|
||||||
|
export default function login(temp_engine) { |
||||||
|
let auth = new Auth(true); |
||||||
|
let modal = new Modal("login-modal", temp_engine); |
||||||
|
|
||||||
|
function render_login() { |
||||||
|
temp_engine.render(`templates/auth/login.html`); |
||||||
|
modal.load("templates/auth/login_modal.html") |
||||||
|
} |
||||||
|
|
||||||
|
modal.add_class("ext-modal"); |
||||||
|
temp_engine.after_render(menu_mod); |
||||||
|
|
||||||
|
render_login(); |
||||||
|
|
||||||
|
temp_engine.add_event("#ok", "click", () => { |
||||||
|
home(temp_engine); |
||||||
|
}); |
||||||
|
|
||||||
|
temp_engine.add_event("#forget_login", "click", () => { |
||||||
|
My.agent = null; |
||||||
|
auth.unload_token(); |
||||||
|
modal.close(); |
||||||
|
render_login(); |
||||||
|
}); |
||||||
|
|
||||||
|
temp_engine.add_event("#val", "click", () => { |
||||||
|
let token = $("#in-token").val(); |
||||||
|
auth.login(token); |
||||||
|
}); |
||||||
|
|
||||||
|
temp_engine.add_event("#cancel", "click", () => { |
||||||
|
$("#in-token").val(""); |
||||||
|
}); |
||||||
|
|
||||||
|
auth.done((agent) => { |
||||||
|
modal.show(); |
||||||
|
My.agent = agent; |
||||||
|
}).fail((errs) => { |
||||||
|
$(".errors").html(""); |
||||||
|
errs.forEach(err => { |
||||||
|
$(".errors").append(` |
||||||
|
<p>${err}</p> |
||||||
|
`);
|
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
auth.relog(); |
||||||
|
} |
@ -0,0 +1,45 @@ |
|||||||
|
import { My } from "../skama_code/api/agent.js"; |
||||||
|
import login from "./login.js"; |
||||||
|
import reg from "./reg.js"; |
||||||
|
import home from "./home.js"; |
||||||
|
import { systems } from "./systems.js"; |
||||||
|
|
||||||
|
function init_menu(temp_engine) { |
||||||
|
temp_engine.add_event("#reg-link", "click", () => { |
||||||
|
reg(temp_engine); |
||||||
|
}); |
||||||
|
temp_engine.add_event("#login-link", "click", () => { |
||||||
|
login(temp_engine); |
||||||
|
}); |
||||||
|
temp_engine.add_event("#systems-link", "click", () => { |
||||||
|
systems(temp_engine); |
||||||
|
}) |
||||||
|
temp_engine.add_event(".nav-brand", "click", () => { |
||||||
|
home(temp_engine); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
function loged_links() { |
||||||
|
$(".nav-links").prepend(` |
||||||
|
<li class="nav-link smooth" id="contracts-link">Contracts</li> |
||||||
|
<li class="nav-link smooth" id="ships-link">Ships</li> |
||||||
|
`);
|
||||||
|
} |
||||||
|
|
||||||
|
function show_stats() { |
||||||
|
$(".stats").html(` |
||||||
|
<p>Agent name : ${My.agent.name}</p> |
||||||
|
<p>Credits : ${My.agent.credits}</p> |
||||||
|
<p>Ships : ${My.agent.ships_cpt}</p> |
||||||
|
<p>Faction : ${My.agent.faction}</p> |
||||||
|
<p>HQ : ${My.agent.hq}</p> |
||||||
|
`);
|
||||||
|
} |
||||||
|
|
||||||
|
export default function menu_mod(temp_engine) { |
||||||
|
init_menu(temp_engine); |
||||||
|
if(My.agent) { |
||||||
|
show_stats(); |
||||||
|
loged_links(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,64 @@ |
|||||||
|
import { Modal } from "../skama_code/ui/modal.js"; |
||||||
|
import { Auth } from "../skama_code/auth/auth.js"; |
||||||
|
import { My } from "../skama_code/api/agent.js"; |
||||||
|
import home from "./home.js"; |
||||||
|
import menu_mod from "./menu_mod.js"; |
||||||
|
|
||||||
|
export default function reg(temp_engine) { |
||||||
|
let active = false; |
||||||
|
let auth = new Auth(true); |
||||||
|
let modal = new Modal("reg-modal", temp_engine); |
||||||
|
|
||||||
|
function render_reg() { |
||||||
|
temp_engine.render(`templates/auth/reg.html`); |
||||||
|
modal.load("templates/auth/reg_modal.html") |
||||||
|
} |
||||||
|
|
||||||
|
modal.add_class("ext-modal"); |
||||||
|
temp_engine.after_render(menu_mod); |
||||||
|
|
||||||
|
render_reg(); |
||||||
|
|
||||||
|
temp_engine.add_event("#ok", "click", () => { |
||||||
|
home(temp_engine); |
||||||
|
}); |
||||||
|
|
||||||
|
temp_engine.add_event("#forget_reg", "click", () => { |
||||||
|
My.agent = null; |
||||||
|
auth.unload_token(); |
||||||
|
modal.close(); |
||||||
|
render_reg(); |
||||||
|
}); |
||||||
|
|
||||||
|
temp_engine.add_event("#val", "click", () => { |
||||||
|
if (!active) { |
||||||
|
active = true; |
||||||
|
let name = $("#in-name").val(); |
||||||
|
let faction = $("#in-faction").val(); |
||||||
|
auth.register({ |
||||||
|
name: name, |
||||||
|
faction: faction |
||||||
|
}); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
temp_engine.add_event("#cancel", "click", () => { |
||||||
|
$("#in-name").val(""); |
||||||
|
$("#in-faction").val(""); |
||||||
|
}); |
||||||
|
|
||||||
|
auth.done((agent) => { |
||||||
|
$(".show-token").text(agent.token); |
||||||
|
modal.show(); |
||||||
|
My.agent = agent; |
||||||
|
active = false; |
||||||
|
}).fail((errs) => { |
||||||
|
$(".errors").html(""); |
||||||
|
errs.forEach(err => { |
||||||
|
$(".errors").append(` |
||||||
|
<p>${err}</p> |
||||||
|
`);
|
||||||
|
}); |
||||||
|
active = false; |
||||||
|
}); |
||||||
|
} |
@ -0,0 +1,100 @@ |
|||||||
|
import { SystemBuilder } from "../skama_code/api/system.js"; |
||||||
|
import { Position } from "../skama_code/commun/position.js"; |
||||||
|
import menu_mod from "./menu_mod.js" |
||||||
|
|
||||||
|
let canvas;
|
||||||
|
let last_target; |
||||||
|
|
||||||
|
let offset = { |
||||||
|
x: 2, |
||||||
|
y: 2 |
||||||
|
}; |
||||||
|
let max = 100; |
||||||
|
let w = (window.innerWidth/10)*9; |
||||||
|
let h = (window.innerHeight/4)*3; |
||||||
|
|
||||||
|
function animate() { |
||||||
|
canvas.renderAll(); |
||||||
|
setTimeout(animate, 1000); |
||||||
|
} |
||||||
|
|
||||||
|
function draw_planet(planet) { |
||||||
|
let shadow = new fabric.Shadow({ |
||||||
|
color: "white", |
||||||
|
blur: 5, |
||||||
|
offsetX: 0, |
||||||
|
offsetY: 0, |
||||||
|
}); |
||||||
|
|
||||||
|
fabric.Image.fromURL('/assets/planets/planetproto.png', function(img_planet) { |
||||||
|
//FABRICJS
|
||||||
|
img_planet.set({ |
||||||
|
selectable: false, |
||||||
|
shadow: shadow, |
||||||
|
left: planet.position.x/offset.x + w/2, |
||||||
|
top: planet.position.y/offset.y+ h/2, |
||||||
|
name: planet.name, |
||||||
|
type: planet.type |
||||||
|
}); |
||||||
|
canvas.add(img_planet); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
function offsetOrbit(planet) { |
||||||
|
if (planet.orbits) { |
||||||
|
console.log("Orbits"); |
||||||
|
let x = Math.floor(Math.random() * max - Math.random() * max); |
||||||
|
let y = Math.floor(Math.random() * max - Math.random() * max); |
||||||
|
planet.position.move(new Position(x, y)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
export default function system(system, temp_engine) { |
||||||
|
temp_engine.after_render((temp_engine) => { |
||||||
|
$("#sys-name").text(system); |
||||||
|
menu_mod(temp_engine); |
||||||
|
canvas = new fabric.Canvas("canvas",{ |
||||||
|
width: w, |
||||||
|
height: h, |
||||||
|
backgroundColor:"rgb(7, 18, 41)", |
||||||
|
renderOnAddRemove: false, |
||||||
|
hoverCursor :'pointer' |
||||||
|
}); |
||||||
|
SystemBuilder.get(system, (system) => { |
||||||
|
system.list_all((planets) => { |
||||||
|
planets.forEach(planet => { |
||||||
|
offsetOrbit(planet); |
||||||
|
draw_planet(planet); |
||||||
|
}); |
||||||
|
animate(); |
||||||
|
}, (err) => { |
||||||
|
console.log(err); |
||||||
|
}); |
||||||
|
}); |
||||||
|
canvas.on('mouse:up', (e) => { |
||||||
|
if(e.target.shadow.color == "red"){ |
||||||
|
e.target.shadow.color = "white" |
||||||
|
} |
||||||
|
else{ |
||||||
|
e.target.shadow.color = "red" |
||||||
|
} |
||||||
|
if (last_target) last_target.shadow.color = "white"; |
||||||
|
last_target = e.target; |
||||||
|
canvas.renderAll(); |
||||||
|
}); |
||||||
|
$(window).on("resize", () => { |
||||||
|
canvas.setWidth((window.innerWidth/10)*9); |
||||||
|
canvas.setHeight((window.innerHeight/4)*3); |
||||||
|
canvas.renderAll(); |
||||||
|
}); |
||||||
|
canvas.on("mouse:wheel", (opt) => { |
||||||
|
let scale = 1.1; |
||||||
|
if (opt.e.deltaY < 0) { |
||||||
|
canvas.zoomToPoint(new fabric.Point(canvas.width / 2, canvas.height / 2), canvas.getZoom() * scale); |
||||||
|
} else if (opt.e.deltaY > 0) { |
||||||
|
canvas.zoomToPoint(new fabric.Point(canvas.width / 2, canvas.height / 2), canvas.getZoom() / scale); |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
temp_engine.render("templates/systems/system.html"); |
||||||
|
} |
@ -0,0 +1,80 @@ |
|||||||
|
import { SystemBuilder } from "../skama_code/api/system.js"; |
||||||
|
import menu_mod from "./menu_mod.js" |
||||||
|
import system from "./system.js" |
||||||
|
|
||||||
|
let canvas;
|
||||||
|
let last_target; |
||||||
|
|
||||||
|
let offset = { |
||||||
|
x: 2, |
||||||
|
y: 2 |
||||||
|
}; |
||||||
|
let max = 100; |
||||||
|
let w = (window.innerWidth/10)*9; |
||||||
|
let h = (window.innerHeight/4)*3; |
||||||
|
|
||||||
|
function animate() { |
||||||
|
canvas.renderAll(); |
||||||
|
setTimeout(animate, 1000); |
||||||
|
} |
||||||
|
|
||||||
|
function draw_system(system) { |
||||||
|
let shadow = new fabric.Shadow({ |
||||||
|
color: "white", |
||||||
|
blur: 5, |
||||||
|
offsetX: 0, |
||||||
|
offsetY: 0, |
||||||
|
}); |
||||||
|
|
||||||
|
fabric.Image.fromURL('/assets/systems/galaxie1.png', function(img_planet) { |
||||||
|
|
||||||
|
img_planet.set({ |
||||||
|
selectable: false, |
||||||
|
scaleX: 0.05, |
||||||
|
scaleY: 0.05, |
||||||
|
shadow: shadow, |
||||||
|
left: system.position.x/offset.x + w/2, |
||||||
|
top: system.position.y/offset.y+ h/2, |
||||||
|
name: system.name, |
||||||
|
type: system.type |
||||||
|
}); |
||||||
|
canvas.add(img_planet); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
export function systems(temp_engine) { |
||||||
|
temp_engine.after_render((temp_engine) => { |
||||||
|
menu_mod(temp_engine); |
||||||
|
canvas = new fabric.Canvas("canvas",{ |
||||||
|
width: w, |
||||||
|
height: h, |
||||||
|
backgroundColor:"rgb(7, 18, 41)", |
||||||
|
renderOnAddRemove: false, |
||||||
|
hoverCursor :'pointer' |
||||||
|
}); |
||||||
|
SystemBuilder.list_all((systems) => { |
||||||
|
systems.forEach(system => { |
||||||
|
draw_system(system); |
||||||
|
}); |
||||||
|
animate(); |
||||||
|
}); |
||||||
|
canvas.on('mouse:up', (e) => { |
||||||
|
if (e.target) system(e.target.name, temp_engine); |
||||||
|
}); |
||||||
|
$(window).on("resize", () => { |
||||||
|
canvas.setWidth((window.innerWidth/10)*9); |
||||||
|
canvas.setHeight((window.innerHeight/4)*3); |
||||||
|
canvas.renderAll(); |
||||||
|
}); |
||||||
|
canvas.on("mouse:wheel", (opt) => { |
||||||
|
console.log(opt.e.clientX); |
||||||
|
let scale = 1.1; |
||||||
|
if (opt.e.deltaY < 0) { |
||||||
|
canvas.zoomToPoint(new fabric.Point(opt.e.clientX / canvas.getZoom(), opt.e.clienY / canvas.getZoom()), canvas.getZoom() * scale); |
||||||
|
} else if (opt.e.deltaY > 0) { |
||||||
|
canvas.zoomToPoint(new fabric.Point(canvas.width / 2, canvas.height / 2), canvas.getZoom() / scale); |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
temp_engine.render("templates/systems/systems.html"); |
||||||
|
} |
@ -0,0 +1,9 @@ |
|||||||
|
// Copyright © 2023 Entreprise SkamKraft
|
||||||
|
'use strict'; |
||||||
|
import { TemplateEngine } from "./skama_code/ui/templeting_engine.js"; |
||||||
|
import home from "./controllers/home.js"; |
||||||
|
|
||||||
|
let temp_engine = new TemplateEngine("html"); |
||||||
|
home(temp_engine); |
||||||
|
|
||||||
|
|
@ -0,0 +1,122 @@ |
|||||||
|
// Copyright © 2023 Entreprise SkamKraft
|
||||||
|
'use strict'; |
||||||
|
import { SpaceTraders } from "./config.js" |
||||||
|
|
||||||
|
export class My { |
||||||
|
static agent = null; |
||||||
|
} |
||||||
|
|
||||||
|
export class Agent { |
||||||
|
constructor(agent, token = "") { |
||||||
|
this.token = token; |
||||||
|
this.name = agent.symbol; |
||||||
|
this.credits = agent.credits; |
||||||
|
this.faction = agent.startingFaction; |
||||||
|
this.hq = agent.headquarters; |
||||||
|
this.ships_cpt = agent.shipCount;
|
||||||
|
} |
||||||
|
|
||||||
|
get_agent_system() { |
||||||
|
let metaSystem = this.hq.split("-"); |
||||||
|
return metaSystem[0] + "-" + metaSystem[1];
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
export class AgentBuilder { |
||||||
|
static create(symbol, faction, callback, error_handler) { |
||||||
|
const url = `${SpaceTraders.host}/register`; |
||||||
|
$.ajax({ |
||||||
|
url: url, |
||||||
|
method: "POST", |
||||||
|
headers: { "Content-Type": "application/json" }, |
||||||
|
processData: false, |
||||||
|
data: `{\n "faction": "${faction}",\n "symbol": "${symbol}"}`, |
||||||
|
success: (reponse) => { |
||||||
|
let agent = new Agent(reponse.data.agent, reponse.data.token) |
||||||
|
callback(agent); |
||||||
|
}, |
||||||
|
error: (err) => { |
||||||
|
error_handler(["Name already took."]) |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
static get(token, callback, error_handler){ |
||||||
|
const url = `${SpaceTraders.host}/my/agent`; |
||||||
|
$.ajax({ |
||||||
|
url: url, |
||||||
|
method: "GET", |
||||||
|
headers: { |
||||||
|
Accept: "application/json", |
||||||
|
Authorization: `Bearer ${token}`, |
||||||
|
}, |
||||||
|
success: (reponse) => { |
||||||
|
let agent = new Agent(reponse.data, token); |
||||||
|
callback(agent); |
||||||
|
}, |
||||||
|
error: (err) => { |
||||||
|
error_handler(["Token invalide."]); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
static get_public(symbol, callback) { |
||||||
|
const url = `${SpaceTraders.host}/agents/${symbol}`; |
||||||
|
$.ajax({ |
||||||
|
url: url, |
||||||
|
method: "GET", |
||||||
|
headers: { |
||||||
|
Accept: "application/json"
|
||||||
|
}, |
||||||
|
success: (reponse) => { |
||||||
|
let agent = new Agent(reponse.data); |
||||||
|
callback(agent); |
||||||
|
}, |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
static list(limit, page, callback, agents = []) { |
||||||
|
const url = `${SpaceTraders.host}/agents`; |
||||||
|
const data = { limit, page }; |
||||||
|
$.ajax({ |
||||||
|
url: url, |
||||||
|
method: "GET", |
||||||
|
headers: { |
||||||
|
Accept: "application/json"
|
||||||
|
}, |
||||||
|
data: data, |
||||||
|
success: (reponse) => { |
||||||
|
reponse.data.forEach(agent => { |
||||||
|
agents.push(new Agent(agent)); |
||||||
|
}); |
||||||
|
callback(agents, reponse.meta); |
||||||
|
}, |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
static list_all(callback, end = false) { |
||||||
|
this.list(20, 1, (agents, meta) => { |
||||||
|
let maxPage = meta.total / 20; |
||||||
|
this.#r_listing(2, maxPage, agents, callback, end); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
static #r_listing(page, maxPage, agents, callback, end) { |
||||||
|
if (page < maxPage) { |
||||||
|
this.list(20, page++,() => { |
||||||
|
setTimeout(() => { |
||||||
|
if (!end) { |
||||||
|
callback(agents); |
||||||
|
agents = []; |
||||||
|
} |
||||||
|
this.#r_listing(page++, maxPage, agents, callback, end);
|
||||||
|
}, 1000); |
||||||
|
}, agents); |
||||||
|
} else { |
||||||
|
callback(agents); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,7 @@ |
|||||||
|
// Copyright © 2023 Entreprise SkamKraft
|
||||||
|
'use strict'; |
||||||
|
|
||||||
|
export const SpaceTraders = { |
||||||
|
host: "https://api.spacetraders.io/v2", |
||||||
|
limit_max: 20, |
||||||
|
} |
@ -0,0 +1,71 @@ |
|||||||
|
// Copyright © 2023 Entreprise SkamKraft
|
||||||
|
'use strict'; |
||||||
|
|
||||||
|
import { SpaceTraders } from "./config.js"; |
||||||
|
import { Position } from "../commun/position.js"; |
||||||
|
|
||||||
|
class Market { |
||||||
|
constructor(market) { |
||||||
|
this.symbol = market.symbol; |
||||||
|
this.exports = market.exports; |
||||||
|
this.imports = market.imports; |
||||||
|
this.exchange = market.exchange; |
||||||
|
this.transctions = market.transctions; |
||||||
|
this.trade_goods = market.tradeGoods; |
||||||
|
} |
||||||
|
|
||||||
|
has_export(market_export) { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
list_exports(callback) { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
has_import(market_import) { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
list_import(callback) { |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
export class Planet { |
||||||
|
constructor(waypoint) { |
||||||
|
this.name = waypoint.symbol; |
||||||
|
this.type = waypoint.type; |
||||||
|
this.system = waypoint.systemSymbol; |
||||||
|
this.position = new Position(waypoint.x, waypoint.y); |
||||||
|
this.moons = waypoint.orbitals; |
||||||
|
this.orbits = waypoint.orbits; |
||||||
|
this.faction = waypoint.faction; |
||||||
|
this.traits = waypoint.traits; |
||||||
|
this.dangers = waypoint.modifiers; |
||||||
|
this.discovery = waypoint.char; |
||||||
|
this.is_under_construction = waypoint.isUnderConstruction; |
||||||
|
} |
||||||
|
|
||||||
|
get_market(callback, error_handler) { |
||||||
|
const url = `${SpaceTraders.host}/systems/${this.system}/waypoints/${this.name}/market`; |
||||||
|
$.ajax({ |
||||||
|
url: url, |
||||||
|
method: "GET", |
||||||
|
success: (reponse) => { |
||||||
|
let market = new Market(reponse.data); |
||||||
|
callback(market); |
||||||
|
}, |
||||||
|
error: (err) => { |
||||||
|
error_handler("Market not found"); |
||||||
|
} |
||||||
|
});
|
||||||
|
} |
||||||
|
|
||||||
|
is_type(type) { |
||||||
|
return this.type === type ? true : false; |
||||||
|
} |
||||||
|
|
||||||
|
is_discovered() { |
||||||
|
return this.discovery.length > 0 ? true : false; |
||||||
|
}
|
||||||
|
} |
@ -0,0 +1,135 @@ |
|||||||
|
// Copyright © 2023 Entreprise SkamKraft
|
||||||
|
'use strict'; |
||||||
|
|
||||||
|
import { SpaceTraders } from "./config.js"; |
||||||
|
import { Position } from "../commun/position.js"; |
||||||
|
import { Planet } from "./planet.js"; |
||||||
|
|
||||||
|
export class System { |
||||||
|
constructor(data) { |
||||||
|
this.name = data.symbol; |
||||||
|
this.sector = data.sectorSymbol; |
||||||
|
this.type = data.type; |
||||||
|
this.position = new Position(data.x, data.y); |
||||||
|
this.factions = data.factions; |
||||||
|
} |
||||||
|
|
||||||
|
get(name, callback, error_handler) { |
||||||
|
const url = `${SpaceTraders.host}/systems/${this.name}/waypoints/${name}`; |
||||||
|
$.ajax({ |
||||||
|
url: url, |
||||||
|
method: "GET", |
||||||
|
success: (reponse) => { |
||||||
|
let planet = new Planet(reponse.data); |
||||||
|
callback(planet); |
||||||
|
}, |
||||||
|
error: (err) => { |
||||||
|
error_handler("Planet not found"); |
||||||
|
} |
||||||
|
}); |
||||||
|
}
|
||||||
|
|
||||||
|
list(limit, page, callback, planets = []) { |
||||||
|
const url = `${SpaceTraders.host}/systems/${this.name}/waypoints` |
||||||
|
$.ajax({ |
||||||
|
url: url, |
||||||
|
method: "GET", |
||||||
|
data: { |
||||||
|
limit: limit, |
||||||
|
page: page |
||||||
|
}, |
||||||
|
success: (reponse) => { |
||||||
|
reponse.data.forEach(planet => { |
||||||
|
planets.push(new Planet(planet)); |
||||||
|
}); |
||||||
|
callback(planets, reponse.meta); |
||||||
|
}
|
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
list_all(callback, end = false) { |
||||||
|
this.list(20, 1, (planets, meta) => { |
||||||
|
let maxPage = meta.total / 20; |
||||||
|
this.#r_listing(2, maxPage, planets, callback, end); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
#r_listing(page, maxPage, planets, callback, end) { |
||||||
|
if (page < maxPage) { |
||||||
|
this.list(20, page++, () => { |
||||||
|
setTimeout(() => { |
||||||
|
if (!end) { |
||||||
|
callback(planets); |
||||||
|
planets = []; |
||||||
|
} |
||||||
|
this.#r_listing(page++, maxPage, planets, callback, end);
|
||||||
|
}, 1000); |
||||||
|
}, planets); |
||||||
|
} else { |
||||||
|
callback(planets); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
export class SystemBuilder { |
||||||
|
static parse_system_name(name) { |
||||||
|
return name.split("-").slice(-1, 2).join("-"); |
||||||
|
} |
||||||
|
|
||||||
|
static get(name, callback, error_handler) { |
||||||
|
const url = `${SpaceTraders.host}/systems/${name}/`; |
||||||
|
$.ajax({ |
||||||
|
url: url, |
||||||
|
method: "GET", |
||||||
|
success: (reponse) => { |
||||||
|
let system = new System(reponse.data); |
||||||
|
callback(system); |
||||||
|
}, |
||||||
|
error: (err) => { |
||||||
|
error_handler("System not found"); |
||||||
|
} |
||||||
|
}); |
||||||
|
}
|
||||||
|
|
||||||
|
static list(limit, page, callback, systems = []) { |
||||||
|
const url = `${SpaceTraders.host}/systems/` |
||||||
|
$.ajax({ |
||||||
|
url: url, |
||||||
|
method: "GET", |
||||||
|
data: { |
||||||
|
limit: limit, |
||||||
|
page: page |
||||||
|
}, |
||||||
|
success: (reponse) => { |
||||||
|
reponse.data.forEach(system => { |
||||||
|
systems.push(new System(system)); |
||||||
|
}); |
||||||
|
callback(systems, reponse.meta); |
||||||
|
}
|
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
static list_all(callback, end = false) { |
||||||
|
this.list(20, 1, (systems, meta) => { |
||||||
|
let maxPage = meta.total / 20; |
||||||
|
this.#r_listing(2, maxPage, systems, callback, end); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
static #r_listing(page, maxPage, systems, callback, end) { |
||||||
|
if (page < maxPage) { |
||||||
|
this.list(20, page++, () => { |
||||||
|
setTimeout(() => { |
||||||
|
if (!end) { |
||||||
|
console.log(systems); |
||||||
|
callback(systems); |
||||||
|
systems = []; |
||||||
|
} |
||||||
|
this.#r_listing(page++, maxPage, systems, callback, end);
|
||||||
|
}, 1000); |
||||||
|
}, systems); |
||||||
|
} else { |
||||||
|
callback(systems); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,89 @@ |
|||||||
|
// Copyright © 2023 Entreprise SkamKraft
|
||||||
|
'use strict'; |
||||||
|
import { AgentBuilder } from '../api/agent.js' |
||||||
|
import Strategie from '../commun/strategie.js'; |
||||||
|
|
||||||
|
let strategies = { |
||||||
|
register: [ |
||||||
|
{ |
||||||
|
name: "name", |
||||||
|
validations: [ |
||||||
|
"required", |
||||||
|
"max_length|14" |
||||||
|
] |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "faction", |
||||||
|
validations: [ |
||||||
|
"required" |
||||||
|
] |
||||||
|
} |
||||||
|
], |
||||||
|
login: [ |
||||||
|
{ |
||||||
|
name: "token", |
||||||
|
validations: [ |
||||||
|
"required" |
||||||
|
] |
||||||
|
} |
||||||
|
] |
||||||
|
} |
||||||
|
|
||||||
|
export class Auth { |
||||||
|
constructor(store = false) { |
||||||
|
this.store = store; |
||||||
|
this.validated = () => {}; |
||||||
|
this.error_handler = () => {}; |
||||||
|
this.strategies = strategies; |
||||||
|
} |
||||||
|
|
||||||
|
done(validated) { |
||||||
|
this.validated = validated; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
fail(error_handler) { |
||||||
|
this.error_handler = error_handler; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
login(token) { |
||||||
|
let validateur = new Strategie(this.strategies.login); |
||||||
|
validateur.validate("token", token); |
||||||
|
if (validateur.errors.length > 0) this.error_handler(validateur.errors); |
||||||
|
else { |
||||||
|
if (this.store) localStorage.setItem("token", token); |
||||||
|
AgentBuilder.get(token, this.validated, this.error_handler); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
relog() { |
||||||
|
if(this.#is_login()) { |
||||||
|
AgentBuilder.get(localStorage.getItem("token"), this.validated, this.error_handler);
|
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
register(new_agent) { |
||||||
|
let validateur = new Strategie(this.strategies.register); |
||||||
|
validateur.validate("name", new_agent.name); |
||||||
|
validateur.validate("faction", new_agent.faction); |
||||||
|
if (validateur.errors.length > 0) this.error_handler(validateur.errors); |
||||||
|
else {
|
||||||
|
AgentBuilder.create(new_agent.name, new_agent.faction, (agent) => { |
||||||
|
if (this.store) localStorage.setItem("token", agent.token); |
||||||
|
this.validated(agent); |
||||||
|
}, this.error_handler); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
unload_token() { |
||||||
|
if(this.#is_login()) localStorage.removeItem("token"); |
||||||
|
} |
||||||
|
|
||||||
|
#is_login() { |
||||||
|
if (localStorage.getItem("token")) return true |
||||||
|
return false |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
// Copyright © 2023 Entreprise SkamKraft
|
||||||
|
'use strict'; |
||||||
|
|
||||||
|
export class Position { |
||||||
|
constructor(x, y) { |
||||||
|
this.x = x; |
||||||
|
this.y = y; |
||||||
|
} |
||||||
|
|
||||||
|
get_canvas_pos(w, h) { |
||||||
|
return new Position(x - w/2, y - h/2) |
||||||
|
} |
||||||
|
|
||||||
|
move(position) { |
||||||
|
this.x += position.x; |
||||||
|
this.y += position.y; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,51 @@ |
|||||||
|
// Copyright © 2023 Entreprise SkamKraft
|
||||||
|
'use strict'; |
||||||
|
|
||||||
|
export default class Strategie { |
||||||
|
constructor(strategie) { |
||||||
|
this.strategie = strategie; |
||||||
|
this.errors = []; |
||||||
|
} |
||||||
|
|
||||||
|
validate(name, input) { |
||||||
|
this.strategie.forEach(input_strat => { |
||||||
|
if(input_strat.name === name) input_strat.validations.forEach((validation) => { |
||||||
|
let args = validation.split("|"); |
||||||
|
switch (args[0]) { |
||||||
|
case "required":
|
||||||
|
this.#test(Strategie.#required(input), `${name} is required.`); |
||||||
|
break; |
||||||
|
case "max_length": |
||||||
|
this.#test(Strategie.#max_length(input, parseInt(args[1])), `${name} must have a max lenght of ${args[1]}.`); |
||||||
|
break; |
||||||
|
case "min_length": |
||||||
|
this.#test(Strategie.#min_length(input, parseInt(args[1])), `${name} must have a min lenght of ${args[1]}`); |
||||||
|
break; |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
#test(test, error) { |
||||||
|
if(!test) this.errors.push(error);
|
||||||
|
} |
||||||
|
|
||||||
|
static #valide_email(input) { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
static #min_length(input, length) { |
||||||
|
if(input.length < length) return false; |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
static #max_length(input, length) { |
||||||
|
if(input.length > length) return false; |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
static #required(input) { |
||||||
|
if (input === undefined || input === null || input === "") return false; |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,59 @@ |
|||||||
|
// Copyright © 2023 Entreprise SkamKraft
|
||||||
|
'use strict'; |
||||||
|
|
||||||
|
export class Timer { |
||||||
|
constructor(time, step, unit = "s") { |
||||||
|
this.passed_time = 0; |
||||||
|
this.time = time; |
||||||
|
this.step = step; |
||||||
|
this.continue = true; |
||||||
|
switch (unit) { |
||||||
|
case "ms":
|
||||||
|
this.unit = 1; |
||||||
|
break;
|
||||||
|
case "s":
|
||||||
|
this.unit = 1000; |
||||||
|
break; |
||||||
|
case "m":
|
||||||
|
this.unit = 60000; |
||||||
|
break; |
||||||
|
case "h":
|
||||||
|
this.unit = 3600000; |
||||||
|
break; |
||||||
|
default: |
||||||
|
this.unit = 1; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
on(action, callback) { |
||||||
|
switch(action) { |
||||||
|
case "end": |
||||||
|
this.end_callback = callback; |
||||||
|
break; |
||||||
|
case "step": |
||||||
|
this.step_callback = callback; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
start() { |
||||||
|
this.continue = true; |
||||||
|
this.#time_step(); |
||||||
|
} |
||||||
|
|
||||||
|
stop() { |
||||||
|
this.continue = false; |
||||||
|
this.passed_time = 0; |
||||||
|
} |
||||||
|
|
||||||
|
#time_step() { |
||||||
|
if (this.passed_time < this.time && this.continue) { |
||||||
|
if (this.step_callback) this.step_callback(this.passed_time); |
||||||
|
this.passed_time += this.step; |
||||||
|
setTimeout(() => {
|
||||||
|
this.#time_step()
|
||||||
|
}, this.step*this.unit);
|
||||||
|
} else { |
||||||
|
if (this.end_callback) this.end_callback(this.time); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,39 @@ |
|||||||
|
// Copyright © 2023 Entreprise SkamKraft
|
||||||
|
'use strict'; |
||||||
|
|
||||||
|
export class Modal { |
||||||
|
constructor(name, template_engine, tag = "#block-content") { |
||||||
|
this.name = name; |
||||||
|
this.template_engine = template_engine; |
||||||
|
this.tag = tag; |
||||||
|
this.modal_class = ""; |
||||||
|
} |
||||||
|
|
||||||
|
load(template) { |
||||||
|
this.template_engine.get_template((reponse) => { |
||||||
|
$(this.tag).prepend(` |
||||||
|
<dialog id="${this.name}" class="${this.modal_class} modal-disable"> |
||||||
|
${reponse} |
||||||
|
</dialog> |
||||||
|
`);
|
||||||
|
}, template); |
||||||
|
} |
||||||
|
|
||||||
|
on_close(callback) { |
||||||
|
document.querySelector(`#${this.name}`).addEventListener("close", callback); |
||||||
|
} |
||||||
|
|
||||||
|
add_class(modal_class) { |
||||||
|
let modal; |
||||||
|
if(modal = $(`#${this.name}`)) modal.addClass(modal_class); |
||||||
|
this.modal_class = `${this.modal_class} ${modal_class}`; |
||||||
|
} |
||||||
|
|
||||||
|
show() { |
||||||
|
document.querySelector(`#${this.name}`).showModal();
|
||||||
|
} |
||||||
|
|
||||||
|
close() { |
||||||
|
document.querySelector(`#${this.name}`).close(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,43 @@ |
|||||||
|
// Copyright © 2023 Entreprise SkamKraft
|
||||||
|
'use strict'; |
||||||
|
export class TemplateEngine { |
||||||
|
constructor(path) { |
||||||
|
this.templatePath = path; |
||||||
|
} |
||||||
|
|
||||||
|
render(template) { |
||||||
|
this.get_template((reponse) => { |
||||||
|
$('body').html(reponse); |
||||||
|
this.get_template((reponse) => { |
||||||
|
$("#block-content").html(reponse); |
||||||
|
if (this.after_render_callback) this.after_render_callback(this); |
||||||
|
}, template) |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
frag_load(tag, template) { |
||||||
|
this.get_template((reponse) => { |
||||||
|
$(tag).html(reponse); |
||||||
|
}, template); |
||||||
|
} |
||||||
|
|
||||||
|
get_template(callback, template = "") { |
||||||
|
let url = template === "" ? `${this.templatePath}/template.html`: `${this.templatePath}/${template}`; |
||||||
|
$.ajax(url,{ |
||||||
|
async: false, |
||||||
|
method: "GET", |
||||||
|
success: callback, |
||||||
|
error: (err) => { |
||||||
|
console.log(err); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
add_event(tag, action, callback) { |
||||||
|
$("body").on(action, tag, callback); |
||||||
|
} |
||||||
|
|
||||||
|
after_render(callback) { |
||||||
|
this.after_render_callback = callback; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,105 @@ |
|||||||
|
// Copyright © 2023 Entreprise SkamKraft
|
||||||
|
'use strict'; |
||||||
|
|
||||||
|
import { Timer } from "../skama_code/ui/timer.js"; |
||||||
|
import { Modal } from "../skama_code/ui/modal.js"; |
||||||
|
import { TemplateEngine } from "../skama_code/ui/templeting_engine.js"; |
||||||
|
import { Initialzer } from "../skama_code/commun/initialzer.js "; |
||||||
|
import { AgentBuilder } from "../skama_code/api/agent.js"; |
||||||
|
import { Auth } from "../skama_code/auth/auth.js"; |
||||||
|
import { PlanetBuilder } from "../skama_code/api/planet.js"; |
||||||
|
|
||||||
|
let temp_path = "html"; |
||||||
|
let token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGlmaWVyIjoiSEFSRElDSyIsInZlcnNpb24iOiJ2Mi4xLjQiLCJyZXNldF9kYXRlIjoiMjAyMy0xMi0wMiIsImlhdCI6MTcwMjY2Mjc2Mywic3ViIjoiYWdlbnQtdG9rZW4ifQ.PrvaOz3W79acq6RoxryMW53PRRz824_AM0VGLwfXCOsGCOCAIY-rn6-bZTOnLAtp4xPSDqEk4c38oWYAWW59p0iMDDLpur6ONnjT0RjjsQS9zr5BByfBpP36CT23IZSSzk3XxGrFolHJAyU3K1liYfNbsPuNTXlkHGNHq6yMqH4ZQUPFsXEsCkg9cUynkdLw3C39SvWhtJ89oblj_8tQp2k8dxhZemepuXtiI51eFMpv8A0WRAi7pVYo_ajJujY9QDLYn_m5hDZWTlQMIstjPaDl99p2IMweIMO2Q2G-0lKiWQ4sl6VW5tuVrz1HLYU6kyMjFQWNn6kFDE7LWMTrfw"; |
||||||
|
|
||||||
|
let tests = { |
||||||
|
timer: function() { |
||||||
|
let timer = new Timer(1, 0.1666, "m"); |
||||||
|
timer.on("step", (time) => { |
||||||
|
console.log(time); |
||||||
|
}) |
||||||
|
timer.on("end", () => { |
||||||
|
console.log("pattes fini"); |
||||||
|
}); |
||||||
|
timer.start(); |
||||||
|
}, |
||||||
|
render_template: function() { |
||||||
|
let UI = new TemplateEngine(temp_path); |
||||||
|
let initer = new Initialzer(UI); |
||||||
|
|
||||||
|
UI.render("templates/home.html"); |
||||||
|
UI.frag_load("#test", "templates/login.html"); |
||||||
|
|
||||||
|
$(document).ready(() => { |
||||||
|
initer.init_menu_link("#contracts-link", "contracts.html"); |
||||||
|
initer.init_menu_link("#ships-link", "ships.html"); |
||||||
|
initer.init_menu_link("#systems-link", "systems.html"); |
||||||
|
initer.init_menu_link("#signup-link", "register.html"); |
||||||
|
initer.init_menu_link("#signin-link", "login.html"); |
||||||
|
initer.init_menu_link(".nav-brand", "home.html"); |
||||||
|
}); |
||||||
|
}, |
||||||
|
authentication: function() { |
||||||
|
let auth = new Auth(true); |
||||||
|
auth.done((agent) => { |
||||||
|
console.log(agent); |
||||||
|
}).fail((errs) => { |
||||||
|
errs.forEach(err => { |
||||||
|
console.log(err); |
||||||
|
}); |
||||||
|
}); |
||||||
|
auth.login(token); |
||||||
|
auth.relog(); |
||||||
|
|
||||||
|
//auth.register({
|
||||||
|
// symbol: "lkdsjfsjdlfjlk",
|
||||||
|
// faction: "COSMIC"
|
||||||
|
//});
|
||||||
|
}, |
||||||
|
modal: function() { |
||||||
|
|
||||||
|
let template_engine = new TemplateEngine(temp_path); |
||||||
|
|
||||||
|
let timer = new Timer(60, 1, "s"); |
||||||
|
timer.on("step", (time) => { |
||||||
|
$("#timer").html(` |
||||||
|
<p>${time}</p> |
||||||
|
`);
|
||||||
|
}); |
||||||
|
template_engine.render("templates/login.html"); |
||||||
|
|
||||||
|
let modal = new Modal("test-modal", template_engine); |
||||||
|
modal.add_class("ext-modal") |
||||||
|
|
||||||
|
modal.load("templates/test_modal.html"); |
||||||
|
|
||||||
|
template_engine.add_event("#valid", "click", () => { |
||||||
|
modal.show(); |
||||||
|
timer.start(); |
||||||
|
}); |
||||||
|
|
||||||
|
template_engine.add_event("#ok", "click", () => { |
||||||
|
modal.close(); |
||||||
|
timer.stop(); |
||||||
|
}); |
||||||
|
}, |
||||||
|
get_planet: function() { |
||||||
|
PlanetBuilder.get("X1-TT23-FF1E", (planet) => { |
||||||
|
console.log(planet); |
||||||
|
}, (err) => { |
||||||
|
console.log(err); |
||||||
|
}); |
||||||
|
}, |
||||||
|
get_all_planets: function() { |
||||||
|
PlanetBuilder.list_all("X1-AG10", (planets) => { |
||||||
|
console.log(planets); |
||||||
|
}); |
||||||
|
}, |
||||||
|
get_all_agents: function() { |
||||||
|
AgentBuilder.list_all((agents) => { |
||||||
|
console.log(agents); |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
export default tests; |
@ -1,65 +0,0 @@ |
|||||||
<!-- Copyright © 2023 Entreprise SkamKraft --> |
|
||||||
|
|
||||||
<!DOCTYPE html> |
|
||||||
<html lang="en"> |
|
||||||
<head> |
|
||||||
<meta charset="UTF-8" /> |
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
|
||||||
<title>Skamkraft</title> |
|
||||||
<link rel="icon" type="image/png" href="/img/Skamkraft.png" /> |
|
||||||
|
|
||||||
<link rel="stylesheet" href="/css/auth.css" /> |
|
||||||
|
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com" /> |
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> |
|
||||||
<link |
|
||||||
href="https://fonts.googleapis.com/css2?family=Montserrat:wght@100;500&display=swap" |
|
||||||
rel="stylesheet" |
|
||||||
/> |
|
||||||
<script |
|
||||||
src="https://code.jquery.com/jquery-3.7.1.min.js" |
|
||||||
integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" |
|
||||||
crossorigin="anonymous" |
|
||||||
></script> |
|
||||||
<script type="module" src="scripts/main.js" defer></script> |
|
||||||
</head> |
|
||||||
<body> |
|
||||||
<div class="logo"> |
|
||||||
<img src="/img/Skamkraft.png" /> |
|
||||||
<h4>Skamkraft</h4> |
|
||||||
</div> |
|
||||||
|
|
||||||
<div class="form" aria-setsize="19"> |
|
||||||
<div class="title"> |
|
||||||
Bienvenue sur Skamkraft,<br /><span |
|
||||||
>Entrez votre token pour continuer</span |
|
||||||
> |
|
||||||
</div> |
|
||||||
<input id="input-token" class="input" placeholder="Token" type="text" /> |
|
||||||
<button id="btn-login" class="button-confirm">Continuer →</button> |
|
||||||
<div class="link-connection"> |
|
||||||
<a class="animation-underline" href="register.html">Sign Up</a> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
|
|
||||||
<div id="box-alert" class="alert" hidden> |
|
||||||
<div class="alert-inner"> |
|
||||||
<svg |
|
||||||
xmlns="http://www.w3.org/2000/svg" |
|
||||||
viewBox="0 0 24 24" |
|
||||||
class="icon" |
|
||||||
> |
|
||||||
<path |
|
||||||
fill-rule="evenodd" |
|
||||||
d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z" |
|
||||||
clip-rule="evenodd" |
|
||||||
></path> |
|
||||||
</svg> |
|
||||||
|
|
||||||
<strong class="message"> Quelque chose s'est mal passé</strong> |
|
||||||
</div> |
|
||||||
|
|
||||||
<p id="error-message" class="content"></p> |
|
||||||
</div> |
|
||||||
</body> |
|
||||||
</html> |
|
@ -1,68 +0,0 @@ |
|||||||
<!-- Copyright © 2023 Entreprise SkamKraft --> |
|
||||||
|
|
||||||
<!DOCTYPE html> |
|
||||||
<html lang="en"> |
|
||||||
<head> |
|
||||||
<meta charset="UTF-8" /> |
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
|
||||||
<title>Skamkraft</title> |
|
||||||
<link rel="icon" type="image/png" href="/img/Skamkraft.png" /> |
|
||||||
|
|
||||||
<link rel="stylesheet" href="/css/auth.css" /> |
|
||||||
|
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com" /> |
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> |
|
||||||
<link |
|
||||||
href="https://fonts.googleapis.com/css2?family=Montserrat:wght@100;500&display=swap" |
|
||||||
rel="stylesheet" |
|
||||||
/> |
|
||||||
<script |
|
||||||
src="https://code.jquery.com/jquery-3.7.1.min.js" |
|
||||||
integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" |
|
||||||
crossorigin="anonymous" |
|
||||||
></script> |
|
||||||
<script type="module" src="scripts/main.js" defer></script> |
|
||||||
</head> |
|
||||||
<body> |
|
||||||
<div class="logo"> |
|
||||||
<img src="/img/Skamkraft.png" /> |
|
||||||
<h4>Skamkraft</h4> |
|
||||||
</div> |
|
||||||
|
|
||||||
<div class="form" aria-setsize="19"> |
|
||||||
<div class="title"> |
|
||||||
Bienvenue sur Skamkraft,<br /> |
|
||||||
<span>Entrez votre symbol pour continuer</span> |
|
||||||
</div> |
|
||||||
<input id="input-symbol" class="input" placeholder="Symbol" type="text" /> |
|
||||||
<select id="input-faction" class="input select"> |
|
||||||
<option value="" disabled selected>Faction</option> |
|
||||||
<optgroup id="group-faction" label="---------"></optgroup> |
|
||||||
</select> |
|
||||||
<button id="btn-register" class="button-confirm">Continuer →</button> |
|
||||||
<div class="link-connection"> |
|
||||||
<a class="animation-underline" href="login.html">Login</a> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
|
|
||||||
<div id="box-alert" class="alert" hidden> |
|
||||||
<div class="alert-inner"> |
|
||||||
<svg |
|
||||||
xmlns="http://www.w3.org/2000/svg" |
|
||||||
viewBox="0 0 24 24" |
|
||||||
class="icon" |
|
||||||
> |
|
||||||
<path |
|
||||||
fill-rule="evenodd" |
|
||||||
d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z" |
|
||||||
clip-rule="evenodd" |
|
||||||
></path> |
|
||||||
</svg> |
|
||||||
|
|
||||||
<strong class="message"> Quelque chose s'est mal passé</strong> |
|
||||||
</div> |
|
||||||
|
|
||||||
<p id="error-message" class="content"></p> |
|
||||||
</div> |
|
||||||
</body> |
|
||||||
</html> |
|
@ -1,136 +0,0 @@ |
|||||||
// Copyright © 2023 Entreprise SkamKraft
|
|
||||||
|
|
||||||
"use strict"; |
|
||||||
|
|
||||||
const spacetradersApiUrl = "https://api.spacetraders.io/v2/"; |
|
||||||
|
|
||||||
const REQUEST = async (url, method, headers, data) => { |
|
||||||
try { |
|
||||||
const response = await $.ajax(url, { |
|
||||||
method, |
|
||||||
headers, |
|
||||||
data, |
|
||||||
}); |
|
||||||
|
|
||||||
return response.data; |
|
||||||
} catch (error) { |
|
||||||
return error; |
|
||||||
} |
|
||||||
}; |
|
||||||
|
|
||||||
export default { |
|
||||||
Agent: { |
|
||||||
create: (symbol, faction) => { |
|
||||||
const url = `${spacetradersApiUrl}register`; |
|
||||||
const headers = { "Content-Type": "application/json" }; |
|
||||||
const data = JSON.stringify({ symbol, faction }); |
|
||||||
|
|
||||||
return REQUEST(url, "POST", headers, data); |
|
||||||
}, |
|
||||||
|
|
||||||
get: (token) => { |
|
||||||
const url = `${spacetradersApiUrl}my/agent`; |
|
||||||
const headers = { |
|
||||||
Accept: "application/json", |
|
||||||
Authorization: `Bearer ${token}`, |
|
||||||
}; |
|
||||||
|
|
||||||
return REQUEST(url, "GET", headers); |
|
||||||
}, |
|
||||||
|
|
||||||
getPublic: (symbol) => { |
|
||||||
const url = `${spacetradersApiUrl}agents/${symbol}`; |
|
||||||
const headers = { Accept: "application/json" }; |
|
||||||
|
|
||||||
return REQUEST(url, "GET", headers); |
|
||||||
}, |
|
||||||
|
|
||||||
list: (limit, page) => { |
|
||||||
const url = `${spacetradersApiUrl}agents`; |
|
||||||
const headers = { Accept: "application/json" }; |
|
||||||
const data = { limit, page }; |
|
||||||
|
|
||||||
return REQUEST(url, "GET", headers, data); |
|
||||||
}, |
|
||||||
}, |
|
||||||
|
|
||||||
Faction: { |
|
||||||
list: (limit, page) => { |
|
||||||
const url = `${spacetradersApiUrl}factions`; |
|
||||||
const headers = { Accept: "application/json" }; |
|
||||||
const data = { limit, page }; |
|
||||||
|
|
||||||
return REQUEST(url, "GET", headers, data); |
|
||||||
}, |
|
||||||
}, |
|
||||||
|
|
||||||
System: { |
|
||||||
list: (limit, page) => { |
|
||||||
const url = `${spacetradersApiUrl}systems/`; |
|
||||||
const headers = { Accept: "application/json" }; |
|
||||||
const data = { limit, page }; |
|
||||||
|
|
||||||
return REQUEST(url, "GET", headers, data); |
|
||||||
}, |
|
||||||
|
|
||||||
get: (symbol) => { |
|
||||||
const url = `${spacetradersApiUrl}systems/${symbol}`; |
|
||||||
const headers = { Accept: "application/json" }; |
|
||||||
|
|
||||||
return REQUEST(url, "GET", headers); |
|
||||||
}, |
|
||||||
}, |
|
||||||
|
|
||||||
Waypoint: { |
|
||||||
list: (limit, page, systemSymbol) => { |
|
||||||
const url = `${spacetradersApiUrl}systems/${systemSymbol}/waypoints`; |
|
||||||
const headers = { Accept: "application/json" }; |
|
||||||
const data = { limit, page }; |
|
||||||
|
|
||||||
return REQUEST(url, "GET", headers, data); |
|
||||||
}, |
|
||||||
|
|
||||||
get: (systemSymbol, waypointSymbol, token) => { |
|
||||||
const url = `${spacetradersApiUrl}systems/${systemSymbol}/waypoints/${waypointSymbol}/market`; |
|
||||||
const headers = { |
|
||||||
Accept: "application/json", |
|
||||||
Authorization: `Bearer ${token}`, |
|
||||||
}; |
|
||||||
|
|
||||||
return REQUEST(url, "GET", headers); |
|
||||||
}, |
|
||||||
}, |
|
||||||
|
|
||||||
Contract: { |
|
||||||
list: (token) => { |
|
||||||
const url = `${spacetradersApiUrl}my/contracts/`; |
|
||||||
const headers = { |
|
||||||
Accept: "application/json", |
|
||||||
Authorization: `Bearer ${token}`, |
|
||||||
}; |
|
||||||
|
|
||||||
return REQUEST(url, "GET", headers); |
|
||||||
}, |
|
||||||
|
|
||||||
get: async (contratId, token) => { |
|
||||||
const url = `${spacetradersApiUrl}my/contracts/${contratId}`; |
|
||||||
const headers = { |
|
||||||
Accept: "application/json", |
|
||||||
Authorization: `Bearer ${token}`, |
|
||||||
}; |
|
||||||
|
|
||||||
return REQUEST(url, "GET", headers); |
|
||||||
}, |
|
||||||
|
|
||||||
accept: async (contratId, token) => { |
|
||||||
const url = `${spacetradersApiUrl}my/contracts/${contratId}/accept`; |
|
||||||
const headers = { |
|
||||||
'Content-Type': 'application/json', |
|
||||||
Accept: "application/json", |
|
||||||
Authorization: `Bearer ${token}`, |
|
||||||
}; |
|
||||||
|
|
||||||
return REQUEST(url, "POST", headers); |
|
||||||
} |
|
||||||
}, |
|
||||||
}; |
|
@ -1,84 +0,0 @@ |
|||||||
// Copyright © 2023 Entreprise SkamCraft
|
|
||||||
|
|
||||||
"use strict"; |
|
||||||
|
|
||||||
import SpaceTraders from "./api.js"; |
|
||||||
|
|
||||||
const $inputToken = $("#input-token"); |
|
||||||
const $inputSymbol = $("#input-symbol"); |
|
||||||
const $inputFaction = $("#input-faction"); |
|
||||||
const $alert = document.querySelector("#box-alert"); |
|
||||||
const $error = $("#error-message"); |
|
||||||
|
|
||||||
const showError = (message) => { |
|
||||||
$alert.removeAttribute("hidden"); |
|
||||||
$error.text(message); |
|
||||||
}; |
|
||||||
|
|
||||||
const redirectToIndex = () => { |
|
||||||
window.location.href = "/index.html"; |
|
||||||
}; |
|
||||||
|
|
||||||
export default { |
|
||||||
login: async () => { |
|
||||||
const token = $inputToken.val(); |
|
||||||
|
|
||||||
if (!token) { |
|
||||||
showError("Token manquant"); |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
try { |
|
||||||
await SpaceTraders.Agent.get(token); |
|
||||||
localStorage.setItem("token", token); |
|
||||||
redirectToIndex(); |
|
||||||
} catch { |
|
||||||
showError("Token invalide"); |
|
||||||
} |
|
||||||
}, |
|
||||||
|
|
||||||
register: async () => { |
|
||||||
const symbol = $inputSymbol.val(); |
|
||||||
|
|
||||||
if (!symbol) { |
|
||||||
showError("Symbol manquant"); |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
const faction = $inputFaction.val(); |
|
||||||
|
|
||||||
console.log(faction); |
|
||||||
|
|
||||||
if (!faction) { |
|
||||||
showError("Faction manquante"); |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
try { |
|
||||||
const agent = await SpaceTraders.Agent.create(symbol, faction); |
|
||||||
|
|
||||||
if (agent.token !== undefined) { |
|
||||||
localStorage.setItem("token", agent.token); |
|
||||||
redirectToIndex(); |
|
||||||
} else { |
|
||||||
showError("Symbol ou faction invalide"); |
|
||||||
} |
|
||||||
} catch (error) { |
|
||||||
console.log(error) |
|
||||||
showError("Erreur lors de l'inscription"); |
|
||||||
} |
|
||||||
}, |
|
||||||
|
|
||||||
isLogin: async () => { |
|
||||||
const token = localStorage.getItem("token"); |
|
||||||
|
|
||||||
if (!token) return false; |
|
||||||
|
|
||||||
try { |
|
||||||
await SpaceTraders.Agent.get(token); |
|
||||||
return true; |
|
||||||
} catch { |
|
||||||
return false; |
|
||||||
} |
|
||||||
}, |
|
||||||
}; |
|
@ -1,156 +0,0 @@ |
|||||||
// Copyright © 2023 Entreprise SkamCraft
|
|
||||||
|
|
||||||
"use strict"; |
|
||||||
|
|
||||||
import AUTH from "./auth.js"; |
|
||||||
import SpaceTraders from "./api.js"; |
|
||||||
|
|
||||||
$(document).ready(async function () { |
|
||||||
//Auth
|
|
||||||
if (document.URL.includes("login.html")) { |
|
||||||
$("#btn-login").on("click", () => { |
|
||||||
AUTH.login(); |
|
||||||
}); |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
if (document.URL.includes("register.html")) { |
|
||||||
const factions = await SpaceTraders.Faction.list(10, 1); |
|
||||||
factions.forEach((faction) => { |
|
||||||
const option = `<option>${faction.symbol}</option>`; |
|
||||||
$("#group-faction").append(option); |
|
||||||
}); |
|
||||||
|
|
||||||
$("#btn-register").on("click", () => { |
|
||||||
AUTH.register(); |
|
||||||
}); |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
if (!(await AUTH.isLogin())) window.location.href = "login.html"; |
|
||||||
|
|
||||||
agent(); |
|
||||||
|
|
||||||
//Buttons
|
|
||||||
$("#btn-contract").on("click", () => { |
|
||||||
contract(); |
|
||||||
}); |
|
||||||
$("#btn-faction").on("click", () => { }); |
|
||||||
$("#btn-ship").on("click", () => { }); |
|
||||||
$("#btn-system").on("click", () => { }); |
|
||||||
$("#btn-logout").on("click", () => { |
|
||||||
logout(); |
|
||||||
}); |
|
||||||
}); |
|
||||||
|
|
||||||
function loadPage(page) { |
|
||||||
$("main").load(`templates/${page}.html`); |
|
||||||
} |
|
||||||
|
|
||||||
function logout() { |
|
||||||
localStorage.removeItem("token"); |
|
||||||
window.location.href = "login.html"; |
|
||||||
} |
|
||||||
|
|
||||||
async function agent() { |
|
||||||
let token = localStorage.getItem("token"); |
|
||||||
let agent = await SpaceTraders.Agent.get(token); |
|
||||||
|
|
||||||
$("#credits").text(agent.credits.toLocaleString() + " $"); |
|
||||||
} |
|
||||||
|
|
||||||
async function contract() { |
|
||||||
|
|
||||||
const token = localStorage.getItem("token"); |
|
||||||
const contracts = await SpaceTraders.Contract.list(token); |
|
||||||
|
|
||||||
$('main').empty() |
|
||||||
|
|
||||||
contracts.forEach(contrat => { |
|
||||||
let img |
|
||||||
let status |
|
||||||
let card |
|
||||||
console.log(contrat) |
|
||||||
if (contrat.type = "PROCUREMENT") { |
|
||||||
img = "/img/procurement.png" |
|
||||||
} |
|
||||||
else if (contrat.type = "TRANSPORT") { |
|
||||||
img = "/img/transportation.png" |
|
||||||
} |
|
||||||
else { |
|
||||||
img = "/img/shuttle.png" |
|
||||||
} |
|
||||||
if (contrat.accepted) { |
|
||||||
status = "accepted" |
|
||||||
card = |
|
||||||
`
|
|
||||||
<div class="card" style="width: 20rem;"> |
|
||||||
<img src="${img}" class="card-img-top" alt=""> |
|
||||||
<div class="card-body"> |
|
||||||
<h5 style="color:white" class="card-title">${contrat.factionSymbol}</h5> |
|
||||||
<p style="color:white" class="card-text">${contrat.deadlineToAccept}</p> |
|
||||||
<p style="color:white" id="status" class="card-text">Status : ${status}</p> |
|
||||||
<button id="btn-infos" contratID="${contrat.id}" type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal">Infos</button> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
` |
|
||||||
} |
|
||||||
else { |
|
||||||
status = "on hold" |
|
||||||
card = |
|
||||||
`
|
|
||||||
<div class="card" style="width: 20rem;"> |
|
||||||
<img src="${img}" class="card-img-top" alt=""> |
|
||||||
<div class="card-body"> |
|
||||||
<h5 style="color:white" class="card-title">${contrat.factionSymbol}</h5> |
|
||||||
<p style="color:white" class="card-text">${contrat.deadlineToAccept}</p> |
|
||||||
<p id="status" class="card-text">Status : ${status}</p> |
|
||||||
<p id="revenu" class="card-text">Revenu : ${contrat.terms.payment.onAccepted} $</p> |
|
||||||
<button id="btn-infos" contratID="${contrat.id}" type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal">Infos</button> |
|
||||||
<button id="btn-accept" contratID="${contrat.id}" class="btn-modify btn btn-primary" data-toggle="modal" data-target="#Modify" >Accepter</button> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
` |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$('main').append(card) |
|
||||||
|
|
||||||
|
|
||||||
$('#btn-infos').on('click', async function () { |
|
||||||
const token = localStorage.getItem("token"); |
|
||||||
const contrat = await SpaceTraders.Contract.get($(this).attr('contratID'), token); |
|
||||||
const modal = ` |
|
||||||
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"> |
|
||||||
<div class="modal-dialog"> |
|
||||||
<div class="modal-content"> |
|
||||||
<div class="modal-header"> |
|
||||||
<h1 class="modal-title fs-5" id="title-modal">Informations</h1> |
|
||||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
|
||||||
</div> |
|
||||||
<div class="modal-body"> |
|
||||||
Contrat ID : ${contrat.id} <br> |
|
||||||
Type : ${contrat.type} <br> |
|
||||||
Faction : ${contrat.factionSymbol} <br> |
|
||||||
DeadLine : ${contrat.deadlineToAccept} |
|
||||||
</div> |
|
||||||
<div class="modal-footer" id="modal-footer"> |
|
||||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
</div>` |
|
||||||
$('main').append(modal) |
|
||||||
}) |
|
||||||
|
|
||||||
$('#btn-accept').on('click', async function () { |
|
||||||
console.log("test") |
|
||||||
const token = localStorage.getItem("token"); |
|
||||||
await SpaceTraders.Contract.accept($(this).attr('contratID'), token); |
|
||||||
$("#status").html("Status : accepté"); |
|
||||||
this.remove(); |
|
||||||
}) |
|
||||||
|
|
||||||
}) |
|
||||||
} |
|
@ -1 +0,0 @@ |
|||||||
<div id="faction" class="page-faction"></div> |
|