47 Commits

Author SHA1 Message Date
trianta c8f5ed5c49 contact: fix incorrect userID for Matrix 2026-02-26 10:37:56 -06:00
trianta 83e7fc7684 core: fixup completed page 2026-02-24 09:40:41 -06:00
trianta e16f882db2 html: remove old ul styles 2026-02-24 08:45:24 -06:00
trianta 4efb3a9ade html: cleanup formatting 2026-02-24 08:40:05 -06:00
trianta de3c5f9c7b html: fixup sitemap 2026-02-24 08:30:48 -06:00
trianta 3f4c82be14 html: update quick text 2026-02-24 08:27:30 -06:00
trianta d8605ca7c3 html: add sitemap and improve contact section 2026-02-24 08:25:30 -06:00
trianta 656e850595 html: make links more apparent 2026-02-24 07:46:10 -06:00
trianta 692a5fd775 css: adjust colors again 2026-02-24 07:38:01 -06:00
trianta afb6fec687 html: remove navigation from the side 2026-02-24 07:30:58 -06:00
trianta 2000f8ceef Merge pull request 'recolor website' (#23) from recolor into main
Reviewed-on: #23
2026-02-24 07:08:48 -06:00
trianta 41c01fcf55 css: unify colors and swap bg/fg 2026-02-24 07:07:20 -06:00
trianta ea61606f68 css: visited buttons should stay same color 2026-02-24 07:02:05 -06:00
trianta e350bba979 css: match colors on buttons 2026-02-24 06:56:52 -06:00
trianta 6dc13a5c1e css: fix error in fetching font 2026-02-24 06:51:36 -06:00
trianta a20db4d400 assets: remove folder 2026-02-24 06:49:43 -06:00
trianta de6b32b21e css: source the font from nerfonts.com 2026-02-24 06:48:11 -06:00
trianta f3725f605d html: fixup icons 2026-02-24 06:36:53 -06:00
trianta 7c7cc7130e css: syntax fix 2026-02-24 06:25:09 -06:00
trianta e57719d4f6 css: how had this ever worked? 2026-02-24 06:23:46 -06:00
trianta ff6f212c83 css: potentially fixup url 2026-02-24 06:18:01 -06:00
trianta 122e341c89 css: fix font url 2026-02-24 06:14:39 -06:00
trianta 39b848b126 css: attempt to add custom font 2026-02-24 06:06:40 -06:00
trianta 0b367bba27 css: fix css syntax 2026-02-24 05:21:50 -06:00
trianta f02b11b418 css: recolor website 2026-02-24 05:20:39 -06:00
trianta d23375e28b jenkins: finally fix pipeline 2026-02-24 05:05:53 -06:00
trianta dcf2cfb35d jenkins: try with just main again 2026-02-24 04:38:15 -06:00
trianta dd0b5f63fe jenkins: theres no way this works 2026-02-24 04:35:21 -06:00
trianta eb0b249d6a jenkins: more regex attempting 2026-02-24 04:29:55 -06:00
trianta 8cbaef9afe jenkins: try regex 2026-02-24 03:58:48 -06:00
trianta 995eb69937 jenkins: try direct variable 2026-02-24 03:55:58 -06:00
trianta 193dcb2b2b jenkins: try alternative 2026-02-24 03:54:15 -06:00
trianta d42c59c317 jenkins: zzz 2026-02-24 03:46:24 -06:00
trianta 2b5b791399 jenkins: wtf 2026-02-24 03:45:05 -06:00
trianta f99105c222 jenkins: manual conditional override 2026-02-24 03:44:01 -06:00
trianta ca716de215 jenkins: losing my mind 2026-02-24 03:39:54 -06:00
trianta 7f93e1c58a jenkins: finally fix pipeline? 2026-02-24 03:35:50 -06:00
trianta 0f12fd3742 jenkins: debug prints 2026-02-24 03:33:18 -06:00
trianta 91cefa9033 jenkins: try to fix expressions 2026-02-24 03:27:16 -06:00
trianta 2f86d84e19 jenkins: change to using expressions 2026-02-24 03:25:22 -06:00
trianta dc461f6af0 jenkins: fix Jenkinsfile typo 2026-02-24 03:11:11 -06:00
trianta 8b2d332d8b jenkins: attempt to fix Jenkinsfile again 2026-02-24 03:08:29 -06:00
trianta 00804e0a30 jenkins: fixup pipeline into multibranch structure 2026-02-24 02:08:15 -06:00
trianta 4b8cac97ad jenkins: setup different pipelines for specific servers 2026-02-24 00:57:19 -06:00
trianta 8af19f442c contact: add matrix 2026-02-13 23:51:26 -06:00
trianta 62212f1c7c npm: update packages 2026-02-12 12:10:01 -06:00
trianta 8751d5aa86 css: move to new colorscheme 2026-02-02 04:20:06 -06:00
10 changed files with 483 additions and 524 deletions
Vendored
+35 -4
View File
@@ -1,22 +1,53 @@
pipeline { pipeline {
agent any agent none
stages { stages {
stage('Checkout') { stage('Checkout') {
agent { label 'agent-12' }
when { expression { return env.GIT_BRANCH == 'origin/main' } }
steps { steps {
checkout scm checkout scm
} }
} }
stage('Build') { stage('Build') {
agent { label 'agent-12' }
when { expression { return env.GIT_BRANCH == 'origin/main' } }
steps {
script {
docker.build('trianta.dev:latest')
}
}
}
stage('Deploy') {
agent { label 'agent-12' }
when { expression { return env.GIT_BRANCH == 'origin/main' } }
steps {
sh 'docker stop trianta.dev && docker rm trianta.dev || exit 0'
sh 'docker run -d -e USER=scv -e USER_UID=1001 -e USER_GID=1001 --restart=unless-stopped -p 3466:80 --name trianta.dev trianta.dev:latest'
}
}
stage('Test Checkout') {
agent { label 'agent-13' }
when { expression { return env.GIT_BRANCH != 'origin/main' } }
steps {
sh 'echo $GIT_BRANCH'
checkout scm
}
}
stage('Test Build') {
agent { label 'agent-13' }
when { expression { return env.GIT_BRANCH != 'origin/main' } }
steps { steps {
script { script {
docker.build('test.trianta.dev:latest') docker.build('test.trianta.dev:latest')
} }
} }
} }
stage('Deploy') { stage('Test Deploy') {
agent { label 'agent-13' }
when { expression { return env.GIT_BRANCH != 'origin/main' } }
steps { steps {
sh 'docker stop test && docker rm test || exit 0' sh 'docker stop test.trianta.dev && docker rm test.trianta.dev || exit 0'
sh 'docker run -d -p 3466:80 --name test test.trianta.dev:latest' sh 'docker run -d -e USER=scv -e USER_UID=1001 -e USER_GID=1001 --restart=unless-stopped -p 3466:80 --name test.trianta.dev test.trianta.dev:latest'
} }
} }
} }
+21 -31
View File
@@ -1,14 +1,16 @@
/* /*
* base text: #06CDFF * text / border: #8c7862
* important text: #8200FF * foreground: #fbf1c7
* background: #03001C * background: #89bea6
*/ */
body { body {
font-family: Arial, sans-serif; font-family: "Departure Mono", sans-serif;
font-weight: 800; font-optical-sizing: auto;
color: #06CDFF; font-weight: 400;
background: #03001C; color: #8c7862;
background: #89bea6;
line-height: 1.5; line-height: 1.5;
margin-inline: auto; margin-inline: auto;
margin: 0 auto; margin: 0 auto;
@@ -16,8 +18,11 @@ body {
.inside { .inside {
max-width: 60rem; max-width: 60rem;
margin: 0 auto; margin: 2rem auto;
padding: 2rem 1.5rem; padding: 2rem 1.5rem;
background: #fbf1c7;
border: 4px solid #8c7862;
border-radius: 14px;
} }
nav { nav {
@@ -51,11 +56,8 @@ nav ul {
} }
.trianta { .trianta {
border: none !important;
color: #06CDFF !important;
font-size: 2.5rem !important; font-size: 2.5rem !important;
min-width: 12rem; padding: 0px;
margin: -1rem;
} }
.canvas { .canvas {
@@ -63,13 +65,11 @@ nav ul {
display: inline-block; display: inline-block;
width: 60rem; width: 60rem;
vertical-align: bottom; vertical-align: bottom;
border: solid 4px #06CDFF;
} }
.stats { .stats {
font-size: 18px; font-size: 18px;
display: inline-block; display: inline-block;
width: 12rem;
vertical-align: middle; vertical-align: middle;
} }
@@ -80,7 +80,7 @@ h1 {
} }
h2 { h2 {
border: solid 2px #06CDFF; border: solid 2px #8c7862;
margin: auto; margin: auto;
padding: 8px; padding: 8px;
text-align: center; text-align: center;
@@ -94,22 +94,15 @@ h3 {
} }
p { p {
margin: 0px; margin: 1rem;
} }
a { a {
background-color: #03001C;
border: solid 2px #06CDFF;
border-radius: 12px;
color: #06CDFF;
display: inline-block;
margin: 6px;
margin-top: 0px;
max-width: 8rem; max-width: 8rem;
padding: 8px; padding: 8px;
text-align: center;
text-decoration: none; text-decoration: none;
width: 100%; width: 100%;
color: #8c7862;
} }
a:hover, a:active { a:hover, a:active {
@@ -126,8 +119,7 @@ a.button {
} }
a:visited { a:visited {
border: solid 2px #8200FF; color: #8c7862;
color: #8200FF;
} }
@keyframes hover { @keyframes hover {
@@ -149,13 +141,11 @@ a:visited {
margin: 0px auto; margin: 0px auto;
margin-top: 25px; margin-top: 25px;
margin-bottom: 25px; margin-bottom: 25px;
} border: 2px solid #8c7862;
padding: 10px 0px;
.reserve {
max-height: 800px;
} }
#pong { #pong {
margin: 6px; margin: 6px;
background: #03001C; background: #61937c;
} }
+34 -16
View File
@@ -3,27 +3,45 @@
<head> <head>
<meta charset="utf-8"/> <meta charset="utf-8"/>
<title>Trianta</title> <title>Trianta</title>
<link rel="stylesheet" href="/default.css" /> <link rel="stylesheet" href="/default.css">
<link rel="stylesheet" href="https://www.nerdfonts.com/assets/css/webfont.css">
</head> </head>
<body> <body>
<div class="inside"> <div class="inside">
<div> <div>
<a href="/" class="trianta">TRIANTA</a> <a href="/" class="trianta">[ TRIANTA ]</a>
<p>Function over form by design</p> <div class="column">
<a href="https://www.github.com/trimutex" alt="GitHub">[ <i class="nf nf-dev-github"></i> ]</a>
<a href="https://lab.trianta.dev/Trianta" alt="Personal Projects">[ <i class="nf nf-linux-gitea"></i> ]</a>
<a href="/completed" alt="Completed">[ <i class="nf nf-dev-javascript"></i> ]</a>
<a href="/current" alt="Current">[ <i class="nf nf-dev-git_branch"></i> ]</a>
<a href="/other" alt="Other">[ <i class="nf nf-dev-git_merge"></i> ]</a>
<a href="/contact" alt="Contact">[ <i class="nf nf-oct-feed_person"></i> ]</a>
</div>
</div> </div>
<div style="display: flex;"> <p>Progress Not Perfection</p>
<nav class="column"> <h2> Welcome! </h2>
<ul> <div class="card">
<li><a href="https://www.github.com/trimutex">GitHub</a></li> <h3>What is this place?</h3>
<li><a href="https://lab.trianta.dev/Trianta">Projects</a></li> <p>My name is Greg, also known as Trianta in online spaces.
<li><a href="/completed">Completed</a></li> This is my personal home page, hosted on my own server hardware.
<li><a href="/current">Current</a></li> All of my code is 100% self-produced with no AI (LLM) code.
<li><a href="/other">Other</a></li> Enjoy a look around! </p>
<li><a href="/contact">Contact</a></li> <p>If you want to contact me, see my <a href="/contact">[ contact ]</a> page.</p>
</ul> </div>
</nav> <div class="card">
<div class="column gap"></div> <h3>Sitemap</h3>
<div class="column content"></div> <a href="/completed">[ Completed JavaScript Projects ]</a> .
<a href="/current">[ Current Personal Projects ]</a>
<br>
<a href="/other">[ Other Projects and Contributions ]</a> .
<a href="/contact">[ Contact Methods ]</a> .
<a href="https://lab.trianta.dev/Trianta">[ Gitea ]</a>
<br>
<a href="https://clips.trianta.dev">[ Gaming Clips ]</a> .
<a href="https://draw.trianta.dev">[ Excalidraw ]</a> .
<a href="https://pdf.trianta.dev">[ Stirling-pdf ]</a>
<p>If you want to contact me, see my <a href="/contact">[ contact ]</a> page.</p>
</div> </div>
</div> </div>
</body> </body>
+3 -3
View File
@@ -13,9 +13,9 @@
} }
}, },
"node_modules/typescript": { "node_modules/typescript": {
"version": "5.6.3", "version": "5.9.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
"integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"license": "Apache-2.0", "license": "Apache-2.0",
"bin": { "bin": {
"tsc": "bin/tsc", "tsc": "bin/tsc",
+44 -50
View File
@@ -4,64 +4,58 @@
<meta charset="utf-8"/> <meta charset="utf-8"/>
<title>Trianta</title> <title>Trianta</title>
<link rel="stylesheet" href="/default.css" /> <link rel="stylesheet" href="/default.css" />
<link rel="stylesheet" href="https://www.nerdfonts.com/assets/css/webfont.css">
</head> </head>
<body> <body>
<div class="inside"> <div class="inside">
<div> <div>
<a href="/" class="trianta">TRIANTA</a> <a href="/" class="trianta">[ TRIANTA ]</a>
<p>Function over form by design</p> <div class="column">
<a href="https://www.github.com/trimutex" alt="GitHub">[ <i class="nf nf-dev-github"></i> ]</a>
<a href="https://lab.trianta.dev/Trianta" alt="Personal Projects">[ <i class="nf nf-linux-gitea"></i> ]</a>
<a href="/completed" alt="Completed">[ <i class="nf nf-dev-javascript"></i> ]</a>
<a href="/current" alt="Current">[ <i class="nf nf-dev-git_branch"></i> ]</a>
<a href="/other" alt="Other">[ <i class="nf nf-dev-git_merge"></i> ]</a>
<a href="/contact" alt="Contact">[ <i class="nf nf-oct-feed_person"></i> ]</a>
</div>
</div> </div>
<div style="display: flex;"> <p>Progress Not Perfection</p>
<nav class="column"> <h2>Completed JavaScript Projects</h2>
<ul> <div class="card">
<li><a href="https://www.github.com/trimutex">GitHub</a></li> <div class="canvas">
<li><a href="https://lab.trianta.dev/Trianta">Projects</a></li> <canvas width="750" height="585" id="pong"></canvas>
<li><a href="/completed">Completed</a></li> <script src="/public/pong.js"></script>
<li><a href="/current">Current</a></li> <div id="gameover" hidden="true">
<li><a href="/other">Other</a></li> <h3>Game Over</h3>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
<div class="column gap"></div>
<div class="column content">
<h2>Completed Projects</h2>
<div class="card reserve">
<div class="canvas">
<canvas width="750" height="585" id="pong"></canvas>
<script src="/public/pong.js"></script>
<div id="gameover" hidden="true">
<h3>Game Over</h3>
</div>
<div id="restart" hidden="true">
<button class="button" type="button" onclick = "restartGame()">Restart Game</a>
</div>
</div>
<div class="stats">
<p style="font-size: 22px;">Pong</p>
<p>Left Paddle Height: <span id="leftPaddle"></span></p>
<p>Right Paddle Height: <span id="rightPaddle"></span></p>
<a href="https://lab.trianta.dev/Trianta/trianta.dev/src/branch/main/src/pong.js">View Code</a>
</div>
</div> </div>
<div class="card reserve"> <div id="restart" hidden="true">
<div class="canvas"> <button class="button" type="button" onclick = "restartGame()">Restart Game</a>
<canvas width="625" height="375" id="snake"></canvas>
<script src="/public/snake.js"></script>
</div>
<div class="stats">
<p style="font-size: 22px;">Snake</p>
<p>
Adjust game size -- Width:
<input id="snakeWidth" type="number" min="2" max="31" value="31">
Height:
<input id="snakeHeight" type="number" min="2" max="24" value="24">
</p>
<p>Snake Head Location: <span id="snakeHead"></span></p>
<p>Food Location: <span id="snakeFood"></span></p>
<a href="https://lab.trianta.dev/Trianta/trianta.dev/src/branch/main/src/snake.ts">View Code</a>
</div>
</div> </div>
</div> </div>
<div class="stats">
<p style="font-size: 22px;">Pong</p>
<p>Left Paddle Height: <span id="leftPaddle"></span></p>
<p>Right Paddle Height: <span id="rightPaddle"></span></p>
<a href="https://lab.trianta.dev/Trianta/trianta.dev/src/branch/main/src/pong.js">[ View Code ]</a>
</div>
</div>
<div class="card">
<div class="canvas">
<canvas width="625" height="375" id="snake"></canvas>
<script src="/public/snake.js"></script>
</div>
<div class="stats">
<p style="font-size: 22px;">Snake</p>
<p>
Adjust game size -- Width:
<input id="snakeWidth" type="number" min="2" max="31" value="31">
Height:
<input id="snakeHeight" type="number" min="2" max="24" value="24">
</p>
<p>Snake Head Location: <span id="snakeHead"></span></p>
<p>Food Location: <span id="snakeFood"></span></p>
<a href="https://lab.trianta.dev/Trianta/trianta.dev/src/branch/main/src/snake.ts">[ View Code ]</a>
</div>
</div> </div>
</div> </div>
</body> </body>
+42 -19
View File
@@ -4,31 +4,54 @@
<meta charset="utf-8"/> <meta charset="utf-8"/>
<title>Trianta</title> <title>Trianta</title>
<link rel="stylesheet" href="/default.css" /> <link rel="stylesheet" href="/default.css" />
<link rel="stylesheet" href="https://www.nerdfonts.com/assets/css/webfont.css">
</head> </head>
<body> <body>
<div class="inside"> <div class="inside">
<div> <div>
<a href="/" class="trianta">TRIANTA</a> <a href="/" class="trianta">[ TRIANTA ]</a>
<p>Function over form by design</p> <div class="column">
</div> <a href="https://www.github.com/trimutex" alt="GitHub">[ <i class="nf nf-dev-github"></i> ]</a>
<div style="display: flex;"> <a href="https://lab.trianta.dev/Trianta" alt="Personal Projects">[ <i class="nf nf-linux-gitea"></i> ]</a>
<nav class="column"> <a href="/completed" alt="Completed">[ <i class="nf nf-dev-javascript"></i> ]</a>
<ul> <a href="/current" alt="Current">[ <i class="nf nf-dev-git_branch"></i> ]</a>
<li><a href="https://www.github.com/trimutex">GitHub</a></li> <a href="/other" alt="Other">[ <i class="nf nf-dev-git_merge"></i> ]</a>
<li><a href="https://lab.trianta.dev/Trianta">Projects</a></li> <a href="/contact" alt="Contact">[ <i class="nf nf-oct-feed_person"></i> ]</a>
<li><a href="/completed">Completed</a></li>
<li><a href="/current">Current</a></li>
<li><a href="/other">Other</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
<div class="column gap"></div>
<div class="column content">
<h2>Contact Methods</h2>
<p>E-mail: gregcraw2001@gmail.com</p>
<p>Discord: trianta</p>
</div> </div>
</div> </div>
<p>Progress Not Perfection</p>
<div class="card">
<h3>Contact Methods</h3>
<p>E-mail: gregcraw2001@gmail.com</p>
<p>Matrix: @trianta:matrix.trianta.dev</p>
<p>Discord: @trianta (depreciated)</p>
</div>
<div class="card">
<h3>How do I use Matrix?</h3>
<p>Here's my notes of how to access it:</p>
<h3>Picking a Client</h3>
<p>A client is needed to access the server. As such, here's some listed popular clients:</p>
<p><a href="https://cinny.in">[ Cinny (Personal Choice) ]</a></p>
<p><a href="https://app.element.io">[ Element ]</a></p>
<p><a href="https://commet.chat">[ Commet ]</a></p>
<p><a href="https://matrix.org/ecosystem/clients">[ Clients Listed From Official Site ]</a></p>
<h3>Account Creation</h3>
<p>Once you open a client, you will create an account. Here's info about the details:</p>
<p>+ --- Homeserver --- +</p>
<p>This is which server your account resides</p>
<p>Mine is `matrix.trianta.dev`, other default options exist</p>
<p>+ --- Username / Password --- +</p>
<p>The login details for accessing the account on the above server</p>
<p>+ --- Registration Token --- +</p>
<p>A password for account creation on a server if enabled</p>
<p>The default options normally don't have this</p>
<p>If you want the token for my server, contact me another way first!</p>
<h3>Welcome In!</h3>
<p>Mess around with it, `Add Space` (the plus icon) is the equivalent of creating a server in Discord.</p>
<p>Accounts are able to connect to spaces that exist in other servers if the server enables it (known as federation).</p>
<p>My Contact: `@trianta:matrix.trianta.dev`</p>
<p>My Space Invite: <a href="https://matrix.to/#/#core:matrix.trianta.dev">#core:matrix.trianta.dev</a></p>
</div>
</div> </div>
</body> </body>
</html> </html>
+24 -30
View File
@@ -4,42 +4,36 @@
<meta charset="utf-8"/> <meta charset="utf-8"/>
<title>Trianta</title> <title>Trianta</title>
<link rel="stylesheet" href="/default.css" /> <link rel="stylesheet" href="/default.css" />
<link rel="stylesheet" href="https://www.nerdfonts.com/assets/css/webfont.css">
</head> </head>
<body> <body>
<div class="inside"> <div class="inside">
<div> <div>
<a href="/" class="trianta">TRIANTA</a> <a href="/" class="trianta">[ TRIANTA ]</a>
<p>Function over form by design</p> <div class="column">
</div> <a href="https://www.github.com/trimutex" alt="GitHub">[ <i class="nf nf-dev-github"></i> ]</a>
<div style="display: flex;"> <a href="https://lab.trianta.dev/Trianta" alt="Personal Projects">[ <i class="nf nf-linux-gitea"></i> ]</a>
<nav class="column"> <a href="/completed" alt="Completed">[ <i class="nf nf-dev-javascript"></i> ]</a>
<ul> <a href="/current" alt="Current">[ <i class="nf nf-dev-git_branch"></i> ]</a>
<li><a href="https://www.github.com/trimutex">GitHub</a></li> <a href="/other" alt="Other">[ <i class="nf nf-dev-git_merge"></i> ]</a>
<li><a href="https://lab.trianta.dev/Trianta">Projects</a></li> <a href="/contact" alt="Contact">[ <i class="nf nf-oct-feed_person"></i> ]</a>
<li><a href="/completed">Completed</a></li>
<li><a href="/current">Current</a></li>
<li><a href="/other">Other</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
<div class="column gap"></div>
<div class="column content">
<h2>Current Personal Projects</h2>
<div class="card">
<h3>Wrench</h3>
<p>Description: A simple application to handle all of your Linux configuration needs.</p>
<p>Language: C++26</p>
<p>Tools: CMake</p>
<p>Frameworks: Qt6</p>
<a href="https://github.com/Trimutex/wrench">View Repository</a>
</div>
<div class="card">
<h3>Synopsis</h3>
<p>Description: A markdown repository containing details and changes of servers I maintain.</p>
<a href="https://github.com/Trimutex/synopsis">View Repository</a>
</div>
</div> </div>
</div> </div>
<p>Progress Not Perfection</p>
<h2>Active Personal Projects</h2>
<div class="card">
<h3>Wrench</h3>
<p>Description: A simple application to handle all of your Linux configuration needs.</p>
<p>Language: C++26</p>
<p>Tools: CMake</p>
<p>Frameworks: Qt6</p>
<a href="https://github.com/Trimutex/wrench">[ View Repository ]</a>
</div>
<div class="card">
<h3>Synopsis</h3>
<p>Description: A markdown repository containing details and changes of servers I maintain.</p>
<a href="https://github.com/Trimutex/synopsis">[ View Repository ]</a>
</div>
</div> </div>
</body> </body>
</html> </html>
+54 -60
View File
@@ -4,72 +4,66 @@
<meta charset="utf-8"/> <meta charset="utf-8"/>
<title>Trianta</title> <title>Trianta</title>
<link rel="stylesheet" href="/default.css" /> <link rel="stylesheet" href="/default.css" />
<link rel="stylesheet" href="https://www.nerdfonts.com/assets/css/webfont.css">
</head> </head>
<body> <body>
<div class="inside"> <div class="inside">
<div> <div>
<a href="/" class="trianta">TRIANTA</a> <a href="/" class="trianta">[ TRIANTA ]</a>
<p>Function over form by design</p> <div class="column">
</div> <a href="https://www.github.com/trimutex" alt="GitHub">[ <i class="nf nf-dev-github"></i> ]</a>
<div style="display: flex;"> <a href="https://lab.trianta.dev/Trianta" alt="Personal Projects">[ <i class="nf nf-linux-gitea"></i> ]</a>
<nav class="column"> <a href="/completed" alt="Completed">[ <i class="nf nf-dev-javascript"></i> ]</a>
<ul> <a href="/current" alt="Current">[ <i class="nf nf-dev-git_branch"></i> ]</a>
<li><a href="https://www.github.com/trimutex">GitHub</a></li> <a href="/other" alt="Other">[ <i class="nf nf-dev-git_merge"></i> ]</a>
<li><a href="https://lab.trianta.dev/Trianta">Projects</a></li> <a href="/contact" alt="Contact">[ <i class="nf nf-oct-feed_person"></i> ]</a>
<li><a href="/completed">Completed</a></li>
<li><a href="/current">Current</a></li>
<li><a href="/other">Other</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
<div class="column gap"></div>
<div class="column content">
<h2>Other Projects</h2>
<div class="card">
<h3>Hyprland</h3>
<p>Description: An independent, highly customizable, dynamic tiling Wayland compositor that doesn't sacrifice on its looks. </p>
<a href="https://github.com/hyprwm/Hyprland">View Repository</a>
<p>Language: C++26</p>
<p>Tools: CMake</p>
<p>and various libraries.</p>
<p>Contributions (newest first)</p>
<a href="https://github.com/hyprwm/Hyprland/pull/8323">hyprwm/Hyprland#8323</a>
<a href="https://github.com/hyprwm/Hyprland/pull/8044">hyprwm/Hyprland#8044</a>
<a href="https://github.com/hyprwm/Hyprland/pull/7959">hyprwm/Hyprland#7959</a>
<br>
<a href="https://github.com/hyprwm/Hyprland/pull/7755">hyprwm/Hyprland#7755</a>
<a href="https://github.com/hyprwm/Hyprland/pull/7683">hyprwm/Hyprland#7683</a>
<a href="https://github.com/hyprwm/Hyprland/pull/7633">hyprwm/Hyprland#7633</a>
<br>
<a href="https://github.com/hyprwm/Hyprland/pull/7575">hyprwm/Hyprland#7575</a>
<a href="https://github.com/hyprwm/Hyprland/pull/7458">hyprwm/Hyprland#7458</a>
<a href="https://github.com/hyprwm/Hyprland/pull/6652">hyprwm/Hyprland#6652</a>
</div>
<div class="card">
<h3>Proxy</h3>
<p>Description: A program written in C++ to act as a proxy for another server.</p>
<a href="https://lab.trianta.dev/Trianta/proxy-network">View Repository</a>
<p>Language: C++11</p>
<p>Tools: CMake</p>
<p>Testing Frameworks: <a href="https://github.com/ThrowTheSwitch/Unity">Unity Test (ThrowTheSwitch)</a></p>
</div>
<div class="card">
<h3>Cloudcare</h3>
<p>Description: A sample repository that uses downloaded .bed files to train a model on DNA using PyTorch.</p>
<a href="https://github.com/Trimutex/cloudcare">View Repository</a>
<p>Languages: Python, Bash</p>
<p>Libraries: PyTorch</p>
<p>Tools: Conda</p>
</div>
<div class="card">
<h3>N-Queens</h3>
<p>Description: The N-Queens problem recreated in C++ which gets solved using a Genetic Algorithm.</p>
<a href="https://lab.trianta.dev/Trianta/n-queens">View Repository</a>
<p>Language: C++11</p>
<p>Tools: CMake</p>
</div>
</div> </div>
</div> </div>
<p>Progress Not Perfection</p>
<h2>Other Projects and Contributions</h2>
<div class="card">
<h3>Hyprland</h3>
<p>Description: An independent, highly customizable, dynamic tiling Wayland compositor that doesn't sacrifice on its looks. </p>
<a href="https://github.com/hyprwm/Hyprland">[ View Repository ]</a>
<p>Language: C++26</p>
<p>Tools: CMake</p>
<p>and various libraries.</p>
<p>Contributions (newest first)</p>
<a href="https://github.com/hyprwm/Hyprland/pull/8323">[ hyprwm/Hyprland#8323 ]</a>
<a href="https://github.com/hyprwm/Hyprland/pull/8044">[ hyprwm/Hyprland#8044 ]</a>
<a href="https://github.com/hyprwm/Hyprland/pull/7959">[ hyprwm/Hyprland#7959 ]</a>
<br>
<a href="https://github.com/hyprwm/Hyprland/pull/7755">[ hyprwm/Hyprland#7755 ]</a>
<a href="https://github.com/hyprwm/Hyprland/pull/7683">[ hyprwm/Hyprland#7683 ]</a>
<a href="https://github.com/hyprwm/Hyprland/pull/7633">[ hyprwm/Hyprland#7633 ]</a>
<br>
<a href="https://github.com/hyprwm/Hyprland/pull/7575">[ hyprwm/Hyprland#7575 ]</a>
<a href="https://github.com/hyprwm/Hyprland/pull/7458">[ hyprwm/Hyprland#7458 ]</a>
<a href="https://github.com/hyprwm/Hyprland/pull/6652">[ hyprwm/Hyprland#6652 ]</a>
</div>
<div class="card">
<h3>Proxy</h3>
<p>Description: A program written in C++ to act as a proxy for another server.</p>
<a href="https://lab.trianta.dev/Trianta/proxy-network">[ View Repository ]</a>
<p>Language: C++11</p>
<p>Tools: CMake</p>
<p>Testing Frameworks: <a href="https://github.com/ThrowTheSwitch/Unity">[ Unity Test (ThrowTheSwitch) ]</a></p>
</div>
<div class="card">
<h3>Cloudcare</h3>
<p>Description: A sample repository that uses downloaded .bed files to train a model on DNA using PyTorch.</p>
<a href="https://github.com/Trimutex/cloudcare">[ View Repository ]</a>
<p>Languages: Python, Bash</p>
<p>Libraries: PyTorch</p>
<p>Tools: Conda</p>
</div>
<div class="card">
<h3>N-Queens</h3>
<p>Description: The N-Queens problem recreated in C++ which gets solved using a Genetic Algorithm.</p>
<a href="https://lab.trianta.dev/Trianta/n-queens">[ View Repository ]</a>
<p>Language: C++11</p>
<p>Tools: CMake</p>
</div>
</div> </div>
</body> </body>
</html> </html>
+226
View File
@@ -0,0 +1,226 @@
const canvas = document.getElementById('pong');
const context = canvas.getContext('2d');
const grid = 15;
const paddleHeight = grid * 5; // 80
const maxPaddleY = canvas.height - grid - paddleHeight;
var paddleSpeed = 6;
var ballSpeed = 5;
var leftScore = 0;
var rightScore = 0;
const leftPaddle = {
// start in the middle of the game on the left side
x: grid * 2,
y: canvas.height / 2 - paddleHeight / 2,
width: grid,
height: paddleHeight,
// paddle velocity
dy: 0
};
const rightPaddle = {
// start in the middle of the game on the right side
x: canvas.width - grid * 3,
y: canvas.height / 2 - paddleHeight / 2,
width: grid,
height: paddleHeight,
// paddle velocity
dy: 0
};
const ball = {
// start in the middle of the game
x: canvas.width / 2,
y: canvas.height / 2,
width: grid,
height: grid,
// keep track of when need to reset the ball position
resetting: false,
// ball velocity (start going to the top-right corner)
dx: ballSpeed,
dy: -ballSpeed
};
// check for collision between two objects using axis-aligned bounding box (AABB)
// @see https://developer.mozilla.org/en-US/docs/Games/Techniques/2D_collision_detection
function collides(obj1, obj2) {
return obj1.x < obj2.x + obj2.width &&
obj1.x + obj1.width > obj2.x &&
obj1.y < obj2.y + obj2.height &&
obj1.y + obj1.height > obj2.y;
}
function gameOver() {
context.clearRect(0, 0, canvas.width, canvas.height);
let restartGame = document.getElementById("restart");
let gameOverText = document.getElementById("gameover");
restartGame.hidden = false;
gameOverText.hidden = false;
}
function restartGame() {
leftScore = 0;
rightScore = 0;
let restartGame = document.getElementById("restart");
restartGame.hidden = true;
requestAnimationFrame(loop);
}
function BotMovesPaddle(paddle) {
ballRegion = Math.floor(ball.y / 15);
paddleRegion = Math.floor(paddle.y / 15);
if (ballRegion < paddleRegion) paddle.dy = -paddleSpeed;
if (ballRegion > paddleRegion) paddle.dy = paddleSpeed;
if (ballRegion === paddleRegion) paddle.dy = 0;
}
// game loop
function loop() {
//if (leftScore < 7 && rightScore < 7) {
requestAnimationFrame(loop);
//} else if (leftScore >= 7 || rightScore >= 7) {
// gameOver();
//}
context.clearRect(0,0,canvas.width,canvas.height);
if (ball.dx < 0) {
BotMovesPaddle(leftPaddle);
document.getElementById("leftPaddle").innerHTML = leftPaddle.y;
}
if (ball.dx > 0) {
BotMovesPaddle(rightPaddle);
document.getElementById("rightPaddle").innerHTML = rightPaddle.y;
}
// move paddles by their velocity
leftPaddle.y += leftPaddle.dy;
rightPaddle.y += rightPaddle.dy;
// prevent paddles from going through walls
if (leftPaddle.y < grid) {
leftPaddle.y = grid;
}
else if (leftPaddle.y > maxPaddleY) {
leftPaddle.y = maxPaddleY;
}
if (rightPaddle.y < grid) {
rightPaddle.y = grid;
}
else if (rightPaddle.y > maxPaddleY) {
rightPaddle.y = maxPaddleY;
}
// draw paddles
context.fillStyle = 'white';
context.fillRect(leftPaddle.x, leftPaddle.y, leftPaddle.width, leftPaddle.height);
context.fillRect(rightPaddle.x, rightPaddle.y, rightPaddle.width, rightPaddle.height);
// move ball by its velocity
ball.x += ball.dx;
ball.y += ball.dy;
// prevent ball from going through walls by changing its velocity
if (ball.y < grid) {
ball.y = grid;
ball.dy *= -1;
}
else if (ball.y + grid > canvas.height - grid) {
ball.y = canvas.height - grid * 2;
ball.dy *= -1;
}
// reset ball if it goes past paddle (but only if we haven't already done so)
if ( (ball.x < 0 || ball.x > canvas.width) && !ball.resetting) {
ball.resetting = true;
if (ball.x < 0) {
rightScore++;
}
if (ball.x > canvas.width) {
leftScore++;
}
// give some time for the player to recover before launching the ball again
setTimeout(() => {
ball.resetting = false;
ball.x = canvas.width / 2;
ball.y = canvas.height / 2;
}, 400);
}
// check to see if ball collides with paddle. if they do change x velocity
if (collides(ball, leftPaddle)) {
ball.dx *= -1;
leftPaddle.dy = 0;
// move ball next to the paddle otherwise the collision will happen again
// in the next frame
ball.x = leftPaddle.x + leftPaddle.width;
}
else if (collides(ball, rightPaddle)) {
ball.dx *= -1;
rightPaddle.dy = 0;
// move ball next to the paddle otherwise the collision will happen again
// in the next frame
ball.x = rightPaddle.x - ball.width;
}
// draw score
context.font = "30px Arial";
context.fillText(leftScore, 200, 50);
context.fillText(rightScore, 560, 50);
// draw ball
context.fillRect(ball.x, ball.y, ball.width, ball.height);
// draw walls
context.fillStyle = "#f4dbd6";
context.fillRect(0, 0, canvas.width, grid);
context.fillRect(0, canvas.height - grid, canvas.width, canvas.height);
// draw dotted line down the middle
for (let i = grid; i < canvas.height - grid; i += grid * 2) {
context.fillRect(canvas.width / 2 - grid / 2, i, grid, grid);
}
}
// listen to keyboard events to move the paddles
document.addEventListener('keydown', function(e) {
// up arrow key
if (e.which === 38) {
rightPaddle.dy = -paddleSpeed;
}
// down arrow key
else if (e.which === 40) {
rightPaddle.dy = paddleSpeed;
}
// w key
if (e.which === 87) {
leftPaddle.dy = -paddleSpeed;
}
// a key
else if (e.which === 83) {
leftPaddle.dy = paddleSpeed;
}
});
// listen to keyboard events to stop the paddle if key is released
document.addEventListener('keyup', function(e) {
if (e.which === 38 || e.which === 40) {
rightPaddle.dy = 0;
}
if (e.which === 83 || e.which === 87) {
leftPaddle.dy = 0;
}
});
// start the game
requestAnimationFrame(loop);
-311
View File
@@ -1,311 +0,0 @@
class Box {
x: number;
y: number;
width: number;
height: number;
constructor(_x: number, _y: number, _width: number, _height: number) {
this.x = _x;
this.y = _y;
this.width = _width;
this.height = _height;
}
collides(other: Box) {
return this.x < other.x + other.width &&
this.x + this.width > other.x &&
this.y < other.y + other.height &&
this.y + this.height > other.y;
}
}
class Ball {
geometry: Box;
speed: number;
dx: number;
dy: number;
resetting: boolean;
constructor(_geometry: Box) {
// start in the middle of the game
this.geometry = _geometry;
this.speed = 5;
// ball velocity (start going to the top-right corner)
this.dx = this.speed;
this.dy = -this.speed;
// keep track of when need to reset the ball position
this.resetting = false;
}
}
class Paddle {
geometry: Box;
speed: number;
isBot: boolean;
isLeft: boolean;
score: number;
dy: number;
idleCounter: number;
constructor(_geometry: Box, _isLeft: boolean) {
this.geometry = _geometry;
this.isLeft = _isLeft;
this.speed = 6;
this.isBot = true;
this.score = 0;
this.dy = 0;
this.idleCounter = 0;
}
scored() {
this.score++;
}
}
class PongCore {
canvas: HTMLCanvasElement;
context: CanvasRenderingContext2D;
grid: number;
timeout: number;
width: number;
height: number;
gameover: boolean;
ball: Ball;
left: Paddle;
right: Paddle;
paddleHeight: number;
paddleHeightMax: number;
paddleSpeed: number;
constructor() {
this.canvas = document.getElementById('pong') as HTMLCanvasElement;
this.context = this.canvas.getContext('2d') as CanvasRenderingContext2D;
this.grid = 15; // size of grid squares
this.paddleHeight = this.grid * 5;
this.paddleHeightMax = this.canvas.height - this.grid - this.paddleHeight;
this.timeout = 4; // speed in ms
this.width = this.canvas.width;
this.height = this.canvas.height;
this.gameover = false;
this.paddleSpeed = 6;
this.ball = new Ball(new Box(this.width / 2, this.height / 2, this.grid, this.grid));
this.left = new Paddle(new Box(this.grid * 2, this.height / 2 - this.paddleHeight / 2, this.grid, this.paddleHeight), true);
this.right = new Paddle(new Box(this.width - this.grid * 3, this.height / 2 - this.paddleHeight / 2, this.grid, this.paddleHeight), false);
}
start() {
setInterval(this.loop, this.timeout);
}
reset() {
this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
let restartGame = document.getElementById("restart");
let gameOverText = document.getElementById("gameover");
restartGame.hidden = false;
gameOverText.hidden = false;
console.debug("[TRACE] Reset was triggered");
this.gameover = false;
this.left.score = 0;
this.right.score = 0;
this.draw();
}
// Game loop
loop() {
// Reset of needed
if (g_pong.gameover)
g_pong.reset();
g_pong.simulate();
g_pong.draw();
g_pong.updatePageText();
}
// Simulate game logic
simulate() {
if (this.ball.dx < 0) {
this.botInput(this.left);
this.botIdle(this.right);
} else {
this.botInput(this.right);
this.botIdle(this.left);
}
// move paddles by their velocity
this.left.geometry.y += this.left.dy;
this.right.geometry.y += this.right.dy;
// prevent paddles from going through walls
if (this.left.geometry.y < this.grid) {
this.left.geometry.y = this.grid;
}
else if (this.left.geometry.y > this.paddleHeightMax) {
this.left.geometry.y = this.paddleHeightMax;
}
if (this.right.geometry.y < this.grid) {
this.right.geometry.y = this.grid;
}
else if (this.right.geometry.y > this.paddleHeightMax) {
this.right.geometry.y = this.paddleHeightMax;
}
// move ball by its velocity
this.ball.geometry.x += this.ball.dx;
this.ball.geometry.y += this.ball.dy;
// prevent ball from going through walls by changing its velocity
if (this.ball.geometry.y < this.grid) {
this.ball.geometry.y = this.grid;
this.ball.dy *= -1;
}
else if (this.ball.geometry.y + this.grid > this.canvas.height - this.grid) {
this.ball.geometry.y = this.canvas.height - this.grid * 2;
this.ball.dy *= -1;
}
// reset ball if it goes past paddle (but only if we haven't already done so)
if ( (this.ball.geometry.x < 0 || this.ball.geometry.x > this.canvas.width) && !this.ball.resetting) {
this.ball.resetting = true;
if (this.ball.geometry.x < 0) {
this.right.scored();
}
if (this.ball.geometry.x > this.canvas.width) {
this.left.scored();
}
// give some time for the player to recover before launching the ball again
setTimeout(() => {
this.ball.resetting = false;
this.ball.geometry.x = this.canvas.width / 2;
this.ball.geometry.y = this.canvas.height / 2;
}, 400);
}
// check to see if ball collides with paddle. if they do change x velocity
if (this.left.geometry.collides(this.ball.geometry)) {
this.ball.dx *= -1;
this.left.dy = 0;
// move ball next to the paddle otherwise the collision will happen again
// in the next frame
this.ball.geometry.x = this.left.geometry.x + this.left.geometry.width;
}
else if (this.right.geometry.collides(this.ball.geometry)) {
this.ball.dx *= -1;
this.right.dy = 0;
// move ball next to the paddle otherwise the collision will happen again
// in the next frame
this.ball.geometry.x = this.right.geometry.x - this.ball.geometry.width;
}
}
// Draw game to canvas
draw() {
// Clear the screen
this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
// draw score
this.context.font = "30px Arial";
this.context.fillText(this.left.score.toString(), 200, 50);
this.context.fillText(this.right.score.toString(), 560, 50);
// draw paddles
this.context.fillStyle = 'white';
this.fillRect(this.left.geometry);
this.fillRect(this.right.geometry);
// draw ball
this.fillRect(this.ball.geometry);
// draw walls
this.context.fillStyle = "#f4dbd6";
this.fillRect(new Box(0, 0, this.canvas.width, this.grid));
this.fillRect(new Box(0, this.canvas.height - this.grid, this.canvas.width, this.canvas.height));
// draw dotted line down the middle
for (let i = this.grid; i < this.canvas.height - this.grid; i += this.grid * 2) {
this.fillRect(new Box(this.canvas.width / 2 - this.grid / 2, i, this.grid, this.grid));
}
}
fillRect(_box: Box) {
this.context.fillRect(_box.x, _box.y, _box.width, _box.height);
}
// Update text on page to match game
updatePageText() {
document.getElementById("leftPaddle").innerHTML = this.left.geometry.y.toString();
document.getElementById("rightPaddle").innerHTML = this.right.geometry.y.toString();
}
// Function for bot to play as a paddle
botInput(player: Paddle) {
if (!player.isBot)
return;
let ballRegion = Math.floor(this.ball.geometry.y / 15);
let paddleRegion = Math.floor(player.geometry.y / 15);
if (ballRegion < paddleRegion) player.dy = -player.speed;
if (ballRegion > paddleRegion) player.dy = player.speed;
if (ballRegion === paddleRegion) player.dy = 0;
}
// Randomly move the bot paddle when ball not towards it
botIdle(player: Paddle) {
player.idleCounter++;
if (player.idleCounter < 20)
return;
else
player.idleCounter = 0;
let direction: number = Math.floor(Math.random() * 3);
switch (direction) {
case 0:
player.dy = 0;
break;
case 1:
player.dy = -player.speed;
break;
case 2:
player.dy = player.speed;
break;
}
}
}
// listen to keyboard events to move the paddles
document.addEventListener('keydown', function(e) {
// up arrow key
if (e.which === 38) {
g_pong.right.dy = -g_pong.paddleSpeed;
}
// down arrow key
else if (e.which === 40) {
g_pong.right.dy = g_pong.paddleSpeed;
}
// w key
if (e.which === 87) {
g_pong.left.dy = -g_pong.paddleSpeed;
}
// a key
else if (e.which === 83) {
g_pong.left.dy = g_pong.paddleSpeed;
}
});
// listen to keyboard events to stop the paddle if key is released
document.addEventListener('keyup', function(e) {
if (e.which === 38 || e.which === 40) {
g_pong.right.dy = 0;
}
if (e.which === 83 || e.which === 87) {
g_pong.left.dy = 0;
}
});
const g_pong: PongCore = new PongCore();
g_pong.start();