Merge branch 'frost' of https://github.com/Aevann1/rDrama into frost

remotes/1693176582716663532/tmp_refs/heads/watchparty
Aevann1 2022-10-12 11:04:35 +02:00
commit 32bede574b
18 changed files with 78 additions and 69 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -157,6 +157,7 @@ function buy(mb) {
} else {
document.getElementById('toast-post-error-text').innerText = "Error, please try again later."
if (data && data["error"]) document.getElementById('toast-post-error-text2').innerText = data["error"];
if (data && data["details"]) document.getElementById('toast-post-error-text2').innerText = data["details"];
bootstrap.Toast.getOrCreateInstance(document.getElementById('toast-post-error2')).show();
}
};

View File

@ -21,6 +21,7 @@ function banModal(link, id, name) {
} else {
document.getElementById('toast-post-error-text').innerText = "Error, please try again later."
if (data && data["error"]) document.getElementById('toast-post-error-text').innerText = data["error"];
if (data && data["details"]) document.getElementById('toast-post-error-text').innerText = data["details"];
bootstrap.Toast.getOrCreateInstance(document.getElementById('toast-post-error')).show();
}
};

View File

@ -91,6 +91,7 @@ function adminMuteUser(userId, muteStatus, buttonId) {
} else {
document.getElementById('toast-post-error-text').innerText = "Error, please try again later."
if (data && data["error"]) document.getElementById('toast-post-error-text').innerText = data["error"];
if (data && data["details"]) document.getElementById('toast-post-error-text').innerText = data["details"];
bootstrap.Toast.getOrCreateInstance(document.getElementById('toast-post-error')).show();
}
};

View File

