1
0
mirror of https://git.ngram.ca/OpenJam/rc-servers synced 2026-08-23 23:08:52 +00:00

Create society service with basic functionality and auth #118

This commit is contained in:
NG (Graham)
2026-05-02 11:03:49 -04:00
parent e09aeceed3
commit e3183eb238
51 changed files with 1424 additions and 77 deletions

View File

@@ -0,0 +1,273 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<!-- Primary Meta Tags -->
<title>Dashboard - Openjam</title>
<meta name="title" content="Dashboard - Openjam" />
<meta name="description" content="User dashboard for third-party Robocraft servers" />
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://git.ngram.ca/OpenJam/rc-servers" />
<meta property="og:title" content="Dashboard - Openjam" />
<meta property="og:description" content="Create an account for third-party Robocraft servers" />
<meta property="og:image" content="https://git.ngram.ca/OpenJam/rc-servers/raw/branch/main/assets/robocraft/favicon.jpg" />
<!-- Twitter -->
<meta property="twitter:card" content="summary" />
<meta property="twitter:url" content="https://git.ngram.ca/OpenJam/rc-servers" />
<meta property="twitter:title" content="Dashboard - Openjam" />
<meta property="twitter:description" content="Create an account for third-party Robocraft servers" />
<meta property="twitter:image" content="https://git.ngram.ca/OpenJam/rc-servers/raw/branch/main/assets/robocraft/favicon.jpg" />
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<style>
body {
background-color: lightgrey;
padding: 0;
margin: 0;
}
.form-stripe {
position: relative;
min-width: 300px;
max-width: 90%;
height: auto;
min-height: 100%;
margin: 0 auto;
background-color: grey;
padding: 0 0 25px 0;
box-shadow: 0px 0px 50px 5px grey;
}
.form-header-right {
position: relative;
width: 25%;
text-align: right;
margin: 0 0 0 auto;
box-sizing: border-box;
padding: 0 25px;
}
.form-banner {
position: relative;
width: 100%;
margin: 0 auto;
box-sizing: border-box;
background-color: dimgrey;
color: black;
padding: 25px;
}
.form-padded {
padding: 0 25px;
}
h1, h2, h3, h4, h5 {
text-align: center;
}
a { text-decoration-line: none; }
a:link { color: darkgrey; }
a:hover { color: white; }
a:visited { color: lightgrey; }
a:active { color: white; }
form {
padding-top: 25px;
padding-left: 25px;
padding-right: 25px;
padding-bottom: 250px;
}
.form-error {
position: relative;
width: 100%;
margin: 0 auto;
box-sizing: border-box;
background-color: orange;
}
.form-error-message {
padding: 25px;
margin: 0 auto;
width: 95%;
}
.form-text-block {
width: 80%;
margin: 0 auto;
}
.access-grid {
width: 80%;
display: grid;
margin: 0 auto;
padding: 5px;
grid-template-columns: auto auto auto auto;
gap: 5px;
}
.access-box {
background-color: dimgrey;
color: black;
padding: 5px 0;
text-align: center;
}
.access-box-title {
padding: 5px;
margin: 0 auto;
}
.access-box-banner {
position: relative;
width: 100%;
margin: 0 auto;
box-sizing: border-box;
background-color: black;
color: lightgrey;
padding: 5px;
}
.box-details {
text-align: left;
display: grid;
grid-template-columns: auto auto;
gap: 2px;
padding: 5px;
}
.box-details-key {
padding: 0 5px;
background-color: black;
color: lightgrey;
text-align: left;
}
.box-details-value {
padding: 0 5px;
background-color: lightgrey;
color: black;
text-align: left;
}
footer {
position: relative;
width: 100%
margin: 0 auto;
background-color: black;
}
.footer {
width: 95%;
color: lightgrey;
box-sizing: border-box;
padding: 25px;
}
</style>
</head>
<body>
<div class="form-stripe">
<div class="form-header-right">
Welcome {{form.display_name}}! |
<a href="/">Home</a>
</div>
<h1 class="form-banner">{{form.display_name}} Dashboard</h1>
{{#if error}}
<div class="form-error">
<p class="form-error-message">{{error}}</p>
</div>
{{/if}}
<div class="access-grid">
<div class="access-box">
<h4 class="access-box-title">Details</h4>
<div class="box-details">
<div class="box-details-key">Name</div>
<div class="box-details-value">{{form.display_name}}</div>
<div class="box-details-key">Public ID</div>
<div class="box-details-value">{{form.public_id}}</div>
<div class="box-details-key">Database ID</div>
<div class="box-details-value">{{form.debug.user_id}}</div>
<div class="box-details-key">Last Seen</div> <!-- TODO -->
<div class="box-details-value"><time datetime="{{form.debug.creation_time_iso}}">{{form.debug.creation_time_iso}}</time></div>
<div class="box-details-key">Creation</div>
<div class="box-details-value"><time datetime="{{form.debug.creation_time_iso}}">{{form.debug.creation_time_iso}}</time></div>
</div>
</div>
<div class="access-box">
<h4 class="access-box-title">Permissions</h4>
<div class="box-details">
<div class="box-details-key">Moderator</div>
<div class="box-details-value">{{form.perms.mod}}</div>
<div class="box-details-key">Administrator</div>
<div class="box-details-value">{{form.perms.admin}}</div>
<div class="box-details-key">Developer</div>
<div class="box-details-value">{{form.perms.dev}}</div>
<div class="box-details-key">Royal</div>
<div class="box-details-value">{{form.perms.royal}}</div>
<div class="box-details-key">Banned</div>
<div class="box-details-value">{{form.perms.banned}}</div>
</div>
</div>
<div class="access-box">
<h4 class="access-box-title">Garages</h4>
<div class="box-details">
<div class="box-details-key">Total</div> <!-- TODO -->
<div class="box-details-value">{{form.debug.user_id}}/{{form.debug.user_id}}</div>
</div>
<a href="#"> <!-- TODO -->
<div class="access-box-banner">
View My Garages
</div>
</a>
</div>
<div class="access-box">
<h4 class="access-box-title">Factory</h4>
<div class="box-details">
<div class="box-details-key">Total</div> <!-- TODO -->
<div class="box-details-value">{{form.debug.user_id}}/{{form.debug.user_id}}</div>
</div>
<a href="#"> <!-- TODO -->
<div class="access-box-banner">
View My Uploads
</div>
</a>
</div>
<div class="access-box">
<h4 class="access-box-title">Account</h4>
<a href="#"> <!-- TODO -->
<div class="access-box-banner">
Manage My Account
</div>
</a>
</div>
<div class="access-box">
<h4 class="access-box-title">Sanctions</h4>
<div class="box-details">
<div class="box-details-key">Total</div> <!-- TODO -->
<div class="box-details-value">{{form.debug.user_id}}</div>
</div>
<a href="#"> <!-- TODO -->
<div class="access-box-banner">
View My Sanctions
</div>
</a>
</div>
<div class="access-box">
<h4 class="access-box-title">Social</h4>
<div class="box-details">
<div class="box-details-key">Clan</div> <!-- TODO -->
<div class="box-details-value">{{form.display_name}}</div>
<div class="box-details-key">Friends</div> <!-- TODO -->
<div class="box-details-value">{{form.debug.user_id}}</div>
</div>
</div>
<div class="access-box">
<h4 class="access-box-title">Federation</h4>
<div class="box-details">
<div class="box-details-key">Enabled</div> <!-- TODO -->
<div class="box-details-value">{{form.perms.royal}}</div>
</div>
<a href="#"> <!-- TODO -->
<div class="access-box-banner">
Manage My Federation
</div>
</a>
</div>
</div>
<footer>
<div class="footer">
{{version}}
| <a href="{{source_url}}#readme">About</a>
| <a href="https://liberapay.com/NGram">Support Me</a>
</div>
</footer>
</div>
</body>
</html>

View File

@@ -0,0 +1,233 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<!-- Primary Meta Tags -->
<title>Home - Openjam</title>
<meta name="title" content="Home - Openjam" />
<meta name="description" content="OpenJam third-party Robocraft servers federation" />
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://git.ngram.ca/OpenJam/rc-servers" />
<meta property="og:title" content="Home - Openjam" />
<meta property="og:description" content="OpenJam third-party Robocraft servers federation" />
<meta property="og:image" content="https://git.ngram.ca/OpenJam/rc-servers/raw/branch/main/assets/robocraft/favicon.jpg" />
<!-- Twitter -->
<meta property="twitter:card" content="summary" />
<meta property="twitter:url" content="https://git.ngram.ca/OpenJam/rc-servers" />
<meta property="twitter:title" content="Home - Openjam" />
<meta property="twitter:description" content="OpenJam third-party Robocraft servers federation" />
<meta property="twitter:image" content="https://git.ngram.ca/OpenJam/rc-servers/raw/branch/main/assets/robocraft/favicon.jpg" />
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<style>
body {
background-color: lightgrey;
padding: 0;
margin: 0;
}
.form-stripe {
position: relative;
min-width: 300px;
max-width: 90%;
height: auto;
min-height: 100%;
margin: 0 auto;
background-color: grey;
padding: 0 0 25px 0;
box-shadow: 0px 0px 50px 5px grey;
}
.form-header-right {
position: relative;
width: 25%;
text-align: right;
margin: 0 0 0 auto;
box-sizing: border-box;
padding: 0 25px;
}
.form-banner {
position: relative;
width: 100%;
margin: 0 auto;
box-sizing: border-box;
background-color: dimgrey;
color: black;
padding: 25px;
}
.form-padded {
padding: 0 25px;
}
h1, h2, h3, h4, h5 {
text-align: center;
}
a { text-decoration-line: none; }
a:link { color: darkgrey; }
a:hover { color: white; }
a:visited { color: lightgrey; }
a:active { color: white; }
form {
padding-top: 25px;
padding-left: 25px;
padding-right: 25px;
padding-bottom: 250px;
}
.form-error {
position: relative;
width: 100%;
margin: 0 auto;
box-sizing: border-box;
background-color: orange;
}
.form-error-message {
padding: 25px;
margin: 0 auto;
width: 95%;
}
.form-text-block {
width: 80%;
margin: 0 auto;
}
.access-grid {
width: 80%;
display: grid;
margin: 0 auto;
padding: 5px;
grid-template-columns: auto auto auto auto;
gap: 5px;
}
.access-box {
background-color: dimgrey;
color: black;
padding: 5px;
text-align: center;
}
.access-box-title {
padding: 5px;
margin: 0 auto;
}
.access-box-banner {
position: relative;
width: 100%;
margin: 0 auto;
box-sizing: border-box;
background-color: black;
color: lightgrey;
padding: 5px;
}
.box-details {
text-align: left;
display: grid;
grid-template-columns: auto auto;
gap: 2px;
padding: 5px;
}
.box-details-key {
padding: 0 5px;
background-color: black;
color: lightgrey;
text-align: left;
}
.box-details-value {
padding: 0 5px;
background-color: lightgrey;
color: black;
text-align: left;
}
footer {
position: relative;
width: 100%
margin: 0 auto;
background-color: black;
}
.footer {
width: 95%;
color: lightgrey;
box-sizing: border-box;
padding: 25px;
}
</style>
</head>
<body>
<div class="form-stripe">
<div class="form-header-right">
{{#if form.is_logged_in}}
Welcome {{form.display_name}}! |
<a href="/dashboard">Dashboard</a>
{{else}}
<a href="/login">Login</a>
{{/if}}
</div>
<h1 class="form-banner">Welcome to <a href="https://git.ngram.ca/OpenJam">OpenJam</a> servers</h1>
<h3 class="form-padded">FOSSifying proprietary games since 2025</h3>
{{#if error}}
<div class="form-error">
<p class="form-error-message">{{error}}</p>
</div>
{{/if}}
<div class="form-text-block">
<p>
This service allows you to manage your account settings, import and export your garage bays, view the server config, and will eventually (not yet) federate with other OpenJam rc-servers instances.
You can view other known instances <a href="/federation">here</a>.
This service is intended to have stable public APIs for expanding existing functionality.
If you do not want any of this functionality in your instance, simply do not run this service with your instance.
</p>
<p>
Interested in running your own server instance? Check out the <a href="https://git.ngram.ca/OpenJam/rc-servers/wiki/Server-Quickstart">quickstart guide</a> in the wiki.
</p>
</div>
<div class="access-grid">
<div class="access-box">
<h4 class="access-box-title">Server Details</h4>
<div class="box-details">
<div class="box-details-key">Domain</div>
<div class="box-details-value">{{form.server.domain}}</div>
<div class="box-details-key">CDN</div>
<div class="box-details-value">{{form.server.cdn}}</div>
<div class="box-details-key">Auth</div>
<div class="box-details-value">{{form.server.auth}}</div>
<div class="box-details-key">Client Version</div>
<div class="box-details-value">>={{form.server.min_version}}</div>
<div class="box-details-key">Server Version</div>
<div class="box-details-value">{{form.server.server_version}}</div>
<div class="box-details-key">Start Time</div>
<div class="box-details-value"><time datetime="{{form.server.start_time_iso}}">{{form.server.start_time_iso}}</time></div>
</div>
</div>
<div class="access-box">
Grid item 2
</div>
<div class="access-box">
Grid item 3
</div>
<div class="access-box">
Grid item 4
</div>
<div class="access-box">
Grid item 5
</div>
<div class="access-box">
Grid item 6
</div>
<div class="access-box">
Grid item 7
</div>
<div class="access-box">
Grid item 8
</div>
</div>
<footer>
<div class="footer">
{{version}}
| <a href="{{source_url}}#readme">About</a>
| <a href="https://liberapay.com/NGram">Support Me</a>
</div>
</footer>
</div>
</body>
</html>

View File

@@ -0,0 +1,197 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<!-- Primary Meta Tags -->
<title>Login - Openjam</title>
<meta name="title" content="Login - Openjam" />
<meta name="description" content="Connect to a third-party Robocraft servers account" />
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://git.ngram.ca/OpenJam/rc-servers" />
<meta property="og:title" content="Login - Openjam" />
<meta property="og:description" content="Connect to a third-party Robocraft servers account" />
<meta property="og:image" content="https://git.ngram.ca/OpenJam/rc-servers/raw/branch/main/assets/robocraft/favicon.jpg" />
<!-- Twitter -->
<meta property="twitter:card" content="summary" />
<meta property="twitter:url" content="https://git.ngram.ca/OpenJam/rc-servers" />
<meta property="twitter:title" content="Login - Openjam" />
<meta property="twitter:description" content="Connect to a third-party Robocraft servers account" />
<meta property="twitter:image" content="https://git.ngram.ca/OpenJam/rc-servers/raw/branch/main/assets/robocraft/favicon.jpg" />
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<style>
body {
background-color: lightgrey;
padding: 0;
margin: 0;
}
.form-stripe {
position: relative;
min-width: 300px;
max-width: 500px;
height: auto;
min-height: 100%;
margin: 0 auto;
background-color: grey;
padding: 25px 0;
box-shadow: 0px 0px 50px 5px grey;
}
.form-banner {
position: relative;
min-width: 300px;
max-width: 500px;
margin: 0 auto;
box-sizing: border-box;
background-color: dimgrey;
color: black;
padding: 25px;
}
.form-padded {
padding: 0 25px;
}
h1, h2, h3, h4, h5 {
text-align: center;
}
a { text-decoration-line: none; }
a:link { color: darkgrey; }
a:hover { color: white; }
a:visited { color: lightgrey; }
a:active { color: white; }
form {
padding-top: 25px;
padding-left: 25px;
padding-right: 25px;
padding-bottom: 250px;
}
.form-error {
position: relative;
min-width: 300px;
max-width: 500px;
margin: 0 auto;
box-sizing: border-box;
background-color: orange;
}
.form-error-message {
padding: 25px;
margin: 0 auto;
width: 95%;
}
.form-input {
padding-top: 5px;
}
.form-input-label { display: none; }
input:required:invalid.form-input-box {
border-color: red;
}
input:required:invalid.form-input-box::after {
content: "*required";
color: red;
font-size: 12px;
}
input {
width: 100%;
height: 40px;
border: thin solid white;
background-color: lightgrey;
font-size: 20px;
}
.input-required-hint::after {
color: red;
/*content: "*required";*/
font-size: 12px;
}
.form-disclaimer {
margin: 0 auto;
width: 95%;
}
.form-submit {
margin: 0 auto;
}
.form-submit-button {
background-color: black;
color: lightgrey;
}
.fake-button {
padding-top: 25px;
padding-left: 25px;
padding-right: 25px;
margin: 0 auto;
text-align: center;
font-size: 20px;
}
.fake-button-anchor {
width: 100%;
background-color: black;
color: lightgrey;
border: 1px solid white;
display: inline-block;
padding-top: 10px;
padding-bottom: 10px;
}
footer {
position: relative;
min-width: 300px;
max-width: 500px;
margin: 0 auto;
background-color: black;
}
.footer {
width: 95%;
color: lightgrey;
box-sizing: border-box;
padding: 25px;
}
</style>
</head>
<body>
<div class="form-stripe">
<h1 class="form-banner">Login to <a href="https://git.ngram.ca/OpenJam">OpenJam</a> servers</h1>
<h3 class="form-padded">FOSSifying proprietary games since 2025</h3>
{{#if error}}
<div class="form-error">
<p class="form-error-message">{{error}}</p>
</div>
{{/if}}
<form action="/login" method="post">
<div class="form-input">
<div class="form-input-label">
<label for="username">Username</label>
</div>
<input class="form-input-box" type="text" id="username" name="username" value="{{form.username}}" placeholder="username" required/>
<span class="input-required-hint"></span>
</div>
<div class="form-input">
<div class="form-input-label">
<label for="password">Password</label>
</div>
<input class="form-input-box" type="password" id="password" name="password" value="{{form.password}}" placeholder="password" required/>
<span class="input-required-hint"></span>
</div>
<div class="form-disclaimer">
<p>By submitting, you agree to the <a href="https://git.ngram.ca/OpenJam/rc-servers#privacy">privacy policy</a>.</p>
</div>
<div class="form-submit">
<input class="form-submit-button" type="submit" value="Submit">
</div>
<div class="form-disclaimer">
<p>This project is not affiliated with FreeJam, Cardlife or Robocraft. We're just fixing their """sunset""".</p>
</div>
</form>
<footer>
<div class="footer">
{{version}}
| <a href="{{source_url}}#readme">About</a>
| <a href="https://liberapay.com/NGram">Support Me</a>
</div>
</footer>
</div>
</body>
</html>