This commit is contained in:
2023-12-25 02:09:05 +01:00
parent 512e04a3da
commit a12d9dd780
26 changed files with 17358 additions and 22 deletions

View File

@ -2,6 +2,10 @@ import os
from pathlib import Path from pathlib import Path
import sentry_sdk import sentry_sdk
from dotenv import find_dotenv, load_dotenv
# Load environment variables from a .env file
load_dotenv(dotenv_path=find_dotenv(), verbose=True)
# Run Django in debug mode # Run Django in debug mode
DEBUG: bool = os.getenv(key="DEBUG", default="True").lower() == "true" DEBUG: bool = os.getenv(key="DEBUG", default="True").lower() == "true"
@ -28,7 +32,11 @@ ADMINS: list[tuple[str, str]] = [
SECRET_KEY: str = os.getenv("SECRET_KEY", default="") SECRET_KEY: str = os.getenv("SECRET_KEY", default="")
# A list of strings representing the host/domain names that this Django site can serve. # A list of strings representing the host/domain names that this Django site can serve.
ALLOWED_HOSTS: list[str] = [".localhost", "127.0.0.1"] ALLOWED_HOSTS: list[str] = [
"ttvdrops.lovinator.space",
".localhost",
"127.0.0.1",
]
# The time zone that Django will use to display datetimes in templates and to interpret datetimes entered in forms # The time zone that Django will use to display datetimes in templates and to interpret datetimes entered in forms
TIME_ZONE = "Europe/Stockholm" TIME_ZONE = "Europe/Stockholm"
@ -122,7 +130,7 @@ WSGI_APPLICATION = "core.wsgi.application"
DATABASES: dict[str, dict[str, str]] = { DATABASES: dict[str, dict[str, str]] = {
"default": { "default": {
"ENGINE": "django.db.backends.postgresql", "ENGINE": "django.db.backends.postgresql",
"NAME": "postgres", "NAME": "ttvdrops",
"USER": os.getenv(key="POSTGRES_USER", default=""), "USER": os.getenv(key="POSTGRES_USER", default=""),
"PASSWORD": os.getenv(key="POSTGRES_PASSWORD", default=""), "PASSWORD": os.getenv(key="POSTGRES_PASSWORD", default=""),
"HOST": os.getenv(key="POSTGRES_HOST", default=""), "HOST": os.getenv(key="POSTGRES_HOST", default=""),
@ -157,9 +165,10 @@ STORAGES: dict[str, dict[str, str]] = {
# TODO: Disallow specific commands. See https://redis.io/docs/management/security/#disallowing-specific-commands # TODO: Disallow specific commands. See https://redis.io/docs/management/security/#disallowing-specific-commands
REDIS_PASSWORD: str = os.getenv(key="REDIS_PASSWORD", default="") REDIS_PASSWORD: str = os.getenv(key="REDIS_PASSWORD", default="")
REDIS_HOST: str = os.getenv(key="REDIS_HOST", default="") REDIS_HOST: str = os.getenv(key="REDIS_HOST", default="")
REDIS_PORT: str = os.getenv(key="REDIS_PORT", default="6380")
CACHES: dict[str, dict[str, str]] = { CACHES: dict[str, dict[str, str]] = {
"default": { "default": {
"BACKEND": "django.core.cache.backends.redis.RedisCache", "BACKEND": "django.core.cache.backends.redis.RedisCache",
"LOCATION": f"redis://:{REDIS_PASSWORD}@{REDIS_HOST}:6379", "LOCATION": f"redis://:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/0",
}, },
} }

View File

@ -1,22 +1,7 @@
"""
URL configuration for core project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/5.0/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin from django.contrib import admin
from django.urls import path from django.urls import include, path
urlpatterns = [ urlpatterns = [
path("admin/", admin.site.urls), path("admin/", admin.site.urls),
path("", include("twitch_drop_notifier.urls")),
] ]

285
poetry.lock generated
View File

@ -128,6 +128,46 @@ files = [
{file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"},
] ]
[[package]]
name = "click"
version = "8.1.7"
description = "Composable command line interface toolkit"
optional = false
python-versions = ">=3.7"
files = [
{file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"},
{file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"},
]
[package.dependencies]
colorama = {version = "*", markers = "platform_system == \"Windows\""}
[[package]]
name = "colorama"
version = "0.4.6"
description = "Cross-platform colored terminal text."
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
files = [
{file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
]
[[package]]
name = "cssbeautifier"
version = "1.14.11"
description = "CSS unobfuscator and beautifier."
optional = false
python-versions = "*"
files = [
{file = "cssbeautifier-1.14.11.tar.gz", hash = "sha256:40544c2b62bbcb64caa5e7f37a02df95654e5ce1bcacadac4ca1f3dc89c31513"},
]
[package.dependencies]
editorconfig = ">=0.12.2"
jsbeautifier = "*"
six = ">=1.13.0"
[[package]] [[package]]
name = "distlib" name = "distlib"
version = "0.3.8" version = "0.3.8"
@ -170,6 +210,41 @@ files = [
{file = "django_simple_history-3.4.0-py3-none-any.whl", hash = "sha256:992dcca3cddc0b67b470fc91f77292e2d2a6010d37c9eac3536e9d80e8754032"}, {file = "django_simple_history-3.4.0-py3-none-any.whl", hash = "sha256:992dcca3cddc0b67b470fc91f77292e2d2a6010d37c9eac3536e9d80e8754032"},
] ]
[[package]]
name = "djlint"
version = "1.34.1"
description = "HTML Template Linter and Formatter"
optional = false
python-versions = ">=3.8.0,<4.0.0"
files = [
{file = "djlint-1.34.1-py3-none-any.whl", hash = "sha256:96ff1c464fb6f061130ebc88663a2ea524d7ec51f4b56221a2b3f0320a3cfce8"},
{file = "djlint-1.34.1.tar.gz", hash = "sha256:db93fa008d19eaadb0454edf1704931d14469d48508daba2df9941111f408346"},
]
[package.dependencies]
click = ">=8.0.1,<9.0.0"
colorama = ">=0.4.4,<0.5.0"
cssbeautifier = ">=1.14.4,<2.0.0"
html-tag-names = ">=0.1.2,<0.2.0"
html-void-elements = ">=0.1.0,<0.2.0"
jsbeautifier = ">=1.14.4,<2.0.0"
json5 = ">=0.9.11,<0.10.0"
pathspec = ">=0.12.0,<0.13.0"
PyYAML = ">=6.0,<7.0"
regex = ">=2023.0.0,<2024.0.0"
tqdm = ">=4.62.2,<5.0.0"
[[package]]
name = "editorconfig"
version = "0.12.3"
description = "EditorConfig File Locator and Interpreter for Python"
optional = false
python-versions = "*"
files = [
{file = "EditorConfig-0.12.3-py3-none-any.whl", hash = "sha256:6b0851425aa875b08b16789ee0eeadbd4ab59666e9ebe728e526314c4a2e52c1"},
{file = "EditorConfig-0.12.3.tar.gz", hash = "sha256:57f8ce78afcba15c8b18d46b5170848c88d56fd38f05c2ec60dbbfcb8996e89e"},
]
[[package]] [[package]]
name = "filelock" name = "filelock"
version = "3.13.1" version = "3.13.1"
@ -374,6 +449,28 @@ files = [
{file = "hiredis-2.3.2.tar.gz", hash = "sha256:733e2456b68f3f126ddaf2cd500a33b25146c3676b97ea843665717bda0c5d43"}, {file = "hiredis-2.3.2.tar.gz", hash = "sha256:733e2456b68f3f126ddaf2cd500a33b25146c3676b97ea843665717bda0c5d43"},
] ]
[[package]]
name = "html-tag-names"
version = "0.1.2"
description = "List of known HTML tag names"
optional = false
python-versions = ">=3.7,<4.0"
files = [
{file = "html-tag-names-0.1.2.tar.gz", hash = "sha256:04924aca48770f36b5a41c27e4d917062507be05118acb0ba869c97389084297"},
{file = "html_tag_names-0.1.2-py3-none-any.whl", hash = "sha256:eeb69ef21078486b615241f0393a72b41352c5219ee648e7c61f5632d26f0420"},
]
[[package]]
name = "html-void-elements"
version = "0.1.0"
description = "List of HTML void tag names."
optional = false
python-versions = ">=3.7,<4.0"
files = [
{file = "html-void-elements-0.1.0.tar.gz", hash = "sha256:931b88f84cd606fee0b582c28fcd00e41d7149421fb673e1e1abd2f0c4f231f0"},
{file = "html_void_elements-0.1.0-py3-none-any.whl", hash = "sha256:784cf39db03cdeb017320d9301009f8f3480f9d7b254d0974272e80e0cb5e0d2"},
]
[[package]] [[package]]
name = "identify" name = "identify"
version = "2.5.33" version = "2.5.33"
@ -388,6 +485,34 @@ files = [
[package.extras] [package.extras]
license = ["ukkonen"] license = ["ukkonen"]
[[package]]
name = "jsbeautifier"
version = "1.14.11"
description = "JavaScript unobfuscator and beautifier."
optional = false
python-versions = "*"
files = [
{file = "jsbeautifier-1.14.11.tar.gz", hash = "sha256:6b632581ea60dd1c133cd25a48ad187b4b91f526623c4b0fb5443ef805250505"},
]
[package.dependencies]
editorconfig = ">=0.12.2"
six = ">=1.13.0"
[[package]]
name = "json5"
version = "0.9.14"
description = "A Python implementation of the JSON5 data format."
optional = false
python-versions = "*"
files = [
{file = "json5-0.9.14-py2.py3-none-any.whl", hash = "sha256:740c7f1b9e584a468dbb2939d8d458db3427f2c93ae2139d05f47e453eae964f"},
{file = "json5-0.9.14.tar.gz", hash = "sha256:9ed66c3a6ca3510a976a9ef9b8c0787de24802724ab1860bc0153c7fdd589b02"},
]
[package.extras]
dev = ["hypothesis"]
[[package]] [[package]]
name = "nodeenv" name = "nodeenv"
version = "1.8.0" version = "1.8.0"
@ -402,6 +527,17 @@ files = [
[package.dependencies] [package.dependencies]
setuptools = "*" setuptools = "*"
[[package]]
name = "pathspec"
version = "0.12.1"
description = "Utility library for gitignore style pattern matching of file paths."
optional = false
python-versions = ">=3.8"
files = [
{file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"},
{file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
]
[[package]] [[package]]
name = "pillow" name = "pillow"
version = "10.1.0" version = "10.1.0"
@ -637,6 +773,20 @@ typing-extensions = "*"
[package.extras] [package.extras]
dev = ["black", "flake8", "flake8-black", "isort", "jupyter-console", "mkdocs", "mkdocs-include-markdown-plugin", "mkdocstrings[python]", "pytest", "pytest-asyncio", "pytest-trio", "toml", "tox", "trio", "trio", "trio-typing", "twine", "twisted", "validate-pyproject[all]"] dev = ["black", "flake8", "flake8-black", "isort", "jupyter-console", "mkdocs", "mkdocs-include-markdown-plugin", "mkdocstrings[python]", "pytest", "pytest-asyncio", "pytest-trio", "toml", "tox", "trio", "trio", "trio-typing", "twine", "twisted", "validate-pyproject[all]"]
[[package]]
name = "python-dotenv"
version = "1.0.0"
description = "Read key-value pairs from a .env file and set them as environment variables"
optional = false
python-versions = ">=3.8"
files = [
{file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"},
{file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"},
]
[package.extras]
cli = ["click (>=5.0)"]
[[package]] [[package]]
name = "pyyaml" name = "pyyaml"
version = "6.0.1" version = "6.0.1"
@ -714,6 +864,108 @@ hiredis = {version = ">=1.0.0", optional = true, markers = "extra == \"hiredis\"
hiredis = ["hiredis (>=1.0.0)"] hiredis = ["hiredis (>=1.0.0)"]
ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"]
[[package]]
name = "regex"
version = "2023.12.25"
description = "Alternative regular expression module, to replace re."
optional = false
python-versions = ">=3.7"
files = [
{file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"},
{file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"},
{file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"},
{file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"},
{file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"},
{file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"},
{file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"},
{file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"},
{file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"},
{file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"},
{file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"},
{file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"},
{file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"},
{file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"},
{file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"},
{file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"},
{file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"},
{file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"},
{file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"},
{file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"},
{file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"},
{file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"},
{file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"},
{file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"},
{file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"},
{file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"},
{file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"},
{file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"},
{file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"},
{file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"},
{file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"},
{file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"},
{file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"},
{file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"},
{file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"},
{file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"},
{file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"},
{file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"},
{file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"},
{file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"},
{file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"},
{file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"},
{file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"},
{file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"},
{file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"},
{file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"},
{file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"},
{file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"},
{file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"},
{file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"},
{file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"},
{file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"},
{file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"},
{file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"},
{file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"},
{file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"},
{file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"},
{file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"},
{file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"},
{file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"},
{file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"},
{file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"},
{file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"},
{file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"},
{file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"},
{file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"},
{file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"},
{file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"},
{file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"},
{file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"},
{file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"},
{file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"},
{file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"},
{file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"},
{file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"},
{file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"},
{file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"},
{file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"},
{file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"},
{file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"},
{file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"},
{file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"},
{file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"},
{file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"},
{file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"},
{file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"},
{file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"},
{file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"},
{file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"},
{file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"},
{file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"},
{file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"},
{file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"},
]
[[package]] [[package]]
name = "selectolax" name = "selectolax"
version = "0.3.17" version = "0.3.17"
@ -844,6 +1096,17 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments
testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"]
[[package]]
name = "six"
version = "1.16.0"
description = "Python 2 and 3 compatibility utilities"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
files = [
{file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
{file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
]
[[package]] [[package]]
name = "sqlparse" name = "sqlparse"
version = "0.4.4" version = "0.4.4"
@ -860,6 +1123,26 @@ dev = ["build", "flake8"]
doc = ["sphinx"] doc = ["sphinx"]
test = ["pytest", "pytest-cov"] test = ["pytest", "pytest-cov"]
[[package]]
name = "tqdm"
version = "4.66.1"
description = "Fast, Extensible Progress Meter"
optional = false
python-versions = ">=3.7"
files = [
{file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"},
{file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"},
]
[package.dependencies]
colorama = {version = "*", markers = "platform_system == \"Windows\""}
[package.extras]
dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"]
notebook = ["ipywidgets (>=6)"]
slack = ["slack-sdk"]
telegram = ["requests"]
[[package]] [[package]]
name = "typing-extensions" name = "typing-extensions"
version = "4.9.0" version = "4.9.0"
@ -938,4 +1221,4 @@ brotli = ["Brotli"]
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = "^3.12" python-versions = "^3.12"
content-hash = "be31b7d4cd426b08e7ff92a1c8bf15e81afe9558c3cb2bd2ddfeebbb176804d5" content-hash = "27c7698969b74ebf707e6b992a13ddcb62dcb4a5da91bb35bc013a503b8786d0"

View File

@ -16,10 +16,12 @@ playwright = "^1.40.0"
selectolax = "^0.3.17" selectolax = "^0.3.17"
django-simple-history = "^3.4.0" django-simple-history = "^3.4.0"
pillow = "^10.1.0" pillow = "^10.1.0"
python-dotenv = "^1.0.0"
[tool.poetry.group.dev.dependencies] [tool.poetry.group.dev.dependencies]
pre-commit = "^3.6.0" pre-commit = "^3.6.0"
djlint = "^1.34.1"
[build-system] [build-system]
build-backend = "poetry.core.masonry.api" build-backend = "poetry.core.masonry.api"

BIN
static/apple-touch-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

12068
static/bootstrap.css vendored Normal file

File diff suppressed because it is too large Load Diff

1
static/bootstrap.css.map Normal file

File diff suppressed because one or more lines are too long

4494
static/bootstrap.js vendored Normal file

File diff suppressed because it is too large Load Diff

1
static/bootstrap.js.map Normal file

File diff suppressed because one or more lines are too long

6
static/bootstrap.min.css vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

7
static/bootstrap.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

BIN
static/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
static/icon-192.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
static/icon-512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

33
static/icon.svg Normal file
View File

@ -0,0 +1,33 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36">
<path fill="#99AAB5"
d="M30.016 33.887c-.804.654-1.278.708-1.357 1.156-.151.855.855.855 1.86.754 1.006-.101 1.106-.905.905-1.86-.201-.955-1.408-.05-1.408-.05zm-16.591 0c-.804.654-1.278.708-1.357 1.156-.151.855.855.855 1.86.754 1.006-.101 1.106-.905.905-1.86s-1.408-.05-1.408-.05z" />
<path fill="#66757F"
d="M25.039 33.133c-.804.654-1.278.708-1.357 1.156-.151.855.855.855 1.86.754 1.006-.101 1.106-.905.905-1.86-.202-.955-1.408-.05-1.408-.05zm-15.938 0c-.804.654-1.278.708-1.357 1.156-.151.855.855.855 1.86.754 1.006-.101 1.106-.905.905-1.86s-1.408-.05-1.408-.05z" />
<path fill="#66757F"
d="M19.446 23.182c1.879.01 2.338.358 2.734 1.367 1.269 3.234 1.958 2.001 2.264 4.419.311 2.453.272 4.449.708 4.676 1.004.523 2.59.817 1.11-4.995-.396-1.555-.783-4.266-.268-5.843.753-2.303.744-4.007.885-4.641-7.49.29-9.145 5.008-7.433 5.017z" />
<path fill="#CCD6DD"
d="M28.256 16.743c1.993-1.268 3.117-1.982 3.117-6.586 0-.529-.073-1.408-.603-1.408s-.352.526-.352 1.056c0 3.669-1.063 4.679-3.005 5.594-1.517-1.249-4.696-1.236-7.734-1.236-4.181 0-7.57 1.582-7.57 4.866s.89 4.571 5.071 4.571c1.45 0 2.856-.284 4.529-.647 1.837-.398 2.335.63 2.941 1.529 1.941 2.882 2.823 1.706 3.646 3.999.836 2.328 1.231 4.284 1.706 4.411 1.094.293 2.705.235 0-5.117-.724-1.432-1.69-3.995-1.529-5.646.235-2.411-.143-4.073-.143-4.723 0-.123-.062-.561-.074-.663z" />
<path fill="#66757F"
d="M9.702 32.226c-1.444-.38.837-6.535-1.191-8.533-1.355-1.334 1.369-7.759 2.854-7.596 1.483.163.692 4.949.484 6.839-.144 1.308-1.288 5.351-.726 7.671.323 1.336-.694 1.811-1.421 1.619z" />
<path fill="#66757F"
d="M12.318 31.59c-.147 1.785-1.27 2.066-2.616 1.955-1.346-.111-2.408-.571-2.261-2.356s1.357-3.143 2.704-3.033c1.347.111 2.32 1.649 2.173 3.434z" />
<path fill="#CCD6DD"
d="M13.772 32.472c-1.489-.111-.364-6.578-2.722-8.174-1.575-1.066-.064-7.879 1.425-7.988 1.488-.109 1.58 4.741 1.719 6.637.096 1.312-.294 5.496.681 7.675.561 1.254-.352 1.906-1.103 1.85z" />
<path fill="#99AAB5"
d="M20.914 18.184c0 4.6-1.198 7.245-5.767 7.791-5.644.675-10.032-2.963-9.608-7.544.528-5.707 3.78-7.425 7.29-7.431 4.601-.008 8.085 2.582 8.085 7.184z" />
<path fill="#99AAB5"
d="M22.575 18.402c0 4.6-2.859 7.027-7.428 7.573-5.644.675-10.032-2.963-9.608-7.544.528-5.707 3.772-7.665 7.282-7.671 2.598-.005 5.43 0 7.179 2.607 2.123.561 2.575 3.032 2.575 5.035zm-6.132 13.409c.18 1.782-.873 2.262-2.217 2.398-1.344.136-2.471-.124-2.652-1.905-.18-1.782.763-3.338 2.108-3.474 1.344-.136 2.581 1.199 2.761 2.981z" />
<path fill="#66757F"
d="M27.758 31.562c-.043 1.79-1.053 2.138-2.287 2.109-1.234-.029-2.226-.425-2.183-2.215.043-1.79 1.078-3.219 2.312-3.19 1.234.029 2.2 1.506 2.158 3.296z" />
<path fill="#99AAB5"
d="M32.689 31.553c.374 1.751-.528 2.324-1.735 2.582s-2.264.103-2.638-1.648.302-3.382 1.509-3.639c1.207-.258 2.49.953 2.864 2.705zm.512-20.467c.093 1.789-1.087 3.305-2.634 3.385-1.547.08-2.878-1.306-2.971-3.095-.093-1.789.245-4.364 1.792-4.444 1.547-.08 3.72 2.365 3.813 4.154z" />
<path fill="#CCD6DD"
d="M13.231 7.67c.328 1.726-1.846 3.731-4.913 4.172-6.15.884-7.16-2.459-7.291-3.511-.104-.834 2.703-1.177 6.395-3.149 4.572-2.442 5.481.762 5.809 2.488z" />
<path fill="#66757F"
d="M14.179 3.118c-.044-1.161-.352-3.039-3.677-3.039-1.397 0-3.713.424-3.814 1.832-1.81-.351-2.883 1.772-2.287 2.815.619 1.082 1.248 1.099 3.683.654.923-.169 2.007.577 1.801 1.493l-.078.333c-.28 1.191-1.561 2.861-1.561 4.308 0 1.396.967 2.42 2.719 2.36-.119 1.515 1.23 3.12 3.414 3.12 3.115 0 4.424-1.961 4.223-5.631-.081-1.481-.654-3.117-1.81-4.072-.049-2.313-.954-3.972-2.613-4.173z" />
<path fill="#292F33"
d="M2.521 8.864c.001.623.022 1.247-.589 1.363-.372.071-1.213-.281-1.423-1.138-.184-.756.286-1.202.898-1.319.611-.116 1.113.305 1.114 1.094z" />
<circle fill="#292F33" cx="7.715" cy="6.871" r="1" />
<path fill="#99AAB5"
d="M23.341 13.677c1.414.069 2.967 1.455 2.402 2.714s-1.616 1.537-2.564 1.408c-1.106-.151-2.492-.819-2.279-2.594.117-.976 1.111-1.593 2.441-1.528z" />
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -0,0 +1,21 @@
{
"name": "Twitch drops",
"short_name": "Twitch drops",
"description": "Twitch drops notifier, API and more",
"start_url": "/",
"display": "standalone",
"background_color": "#f69435",
"theme_color": "#f69435",
"icons": [
{
"src": "/icon-192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "/icon-512.png",
"type": "image/png",
"sizes": "512x512"
}
]
}

5
static/style.css Normal file
View File

@ -0,0 +1,5 @@
.container {
width: auto;
max-width: 1280px;
padding: 0 15px;
}

90
templates/base.html Normal file
View File

@ -0,0 +1,90 @@
{% load static %}
<!DOCTYPE html>
<html lang="en" data-bs-theme="dark">
<head>
<!-- Head start -->
<meta charset="UTF-8">
<meta name="description"
content="{% block description %}Twitch drops{% endblock %}">
<meta name="keywords"
content="{% block keywords %}Twitch drops{% endblock %}">
<meta name="author" content="TheLovinator">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
{% block title %}<title>Panso</title>{% endblock %}
<link rel="icon" href="{% static 'favicon.ico' %}" sizes="32x32">
<link rel="icon" href="{% static 'icon.svg' %}" type="image/svg+xml">
<link rel="apple-touch-icon" href="{% static 'apple-touch-icon.png' %}">
<link rel="manifest" href="{% static 'manifest.webmanifest' %}">
<link rel="stylesheet" href="{% static 'bootstrap.min.css' %}">
<link rel="stylesheet" href="{% static 'style.css' %}">
<!-- Head end -->
</head>
<body class="d-flex flex-column vh-100">
<!-- Body start -->
<nav class="navbar navbar-expand-md border-bottom border-warning">
<div class="container-fluid">
<button class="navbar-toggler ms-auto"
type="button"
data-bs-toggle="collapse"
data-bs-target="#collapseNavbar">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse" id="collapseNavbar">
<ul class="navbar-nav">
<!-- Home -->
<li class="nav-item">
<a class="nav-link" href="{% url 'twitch_drop_notifier:index' %}">Home</a>
</li>
</ul>
<!-- Donate button, top right corner -->
<ul class="navbar-nav ms-auto">
<li class="nav-item d-none d-md-block">
<a class="nav-link" href="https://github.com/sponsors/TheLovinator1">Donate ❤️</a>
</li>
</ul>
</div>
</div>
</nav>
<!-- Content -->
<div class="container-xl mt-3 mb-3">
{% block content %}<!-- default content -->{% endblock %}
</div>
<!-- Content end -->
<!-- Footer -->
<footer class="footer bg-body-tertiary mt-auto">
<div class="container">
<footer class="d-flex flex-wrap justify-content-between align-items-center">
<!-- License -->
<p class="col-md-4 mb-0 text-muted">
<a href="{% url 'twitch_drop_notifier:terms' %}" class="text-muted">CC BY-SA 4.0</a>
</p>
<!-- Links, right side of footer -->
<ul class="nav col-md-4 justify-content-end">
<!-- GitHub link -->
<li class="nav-item">
<a href="https://github.com/TheLovinator1/panso.se"
class="nav-link px-2 text-muted">GitHub</a>
</li>
<!-- Sitemap link -->
<li class="nav-item">
<a href="/sitemap.xml" class="nav-link px-2 text-muted">Sitemap</a>
</li>
<!-- Privacy link -->
<li class="nav-item">
<a href="{% url 'twitch_drop_notifier:privacy' %}"
class="nav-link px-2 text-muted">Privacy</a>
</li>
<!-- Contact link -->
<li class="nav-item">
<a href="{% url 'twitch_drop_notifier:contact' %}"
class="nav-link px-2 text-muted">Contact</a>
</li>
</ul>
</footer>
</div>
</footer>
<!-- Footer end -->
<script src="{% static 'bootstrap.min.js' %}"></script>
<!-- Body end -->
</body>
</html>

42
templates/contact.html Normal file
View File

@ -0,0 +1,42 @@
{% extends "base.html" %}
{% block title %}<title>Contact - Panso</title>{% endblock %}
{% block description %}Panso contact page{% endblock %}
{% block keywords %}Panso, Panso.se, Contact{% endblock %}
{% block content %}
<div class="container">
<article>
<header>
<h1>Contact</h1>
</header>
<section>
<p>Feel free to contact me about anything. I will try to respond as soon as possible. Thank you!</p>
</section>
<section>
<h2>GitHub Issues</h2>
<p>
You can create an issue on GitHub <a href="https://github.com/TheLovinator1/panso.se/issues">here</a>.
</p>
</section>
<section>
<h2>Discord</h2>
<p>
You can contact me directly on Discord:
<address>
<code>TheLovinator#9276</code>
</address>
</p>
</section>
<section>
<h2>Email</h2>
<p>
You can contact me via email at either of these addresses:
<address>
<a href="mailto:hello@panso.se">hello@panso.se</a>
<br>
<a href="mailto:tlovinator@gmail.com">tlovinator@gmail.com</a>
</address>
</p>
</section>
</article>
</div>
{% endblock %}

20
templates/index.html Normal file
View File

@ -0,0 +1,20 @@
{% extends "base.html" %}
{% block title %}<title>Twitch-drops</title>{% endblock %}
{% block description %}Twitch-drops{% endblock %}
{% block keywords %}Twitch-drops{% endblock %}
{% block content %}
<h1>Index</h1>
<span class="text-body-secondary">This is the index page.</span>
<br>
<br>
{% lorem %} {% lorem %} {% lorem %} {% lorem %}
<br>
<br>
{% lorem %} {% lorem %} {% lorem %} {% lorem %}
<br>
<br>
{% lorem %} {% lorem %} {% lorem %} {% lorem %}
<br>
<br>
{% lorem %} {% lorem %} {% lorem %} {% lorem %}
{% endblock %}

114
templates/privacy.html Normal file
View File

@ -0,0 +1,114 @@
{% extends "base.html" %}
{% block title %}<title>Privacy - Panso</title>{% endblock %}
{% block description %}Panso privacy policy{% endblock %}
{% block keywords %}Panso, Panso.se, Privacy{% endblock %}
{% block content %}
<div class="container">
<article>
<header>
<h1>Privacy Policy</h1>
</header>
<p>
Last Updated:
<time datetime="2020-12-20">
2023-12-20
</time>
</p>
<section>
<h2>What information do we collect?</h2>
<h3>Cloudflare</h3>
<p>
Our website is protected by Cloudflare for security and performance. Please refer to <a href="https://www.cloudflare.com/privacypolicy/">Cloudflare's Privacy Policy</a> for details on how
Cloudflare handles data. We (Panso) can not access any data that Cloudflare collects except for the
following metrics that are displayed in our Cloudflare dashboard:
</p>
<ul>
<li>Unique Visitors</li>
<li>Total requests</li>
<li>Percentage of requests that were cached</li>
<li>Total bandwidth used</li>
<li>Total data served</li>
<li>Data cached</li>
<li>Top Traffic per country</li>
</ul>
<h3>Sentry</h3>
<p>
We use Sentry to track errors on our website. Errors are stored for 30 days and then automatically
deleted. Information that is collected includes:
</p>
<ul>
<li>
The <a href="https://en.wikipedia.org/wiki/Stack_trace">stack trace</a>
</li>
<li>
Browser information (For example: <code>Firefox 122.0</code>)
</li>
<li>
User agent (For example: <code>Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101
Firefox/122.0</code>)
</li>
<li>
Operating system information (For example: <code>Windows >=10</code>)
</li>
<li>
URL (For example: <code>https://panso.se/about/</code>)
</li>
<li>
Headers (For example: <code>Accept-Language: en-US,en;q=0.5</code>)
</li>
</ul>
</section>
<section>
<h2>Purpose of Data Collection</h2>
<p>The data we collect is used for the following purposes:</p>
<ul>
<li>Log Files: To identify and address website errors and improve performance.</li>
<li>Cloudflare: For security and content delivery.</li>
<li>Sentry: To identify and address website errors.</li>
</ul>
<p>None of the data we collect is used for marketing purposes or sold to third parties.</p>
</section>
<section>
<h2>Cookies and Tracking</h2>
<p>We do not use cookies or tracking technologies on our website.</p>
</section>
<section>
<h2>Data Sharing</h2>
<p>
We do not share your data with third parties. However, please review the privacy policies of Cloudflare
and Sentry for information on how they handle data.
</p>
</section>
<section>
<h2>User Rights</h2>
<p>
You have the right to access, correct, or delete your information. For any privacy-related inquiries,
please <a href="{% url 'products:contact' %}">contact us</a>.
</p>
</section>
<section>
<h2>Retention Period</h2>
<p>
Log files may be retained for a limited time for debugging purposes. We do not retain personal
information unless required for legal or business reasons.
</p>
</section>
<section>
<h2>Changes to the Privacy Policy</h2>
<p>
This privacy policy may be updated. Check the "Last Updated" date at the top of this document to see
when it was last updated.
We will notify you of any material changes.
<br>
You can also check the git commit history for changes to this document <a href="https://github.com/TheLovinator1/panso.se/commits/master/templates/privacy.html">here</a>.
</p>
</section>
<section>
<h2>Contact Information</h2>
<p>
For privacy concerns or questions, please <a href="{% url 'products:contact' %}">contact us</a>.
</p>
</section>
</article>
</div>
{% endblock %}

51
templates/terms.html Normal file
View File

@ -0,0 +1,51 @@
{% extends "base.html" %}
{% block title %}<title>Terms - Panso</title>{% endblock %}
{% block description %}Panso terms of service{% endblock %}
{% block keywords %}Panso, Panso.se, License, Terms{% endblock %}
{% block content %}
<div class="container">
<article>
<header>
<h1>Terms of Service</h1>
</header>
<section>
<h2>License</h2>
<p>
The content on this website is licensed under the
<a href="https://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International License</a>.
</p>
</section>
<section>
<h2>You are free to:</h2>
<ul>
<li>Share — copy and redistribute the material in any medium or format</li>
<li>Adapt — remix, transform, and build upon the material for any purpose, even commercially.</li>
</ul>
</section>
<section>
<h2>Under the following terms:</h2>
<ul>
<li>
Attribution — You must give appropriate credit, provide a link to the license, and indicate if
changes were made. You may do so in any reasonable manner, but not in any way that suggests the
licensor endorses you or your use.
</li>
<li>
ShareAlike — If you remix, transform, or build upon the material, you must distribute your
contributions under the same license as the original.
</li>
<li>
No additional restrictions — You may not apply legal terms or technological measures that legally
restrict others from doing anything the license permits.
</li>
</ul>
</section>
<section>
<h2>Legal code:</h2>
<p>
The full legal code of the license can be found <a href="https://creativecommons.org/licenses/by-sa/4.0/legalcode">here</a>.
</p>
</section>
</article>
</div>
{% endblock %}

View File

@ -0,0 +1,28 @@
from __future__ import annotations
from django.urls import URLPattern, path
from django.views.generic.base import RedirectView
from . import views
app_name: str = "twitch_drop_notifier"
urlpatterns: list[URLPattern] = [
path(route="", view=views.index, name="index"),
path(route="privacy", view=views.privacy, name="privacy"),
path(route="terms", view=views.terms, name="terms"),
path(route="contact", view=views.contact, name="contact"),
path(route="robots.txt", view=views.robots_txt, name="robots-txt"),
path(
route="favicon.ico",
view=RedirectView.as_view(url="/static/favicon.ico", permanent=True),
),
path(
route="icon-512.png",
view=RedirectView.as_view(url="/static/icon-512.png", permanent=True),
),
path(
route="icon-192.png",
view=RedirectView.as_view(url="/static/icon-192.png", permanent=True),
),
]

View File

@ -1 +1,75 @@
# Create your views here. from __future__ import annotations
from django.http import HttpRequest, HttpResponse
from django.template import loader
from django.views.decorators.http import require_GET
def index(request: HttpRequest) -> HttpResponse:
"""/ index page.
Args:
request: The request.
Returns:
HttpResponse: The response.
"""
template = loader.get_template(template_name="index.html")
context = {}
return HttpResponse(content=template.render(context, request))
robots_txt_content = """User-agent: *
Allow: /
"""
@require_GET
def robots_txt(request: HttpRequest) -> HttpResponse: # noqa: ARG001
"""robots.txt page."""
return HttpResponse(robots_txt_content, content_type="text/plain")
@require_GET
def contact(request: HttpRequest) -> HttpResponse:
"""/contact page.
Args:
request: The request.
Returns:
HttpResponse: The response.
"""
template = loader.get_template(template_name="contact.html")
context = {}
return HttpResponse(content=template.render(context, request))
@require_GET
def privacy(request: HttpRequest) -> HttpResponse:
"""/privacy page.
Args:
request: The request.
Returns:
HttpResponse: The response.
"""
template = loader.get_template(template_name="privacy.html")
context = {}
return HttpResponse(content=template.render(context, request))
@require_GET
def terms(request: HttpRequest) -> HttpResponse:
"""/terms page.
Args:
request: The request.
Returns:
HttpResponse: The response.
"""
template = loader.get_template(template_name="terms.html")
context = {}
return HttpResponse(content=template.render(context, request))