@ -46,6 +46,7 @@ function report_commentModal(id, author) {
} else {
document.getElementById('toast-post-error-text').innerText = "Error, please try again later."
if (data && data["error"]) document.getElementById('toast-post-error-text').innerText = data["error"];
if (data && data["details"]) document.getElementById('toast-post-error-text').innerText = data["details"];
bootstrap.Toast.getOrCreateInstance(document.getElementById('toast-post-error')).show();
}
};
@ -121,6 +122,7 @@ function delete_commentModal(id) {
} else {
document.getElementById('toast-post-error-text').innerText = "Error, please try again later."
if (data && data["error"]) document.getElementById('toast-post-error-text').innerText = data["error"];
if (data && data["details"]) document.getElementById('toast-post-error-text').innerText = data["details"];
bootstrap.Toast.getOrCreateInstance(document.getElementById('toast-post-error')).show();
}
};
@ -169,6 +171,7 @@ function post_reply(id){
else {
if (data && data["error"]) document.getElementById('toast-post-error-text').innerText = data["error"];
else document.getElementById('toast-post-error-text').innerText = "Error, please try again later."
if (data && data["details"]) document.getElementById('toast-post-error-text').innerText = data["details"];
bootstrap.Toast.getOrCreateInstance(document.getElementById('toast-post-error')).show();
}
setTimeout(() => {
@ -212,6 +215,7 @@ function comment_edit(id){
else {
if (data && data["error"]) document.getElementById('toast-post-error-text').innerText = data["error"];
else document.getElementById('toast-post-error-text').innerText = "Error, please try again later."
if (data && data["details"]) document.getElementById('toast-post-error-text').innerText = data["details"];
bootstrap.Toast.getOrCreateInstance(document.getElementById('toast-post-error')).show();
}
setTimeout(() => {
@ -271,6 +275,7 @@ function post_comment(fullname, hide){
else {
if (data && data["error"]) document.getElementById('toast-post-error-text').innerText = data["error"];
else document.getElementById('toast-post-error-text').innerText = "Error, please try again later."
if (data && data["details"]) document.getElementById('toast-post-error-text').innerText = data["details"];
bootstrap.Toast.getOrCreateInstance(document.getElementById('toast-post-error')).show();
setTimeout(() => {
btn.disabled = false;
@ -360,6 +365,7 @@ function handle_action(type, cid, thing) {
else {
if (data && data["error"]) document.getElementById('toast-post-error-text').innerText = data["error"];
else document.getElementById('toast-post-error-text').innerText = "Error, please try again later."
if (data && data["details"]) document.getElementById('toast-post-error-text').innerText = data["details"];
bootstrap.Toast.getOrCreateInstance(document.getElementById('toast-post-error')).show();
}
setTimeout(() => {

View File

@ -20,6 +20,7 @@ function delete_postModal(id) {
} else {
document.getElementById('toast-post-error-text').innerText = "Error, please try again later."
if (data && data["error"]) document.getElementById('toast-post-error-text').innerText = data["error"];
if (data && data["details"]) document.getElementById('toast-post-error-text').innerText = data["details"];
bootstrap.Toast.getOrCreateInstance(document.getElementById('toast-post-error')).show();
}
};

View File

@ -45,6 +45,7 @@ function report_postModal(id) {
} else {
document.getElementById('toast-post-error-text').innerText = "Error, please try again later."
if (data && data["error"]) document.getElementById('toast-post-error-text').innerText = data["error"];
if (data && data["details"]) document.getElementById('toast-post-error-text').innerText = data["details"];
bootstrap.Toast.getOrCreateInstance(document.getElementById('toast-post-error')).show();
}
};

View File

@ -120,6 +120,7 @@ function submitFormAjax(e) {
var myToast = bootstrap.Toast.getOrCreateInstance(document.getElementById('toast-post-error'));
myToast.show();
document.getElementById('toast-post-error-text').innerText = data["error"];
if (data && data["details"]) document.getElementById('toast-post-error-text').innerText = data["details"];
} catch(e) {
var myToast = bootstrap.Toast.getOrCreateInstance(document.getElementById('toast-post-success'));
myToast.hide();

View File

@ -10,6 +10,7 @@ from files.classes.votes import CommentVote
from files.helpers.const import *
from files.helpers.regex import *
from files.helpers.lazy import lazy
from files.helpers.sorting_and_time import *
from .flags import CommentFlag
from .votes import CommentVote
from .saves import CommentSaveRelationship
@ -17,31 +18,6 @@ from random import randint
from math import floor
def sort_objects(sort, objects, Class, v):
if not (v and v.can_see_shadowbanned):
objects = objects.join(Class.author).filter(User.shadowbanned == None)
if sort == 'hot':
ti = int(time.time()) + 3600
if SITE_NAME == 'rDrama': metric = Class.realupvotes
else: metric = Class.upvotes - Class.downvotes
if Class.__name__ == "Submission": metric += Class.comment_count/5
return objects.order_by(-1000000*(metric + 1)/(func.power(((ti - Class.created_utc)/1000), 1.23)), Class.created_utc.desc())
elif sort == "bump" and Class.__name__ == "Submission":
return objects.filter(Class.comment_count > 1).order_by(Class.bump_utc.desc(), Class.created_utc.desc())
elif sort == "comments" and Class.__name__ == "Submission":
return objects.order_by(Class.comment_count.desc(), Class.created_utc.desc())
elif sort == "new":
return objects.order_by(Class.created_utc.desc())
elif sort == "old":
return objects.order_by(Class.created_utc)
elif sort == "controversial":
return objects.order_by((Class.upvotes+1)/(Class.downvotes+1) + (Class.downvotes+1)/(Class.upvotes+1), Class.downvotes.desc(), Class.created_utc.desc())
elif sort == "bottom":
return objects.order_by(Class.upvotes - Class.downvotes, Class.created_utc.desc())
else:
return objects.order_by(Class.downvotes - Class.upvotes, Class.created_utc.desc())
def normalize_urls_runtime(body, v):
if not v: return body
@ -238,7 +214,8 @@ class Comment(Base):
if not self.parent_submission: sort='old'
return sort_objects(sort, replies, Comment, v)
return sort_objects(sort, replies, Comment,
include_shadowbanned=(not (v and v.can_see_shadowbanned)))
@property

View File

@ -7,7 +7,6 @@ from files.helpers.media import *
from files.helpers.const import *
from files.classes.casino_game import Casino_Game
from files.helpers.sorting_and_time import *
from files.classes.comment import sort_objects
from .alts import Alt
from .saves import *
from .notifications import Notification
@ -479,7 +478,8 @@ class User(Base):
posts = apply_time_filter(t, posts, Submission)
posts = sort_objects(sort, posts, Submission, v)
posts = sort_objects(sort, posts, Submission,
include_shadowbanned=(not (v and v.can_see_shadowbanned)))
posts = posts.offset(25 * (page - 1)).limit(26).all()

View File

@ -282,11 +282,9 @@ ERROR_TITLES = {
405: "Method Not Allowed",
406: "Too Many Pings",
409: "Conflict",
413: "Max image/audio size is 8 MB (16 MB for paypigs)",
414: "Max video size is 32 MB (64 MB for paypigs)",
413: "Payload Too Large",
415: "Unsupported Media Type",
417: "Image already exists!",
418: "WEBM videos are not allowed",
418: "I'm a teapot",
429: "Too Many Requests",
500: "Internal Server Error",
}
@ -299,11 +297,9 @@ ERROR_MSGS = {
405: "idk how anyone gets this error but if you see this, remember to follow @carpathianflorist<BR>the original error text here talked about internet gremlins and wtf",
406: "Max limit is 5 for comments and 50 for posts",
409: "There's a conflict between what you're trying to do and what you or someone else has done and because of that you can't do what you're trying to do. So maybe like... don't try and do that? Sorry not sorry",
413: "Max image/audio size is 8 MB (16 MB for paypigs)",
414: "Max video size is 32 MB (64 MB for paypigs)",
413: "That's a heckin' chonker of a file! Please make it smaller or maybe like upload it somewhere else idk",
415: "Please upload only Image, Video, or Audio files!",
417: "Image already exists!",
418: "Please convert your video to MP4 and re-upload it!",
418: "this really shouldn't happen now that we autoconvert webm files but if it does there's a cool teapot marsey so there's that",
429: "go spam somewhere else nerd",
500: "Hiiiii it's carp! I think this error means that there's a timeout error. And I think that means something took too long to load so it decided not to work at all. If you keep seeing this on the same page <I>but not other pages</I>, then something is probably wrong with that specific function. It may not be called a function, but that sounds right to me. Anyway, ping me and I'll whine to someone smarter to fix it. Don't bother them. Thanks ily &lt;3",
}
@ -316,8 +312,7 @@ ERROR_MARSEYS = {
405: "marseyretard",
406: "marseyrage",
409: "marseynoyou",
413: "marseyretard",
414: "marseychonker2",
413: "marseychonker2",
415: "marseydetective",
418: "marseytea",
429: "marseyrentfree",
@ -396,8 +391,8 @@ SIGNUP_FOLLOW_ID = 0
NOTIFICATION_THREAD = 1
MAX_IMAGE_SIZE_BANNER_RESIZED_MB = 1
MAX_IMAGE_SIZE_MB = 8
MAX_IMAGE_SIZE_MB_PATRON = 16
MAX_IMAGE_AUDIO_SIZE_MB = 8
MAX_IMAGE_AUDIO_SIZE_MB_PATRON = 16
MAX_VIDEO_SIZE_MB = 32
MAX_VIDEO_SIZE_MB_PATRON = 64

View File

@ -43,9 +43,9 @@ def process_audio(file):
file.save(name)
size = os.stat(name).st_size
if size > MAX_IMAGE_SIZE_MB_PATRON * 1024 * 1024 or not g.v.patron and size > MAX_IMAGE_SIZE_MB * 1024 * 1024:
if size > MAX_IMAGE_AUDIO_SIZE_MB_PATRON * 1024 * 1024 or not g.v.patron and size > MAX_IMAGE_AUDIO_SIZE_MB * 1024 * 1024:
os.remove(name)
abort(413)
abort(413, f"Max image/audio size is {MAX_IMAGE_AUDIO_SIZE_MB} MB ({MAX_IMAGE_AUDIO_SIZE_MB_PATRON} MB for paypigs)")
media = g.db.query(Media).filter_by(filename=name, kind='audio').one_or_none()
if media: g.db.delete(media)
@ -92,7 +92,7 @@ def process_video(file):
size = os.stat(old).st_size
if SITE_NAME != 'WPD' and (size > MAX_VIDEO_SIZE_MB * 1024 * 1024 or not g.v.patron and size > MAX_VIDEO_SIZE_MB_PATRON * 1024 * 1024):
os.remove(old)
abort(414)
abort(413, f"Max video size is {MAX_VIDEO_SIZE_MB} MB ({MAX_VIDEO_SIZE_MB_PATRON} MB for paypigs)")
extension = file.filename.split('.')[-1].lower()
if extension not in ['avi', 'mp4', 'webm', 'm4v', 'mov', 'mkv']:
@ -125,9 +125,9 @@ def process_video(file):
def process_image(filename=None, resize=0, trim=False, uploader=None, patron=False, db=None):
size = os.stat(filename).st_size
if size > MAX_IMAGE_SIZE_MB_PATRON * 1024 * 1024 or not patron and size > MAX_IMAGE_SIZE_MB * 1024 * 1024:
if size > MAX_IMAGE_AUDIO_SIZE_MB_PATRON * 1024 * 1024 or not patron and size > MAX_IMAGE_AUDIO_SIZE_MB * 1024 * 1024:
os.remove(filename)
abort(413)
abort(413, f"Max image/audio size is {MAX_IMAGE_AUDIO_SIZE_MB} MB ({MAX_IMAGE_AUDIO_SIZE_MB_PATRON} MB for paypigs)")
i = Image.open(filename)
@ -156,7 +156,7 @@ def process_image(filename=None, resize=0, trim=False, uploader=None, patron=Fal
if resize in (300,400,1200):
if os.stat(filename).st_size > MAX_IMAGE_SIZE_BANNER_RESIZED_MB * 1024 * 1024:
os.remove(filename)
abort(413)
abort(413, f"Max size for banners, sidebars, and badges is {MAX_IMAGE_SIZE_BANNER_RESIZED_MB}")
if resize == 1200:
path = f'files/assets/images/{SITE_NAME}/banners'
@ -182,7 +182,7 @@ def process_image(filename=None, resize=0, trim=False, uploader=None, patron=Fal
i_hash = str(imagehash.phash(i))
if i_hash in hashes.keys():
os.remove(filename)
abort(417)
abort(409, "Image already exists!")
db = db or g.db

View File

@ -1,10 +1,8 @@
import time
from files.classes.comment import Comment
from files.classes.submission import Submission
from files.helpers.const import *
from sqlalchemy.sql import func
def apply_time_filter(t, objects, Class):
def apply_time_filter(t, objects, cls):
now = int(time.time())
if t == 'hour':
cutoff = now - 3600
@ -19,4 +17,30 @@ def apply_time_filter(t, objects, Class):
else:
cutoff = 0
return objects.filter(Class.created_utc >= cutoff)
return objects.filter(cls.created_utc >= cutoff)
def sort_objects(sort, objects, cls, include_shadowbanned=False):
if not include_shadowbanned:
cls_user = cls.__mapper__.relationships['author'].entity.entity
objects = objects.join(cls.author).filter(cls_user.shadowbanned == None)
if sort == 'hot':
ti = int(time.time()) + 3600
if SITE_NAME == 'rDrama': metric = cls.realupvotes
else: metric = cls.upvotes - cls.downvotes
if cls.__name__ == "Submission": metric += cls.comment_count/5
return objects.order_by(-1000000*(metric + 1)/(func.power(((ti - cls.created_utc)/1000), 1.23)), cls.created_utc.desc())
elif sort == "bump" and cls.__name__ == "Submission":
return objects.filter(cls.comment_count > 1).order_by(cls.bump_utc.desc(), cls.created_utc.desc())
elif sort == "comments" and cls.__name__ == "Submission":
return objects.order_by(cls.comment_count.desc(), cls.created_utc.desc())
elif sort == "new":
return objects.order_by(cls.created_utc.desc())
elif sort == "old":
return objects.order_by(cls.created_utc)
elif sort == "controversial":
return objects.order_by((cls.upvotes+1)/(cls.downvotes+1) + (cls.downvotes+1)/(cls.upvotes+1), cls.downvotes.desc(), cls.created_utc.desc())
elif sort == "bottom":
return objects.order_by(cls.upvotes - cls.downvotes, cls.created_utc.desc())
else:
return objects.order_by(cls.downvotes - cls.upvotes, cls.created_utc.desc())

View File

@ -17,9 +17,7 @@ from files.__main__ import app, limiter
@app.errorhandler(406)
@app.errorhandler(409)
@app.errorhandler(413)
@app.errorhandler(414)
@app.errorhandler(415)
@app.errorhandler(417)
@app.errorhandler(418)
@app.errorhandler(429)
def error(e):
@ -30,7 +28,7 @@ def error(e):
if WERKZEUG_ERROR_DESCRIPTIONS.get(e.code, None) == details:
details = None
if request.headers.get("Authorization") or request.headers.get("xhr"):
return {"error": title, "code": e.code, "description": msg, "details": details}
return {"error": title, "code": e.code, "description": msg, "details": details}, e.code
img = ERROR_MARSEYS.get(e.code, 'marseyl')
return render_template('errors/error.html', err=True, title=title, msg=msg, details=details, img=img), e.code
@ -47,8 +45,6 @@ def error_401(e):
@app.errorhandler(500)
def error_500(e):
if not g: print("500: not g")
if not g.db: print("500: not g.db")
g.db.rollback()
return error(e)

View File

@ -3,7 +3,6 @@ from files.helpers.get import *
from files.helpers.discord import *
from files.helpers.const import *
from files.helpers.sorting_and_time import *
from files.classes.comment import sort_objects
from files.__main__ import app, cache, limiter
from files.classes.submission import Submission
from files.helpers.awards import award_timers
@ -116,7 +115,8 @@ def frontlist(v=None, sort="hot", page=1, t="all", ids_only=True, ccmode="false"
if not (v and v.shadowbanned):
posts = posts.join(Submission.author).filter(User.shadowbanned == None)
posts = sort_objects(sort, posts, Submission, v)
posts = sort_objects(sort, posts, Submission,
include_shadowbanned=(not (v and v.can_see_shadowbanned)))
if v: size = v.frontsize or 0
else: size = 25
@ -236,7 +236,8 @@ def comment_idlist(page=1, v=None, nsfw=False, sort="new", t="all", gt=0, lt=0,
if not gt and not lt:
comments = apply_time_filter(t, comments, Comment)
comments = sort_objects(sort, comments, Comment, v)
comments = sort_objects(sort, comments, Comment,
include_shadowbanned=(not (v and v.can_see_shadowbanned)))
comments = comments.offset(25 * (page - 1)).limit(26).all()
return [x[0] for x in comments]

View File

@ -11,7 +11,6 @@ from files.helpers.slots import *
from files.helpers.get import *
from files.helpers.actions import *
from files.helpers.sorting_and_time import *
from files.classes.comment import sort_objects
from files.classes import *
from flask import *
from io import BytesIO
@ -197,7 +196,8 @@ def post_id(pid, anything=None, v=None, sub=None):
comments = comments.filter(Comment.level == 1, Comment.stickied == None)
comments = sort_objects(sort, comments, Comment, v)
comments = sort_objects(sort, comments, Comment,
include_shadowbanned=(not (v and v.can_see_shadowbanned)))
comments = [c[0] for c in comments.all()]
else:
@ -205,7 +205,8 @@ def post_id(pid, anything=None, v=None, sub=None):
comments = g.db.query(Comment).join(Comment.author).filter(User.shadowbanned == None, Comment.parent_submission == post.id, Comment.level == 1, Comment.stickied == None)
comments = sort_objects(sort, comments, Comment, v)
comments = sort_objects(sort, comments, Comment,
include_shadowbanned=(not (v and v.can_see_shadowbanned)))
comments = comments.all()
@ -317,13 +318,15 @@ def viewmore(v, pid, sort, offset):
comments = comments.filter(Comment.level == 1)
comments = sort_objects(sort, comments, Comment, v)
comments = sort_objects(sort, comments, Comment,
include_shadowbanned=(not (v and v.can_see_shadowbanned)))
comments = [c[0] for c in comments.all()]
else:
comments = g.db.query(Comment).join(Comment.author).filter(User.shadowbanned == None, Comment.parent_submission == pid, Comment.level == 1, Comment.stickied == None, Comment.id.notin_(ids))
comments = sort_objects(sort, comments, Comment, v)
comments = sort_objects(sort, comments, Comment,
include_shadowbanned=(not (v and v.can_see_shadowbanned)))
comments = comments.offset(offset).all()

View File

@ -5,7 +5,6 @@ from flask import *
from files.__main__ import app
from files.helpers.regex import *
from files.helpers.sorting_and_time import *
from files.classes.comment import sort_objects
import time
from calendar import timegm
@ -146,7 +145,8 @@ def searchposts(v):
posts = apply_time_filter(t, posts, Submission)
posts = sort_objects(sort, posts, Submission, v)
posts = sort_objects(sort, posts, Submission,
include_shadowbanned=(not (v and v.can_see_shadowbanned)))
total = posts.count()
@ -249,7 +249,8 @@ def searchcomments(v):
except: abort(400)
comments = comments.filter(Comment.created_utc < before)
comments = sort_objects(sort, comments, Comment, v)
comments = sort_objects(sort, comments, Comment,
include_shadowbanned=(not (v and v.can_see_shadowbanned)))
total = comments.count()

View File

@ -8,7 +8,6 @@ from files.helpers.alerts import *
from files.helpers.sanitize import *
from files.helpers.const import *
from files.helpers.sorting_and_time import *
from files.classes.comment import sort_objects
from files.mail import *
from flask import *
from files.__main__ import app, limiter, db_session
@ -910,7 +909,8 @@ def u_username_comments(username, v=None):
comments = apply_time_filter(t, comments, Comment)
comments = sort_objects(sort, comments, Comment, v)
comments = sort_objects(sort, comments, Comment,
include_shadowbanned=(not (v and v.can_see_shadowbanned)))
comments = comments.offset(25 * (page - 1)).limit(26).all()
ids = [x.id for x in comments]