1
Fork 0
mirror of https://github.com/RYGhub/royalnet.git synced 2024-11-23 19:44:20 +00:00

Update requirements

This commit is contained in:
Steffo 2019-11-05 11:25:56 +01:00
parent 0bd35a6afb
commit 4b5fde06cb
42 changed files with 6 additions and 4040 deletions

View file

@ -5,7 +5,7 @@ bcrypt==3.1.7
certifi==2019.9.11
cffi==1.13.01
chardet==3.0.4
Click==7.0
click==7.0
cryptography==2.8
dateparser==0.7.2
dice==2.4.2
@ -13,14 +13,11 @@ dnspython==1.15.0
dnspython3==1.15.0
entrypoints==0.3
ffmpeg-python==0.2.0
Flask==1.1.1
future==0.18.1
idna==2.8
itsdangerous==1.1.0
Jinja2==2.10.3
keyring==19.2.0
markdown2==2.3.8
MarkupSafe==1.1.1
markupsafe==1.1.1
mcstatus==2.2.1
multidict==4.5.2
psycopg2-binary==2.8.3
@ -34,12 +31,13 @@ royalherald==5.1b2
sentry-sdk==0.13.0
six==1.12.0
sortedcontainers==2.1.0
SQLAlchemy==1.3.10
sqlalchemy==1.3.10
tornado==6.0.3
tzlocal==2.0.0
urllib3==1.25.6
websockets==8.0.2
Werkzeug==0.16.0
yarl==1.3.0
youtube-dl==2019.10.16
riotwatcher==2.7.1
# discord.py is missing as we currently use the git version and we ignore the websockets<7.0 requirement
starlette==0.12.13

View file

@ -1,4 +0,0 @@
from .flaskserver import create_app
from .royalprint import Royalprint
__all__ = ["create_app", "Royalprint"]

View file

@ -1,54 +0,0 @@
import typing
import flask as f
import os
from sqlalchemy.orm import scoped_session
from ..database import Alchemy
from .royalprint import Royalprint
def create_app(config_obj: typing.Type, blueprints: typing.List[Royalprint]):
"""Create a :py:class:`flask.Flask` application object.
Gets the ``app.secret_key`` from the ``SECRET_KEY`` envvar.
Also requires a ``DB_PATH`` key in ``config_obj`` to initialize the database connection.
Warning:
The code for this class was written at 1 AM, and I have no clue of how and why it works or even if it really does work.
Use with caution?
Args:
config_obj: The object to be passed to :py:meth:`flask.Flask.config.from_object`.
blueprints: A list of blueprints to be registered to the application.
Returns:
The created :py:class:`flask.Flask`."""
app = f.Flask(__name__)
app.config.from_object(config_obj)
app.secret_key = os.environ["SECRET_KEY"]
# Load blueprints
required_tables = set()
for blueprint in blueprints:
required_tables = required_tables.union(blueprint.required_tables)
app.register_blueprint(blueprint)
# Init Alchemy
# Seems like a dirty hack to me, but experiments are fun, right?
# WARNING BLACK SORCERY BELOW EDIT AT YOUR OWN RISK
if len(required_tables) > 0:
alchemy = Alchemy(app.config["DB_PATH"], required_tables)
app.config["ALCHEMY"] = alchemy
app.config["ALCHEMY_SESSION"] = scoped_session(alchemy.Session)
else:
app.config["ALCHEMY"] = None
app.config["ALCHEMY_SESSION"] = None
@app.teardown_request
def teardown_alchemy_session(*_, **__):
alchemy_session = app.config["ALCHEMY_SESSION"]
if alchemy_session is not None:
alchemy_session.remove()
# END OF BLACK SORCERY
return app

View file

@ -1,18 +0,0 @@
import typing
import flask as f
class Royalprint(f.Blueprint):
"""An edited :py:class:`flask.Blueprint` containing an additional ``required_tables`` parameter."""
def __init__(self, name, import_name, static_folder=None,
static_url_path=None, template_folder=None,
url_prefix=None, subdomain=None, url_defaults=None,
root_path=None, required_tables: typing.Optional[set] = None):
super().__init__(name, import_name, static_folder=static_folder,
static_url_path=static_url_path, template_folder=template_folder,
url_prefix=url_prefix, subdomain=subdomain, url_defaults=url_defaults,
root_path=root_path)
self.required_tables = required_tables
if self.required_tables is None:
self.required_tables = set()

View file

@ -1,26 +0,0 @@
"""Some Royalprints that can be used with the Royalnet Flask server."""
from . import home
from . import wikiview
from . import tglogin
from . import docs
from . import wikiedit
from . import mcstatus
from . import diarioview
from . import profile
from . import login
from . import newaccount
rp_home = home.rp
rp_wikiview = wikiview.rp
rp_tglogin = tglogin.rp
rp_docs = docs.rp
rp_wikiedit = wikiedit.rp
rp_mcstatus = mcstatus.rp
rp_diarioview = diarioview.rp
rp_profile = profile.rp
rp_login = login.rp
rp_newaccount = newaccount.rp
__all__ = ["rp_home", "rp_wikiview", "rp_tglogin", "rp_docs", "rp_wikiedit", "rp_mcstatus", "rp_diarioview",
"rp_profile", "rp_login", "rp_newaccount"]

View file

@ -1,25 +0,0 @@
"""A User Games Diario viewer :py:class:`royalnet.web.Royalprint`."""
import flask as f
import os
from ...royalprint import Royalprint
from ...shortcuts import error
from royalnet.packs.common.tables import User
from royalnet.packs.royal.tables import Diario
tmpl_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates')
rp = Royalprint("diarioview", __name__, url_prefix="/diario", template_folder=tmpl_dir,
required_tables={User, Diario})
@rp.route("/", defaults={"page": 1})
@rp.route("/<int:page>")
def diarioview_page(page):
alchemy, alchemy_session = f.current_app.config["ALCHEMY"], f.current_app.config["ALCHEMY_SESSION"]
if page < 1:
return error(404, "Il numero di pagina deve essere maggiore di 0.")
entries = alchemy_session.query(alchemy.Diario).order_by(alchemy.Diario.diario_id.desc()).offset((page - 1) * 1000).limit(1000).all()
if len(entries) == 0:
return error(404, "Non ci sono righe di diario in questa pagina (e in tutte le successive).")
return f.render_template("diarioview_page.html", page=page, entries=entries)

View file

@ -1,46 +0,0 @@
{% extends "base.html" %}
{% block title %}
Diario: Pagina {{ page }}
{% endblock %}
{% block content %}
<div class="diarioview">
{% if page > 1 %}
<a class="previous-page" href="{{ url_for("diarioview.diarioview_page", page=(page - 1)) }}">Pagina precedente</a>
{% endif %}
{% for entry in entries %}
<blockquote id="diario-{{ entry.diario_id }}" class="diario{% if entry.spoiler %} diario-spoiler{% endif %}">
<div class="diario-content">
{% if entry.media_url %}
<a href="{{ entry.media_url }}" class="no-icon diario-img"><img src="{{ entry.media_url }}" alt="Caricamento immagine fallito"></a>
{% endif %}
{% if entry.text %}
"<span class="diario-text">{{ entry.text }}</span>"
{% endif %}
</div>
{% if entry.quoted %}
<div class="diario-quote">
{% if entry.quoted_account %}
<a href="{{ url_for("profile.profile_page", username=entry.quoted_account.username) }}" class="diario-quoted">{{ entry.quoted }}</a>
{% else %}
<span class="diario-quoted">{{ entry.quoted }}</span>
{% endif %}
{% if entry.context %}
, <span class="diario-context">{{ entry.context }}</span>
{% endif %}
</div>
{% endif %}
{% if entry.creator %}
<div class="diario-created">Salvato da <a href="{{ url_for("profile.profile_page", username=entry.creator.username) }}" class="diario-creator">{{ entry.creator.username }}</a></div>
{% endif %}
<time class="diario-timestamp" datetime="{{ entry.timestamp.isoformat() }}">{{ entry.timestamp.strftime("%d %b %Y %H:%M:%S") }}</time>
<span class="diario-id">#{{ entry.diario_id }}</span>
</blockquote>
{% endfor %}
{% if entries|length == 1000 %}
<a class="next-page" href="{{ url_for("diarioview.diarioview_page", page=(page + 1)) }}">Pagina successiva</a>
{% endif %}
</div>
{% endblock %}

View file

@ -1,11 +0,0 @@
"""Quick docs link :py:class:`royalnet.web.Royalprint`."""
import flask as f
from ...royalprint import Royalprint
rp = Royalprint("docs", __name__, url_prefix="/docs")
@rp.route("/")
def home_index():
return f.redirect("https://royal-games.github.io/royalnet/html/index.html")

View file

@ -1,13 +0,0 @@
"""Homepage :py:class:`royalnet.web.Royalprint` of the User Games website."""
import flask as f
import os
from ...royalprint import Royalprint
tmpl_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates')
rp = Royalprint("home", __name__, template_folder="templates")
@rp.route("/")
def home_index():
return f.render_template("home.html")

View file

@ -1,24 +0,0 @@
{% extends "base.html" %}
{% block title %}
Home
{% endblock %}
{% block content %}
<div class="dbox">
<div class="dbox-top">
<span class="left">Benvenuto!</span>
</div>
<div class="dbox-bot">
<p>
Benvenuto al sito web della <b>Royal Games</b>!
</p>
<p>
Siamo una piccola community amichevole principalmente dedicata al PC gaming.
</p>
<p>
Vienici a trovare su <a href="https://discord.gg/UpuU9Y4">Discord</a> o <a href="https://steamcommunity.com/groups/royalgamescastle">Steam</a>!
</p>
</div>
</div>
{% endblock %}

View file

@ -1,42 +0,0 @@
"""A Royalnet password-based login :py:class:`royalnet.web.Royalprint`."""
import flask as f
import os
import datetime
import bcrypt
from ...royalprint import Royalprint
from ...shortcuts import error
from royalnet.packs.common.tables import User
tmpl_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates')
rp = Royalprint("login", __name__, url_prefix="/login/password", required_tables={User},
template_folder=tmpl_dir)
@rp.route("/")
def login_index():
f.session.pop("royal", None)
return f.render_template("login_index.html")
@rp.route("/done", methods=["POST"])
def login_done():
alchemy, alchemy_session = f.current_app.config["ALCHEMY"], f.current_app.config["ALCHEMY_SESSION"]
fd = f.request.form
if "username" not in fd:
return error(400, "Nessun username inserito.")
royal_user = alchemy_session.query(alchemy.User).filter_by(username=fd["username"]).one_or_none()
if royal_user is None:
return error(404, "L'username inserito non corrisponde a nessun account registrato.")
if "password" not in fd:
return error(400, "Nessuna password inserita.")
if not bcrypt.checkpw(bytes(fd["password"], encoding="utf8"), royal_user.password):
return error(400, "La password inserita non è valida.")
f.session["royal"] = {
"uid": royal_user.uid,
"username": royal_user.username,
"avatar": royal_user.avatar,
"role": royal_user.role
}
f.session["login_date"] = datetime.datetime.now()
return f.render_template("login_success.html")

View file

