diff --git a/.gitignore b/.gitignore index 0f168e47f..3425ab840 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -.* +.env venv/ __pycache__/ diff --git a/files/__main__.py b/files/__main__.py index 94ec12a2d..265a15b56 100644 --- a/files/__main__.py +++ b/files/__main__.py @@ -7,7 +7,6 @@ from os import environ from sys import argv, stdout import gevent -import redis from flask import Flask from flask_caching import Cache from flask_compress import Compress @@ -44,7 +43,9 @@ app.config['SQLALCHEMY_DATABASE_URL'] = environ.get("DATABASE_URL").strip() app.config["CACHE_TYPE"] = "RedisCache" app.config["CACHE_REDIS_URL"] = environ.get("REDIS_URL").strip() -r=redis.Redis(host=environ.get("REDIS_URL").strip(), decode_responses=True, ssl_cert_reqs=None) +app.config['SERVICE'] = Service.RDRAMA +if "load_chat" in argv: + app.config['SERVICE'] = Service.CHAT def get_CF(): with app.app_context(): @@ -79,9 +80,13 @@ def no_step_on_jc(): if key and key == request.headers.get("X-No-Step", ""): return True return False -if "load_chat" in argv: - from files.routes.chat import * -else: +if app.config['SERVICE'] == Service.RDRAMA: from files.routes import * + if HOLIDAY_EVENT: + from files.events import * + event_init() +elif app.config['SERVICE'] == Service.CHAT: + from files.routes.chat import * + stdout.flush() diff --git a/files/assets/css/event b/files/assets/css/event new file mode 120000 index 000000000..809b0c4bb --- /dev/null +++ b/files/assets/css/event @@ -0,0 +1 @@ +../../events/assets/css \ No newline at end of file diff --git a/files/assets/fonts/event b/files/assets/fonts/event new file mode 120000 index 000000000..fa7ac2ce6 --- /dev/null +++ b/files/assets/fonts/event @@ -0,0 +1 @@ +../../events/assets/fonts \ No newline at end of file diff --git a/files/assets/images/event b/files/assets/images/event new file mode 120000 index 000000000..4ee15241b --- /dev/null +++ b/files/assets/images/event @@ -0,0 +1 @@ +../../events/assets/images \ No newline at end of file diff --git a/files/assets/js/event b/files/assets/js/event new file mode 120000 index 000000000..7e146b4d9 --- /dev/null +++ b/files/assets/js/event @@ -0,0 +1 @@ +../../events/assets/js \ No newline at end of file diff --git a/files/assets/media/event b/files/assets/media/event new file mode 120000 index 000000000..a651b69d4 --- /dev/null +++ b/files/assets/media/event @@ -0,0 +1 @@ +../../events/assets/media \ No newline at end of file diff --git a/files/events/__init__.py b/files/events/__init__.py new file mode 100644 index 000000000..71d2ada39 --- /dev/null +++ b/files/events/__init__.py @@ -0,0 +1,28 @@ +from sqlalchemy import inspect + +from files.helpers.const import AWARDS2, AWARDS_DISABLED +from files.__main__ import engine + +from files.events.classes import * +from files.events.helpers import * +from files.events.routes import * + +def _build_table(): + if not inspect(engine).has_table(EventUser.__table__.name, schema="public"): + print("[EVENT] Building event table...") + EventUser.__table__.create(bind=engine, checkfirst=True) + +def _populate_awards(): + temp = {x: AWARDS2[x] for x in AWARDS2 if x not in EVENT_AWARDS} + AWARDS2.clear() + AWARDS2.update(EVENT_AWARDS) + AWARDS2.update(temp) + + for award in EVENT_AWARDS: + if award in AWARDS_DISABLED: + AWARDS_DISABLED.remove(award) + +def event_init(): + _build_table() + +_populate_awards() diff --git a/files/events/assets/css/.gitkeep b/files/events/assets/css/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/files/events/assets/css/spooky.css b/files/events/assets/css/spooky.css new file mode 100644 index 000000000..e69de29bb diff --git a/files/events/assets/fonts/.gitkeep b/files/events/assets/fonts/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/files/events/assets/images/.gitkeep b/files/events/assets/images/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/files/events/assets/images/sidebar/1.webp b/files/events/assets/images/sidebar/1.webp new file mode 100644 index 000000000..9066f22a3 Binary files /dev/null and b/files/events/assets/images/sidebar/1.webp differ diff --git a/files/events/assets/js/.gitkeep b/files/events/assets/js/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/files/events/assets/media/.gitkeep b/files/events/assets/media/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/files/events/classes/__init__.py b/files/events/classes/__init__.py new file mode 100644 index 000000000..b8bfb0664 --- /dev/null +++ b/files/events/classes/__init__.py @@ -0,0 +1 @@ +from .eventuser import EventUser diff --git a/files/events/classes/eventuser.py b/files/events/classes/eventuser.py new file mode 100644 index 000000000..d1d87d209 --- /dev/null +++ b/files/events/classes/eventuser.py @@ -0,0 +1,20 @@ +from sqlalchemy import * +from sqlalchemy.orm import relationship + +from files.classes import Base + +class EventUser(Base): + __tablename__ = "event" + id = Column(Integer, ForeignKey("users.id"), primary_key=True) + user = relationship("User", primaryjoin="EventUser.id == User.id", lazy="joined") + event_music = Column(Boolean, default=True, nullable=False) + + # start event specific columns + + # end event specific columns + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def __repr__(self): + return f"" diff --git a/files/events/helpers/__init__.py b/files/events/helpers/__init__.py new file mode 100644 index 000000000..3651c2473 --- /dev/null +++ b/files/events/helpers/__init__.py @@ -0,0 +1,2 @@ +from .const import * +from .jinja import * diff --git a/files/events/helpers/const.py b/files/events/helpers/const.py new file mode 100644 index 000000000..ddda308de --- /dev/null +++ b/files/events/helpers/const.py @@ -0,0 +1,3 @@ +EVENT_AWARDS = { + +} diff --git a/files/events/helpers/get.py b/files/events/helpers/get.py new file mode 100644 index 000000000..e8db19aca --- /dev/null +++ b/files/events/helpers/get.py @@ -0,0 +1,14 @@ +from typing import Union +from sqlalchemy.orm import scoped_session + +from files.events.classes.eventuser import EventUser +from files.classes.user import User + +def get_or_create_event_user(target:Union[int, User], db:scoped_session) -> EventUser: + if isinstance(target, User): target = target.id # type: ignore + user = db.get(EventUser, target) + if not user: + user = EventUser(id=target) + db.add(target) + db.flush() + return user diff --git a/files/events/helpers/jinja.py b/files/events/helpers/jinja.py new file mode 100644 index 000000000..1ff785df3 --- /dev/null +++ b/files/events/helpers/jinja.py @@ -0,0 +1,8 @@ +EVENT_JINJA_CONST = { + "EVENT_BANNER": "banner_rDrama.html", + "EVENT_SIDEBAR": True, + "EVENT_STYLES": "spooky.css", + "EVENT_AWARDS": True, + "EVENT_MUSIC": "music.html", +} + diff --git a/files/events/routes/__init__.py b/files/events/routes/__init__.py new file mode 100644 index 000000000..d33dc9c13 --- /dev/null +++ b/files/events/routes/__init__.py @@ -0,0 +1,2 @@ +from .awards import * +from .jinja import * diff --git a/files/events/routes/awards.py b/files/events/routes/awards.py new file mode 100644 index 000000000..c04400702 --- /dev/null +++ b/files/events/routes/awards.py @@ -0,0 +1,9 @@ +from flask import g + +from files.events.helpers.get import get_or_create_event_user + +def award_thing_event(v, kind, author): + event_author = get_or_create_event_user(author, g.db) + event_v = get_or_create_event_user(v, g.db) + + g.db.add(event_author) diff --git a/files/events/routes/jinja.py b/files/events/routes/jinja.py new file mode 100644 index 000000000..f8c89a7a5 --- /dev/null +++ b/files/events/routes/jinja.py @@ -0,0 +1,6 @@ +from files.__main__ import app +from files.events import EVENT_JINJA_CONST + +@app.context_processor +def event_constants(): + return EVENT_JINJA_CONST diff --git a/files/events/templates/.gitkeep b/files/events/templates/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/files/events/templates/awards.html b/files/events/templates/awards.html new file mode 100644 index 000000000..e69de29bb diff --git a/files/events/templates/banner_rDrama.html b/files/events/templates/banner_rDrama.html new file mode 100644 index 000000000..9c1abdd46 --- /dev/null +++ b/files/events/templates/banner_rDrama.html @@ -0,0 +1,3 @@ + + + diff --git a/files/events/templates/music.html b/files/events/templates/music.html new file mode 100644 index 000000000..afff89ebc --- /dev/null +++ b/files/events/templates/music.html @@ -0,0 +1,24 @@ +{% if not (v and v.poor) and (not event_v or event_v.event_music) and not (sub and sub.name == 'music') %} + {% if not song %} + {% set path = "assets/media/event/music" %} + {% set song = "/" + path + "/" + listdir('files/' + path)|random() + '?v=45' %} + {% endif %} + +{% endif %} diff --git a/files/events/templates/sidebar_rDrama.html b/files/events/templates/sidebar_rDrama.html new file mode 100644 index 000000000..37836a415 --- /dev/null +++ b/files/events/templates/sidebar_rDrama.html @@ -0,0 +1,78 @@ + diff --git a/files/helpers/const.py b/files/helpers/const.py index 5e71ac5e4..26901ec51 100644 --- a/files/helpers/const.py +++ b/files/helpers/const.py @@ -1,4 +1,5 @@ from copy import deepcopy +from enum import Enum, auto from os import environ, path import tldextract @@ -42,6 +43,9 @@ FP = environ.get("FP", "").strip() KOFI_TOKEN = environ.get("KOFI_TOKEN", "").strip() KOFI_LINK = environ.get("KOFI_LINK", "").strip() +class Service(Enum): + RDRAMA = auto() + CHAT = auto() CLOUDFLARE_COOKIE_VALUE = "yes." # remember to change this in CloudFlare too @@ -205,6 +209,8 @@ PAGE_SIZES = {10, 25, 50, 100} ### SITE SPECIFIC CONSTANTS ################################################################################ +HOLIDAY_EVENT = None + PERMS = { # Minimum admin_level to perform action. 'ADMIN_ADD': 3, 'ADMIN_REMOVE': 3, diff --git a/files/routes/awards.py b/files/routes/awards.py index ee584f8c5..5106ef8e7 100644 --- a/files/routes/awards.py +++ b/files/routes/awards.py @@ -390,6 +390,10 @@ def award_thing(v, thing_type, id): if author.spider: author.spider += 86400 else: author.spider = int(time.time()) + 86400 badge_grant(user=author, badge_id=179, notify=False) + elif HOLIDAY_EVENT: + from files.events import EVENT_AWARDS, award_thing_event + if kind in EVENT_AWARDS: + award_thing_event(v, kind, author) if author.received_award_count: author.received_award_count += 1 else: author.received_award_count = 1 diff --git a/files/templates/default.html b/files/templates/default.html index 8ec4489be..2675ccd73 100644 --- a/files/templates/default.html +++ b/files/templates/default.html @@ -5,15 +5,19 @@ {% include "modals/expanded_image.html" %} {% if '@' not in request.path %} - {% if sub and SITE_NAME != WPD %} - {% set src = sub.banner_url %} - {% set alt = ['/h/', sub, 'banner']|join %} - {% set class = 'site-banner-hole' %} - {% elif SITE_NAME == "rDrama" %} - {% set href = "https://secure.transequality.org/site/Donation2?df_id=1480" %} - {% set expand = false %} + {% if EVENT_BANNER and not sub %} + {% include 'event/' + EVENT_BANNER %} + {% else %} + {% if sub and SITE_NAME != WPD %} + {% set src = sub.banner_url %} + {% set alt = ['/h/', sub, 'banner']|join %} + {% set class = 'site-banner-hole' %} + {% elif SITE_NAME == "rDrama" %} + {% set href = "https://secure.transequality.org/site/Donation2?df_id=1480" %} + {% set expand = false %} + {% endif %} + {{macros.banner(src, href, alt, expand, class)}} {% endif %} - {{macros.banner(src, href, alt, expand, class)}} {% endif %} {% endblock %} @@ -31,7 +35,8 @@ {% block sidebar %} {% if has_sidebar and (home or p) %} - {% include "sidebar_" + SITE_NAME + ".html" %} + {% set sidebar = "sidebar_" + SITE_NAME + ".html" %} + {% include sidebar if not EVENT_SIDEBAR else 'event/' + sidebar %} {% endif %} {% endblock %} diff --git a/files/templates/event b/files/templates/event new file mode 120000 index 000000000..bfac8cddf --- /dev/null +++ b/files/templates/event @@ -0,0 +1 @@ +../events/templates \ No newline at end of file diff --git a/files/templates/util/html_head.html b/files/templates/util/html_head.html index d9f9316af..3940a6261 100644 --- a/files/templates/util/html_head.html +++ b/files/templates/util/html_head.html @@ -146,6 +146,10 @@ {% endif %} + {% if EVENT_STYLES %} + + {% endif %} + {% if request.path == '/chat' %} {% if IS_LOCALHOST %} diff --git a/nginx.conf b/nginx.conf index 0674c02b9..d7540c261 100644 --- a/nginx.conf +++ b/nginx.conf @@ -8,7 +8,7 @@ server { add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"; add_header X-Frame-Options "deny"; add_header X-Content-Type-Options "nosniff"; - add_header Content-Security-Policy "script-src 'self' 'unsafe-inline' challenges.cloudflare.com; connect-src 'self' tls-use1.fpapi.io api.fpjs.io 00bb6d59-7b11-4339-b1ae-b1f1259d1316.pushnotifications.pusher.com; object-src 'none';"; + add_header Content-Security-Policy "script-src 'self' 'unsafe-inline' challenges.cloudflare.com rdrama.net; connect-src 'self' tls-use1.fpapi.io api.fpjs.io 00bb6d59-7b11-4339-b1ae-b1f1259d1316.pushnotifications.pusher.com; object-src 'none';"; location / { proxy_pass http://localhost:5000/;