Compare commits
25
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
20eac7c89e | ||
|
|
7ed54a7e51 | ||
|
|
e564a24ad4 | ||
|
|
335eaa0545 | ||
|
|
4b2720f8b7 | ||
|
|
aedd47ba36 | ||
|
|
e1f4021ed5 | ||
|
|
c806dfff6c | ||
|
|
000465079b | ||
|
|
97280e2d7c | ||
|
|
25edd56306 | ||
|
|
e776f09b0f | ||
|
|
c0dc079a71 | ||
|
|
0a5807e62e | ||
|
|
f60a1940ac | ||
|
|
7351e28bcd | ||
|
|
74afee8f5b | ||
|
|
5f417b433e | ||
|
|
39d6f469cb | ||
|
|
78f658241c | ||
|
|
4622e730c1 | ||
|
|
e6ba705862 | ||
|
|
cfd81884db | ||
|
|
8c75448836 | ||
|
|
f5afca83d2 |
No files matched your search
@@ -14,7 +14,7 @@ jobs:
|
||||
- name: Login to Docker Registry
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: g.codrs.ru
|
||||
registry: g.lair.moe
|
||||
username: ${{ vars.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
||||
@@ -26,8 +26,6 @@ jobs:
|
||||
with:
|
||||
context: .
|
||||
push: ${{ github.event_name == 'push' }}
|
||||
tags: |
|
||||
g.codrs.ru/${{ vars.DOCKER_USERNAME }}/codrs.ru:latest
|
||||
g.codrs.ru/${{ vars.DOCKER_USERNAME }}/codrs.ru:${{ github.sha }}
|
||||
tags: g.lair.moe/${{ vars.DOCKER_USERNAME }}/lair.moe:latest
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
+2
-2
@@ -5,5 +5,5 @@ __pycache__/
|
||||
*$py.class
|
||||
.python-version
|
||||
|
||||
static/style/*.css
|
||||
static/style/*.css.map
|
||||
*.css
|
||||
*.css.map
|
||||
+3
-3
@@ -2,8 +2,8 @@ FROM node:18-alpine as sass
|
||||
|
||||
RUN NODE_OPTIONS=--dns-result-order=ipv4first npm install -g sass
|
||||
WORKDIR /build
|
||||
COPY ./static/style ./style
|
||||
RUN sass ./style:./style \
|
||||
COPY ./blueprints ./blueprints
|
||||
RUN sass ./blueprints:./blueprints \
|
||||
--no-source-map \
|
||||
--style=compressed
|
||||
|
||||
@@ -13,7 +13,7 @@ FROM python:3.11-slim
|
||||
WORKDIR /app
|
||||
|
||||
COPY . .
|
||||
COPY --from=sass /build/style/ ./static/style/
|
||||
COPY --from=sass /build/blueprints/ ./blueprints/
|
||||
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
|
||||
@@ -1,78 +1,27 @@
|
||||
from os import system as console
|
||||
from configparser import ConfigParser
|
||||
from flask import (
|
||||
Flask,
|
||||
g,
|
||||
request,
|
||||
render_template,
|
||||
)
|
||||
from modules import locale
|
||||
|
||||
from blueprints.root import bp as root_bp
|
||||
from blueprints.risdeveau import bp as rdv_bp
|
||||
|
||||
import blueprints.root.modules.style
|
||||
import blueprints.risdeveau.modules.style
|
||||
|
||||
from flask import Flask
|
||||
|
||||
|
||||
translations_cache = {}
|
||||
app = Flask(__name__, static_folder=None, subdomain_matching=True)
|
||||
|
||||
def load_translations(lang):
|
||||
if lang not in translations_cache:
|
||||
translations_cache[lang] = {}
|
||||
app.before_request(locale.before_request)
|
||||
app.context_processor(locale.inject_translations)
|
||||
|
||||
try:
|
||||
config = ConfigParser()
|
||||
config.read(f'locale/{lang}.ini')
|
||||
for section in config.sections():
|
||||
translations_cache[lang][section] = dict(config.items(section))
|
||||
except:
|
||||
pass
|
||||
|
||||
return translations_cache[lang]
|
||||
|
||||
|
||||
def get_locale():
|
||||
return request.accept_languages.best_match(('en', 'ru', 'de', 'fr', 'ja'), 'en')
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
|
||||
@app.before_request
|
||||
def before_request():
|
||||
g.locale = get_locale()
|
||||
g.translations = load_translations(g.locale)
|
||||
|
||||
|
||||
@app.context_processor
|
||||
def inject_translations():
|
||||
def translate(text, **kwargs):
|
||||
if ":" in text:
|
||||
section, key = text.split(":", 1)
|
||||
else:
|
||||
section, key = "common", text
|
||||
|
||||
template = g.translations \
|
||||
.get(section, {}) \
|
||||
.get(key, f"${section}: {key}$")
|
||||
|
||||
try:
|
||||
return template.format(**kwargs)
|
||||
except:
|
||||
return template
|
||||
|
||||
return {'_': translate}
|
||||
app.register_blueprint(root_bp)
|
||||
app.register_blueprint(rdv_bp)
|
||||
|
||||
|
||||
if app.debug:
|
||||
console("sass static/style/main.scss static/style/main.css")
|
||||
console("sass static/style/risdeveau.scss static/style/risdeveau.css")
|
||||
blueprints.root.modules.style.compile_styles()
|
||||
blueprints.risdeveau.modules.style.compile_styles()
|
||||
|
||||
@app.route("/")
|
||||
def index():
|
||||
return render_template('index.html')
|
||||
|
||||
@app.route("/host")
|
||||
def host():
|
||||
return render_template('host.html')
|
||||
|
||||
@app.route("/us")
|
||||
def us():
|
||||
return render_template('us.html')
|
||||
|
||||
@app.route("/risdeveau")
|
||||
def risdeveau():
|
||||
return render_template('personal/risdeveau.html')
|
||||
app.config['SERVER_NAME'] = "localhost:5000"
|
||||
else:
|
||||
app.config['SERVER_NAME'] = "lair.moe"
|
||||
@@ -0,0 +1,39 @@
|
||||
import os
|
||||
from pathlib import Path
|
||||
from htmlmin import minify
|
||||
from flask import Blueprint, render_template, send_from_directory, send_file, abort
|
||||
|
||||
bp = Blueprint(
|
||||
"risdeveau",
|
||||
__name__,
|
||||
subdomain="risdeveau",
|
||||
template_folder="..",
|
||||
static_folder=None
|
||||
)
|
||||
|
||||
def render_tmpl(filename: str) -> str:
|
||||
template_path = os.path.join("risdeveau/templates", filename)
|
||||
return minify(
|
||||
render_template(template_path),
|
||||
remove_empty_space=True
|
||||
)
|
||||
|
||||
@bp.route("/static/<path:filename>")
|
||||
def static(filename: str):
|
||||
static_folders = ("static", "../root/static")
|
||||
for dir in static_folders:
|
||||
if os.path.exists(path := os.path.join("blueprints/risdeveau", dir, filename)):
|
||||
return send_file(path)
|
||||
return abort(404)
|
||||
|
||||
@bp.route("/")
|
||||
def index():
|
||||
return render_tmpl('index.html')
|
||||
|
||||
@bp.route("/contacts")
|
||||
def contacts():
|
||||
return render_tmpl('contacts.html')
|
||||
|
||||
@bp.route("/donate")
|
||||
def donate():
|
||||
return render_tmpl('donate.html')
|
||||
@@ -0,0 +1,9 @@
|
||||
from os import system as console
|
||||
from os.path import join
|
||||
|
||||
def compile_styles():
|
||||
dir = "blueprints/risdeveau/static/style"
|
||||
files = ("risdeveau",)
|
||||
|
||||
for file in files:
|
||||
console(f"sass {join(dir, file+'.scss')} {join(dir, file+'.css')}")
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,80 @@
|
||||
@use "sass:color";
|
||||
|
||||
// Palette: Catppuccin Mocha
|
||||
// https://catppuccin.com/palette/
|
||||
$base: #1e1e2e;
|
||||
$text: #cdd6f4;
|
||||
|
||||
$mantle: #181825;
|
||||
$crust: #11111b;
|
||||
|
||||
$overlay0: #6c7086;
|
||||
$overlay1: #7f849c;
|
||||
$overlay2: #9399b2;
|
||||
|
||||
$surface0: #313244;
|
||||
$surface1: #45475a;
|
||||
$surface2: #585b70;
|
||||
|
||||
$subtext0: #a6adc8;
|
||||
$subtext1: #bac2de;
|
||||
|
||||
$red: #f38ba8;
|
||||
$green: #a6e3a1;
|
||||
$peach: #fab387;
|
||||
$blue: #89b4fa;
|
||||
$mauve: #8839ef;
|
||||
|
||||
h3 {
|
||||
margin-block-end: 0;
|
||||
}
|
||||
|
||||
.qr {
|
||||
img { width: 100% }
|
||||
p { text-align: center; }
|
||||
|
||||
&.blocks {
|
||||
flex-wrap: nowrap;
|
||||
overflow-x: auto;
|
||||
width: calc(100vw - 1rem);
|
||||
max-width: 45rem;
|
||||
scroll: {
|
||||
behavior: smooth;
|
||||
snap-type: x mandatory;
|
||||
}
|
||||
|
||||
&::-webkit-scrollbar { display: none; }
|
||||
|
||||
&:hover .block.qr:not(:hover) {
|
||||
filter: blur(5px);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
}
|
||||
|
||||
&.block {
|
||||
flex: 0 0 calc(100vw - 2rem);
|
||||
scroll-snap-align: start;
|
||||
max-width: 13.666rem;
|
||||
}
|
||||
}
|
||||
|
||||
table, tbody {
|
||||
vertical-align: baseline;
|
||||
border-collapse: collapse;
|
||||
|
||||
tr {
|
||||
border-radius: 10px;
|
||||
|
||||
&:hover {
|
||||
background-color: color.change($surface1, $alpha:75%);
|
||||
}
|
||||
|
||||
th {
|
||||
text-align: unset;
|
||||
}
|
||||
|
||||
th + td, td + td {
|
||||
padding-left: 2rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Sweet Bread</title>
|
||||
|
||||
<link rel="stylesheet" href="/static/style/main.css">
|
||||
<link rel="stylesheet" href="/static/style/risdeveau.css">
|
||||
<link rel="icon" type="image/webp" href="/static/icon/us/risdeveau.webp" />
|
||||
<script
|
||||
src="https://track.lair.moe/api/script.js"
|
||||
data-site-id="1"
|
||||
defer
|
||||
></script>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
</head>
|
||||
<body>
|
||||
{% include 'risdeveau/templates/header.tmpl' %}
|
||||
|
||||
<main>
|
||||
{% block content %}{% endblock %}
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,50 @@
|
||||
{% extends 'risdeveau/templates/base.tmpl' %}
|
||||
|
||||
{% block content %}
|
||||
<h3>Development</h3>
|
||||
<div class="blocks badges">
|
||||
<a class="block" href="//g.lair.moe/Sweetbread">
|
||||
<img class="icon" src="/static/icon/service/gitea.webp" />
|
||||
Gitea
|
||||
</a>
|
||||
<a class="block" href="https://github.com/VerySweetBread">
|
||||
<img class="icon" src="https://github.githubassets.com/assets/GitHub-Mark-ea2971cee799.png" />
|
||||
GitHub
|
||||
</a>
|
||||
<a class="block" href="https://git.kolibrios.org/Sweetbread">
|
||||
<img class="icon" src="https://git.kolibrios.org/assets/img/logo.svg" />
|
||||
KolibriOS Git
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<h3>Contacts</h3>
|
||||
<div class="blocks badges">
|
||||
<a class="block" href="https://matrix.to/#/@risdeveau:codrs.ru">
|
||||
<img class="icon" src="https://matrix.org/assets/favicon.ico" />
|
||||
Matrix
|
||||
</a>
|
||||
<a class="block" href="//b.lair.moe/@risdeveau">
|
||||
<img class="icon" src="/static/icon/service/sharkey.webp" />
|
||||
Fediverse
|
||||
</a>
|
||||
<a class="block" href="https://discord.com/users/459823895256498186">
|
||||
<img class="icon" src="https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/66e3d80db9971f10a9757c99_Symbol.svg" />
|
||||
Discord
|
||||
</a>
|
||||
<a class="block" href="mailto:risdeveau@lair.moe">
|
||||
Mail
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<h3>Game accounts</h3>
|
||||
<div class="blocks badges">
|
||||
<a class="block" href="https://steamcommunity.com/id/risdeveau">
|
||||
<img class="icon" src="https://store.steampowered.com/favicon.ico" />
|
||||
Steam
|
||||
</a>
|
||||
<a class="block" href="https://gamebanana.com/members/3899828">
|
||||
<img class="icon" src="https://images.gamebanana.com/static/img/favicon/favicon.ico" />
|
||||
GameBanana
|
||||
</a>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,21 @@
|
||||
{% extends 'risdeveau/templates/base.tmpl' %}
|
||||
|
||||
{% block content %}
|
||||
<h3>Wallets</h3>
|
||||
<div class="blocks qr">
|
||||
<div class="block qr">
|
||||
<p>POL, BNB</p>
|
||||
<img src="/static/img/wallets/evm.webp">
|
||||
</div>
|
||||
|
||||
<div class="block qr">
|
||||
<p>TON</p>
|
||||
<img src="/static/img/wallets/ton.webp">
|
||||
</div>
|
||||
|
||||
<div class="block qr">
|
||||
<p>XMR</p>
|
||||
<img src="/static/img/wallets/xmr.webp">
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,20 @@
|
||||
<header>
|
||||
{%- if request.path != url_for('.index') %}
|
||||
<a href="{{ url_for('.index') }}">Main</a>
|
||||
{%- else %}
|
||||
<a href="{{ url_for('root.index') }}">Lair</a>
|
||||
{%- endif %}
|
||||
|
||||
<div class="header-links">
|
||||
{%- for (l, t) in (
|
||||
('.contacts', _('contacts')),
|
||||
('.donate', _('donate'))
|
||||
) %}
|
||||
{%- if url_for(l) == request.path %}
|
||||
<strong>{{ t }}</strong>
|
||||
{%- else %}
|
||||
<a href="{{ url_for(l) }}">{{ t }}</a>
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
</div>
|
||||
</header>
|
||||
@@ -0,0 +1,54 @@
|
||||
{% extends 'risdeveau/templates/base.tmpl' %}
|
||||
|
||||
{% block content %}
|
||||
<div class="block">
|
||||
<table>
|
||||
<tr>
|
||||
<th>DoB</th>
|
||||
<td>2005-01-13</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Languages</th>
|
||||
<td>
|
||||
<table>
|
||||
<tr>
|
||||
<td>Russian</td>
|
||||
<td>Native</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>English</td>
|
||||
<td>B2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>French</td>
|
||||
<td>A1?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>German</td>
|
||||
<td>A2?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Japanese</td>
|
||||
<td>Beginner</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Student</th>
|
||||
<td>
|
||||
<table>
|
||||
<tr>
|
||||
<td>Programmer</td>
|
||||
<td>2/4yr.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Translator</td>
|
||||
<td>2/3yr.</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,28 @@
|
||||
from htmlmin import minify
|
||||
from flask import Blueprint, render_template, request, jsonify
|
||||
|
||||
bp = Blueprint(
|
||||
"root",
|
||||
__name__,
|
||||
template_folder="templates",
|
||||
static_folder="static"
|
||||
)
|
||||
|
||||
def render_tmpl(filename: str) -> str:
|
||||
return minify(
|
||||
render_template(filename),
|
||||
remove_empty_space=True
|
||||
)
|
||||
|
||||
|
||||
@bp.route("/")
|
||||
def index():
|
||||
return render_tmpl('index.html')
|
||||
|
||||
@bp.route("/host")
|
||||
def host():
|
||||
return render_tmpl('host.html')
|
||||
|
||||
@bp.route("/us")
|
||||
def us():
|
||||
return render_tmpl('us.html')
|
||||
@@ -0,0 +1,9 @@
|
||||
from os import system as console
|
||||
from os.path import join
|
||||
|
||||
def compile_styles():
|
||||
dir = "blueprints/root/static/style"
|
||||
files = ("main",)
|
||||
|
||||
for file in files:
|
||||
console(f"sass {join(dir, file+'.scss')} {join(dir, file+'.css')}")
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Binary file not shown.
|
After Width: | Height: | Size: 3.5 KiB |
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -95,6 +95,10 @@ header {
|
||||
background-color: $mantle;
|
||||
padding: .5rem;
|
||||
font-size: larger;
|
||||
|
||||
.header-links * + * {
|
||||
padding-left: 1ch;
|
||||
}
|
||||
}
|
||||
|
||||
footer {
|
||||
@@ -1,17 +1,18 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Coders Squad</title>
|
||||
<title>Lair</title>
|
||||
|
||||
<link rel="stylesheet" href="/static/style/main.css">
|
||||
<link rel="icon" type="image/webp" href="/static/icon/codrs.webp" />
|
||||
<link rel="icon" type="image/webp" href="/static/icon/lair.webp" />
|
||||
<script src="/static/script/copy-mono.js"> </script>
|
||||
<script
|
||||
src="https://track.codrs.ru/api/script.js"
|
||||
src="https://track.lair.moe/api/script.js"
|
||||
data-site-id="1"
|
||||
defer
|
||||
></script>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="mock-email" content="admin@example.com">
|
||||
</head>
|
||||
<body>
|
||||
{% include 'header.tmpl' %}
|
||||
@@ -0,0 +1,5 @@
|
||||
<footer>
|
||||
<div>lair.moe 🄯 2025 - 2026</div>
|
||||
<div><a href="https://g.lair.moe/Sweetbread/lair.moe">{{ _('site source') }}</a></div>
|
||||
<div>{{ _('contact us') }}: <a href="mailto:admin@lair.moe">admin@lair.moe</a></div>
|
||||
</footer>
|
||||
@@ -1,14 +1,14 @@
|
||||
<header>
|
||||
{%- if request.path != url_for('index') %}
|
||||
<a href="{{ url_for('index') }}">Coders Squad</a>
|
||||
{%- if request.path != url_for('.index') %}
|
||||
<a href="{{ url_for('.index') }}">Lair</a>
|
||||
{%- else %}
|
||||
<div></div>
|
||||
{%- endif %}
|
||||
|
||||
<div class="header-links">
|
||||
{%- for (l, t) in (
|
||||
('us', _('about us')),
|
||||
('host', _('about host'))
|
||||
('.us', _('about us')),
|
||||
('.host', _('about host'))
|
||||
) %}
|
||||
{%- if url_for(l) == request.path %}
|
||||
<strong>{{ t }}</strong>
|
||||
@@ -11,11 +11,11 @@
|
||||
<div class="block">
|
||||
<strong>{{ _("host:specifications") }}</strong>:
|
||||
<ul>
|
||||
<li>CPU: Ryzen i9@3.4GHz (4 cores)</li>
|
||||
<li>RAM: 8 GiB</li>
|
||||
<li>CPU: Ryzen 9@3.4GHz (4 cores)</li>
|
||||
<li>RAM: 8 GB</li>
|
||||
<li>SSD: 150 GB</li>
|
||||
<li>ETH: 500Mb/s</li>
|
||||
<li>Loc: Deutchland, Frankfurt am Mein</li>
|
||||
<li>Loc: Deutschland, Frankfurt am Main</li>
|
||||
</ul>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -1,19 +1,19 @@
|
||||
{% extends 'base.tmpl' %}
|
||||
|
||||
{% block title %}
|
||||
<img src="/static/icon/codrs.webp" class="icon" />
|
||||
Coders Squad
|
||||
<img src="/static/icon/lair.webp" class="icon" />
|
||||
Lair
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<a href="https://b.codrs.ru" target="_blank" class="block">
|
||||
<a href="https://b.lair.moe" target="_blank" class="block">
|
||||
<div class="header">
|
||||
<img src="/static/icon/service/sharkey.webp" class="icon"/>
|
||||
<strong>Sharkey</strong>
|
||||
</div>
|
||||
<p>{{ _('index.descr:sharkey') }}</p>
|
||||
</a>
|
||||
<a href="https://g.codrs.ru" target="_blank" class="block">
|
||||
<a href="https://g.lair.moe" target="_blank" class="block">
|
||||
<div class="header">
|
||||
<img src="/static/icon/service/gitea.webp" class="icon"/>
|
||||
<strong>Gitea</strong>
|
||||
@@ -23,10 +23,16 @@
|
||||
|
||||
<div class="block">
|
||||
<p><a href="https://m.codrs.ru" target="_blank"><strong>Matrix</strong></a> — {{ _('index.descr:matrix') }}</p>
|
||||
<p><a href="https://c.codrs.ru" target="_blank"><strong>Copyparty</strong></a> — {{ _('index.descr:copyparty') }}</p>
|
||||
<p><a href="https://s.codrs.ru" target="_blank"><strong>4get</strong></a> — {{ _('index.descr:4get') }}</p>
|
||||
<p><a href="https://tools.codrs.ru" target="_blank"><strong>IT-tools</strong></a> — {{ _('index.descr:tools') }}</p>
|
||||
<p><a href="https://vert.codrs.ru" target="_blank"><strong>Vert</strong></a> — {{ _('index.descr:vert') }}</p>
|
||||
<p><a href="https://c.lair.moe" target="_blank"><strong>Copyparty</strong></a> — {{ _('index.descr:copyparty') }}</p>
|
||||
<p><a href="https://tools.lair.moe" target="_blank"><strong>IT-tools</strong></a> — {{ _('index.descr:tools') }}</p>
|
||||
<p><a href="https://vert.lair.moe" target="_blank"><strong>Vert</strong></a> — {{ _('index.descr:vert') }}</p>
|
||||
</div>
|
||||
|
||||
<div class="block">
|
||||
<strong>{{ _('index:altfronts') }}</strong>
|
||||
<p><a href="https://s.lair.moe" target="_blank"><strong>4get</strong></a> — {{ _('index.descr:4get') }}</p>
|
||||
<p><a href="https://tl.lair.moe" target="_blank"><strong>TransLite</strong></a> — {{ _('index.descr:tl') }}</p>
|
||||
<p><a href="https://lyr.lair.moe" target="_blank"><strong>Intellectual</strong></a> — {{ _('index.descr:lyr') }}</p>
|
||||
</div>
|
||||
|
||||
<div class="block">
|
||||
@@ -34,8 +40,8 @@
|
||||
<strong>DNS</strong>:
|
||||
<ul>
|
||||
<li><span class="mono">64.188.64.176</span></li>
|
||||
<li>DoT: <span class="mono">codrs.ru:853</span></li>
|
||||
<li>DoH: <span class="mono">dns.codrs.ru</span></li>
|
||||
<li>DoT: <span class="mono">lair.moe:853</span></li>
|
||||
<li>DoH: <span class="mono">dns.lair.moe</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
<p>
|
||||
@@ -43,14 +49,4 @@
|
||||
<span class="mono">200:ee1:bad2:1732:4b91:c3e3:2f08:29b3</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="block">
|
||||
{{
|
||||
_('index:bottom_text',
|
||||
glitchtip='<a href="https://bug.codrs.ru" target="_blank"><strong>GlitchTip</strong></a>',
|
||||
baikal='<a href="https://dav.codrs.ru" target="_blank"><strong>Baikal</strong></a>',
|
||||
freshrss='<a href="https://rss.codrs.ru" target="_blank"><strong>FreshRSS</strong></a>',
|
||||
) | safe
|
||||
}}
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -3,7 +3,7 @@
|
||||
{% block title %}О нас{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<a href="{{ url_for('risdeveau') }}" class="block green">
|
||||
<a href="{{ url_for('risdeveau.index') }}" class="block green">
|
||||
<div class="header">
|
||||
<img src="/static/icon/us/risdeveau.webp" class="icon"/>
|
||||
Sweetbread
|
||||
+3
-1
@@ -7,7 +7,7 @@ about host = Über Server
|
||||
|
||||
|
||||
[index]
|
||||
bottom_text = Außerdem bieten wir {glitchtip}, {baikal} und {freshrss} für Mitglieder unserer Gruppe an!
|
||||
altfronts = Altfronts
|
||||
|
||||
[index.descr]
|
||||
sharkey = Föderierter Microblogging-Dienst auf Basis des ActivityPub-Protokolls
|
||||
@@ -17,6 +17,8 @@ copyparty = Cloud-Dateispeicher
|
||||
4get = Proxy-Suchmaschine
|
||||
tools = Satz verschiedener Werkzeuge
|
||||
vert = Dateiumwandler
|
||||
tl = Altfront für beliebte Suchmaschinen
|
||||
lyr = Altfront für Genius
|
||||
|
||||
|
||||
[host]
|
||||
|
||||
+6
-1
@@ -5,9 +5,12 @@ contact us = Contact us
|
||||
about us = About us
|
||||
about host = About host
|
||||
|
||||
contacts = Contacts
|
||||
donate = Donate
|
||||
|
||||
|
||||
[index]
|
||||
bottom_text = We also have {glitchtip}, {baikal} and {freshrss} for members of our squad!
|
||||
altfronts = Altfronts
|
||||
|
||||
[index.descr]
|
||||
sharkey = ActivityPub-based federated microblogging service
|
||||
@@ -17,6 +20,8 @@ copyparty = cloud file storage
|
||||
4get = proxy search engine
|
||||
tools = set of various tools
|
||||
vert = file converter
|
||||
tl = altfront for popular search engines
|
||||
lyr = altfront for Genius
|
||||
|
||||
|
||||
[host]
|
||||
|
||||
+3
-1
@@ -7,7 +7,7 @@ about host = À propos de serveur
|
||||
|
||||
|
||||
[index]
|
||||
bottom_text = On a aussi {glitchtip}, {baikal} et {freshrss} pour les membres du groupe !
|
||||
altfronts = Altfronts
|
||||
|
||||
[index.descr]
|
||||
sharkey = Service de microblogging fédéré avec ActivityPub
|
||||
@@ -17,6 +17,8 @@ copyparty = Stockage de fichiers en cloud
|
||||
4get = Moteur de recherche proxy
|
||||
tools = ensemble d'outils variés
|
||||
vert = convertisseur de fichiers
|
||||
tl = altfront pour les moteurs de recherche populaires
|
||||
lyr = altfront pour Genius
|
||||
|
||||
|
||||
[host]
|
||||
|
||||
+3
-1
@@ -7,7 +7,7 @@ about host = サーバーについて
|
||||
|
||||
|
||||
[index]
|
||||
bottom_text = メンバーには {glitchtip}、{baikal}、{freshrss} も使えるよ!
|
||||
altfronts = 代替フロントエンド
|
||||
|
||||
[index.descr]
|
||||
sharkey = ActivityPubを使った連合型マイクロブログ
|
||||
@@ -17,6 +17,8 @@ copyparty = クラウドファイルストレージ
|
||||
4get = プロキシ検索エンジン
|
||||
tools = 様々なツールのセット
|
||||
vert = ファイル変換ツール
|
||||
tl = 人気検索エンジン向けの代替フロントエンド
|
||||
lyr = Genius向けの代替フロントエンド
|
||||
|
||||
|
||||
[host]
|
||||
|
||||
+6
-1
@@ -5,9 +5,12 @@ contact us = Для связи
|
||||
about us = О нас
|
||||
about host = О хосте
|
||||
|
||||
contacts = Контакты
|
||||
donate = Донат
|
||||
|
||||
|
||||
[index]
|
||||
bottom_text = Ещё у нас есть {glitchtip}, {baikal} и {freshrss} для участников нашей группы!
|
||||
altfronts = Альтфронты
|
||||
|
||||
[index.descr]
|
||||
sharkey = Федеративная микроблогинговая система поверх протокола ActivityPub
|
||||
@@ -17,6 +20,8 @@ copyparty = облачное хранилище файлов
|
||||
4get = прокси-поисковик
|
||||
tools = набор разнообразных утилит
|
||||
vert = конвертация файлов
|
||||
tl = альтфронт для популярных поисковиков
|
||||
lyr = альтфронт для Genius
|
||||
|
||||
|
||||
[host]
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
from configparser import ConfigParser
|
||||
from flask import g, request
|
||||
|
||||
|
||||
translations_cache = {}
|
||||
|
||||
|
||||
def load_translations(lang):
|
||||
if lang not in translations_cache:
|
||||
translations_cache[lang] = {}
|
||||
|
||||
try:
|
||||
config = ConfigParser()
|
||||
config.read(f'locale/{lang}.ini')
|
||||
for section in config.sections():
|
||||
translations_cache[lang][section] = dict(config.items(section))
|
||||
except:
|
||||
pass
|
||||
|
||||
return translations_cache[lang]
|
||||
|
||||
def get_locale():
|
||||
return request.accept_languages.best_match(
|
||||
('en', 'ru', 'de', 'fr', 'ja'),
|
||||
) or 'en'
|
||||
|
||||
def before_request():
|
||||
g.locale = get_locale()
|
||||
g.translations = load_translations(g.locale)
|
||||
|
||||
def inject_translations():
|
||||
def translate(text, **kwargs):
|
||||
if ":" in text:
|
||||
section, key = text.split(":", 1)
|
||||
else:
|
||||
section, key = "common", text
|
||||
|
||||
template = g.translations \
|
||||
.get(section, {}) \
|
||||
.get(key, f"${section}: {key}$")
|
||||
|
||||
try:
|
||||
return template.format(**kwargs)
|
||||
except:
|
||||
return template
|
||||
|
||||
return {'_': translate}
|
||||
@@ -1,2 +1,3 @@
|
||||
Flask==3.1.1
|
||||
gunicorn
|
||||
htmlmin2
|
||||
@@ -3,17 +3,16 @@ let
|
||||
pypkgs = pkgs.python3Packages;
|
||||
in
|
||||
pkgs.mkShell {
|
||||
name = "codrs.ru";
|
||||
name = "lair.moe";
|
||||
|
||||
buildInputs = with pypkgs; [
|
||||
python
|
||||
virtualenv
|
||||
# pkgs.nodejs
|
||||
pkgs.nodePackages.sass
|
||||
];
|
||||
|
||||
shellHook = ''
|
||||
if [ ! -d "venv" ]; then
|
||||
if [ ! -d ".venv" ]; then
|
||||
python -m venv .venv
|
||||
fi
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 5.0 KiB |
@@ -1,33 +0,0 @@
|
||||
h3 {
|
||||
margin-block-end: 0;
|
||||
}
|
||||
|
||||
.qr {
|
||||
img { width: 100% }
|
||||
p { text-align: center; }
|
||||
|
||||
&.blocks {
|
||||
flex-wrap: nowrap;
|
||||
overflow-x: auto;
|
||||
width: calc(100vw - 1rem);
|
||||
max-width: 45rem;
|
||||
scroll: {
|
||||
behavior: smooth;
|
||||
snap-type: x mandatory;
|
||||
}
|
||||
|
||||
&::-webkit-scrollbar { display: none; }
|
||||
|
||||
&:hover .block.qr:not(:hover) {
|
||||
filter: blur(5px);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
}
|
||||
|
||||
&.block {
|
||||
flex: 0 0 calc(100vw - 2rem);
|
||||
scroll-snap-align: start;
|
||||
max-width: 13.666rem;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
<footer>
|
||||
<div>codrs.ru © 2025</div>
|
||||
<div><a href="https://g.codrs.ru/Sweetbread/codrs.ru">{{ _('site source') }}</a></div>
|
||||
<div>{{ _('contact us') }}: <a href="mailto:admin@codrs.ru">admin@codrs.ru</a></div>
|
||||
</footer>
|
||||
@@ -1,88 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Sweet Bread</title>
|
||||
|
||||
<link rel="stylesheet" href="/static/style/main.css">
|
||||
<link rel="stylesheet" href="/static/style/risdeveau.css">
|
||||
<link rel="icon" type="image/webp" href="/static/icon/us/risdeveau.webp" />
|
||||
<script
|
||||
src="https://track.codrs.ru/api/script.js"
|
||||
data-site-id="1"
|
||||
defer
|
||||
></script>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<a href="{{ url_for('index') }}">Coders Squad</a>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<h3>Development</h3>
|
||||
<div class="blocks badges">
|
||||
<a class="block" href="//g.codrs.ru/Sweetbread">
|
||||
<img class="icon" src="/static/icon/service/gitea.webp" />
|
||||
Gitea
|
||||
</a>
|
||||
<a class="block" href="https://github.com/VerySweetBread">
|
||||
<img class="icon" src="https://github.githubassets.com/assets/GitHub-Mark-ea2971cee799.png" />
|
||||
GitHub
|
||||
</a>
|
||||
<a class="block" href="https://git.kolibrios.org/Sweetbread">
|
||||
<img class="icon" src="https://git.kolibrios.org/assets/img/logo.svg" />
|
||||
KolibriOS Git
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<h3>Contacts</h3>
|
||||
<div class="blocks badges">
|
||||
<a class="block" href="https://matrix.to/#/@risdeveau:codrs.ru">
|
||||
<img class="icon" src="https://matrix.org/assets/favicon.ico" />
|
||||
Matrix
|
||||
</a>
|
||||
<a class="block" href="//b.codrs.ru/@risdeveau">
|
||||
<img class="icon" src="/static/icon/service/sharkey.webp" />
|
||||
Fediverse
|
||||
</a>
|
||||
<a class="block" href="https://discord.com/users/459823895256498186">
|
||||
<img class="icon" src="https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/66e3d80db9971f10a9757c99_Symbol.svg" />
|
||||
Discord
|
||||
</a>
|
||||
<a class="block" href="mailto:risdeveau@codrs.ru">
|
||||
Mail
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<h3>Game accounts</h3>
|
||||
<div class="blocks badges">
|
||||
<a class="block" href="https://steamcommunity.com/id/risdeveau">
|
||||
<img class="icon" src="https://store.steampowered.com/favicon.ico" />
|
||||
Steam
|
||||
</a>
|
||||
<a class="block" href="https://gamebanana.com/members/3899828">
|
||||
<img class="icon" src="https://images.gamebanana.com/static/img/favicon/favicon.ico" />
|
||||
GameBanana
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<h3>Wallets</h3>
|
||||
<div class="blocks qr">
|
||||
<div class="block qr">
|
||||
<p>POL, BNB</p>
|
||||
<img src="/static/img/risdeveau/wallets/evm.webp">
|
||||
</div>
|
||||
|
||||
<div class="block qr">
|
||||
<p>TON</p>
|
||||
<img src="/static/img/risdeveau/wallets/ton.webp">
|
||||
</div>
|
||||
|
||||
<div class="block qr">
|
||||
<p>XMR</p>
|
||||
<img src="/static/img/risdeveau/wallets/xmr.webp">
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
Reference in new issue
Block a user