@ -1,48 +0,0 @@
{% extends "base.html" %}
{% block title %}
Password Login
{% endblock %}
{% block content %}
<div class="login">
<div class="dbox">
<div class="dbox-top">
<span class="left">
Password Login
</span>
</div>
<div class="dbox-bot">
<form action="{{ url_for("login.login_done") }}" method="post" class="login-form full">
<label for="login-username">
<span class="label-text">Username</span>
<input id="login-username" type="text" name="username">
</label>
<label for="login-password">
<span class="label-text">Password</span>
<input id="login-password" type="password" name="password">
</label>
<label for="login-submit">
<input id="login-submit" type="submit" value="Login">
</label>
</form>
<div class="tiny">
<p>
Facendo il login su questo sito, acconsenti a ricevere due <abbr title="cookie">biscottini</abbr> che memorizzino l'account con cui hai fatto il login.<br>
</p>
<p>
Essi avranno il seguente formato:
</p>
<pre><code>session["royal"] = {
"uid": [il tuo id Royalnet]
"username": [il tuo username Royalnet],
"avatar": [il tuo avatar Royalnet],
"role": [il tuo ruolo Royalnet]
}
session["login_date"] = [la data e l'ora di adesso]</code></pre>
</div>
</div>
</div>
</div>
{% endblock %}

View file

@ -1,18 +0,0 @@
{% extends "base.html" %}
{% block title %}
Password Login riuscito
{% endblock %}
{% block content %}
<div class="dbox">
<div class="dbox-top">
<span class="left">
Password Login
</span>
</div>
<div class="dbox-bot">
Login riuscito! Sei connesso come <b>{{ session["royal"]["username"] }}</b>!
</div>
</div>
{% endblock %}

View file

@ -1,30 +0,0 @@
"""Minecraft server status :py:class:`royalnet.web.Royalprint`."""
import os
import flask as f
import socket
from ...royalprint import Royalprint
from ...shortcuts import error
from mcstatus import MinecraftServer
tmpl_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates')
rp = Royalprint("mcstatus", __name__, url_prefix="/mcstatus", template_folder=tmpl_dir)
@rp.route("/<server_str>")
def mcstatus_index(server_str: str):
try:
if ":" not in server_str:
server_str += ":25565"
server = MinecraftServer.lookup(server_str)
status = server.status()
try:
query = server.query()
except (socket.timeout, ConnectionRefusedError, OSError):
query = None
except socket.gaierror:
return error(400, "L'indirizzo richiesto non è valido.")
except (socket.timeout, ConnectionRefusedError, OSError):
status = None
query = None
return f.render_template("mcstatus.html", server_str=server_str, status=status, query=query)

View file

@ -1,54 +0,0 @@
{% extends "base.html" %}
{% block title %}
Minecraft {{ server_str }}
{% endblock %}
{% block content %}
<div class="dbox">
<div class="dbox-top">
<span class="left">Minecraft Server Status</span>
</div>
<div class="dbox-bot">
<div class="mcstatus-grid">
{% if query %}
{% if status.favicon %}
<div class="mcstatus-icon"><img class="mcstatus-icon-img" src="{{ status.favicon }}" alt="Server icon"></div>
{% else %}
<div class="mcstatus-icon"><div class="mcstatus-icon-img" title="Server icon"></div></div>
{% endif %}
<div class="mcstatus-address"><span class="server-up">{{ server_str }}</span></div>
<div class="mcstatus-description"><span>{{ query.motd }}</span></div>
<div class="mcstatus-players"><span>{{ query.players.online }}</span>/<span>{{ query.players.max }}</span></div>
<div class="mcstatus-version"><span>{{ query.software.brand }}</span> <span>{{ query.software.version }}</span> (<span>{{ status.version.protocol }}</span>)</div>
{% elif status %}
{% if status.favicon %}
<div class="mcstatus-icon"><img class="mcstatus-icon-img" src="{{ status.favicon }}" alt="Server icon"></div>
{% else %}
<div class="mcstatus-icon"><div class="mcstatus-icon-img" title="Server icon"></div></div>
{% endif %}
<div class="mcstatus-address"><span class="server-up">{{ server_str }}</span></div>
<div class="mcstatus-description"><span>{{ status.description }}</span></div>
<div class="mcstatus-players"><span>{{ status.players.online }}</span>/<span>{{ status.players.max }}</span></div>
<div class="mcstatus-version"><span>{{ status.version.name }}</span> (<span>{{ status.version.protocol }}</span>)</div>
{% else %}
<div class="mcstatus-icon"><div class="mcstatus-icon-img" title="Server icon"></div></div>
<div class="mcstatus-address"><span class="server-down">{{ server_str }}</span></div>
<div class="mcstatus-description"><span>-</span></div>
<div class="mcstatus-players"><span>0</span>/<span>0</span></div>
<div class="mcstatus-version"><span>Offline</span> (<span>-</span>)</div>
{% endif %}
</div>
{% if query %}
<div class="mcstatus-playerlist">
<h3>Giocatori connessi:</h3>
<ul>
{% for player in query.players.names %}
<li>{{ player }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
</div>
</div>
{% endblock %}

View file

@ -1,40 +0,0 @@
"""A :py:class:`royalnet.web.Royalprint` to create new Royals."""
import flask as f
import os
import bcrypt
from ...royalprint import Royalprint
from ...shortcuts import error
from royalnet.packs.common.tables import User
from royalnet.packs.royal.tables import Alias
tmpl_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates')
rp = Royalprint("newaccount", __name__, url_prefix="/newaccount", required_tables={User, Alias},
template_folder=tmpl_dir)
@rp.route("/", methods=["GET", "POST"])
def login_index():
if f.request.method == "GET":
return f.render_template("newaccount_index.html")
elif f.request.method == "POST":
alchemy, alchemy_session = f.current_app.config["ALCHEMY"], f.current_app.config["ALCHEMY_SESSION"]
fd = f.request.form
if "username" not in fd:
return error(400, "Non è stato inserito nessun username.")
if "password" not in fd:
return error(400, "Non è stata inserita nessuna password.")
royal = alchemy_session.query(alchemy.User).filter_by(username=fd["username"]).one_or_none()
if royal is not None:
return error(403, "Esiste già un utente con quell'username.")
alias = alchemy_session.query(alchemy.Alias).filter_by(alias=fd["username"]).one_or_none()
if alias is not None:
return error(403, "Esiste già un utente con quell'alias.")
royal = alchemy.Royal(username=fd["username"],
password=bcrypt.hashpw(bytes(fd["password"], encoding="utf8"), bcrypt.gensalt()),
role="Guest")
alchemy_session.add(royal)
alias = alchemy.Alias(royal=royal, alias=royal.username.lower())
alchemy_session.add(alias)
alchemy_session.commit()
return f.redirect(f.url_for("login.login_index"))

View file

@ -1,36 +0,0 @@
{% extends "base.html" %}
{% block title %}
Nuovo account
{% endblock %}
{% block content %}
<div class="login">
<div class="dbox">
<div class="dbox-top">
<span class="left">
Nuovo account
</span>
</div>
<div class="dbox-bot">
<form method="post" class="newaccount-form full">
<label for="newaccount-username">
<span class="label-text">Username</span>
<input id="newaccount-username" type="text" name="username">
</label>
<label for="newaccount-password">
<span class="label-text">Password</span>
<input id="newaccount-password" type="password" name="password">
</label>
<label for="newaccount-role">
<span class="label-text">Ruolo</span>
<input id="newaccount-role" type="text" name="role" disabled value="Guest">
</label>
<label for="newaccount-submit">
<input id="newaccount-submit" type="submit" value="Login">
</label>
</form>
</div>
</div>
</div>
{% endblock %}

View file

@ -1,60 +0,0 @@
"""The profile page :py:class:`royalnet.web.Royalprint` for Royalnet members."""
import flask as f
import os
from ...royalprint import Royalprint
from ...shortcuts import error
from ....utils.wikirender import prepare_page_markdown, RenderError
from royalnet.packs.royal.tables import *
# Maybe some of these tables are optional...
tmpl_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates')
rp = Royalprint("profile", __name__, url_prefix="/profile", template_folder=tmpl_dir,
required_tables={User, Alias, Diario, Discord, Telegram, WikiPage, WikiRevision, Bio, TriviaScore})
@rp.route("/")
def profile_index():
alchemy, alchemy_session = f.current_app.config["ALCHEMY"], f.current_app.config["ALCHEMY_SESSION"]
royals = alchemy_session.query(alchemy.User).order_by(alchemy.User.username).all()
return f.render_template("profile_index.html", royals=royals)
@rp.route("/<username>")
def profile_page(username):
alchemy, alchemy_session = f.current_app.config["ALCHEMY"], f.current_app.config["ALCHEMY_SESSION"]
royal = alchemy_session.query(alchemy.User).filter_by(username=username).one_or_none()
if royal is None:
return error(404, "Non esiste nessun utente con l'username richiesto.")
if royal.bio is not None and royal.bio.contents != "":
try:
parsed_bio = f.Markup(prepare_page_markdown(royal.bio.contents))
except RenderError as e:
return error(500, f"Il profilo non può essere visualizzato a causa di un errore nella bio: {str(e)}")
else:
parsed_bio = None
return f.render_template("profile_page.html", royal=royal, parsed_bio=parsed_bio)
@rp.route("/<username>/editbio", methods=["GET", "POST"])
def profile_editbio(username):
if "royal" not in f.session:
return error(403, "Devi aver effettuato il login per modificare una bio.")
alchemy, alchemy_session = f.current_app.config["ALCHEMY"], f.current_app.config["ALCHEMY_SESSION"]
royal = alchemy_session.query(alchemy.User).filter_by(username=username).one_or_none()
if not (f.session["royal"]["uid"] == royal.uid or f.session["royal"]["role"] == "Admin"):
return error(403, "Non sei autorizzato a modificare questa pagina bio.")
if f.request.method == "GET":
return f.render_template("profile_editbio.html", royal=royal)
elif f.request.method == "POST":
fd = f.request.form
if royal.bio is None:
bio = alchemy.Bio(royal=royal, contents=fd.get("contents", ""))
alchemy_session.add(bio)
else:
royal.bio.contents = fd.get("contents", "")
alchemy_session.commit()
return f.redirect(f.url_for(".profile_page", username=username))

View file

@ -1,126 +0,0 @@
{% extends "base.html" %}
{% block title %}
{{ royal.username }} - RYGbioeditor
{% endblock %}
{% block head %}
<link rel="stylesheet" href="https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.css">
<script src="https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.js"></script>
{% endblock %}
{% block content %}
<div class="dbox">
<div class="dbox-top">
<span class="left">
Editor Bio
</span>
</div>
<div class="dbox-bot">
<form method="POST" class="full">
<!--suppress HtmlFormInputWithoutLabel -->
<textarea id="profile-editbio-contents" name="contents">{{ royal.bio.contents }}</textarea>
<label for="profile-editbio-submit">
<input id="profile-editbio-submit" type="submit" value="Salva">
</label>
</form>
</div>
</div>
{% endblock %}
{% block footscripts %}
<script>
//TODO: maybe enable autosave?
let simplemde = new SimpleMDE({
element: document.getElementById("profile-editbio-contents"),
blockStyles: {
italic: "_"
},
tabSize: 4,
spellChecker: false,
toolbar: [
{
name: "bold",
action: SimpleMDE.toggleBold,
className: "fas fa-bold no-icon",
title: "Grassetto",
},
{
name: "italic",
action: SimpleMDE.toggleItalic,
className: "fas fa-italic no-icon",
title: "Corsivo",
},
{
name: "strikethrough",
action: SimpleMDE.toggleStrikethrough,
className: "fas fa-strikethrough no-icon",
title: "Barrato",
},
{
name: "link",
action: SimpleMDE.drawLink,
className: "fas fa-link no-icon",
title: "Link",
},
"|",
{
name: "heading-smaller",
action: SimpleMDE.toggleHeadingSmaller,
className: "fas fa-header no-icon",
title: "(Rimpicciolisci) Titolo",
},
{
name: "heading",
action: SimpleMDE.toggleHeadingBigger,
className: "fas fa-header fa-lg no-icon",
title: "(Ingrandisci) Titolo",
},
"|",
{
name: "code",
action: SimpleMDE.toggleCodeBlock,
className: "fas fa-code no-icon",
title: "Codice",
},
{
name: "quote",
action: SimpleMDE.toggleBlockquote,
className: "fas fa-quote-left no-icon",
title: "Citazione",
},
{
name: "unordered-list",
action: SimpleMDE.toggleUnorderedList,
className: "fas fa-list-ul no-icon",
title: "Lista puntata",
},
{
name: "ordered-list",
action: SimpleMDE.toggleOrderedList,
className: "fas fa-list-ol no-icon",
title: "Lista ordinata",
},
{
name: "horizontal-rule",
action: SimpleMDE.drawHorizontalRule,
className: "fas fa-minus no-icon",
title: "Separatore",
},
"|",
{
name: "image",
action: SimpleMDE.drawImage,
className: "fas fa-picture-o no-icon",
title: "Immagine",
},
{
name: "table",
action: SimpleMDE.drawTable,
className: "fas fa-table no-icon",
title: "Tabella",
}
],
});
</script>
{% endblock %}

View file

@ -1,22 +0,0 @@
{% extends "base.html" %}
{% block title %}
Elenco profili
{% endblock %}
{% block content %}
<div class="dbox">
<div class="dbox-top">
<span class="left">
Elenco profili
</span>
</div>
<div class="dbox-bot">
<ul class="multicolumn">
{% for royal in royals %}
<li><a href="{{ url_for("profile.profile_page", username=royal.username) }}">{{ royal.username }}</a></li>
{% endfor %}
</ul>
</div>
</div>
{% endblock %}

View file

@ -1,97 +0,0 @@
{% extends "base.html" %}
{% block title %}
Profilo: {{ royal.username }}
{% endblock %}
{% block content %}
<div class="profile">
<h1>
{{ royal.username }}
</h1>
<div class="profile-bio">
<div class="dbox">
<div class="dbox-top">
<span class="left">
Bio
</span>
<span class="right">
{% if session["royal"] and (session["royal"]["uid"] == royal.uid or session["royal"]["role"] == "Admin") %}
<a class="edit no-icon" href="{{ url_for("profile.profile_editbio", username=royal.username) }}">Modifica</a>
{% else %}
<a class="edit no-icon disabled" title="Non sei autorizzato a modificare questa bio.">Modifica</a>
{% endif %}
</span>
</div>
<div class="dbox-bot">
{% if parsed_bio %}
{{ parsed_bio }}
{% else %}
<span class="disabled">Questo utente non ha nessuna bio.</span>
{% endif %}
</div>
</div>
</div>
<div class="columns-3">
<div class="column">
<div class="dbox profile-links">
<div class="dbox-top">
<span class="left">Account collegati</span>
</div>
<div class="dbox-bot">
<ul class="links-list">
<li><span class="links-item links-linked" title="{{ royal.uid }}">royalnet:{{ royal.username }}</span></li>
{% for telegram in royal.telegram %}
{% if telegram.username %}
<li><a class="links-item links-linked" href="https://t.me/{{ telegram.username }}">telegram:{{ telegram.mention() }}</a></li>
{% else %}
<li><span class="links-item links-linked">telegram:{{ telegram.mention() }}</span></li>
{% endif %}
{% else %}
<li><span class="links-item links-missing">Telegram non collegato</span></li>
{% endfor %}
{% for discord in royal.discord %}
<li><span class="links-item links-linked">discord:{{ discord.full_username() }}</span></li>
{% else %}
<li><span class="links-item links-missing">Discord non collegato</span></li>
{% endfor %}
</ul>
</div>
</div>
</div>
<div class="column">
<div class="dbox profile-stats">
<div class="dbox-top">
<span class="left">Statistiche</span>
</div>
<div class="dbox-bot">
<ul class="stats-list">
<li><span class="stats-info">Righe del diario create</span>: <span class="stats-value">{{ royal.diario_created|length }}</span></li>
<li><span class="stats-info">Righe del diario in cui è menzionato</span>: <span class="stats-value">{{ royal.diario_quoted|length }}</span></li>
<li><span class="stats-info">Modifiche alla wiki</span>: <span class="stats-value">{{ royal.wiki_contributions|length }}</span>
{% if royal.trivia_score %}
<li><span class="stats-info">Punteggio trivia</span>: <span class="stats-value">{{ royal.trivia_score.correct_answers }}/{{ royal.trivia_score.total_answers }}</span></li>
{% else %}
<li><span class="stats-info">Punteggio trivia</span>: <span class="stats-value disabled">0/0</span></li>
{% endif %}
</ul>
</div>
</div>
</div>
<div class="column">
<div class="dbox profile-aliases">
<div class="dbox-top">
<span class="left">Alias</span>
</div>
<div class="dbox-bot">
<ul class="alias-list">
{% for alias in royal.aliases %}
<li>{{ alias.alias|capitalize }}</li>
{% endfor %}
</ul>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View file

@ -1,50 +0,0 @@
"""A Royalnet Telegram login :py:class:`royalnet.web.Royalprint`."""
import flask as f
import hashlib
import hmac
import datetime
import os
from ...royalprint import Royalprint
from ...shortcuts import error
from royalnet.packs.common.tables import User, Telegram
tmpl_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates')
rp = Royalprint("tglogin", __name__, url_prefix="/login/telegram", required_tables={User, Telegram},
template_folder=tmpl_dir)
@rp.route("/")
def tglogin_index():
#if f.request.url_root != "https://ryg.steffo.eu/":
# return error(404, "Il login tramite Telegram non è possibile su questo dominio.")
f.session.pop("royal", None)
return f.render_template("tglogin_index.html")
@rp.route("/done")
def tglogin_done():
alchemy, alchemy_session = f.current_app.config["ALCHEMY"], f.current_app.config["ALCHEMY_SESSION"]
data_check_string = ""
for field in sorted(list(f.request.args)):
if field == "hash":
continue
data_check_string += f"{field}={f.request.args[field]}\n"
data_check_string = data_check_string.rstrip("\n")
data_check = bytes(data_check_string, encoding="ascii")
secret_key = hashlib.sha256(bytes(f.current_app.config["TG_AK"], encoding="ascii")).digest()
hex_data = hmac.new(key=secret_key, msg=data_check, digestmod="sha256").hexdigest()
if hex_data != f.request.args["hash"]:
return error(400, "L'autenticazione è fallita: l'hash ricevuto non coincide con quello calcolato.")
tg_user = alchemy_session.query(alchemy.Telegram).filter(alchemy.Telegram.tg_id == f.request.args["id"]).one_or_none()
if tg_user is None:
return error(404, "L'account Telegram con cui hai fatto il login non è connesso a nessun account User Games. Se sei un membro User Games, assicurati di aver syncato con il bot il tuo account di Telegram!")
royal_user = tg_user.royal
f.session["royal"] = {
"uid": royal_user.uid,
"username": royal_user.username,
"avatar": royal_user.avatar,
"role": royal_user.role
}
f.session["login_date"] = datetime.datetime.now()
return f.render_template("login_success.html")

View file

@ -1,39 +0,0 @@
{% extends "base.html" %}
{% block title %}
Telegram Login
{% endblock %}
{% block content %}
<div class="dbox">
<div class="dbox-top">
<span class="left">
Telegram Login
</span>
</div>
<div class="dbox-bot">
<div class="center tg-login-container">
<script async src="https://telegram.org/js/telegram-widget.js?6" data-telegram-login="royalgamesbot" data-size="large" data-auth-url="{{ url_for("tglogin.tglogin_done") }}" data-request-access="write"></script>
</div>
<p>
Per fare il login, devi aver <code>sync</code>ato il tuo account sul gruppo Telegram Royal Games!
</p>
<div class="tiny">
<p>
Facendo il login su questo sito, acconsenti a ricevere due <abbr title="cookie">biscottini</abbr> che memorizzino l'account con cui hai fatto il login.<br>
</p>
<p>
Essi avranno il seguente formato:
</p>
<pre><code>session["royal"] = {
"uid": [il tuo id Royalnet]
"username": [il tuo username Royalnet],
"avatar": [il tuo avatar Royalnet],
"role": [il tuo ruolo Royalnet]
}
session["login_date"] = [la data e l'ora di adesso]</code></pre>
</div>
</div>
</div>
{% endblock %}

View file

@ -1,18 +0,0 @@
{% extends "base.html" %}
{% block title %}
Telegram Login riuscito
{% endblock %}
{% block content %}
<div class="dbox">
<div class="dbox-top">
<span class="left">
Telegram Login
</span>
</div>
<div class="dbox-bot">
Login riuscito! Sei connesso come <b>{{ session["royal"]["username"] }}</b>!
</div>
</div>
{% endblock %}

View file

@ -1,80 +0,0 @@
"""A User Games Wiki viewer :py:class:`royalnet.web.Royalprint`. Doesn't support any kind of edit."""
import flask as f
import uuid
import os
import datetime
import difflib
from ...royalprint import Royalprint
from ...shortcuts import error, from_urluuid
from royalnet.packs.common.tables import User
from royalnet.packs.royal.tables import WikiPage, WikiRevision
tmpl_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates')
rp = Royalprint("wikiedit", __name__, url_prefix="/wiki/edit", template_folder=tmpl_dir,
required_tables={User, WikiPage, WikiRevision})
@rp.route("/newpage", methods=["GET", "POST"])
def wikiedit_newpage():
if "royal" not in f.session:
return error(403, "Devi aver effettuato il login per creare pagine wiki.")
if f.request.method == "GET":
return f.render_template("wikiedit_page.html", page=None)
elif f.request.method == "POST":
fd = f.request.form
if not ("title" in fd and "contents" in fd and "css" in fd):
return error(400, "Uno dei campi obbligatori non è stato compilato. Controlla e riprova!")
alchemy, alchemy_session = f.current_app.config["ALCHEMY"], f.current_app.config["ALCHEMY_SESSION"]
page = alchemy.WikiPage(page_id=uuid.uuid4(),
title=fd["title"],
contents=fd["contents"],
format="markdown",
css=fd["css"] if fd["css"] != "None" else None)
revision = alchemy.WikiRevision(revision_id=uuid.uuid4(),
page=page,
author_id=f.session["royal"]["uid"],
timestamp=datetime.datetime.now(),
reason=fd.get("reason"),
diff="\n".join(difflib.unified_diff([], page.contents.split("\n"))))
alchemy_session.add(page)
alchemy_session.add(revision)
alchemy_session.commit()
return f.redirect(f.url_for("wikiview.wikiview_by_id", page_id=page.page_short_id, title=page.title))
@rp.route("/<page_id>", defaults={"title": ""}, methods=["GET", "POST"])
@rp.route("/<page_id>/<title>", methods=["GET", "POST"])
def wikiedit_by_id(page_id: str, title: str):
page_uuid = from_urluuid(page_id)
if "royal" not in f.session:
return error(403, "Devi aver effettuato il login per modificare pagine wiki.")
alchemy, alchemy_session = f.current_app.config["ALCHEMY"], f.current_app.config["ALCHEMY_SESSION"]
page = alchemy_session.query(alchemy.WikiPage).filter(alchemy.WikiPage.page_id == page_uuid).one_or_none()
if page is None:
return error(404, "La pagina che stai cercando di modificare non esiste.")
if f.request.method == "GET":
return f.render_template("wikiedit_page.html", page=page)
elif f.request.method == "POST":
fd = f.request.form
if not ("title" in fd and "contents" in fd and "css" in fd):
return error(400, "Uno dei campi obbligatori non è stato compilato. Controlla e riprova!")
# Create new revision
revision = alchemy.WikiRevision(revision_id=uuid.uuid4(),
page=page,
author_id=f.session["royal"]["uid"],
timestamp=datetime.datetime.now(),
reason=fd.get("reason"),
diff="\n".join(difflib.unified_diff(page.contents.split("\n"), fd["contents"].split("\n"))))
alchemy_session.add(revision)
# Apply changes
page.contents = fd["contents"]
page.title = fd["title"]
page.css = fd["css"] if fd["css"] != "None" else None
alchemy_session.commit()
return f.redirect(f.url_for("wikiview.wikiview_by_id", page_id=page.page_short_id, title=page.title))

View file

@ -1,145 +0,0 @@
{% extends "base.html" %}
{% block title %}
{{ page.title }} - RYGwikieditor
{% endblock %}
{% block head %}
<link rel="stylesheet" href="https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.css">
<script src="https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.js"></script>
{% endblock %}
{% block content %}
<div class="dbox">
<div class="dbox-top">
<span class="left">
Editor Wiki
</span>
</div>
<div class="dbox-bot">
<form method="POST" class="wikiedit-form full">
<label for="wikiedit-title" class="label-big">
<span class="label-text">Titolo</span>
<input id="wikiedit-title" type="text" name="title" value="{{ page.title }}">
</label>
<label for="wikiedit-format">
<span class="label-text">Formato</span>
<input id="wikiedit-format" type="text" name="format" disabled value="markdown">
</label>
<!--suppress HtmlFormInputWithoutLabel -->
<textarea id="wikiedit-contents" name="contents">{{ page.contents }}</textarea>
<label for="wikiedit-css">
<span class="label-text">Tema</span>
<select id="wikiedit-css" name="css">
<option value="None" {% if page.css == None %}selected{% endif %}>Royal Games</option>
<option value="tf2.css" {% if page.css == "tf2.css" %}selected{% endif %}>Team Fortress 2</option>
</select>
</label>
<label for="wikiedit-reason">
<span class="label-text">Motivo</span>
<input id="wikiedit-reason" type="text" name="reason">
</label>
<label for="wikiedit-submit">
<input id="wikiedit-submit" type="submit" value="Salva">
</label>
</form>
</div>
</div>
{% endblock %}
{% block footscripts %}
<script>
//TODO: maybe enable autosave?
let simplemde = new SimpleMDE({
element: document.getElementById("wikiedit-contents"),
blockStyles: {
italic: "_"
},
tabSize: 4,
spellChecker: false,
toolbar: [
{
name: "bold",
action: SimpleMDE.toggleBold,
className: "fas fa-bold no-icon",
title: "Grassetto",
},
{
name: "italic",
action: SimpleMDE.toggleItalic,
className: "fas fa-italic no-icon",
title: "Corsivo",
},
{
name: "strikethrough",
action: SimpleMDE.toggleStrikethrough,
className: "fas fa-strikethrough no-icon",
title: "Barrato",
},
{
name: "link",
action: SimpleMDE.drawLink,
className: "fas fa-link no-icon",
title: "Link",
},
"|",
{
name: "heading-smaller",
action: SimpleMDE.toggleHeadingSmaller,
className: "fas fa-header no-icon",
title: "(Rimpicciolisci) Titolo",
},
{
name: "heading",
action: SimpleMDE.toggleHeadingBigger,
className: "fas fa-header fa-lg no-icon",
title: "(Ingrandisci) Titolo",
},
"|",
{
name: "code",
action: SimpleMDE.toggleCodeBlock,
className: "fas fa-code no-icon",
title: "Codice",
},
{
name: "quote",
action: SimpleMDE.toggleBlockquote,
className: "fas fa-quote-left no-icon",
title: "Citazione",
},
{
name: "unordered-list",
action: SimpleMDE.toggleUnorderedList,
className: "fas fa-list-ul no-icon",
title: "Lista puntata",
},
{
name: "ordered-list",
action: SimpleMDE.toggleOrderedList,
className: "fas fa-list-ol no-icon",
title: "Lista ordinata",
},
{
name: "horizontal-rule",
action: SimpleMDE.drawHorizontalRule,
className: "fas fa-minus no-icon",
title: "Separatore",
},
"|",
{
name: "image",
action: SimpleMDE.drawImage,
className: "fas fa-picture-o no-icon",
title: "Immagine",
},
{
name: "table",
action: SimpleMDE.drawTable,
className: "fas fa-table no-icon",
title: "Tabella",
}
],
});
</script>
{% endblock %}

View file

@ -1,50 +0,0 @@
"""A User Games Wiki viewer :py:class:`royalnet.web.Royalprint`. Doesn't support any kind of edit."""
import flask as f
import os
from ...royalprint import Royalprint
from ...shortcuts import error, from_urluuid
from royalnet.packs.common.tables import User
from royalnet.packs.royal.tables import WikiPage, WikiRevision
from ....utils.wikirender import prepare_page_markdown, RenderError
tmpl_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates')
rp = Royalprint("wikiview", __name__, url_prefix="/wiki/view", template_folder=tmpl_dir,
required_tables={User, WikiPage, WikiRevision})
def prepare_page(page):
try:
if page.format == "markdown":
return f.render_template("wikiview_page.html",
page=page,
parsed_contents=f.Markup(prepare_page_markdown(page.contents)),
css=page.css)
elif page.format == "html":
return f.render_template("wikiview_page.html",
page=page,
parsed_contents=f.Markup(page.contents),
css=page.css)
else:
return error(500, f"Non esiste nessun handler in grado di preparare pagine con il formato {page.format}.")
except RenderError as e:
return error(500, f"La pagina Wiki non può essere preparata a causa di un errore: {str(e)}")
@rp.route("/")
def wikiview_index():
alchemy, alchemy_session = f.current_app.config["ALCHEMY"], f.current_app.config["ALCHEMY_SESSION"]
pages = sorted(alchemy_session.query(alchemy.WikiPage).all(), key=lambda page: page.title)
return f.render_template("wikiview_index.html", pages=pages)
@rp.route("/<page_id>", defaults={"title": ""})
@rp.route("/<page_id>/<title>")
def wikiview_by_id(page_id: str, title: str):
page_uuid = from_urluuid(page_id)
alchemy, alchemy_session = f.current_app.config["ALCHEMY"], f.current_app.config["ALCHEMY_SESSION"]
page = alchemy_session.query(alchemy.WikiPage).filter(alchemy.WikiPage.page_id == page_uuid).one_or_none()
if page is None:
return error(404, f"La pagina richiesta non esiste.")
return prepare_page(page)

View file

@ -1,27 +0,0 @@
{% extends "base.html" %}
{% block title %}
Wiki
{% endblock %}
{% block content %}
<div class="dbox">
<div class="dbox-top">
<span class="left">
Wiki
</span>
</div>
<div class="dbox-bot">
{% if session.royal %}
<a href="{{ url_for("wikiedit.wikiedit_newpage") }}" class="btn no-icon">Crea nuova pagina</a>
{% else %}
<button disabled title="Devi fare il login per creare nuove pagine!">Crea nuova pagina</button>
{% endif %}
<ul class="multicolumn">
{% for page in pages %}
<li><a href="{{ url_for("wikiview.wikiview_by_id", page_id=page.page_short_id, title=page.title) }}">{{ page.title }}</a></li>
{% endfor %}
</ul>
</div>
</div>
{% endblock %}

View file

@ -1,34 +0,0 @@
{% extends "base.html" %}
{% block title %}
Wiki: {{ page.title }}
{% endblock %}
{% block content %}
<div class="wikiview">
<div class="dbox wiki-doublebox">
<div class="dbox-top">
<span class="left">
Wiki page
</span>
<span class="right">
{% if session.royal %}
<a class="edit no-icon" href="{{ url_for("wikiedit.wikiedit_by_id", page_id=page.page_short_id, title=page.title) }}">Modifica</a>
{% else %}
<a class="edit no-icon disabled" title="Devi fare il login per modificare pagine!">Modifica</a>
{% endif %}
</span>
</div>
<div class="dbox-bot">
<div class="wikiview-page">
<h1 class="wikiview-title">
{{ page.title }}
</h1>
<div class="wikiview-contents">
{{ parsed_contents }}
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View file

@ -1,16 +0,0 @@
import flask as f
import uuid as _uuid
import base64
def error(code, reason):
return f.render_template("error.html", title=f"Errore {code}", reason=reason), code
def to_urluuid(uuid: _uuid.UUID) -> str:
"""Return a base64 url-friendly short UUID."""
return str(base64.urlsafe_b64encode(uuid.bytes), encoding="ascii").rstrip("=")
def from_urluuid(b: str) -> _uuid.UUID:
return _uuid.UUID(bytes=base64.urlsafe_b64decode(bytes(b + "==", encoding="ascii")))

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

View file

@ -1,219 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="1000"
height="1000"
viewBox="0 0 264.58332 264.58333"
version="1.1"
id="svg8"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="LogoRoyalGames.svg"
inkscape:export-filename="C:\Users\stepi\Pictures\LogoRoyalGames.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<title
id="title5190">Royal Games</title>
<defs
id="defs2">
<linearGradient
id="linearGradient5149">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop5147" />
</linearGradient>
<linearGradient
id="linearGradient5042">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop5040" />
</linearGradient>
<linearGradient
id="linearGradient4971">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop4969" />
</linearGradient>
<linearGradient
id="Principale"
osb:paint="solid">
<stop
style="stop-color:#a1ccff;stop-opacity:1;"
offset="0"
id="stop4895" />
</linearGradient>
<linearGradient
id="Sfondo"
osb:paint="solid">
<stop
style="stop-color:#0d193b;stop-opacity:1;"
offset="0"
id="stop817" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#Sfondo"
id="linearGradient821"
x1="34.745037"
y1="124.61114"
x2="175.3288"
y2="124.61114"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.8820335,0,0,2.1427478,-65.391324,-102.30192)" />
<linearGradient
inkscape:collect="always"
xlink:href="#Principale"
id="linearGradient5332"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(4.9722906,-1.7276436,1.7276436,4.9722906,-481.91887,-479.70806)"
x1="55.743366"
y1="152.60051"
x2="62.71452"
y2="152.60051" />
<linearGradient
inkscape:collect="always"
xlink:href="#Principale"
id="linearGradient5334"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(4.8721103,-1.6928355,1.6928355,4.8721103,-559.10679,-570.69534)"
x1="65.251831"
y1="186.99634"
x2="72.946449"
y2="186.99634" />
<linearGradient
inkscape:collect="always"
xlink:href="#Sfondo"
id="linearGradient5336"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(5.0448436,-1.7528523,1.7528523,5.0448436,-614.18765,-850.35741)"
x1="63.593018"
y1="224.03799"
x2="71.024086"
y2="224.03799" />
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5457">
<use
x="0"
y="0"
xlink:href="#g5453"
id="use5459"
width="100%"
height="100%" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.49497475"
inkscape:cx="287.44765"
inkscape:cy="453.73086"
inkscape:document-units="px"
inkscape:current-layer="main-layer"
showgrid="false"
units="px"
inkscape:pagecheckerboard="true"
inkscape:measure-start="384.018,406.607"
inkscape:measure-end="388.429,418.649"
showguides="true"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="false"
inkscape:snap-bbox="false"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:snap-nodes="true"
inkscape:snap-grids="false"
inkscape:snap-others="false"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="1272"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:snap-page="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0">
<inkscape:grid
type="xygrid"
id="grid1186"
originx="0"
originy="1.5e-005" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Royal Games</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Main Layer"
inkscape:groupmode="layer"
id="main-layer"
transform="translate(0,-32.416689)"
style="display:inline">
<rect
style="fill:url(#linearGradient821);fill-opacity:1;stroke-width:0.53132677"
id="background"
width="264.58334"
height="264.58334"
x="0"
y="32.416656" />
<g
id="logo"
transform="matrix(0.88827897,0,0,0.88827923,7.5532469,20.037367)">
<path
inkscape:connector-curvature="0"
id="star"
d="m 55.674623,47.499965 23.70863,68.248035 5.283398,-7.9251 5.291666,7.9375 5.291667,-7.9375 v 27.78125 c 0,0 -3.96081,0.36871 -8.719881,0.71727 l 36.012267,103.66498 105.39511,38.24676 -69.9983,-88.16309 66.02232,-87.15178 -103.69547,36.69078 z"
style="display:inline;opacity:0.98999999;fill:#a1ccff;fill-opacity:1;stroke-width:0.33488649" />
<path
inkscape:connector-curvature="0"
id="crown"
d="m 86.530103,136.32142 -7.14685,-20.57342 -0.0083,0.0124 -5.291667,-7.93751 -5.291666,7.93751 -5.291622,-7.9375 -5.291667,7.93751 -5.291666,-7.93751 v 27.78126 c 0,0 14.097344,1.32291 21.166666,1.32291 3.331782,0 8.204375,-0.29493 12.446786,-0.60565 z"
style="display:inline;opacity:1;fill:#a1ccff;fill-opacity:1;stroke-width:0.33488649" />
<path
d="m 72.507099,179.7588 3.39258,9.76411 q 0.982062,2.82645 1.575007,3.45555 0.609709,0.59447 1.635113,0.72773 1.025404,0.13327 3.415041,-0.69702 l 0.330331,0.95072 -17.832346,6.19592 -0.330331,-0.95071 q 2.415332,-0.83922 3.111495,-1.57065 0.712931,-0.76606 0.796984,-1.60159 0.109751,-0.84445 -0.872311,-3.6709 l -7.856504,-22.61162 q -0.982062,-2.82645 -1.591772,-3.42092 -0.592945,-0.6291 -1.618348,-0.76236 -1.025404,-0.13327 -3.415041,0.69702 l -0.330331,-0.95072 16.187864,-5.62454 q 6.320976,-2.19625 9.553754,-2.3404 3.232782,-0.14414 5.904185,1.577 2.662477,1.69545 3.7606,4.85593 1.339177,3.85425 -0.560957,7.33657 -1.219429,2.20912 -4.128851,4.11271 l 12.474459,8.88354 q 2.439061,1.71548 3.329239,2.03972 1.330261,0.4305 2.744571,0.0255 l 0.33033,0.95072 -10.971772,3.81219 -16.746132,-11.97806 z m -5.937017,-17.08719 5.303137,15.26284 1.464616,-0.50889 q 3.571608,-1.24097 5.121371,-2.49936 1.540832,-1.2841 1.953701,-3.32815 0.429633,-2.07869 -0.525644,-4.82805 -1.383817,-3.98273 -3.920215,-5.23243 -2.5107,-1.25862 -6.647599,0.17876 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:1.25;font-family:'Times New Roman';-inkscape-font-specification:'Times New Roman, Bold';letter-spacing:0px;word-spacing:0px;fill:url(#linearGradient5332);fill-opacity:1;stroke:none;stroke-width:1.39273477"
id="letter-r"
inkscape:connector-curvature="0" />
<path
d="m 130.68189,137.70908 0.33514,0.96457 q -1.66517,0.84148 -2.33195,1.94973 -0.92304,1.54784 -2.04475,7.40121 l -3.217,15.4634 2.97106,8.55096 q 0.9511,2.73733 1.47316,3.3156 0.513,0.55218 1.52862,0.78362 1.03243,0.19649 2.4402,-0.29264 l 1.98136,-0.68843 0.33514,0.96457 -19.83925,6.89323 -0.33514,-0.96457 1.85095,-0.64312 q 1.5642,-0.54349 2.28645,-1.408 0.55091,-0.60076 0.63405,-1.62275 0.0692,-0.72522 -0.85477,-3.38436 l -2.46381,-7.09103 -13.57909,-12.2571 q -4.034666,-3.62353 -5.323131,-4.05231 -1.297544,-0.45491 -3.001119,0.10777 l -0.335146,-0.96457 16.945476,-5.88778 0.33515,0.96457 -0.75607,0.2627 q -1.53812,0.53443 -2.00989,1.19475 -0.44555,0.65179 -0.27353,1.14689 0.32609,0.93849 3.72516,3.99398 l 10.45421,9.48617 2.65629,-12.87275 q 1.01366,-4.73481 0.5698,-6.01227 -0.24455,-0.70385 -1.08543,-0.93761 -1.11283,-0.34377 -3.53051,0.35017 l -0.33515,-0.96457 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:1.25;font-family:'Times New Roman';-inkscape-font-specification:'Times New Roman, Bold';letter-spacing:0px;word-spacing:0px;fill:url(#linearGradient5336);fill-opacity:1;stroke:none;stroke-width:1.41305673"
id="letter-y"
inkscape:connector-curvature="0" />
<path
d="m 102.64486,200.4253 4.18153,12.03476 -0.93156,0.32368 q -3.40148,-4.34864 -7.667536,-5.7445 -4.266052,-1.39586 -8.269247,-0.005 -3.826954,1.32969 -5.617541,4.37848 -1.79933,3.02363 -1.518338,7.24317 0.280991,4.21955 1.689414,8.2731 1.705854,4.90957 4.149964,8.20824 2.444105,3.29865 5.615805,4.1436 3.196874,0.83619 6.746879,-0.39727 1.23369,-0.42865 2.43025,-1.12657 1.21299,-0.73185 2.39761,-1.70779 l -2.46693,-7.1 q -0.69983,-2.01419 -1.17799,-2.49704 -0.4869,-0.50803 -1.53432,-0.68021 -1.022237,-0.18094 -2.255926,0.24771 l -0.881207,0.30618 -0.323675,-0.93156 16.591858,-5.76491 0.32368,0.93156 q -1.84457,0.78197 -2.45992,1.44726 -0.59892,0.63134 -0.68683,1.6777 -0.0604,0.5571 0.58696,2.42022 l 2.46693,7.1 q -2.76567,2.59752 -6.06198,4.56113 -3.26239,1.98004 -7.06416,3.30099 -4.859227,1.68835 -8.536819,1.49887 -3.661163,-0.22341 -6.872121,-1.50618 -3.194524,-1.3167 -5.515311,-3.52953 -2.969632,-2.86211 -4.465535,-7.16744 -2.676879,-7.70426 0.890426,-14.89749 3.567304,-7.19323 11.775112,-10.04506 2.54291,-0.88355 4.722241,-1.1893 1.177786,-0.18349 3.977586,-0.0841 2.81623,0.0655 3.269421,-0.0919 0.70497,-0.24494 1.13426,-0.95843 0.42055,-0.73868 0.42546,-2.34875 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:1.25;font-family:'times new roman';-inkscape-font-specification:'times new roman, Bold';letter-spacing:0px;word-spacing:0px;fill:url(#linearGradient5334);fill-opacity:1;stroke:none;stroke-width:1.36467421"
id="letter-g"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 11 KiB

View file

@ -1,812 +0,0 @@
/*** Variables ***/
/*** Standard elements ***/
body {
font-family: "Arial", "Helvetica Neue", sans-serif;
background-color: #0d193b;
color: #a0ccff;
box-sizing: border-box;
}
a {
color: #00caca;
text-decoration: none;
}
a:hover {
color: #4affff;
}
a:active {
color: white;
}
a:not(.no-icon)::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f0c1";
margin-right: 4px;
}
a:not(.no-icon)[href^="https://t.me"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f2c6";
margin-right: 3px;
}
a:not(.no-icon)[href^="https://www.youtube.com"]::before,
a:not(.no-icon)[href^="https://youtu.be"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f167";
margin-right: 3px;
}
a:not(.no-icon)[href^="https://vimeo.com"]::before,
a:not(.no-icon)[href^="https://player.vimeo.com"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f27d";
margin-right: 4px;
}
a:not(.no-icon)[href^="https://github.com"]::before,
a:not(.no-icon)[href^="https://gist.github.com"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f09b";
margin-right: 4px;
}
a:not(.no-icon)[href^="https://itch.io"]::before,
a:not(.no-icon)[href^="https://steffo.itch.io"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f83a";
margin-right: 3px;
}
a:not(.no-icon)[href^="https://www.kickstarter.com"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f3bb";
margin-right: 4px;
}
a:not(.no-icon)[href^="https://reddit.com"]::before,
a:not(.no-icon)[href^="https://new.reddit.com"]::before,
a:not(.no-icon)[href^="https://old.reddit.com"]::before,
a:not(.no-icon)[href^="https://redd.it"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f281";
margin-right: 3px;
}
a:not(.no-icon)[href^="https://www.twitch.tv"]::before,
a:not(.no-icon)[href^="https://clips.twitch.tv"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f1e8";
margin-right: 4px;
}
a:not(.no-icon)[href^="https://store.steampowered.com"]::before,
a:not(.no-icon)[href^="https://steamcommunity.com"]::before,
a:not(.no-icon)[href^="https://partner.steamgames.com"]::before,
a:not(.no-icon)[href^="steam:"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f1b6";
margin-right: 4px;
}
a:not(.no-icon)[href^="https://twitter.com"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f099";
margin-right: 3px;
}
a:not(.no-icon)[href^="https://it.wikipedia.org"]::before,
a:not(.no-icon)[href^="https://en.wikipedia.org"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f266";
margin-right: 3px;
}
a:not(.no-icon)[href^="#"]::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f13d";
margin-right: 3px;
}
a:not(.no-icon)[href^="http:"]::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f09c";
margin-right: 4px;
}
a:not(.no-icon)[href^="magnet:"]::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f076";
margin-right: 4px;
}
b,
strong {
color: #ffff7d;
}
i,
em {
color: #ffbb7d;
}
h1,
h2,
h3,
h4,
h5,
h6 {
color: #ffffff;
margin-top: 0;
margin-bottom: 0;
font-weight: normal;
}
pre {
padding: 2px 4px 2px 8px;
margin: 8px;
color: lightgray;
border: 1px solid rgba(211, 211, 211, 0.2);
background-color: rgba(211, 211, 211, 0.1);
font-family: "Consolas", "Source Code Pro", monospace;
}
*:not(pre) > code {
color: lightgray;
border: 1px solid rgba(211, 211, 211, 0.2);
background-color: rgba(211, 211, 211, 0.1);
}
code {
font-family: "Consolas", "Source Code Pro", monospace;
}
blockquote {
color: #7dff7d;
border-left: 3px solid #7dff7d;
background-color: rgba(125, 255, 125, 0.1);
padding: 2px 4px 2px 8px;
margin: 8px;
}
textarea {
background-color: rgba(160, 204, 255, 0.1);
color: #a0ccff;
border: 1px solid #a0ccff;
padding: 2px;
margin: 1px;
font-size: small;
font-family: "Consolas", "Source Code Pro", monospace;
width: 100%;
height: 300px;
}
button,
input[type="submit"],
.btn {
background-color: rgba(160, 204, 255, 0.1);
color: #a0ccff !important;
border: 1px solid #a0ccff;
border-radius: 0;
padding: 2px 8px;
margin: 1px;
font-size: medium;
font-family: "Arial", "Helvetica Neue", sans-serif;
text-decoration: none;
cursor: default;
}
button:hover,
input[type="submit"]:hover,
.btn:hover {
background-color: rgba(160, 204, 255, 0.2);
color: #ffffff;
border-color: #ffffff;
}
button:active,
input[type="submit"]:active,
.btn:active {
background-color: rgba(160, 204, 255, 0.3);
color: white;
border-color: white;
}
input[type="text"],
input[type="password"],
input[type="email"] {
background-color: rgba(160, 204, 255, 0.1);
color: #a0ccff;
border: none;
border-bottom: 1px dashed #a0ccff;
padding: 2px;
margin: 1px;
font-size: medium;
font-family: "Arial", "Helvetica Neue", sans-serif;
}
select {
background-color: rgba(160, 204, 255, 0.1);
color: #a0ccff;
border: none;
border-bottom: 1px dotted #a0ccff;
padding: 2px;
margin: 1px;
font-size: medium;
font-family: "Arial", "Helvetica Neue", sans-serif;
}
select option {
background-color: #293c61;
color: #a0ccff;
}
img {
margin-left: auto;
margin-right: auto;
display: block;
max-width: 100%;
}
nav {
display: flex;
justify-content: space-between;
height: 50px;
line-height: 50px;
min-width: 400px;
}
nav .nav-left {
text-align: left;
}
nav .nav-center {
text-align: center;
}
nav .nav-right {
text-align: right;
}
nav .nav-image {
height: 50px;
display: inline;
vertical-align: middle;
}
nav .nav-sitename {
font-weight: bold;
}
nav .nav-login-unavailable {
opacity: 0.25;
}
table {
border-collapse: collapse;
}
table thead {
margin-top: 4px;
margin-left: 4px;
margin-right: 4px;
padding: 8px;
}
table thead th {
background-color: rgba(160, 204, 255, 0.2);
color: #ffffff;
padding-left: 4px;
padding-right: 4px;
text-align: left;
font-size: small;
font-weight: bold;
}
table thead tr:first-child th:first-child {
border-radius: 4px 0 0 0;
}
table thead tr:first-child th:last-child {
border-radius: 0 4px 0 0;
}
table tbody {
margin-bottom: 4px;
margin-left: 4px;
margin-right: 4px;
padding: 8px;
}
table tbody td {
background-color: rgba(160, 204, 255, 0.1);
padding-left: 4px;
padding-right: 4px;
}
table tbody tr {
border-bottom: 1px solid rgba(160, 204, 255, 0.2);
}
table tbody tr:last-child {
border-bottom: none;
}
table tbody tr:last-child td:first-child {
border-radius: 0 0 0 4px;
}
table tbody tr:last-child td:last-child {
border-radius: 0 0 4px 0;
}
form.full label {
margin-top: 4px;
margin-bottom: 4px;
display: flex;
}
form.full label .label-text {
margin-right: 12px;
min-width: 60px;
}
form.full label input {
flex-grow: 1;
}
form.full label.label-big {
font-size: x-large;
}
form.full label.label-big * {
font-size: x-large;
}
*[disabled=""],
.disabled {
opacity: 0.3;
}
/*** Modifiers ***/
.tiny {
font-size: xx-small;
}
.center {
margin: auto;
}
/*** Custom elements ***/
.CodeMirror {
font-family: "Consolas", monospace !important;
background-color: #0d193b !important;
color: #a0ccff !important;
border-top: 0 !important;
border-bottom: 0 !important;
border-left: 1px solid rgba(160, 204, 255, 0.2) !important;
border-right: 1px solid rgba(160, 204, 255, 0.2) !important;
border-radius: 0 !important;
caret-color: white;
}
.CodeMirror .cm-link {
color: #7dffff !important;
}
.CodeMirror .cm-url {
color: #00caca !important;
}
.CodeMirror .cm-tag {
color: #ff7dff !important;
}
.CodeMirror .cm-strong {
color: #ffff7d !important;
}
.CodeMirror .cm-em {
color: #ffbb7d !important;
}
.CodeMirror .cm-quote {
color: #7dff7d !important;
}
.CodeMirror .cm-comment {
color: lightgray !important;
}
.CodeMirror .cm-header {
color: #ffffff !important;
}
.CodeMirror .CodeMirror-cursor {
border-left: 1px solid #a0ccff !important;
}
.editor-toolbar,
.editor-statusbar {
background-color: #1c2b4f !important;
color: #a0ccff !important;
opacity: 1 !important;
}
.editor-toolbar a,
.editor-statusbar a {
color: #a0ccff !important;
border: 0 !important;
}
.editor-toolbar a:hover,
.editor-statusbar a:hover {
background-color: rgba(160, 204, 255, 0.2) !important;
color: #ffffff !important;
}
.editor-toolbar a.active,
.editor-statusbar a.active {
background-color: rgba(160, 204, 255, 0.3) !important;
color: white !important;
}
.editor-toolbar a.active:hover,
.editor-statusbar a.active:hover {
background-color: rgba(160, 204, 255, 0.2) !important;
color: #ffffff !important;
}
.editor-toolbar .fas,
.editor-statusbar .fas,
.editor-toolbar .far,
.editor-statusbar .far,
.editor-toolbar .fab,
.editor-statusbar .fab {
color: #a0ccff !important;
}
.editor-toolbar .fas:hover,
.editor-statusbar .fas:hover,
.editor-toolbar .far:hover,
.editor-statusbar .far:hover,
.editor-toolbar .fab:hover,
.editor-statusbar .fab:hover {
color: #a0ccff !important;
}
.editor-toolbar .fas:active,
.editor-statusbar .fas:active,
.editor-toolbar .far:active,
.editor-statusbar .far:active,
.editor-toolbar .fab:active,
.editor-statusbar .fab:active {
color: white !important;
}
.editor-toolbar {
border-top: 1px solid #2b3e62 !important;
border-left: 1px solid #2b3e62 !important;
border-right: 1px solid #2b3e62 !important;
border-top-left-radius: 4px;
border-top-right-radius: 4px;
}
.editor-statusbar {
border-bottom: 1px solid #2b3e62 !important;
border-left: 1px solid #2b3e62 !important;
border-right: 1px solid #2b3e62 !important;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
}
.horizontal-container-main {
display: flex;
justify-content: center;
align-content: center;
flex-direction: row;
}
@media (max-width: 1199px) {
.horizontal-container-main {
flex-direction: column;
}
}
.columns-3 {
display: flex;
justify-content: center;
align-content: center;
flex-direction: row;
flex-wrap: wrap;
}
.columns-3 .column {
width: 33.3%;
min-width: 400px;
}
.fill {
width: 100%;
height: 100%;
margin: 0 !important;
}
.vertical-main {
width: 100%;
min-width: 400px;
max-width: 1200px;
}
.box {
background-color: rgba(160, 204, 255, 0.1);
border-radius: 4px;
padding: 8px;
margin: 8px;
}
.dbox {
margin: 8px;
}
.dbox .dbox-top {
display: flex;
justify-content: space-between;
background-color: rgba(160, 204, 255, 0.2);
padding: 4px;
border-radius: 4px 4px 0 0;
color: #ffffff;
font-size: smaller;
font-weight: bold;
height: 16px;
}
.dbox .dbox-top .left {
align-self: flex-start;
}
.dbox .dbox-top .right {
align-self: flex-end;
}
.dbox .dbox-bot {
background-color: rgba(160, 204, 255, 0.1);
padding: 8px;
border-radius: 0 0 4px 4px;
}
.color {
border-radius: 4px;
width: 32px;
height: 32px;
display: inline-block;
}
.color.color-light {
border: 1px solid black;
}
.color.color-dark {
border: 1px solid white;
}
.proscons {
padding: 4px 4px 4px 8px;
margin: 4px;
border-radius: 4px;
}
.proscons.plus {
color: #7dff7d;
background-color: rgba(125, 255, 125, 0.1);
}
.proscons.plus::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f0fe";
margin-right: 6px;
}
.proscons.minus {
color: #ff7d7d;
background-color: rgba(255, 125, 125, 0.1);
}
.proscons.minus::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f146";
margin-right: 6px;
}
.proscons.stars {
background-color: rgba(255, 255, 125, 0.1);
color: #ffff7d;
display: flex;
}
.proscons.stars .stars-0 {
margin-right: 6px;
}
.proscons.stars .stars-0::after {
font-family: "Font Awesome 5 Free";
font-weight: normal;
content: "\f005\f005\f005\f005\f005";
}
.proscons.stars .stars-1 {
margin-right: 6px;
}
.proscons.stars .stars-1::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f005";
}
.proscons.stars .stars-1::after {
font-family: "Font Awesome 5 Free";
font-weight: normal;
content: "\f005\f005\f005\f005";
}
.proscons.stars .stars-2 {
margin-right: 6px;
}
.proscons.stars .stars-2::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f005\f005";
}
.proscons.stars .stars-2::after {
font-family: "Font Awesome 5 Free";
font-weight: normal;
content: "\f005\f005\f005";
}
.proscons.stars .stars-3 {
margin-right: 6px;
}
.proscons.stars .stars-3::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f005\f005\f005";
}
.proscons.stars .stars-3::after {
font-family: "Font Awesome 5 Free";
font-weight: normal;
content: "\f005\f005";
}
.proscons.stars .stars-4 {
margin-right: 6px;
}
.proscons.stars .stars-4::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f005\f005\f005\f005";
}
.proscons.stars .stars-4::after {
font-family: "Font Awesome 5 Free";
font-weight: normal;
content: "\f005";
}
.proscons.stars .stars-5 {
margin-right: 6px;
}
.proscons.stars .stars-5::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f005\f005\f005\f005\f005";
}
.proscons:not(.plus):not(.minus):not(.stars) {
color: #a0ccff;
background-color: rgba(160, 204, 255, 0.1);
}
.proscons:not(.plus):not(.minus):not(.stars)::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f0c8";
margin-right: 6px;
}
.proscons.label-big {
font-size: xx-large;
}
.spoiler {
color: transparent;
background-color: rgba(255, 125, 125, 0.1);
border: 1px solid rgba(255, 125, 125, 0.1);
border-radius: 2px;
padding: 4px;
}
.spoiler b,
.spoiler strong,
.spoiler i,
.spoiler em {
color: inherit;
}
.spoiler b:hover,
.spoiler strong:hover,
.spoiler i:hover,
.spoiler em:hover {
color: inherit;
}
.spoilerblockquote {
border-radius: 2px;
padding: 4px;
}
.spoiler:hover {
color: #ff7d7d;
}
.wiki .wiki-doublebox .dbox-bot,
.profile-bio .wiki-doublebox .dbox-bot {
background-color: transparent;
border-top: 0;
border-bottom: 4px solid rgba(160, 204, 255, 0.2);
border-left: 4px solid rgba(160, 204, 255, 0.2);
border-right: 4px solid rgba(160, 204, 255, 0.2);
}
.wiki .wiki-doublebox .dbox-bot .wikiview-title,
.profile-bio .wiki-doublebox .dbox-bot .wikiview-title {
text-align: center;
font-size: 42px;
margin-top: 0;
}
.wiki h1,
.profile-bio h1,
.wiki h2,
.profile-bio h2,
.wiki h3,
.profile-bio h3,
.wiki h4,
.profile-bio h4,
.wiki h5,
.profile-bio h5,
.wiki h6,
.profile-bio h6 {
margin-top: revert;
margin-bottom: revert;
}
.error .error-dbox .dbox-top {
background-color: rgba(255, 125, 125, 0.2);
color: #ff7d7d;
}
.error .error-dbox .dbox-bot {
background-color: rgba(255, 125, 125, 0.1);
color: #ff7d7d;
}
.diario {
display: grid;
grid-template-columns: auto auto 40px;
}
.diario .diario-content {
grid-row: 1;
grid-column-start: 1;
grid-column-end: 4;
}
.diario .diario-content .diario-img img {
color: red;
margin-top: 2px;
margin-bottom: 2px;
max-height: 400px;
}
.diario .diario-content .diario-text {
margin-top: 2px;
margin-bottom: 2px;
}
.diario .diario-quote {
grid-row: 2;
grid-column-start: 1;
grid-column-end: 4;
font-size: small;
margin-top: 2px;
margin-bottom: 2px;
}
.diario .diario-quote .diario-context {
font-style: italic;
}
.diario .diario-timestamp {
grid-row: 3;
grid-column: 1;
font-size: x-small;
margin-top: 2px;
margin-bottom: 2px;
}
.diario .diario-created {
grid-row: 3;
grid-column: 2;
justify-self: end;
font-size: x-small;
margin-top: 2px;
margin-bottom: 2px;
}
.diario .diario-id {
grid-row: 3;
grid-column: 3;
justify-self: end;
font-size: x-small;
margin-top: 2px;
margin-bottom: 2px;
}
.diario.diario-spoiler {
color: transparent;
background-color: rgba(255, 125, 125, 0.1);
border-left: 3px solid #ff7d7d;
}
.diario.diario-spoiler:hover {
color: #ff7d7d;
}
ul.multicolumn,
ol.multicolumn {
column-width: 300px;
}
/*** Page specific classes ***/
.mcstatus-grid {
display: grid;
grid-template-columns: 64px auto auto;
grid-column-gap: 12px;
align-items: center;
}
.mcstatus-grid .mcstatus-icon {
grid-column: 1;
grid-row-start: 1;
grid-row-end: 3;
width: 64px;
height: 64px;
}
.mcstatus-grid .mcstatus-icon .mcstatus-icon-img {
width: 64px;
height: 64px;
}
.mcstatus-grid .mcstatus-address {
font-weight: bold;
grid-column: 2;
justify-self: start;
grid-row: 1;
}
.mcstatus-grid .mcstatus-address .server-up {
color: #7dff7d;
}
.mcstatus-grid .mcstatus-address .server-down {
color: #ff7d7d;
}
.mcstatus-grid .mcstatus-description {
grid-column: 2;
justify-self: start;
grid-row: 2;
}
.mcstatus-grid .mcstatus-players {
grid-column: 3;
justify-self: end;
grid-row: 1;
}
.mcstatus-grid .mcstatus-version {
grid-column: 3;
justify-self: end;
grid-row: 2;
}
.profile .profile-links .links-linked {
font-family: "Consolas", "Source Code Pro", monospace;
}
.profile .profile-links .links-missing {
color: #ff7d7d;
}
.profile .profile-stats .stats-value {
font-weight: bold;
}
.tg-login-container {
width: 238px;
height: 40px;
}
/*# sourceMappingURL=ryg.css.map */

