diff --git a/files/assets/css/classic.css b/files/assets/css/classic.css index 9eaef1c72..33e705548 100644 --- a/files/assets/css/classic.css +++ b/files/assets/css/classic.css @@ -530,4 +530,13 @@ a.nav-link:hover { background-color: #f3f3f3 !important; border-radius: 0px; margin-top: 5px; -} \ No newline at end of file +} + +/* award modal text legibility */ +#awardModalBody .text-muted { + color: var(--black3) !important; +} + +#awardModalBody .card .pt-2 { + color: var(--black3) !important; +} diff --git a/files/assets/css/main.css b/files/assets/css/main.css index 806619bf1..35e49dd8e 100644 --- a/files/assets/css/main.css +++ b/files/assets/css/main.css @@ -4582,6 +4582,13 @@ div.deleted.banned { .patron[style="background-color:#FFFFFF;"] { color: black !important; } +.post--category-tag { + padding: 2px 5px 3px 5px; + border-radius: 5px; + font-size: 12px; + font-weight: 700; + margin-right: 0.25rem; +} .container, .container-fluid { background-color: var(--background) !important; } @@ -5267,6 +5274,10 @@ li > .sidebar { width: 13rem; } +.shop-table-actions a { + display: flex; +} + .userbanner { object-fit: cover !important; } @@ -5686,6 +5697,19 @@ g { border-radius:.35rem; } +.category--tag-button { + display: inline-block; + cursor: pointer; +} + +#submit-categories input { + display: none; +} + +#submit-categories input:checked + label { + border: 5px var(--black) double; +} + /* ------- Font Awesome ------- */ @font-face{ font-family:"Font Awesome 6 Pro"; @@ -6038,6 +6062,7 @@ g { .fa-circle-info:before{content:"\f05a"} .fa-comment-question:before{content:"\e14b"} .fa-sitemap:before{content:"\f0e8"} +.fa-grid:before{content:"\e195"} .pronouns { font-size: 9px; diff --git a/files/assets/images/rDrama/banners/105.webp b/files/assets/images/rDrama/banners/105.webp index 52901e9c0..d86d694e8 100644 Binary files a/files/assets/images/rDrama/banners/105.webp and b/files/assets/images/rDrama/banners/105.webp differ diff --git a/files/assets/images/rDrama/sidebar/699.webp b/files/assets/images/rDrama/sidebar/699.webp new file mode 100644 index 000000000..1f8a501f6 Binary files /dev/null and b/files/assets/images/rDrama/sidebar/699.webp differ diff --git a/files/assets/images/rDrama/sidebar/700.webp b/files/assets/images/rDrama/sidebar/700.webp new file mode 100644 index 000000000..b56835ccf Binary files /dev/null and b/files/assets/images/rDrama/sidebar/700.webp differ diff --git a/files/assets/js/bootstrap.js b/files/assets/js/bootstrap.js index 32bd45875..072b44be3 100644 --- a/files/assets/js/bootstrap.js +++ b/files/assets/js/bootstrap.js @@ -178,7 +178,9 @@ if (document.readyState === "complete" || } function post_toast(t, url, button1, button2, classname) { - if (t.id != "buy1-go" && t.id != "buy2-go") + let isShopConfirm = t.id.startsWith('buy1-go') || t.id.startsWith('buy2-go'); + + if (!isShopConfirm) { t.disabled = true; t.classList.add("disabled"); @@ -212,7 +214,7 @@ function post_toast(t, url, button1, button2, classname) { if (data && data["error"]) document.getElementById('toast-post-error-text').innerText = data["error"]; bootstrap.Toast.getOrCreateInstance(document.getElementById('toast-post-error')).show(); } - if (t.id != "buy1-go" && t.id != "buy2-go") + if (!isShopConfirm) { setTimeout(() => { t.disabled = false; diff --git a/files/assets/js/category_modal.js b/files/assets/js/category_modal.js new file mode 100644 index 000000000..5f353cecc --- /dev/null +++ b/files/assets/js/category_modal.js @@ -0,0 +1,41 @@ +function category_modal(id, title, sub) { + document.getElementById("category-modal-title").innerHTML = `Category: ${title}`; + + xhrCategories = new XMLHttpRequest(); + xhrCategories.open("GET", "/categories.json"); + xhrCategories.onload = function () { + let data; + try { + data = JSON.parse(xhrCategories.response); + } catch(e) { console.log(e) } + + categories = [{id: '', name: 'None', sub: sub, color_text: '#000', color_bg: '#FFF'}]; + categories = [].concat(categories, data[sub]); + + document.getElementById("category-modal-body").innerHTML = ''; + categories.forEach(function (c) { + document.getElementById("category-modal-body").innerHTML += + `
`; + }); + + document.querySelectorAll('.category--tag-button').forEach(tag => + tag.addEventListener('click', function (e) { + reqBody = new FormData(); + reqBody.append('formkey', formkey()); + reqBody.append('post_id', id); + reqBody.append('category_id', tag.dataset.category); + + xhrSubmit = new XMLHttpRequest(); + xhrSubmit.open('POST', `/post_recategorize`); + xhrSubmit.onload = function () { + window.location.reload(); + } + xhrSubmit.send(reqBody); + }) + ); + } + xhrCategories.send(); +} diff --git a/files/assets/js/submit.js b/files/assets/js/submit.js index e9196bd8a..63982e9ba 100644 --- a/files/assets/js/submit.js +++ b/files/assets/js/submit.js @@ -169,6 +169,31 @@ function checkRepost() { } } +function updateCategories() { + if (document.getElementById("submit-categories") == null) { + return; + } + sub = document.getElementById("sub").value; + + xhrCategories = new XMLHttpRequest(); + xhrCategories.open("GET", "/categories.json"); + xhrCategories.onload = function () { + let data; + try { + data = JSON.parse(xhrCategories.response); + } catch(e) { console.log(e) } + + document.getElementById("submit-categories").innerHTML = ''; + data[sub].forEach(function (c) { + document.getElementById("submit-categories").innerHTML += + `` + + ``; + }); + } + xhrCategories.send(); +} document.addEventListener('keydown', (e) => { if(!((e.ctrlKey || e.metaKey) && e.key === "Enter")) @@ -179,4 +204,5 @@ document.addEventListener('keydown', (e) => { submitButton.click(); }); -checkRepost() \ No newline at end of file +checkRepost(); +updateCategories(); diff --git a/files/classes/__init__.py b/files/classes/__init__.py index 6723e92a2..1fd0f795c 100644 --- a/files/classes/__init__.py +++ b/files/classes/__init__.py @@ -8,6 +8,7 @@ from .user import * from .userblock import * from .submission import * from .votes import * +from .category import * from .domains import * from .subscriptions import * from files.__main__ import app @@ -20,4 +21,4 @@ from .saves import * from .views import * from .notifications import * from .follows import * -from .lottery import * \ No newline at end of file +from .lottery import * diff --git a/files/classes/category.py b/files/classes/category.py new file mode 100644 index 000000000..655e711d6 --- /dev/null +++ b/files/classes/category.py @@ -0,0 +1,22 @@ +from sqlalchemy import * +from sqlalchemy.orm import relationship +from files.__main__ import Base + +class Category(Base): + __tablename__ = "category" + + id = Column(Integer, primary_key=True, nullable=False) + name = Column(String(128), nullable=False) + sub = Column(String(20), ForeignKey("subs.name")) + color_text = Column(String(6)) + color_bg = Column(String(6)) + + def as_json(self): + data = { + 'id': self.id, + 'name': self.name, + 'sub': self.sub if self.sub else '', + 'color_text': '#' + self.color_text, + 'color_bg': '#' + self.color_bg, + } + return data diff --git a/files/classes/mod_logs.py b/files/classes/mod_logs.py index 4ac311a8c..a6aef3dfe 100644 --- a/files/classes/mod_logs.py +++ b/files/classes/mod_logs.py @@ -303,6 +303,11 @@ ACTIONTYPES = { "icon": 'fa-thumbtack fa-rotate--45', "color": 'bg-success' }, + 'post_recategorize': { + "str": 'changed category of {self.target_link}', + "icon": 'fa-grid', + "color": 'bg-primary' + }, 'purge_cache': { "str": 'purged cache', "icon": 'fa-memory', diff --git a/files/classes/submission.py b/files/classes/submission.py index 786096345..b0a493457 100644 --- a/files/classes/submission.py +++ b/files/classes/submission.py @@ -53,6 +53,7 @@ class Submission(Base): body = Column(String) body_html = Column(String) flair = Column(String) + category_id = Column(Integer, ForeignKey("category.id")) ban_reason = Column(String) embed_url = Column(String) new = Column(Boolean) @@ -65,6 +66,7 @@ class Submission(Base): comments = relationship("Comment", primaryjoin="Comment.parent_submission==Submission.id", back_populates="post") subr = relationship("Sub", primaryjoin="foreign(Submission.sub)==remote(Sub.name)") options = relationship("SubmissionOption", order_by="SubmissionOption.id") + category = relationship("Category", primaryjoin="Submission.category_id==Category.id") bump_utc = deferred(Column(Integer, server_default=FetchedValue())) diff --git a/files/helpers/const.py b/files/helpers/const.py index 1e639ca8f..e40b3f461 100644 --- a/files/helpers/const.py +++ b/files/helpers/const.py @@ -100,6 +100,20 @@ if SITE_NAME == 'rDrama': " pedo ": " libertarian ", " pedos ": " libertarians ", } +elif SITE_NAME == 'WPD': + SLURS = { + "nigger": "BIPOC", + "niglet": "young BIPOC", + "faggot": "cute twink", + "fag": "cute twink", + "spic ": "hard-working American ", + "tranny": "valid woman", + "trannie": "valid woman", + "dyke": "cute lesbian", + "gook": "superior IQ Asian", + "kike": "jewish chad", + "daisy's destruction": "Cars 2", + } else: SLURS = { "faggot": "cute twink", @@ -132,6 +146,8 @@ AGENDAPOSTER_MSG_HTML = """Hi Your fortune: Allah Wills It','Your fortune: Inshallah, Only Good Things Shall Come To Pass','Your fortune: Allah Smiles At You This Day','Your fortune: Your Bussy Is In For A Blasting','Your fortune: You Will Be Propositioned By A High-Tier Twink','Your fortune: Repent, You Have Displeased Allah And His Vengeance Is Nigh','Your fortune: Reply Hazy, Try Again','Your fortune: lmao you just lost 100 coins','Your fortune: Yikes π¬','Your fortune: You Will Be Blessed With Many Black Bulls','Your fortune: NEETmax, The Day Is Lost If You Venture Outside','Your fortune: A Taste Of Jannah Awaits You Today','Your fortune: Watch Your Back','Your fortune: Outlook good','Your fortune: Godly Luck','Your fortune: Good Luck','Your fortune: Bad Luck','Your fortune: Good news will come to you by mail','Your fortune: Very Bad Luck','Your fortune: ο½·οΎββββββ(οΎβοΎ)ββββββ !!!!','Your fortune: Better not tell you now','Your fortune: You will meet a dark handsome stranger','Your fortune: οΌγΒ΄_γ`οΌοΎο½°οΎ','Your fortune: Excellent Luck','Your fortune: Average Luck')
FACTCHECK_REPLIES = ('Factcheck: This claim has been confirmed as correct by experts. ','Factcheck: This claim has been classified as misogynistic.','Factcheck: This claim is currently being debunked.','Factcheck: This claim is 100% true.','Factcheck: This claim hurts trans lives.','Factcheck: [REDACTED].','Factcheck: This claim is both true and false.','Factcheck: You really believe that shit? Lmao dumbass nigga π€£','Factcheck: None of this is real.','Factcheck: Yes.','Factcheck: This claim has not been approved by experts.','Factcheck: This claim is a gross exageration of reality.','Factcheck: WARNING! THIS CLAIM HAS BEEN CLASSIFIED AS DANGEROUS. PLEASE REMAIN STILL, AN AGENT WILL COME TO MEET YOU SHORTLY.')
@@ -1049,5 +1074,6 @@ DISCORD_WELCOME_CHANNEL = "846509313941700618"
has_sidebar = path.exists(f'files/templates/sidebar_{SITE_NAME}.html')
has_logo = path.exists(f'files/assets/images/{SITE_NAME}/logo.webp')
+has_app = path.exists(f'files/assets/app_{SITE_NAME}_v2.4.apk')
-GLOBAL = environ.get("GLOBAL")
\ No newline at end of file
+GLOBAL = environ.get("GLOBAL")
diff --git a/files/helpers/get.py b/files/helpers/get.py
index fbc44fb34..77d04a308 100644
--- a/files/helpers/get.py
+++ b/files/helpers/get.py
@@ -1,5 +1,6 @@
from files.classes import *
from flask import g
+from sqlalchemy.orm import joinedload
def get_id(username, v=None, graceful=False):
@@ -136,6 +137,8 @@ def get_post(i, v=None, graceful=False):
Submission,
vt.c.vote_type,
blocking.c.target_id,
+ ).options(
+ joinedload(Submission.category)
)
post=post.filter(Submission.id == i
@@ -189,6 +192,8 @@ def get_posts(pids, v=None):
blocked.c.target_id,
).filter(
Submission.id.in_(pids)
+ ).options(
+ joinedload(Submission.category)
).join(
vt, vt.c.submission_id==Submission.id, isouter=True
).join(
diff --git a/files/helpers/jinja2.py b/files/helpers/jinja2.py
index 54b9b9686..3f12dac3c 100644
--- a/files/helpers/jinja2.py
+++ b/files/helpers/jinja2.py
@@ -57,5 +57,5 @@ def inject_constants():
"HOLE_NAME": HOLE_NAME, "HOLE_STYLE_FLAIR": HOLE_STYLE_FLAIR, "HOLE_REQUIRED": HOLE_REQUIRED,
"LOTTERY_ENABLED": LOTTERY_ENABLED, "GUMROAD_LINK": GUMROAD_LINK,
"DEFAULT_THEME": DEFAULT_THEME, "DESCRIPTION": DESCRIPTION,
- "has_sidebar": has_sidebar, "has_logo": has_logo,
+ "has_sidebar": has_sidebar, "has_logo": has_logo, "has_app": has_app,
"FP": FP, "NOTIF_MODACTION_JL_MIN": NOTIF_MODACTION_JL_MIN}
diff --git a/files/helpers/sanitize.py b/files/helpers/sanitize.py
index 6a16f42d6..b8b0ecb94 100644
--- a/files/helpers/sanitize.py
+++ b/files/helpers/sanitize.py
@@ -214,7 +214,7 @@ def with_sigalrm_timeout(timeout: int):
@with_sigalrm_timeout(2)
-def sanitize(sanitized, edit=False, limit_pings=False):
+def sanitize(sanitized, edit=False, limit_pings=False, showmore=True):
sanitized = sanitized.strip()
sanitized = normalize_url(sanitized)
@@ -388,7 +388,7 @@ def sanitize(sanitized, edit=False, limit_pings=False):
if '' not in sanitized:
sanitized = sanitized.replace('\n','')
- if len(sanitized) > 5000:
+ if showmore and len(sanitized) > 5000:
sanitized = showmore_regex.sub(r'\1
API Access Control
-
-
-
{% if LOTTERY_ENABLED -%}
Lottery
@@ -75,6 +70,10 @@
Configuration
{% if v.admin_level > 2 %}
diff --git a/files/templates/admin/categories.html b/files/templates/admin/categories.html
new file mode 100644
index 000000000..e279f581c
--- /dev/null
+++ b/files/templates/admin/categories.html
@@ -0,0 +1,51 @@
+{% extends "default.html" %}
+
+{% block title %}
+
+
+
+{% endblock %}
diff --git a/files/templates/category_modal.html b/files/templates/category_modal.html
new file mode 100644
index 000000000..504bb6450
--- /dev/null
+++ b/files/templates/category_modal.html
@@ -0,0 +1,16 @@
+
+
+
diff --git a/files/templates/comments.html b/files/templates/comments.html
index 66e54bf19..927eb1883 100644
--- a/files/templates/comments.html
+++ b/files/templates/comments.html
@@ -795,6 +795,9 @@
{% include "emoji_modal.html" %}
{% if v.admin_level > 1 %}
{% include "ban_modal.html" %}
+ {% if FEATURES['CATEGORIES'] -%}
+ {% include "category_modal.html" %}
+ {%- endif %}
{% endif %}
+
+
+
+ {% for category in categories %}
+ Category
+ {{ HOLE_NAME | capitalize }}
+ Name
+ Text Color
+ Background Color
+ Actions
+
+
+
+ {% endfor %}
+
+ {{help.submission_category_tag(category.name, category.color_text, category.color_bg)}}
+ {{category.sub if category.sub else '—'|safe}}
+
+
+
+
+
+