File diff suppressed because one or more lines are too long

View file

@ -1,985 +0,0 @@
/*** Variables ***/
@bg: #0d193b; //Background color
@fg: #a0ccff; //Foreground color
@li: #00caca; //Link
@ec: #ffffff; //Extra color
@fg-ten: fade(@fg, 10%);
@fg-twenty: fade(@fg, 20%);
@fg-ten-hard: screen(@bg, @fg-ten);
@fg-twenty-hard: screen(@bg, @fg-twenty);
@pastel-red: #ff7d7d;
@pastel-orange: #ffbb7d;
@pastel-yellow: #ffff7d;
@pastel-lime: #7dff7d;
@pastel-cyan: #7dffff;
@pastel-blue: #7d7dff;
@pastel-magenta: #ff7dff;
@main-fonts: "Arial", "Helvetica Neue", sans-serif;
@monospace-fonts: "Consolas", "Source Code Pro", monospace;
/*** Standard elements ***/
body {
font-family: @main-fonts;
background-color: @bg;
color: @fg;
box-sizing: border-box;
}
a {
color: @li;
text-decoration: none;
&:hover {
color: lighten(@li, 25%);
}
&:active {
color: white;
}
//Icon link
//noinspection CssNoGenericFontName
&:not(.no-icon) {
//External link
&::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f0c1";
margin-right: 4px;
}
//Telegram link
&[href^="https://t.me"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f2c6";
margin-right: 3px;
}
//YouTube link
&[href^="https://www.youtube.com"]::before, &[href^="https://youtu.be"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f167";
margin-right: 3px;
}
//Vimeo link
&[href^="https://vimeo.com"]::before, &[href^="https://player.vimeo.com"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f27d";
margin-right: 4px;
}
//GitHub link
&[href^="https://github.com"]::before, &[href^="https://gist.github.com"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f09b";
margin-right: 4px;
}
//Itchio link
&[href^="https://itch.io"]::before, &[href^="https://steffo.itch.io"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f83a";
margin-right: 3px;
}
//Kickstarter link
&[href^="https://www.kickstarter.com"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f3bb";
margin-right: 4px;
}
//Reddit link
&[href^="https://reddit.com"]::before, &[href^="https://new.reddit.com"]::before, &[href^="https://old.reddit.com"]::before, &[href^="https://redd.it"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f281";
margin-right: 3px;
}
//Twitch link
&[href^="https://www.twitch.tv"]::before, &[href^="https://clips.twitch.tv"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f1e8";
margin-right: 4px;
}
//Steam link
&[href^="https://store.steampowered.com"]::before, &[href^="https://steamcommunity.com"]::before, &[href^="https://partner.steamgames.com"]::before, &[href^="steam:"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f1b6";
margin-right: 4px;
}
//Twitter link
&[href^="https://twitter.com"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f099";
margin-right: 3px;
}
//Wikipedia link
&[href^="https://it.wikipedia.org"]::before, &[href^="https://en.wikipedia.org"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f266";
margin-right: 3px;
}
//Anchor
&[href^="#"]::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f13d";
margin-right: 3px;
}
//Unsafe link
&[href^="http:"]::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f09c";
margin-right: 4px;
}
//Magnet link
&[href^="magnet:"]::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f076";
margin-right: 4px;
}
}
}
b, strong {
color: @pastel-yellow;
}
i, em {
color: @pastel-orange;
}
h1, h2, h3, h4, h5, h6 {
color: @ec;
margin-top: 0;
margin-bottom: 0;
font-weight: normal;
}
pre {
padding: 2px 4px 2px 8px;
margin: 8px;
color: lightgray;
border: 1px solid fade(lightgray, 20%);
background-color: fade(lightgray, 10%);
font-family: @monospace-fonts;
}
*:not(pre) > code {
color: lightgray;
border: 1px solid fade(lightgray, 20%);
background-color: fade(lightgray, 10%);
}
code {
font-family: @monospace-fonts;
}
blockquote {
color: @pastel-lime;
border-left: 3px solid @pastel-lime;
background-color: fade(@pastel-lime, 10%);
padding: 2px 4px 2px 8px;
margin: 8px;
}
textarea {
background-color: @fg-ten;
color: @fg;
border: 1px solid @fg;
padding: 2px;
margin: 1px;
font-size: small;
font-family: @monospace-fonts;
width: 100%;
height: 300px;
}
button, input[type="submit"], .btn {
background-color: @fg-ten;
color: @fg !important;
border: 1px solid @fg;
border-radius: 0;
padding: 2px 8px;
margin: 1px;
font-size: medium;
font-family: @main-fonts;
text-decoration: none;
cursor: default;
&:hover {
background-color: @fg-twenty;
color: lighten(@fg, 25%);
border-color: lighten(@fg, 25%);
}
&:active {
background-color: fade(@fg, 30%);
color: white;
border-color: white;
}
}
input[type="text"], input[type="password"], input[type="email"] {
background-color: @fg-ten;
color: @fg;
border: none;
border-bottom: 1px dashed @fg;
padding: 2px;
margin: 1px;
font-size: medium;
font-family: @main-fonts;
}
select {
background-color: @fg-ten;
color: @fg;
border: none;
border-bottom: 1px dotted @fg;
padding: 2px;
margin: 1px;
font-size: medium;
font-family: @main-fonts;
option {
background-color: #293c61;
color: @fg;
}
}
img {
margin-left: auto;
margin-right: auto;
display: block;
max-width: 100%;
}
nav {
display: flex;
justify-content: space-between;
height: 50px;
line-height: 50px;
min-width: 400px;
.nav-left {
text-align: left;
}
.nav-center {
text-align: center;
}
.nav-right {
text-align: right;
}
.nav-image {
height: 50px;
display: inline;
vertical-align: middle;
}
.nav-sitename {
font-weight: bold;
}
.nav-login-unavailable {
opacity: 0.25;
}
}
table {
border-collapse: collapse;
thead {
margin-top: 4px;
margin-left: 4px;
margin-right: 4px;
padding: 8px;
th {
background-color: @fg-twenty;
color: @ec;
padding-left: 4px;
padding-right: 4px;
text-align: left;
font-size: small;
font-weight: bold;
}
tr:first-child {
th:first-child {
border-radius: 4px 0 0 0;
}
th:last-child {
border-radius: 0 4px 0 0;
}
}
}
tbody {
margin-bottom: 4px;
margin-left: 4px;
margin-right: 4px;
padding: 8px;
td {
background-color: @fg-ten;
padding-left: 4px;
padding-right: 4px;
}
tr {
border-bottom: 1px solid @fg-twenty;
&:last-child {
border-bottom: none;
td:first-child {
border-radius: 0 0 0 4px;
}
td:last-child {
border-radius: 0 0 4px 0;
}
}
}
}
}
form.full {
label {
margin-top: 4px;
margin-bottom: 4px;
display: flex;
.label-text {
margin-right: 12px;
min-width: 60px;
}
input {
flex-grow: 1;
}
&.label-big {
font-size: x-large;
* {
font-size: x-large;
}
}
}
}
*[disabled=""], .disabled {
opacity: 0.3;
}
/*** Modifiers ***/
.tiny {
font-size: xx-small;
}
.center {
margin: auto;
}
/*** Custom elements ***/
//Markdown editor
.CodeMirror {
font-family: "Consolas", monospace !important;
background-color: @bg !important;
color: @fg !important;
border-top: 0 !important;
border-bottom: 0 !important;
border-left: 1px solid @fg-twenty !important;
border-right: 1px solid @fg-twenty !important;
border-radius: 0 !important;
caret-color: white;
.cm-link {
color: @pastel-cyan !important;
}
.cm-url {
color: @li !important;
}
.cm-tag {
color: @pastel-magenta !important;
}
.cm-strong {
color: @pastel-yellow !important;
}
.cm-em {
color: @pastel-orange !important;
}
.cm-quote {
color: @pastel-lime !important;
}
.cm-comment {
color: lightgray !important;
}
.cm-header {
color: @ec !important;
}
.CodeMirror-cursor {
border-left: 1px solid @fg !important;
}
}
.editor-toolbar, .editor-statusbar {
background-color: @fg-ten-hard !important;
color: @fg !important;
opacity: 1 !important;
a {
color: @fg !important;
border: 0 !important;
&:hover {
background-color: @fg-twenty !important;
color: lighten(@fg, 25%) !important;
}
&.active {
background-color: fade(@fg, 30%) !important;
color: white !important;
&:hover {
background-color: @fg-twenty !important;
color: lighten(@fg, 25%) !important;
}
}
}
.fas, .far, .fab {
color: @fg !important;
&:hover {
color: @fg !important;
}
&:active {
color: white !important;
}
}
}
.editor-toolbar {
border-top: 1px solid @fg-twenty-hard !important;
border-left: 1px solid @fg-twenty-hard !important;
border-right: 1px solid @fg-twenty-hard !important;
border-top-left-radius: 4px;
border-top-right-radius: 4px;
}
.editor-statusbar {
border-bottom: 1px solid @fg-twenty-hard !important;
border-left: 1px solid @fg-twenty-hard !important;
border-right: 1px solid @fg-twenty-hard !important;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
}
//Horizontal container, should contain elements such as main and sidebar
.horizontal-container-main {
display: flex;
justify-content: center;
align-content: center;
flex-direction: row;
@media (max-width: 1199px)
{
flex-direction: column;
}
}
//Tripart horizontal container
.columns-3 {
display: flex;
justify-content: center;
align-content: center;
flex-direction: row;
flex-wrap: wrap;
.column {
width: 33.3%;
min-width: 400px;
}
}
//Fill the whole parent element and ignore margins
.fill {
width: 100%;
height: 100%;
margin: 0 !important;
}
//Vertical main page container
.vertical-main {
width: 100%;
min-width: 400px;
max-width: 1200px;
}
//A simple box
.box {
background-color: @fg-ten;
border-radius: 4px;
padding: 8px;
margin: 8px;
}
//A double box
.dbox {
margin: 8px;
.dbox-top {
display: flex;
justify-content: space-between;
background-color: @fg-twenty;
padding: 4px;
border-radius: 4px 4px 0 0;
color: @ec;
font-size: smaller;
font-weight: bold;
height: 16px;
.left {
align-self: flex-start;
}
.right {
align-self: flex-end;
}
}
.dbox-bot {
background-color: @fg-ten;
padding: 8px;
border-radius: 0 0 4px 4px;
}
}
//A palette color
.color {
border-radius: 4px;
width: 32px;
height: 32px;
display: inline-block;
&.color-light {
border: 1px solid black;
}
&.color-dark {
border: 1px solid white;
}
}
//Pros and cons of something
.proscons {
padding: 4px 4px 4px 8px;
margin: 4px;
border-radius: 4px;
//noinspection CssNoGenericFontName
&.plus {
color: @pastel-lime;
background-color: fade(@pastel-lime, 10%);
&::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f0fe";
margin-right: 6px;
}
}
//noinspection CssNoGenericFontName
&.minus {
color: @pastel-red;
background-color: fade(@pastel-red, 10%);
&::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f146";
margin-right: 6px;
}
}
//noinspection CssNoGenericFontName
&.stars {
background-color: fade(@pastel-yellow, 10%);
color: @pastel-yellow;
display: flex;
.stars-0 {
margin-right: 6px;
&::after {
font-family: "Font Awesome 5 Free";
font-weight: normal;
content: "\f005\f005\f005\f005\f005";
}
}
.stars-1 {
margin-right: 6px;
&::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f005";
}
&::after {
font-family: "Font Awesome 5 Free";
font-weight: normal;
content: "\f005\f005\f005\f005";
}
}
.stars-2 {
margin-right: 6px;
&::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f005\f005";
}
&::after {
font-family: "Font Awesome 5 Free";
font-weight: normal;
content: "\f005\f005\f005";
}
}
.stars-3 {
margin-right: 6px;
&::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f005\f005\f005";
}
&::after {
font-family: "Font Awesome 5 Free";
font-weight: normal;
content: "\f005\f005";
}
}
.stars-4 {
margin-right: 6px;
&::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f005\f005\f005\f005";
}
&::after {
font-family: "Font Awesome 5 Free";
font-weight: normal;
content: "\f005";
}
}
.stars-5 {
margin-right: 6px;
&::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f005\f005\f005\f005\f005";
}
}
}
//noinspection CssNoGenericFontName
&:not(.plus):not(.minus):not(.stars) {
color: @fg;
background-color: @fg-ten;
&::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f0c8";
margin-right: 6px;
}
}
&.label-big {
font-size: xx-large;
}
}
//A spoiler
.spoiler {
color: transparent;
background-color: fade(@pastel-red, 10%);
border: 1px solid fade(@pastel-red, 10%);
border-radius: 2px;
padding: 4px;
b, strong, i, em {
color: inherit;
&:hover {
color: inherit;
}
}
&blockquote {
border-radius: 2px;
padding: 4px;
}
&:hover {
color: @pastel-red;
}
}
//Wiki page
.wiki, .profile-bio {
.wiki-doublebox {
.dbox-bot {
background-color: transparent;
border-top: 0;
border-bottom: 4px solid @fg-twenty;
border-left: 4px solid @fg-twenty;
border-right: 4px solid @fg-twenty;
.wikiview-title {
text-align: center;
font-size: 42px;
margin-top: 0;
}
}
}
h1, h2, h3, h4, h5, h6 {
margin-top: revert;
margin-bottom: revert;
}
}
//An error
.error {
.error-dbox {
.dbox-top {
background-color: fade(@pastel-red, 20%);
color: @pastel-red;
}
.dbox-bot {
background-color: fade(@pastel-red, 10%);
color: @pastel-red;
}
}
}
//A diario entry
.diario {
display: grid;
grid-template-columns: auto auto 40px;
.diario-content {
grid-row: 1;
grid-column-start: 1;
grid-column-end: 4;
.diario-img img {
color: red;
margin-top: 2px;
margin-bottom: 2px;
max-height: 400px;
}
.diario-text {
margin-top: 2px;
margin-bottom: 2px;
}
}
.diario-quote {
grid-row: 2;
grid-column-start: 1;
grid-column-end: 4;
font-size: small;
margin-top: 2px;
margin-bottom: 2px;
.diario-context {
font-style: italic;
}
}
.diario-timestamp {
grid-row: 3;
grid-column: 1;
font-size: x-small;
margin-top: 2px;
margin-bottom: 2px;
}
.diario-created {
grid-row: 3;
grid-column: 2;
justify-self: end;
font-size: x-small;
margin-top: 2px;
margin-bottom: 2px;
}
.diario-id {
grid-row: 3;
grid-column: 3;
justify-self: end;
font-size: x-small;
margin-top: 2px;
margin-bottom: 2px;
}
&.diario-spoiler {
color: transparent;
background-color: fade(@pastel-red, 10%);
border-left: 3px solid @pastel-red;
&:hover {
color: @pastel-red;
}
}
}
//Multicolumn lists
ul.multicolumn, ol.multicolumn {
column-width: 300px;
}
/*** Page specific classes ***/
.mcstatus-grid {
display: grid;
grid-template-columns: 64px auto auto;
grid-column-gap: 12px;
align-items: center;
.mcstatus-icon {
grid-column: 1;
grid-row-start: 1;
grid-row-end: 3;
width: 64px;
height: 64px;
.mcstatus-icon-img {
width: 64px;
height: 64px;
}
}
.mcstatus-address {
font-weight: bold;
grid-column: 2;
justify-self: start;
grid-row: 1;
.server-up {
color: @pastel-lime;
}
.server-down {
color: @pastel-red;
}
}
.mcstatus-description {
grid-column: 2;
justify-self: start;
grid-row: 2;
}
.mcstatus-players {
grid-column: 3;
justify-self: end;
grid-row: 1;
}
.mcstatus-version {
grid-column: 3;
justify-self: end;
grid-row: 2;
}
}
.profile {
.profile-links {
.links-linked {
font-family: @monospace-fonts;
}
.links-missing {
color: @pastel-red;
}
}
.profile-stats {
.stats-value {
font-weight: bold;
}
}
}
.tg-login-container {
width: 238px;
height: 40px;
}

View file

@ -1,309 +0,0 @@
@font-face {
font-family: 'TF2';
src: url('https://scaleway.steffo.eu/tf2.ttf');
}
@font-face {
font-family: 'TF2 Build';
src: url('https://scaleway.steffo.eu/tf2build.ttf');
}
@font-face {
font-family: 'TF2 Professor';
src: url('https://scaleway.steffo.eu/tf2professor.ttf');
}
@font-face {
font-family: 'TF2 Secondary';
src: url('https://scaleway.steffo.eu/tf2secondary.ttf');
}
body {
font-family: "TF2 Secondary", sans-serif;
background-color: #2e2a28;
color: #d2cdc8;
box-sizing: border-box;
}
a {
color: #9a4713;
text-decoration: none;
}
a:hover {
color: #e88345;
}
a:active {
color: white;
}
a:not(.no-icon)::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f0c1";
margin-right: 4px;
}
a:not(.no-icon)[href^="https://t.me"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f2c6";
margin-right: 3px;
}
a:not(.no-icon)[href^="https://www.youtube.com"]::before,
a:not(.no-icon)[href^="https://youtu.be"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f167";
margin-right: 3px;
}
a:not(.no-icon)[href^="https://vimeo.com"]::before,
a:not(.no-icon)[href^="https://player.vimeo.com"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f27d";
margin-right: 4px;
}
a:not(.no-icon)[href^="https://github.com"]::before,
a:not(.no-icon)[href^="https://gist.github.com"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f09b";
margin-right: 4px;
}
a:not(.no-icon)[href^="https://itch.io"]::before,
a:not(.no-icon)[href^="https://steffo.itch.io"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f83a";
margin-right: 3px;
}
a:not(.no-icon)[href^="https://www.kickstarter.com"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f3bb";
margin-right: 4px;
}
a:not(.no-icon)[href^="https://reddit.com"]::before,
a:not(.no-icon)[href^="https://new.reddit.com"]::before,
a:not(.no-icon)[href^="https://old.reddit.com"]::before,
a:not(.no-icon)[href^="https://redd.it"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f281";
margin-right: 3px;
}
a:not(.no-icon)[href^="https://www.twitch.tv"]::before,
a:not(.no-icon)[href^="https://clips.twitch.tv"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f1e8";
margin-right: 4px;
}
a:not(.no-icon)[href^="https://store.steampowered.com"]::before,
a:not(.no-icon)[href^="https://steamcommunity.com"]::before,
a:not(.no-icon)[href^="https://partner.steamgames.com"]::before,
a:not(.no-icon)[href^="steam:"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f1b6";
margin-right: 4px;
}
a:not(.no-icon)[href^="https://twitter.com"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f099";
margin-right: 3px;
}
a:not(.no-icon)[href^="https://it.wikipedia.org"]::before,
a:not(.no-icon)[href^="https://en.wikipedia.org"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f266";
margin-right: 3px;
}
a:not(.no-icon)[href^="#"]::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f13d";
margin-right: 3px;
}
a:not(.no-icon)[href^="http:"]::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f09c";
margin-right: 4px;
}
a:not(.no-icon)[href^="magnet:"]::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f076";
margin-right: 4px;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: "TF2 Build", sans-serif;
color: #ffffff;
margin-top: 0;
margin-bottom: 0;
font-weight: normal;
}
code {
font-family: "Consolas", "Source Code Pro", monospace;
}
blockquote {
color: #d2cdc8;
border-left: 3px solid #d2cdc8;
background-color: rgba(210, 205, 200, 0.1);
padding: 2px 4px 2px 8px;
margin: 8px;
}
textarea {
background-color: rgba(210, 205, 200, 0.1);
color: #d2cdc8;
border: 1px solid #d2cdc8;
padding: 2px;
margin: 1px;
font-size: small;
font-family: "Consolas", "Source Code Pro", monospace;
width: 100%;
height: 300px;
}
button,
input[type="submit"],
.btn {
background-color: rgba(210, 205, 200, 0.1);
color: #d2cdc8 !important;
border: 1px solid #d2cdc8;
border-radius: 0;
padding: 2px 8px;
margin: 1px;
font-size: medium;
font-family: sans-serif;
text-decoration: none;
cursor: default;
}
button:hover,
input[type="submit"]:hover,
.btn:hover {
background-color: rgba(210, 205, 200, 0.2);
color: #ffffff;
border-color: #ffffff;
}
button:active,
input[type="submit"]:active,
.btn:active {
background-color: rgba(210, 205, 200, 0.3);
color: white;
border-color: white;
}
pre {
margin: 0;
}
img {
margin-left: auto;
margin-right: auto;
display: block;
max-width: 100%;
}
nav {
display: flex;
justify-content: space-between;
height: 50px;
line-height: 50px;
}
nav .nav-left {
text-align: left;
}
nav .nav-center {
text-align: center;
}
nav .nav-right {
text-align: right;
}
nav .nav-image {
height: 50px;
display: none;
vertical-align: middle;
}
nav .nav-sitename {
font-weight: bold;
}
nav .nav-login-unavailable {
opacity: 0.25;
}
.horizontal-container-main {
display: flex;
justify-content: center;
align-content: center;
flex-direction: column;
}
@media (min-width: 800px) {
.horizontal-container-main {
flex-direction: row;
}
}
.vertical-main {
width: 100%;
}
@media (min-width: 800px) {
.vertical-main {
width: 800px;
}
}
@media (min-width: 1200px) {
.vertical-main {
width: 1200px;
}
}
.box {
background-color: #d2cdc8;
color: black;
border-radius: 2px;
padding: 4px;
margin: 8px;
}
.dbox {
margin: 8px;
}
.dbox .dbox-top {
display: flex;
justify-content: space-between;
background-color: #9a4713;
padding: 8px;
border-radius: 4px 4px 0 0;
color: #ffffff;
font-family: "TF2 Build", sans-serif;
font-weight: normal;
}
.dbox .dbox-top .left {
align-self: flex-start;
}
.dbox .dbox-top .right {
align-self: flex-end;
}
.dbox .dbox-top a {
color: #00caca;
}
.dbox .dbox-bot {
background-color: #d2cdc8;
color: black;
padding: 8px;
border-radius: 0 0 4px 4px;
}
.dbox .dbox-bot h1,
.dbox .dbox-bot h2,
.dbox .dbox-bot h3,
.dbox .dbox-bot h4,
.dbox .dbox-bot h5,
.dbox .dbox-bot h6 {
color: black;
}
.spoiler {
color: rgba(0, 0, 0, 0);
border: 1px solid rgba(210, 205, 200, 0.1);
border-radius: 2px;
}
.spoiler:hover {
color: #d2cdc8;
}
.disabled {
opacity: 0.3;
}
/*# sourceMappingURL=tf2.css.map */

View file

@ -1 +0,0 @@
{"version":3,"sources":["tf2.less"],"names":[],"mappings":"AAMA;EACI,aAAa,KAAb;EACA,SAAS,qCAAT;;AAGJ;EACI,aAAa,WAAb;EACA,SAAS,0CAAT;;AAGJ;EACI,aAAa,eAAb;EACA,SAAS,8CAAT;;AAGJ;EACI,aAAa,eAAb;EACA,SAAS,8CAAT;;AAOJ;EACI,aALS,2BAKT;EACA,yBAAA;EACA,cAAA;EACA,sBAAA;;AAGJ;EACI,cAAA;EACA,qBAAA;;AAEA,CAAC;EACG,cAAA;;AAGJ,CAAC;EACG,YAAA;;AAOA,CAFH,IAAI,UAEA;EACG,aAAa,qBAAb;EACA,iBAAA;EACA,SAAS,OAAT;EACA,iBAAA;;AAIJ,CAVH,IAAI,UAUA,sBAAsB;EACnB,aAAa,uBAAb;EACA,iBAAA;EACA,SAAS,OAAT;EACA,iBAAA;;AAIJ,CAlBH,IAAI,UAkBA,iCAAiC;AAAU,CAlB/C,IAAI,UAkB4C,0BAA0B;EACnE,aAAa,uBAAb;EACA,iBAAA;EACA,SAAS,OAAT;EACA,iBAAA;;AAIJ,CA1BH,IAAI,UA0BA,2BAA2B;AAAU,CA1BzC,IAAI,UA0BsC,kCAAkC;EACrE,aAAa,uBAAb;EACA,iBAAA;EACA,SAAS,OAAT;EACA,iBAAA;;AAIJ,CAlCH,IAAI,UAkCA,4BAA4B;AAAU,CAlC1C,IAAI,UAkCuC,iCAAiC;EACrE,aAAa,uBAAb;EACA,iBAAA;EACA,SAAS,OAAT;EACA,iBAAA;;AAIJ,CA1CH,IAAI,UA0CA,yBAAyB;AAAU,CA1CvC,IAAI,UA0CoC,gCAAgC;EACjE,aAAa,uBAAb;EACA,iBAAA;EACA,SAAS,OAAT;EACA,iBAAA;;AAIJ,CAlDH,IAAI,UAkDA,qCAAqC;EAClC,aAAa,uBAAb;EACA,iBAAA;EACA,SAAS,OAAT;EACA,iBAAA;;AAIJ,CA1DH,IAAI,UA0DA,4BAA4B;AAAU,CA1D1C,IAAI,UA0DuC,gCAAgC;AAAU,CA1DrF,IAAI,UA0DkF,gCAAgC;AAAU,CA1DhI,IAAI,UA0D6H,yBAAyB;EACnJ,aAAa,uBAAb;EACA,iBAAA;EACA,SAAS,OAAT;EACA,iBAAA;;AAIJ,CAlEH,IAAI,UAkEA,+BAA+B;AAAU,CAlE7C,IAAI,UAkE0C,iCAAiC;EACxE,aAAa,uBAAb;EACA,iBAAA;EACA,SAAS,OAAT;EACA,iBAAA;;AAIJ,CA1EH,IAAI,UA0EA,wCAAwC;AAAU,CA1EtD,IAAI,UA0EmD,oCAAoC;AAAU,CA1ErG,IAAI,UA0EkG,wCAAwC;AAAU,CA1ExJ,IAAI,UA0EqJ,gBAAgB;EAClK,aAAa,uBAAb;EACA,iBAAA;EACA,SAAS,OAAT;EACA,iBAAA;;AAIJ,CAlFH,IAAI,UAkFA,6BAA6B;EAC1B,aAAa,uBAAb;EACA,iBAAA;EACA,SAAS,OAAT;EACA,iBAAA;;AAIJ,CA1FH,IAAI,UA0FA,kCAAkC;AAAU,CA1FhD,IAAI,UA0F6C,kCAAkC;EAC5E,aAAa,uBAAb;EACA,iBAAA;EACA,SAAS,OAAT;EACA,iBAAA;;AAIJ,CAlGH,IAAI,UAkGA,WAAW;EACR,aAAa,qBAAb;EACA,iBAAA;EACA,SAAS,OAAT;EACA,iBAAA;;AAIJ,CA1GH,IAAI,UA0GA,eAAe;EACZ,aAAa,qBAAb;EACA,iBAAA;EACA,SAAS,OAAT;EACA,iBAAA;;AAIJ,CAlHH,IAAI,UAkHA,iBAAiB;EACd,aAAa,qBAAb;EACA,iBAAA;EACA,SAAS,OAAT;EACA,iBAAA;;AAKZ;AAAI;AAAI;AAAI;AAAI;AAAI;EAChB,aAAa,uBAAb;EACA,cAAA;EACA,aAAA;EACA,gBAAA;EACA,mBAAA;;AAGJ;EACI,aA5Jc,YAAY,4BA4J1B;;AAGJ;EACI,cAAA;EACA,8BAAA;EACA,0CAAA;EACA,wBAAA;EACA,WAAA;;AAGJ;EACI,0CAAA;EACA,cAAA;EACA,yBAAA;EACA,YAAA;EACA,WAAA;EACA,gBAAA;EACA,aA9Kc,YAAY,4BA8K1B;EACA,WAAA;EACA,aAAA;;AAGJ;AAAQ,KAAK;AAAiB;EAC1B,0CAAA;EACA,cAAA;EACA,yBAAA;EACA,gBAAA;EACA,gBAAA;EACA,WAAA;EACA,iBAAA;EACA,uBAAA;EACA,qBAAA;EACA,eAAA;;AAEA,MAAC;AAAD,KAZS,eAYR;AAAD,IAAC;EACG,0CAAA;EACA,cAAA;EACA,qBAAA;;AAGJ,MAAC;AAAD,KAlBS,eAkBR;AAAD,IAAC;EACG,0CAAA;EACA,YAAA;EACA,mBAAA;;AAIR;EACI,SAAA;;AAGJ;EACI,iBAAA;EACA,kBAAA;EACA,cAAA;EACA,eAAA;;AAGJ;EACI,aAAA;EACA,8BAAA;EACA,YAAA;EACA,iBAAA;;AAJJ,GAMI;EACI,gBAAA;;AAPR,GAUI;EACI,kBAAA;;AAXR,GAcI;EACI,iBAAA;;AAfR,GAkBI;EACI,YAAA;EACA,aAAA;EACA,sBAAA;;AArBR,GAwBI;EACI,iBAAA;;AAzBR,GA4BI;EACI,aAAA;;AAMR;EACI,aAAA;EACA,uBAAA;EACA,qBAAA;EACA,sBAAA;;AAEA,QACA;EADA;IAEI,mBAAA;;;AAIR;EACI,WAAA;;AAEA,QACA;EADA;IAEI,YAAA;;;AAGJ,QACA;EADA;IAEI,aAAA;;;AAIR;EACI,yBAAA;EACA,YAAA;EACA,kBAAA;EACA,YAAA;EACA,WAAA;;AAGJ;EACI,WAAA;;AADJ,KAGI;EACI,aAAA;EACA,8BAAA;EACA,yBAAA;EACA,YAAA;EACA,0BAAA;EACA,cAAA;EACA,aAAa,uBAAb;EACA,mBAAA;;AAXR,KAGI,UAUI;EACI,sBAAA;;AAdZ,KAGI,UAcI;EACI,oBAAA;;AAlBZ,KAGI,UAkBI;EACI,cAAA;;AAtBZ,KA0BI;EACI,yBAAA;EACA,YAAA;EACA,YAAA;EACA,0BAAA;;AA9BR,KA0BI,UAMI;AAhCR,KA0BI,UAMQ;AAhCZ,KA0BI,UAMY;AAhChB,KA0BI,UAMgB;AAhCpB,KA0BI,UAMoB;AAhCxB,KA0BI,UAMwB;EAChB,YAAA;;AAKZ;EACI,uBAAA;EACA,0CAAA;EACA,kBAAA;;AAEA,QAAC;EACG,cAAA;;AAIR;EACI,YAAA","file":"tf2.css"}

View file

@ -1,362 +0,0 @@
@bg: #2e2a28; //Background color
@fg: #d2cdc8; //Foreground color
@li: #9a4713; //Link
@ec: #ffffff; //Extra color
@font-face {
font-family: 'TF2';
src: url('https://scaleway.steffo.eu/tf2.ttf');
}
@font-face {
font-family: 'TF2 Build';
src: url('https://scaleway.steffo.eu/tf2build.ttf');
}
@font-face {
font-family: 'TF2 Professor';
src: url('https://scaleway.steffo.eu/tf2professor.ttf');
}
@font-face {
font-family: 'TF2 Secondary';
src: url('https://scaleway.steffo.eu/tf2secondary.ttf');
}
@main-fonts: "TF2 Secondary", sans-serif;
@monospace-fonts: "Consolas", "Source Code Pro", monospace;
//General
body {
font-family: @main-fonts;
background-color: @bg;
color: @fg;
box-sizing: border-box;
}
a {
color: @li;
text-decoration: none;
&:hover {
color: lighten(@li, 25%);
}
&:active {
color: white;
}
//Icon link
//noinspection CssNoGenericFontName
&:not(.no-icon) {
//External link
&::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f0c1";
margin-right: 4px;
}
//Telegram link
&[href^="https://t.me"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f2c6";
margin-right: 3px;
}
//YouTube link
&[href^="https://www.youtube.com"]::before, &[href^="https://youtu.be"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f167";
margin-right: 3px;
}
//Vimeo link
&[href^="https://vimeo.com"]::before, &[href^="https://player.vimeo.com"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f27d";
margin-right: 4px;
}
//GitHub link
&[href^="https://github.com"]::before, &[href^="https://gist.github.com"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f09b";
margin-right: 4px;
}
//Itchio link
&[href^="https://itch.io"]::before, &[href^="https://steffo.itch.io"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f83a";
margin-right: 3px;
}
//Kickstarter link
&[href^="https://www.kickstarter.com"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f3bb";
margin-right: 4px;
}
//Reddit link
&[href^="https://reddit.com"]::before, &[href^="https://new.reddit.com"]::before, &[href^="https://old.reddit.com"]::before, &[href^="https://redd.it"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f281";
margin-right: 3px;
}
//Twitch link
&[href^="https://www.twitch.tv"]::before, &[href^="https://clips.twitch.tv"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f1e8";
margin-right: 4px;
}
//Steam link
&[href^="https://store.steampowered.com"]::before, &[href^="https://steamcommunity.com"]::before, &[href^="https://partner.steamgames.com"]::before, &[href^="steam:"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f1b6";
margin-right: 4px;
}
//Twitter link
&[href^="https://twitter.com"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f099";
margin-right: 3px;
}
//Wikipedia link
&[href^="https://it.wikipedia.org"]::before, &[href^="https://en.wikipedia.org"]::before {
font-family: "Font Awesome 5 Brands";
font-weight: bold;
content: "\f266";
margin-right: 3px;
}
//Anchor
&[href^="#"]::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f13d";
margin-right: 3px;
}
//Unsafe link
&[href^="http:"]::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f09c";
margin-right: 4px;
}
//Magnet link
&[href^="magnet:"]::before {
font-family: "Font Awesome 5 Free";
font-weight: bold;
content: "\f076";
margin-right: 4px;
}
}
}
h1, h2, h3, h4, h5, h6 {
font-family: "TF2 Build", sans-serif;
color: @ec;
margin-top: 0;
margin-bottom: 0;
font-weight: normal;
}
code {
font-family: @monospace-fonts;
}
blockquote {
color: @fg;
border-left: 3px solid @fg;
background-color: fade(@fg, 10%);
padding: 2px 4px 2px 8px;
margin: 8px;
}
textarea {
background-color: fade(@fg, 10%);
color: @fg;
border: 1px solid @fg;
padding: 2px;
margin: 1px;
font-size: small;
font-family: @monospace-fonts;
width: 100%;
height: 300px;
}
button, input[type="submit"], .btn {
background-color: fade(@fg, 10%);
color: @fg !important;
border: 1px solid @fg;
border-radius: 0;
padding: 2px 8px;
margin: 1px;
font-size: medium;
font-family: sans-serif;
text-decoration: none;
cursor: default;
&:hover {
background-color: fade(@fg, 20%);
color: lighten(@fg, 25%);
border-color: lighten(@fg, 25%);
}
&:active {
background-color: fade(@fg, 30%);
color: white;
border-color: white;
}
}
pre {
margin: 0;
}
img {
margin-left: auto;
margin-right: auto;
display: block;
max-width: 100%;
}
nav {
display: flex;
justify-content: space-between;
height: 50px;
line-height: 50px;
.nav-left {
text-align: left;
}
.nav-center {
text-align: center;
}
.nav-right {
text-align: right;
}
.nav-image {
height: 50px;
display: none;
vertical-align: middle;
}
.nav-sitename {
font-weight: bold;
}
.nav-login-unavailable {
opacity: 0.25;
}
}
//Elements
.horizontal-container-main {
display: flex;
justify-content: center;
align-content: center;
flex-direction: column;
@media (min-width: 800px)
{
flex-direction: row;
}
}
.vertical-main {
width: 100%;
@media (min-width: 800px)
{
width: 800px;
}
@media (min-width: 1200px)
{
width: 1200px;
}
}
.box {
background-color: @fg;
color: black;
border-radius: 2px;
padding: 4px;
margin: 8px;
}
.dbox {
margin: 8px;
.dbox-top {
display: flex;
justify-content: space-between;
background-color: @li;
padding: 8px;
border-radius: 4px 4px 0 0;
color: @ec;
font-family: "TF2 Build", sans-serif;
font-weight: normal;
.left {
align-self: flex-start;
}
.right {
align-self: flex-end;
}
a {
color: #00caca;
}
}
.dbox-bot {
background-color: @fg;
color: black;
padding: 8px;
border-radius: 0 0 4px 4px;
h1, h2, h3, h4, h5, h6 {
color: black;
}
}
}
.spoiler {
color: rgba(0, 0, 0, 0);
border: 1px solid fade(@fg, 10%);
border-radius: 2px;
&:hover {
color: @fg;
}
}
.disabled {
opacity: 0.3;
}

View file

@ -1,67 +0,0 @@
<!DOCTYPE html>
<html lang="it">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Stefano Pigozzi">
<meta name="keywords" content="Royal Games,RYG,Gaming,Videogames,Community">
<meta name="description" content="Royal Games Community">
<meta property="og:site_name" content="Royal Games">
<title>{% block title %}{% endblock %} - {{ config["SITE_NAME"] }}</title>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css">
{% if css %}
<link rel="stylesheet" href="{{ url_for("static", filename=css) }}">
{% else %}
<link rel="stylesheet" href="{{ url_for("static", filename="ryg.css") }}">
{% endif %}
<link rel="icon" href="{{ url_for("static", filename="logo.png") }}" type="image/png">
{% block head %}{% endblock %}
</head>
<body>
<nav>
<div class="nav-left">
<a class="nav-site no-icon" href="{{ url_for("home.home_index") }}">
<img class="nav-image" alt="" src="{{ url_for("static", filename="logo.svg") }}">
<span class="nav-sitename">{{ config["SITE_NAME"] }}</span>
</a>
<span class="nav-modules">
<a class="no-icon" href="{{ url_for("profile.profile_index") }}">Noi</a>
<a class="no-icon" href="{{ url_for("wikiview.wikiview_index") }}">Wiki</a>
<a class="no-icon" href="{{ url_for("diarioview.diarioview_page", page=1) }}">Diario</a>
</span>
</div>
<div class="nav-center">
</div>
<div class="nav-right">
<span>
{% if session["royal"] %}
<a href="{{ url_for("profile.profile_page", username=session["royal"]["username"]) }}" class="no-icon nav-profile">
<span class="nav-accountname">{{ session["royal"]["username"] }}</span>
{% if session["royal"]["avatar"] %}
<img class="nav-image" alt="" src="{{ session["royal"]["avatar"] }}">
{% else %}
<img class="nav-image" alt="" src="{{ url_for("static", filename="generic.png") }}">
{% endif %}
</a>
{% else %}
<span class="nav-login">
<a class="no-icon" href="{{ url_for("tglogin.tglogin_index") }}">
Login
<img class="nav-image disabled" alt="" src="{{ url_for("static", filename="generic.png") }}">
</a>
</span>
{% endif %}
</span>
</div>
</nav>
<div class="horizontal-container-main">
<div class="vertical-main">
{% block content %}{% endblock %}
</div>
</div>
<div id="foot-scripts">
{% block footscripts %}{% endblock %}
</div>
</body>
</html>

View file

@ -1,23 +0,0 @@
{% extends "base.html" %}
{% block title %}
Errore
{% endblock %}
{% block content %}
<div class="error">
<div class="dbox error-dbox">
<div class="dbox-top">
<span class="left">Errore!</span>
</div>
<div class="dbox-bot">
<h1>
{{ title }}
</h1>
<p>
{{ reason }}
</p>
</div>
</div>
</div>
{% endblock %}

View file

@ -5,7 +5,7 @@ with open("README.md", "r") as f:
long_description = f.read()
with open("requirements.txt", "r") as f:
install_requires = f.readlines()
install_requires = [line for line in f.readlines() if not line.startswith("#")]
setuptools.setup(
name="royalnet",