forked from rDrama/rDrama
Merge branch 'master' of https://github.com/Aevann1/Drama
commit
a9043b82cd
|
@ -1,5 +1,4 @@
|
||||||
dramacache/
|
dramacache/
|
||||||
# Byte-compiled / optimized / DLL files
|
|
||||||
__pycache__/
|
__pycache__/
|
||||||
*.py[cod]
|
*.py[cod]
|
||||||
*$py.class
|
*$py.class
|
||||||
|
|
|
@ -52,9 +52,7 @@ app.config['SQLALCHEMY_READ_URIS'] = [
|
||||||
]
|
]
|
||||||
|
|
||||||
app.config['SECRET_KEY'] = environ.get('MASTER_KEY')
|
app.config['SECRET_KEY'] = environ.get('MASTER_KEY')
|
||||||
app.config["SERVER_NAME"] = environ.get(
|
app.config["SERVER_NAME"] = environ.get("domain", environ.get("SERVER_NAME", "")).strip()
|
||||||
"domain", environ.get(
|
|
||||||
"SERVER_NAME", "")).strip()
|
|
||||||
|
|
||||||
app.config["SHORT_DOMAIN"]=environ.get("SHORT_DOMAIN","").strip()
|
app.config["SHORT_DOMAIN"]=environ.get("SHORT_DOMAIN","").strip()
|
||||||
app.config["SESSION_COOKIE_NAME"] = "session_drama"
|
app.config["SESSION_COOKIE_NAME"] = "session_drama"
|
||||||
|
@ -177,7 +175,8 @@ def retry(f):
|
||||||
return f(self, *args, **kwargs)
|
return f(self, *args, **kwargs)
|
||||||
except OperationalError as e:
|
except OperationalError as e:
|
||||||
#self.session.rollback()
|
#self.session.rollback()
|
||||||
raise(DatabaseOverload)
|
#raise(DatabaseOverload)
|
||||||
|
print("sex")
|
||||||
except:
|
except:
|
||||||
self.session.rollback()
|
self.session.rollback()
|
||||||
return f(self, *args, **kwargs)
|
return f(self, *args, **kwargs)
|
||||||
|
|
|
@ -421,7 +421,7 @@ class Submission(Base, Stndrd, Age_times, Scores, Fuzzing):
|
||||||
elif self.url:
|
elif self.url:
|
||||||
if v and not v.oldreddit: return self.url.replace("old.reddit.com", "reddit.com")
|
if v and not v.oldreddit: return self.url.replace("old.reddit.com", "reddit.com")
|
||||||
if self.url: return self.url
|
if self.url: return self.url
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def body(self):
|
def body(self):
|
||||||
|
|
|
@ -68,6 +68,8 @@ def upload_file(name, file, resize=None):
|
||||||
print(e)
|
print(e)
|
||||||
print(req)
|
print(req)
|
||||||
print(req.text)
|
print(req.text)
|
||||||
|
return
|
||||||
|
|
||||||
else:
|
else:
|
||||||
req = requests.post('https://api.imgur.com/3/upload.json', headers = {"Authorization": f"Client-ID {imgurkey}"}, data = {'image': base64.b64encode(file.read())})
|
req = requests.post('https://api.imgur.com/3/upload.json', headers = {"Authorization": f"Client-ID {imgurkey}"}, data = {'image': base64.b64encode(file.read())})
|
||||||
try: resp = req.json()['data']
|
try: resp = req.json()['data']
|
||||||
|
@ -75,11 +77,14 @@ def upload_file(name, file, resize=None):
|
||||||
print(e)
|
print(e)
|
||||||
print(req)
|
print(req)
|
||||||
print(req.text)
|
print(req.text)
|
||||||
|
return
|
||||||
|
|
||||||
try: url = resp['link'].replace(".png", "_d.png").replace(".jpg", "_d.jpg").replace(".jpeg", "_d.jpeg") + "?maxwidth=9999"
|
try: url = resp['link'].replace(".png", "_d.png").replace(".jpg", "_d.jpg").replace(".jpeg", "_d.jpeg") + "?maxwidth=9999"
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(e)
|
print(e)
|
||||||
print(req)
|
print(req)
|
||||||
print(req.text)
|
print(req.text)
|
||||||
|
return
|
||||||
|
|
||||||
new_image = Image(
|
new_image = Image(
|
||||||
text=url,
|
text=url,
|
||||||
|
|
|
@ -271,14 +271,11 @@ def validate_formkey(f):
|
||||||
|
|
||||||
if not request.path.startswith("/api/v1"):
|
if not request.path.startswith("/api/v1"):
|
||||||
|
|
||||||
submitted_key = request.values.get("formkey", "none")
|
submitted_key = request.values.get("formkey", None)
|
||||||
|
|
||||||
if not submitted_key:
|
if not submitted_key: abort(401)
|
||||||
|
|
||||||
abort(401)
|
elif not v.validate_formkey(submitted_key): abort(401)
|
||||||
|
|
||||||
elif not v.validate_formkey(submitted_key):
|
|
||||||
abort(401)
|
|
||||||
|
|
||||||
return f(*args, v=v, **kwargs)
|
return f(*args, v=v, **kwargs)
|
||||||
|
|
||||||
|
|
|
@ -275,28 +275,24 @@ def admin_vote_info_get(v):
|
||||||
ups = g.db.query(Vote
|
ups = g.db.query(Vote
|
||||||
).options(joinedload(Vote.user)
|
).options(joinedload(Vote.user)
|
||||||
).filter_by(submission_id=thing.id, vote_type=1
|
).filter_by(submission_id=thing.id, vote_type=1
|
||||||
).order_by(Vote.creation_ip.asc()
|
).all()
|
||||||
).all()
|
|
||||||
|
|
||||||
downs = g.db.query(Vote
|
downs = g.db.query(Vote
|
||||||
).options(joinedload(Vote.user)
|
).options(joinedload(Vote.user)
|
||||||
).filter_by(submission_id=thing.id, vote_type=-1
|
).filter_by(submission_id=thing.id, vote_type=-1
|
||||||
).order_by(Vote.creation_ip.asc()
|
).all()
|
||||||
).all()
|
|
||||||
|
|
||||||
elif isinstance(thing, Comment):
|
elif isinstance(thing, Comment):
|
||||||
|
|
||||||
ups = g.db.query(CommentVote
|
ups = g.db.query(CommentVote
|
||||||
).options(joinedload(CommentVote.user)
|
).options(joinedload(CommentVote.user)
|
||||||
).filter_by(comment_id=thing.id, vote_type=1
|
).filter_by(comment_id=thing.id, vote_type=1
|
||||||
).order_by(CommentVote.creation_ip.asc()
|
).all()
|
||||||
).all()
|
|
||||||
|
|
||||||
downs = g.db.query(CommentVote
|
downs = g.db.query(CommentVote
|
||||||
).options(joinedload(CommentVote.user)
|
).options(joinedload(CommentVote.user)
|
||||||
).filter_by(comment_id=thing.id, vote_type=-1
|
).filter_by(comment_id=thing.id, vote_type=-1
|
||||||
).order_by(CommentVote.creation_ip.asc()
|
).all()
|
||||||
).all()
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
abort(400)
|
abort(400)
|
||||||
|
|
|
@ -17,9 +17,10 @@ def api_flag_post(pid, v):
|
||||||
|
|
||||||
if existing:
|
if existing:
|
||||||
return "", 409
|
return "", 409
|
||||||
|
reason = request.form.get("reason", "")[:100].strip()
|
||||||
flag = Flag(post_id=post.id,
|
flag = Flag(post_id=post.id,
|
||||||
user_id=v.id,
|
user_id=v.id,
|
||||||
|
reason=reason,
|
||||||
created_utc=int(time.time())
|
created_utc=int(time.time())
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -43,8 +44,10 @@ def api_flag_comment(cid, v):
|
||||||
if existing:
|
if existing:
|
||||||
return "", 409
|
return "", 409
|
||||||
|
|
||||||
|
reason = request.form.get("reason", "")[:100].strip()
|
||||||
flag = CommentFlag(comment_id=comment.id,
|
flag = CommentFlag(comment_id=comment.id,
|
||||||
user_id=v.id,
|
user_id=v.id,
|
||||||
|
reason=reason,
|
||||||
created_utc=int(time.time())
|
created_utc=int(time.time())
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ def notifications(v):
|
||||||
for c in comments:
|
for c in comments:
|
||||||
c._is_blocked = False
|
c._is_blocked = False
|
||||||
c._is_blocking = False
|
c._is_blocking = False
|
||||||
if c.parent_submission:
|
if c.parent_submission and c.parent_comment and c.parent_comment.author_id == v.id:
|
||||||
while c.parent_comment:
|
while c.parent_comment:
|
||||||
parent = c.parent_comment
|
parent = c.parent_comment
|
||||||
if c not in parent.replies2:
|
if c not in parent.replies2:
|
||||||
|
@ -50,6 +50,8 @@ def notifications(v):
|
||||||
if c not in listing:
|
if c not in listing:
|
||||||
listing.append(c)
|
listing.append(c)
|
||||||
c.replies = c.replies2
|
c.replies = c.replies2
|
||||||
|
elif c.parent_submission and c not in listing:
|
||||||
|
listing.append(c)
|
||||||
else:
|
else:
|
||||||
if c.parent_comment:
|
if c.parent_comment:
|
||||||
while c.level > 1:
|
while c.level > 1:
|
||||||
|
@ -71,7 +73,6 @@ def notifications(v):
|
||||||
def frontlist(v=None, sort="hot", page=1,t="all", ids_only=True, filter_words='', **kwargs):
|
def frontlist(v=None, sort="hot", page=1,t="all", ids_only=True, filter_words='', **kwargs):
|
||||||
|
|
||||||
posts = g.db.query(Submission).options(lazyload('*')).filter_by(is_banned=False,stickied=False,private=False).filter(Submission.deleted_utc == 0)
|
posts = g.db.query(Submission).options(lazyload('*')).filter_by(is_banned=False,stickied=False,private=False).filter(Submission.deleted_utc == 0)
|
||||||
|
|
||||||
if v and v.admin_level == 0:
|
if v and v.admin_level == 0:
|
||||||
blocking = g.db.query(
|
blocking = g.db.query(
|
||||||
UserBlock.target_id).filter_by(
|
UserBlock.target_id).filter_by(
|
||||||
|
@ -144,7 +145,7 @@ def frontlist(v=None, sort="hot", page=1,t="all", ids_only=True, filter_words=''
|
||||||
|
|
||||||
if page == 1: posts = g.db.query(Submission).filter_by(stickied=True).all() + posts
|
if page == 1: posts = g.db.query(Submission).filter_by(stickied=True).all() + posts
|
||||||
|
|
||||||
words = [' captainmeta4 ', ' cm4 ', ' dissident001 ', ' ladine ']
|
words = ['captainmeta4', ' cm4 ', 'dissident001', 'ladine']
|
||||||
|
|
||||||
for post in posts:
|
for post in posts:
|
||||||
if post.author and post.author.admin_level == 0:
|
if post.author and post.author.admin_level == 0:
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
import mistletoe
|
import mistletoe
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
import threading
|
|
||||||
import gevent
|
import gevent
|
||||||
|
|
||||||
from drama.helpers.wrappers import *
|
from drama.helpers.wrappers import *
|
||||||
|
@ -23,27 +22,28 @@ from PIL import Image as PILimage
|
||||||
with open("snappy.txt", "r") as f:
|
with open("snappy.txt", "r") as f:
|
||||||
snappyquotes = f.read().split("{[para]}")
|
snappyquotes = f.read().split("{[para]}")
|
||||||
|
|
||||||
|
@app.route("/resize")
|
||||||
def resize():
|
def resize():
|
||||||
u = g.db.query(User).filter(User.profileurl != None, User.resized != True).first()
|
u = g.db.query(User).filter(User.profileurl != None, User.resized != True).first()
|
||||||
print(u.username)
|
if u:
|
||||||
print(f"1 {u.profileurl}")
|
print(u.username)
|
||||||
x = requests.get(u.profileurl)
|
print(f"1 {u.profileurl}")
|
||||||
|
x = requests.get(u.profileurl)
|
||||||
|
|
||||||
with open("resizing", "wb") as file:
|
with open("resizing", "wb") as file:
|
||||||
for chunk in x.iter_content(1024):
|
for chunk in x.iter_content(1024):
|
||||||
file.write(chunk)
|
file.write(chunk)
|
||||||
|
|
||||||
image = upload_from_file("resizing", "resizing", (100, 100))
|
|
||||||
if image == None:
|
|
||||||
send_notification(1, u, "fail!")
|
|
||||||
u.resized = True
|
|
||||||
g.db.add(u)
|
|
||||||
else:
|
|
||||||
u.profileurl = image
|
|
||||||
u.resized = True
|
|
||||||
g.db.add(u)
|
|
||||||
print(f"2 {u.profileurl}")
|
|
||||||
|
|
||||||
|
image = upload_from_file("resizing", "resizing", (100, 100))
|
||||||
|
if image == None:
|
||||||
|
send_notification(1, u, "fail!")
|
||||||
|
u.resized = True
|
||||||
|
g.db.add(u)
|
||||||
|
else:
|
||||||
|
u.profileurl = image
|
||||||
|
u.resized = True
|
||||||
|
g.db.add(u)
|
||||||
|
print(f"2 {u.profileurl}")
|
||||||
|
|
||||||
@app.route("/banaward/post/<post_id>")
|
@app.route("/banaward/post/<post_id>")
|
||||||
@auth_required
|
@auth_required
|
||||||
|
@ -272,8 +272,6 @@ def edit_post(pid, v):
|
||||||
|
|
||||||
for x in notify_users: send_notification(1046, x, f"@{v.username} has mentioned you: https://rdrama.net{p.permalink}")
|
for x in notify_users: send_notification(1046, x, f"@{v.username} has mentioned you: https://rdrama.net{p.permalink}")
|
||||||
|
|
||||||
resize()
|
|
||||||
|
|
||||||
return redirect(p.permalink)
|
return redirect(p.permalink)
|
||||||
|
|
||||||
@app.route("/submit/title", methods=['GET'])
|
@app.route("/submit/title", methods=['GET'])
|
||||||
|
@ -1046,8 +1044,6 @@ def submit_post(v):
|
||||||
g.db.commit()
|
g.db.commit()
|
||||||
send_message(f"https://rdrama.net{new_post.permalink}")
|
send_message(f"https://rdrama.net{new_post.permalink}")
|
||||||
|
|
||||||
resize()
|
|
||||||
|
|
||||||
return {"html": lambda: redirect(new_post.permalink),
|
return {"html": lambda: redirect(new_post.permalink),
|
||||||
"api": lambda: jsonify(new_post.json)
|
"api": lambda: jsonify(new_post.json)
|
||||||
}
|
}
|
||||||
|
@ -1072,8 +1068,6 @@ def delete_post_pid(pid, v):
|
||||||
|
|
||||||
cache.delete_memoized(frontlist)
|
cache.delete_memoized(frontlist)
|
||||||
|
|
||||||
resize()
|
|
||||||
|
|
||||||
return "", 204
|
return "", 204
|
||||||
|
|
||||||
@app.route("/undelete_post/<pid>", methods=["POST"])
|
@app.route("/undelete_post/<pid>", methods=["POST"])
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import qrcode
|
import qrcode
|
||||||
import io
|
import io
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
import time
|
||||||
|
|
||||||
from drama.classes.user import ViewerRelationship
|
from drama.classes.user import ViewerRelationship
|
||||||
from drama.helpers.alerts import *
|
from drama.helpers.alerts import *
|
||||||
|
@ -10,7 +11,6 @@ from drama.mail import *
|
||||||
from flask import *
|
from flask import *
|
||||||
from drama.__main__ import app, cache, limiter, db_session
|
from drama.__main__ import app, cache, limiter, db_session
|
||||||
from pusher_push_notifications import PushNotifications
|
from pusher_push_notifications import PushNotifications
|
||||||
from .posts import resize
|
|
||||||
|
|
||||||
PUSHER_KEY = environ.get("PUSHER_KEY", "").strip()
|
PUSHER_KEY = environ.get("PUSHER_KEY", "").strip()
|
||||||
|
|
||||||
|
@ -43,9 +43,6 @@ def user_info(v, username):
|
||||||
def leaderboard(v):
|
def leaderboard(v):
|
||||||
if v and v.is_banned and not v.unban_utc:return render_template("seized.html")
|
if v and v.is_banned and not v.unban_utc:return render_template("seized.html")
|
||||||
users1, users2 = leaderboard()
|
users1, users2 = leaderboard()
|
||||||
|
|
||||||
resize()
|
|
||||||
|
|
||||||
return render_template("leaderboard.html", v=v, users1=users1, users2=users2)
|
return render_template("leaderboard.html", v=v, users1=users1, users2=users2)
|
||||||
|
|
||||||
@cache.memoize(timeout=86400)
|
@cache.memoize(timeout=86400)
|
||||||
|
@ -76,7 +73,7 @@ def get_profilecss(username):
|
||||||
@app.route("/@<username>/reply/<id>", methods=["POST"])
|
@app.route("/@<username>/reply/<id>", methods=["POST"])
|
||||||
@auth_required
|
@auth_required
|
||||||
def messagereply(v, username, id):
|
def messagereply(v, username, id):
|
||||||
message = request.form.get("message", "")
|
message = request.form.get("message", "")[:1000].strip()
|
||||||
user = get_user(username)
|
user = get_user(username)
|
||||||
with CustomRenderer() as renderer: text_html = renderer.render(mistletoe.Document(message))
|
with CustomRenderer() as renderer: text_html = renderer.render(mistletoe.Document(message))
|
||||||
text_html = sanitize(text_html, linkgen=True)
|
text_html = sanitize(text_html, linkgen=True)
|
||||||
|
@ -125,7 +122,7 @@ def message2(v, username):
|
||||||
user = get_user(username, v=v)
|
user = get_user(username, v=v)
|
||||||
if user.is_blocking: return jsonify({"error": "You're blocking this user."}), 403
|
if user.is_blocking: return jsonify({"error": "You're blocking this user."}), 403
|
||||||
if user.is_blocked: return jsonify({"error": "This user is blocking you."}), 403
|
if user.is_blocked: return jsonify({"error": "This user is blocking you."}), 403
|
||||||
message = request.form.get("message", "")
|
message = request.form.get("message", "")[:1000].strip()
|
||||||
send_pm(v.id, user, message)
|
send_pm(v.id, user, message)
|
||||||
beams_client.publish_to_interests(
|
beams_client.publish_to_interests(
|
||||||
interests=[str(user.id)],
|
interests=[str(user.id)],
|
||||||
|
|
|
@ -12,12 +12,10 @@ from .users import leaderboard
|
||||||
@validate_formkey
|
@validate_formkey
|
||||||
def api_vote_post(post_id, x, v):
|
def api_vote_post(post_id, x, v):
|
||||||
|
|
||||||
if x not in ["-1", "0", "1"]:
|
if x not in ["-1", "0", "1"]: abort(400)
|
||||||
abort(400)
|
|
||||||
|
|
||||||
# disallow bots
|
# disallow bots
|
||||||
if request.headers.get("X-User-Type","") == "Bot":
|
if request.headers.get("X-User-Type","") == "Bot": abort(403)
|
||||||
abort(403)
|
|
||||||
|
|
||||||
x = int(x)
|
x = int(x)
|
||||||
|
|
||||||
|
@ -36,41 +34,27 @@ def api_vote_post(post_id, x, v):
|
||||||
|
|
||||||
post = get_post(post_id)
|
post = get_post(post_id)
|
||||||
|
|
||||||
if post.is_banned:
|
|
||||||
return jsonify({"error":"That post has been removed."}), 403
|
|
||||||
elif post.deleted_utc > 0:
|
|
||||||
return jsonify({"error":"That post has been deleted."}), 403
|
|
||||||
elif post.is_archived:
|
|
||||||
return jsonify({"error":"That post is archived and can no longer be voted on."}), 403
|
|
||||||
|
|
||||||
# check for existing vote
|
# check for existing vote
|
||||||
existing = g.db.query(Vote).filter_by(
|
existing = g.db.query(Vote).filter_by(user_id=v.id, submission_id=post.id).first()
|
||||||
user_id=v.id, submission_id=post.id).first()
|
|
||||||
if existing:
|
if existing:
|
||||||
existing.change_to(x)
|
existing.change_to(x)
|
||||||
g.db.add(existing)
|
g.db.add(existing)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
vote = Vote(user_id=v.id,
|
vote = Vote(user_id=v.id,
|
||||||
vote_type=x,
|
vote_type=x,
|
||||||
submission_id=base36decode(post_id),
|
submission_id=base36decode(post_id),
|
||||||
creation_ip=request.remote_addr,
|
|
||||||
app_id=v.client.application.id if v.client else None
|
app_id=v.client.application.id if v.client else None
|
||||||
)
|
)
|
||||||
|
|
||||||
g.db.add(vote)
|
g.db.add(vote)
|
||||||
|
|
||||||
try:
|
g.db.flush()
|
||||||
g.db.flush()
|
|
||||||
except:
|
|
||||||
return jsonify({"error":"Vote already exists."}), 422
|
|
||||||
|
|
||||||
posts = []
|
|
||||||
posts.append(post)
|
|
||||||
|
|
||||||
post.upvotes = post.ups
|
post.upvotes = post.ups
|
||||||
post.downvotes = post.downs
|
post.downvotes = post.downs
|
||||||
g.db.add(post)
|
g.db.add(post)
|
||||||
|
g.db.commit()
|
||||||
|
|
||||||
users1, users2 = leaderboard()
|
users1, users2 = leaderboard()
|
||||||
return "", 204
|
return "", 204
|
||||||
|
|
|
@ -114,7 +114,7 @@
|
||||||
<div class="user-info">
|
<div class="user-info">
|
||||||
<span class="comment-collapse d-md-none" onclick="collapse_comment('{{c.base36id}}')"></span>
|
<span class="comment-collapse d-md-none" onclick="collapse_comment('{{c.base36id}}')"></span>
|
||||||
{% if c.banaward %} <i class="fas fa-gavel text-danger" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Given the 1-day ban award by @{{c.banaward}}"></i> {% endif %}
|
{% if c.banaward %} <i class="fas fa-gavel text-danger" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Given the 1-day ban award by @{{c.banaward}}"></i> {% endif %}
|
||||||
{% if c.active_flags %} <a class="btn btn-primary" style="padding:1px 5px; font-size:10px;" href="javascript:void(0)" onclick="document.getElementById('flaggers-{{c.id}}').classList.toggle('d-none')">{{c.active_flags}} Flags</a> {% endif %}
|
{% if c.active_flags %} <a class="btn btn-primary" style="padding:1px 5px; font-size:10px;" href="javascript:void(0)" onclick="document.getElementById('flaggers-{{c.id}}').classList.toggle('d-none')">{{c.active_flags}} Reports</a> {% endif %}
|
||||||
{% if c.over_18 %}<span class="badge badge-danger text-small-extra mr-1">+18</span> {% endif %}
|
{% if c.over_18 %}<span class="badge badge-danger text-small-extra mr-1">+18</span> {% endif %}
|
||||||
{% if c.is_nsfl %}<span class="badge text-black border-danger border-1 text-small-extra">nsfl</span> {% endif %}
|
{% if c.is_nsfl %}<span class="badge text-black border-danger border-1 text-small-extra">nsfl</span> {% endif %}
|
||||||
{% if v and v.admin_level==6 and c.author.shadowbanned %}<i class="fas fa-user-times text-admin" data-toggle="tooltip" data-placement="bottom" title="Shadowbanned user"></i> {% endif %}
|
{% if v and v.admin_level==6 and c.author.shadowbanned %}<i class="fas fa-user-times text-admin" data-toggle="tooltip" data-placement="bottom" title="Shadowbanned user"></i> {% endif %}
|
||||||
|
@ -192,10 +192,10 @@
|
||||||
<div id="flaggers-{{c.id}}" class="flaggers d-none" style="margin: 7px; border: 1px solid #999b2e; padding: 10px; border-radius: 3px;">
|
<div id="flaggers-{{c.id}}" class="flaggers d-none" style="margin: 7px; border: 1px solid #999b2e; padding: 10px; border-radius: 3px;">
|
||||||
<strong style="color: #999b2e;"><i class="far fa-fw fa-flag"></i> Reported by:</strong>
|
<strong style="color: #999b2e;"><i class="far fa-fw fa-flag"></i> Reported by:</strong>
|
||||||
<ul style="margin-bottom: 0;">
|
<ul style="margin-bottom: 0;">
|
||||||
{% for u in c.flagged_by %}
|
{% for f in c.flags %}
|
||||||
<li><a href="{{ u.url }}">@{{ u.username }}</a></li>
|
<li><a href="{{ f.user.url }}">@{{ f.user.username }}</a>: "{{f.reason}}"</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
@ -280,7 +280,7 @@
|
||||||
<div class="dropdown-menu border-0 shadow" aria-labelledby="dropdownMoreLink">
|
<div class="dropdown-menu border-0 shadow" aria-labelledby="dropdownMoreLink">
|
||||||
{% if not (v and v.id==c.author_id) %}
|
{% if not (v and v.id==c.author_id) %}
|
||||||
{% if v %}
|
{% if v %}
|
||||||
<a class="dropdown-item" href="javascript:void(0)" data-toggle="modal" data-target="#reportCommentModal" onclick="report_commentModal('{{c.base36id}}','{{c.author.username if not c.author.is_deleted else '[is_deleted]'}}',)"><i class="fas fa-flag fa-fw"></i>Flag</a>
|
<a class="dropdown-item" href="javascript:void(0)" data-toggle="modal" data-target="#reportCommentModal" onclick="report_commentModal('{{c.base36id}}','{{c.author.username if not c.author.is_deleted else '[is_deleted]'}}',)"><i class="fas fa-flag fa-fw"></i>Report</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
<a class="dropdown-item" href="javascript:void(0)" data-toggle="modal" data-target="#reportCommentModal" onclick=""><i class="fas fa-flag fa-fw"></i>Flag</a>
|
<a class="dropdown-item" href="javascript:void(0)" data-toggle="modal" data-target="#reportCommentModal" onclick=""><i class="fas fa-flag fa-fw"></i>Flag</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -474,7 +474,7 @@
|
||||||
<li class="list-group-item"><a href="{{c.permalink}}?context=5#context"{% if c.author.is_private %} rel="nofollow"{% endif %}><i class="fas fa-dna"></i>Context</a></li>
|
<li class="list-group-item"><a href="{{c.permalink}}?context=5#context"{% if c.author.is_private %} rel="nofollow"{% endif %}><i class="fas fa-dna"></i>Context</a></li>
|
||||||
|
|
||||||
{% if not (v and v.id==c.author_id) %}
|
{% if not (v and v.id==c.author_id) %}
|
||||||
<li class="list-group-item"><a href="javascript:void(0)" data-toggle="modal" data-dismiss="modal" data-target="#reportCommentModal" onclick="report_commentModal('{{c.base36id}}','{{c.author.username if not c.author.is_deleted else '[is_deleted]'}}')" class="d-block"><i class="fas fa-flag"></i>Flag</a></li>
|
<li class="list-group-item"><a href="javascript:void(0)" data-toggle="modal" data-dismiss="modal" data-target="#reportCommentModal" onclick="report_commentModal('{{c.base36id}}','{{c.author.username if not c.author.is_deleted else '[is_deleted]'}}')" class="d-block"><i class="fas fa-flag"></i>Report</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if v and c.parent_submission and c.author_id==v.id %}
|
{% if v and c.parent_submission and c.author_id==v.id %}
|
||||||
|
|
|
@ -225,13 +225,21 @@
|
||||||
|
|
||||||
this.innerHTML='<span class="spinner-border spinner-border-sm mr-2" role="status" aria-hidden="true"></span>Reporting comment';
|
this.innerHTML='<span class="spinner-border spinner-border-sm mr-2" role="status" aria-hidden="true"></span>Reporting comment';
|
||||||
this.disabled = true;
|
this.disabled = true;
|
||||||
post('/api/flag/comment/' + id,
|
var xhr = new XMLHttpRequest();
|
||||||
callback = function() {
|
xhr.open("POST", '/api/flag/comment/'+id, true);
|
||||||
|
var form = new FormData()
|
||||||
|
form.append("formkey", formkey());
|
||||||
|
form.append("reason", document.getElementById("reason-comment").value);
|
||||||
|
|
||||||
document.getElementById("reportCommentFormBefore").classList.add('d-none');
|
xhr.withCredentials=true;
|
||||||
document.getElementById("reportCommentFormAfter").classList.remove('d-none');
|
|
||||||
}
|
xhr.onload=function() {
|
||||||
)
|
document.getElementById("reportCommentFormBefore").classList.add('d-none');
|
||||||
|
document.getElementById("reportCommentFormAfter").classList.remove('d-none');
|
||||||
|
};
|
||||||
|
|
||||||
|
xhr.onerror=function(){alert(errortext)};
|
||||||
|
xhr.send(form);
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -260,11 +268,7 @@
|
||||||
|
|
||||||
document.getElementById("post-author").textContent = author;
|
document.getElementById("post-author").textContent = author;
|
||||||
|
|
||||||
selectbox=document.getElementById('report-type-dropdown');
|
|
||||||
selectbox.value='reason_not_selected';
|
|
||||||
|
|
||||||
submitbutton=document.getElementById("reportPostButton");
|
submitbutton=document.getElementById("reportPostButton");
|
||||||
submitbutton.disabled=true;
|
|
||||||
|
|
||||||
submitbutton.onclick = function() {
|
submitbutton.onclick = function() {
|
||||||
|
|
||||||
|
@ -275,9 +279,7 @@
|
||||||
xhr.open("POST", '/api/flag/post/'+id, true);
|
xhr.open("POST", '/api/flag/post/'+id, true);
|
||||||
var form = new FormData()
|
var form = new FormData()
|
||||||
form.append("formkey", formkey());
|
form.append("formkey", formkey());
|
||||||
|
form.append("reason", document.getElementById("reason").value);
|
||||||
dropdown=document.getElementById("report-type-dropdown");
|
|
||||||
form.append("report_type", dropdown.options[dropdown.selectedIndex].value);
|
|
||||||
|
|
||||||
xhr.withCredentials=true;
|
xhr.withCredentials=true;
|
||||||
|
|
||||||
|
@ -310,6 +312,9 @@
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$('.expandable-image').click( function(event) {
|
$('.expandable-image').click( function(event) {
|
||||||
|
|
||||||
if (event.which != 1) {
|
if (event.which != 1) {
|
||||||
|
|
|
@ -10,23 +10,16 @@
|
||||||
</div>
|
</div>
|
||||||
<!-- Before report is made, show this -->
|
<!-- Before report is made, show this -->
|
||||||
<div class="" id="reportCommentFormBefore">
|
<div class="" id="reportCommentFormBefore">
|
||||||
<form>
|
<form id="report-comment-form" method="post">
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<div class="h6">We're sorry something here is wrong.</div>
|
<div class="h6">We're sorry something here is wrong.</div>
|
||||||
<small class="form-text text-muted">Please select a reason for flagging below.</small>
|
<small class="form-text text-muted">Please enter a reason for reporting below.</small>
|
||||||
<input type="hidden" name="formkey" value="{{v.formkey}}">
|
<pre></pre>
|
||||||
<select name="report_type" class="custom-select mt-3">
|
<input maxlength="100" id="reason-comment" class="form-control"/>
|
||||||
<option disabled selected>
|
|
||||||
Reason for flagging?
|
|
||||||
</option>
|
|
||||||
<option value="admin">
|
|
||||||
This comment breaks Drama policy
|
|
||||||
</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="button" class="btn btn-link text-muted" data-dismiss="modal">Cancel</button>
|
<button type="button" class="btn btn-link text-muted" data-dismiss="modal">Cancel</button>
|
||||||
<button id="reportCommentButton" class="btn btn-danger">Report comment</button>
|
<button type="button" id="reportCommentButton" class="btn btn-danger">Report comment</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -13,22 +13,13 @@
|
||||||
<form id="report-post-form" method="post">
|
<form id="report-post-form" method="post">
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<div class="h6">We're sorry something here is wrong.</div>
|
<div class="h6">We're sorry something here is wrong.</div>
|
||||||
<small class="form-text text-muted">Please select a reason for flagging below.</small>
|
<small class="form-text text-muted">Please enter a reason for reporting below.</small>
|
||||||
<input type="hidden" name="formkey" value="{{v.formkey}}">
|
<pre></pre>
|
||||||
<select id="report-type-dropdown" name="report_type" form="report-post-form" class="custom-select mt-3" onchange="document.getElementById('reportPostButton').disabled=false;">
|
<input maxlength="100" id="reason" class="form-control"/>
|
||||||
<option disabled selected value="reason_not_selected">
|
|
||||||
Reason for flagging?
|
|
||||||
</option>
|
|
||||||
<option value="admin">
|
|
||||||
This post breaks Drama policy
|
|
||||||
</option>
|
|
||||||
<option id="report-post-to-guild-dropdown-option" value="guild">
|
|
||||||
</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="button" class="btn btn-link text-muted" data-dismiss="modal">Cancel</button>
|
<button type="button" class="btn btn-link text-muted" data-dismiss="modal">Cancel</button>
|
||||||
<button type="button" id="reportPostButton" class="btn btn-danger" disabled>Report post</button>
|
<button type="button" id="reportPostButton" class="btn btn-danger">Report post</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -3,11 +3,9 @@
|
||||||
<script>
|
<script>
|
||||||
var date = new Date('{{p.created_datetime}}');
|
var date = new Date('{{p.created_datetime}}');
|
||||||
document.getElementById('timestamp').title = date.toString();
|
document.getElementById('timestamp').title = date.toString();
|
||||||
document.getElementById('timestamp-2').title = date.toString();
|
|
||||||
{% if p.edited_utc %}
|
{% if p.edited_utc %}
|
||||||
var date = new Date('{{p.edited_datetime}}');
|
var date = new Date('{{p.edited_datetime}}');
|
||||||
document.getElementById('edited_timestamp').title = date.toString();
|
document.getElementById('edited_timestamp').title = date.toString();
|
||||||
document.getElementById('edited_timestamp-2').title = date.toString();
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@ -112,7 +110,7 @@
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<ul class="list-group post-actions">
|
<ul class="list-group post-actions">
|
||||||
{% if not (v and v.id==p.author_id) %}
|
{% if not (v and v.id==p.author_id) %}
|
||||||
<button class="btn btn-link btn-block btn-lg text-left text-muted" data-toggle="modal" data-dismiss="modal" data-target="#reportPostModal" onclick="report_postModal('{{p.base36id}}','{{'@'+p.author.username if not p.author.is_deleted else '[deleted account]'}}','{{p.board.name}}')" class="d-block"><i class="far fa-flag text-center text-muted mr-3"></i>Flag</button>
|
<button class="btn btn-link btn-block btn-lg text-left text-muted" data-toggle="modal" data-dismiss="modal" data-target="#reportPostModal" onclick="report_postModal('{{p.base36id}}','{{'@'+p.author.username if not p.author.is_deleted else '[deleted account]'}}','{{p.board.name}}')" class="d-block"><i class="far fa-flag text-center text-muted mr-3"></i>Report</button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if v and v.id==p.author_id %}
|
{% if v and v.id==p.author_id %}
|
||||||
{% if p.private %}
|
{% if p.private %}
|
||||||
|
@ -236,7 +234,7 @@
|
||||||
{% if p.is_nsfl %}<span class="badge text-black border-danger border-1 text-small-extra">nsfl</span>{% endif %}
|
{% if p.is_nsfl %}<span class="badge text-black border-danger border-1 text-small-extra">nsfl</span>{% endif %}
|
||||||
{% if p.private %}<span class="badge border-warning border-1 text-small-extra">unlisted</span>{% endif %}
|
{% if p.private %}<span class="badge border-warning border-1 text-small-extra">unlisted</span>{% endif %}
|
||||||
{% if p.is_repost %}<span class="badge border-warning border-1 text-small-extra"><a class="text-warning" href="{{p.reposts.permalink}}">repost</a></span>{% endif %}
|
{% if p.is_repost %}<span class="badge border-warning border-1 text-small-extra"><a class="text-warning" href="{{p.reposts.permalink}}">repost</a></span>{% endif %}
|
||||||
{% if p.active_flags %}<a class="btn btn-primary" href="javascript:void(0)" style="padding:1px 5px;" onclick="document.getElementById('flaggers').classList.toggle('d-none')">{{p.active_flags}} Flags</a>{% endif %}
|
{% if p.active_flags %}<a class="btn btn-primary" href="javascript:void(0)" style="padding:1px 5px; font-size:10px;" onclick="document.getElementById('flaggers').classList.toggle('d-none')">{{p.active_flags}} Reports</a>{% endif %}
|
||||||
{% if p.author.is_deleted %}[deleted account]{% else %} <a {% if p.author.animatedname %}class="{% if p.author.patron %}patron{% else %}leaderboard{% endif %}"{% endif %} href="{{p.author.permalink}}" style="color: #{{p.author.namecolor}}; font-weight: bold;" class="user-name"> {{p.author.username}}</a>{% if p.author.customtitle %} <bdi style="color: #{{p.author.titlecolor}}"> {{p.author.customtitle | safe}}</bdi>{% endif %}{% endif %}
|
{% if p.author.is_deleted %}[deleted account]{% else %} <a {% if p.author.animatedname %}class="{% if p.author.patron %}patron{% else %}leaderboard{% endif %}"{% endif %} href="{{p.author.permalink}}" style="color: #{{p.author.namecolor}}; font-weight: bold;" class="user-name"> {{p.author.username}}</a>{% if p.author.customtitle %} <bdi style="color: #{{p.author.titlecolor}}"> {{p.author.customtitle | safe}}</bdi>{% endif %}{% endif %}
|
||||||
<span data-toggle="tooltip" data-placement="bottom" id="timestamp" title=""> {{p.age_string}}</span>
|
<span data-toggle="tooltip" data-placement="bottom" id="timestamp" title=""> {{p.age_string}}</span>
|
||||||
({% if p.realurl(v) %}<a href="/search/posts/?q=domain%3A{{p.domain}}&sort=new&t=all" {% if v and v.newtabexternal %}target="_blank"{% endif %}>{{p.domain}}</a>{% else %}text post{% endif %})
|
({% if p.realurl(v) %}<a href="/search/posts/?q=domain%3A{{p.domain}}&sort=new&t=all" {% if v and v.newtabexternal %}target="_blank"{% endif %}>{{p.domain}}</a>{% else %}text post{% endif %})
|
||||||
|
@ -351,7 +349,7 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if not (v and v.id==p.author_id) %}
|
{% if not (v and v.id==p.author_id) %}
|
||||||
<li class="list-inline-item"><a href="javascript:void(0)" data-toggle="modal" data-dismiss="modal" data-target="#reportPostModal" onclick="report_postModal('{{p.base36id}}', '{{p.author.username}}','{{p.board.name}}')"><i class="fas fa-flag"></i>Flag</a></li>
|
<li class="list-inline-item"><a href="javascript:void(0)" data-toggle="modal" data-dismiss="modal" data-target="#reportPostModal" onclick="report_postModal('{{p.base36id}}', '{{p.author.username}}','{{p.board.name}}')"><i class="fas fa-flag"></i>Report</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if v and v.id==p.author_id %}
|
{% if v and v.id==p.author_id %}
|
||||||
|
@ -516,8 +514,8 @@
|
||||||
<div id="flaggers" class="flaggers d-none" style="margin: 7px; border: 1px solid #999b2e; padding: 10px; border-radius: 3px;">
|
<div id="flaggers" class="flaggers d-none" style="margin: 7px; border: 1px solid #999b2e; padding: 10px; border-radius: 3px;">
|
||||||
<strong style="color: #999b2e;"><i class="far fa-fw fa-flag"></i> Reported by:</strong>
|
<strong style="color: #999b2e;"><i class="far fa-fw fa-flag"></i> Reported by:</strong>
|
||||||
<ul style="margin-bottom: 0;">
|
<ul style="margin-bottom: 0;">
|
||||||
{% for u in p.flagged_by %}
|
{% for f in p.flags %}
|
||||||
<li><a href="{{ u.url }}">@{{ u.username }}</a></li>
|
<li><a href="{{ f.user.url }}">@{{ f.user.username }}</a>: "{{f.reason}}"</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -3,11 +3,9 @@
|
||||||
<script>
|
<script>
|
||||||
var date = new Date('{{p.created_datetime}}');
|
var date = new Date('{{p.created_datetime}}');
|
||||||
document.getElementById('timestamp-{{p.id}}').title = date.toString();
|
document.getElementById('timestamp-{{p.id}}').title = date.toString();
|
||||||
document.getElementById('timestamp-{{p.id}}-2').title = date.toString();
|
|
||||||
{% if p.edited_utc %}
|
{% if p.edited_utc %}
|
||||||
var date = new Date('{{p.edited_datetime}}');
|
var date = new Date('{{p.edited_datetime}}');
|
||||||
document.getElementById('edited_timestamp-{{p.id}}').title = date.toString();
|
document.getElementById('edited_timestamp-{{p.id}}').title = date.toString();
|
||||||
document.getElementById('edited_timestamp-{{p.id}}-2').title = date.toString();
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@ -126,52 +124,28 @@
|
||||||
|
|
||||||
<div class="card-block text-left x-scroll-parent my-md-auto w-100">
|
<div class="card-block text-left x-scroll-parent my-md-auto w-100">
|
||||||
|
|
||||||
<div style="height: 21px" class="d-block d-md-none mb-1">
|
<div class="post-meta text-left x-scroll mb-md-2">
|
||||||
|
{% if p.banaward %} <i class="fas fa-gavel text-danger" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Given the 1-day ban award by @{{p.banaward}}"></i> {% endif %}
|
||||||
|
{% if v and v.admin_level==6 and p.author.shadowbanned %}<i class="fas fa-user-times text-admin" data-toggle="tooltip" data-placement="bottom" title="Shadowbanned user"></i> {% endif %}
|
||||||
|
{% if p.stickied %}<i class="fas fa-thumbtack text-admin fa-rotate--45" data-toggle="tooltip" data-placement="bottom" title="Pinned post"></i> {% endif %}
|
||||||
|
{% if p.distinguish_level %}<i class="fas fa-broom text-admin" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Drama Badmin, speaking officially"></i> {% endif %}
|
||||||
|
{% if p.is_pinned and request.path.startswith('/@') %}<i class="fas fa-thumbtack text-admin fa-rotate--45" data-toggle="tooltip" data-placement="bottom" title="Pinned to profile"></i> {% endif %}
|
||||||
|
{% if p.over_18 %} <span class="badge badge-danger text-small-extra mr-1">+18</span>{% endif %}
|
||||||
|
{% if p.is_bot %} <i class="fad fa-robot text-info" data-toggle="tooltip" data-placement="bottom" data-original-title="Bot"></i>{% endif %}
|
||||||
|
{% if p.is_blocking %}<i class="fas fa-user-minus text-warning" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="You're blocking this user, but you can see this post because {{'it\'s an admin post' if p.distinguish_level else 'you\'re an admin'}}."></i>{% endif %}
|
||||||
|
{% if p.is_blocked %}<i class="fas fa-user-minus text-danger" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="This user is blocking you."></i>{% endif %}
|
||||||
|
{% if p.private %}<span class="badge border-warning border-1 text-small-extra">unlisted</span>{% endif %}
|
||||||
|
{% if p.is_repost %} <span class="badge border-warning border-1 text-small-extra"><a class="text-warning" href="{{p.reposts.permalink}}">repost</a></span>{% endif %}
|
||||||
|
{% if p.active_flags %}<a class="btn btn-primary" href="javascript:void(0)" style="padding:1px 5px; font-size:10px;" onclick="document.getElementById('flaggers-{{p.id}}').classList.toggle('d-none')">{{p.active_flags}} Reports</a>{% endif %}
|
||||||
|
{% if p.author.is_deleted %}[deleted account]{% else %} <a {% if p.author.animatedname %}class="{% if p.author.patron %}patron{% else %}leaderboard{% endif %}"{% endif %} href="{{p.author.permalink}}" style="color: #{{p.author.namecolor}}; font-weight: bold;" class="user-name">{{p.author.username}}</a>{% if p.author.customtitle %}<bdi style="color: #{{p.author.titlecolor}}"> {{p.author.customtitle | safe}}</bdi>{% endif %}{% endif %}
|
||||||
|
<span data-toggle="tooltip" data-placement="bottom" id="timestamp-{{p.id}}" title=""> {{p.age_string}}</span>
|
||||||
|
|
||||||
|
({% if p.realurl(v) %}<a href="/search/posts/?q=domain%3A{{p.domain}}&sort=new&t=all" target="_blank">{{p.domain}}</a>{% else %}text post{% endif %})
|
||||||
|
|
||||||
<div class="post-meta text-left x-scroll" style="overflow-x: scroll;">
|
{% if p.edited_utc %} Edited <span data-toggle="tooltip" data-placement="bottom" id="edited_timestamp-{{p.id}}" title="">{{p.edited_string}}</span>{% endif %}
|
||||||
{% if p.banaward %} <i class="fas fa-gavel text-danger" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Given the 1-day ban award by @{{p.banaward}}"></i> {% endif %}
|
{{p.views}} views
|
||||||
{% if v and v.admin_level==6 and p.author.shadowbanned %}<i class="fas fa-user-times text-admin" data-toggle="tooltip" data-placement="bottom" title="Shadowbanned user"></i> {% endif %}
|
|
||||||
{% if p.stickied %}<i class="fas fa-thumbtack text-admin fa-rotate--45" data-toggle="tooltip" data-placement="bottom" title="Pinned post"></i> {% endif %}
|
|
||||||
{% if p.is_pinned and request.path.startswith('/@') %}<i class="fas fa-thumbtack text-admin fa-rotate--45" data-toggle="tooltip" data-placement="bottom" title="Pinned to profile"></i> {% endif %}
|
|
||||||
{% if p.distinguish_level %} <i class="fas fa-broom text-admin" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Drama Badmin, speaking officially"></i> {% endif %}
|
|
||||||
{% if p.over_18 %}<span class="badge badge-danger text-small-extra mr-1">+18</span>{% endif %}
|
|
||||||
{% if p.is_bot %} <i class="fad fa-robot text-info" data-toggle="tooltip" data-placement="bottom" data-original-title="Bot"></i>{% endif %}
|
|
||||||
{% if p.is_blocking %}<i class="fas fa-user-minus text-warning" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="You're blocking this user, but you can see this post because {{'it\'s an admin post' if p.distinguish_level else 'you\'re an admin'}}."></i>{% endif %}
|
|
||||||
{% if p.is_blocked %}<i class="fas fa-user-minus text-danger" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="This user is blocking you."></i>{% endif %}
|
|
||||||
{% if p.private %}<span class="text-warning"><i class="far fa-eye-slash text-small mr-1"></i>unlisted</span> {% endif %}
|
|
||||||
{% if p.is_repost %}<span class="text-warning"><i class="far fa-sync text-small mr-1"></i><a class="text-warning" href="{{p.reposts.permalink}}">repost</a></span> {% endif %}
|
|
||||||
{% if p.active_flags %} <a class="btn btn-primary" style="padding:1px 5px;" href="javascript:void(0)" onclick="document.getElementById('flaggers-{{p.id}}').classList.toggle('d-none')">{{p.active_flags}} Flags</a>{% endif %}
|
|
||||||
{% if p.author.is_deleted %}[deleted account]{% else %} <a {% if p.author.animatedname %}class="{% if p.author.patron %}patron{% else %}leaderboard{% endif %}"{% endif %} href="{{p.author.permalink}}" style="color: #{{p.author.namecolor}}; font-weight: bold;; font-weight: bold;" class="user-name">{{p.author.username}}</a>{% if p.author.customtitle %}<bdi style="color: #{{p.author.titlecolor}}"> {{p.author.customtitle | safe}}</bdi>{% endif %}
|
|
||||||
<span data-toggle="tooltip" data-placement="bottom" id="timestamp-{{p.id}}" title=""> {{p.age_string}}</span>
|
|
||||||
{% endif %} ({{p.domain}})
|
|
||||||
|
|
||||||
{% if p.edited_utc %} Edited <span data-toggle="tooltip" data-placement="bottom" id="edited_timestamp-{{p.id}}" title="">{{p.edited_string}}</span>{% endif %}
|
|
||||||
{{p.views}} views
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="post-meta text-left d-none d-md-block mb-md-2">
|
|
||||||
{% if p.banaward %} <i class="fas fa-gavel text-danger" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Given the 1-day ban award by @{{p.banaward}}"></i> {% endif %}
|
|
||||||
{% if v and v.admin_level==6 and p.author.shadowbanned %}<i class="fas fa-user-times text-admin" data-toggle="tooltip" data-placement="bottom" title="Shadowbanned user"></i> {% endif %}
|
|
||||||
{% if p.stickied %}<i class="fas fa-thumbtack text-admin fa-rotate--45" data-toggle="tooltip" data-placement="bottom" title="Pinned post"></i> {% endif %}
|
|
||||||
{% if p.distinguish_level %}<i class="fas fa-broom text-admin" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Drama Badmin, speaking officially"></i> {% endif %}
|
|
||||||
{% if p.is_pinned and request.path.startswith('/@') %}<i class="fas fa-thumbtack text-admin fa-rotate--45" data-toggle="tooltip" data-placement="bottom" title="Pinned to profile"></i> {% endif %}
|
|
||||||
{% if p.over_18 %} <span class="badge badge-danger text-small-extra mr-1">+18</span>{% endif %}
|
|
||||||
{% if p.is_bot %} <i class="fad fa-robot text-info" data-toggle="tooltip" data-placement="bottom" data-original-title="Bot"></i>{% endif %}
|
|
||||||
{% if p.is_blocking %}<i class="fas fa-user-minus text-warning" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="You're blocking this user, but you can see this post because {{'it\'s an admin post' if p.distinguish_level else 'you\'re an admin'}}."></i>{% endif %}
|
|
||||||
{% if p.is_blocked %}<i class="fas fa-user-minus text-danger" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="This user is blocking you."></i>{% endif %}
|
|
||||||
{% if p.private %}<span class="badge border-warning border-1 text-small-extra">unlisted</span>{% endif %}
|
|
||||||
{% if p.is_repost %} <span class="badge border-warning border-1 text-small-extra"><a class="text-warning" href="{{p.reposts.permalink}}">repost</a></span>{% endif %}
|
|
||||||
{% if p.active_flags %}<a class="btn btn-primary" href="javascript:void(0)" style="padding:1px 5px;" onclick="document.getElementById('flaggers-{{p.id}}').classList.toggle('d-none')">{{p.active_flags}} Flags</a>{% endif %}
|
|
||||||
{% if p.author.is_deleted %}[deleted account]{% else %} <a {% if p.author.animatedname %}class="{% if p.author.patron %}patron{% else %}leaderboard{% endif %}"{% endif %} href="{{p.author.permalink}}" style="color: #{{p.author.namecolor}}; font-weight: bold;" class="user-name">{{p.author.username}}</a>{% if p.author.customtitle %}<bdi style="color: #{{p.author.titlecolor}}"> {{p.author.customtitle | safe}}</bdi>{% endif %}{% endif %}
|
|
||||||
<span data-toggle="tooltip" data-placement="bottom" id="timestamp-{{p.id}}-2" title=""> {{p.age_string}}</span>
|
|
||||||
|
|
||||||
({% if p.realurl(v) %}<a href="/search/posts/?q=domain%3A{{p.domain}}&sort=new&t=all" target="_blank">{{p.domain}}</a>{% else %}text post{% endif %})
|
|
||||||
|
|
||||||
{% if p.edited_utc %} Edited <span data-toggle="tooltip" data-placement="bottom" id="edited_timestamp-{{p.id}}-2" title="">{{p.edited_string}}</span>{% endif %}
|
|
||||||
{{p.views}} views
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h5 class="card-title post-title text-left w-lg-75 mb-0 pb-0 pb-md-1"><a {% if v and v.newtab %}target="_blank"{% endif %} href="{{p.permalink}}" class="stretched-link" {% if p.author.is_private %} rel="nofollow"{% endif %}>
|
<h5 class="card-title post-title text-left w-lg-75 mb-0 pb-0 pb-md-1"><a {% if v and v.newtab %}target="_blank"{% endif %} href="{{p.permalink}}" class="stretched-link" {% if p.author.is_private %} rel="nofollow"{% endif %}>
|
||||||
{{p.realtitle(v) | safe}}
|
{{p.realtitle(v) | safe}}
|
||||||
|
@ -217,7 +191,7 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if not (v and v.id==p.author_id) %}
|
{% if not (v and v.id==p.author_id) %}
|
||||||
<li class="list-inline-item"><a href="javascript:void(0)" data-toggle="modal" data-dismiss="modal" data-target="#reportPostModal" onclick="report_postModal('{{p.base36id}}', '{{p.author.username}}','{{p.board.name}}')"><i class="fas fa-flag"></i>Flag</a></li>
|
<li class="list-inline-item"><a href="javascript:void(0)" data-toggle="modal" data-dismiss="modal" data-target="#reportPostModal" onclick="report_postModal('{{p.base36id}}', '{{p.author.username}}','{{p.board.name}}')"><i class="fas fa-flag"></i>Report</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if v and v.id==p.author_id %}
|
{% if v and v.id==p.author_id %}
|
||||||
|
@ -359,8 +333,8 @@
|
||||||
<div id="flaggers-{{p.id}}" class="flaggers d-none" style="margin: 7px; border: 1px solid #999b2e; padding: 10px; border-radius: 3px;">
|
<div id="flaggers-{{p.id}}" class="flaggers d-none" style="margin: 7px; border: 1px solid #999b2e; padding: 10px; border-radius: 3px;">
|
||||||
<strong style="color: #999b2e;"><i class="far fa-fw fa-flag"></i> Reported by:</strong>
|
<strong style="color: #999b2e;"><i class="far fa-fw fa-flag"></i> Reported by:</strong>
|
||||||
<ul style="margin-bottom: 0;">
|
<ul style="margin-bottom: 0;">
|
||||||
{% for u in p.flagged_by %}
|
{% for f in p.flags %}
|
||||||
<li><a href="{{ u.url }}">@{{ u.username }}</a></li>
|
<li><a href="{{ f.user.url }}">@{{ f.user.username }}</a>: "{{f.reason}}"</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
@ -401,7 +375,7 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if not (v and v.id==p.author_id) %}
|
{% if not (v and v.id==p.author_id) %}
|
||||||
<button class="btn btn-link btn-block btn-lg text-left text-muted" data-toggle="modal" data-dismiss="modal" data-target="#reportPostModal" onclick="report_postModal('{{p.base36id}}','{{'@'+p.author.username if not p.author.is_deleted else '[deleted account]'}}','{{p.board.name}}')" class="d-block"><i class="far fa-flag text-center text-muted mr-3"></i>Flag</button>
|
<button class="btn btn-link btn-block btn-lg text-left text-muted" data-toggle="modal" data-dismiss="modal" data-target="#reportPostModal" onclick="report_postModal('{{p.base36id}}','{{'@'+p.author.username if not p.author.is_deleted else '[deleted account]'}}','{{p.board.name}}')" class="d-block"><i class="far fa-flag text-center text-muted mr-3"></i>Report</button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if v and v.id==p.author_id %}
|
{% if v and v.id==p.author_id %}
|
||||||
<button class="btn btn-link btn-block btn-lg text-info text-left" id="pin-post-{{p.base36id}}" href="javascript:void(0)" onclick="post('/api/pin/{{p.base36id}}',callback=function(){window.location.reload(true);})"><i class="fas fa-thumbtack text-center text-muted mr-3"></i>{% if p.is_pinned %}Unpin from your profile{% else %}Pin to your profile{% endif %}</button>
|
<button class="btn btn-link btn-block btn-lg text-info text-left" id="pin-post-{{p.base36id}}" href="javascript:void(0)" onclick="post('/api/pin/{{p.base36id}}',callback=function(){window.location.reload(true);})"><i class="fas fa-thumbtack text-center text-muted mr-3"></i>{% if p.is_pinned %}Unpin from your profile{% else %}Pin to your profile{% endif %}</button>
|
||||||
|
|
|
@ -135,6 +135,7 @@
|
||||||
<a id="button-sub" class="btn btn-primary {% if is_following or u.is_nofollow or u.is_blocked %}d-none{% endif %}" href="javascript:void(0)" onclick="post('/api/follow/{{u.username}}', callback=function(){document.getElementById('button-sub').classList.toggle('d-none');document.getElementById('button-unsub').classList.toggle('d-none');})">Follow</a>
|
<a id="button-sub" class="btn btn-primary {% if is_following or u.is_nofollow or u.is_blocked %}d-none{% endif %}" href="javascript:void(0)" onclick="post('/api/follow/{{u.username}}', callback=function(){document.getElementById('button-sub').classList.toggle('d-none');document.getElementById('button-unsub').classList.toggle('d-none');})">Follow</a>
|
||||||
|
|
||||||
<a class="btn btn-primary" href="javascript:void(0)" onclick="document.getElementById('message').classList.toggle('d-none')">Message</a>
|
<a class="btn btn-primary" href="javascript:void(0)" onclick="document.getElementById('message').classList.toggle('d-none')">Message</a>
|
||||||
|
<a class="btn btn-primary" href="javascript:void(0)" onclick="post('/@{{u.username}}/suicide', function(){window.location.reload(true);})">Get them help</a>
|
||||||
<form class="d-none" id="message" action="/@{{u.username}}/message" method="post">
|
<form class="d-none" id="message" action="/@{{u.username}}/message" method="post">
|
||||||
<pre></pre>
|
<pre></pre>
|
||||||
<textarea id="input-message" form="message" name="message" rows="3" class="form-control" required></textarea>
|
<textarea id="input-message" form="message" name="message" rows="3" class="form-control" required></textarea>
|
||||||
|
@ -312,6 +313,7 @@
|
||||||
<a id="button-sub2" class="btn btn-primary {% if is_following or u.is_nofollow or u.is_blocked %}d-none{% endif %}" href="javascript:void(0)" onclick="post('/api/follow/{{u.username}}', callback=function(){document.getElementById('button-sub2').classList.toggle('d-none');document.getElementById('button-unsub2').classList.toggle('d-none');})">Follow</a>
|
<a id="button-sub2" class="btn btn-primary {% if is_following or u.is_nofollow or u.is_blocked %}d-none{% endif %}" href="javascript:void(0)" onclick="post('/api/follow/{{u.username}}', callback=function(){document.getElementById('button-sub2').classList.toggle('d-none');document.getElementById('button-unsub2').classList.toggle('d-none');})">Follow</a>
|
||||||
|
|
||||||
<a class="btn btn-primary" href="javascript:void(0)" onclick="document.getElementById('message-mobile').classList.toggle('d-none')">Message</a>
|
<a class="btn btn-primary" href="javascript:void(0)" onclick="document.getElementById('message-mobile').classList.toggle('d-none')">Message</a>
|
||||||
|
<a class="btn btn-primary" href="javascript:void(0)" onclick="post('/@{{u.username}}/suicide', function(){window.location.reload(true);})">Get them help</a>
|
||||||
<form class="d-none" id='message-mobile' action="/@{{u.username}}/message" method="post">
|
<form class="d-none" id='message-mobile' action="/@{{u.username}}/message" method="post">
|
||||||
<pre></pre>
|
<pre></pre>
|
||||||
<textarea id="input-message-mobile" form="message-mobile" name="message" rows="3" class="form-control" required></textarea>
|
<textarea id="input-message-mobile" form="message-mobile" name="message" rows="3" class="form-control" required></textarea>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{% extends "default.html" %}
|
{% extends "default.html" %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<pre class="d-none d-md-inline-block"></pre>
|
<pre></pre>
|
||||||
<h5>Users who viewed your profile</h5>
|
<h5>Users who viewed your profile</h5>
|
||||||
<pre></pre>
|
<pre></pre>
|
||||||
<table class="table table-striped mb-5">
|
<table class="table table-striped mb-5">
|
||||||
|
|
134
schema.sql
134
schema.sql
|
@ -2,8 +2,8 @@
|
||||||
-- PostgreSQL database dump
|
-- PostgreSQL database dump
|
||||||
--
|
--
|
||||||
|
|
||||||
-- Dumped from database version 10.17 (Ubuntu 10.17-0ubuntu0.18.04.1)
|
-- Dumped from database version 12.7 (Ubuntu 12.7-0ubuntu0.20.04.1)
|
||||||
-- Dumped by pg_dump version 10.17 (Ubuntu 10.17-0ubuntu0.18.04.1)
|
-- Dumped by pg_dump version 12.7 (Ubuntu 12.7-0ubuntu0.20.04.1)
|
||||||
|
|
||||||
SET statement_timeout = 0;
|
SET statement_timeout = 0;
|
||||||
SET lock_timeout = 0;
|
SET lock_timeout = 0;
|
||||||
|
@ -177,6 +177,7 @@ DROP INDEX public.alts_user2_idx;
|
||||||
DROP INDEX public.alts_user1_idx;
|
DROP INDEX public.alts_user1_idx;
|
||||||
DROP INDEX public.accepted_idx;
|
DROP INDEX public.accepted_idx;
|
||||||
ALTER TABLE ONLY public.votes DROP CONSTRAINT votes_pkey;
|
ALTER TABLE ONLY public.votes DROP CONSTRAINT votes_pkey;
|
||||||
|
ALTER TABLE ONLY public.viewers DROP CONSTRAINT viewers_pkey;
|
||||||
ALTER TABLE ONLY public.users DROP CONSTRAINT users_username_key;
|
ALTER TABLE ONLY public.users DROP CONSTRAINT users_username_key;
|
||||||
ALTER TABLE ONLY public.users DROP CONSTRAINT users_pkey;
|
ALTER TABLE ONLY public.users DROP CONSTRAINT users_pkey;
|
||||||
ALTER TABLE ONLY public.users DROP CONSTRAINT users_original_username_key;
|
ALTER TABLE ONLY public.users DROP CONSTRAINT users_original_username_key;
|
||||||
|
@ -257,6 +258,7 @@ ALTER TABLE ONLY public.award_relationships DROP CONSTRAINT award_constraint;
|
||||||
ALTER TABLE ONLY public.award_relationships DROP CONSTRAINT award_comment_constraint;
|
ALTER TABLE ONLY public.award_relationships DROP CONSTRAINT award_comment_constraint;
|
||||||
ALTER TABLE ONLY public.alts DROP CONSTRAINT alts_pkey;
|
ALTER TABLE ONLY public.alts DROP CONSTRAINT alts_pkey;
|
||||||
ALTER TABLE public.votes ALTER COLUMN id DROP DEFAULT;
|
ALTER TABLE public.votes ALTER COLUMN id DROP DEFAULT;
|
||||||
|
ALTER TABLE public.viewers ALTER COLUMN id DROP DEFAULT;
|
||||||
ALTER TABLE public.users ALTER COLUMN id DROP DEFAULT;
|
ALTER TABLE public.users ALTER COLUMN id DROP DEFAULT;
|
||||||
ALTER TABLE public.userflags ALTER COLUMN id DROP DEFAULT;
|
ALTER TABLE public.userflags ALTER COLUMN id DROP DEFAULT;
|
||||||
ALTER TABLE public.userblocks ALTER COLUMN id DROP DEFAULT;
|
ALTER TABLE public.userblocks ALTER COLUMN id DROP DEFAULT;
|
||||||
|
@ -306,6 +308,8 @@ ALTER TABLE public.award_relationships ALTER COLUMN id DROP DEFAULT;
|
||||||
ALTER TABLE public.alts ALTER COLUMN id DROP DEFAULT;
|
ALTER TABLE public.alts ALTER COLUMN id DROP DEFAULT;
|
||||||
DROP SEQUENCE public.votes_id_seq;
|
DROP SEQUENCE public.votes_id_seq;
|
||||||
DROP TABLE public.votes;
|
DROP TABLE public.votes;
|
||||||
|
DROP SEQUENCE public.viewers_id_seq;
|
||||||
|
DROP TABLE public.viewers;
|
||||||
DROP SEQUENCE public.users_id_seq;
|
DROP SEQUENCE public.users_id_seq;
|
||||||
DROP SEQUENCE public.userflags_id_seq;
|
DROP SEQUENCE public.userflags_id_seq;
|
||||||
DROP TABLE public.userflags;
|
DROP TABLE public.userflags;
|
||||||
|
@ -445,47 +449,8 @@ DROP TABLE public.boards;
|
||||||
DROP EXTENSION pg_trgm;
|
DROP EXTENSION pg_trgm;
|
||||||
DROP EXTENSION pg_stat_statements;
|
DROP EXTENSION pg_stat_statements;
|
||||||
DROP EXTENSION fuzzystrmatch;
|
DROP EXTENSION fuzzystrmatch;
|
||||||
DROP EXTENSION plpgsql;
|
|
||||||
DROP SCHEMA public;
|
|
||||||
--
|
--
|
||||||
-- Name: DATABASE postgres; Type: COMMENT; Schema: -; Owner: postgres
|
-- Name: fuzzystrmatch; Type: EXTENSION; Schema: -; Owner: -
|
||||||
--
|
|
||||||
|
|
||||||
COMMENT ON DATABASE postgres IS 'default administrative connection database';
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: public; Type: SCHEMA; Schema: -; Owner: postgres
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE SCHEMA public;
|
|
||||||
|
|
||||||
|
|
||||||
ALTER SCHEMA public OWNER TO postgres;
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: postgres
|
|
||||||
--
|
|
||||||
|
|
||||||
COMMENT ON SCHEMA public IS 'standard public schema';
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner:
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner:
|
|
||||||
--
|
|
||||||
|
|
||||||
COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: fuzzystrmatch; Type: EXTENSION; Schema: -; Owner:
|
|
||||||
--
|
--
|
||||||
|
|
||||||
CREATE EXTENSION IF NOT EXISTS fuzzystrmatch WITH SCHEMA public;
|
CREATE EXTENSION IF NOT EXISTS fuzzystrmatch WITH SCHEMA public;
|
||||||
|
@ -499,7 +464,7 @@ COMMENT ON EXTENSION fuzzystrmatch IS 'determine similarities and distance betwe
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: pg_stat_statements; Type: EXTENSION; Schema: -; Owner:
|
-- Name: pg_stat_statements; Type: EXTENSION; Schema: -; Owner: -
|
||||||
--
|
--
|
||||||
|
|
||||||
CREATE EXTENSION IF NOT EXISTS pg_stat_statements WITH SCHEMA public;
|
CREATE EXTENSION IF NOT EXISTS pg_stat_statements WITH SCHEMA public;
|
||||||
|
@ -513,7 +478,7 @@ COMMENT ON EXTENSION pg_stat_statements IS 'track execution statistics of all SQ
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: pg_trgm; Type: EXTENSION; Schema: -; Owner:
|
-- Name: pg_trgm; Type: EXTENSION; Schema: -; Owner: -
|
||||||
--
|
--
|
||||||
|
|
||||||
CREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA public;
|
CREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA public;
|
||||||
|
@ -528,7 +493,7 @@ COMMENT ON EXTENSION pg_trgm IS 'text similarity measurement and index searching
|
||||||
|
|
||||||
SET default_tablespace = '';
|
SET default_tablespace = '';
|
||||||
|
|
||||||
SET default_with_oids = false;
|
SET default_table_access_method = heap;
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: boards; Type: TABLE; Schema: public; Owner: postgres
|
-- Name: boards; Type: TABLE; Schema: public; Owner: postgres
|
||||||
|
@ -624,7 +589,8 @@ CREATE TABLE public.comments (
|
||||||
creation_region character(2) DEFAULT NULL::bpchar,
|
creation_region character(2) DEFAULT NULL::bpchar,
|
||||||
purged_utc integer DEFAULT 0,
|
purged_utc integer DEFAULT 0,
|
||||||
sentto integer,
|
sentto integer,
|
||||||
shadowbanned boolean
|
shadowbanned boolean,
|
||||||
|
banaward text
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -687,7 +653,8 @@ CREATE TABLE public.submissions (
|
||||||
is_bot boolean DEFAULT false,
|
is_bot boolean DEFAULT false,
|
||||||
thumburl text,
|
thumburl text,
|
||||||
private boolean,
|
private boolean,
|
||||||
views integer
|
views integer,
|
||||||
|
banaward text
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -797,7 +764,11 @@ CREATE TABLE public.users (
|
||||||
dramacoins integer,
|
dramacoins integer,
|
||||||
agendaposter boolean,
|
agendaposter boolean,
|
||||||
agendaposter_expires_utc integer DEFAULT 0,
|
agendaposter_expires_utc integer DEFAULT 0,
|
||||||
resized boolean
|
resized boolean,
|
||||||
|
banawards integer,
|
||||||
|
patron boolean,
|
||||||
|
animatedname boolean,
|
||||||
|
suicide_utc integer
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -1801,7 +1772,8 @@ CREATE TABLE public.award_relationships (
|
||||||
id integer NOT NULL,
|
id integer NOT NULL,
|
||||||
user_id integer,
|
user_id integer,
|
||||||
submission_id integer,
|
submission_id integer,
|
||||||
comment_id integer
|
comment_id integer,
|
||||||
|
kind character varying(20)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -2252,7 +2224,8 @@ CREATE TABLE public.commentflags (
|
||||||
id integer NOT NULL,
|
id integer NOT NULL,
|
||||||
user_id integer,
|
user_id integer,
|
||||||
comment_id integer,
|
comment_id integer,
|
||||||
created_utc integer NOT NULL
|
created_utc integer NOT NULL,
|
||||||
|
reason text
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -2575,7 +2548,8 @@ CREATE TABLE public.flags (
|
||||||
id integer NOT NULL,
|
id integer NOT NULL,
|
||||||
user_id integer,
|
user_id integer,
|
||||||
post_id integer,
|
post_id integer,
|
||||||
created_utc integer NOT NULL
|
created_utc integer NOT NULL,
|
||||||
|
reason text
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -3458,6 +3432,42 @@ ALTER TABLE public.users_id_seq OWNER TO postgres;
|
||||||
ALTER SEQUENCE public.users_id_seq OWNED BY public.users.id;
|
ALTER SEQUENCE public.users_id_seq OWNED BY public.users.id;
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: viewers; Type: TABLE; Schema: public; Owner: postgres
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE public.viewers (
|
||||||
|
id integer NOT NULL,
|
||||||
|
user_id integer,
|
||||||
|
viewer_id integer,
|
||||||
|
last_view_utc integer
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE public.viewers OWNER TO postgres;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: viewers_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE SEQUENCE public.viewers_id_seq
|
||||||
|
AS integer
|
||||||
|
START WITH 1
|
||||||
|
INCREMENT BY 1
|
||||||
|
NO MINVALUE
|
||||||
|
NO MAXVALUE
|
||||||
|
CACHE 1;
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE public.viewers_id_seq OWNER TO postgres;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: viewers_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER SEQUENCE public.viewers_id_seq OWNED BY public.viewers.id;
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: votes; Type: TABLE; Schema: public; Owner: postgres
|
-- Name: votes; Type: TABLE; Schema: public; Owner: postgres
|
||||||
--
|
--
|
||||||
|
@ -3826,6 +3836,13 @@ ALTER TABLE ONLY public.userflags ALTER COLUMN id SET DEFAULT nextval('public.us
|
||||||
ALTER TABLE ONLY public.users ALTER COLUMN id SET DEFAULT nextval('public.users_id_seq'::regclass);
|
ALTER TABLE ONLY public.users ALTER COLUMN id SET DEFAULT nextval('public.users_id_seq'::regclass);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: viewers id; Type: DEFAULT; Schema: public; Owner: postgres
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY public.viewers ALTER COLUMN id SET DEFAULT nextval('public.viewers_id_seq'::regclass);
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: votes id; Type: DEFAULT; Schema: public; Owner: postgres
|
-- Name: votes id; Type: DEFAULT; Schema: public; Owner: postgres
|
||||||
--
|
--
|
||||||
|
@ -4465,6 +4482,14 @@ ALTER TABLE ONLY public.users
|
||||||
ADD CONSTRAINT users_username_key UNIQUE (username);
|
ADD CONSTRAINT users_username_key UNIQUE (username);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: viewers viewers_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY public.viewers
|
||||||
|
ADD CONSTRAINT viewers_pkey PRIMARY KEY (id);
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: votes votes_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
|
-- Name: votes votes_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
|
||||||
--
|
--
|
||||||
|
@ -5608,13 +5633,6 @@ ALTER TABLE ONLY public.users
|
||||||
ADD CONSTRAINT users_title_fkey FOREIGN KEY (title_id) REFERENCES public.titles(id);
|
ADD CONSTRAINT users_title_fkey FOREIGN KEY (title_id) REFERENCES public.titles(id);
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: SCHEMA public; Type: ACL; Schema: -; Owner: postgres
|
|
||||||
--
|
|
||||||
|
|
||||||
GRANT ALL ON SCHEMA public TO PUBLIC;
|
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- PostgreSQL database dump complete
|
-- PostgreSQL database dump complete
|
||||||
--
|
--
|
||||||
|
|
59
snappy.txt
59
snappy.txt
|
@ -745,8 +745,6 @@ And you can thank America for my attitude.
|
||||||
{[para]}
|
{[para]}
|
||||||
No.
|
No.
|
||||||
{[para]}
|
{[para]}
|
||||||
<table><tbody><tr><td>K</td><td></td><td>K</td><td>E</td><td>K</td></tr><tr><td>E</td><td></td><td>E</td><td></td><td></td></tr><tr><td>K</td><td>E</td><td>K</td><td>E</td><td>K</td></tr><tr><td></td><td></td><td>E</td><td></td><td>E</td></tr><tr><td>K</td><td>E</td><td>K</td><td></td><td>K</td></tr></tbody></table>
|
|
||||||
{[para]}
|
|
||||||
The fucking army? Are you serious? As somebody who was once in the US military, but got the fuck out as soon as possible, let me tell you about how truly evil and depraved the military is. During Basic Training, we were forced to this chant before shooting at the rifle range : "If they're brown, shoot them down!" At the rifle range, we fired at both adult sized targets and child sized targets. Half the targets were painted as being armed, and half the targets we were supposed to shoot at were painted as innocent civilians holding flowers. We were supposed to shoot at any target, regardless of whether it was armed or unarmed, whether it was an adult or a child. The only time in Basic Training we were allowed to watch tv was when the news showed reports of Muslim civilians being "accidentally killed" in air strikes. We were forced to scream "yes!" every time the news mentioned an innocent brown person being killed. As soon as I saw how truly evil and depraved the US military was, I GOT THE FUCK OUT. I went straight to the Drill Sergeants and told them I didn't want to be part of their right wing terrorist organization. I told them that I REFUSED to kill innocent people of color, and take part in unjustified wars of aggression. The Drill Sergeants responded by tying me up and beating my with their machine guns for ten minutes straight. They told me that I wasn't leaving and that if I ever tried to speak up against their hate and bigotry again, they would murder me. I took matters into my own hands, and jumped out the window at night while the Drill sergeants were asleep. This was the second floor, and fortunately I landed in some bushes. I ran the fuck away from the base I was at, and have not returned to this day. Every Time any American expresses admiration for the military, I fucking VOMIT. I was in for long enough to see that the US military is a white supremacist terrorist organization, just as bad as Daesh.
|
The fucking army? Are you serious? As somebody who was once in the US military, but got the fuck out as soon as possible, let me tell you about how truly evil and depraved the military is. During Basic Training, we were forced to this chant before shooting at the rifle range : "If they're brown, shoot them down!" At the rifle range, we fired at both adult sized targets and child sized targets. Half the targets were painted as being armed, and half the targets we were supposed to shoot at were painted as innocent civilians holding flowers. We were supposed to shoot at any target, regardless of whether it was armed or unarmed, whether it was an adult or a child. The only time in Basic Training we were allowed to watch tv was when the news showed reports of Muslim civilians being "accidentally killed" in air strikes. We were forced to scream "yes!" every time the news mentioned an innocent brown person being killed. As soon as I saw how truly evil and depraved the US military was, I GOT THE FUCK OUT. I went straight to the Drill Sergeants and told them I didn't want to be part of their right wing terrorist organization. I told them that I REFUSED to kill innocent people of color, and take part in unjustified wars of aggression. The Drill Sergeants responded by tying me up and beating my with their machine guns for ten minutes straight. They told me that I wasn't leaving and that if I ever tried to speak up against their hate and bigotry again, they would murder me. I took matters into my own hands, and jumped out the window at night while the Drill sergeants were asleep. This was the second floor, and fortunately I landed in some bushes. I ran the fuck away from the base I was at, and have not returned to this day. Every Time any American expresses admiration for the military, I fucking VOMIT. I was in for long enough to see that the US military is a white supremacist terrorist organization, just as bad as Daesh.
|
||||||
{[para]}
|
{[para]}
|
||||||
You’re gonna need to go home after this one. Certainly laughed though! Had a great time! You gotta go though, they don’t allow this kinda shit here. To be honest it’s kinda fucked up in a way too. Anyway, just get better. Spend some time reflecting, but most certainly get this Tom Foolery out of here.
|
You’re gonna need to go home after this one. Certainly laughed though! Had a great time! You gotta go though, they don’t allow this kinda shit here. To be honest it’s kinda fucked up in a way too. Anyway, just get better. Spend some time reflecting, but most certainly get this Tom Foolery out of here.
|
||||||
|
@ -1141,28 +1139,6 @@ Y⭕️u're 👊👐✋just 🅱🅾rℹ️ng🙄😣.
|
||||||
{[para]}
|
{[para]}
|
||||||
The only thing more pathetic than this post is how you think people actually actually care.
|
The only thing more pathetic than this post is how you think people actually actually care.
|
||||||
{[para]}
|
{[para]}
|
||||||
⣿⣿⣿⣿⣿⣿⣿⣿⠟⠛⢉⢉⠉⠉⠻⣿⣿⣿⣿⣿⣿⣿
|
|
||||||
⣿⣿⣿⣿⣿⣿⣿⠟⠠⡰⣕⣗⣷⣧⣀⣅⠘⣿⣿⣿⣿⣿
|
|
||||||
⣿⣿⣿⣿⣿⣿⠃⣠⣳⣟⣿⣿⣷⣿⡿⣜⠄⣿⣿⣿⣿⣿
|
|
||||||
⣿⣿⣿⣿⡿⠁⠄⣳⢷⣿⣿⣿⣿⡿⣝⠖⠄⣿⣿⣿⣿⣿
|
|
||||||
⣿⣿⣿⣿⠃⠄⢢⡹⣿⢷⣯⢿⢷⡫⣗⠍⢰⣿⣿⣿⣿⣿
|
|
||||||
⣿⣿⣿⡏⢀⢄⠤⣁⠋⠿⣗⣟⡯⡏⢎⠁⢸⣿⣿⣿⣿⣿
|
|
||||||
⣿⣿⣿⠄⢔⢕⣯⣿⣿⡲⡤⡄⡤⠄⡀⢠⣿⣿⣿⣿⣿⣿
|
|
||||||
⣿⣿⠇⠠⡳⣯⣿⣿⣾⢵⣫⢎⢎⠆⢀⣿⣿⣿⣿⣿⣿⣿
|
|
||||||
⣿⣿⠄⢨⣫⣿⣿⡿⣿⣻⢎⡗⡕⡅⢸⣿⣿⣿⣿⣿⣿⣿
|
|
||||||
⣿⣿⠄⢜⢾⣾⣿⣿⣟⣗⢯⡪⡳⡀⢸⣿⣿⣿⣿⣿⣿⣿
|
|
||||||
⣿⣿⠄⢸⢽⣿⣷⣿⣻⡮⡧⡳⡱⡁⢸⣿⣿⣿⣿⣿⣿⣿
|
|
||||||
⣿⣿⡄⢨⣻⣽⣿⣟⣿⣞⣗⡽⡸⡐⢸⣿⣿⣿⣿⣿⣿⣿
|
|
||||||
⣿⣿⡇⢀⢗⣿⣿⣿⣿⡿⣞⡵⡣⣊⢸⣿⣿⣿⣿⣿⣿⣿
|
|
||||||
⣿⣿⣿⡀⡣⣗⣿⣿⣿⣿⣯⡯⡺⣼⠎⣿⣿⣿⣿⣿⣿⣿
|
|
||||||
⣿⣿⣿⣧⠐⡵⣻⣟⣯⣿⣷⣟⣝⢞⡿⢹⣿⣿⣿⣿⣿⣿
|
|
||||||
⣿⣿⣿⣿⡆⢘⡺⣽⢿⣻⣿⣗⡷⣹⢩⢃⢿⣿⣿⣿⣿⣿
|
|
||||||
⣿⣿⣿⣿⣷⠄⠪⣯⣟⣿⢯⣿⣻⣜⢎⢆⠜⣿⣿⣿⣿⣿
|
|
||||||
⣿⣿⣿⣿⣿⡆⠄⢣⣻⣽⣿⣿⣟⣾⡮⡺⡸⠸⣿⣿⣿⣿
|
|
||||||
⣿⣿⡿⠛⠉⠁⠄⢕⡳⣽⡾⣿⢽⣯⡿⣮⢚⣅⠹⣿⣿⣿
|
|
||||||
⡿⠋⠄⠄⠄⠄⢀⠒⠝⣞⢿⡿⣿⣽⢿⡽⣧⣳⡅⠌⠻⣿
|
|
||||||
⠁⠄⠄⠄⠄⠄⠐⡐⠱⡱⣻⡻⣝⣮⣟⣿⣻⣷⣏⣾⢰⣈
|
|
||||||
{[para]}
|
|
||||||
Eat shit
|
Eat shit
|
||||||
{[para]}
|
{[para]}
|
||||||
Lolis are for headpats and feed them healthy food, not for lewd.
|
Lolis are for headpats and feed them healthy food, not for lewd.
|
||||||
|
@ -1427,20 +1403,6 @@ Educated adults of Earth have no choice but to accept the truth of Time Cube.
|
||||||
{[para]}
|
{[para]}
|
||||||
skrrt skrrt my heart hurt
|
skrrt skrrt my heart hurt
|
||||||
{[para]}
|
{[para]}
|
||||||
😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂
|
|
||||||
😂🆒🆒🆒🆒🆒🆒🆒🆒🆒🆒🆒🆒🆒😂
|
|
||||||
😂🆒💯🆒🆒🆒💯🆒💯💯💯🆒🆒🆒😂
|
|
||||||
😂🆒💯💯🆒💯💯🆒💯🆒💯💯🆒🆒😂
|
|
||||||
😂🆒🆒💯🆒💯🆒🆒💯🆒🆒💯💯🆒😂
|
|
||||||
😂🆒🆒💯💯💯🆒🆒💯🆒🆒🆒💯🆒😂
|
|
||||||
😂🆒🆒🆒💯🆒🆒🆒💯🆒🆒🆒💯🆒😂
|
|
||||||
😂🆒🆒💯💯💯🆒🆒💯🆒🆒🆒💯🆒😂
|
|
||||||
😂🆒🆒💯🆒💯🆒🆒💯🆒🆒💯💯🆒😂
|
|
||||||
😂🆒💯💯🆒💯💯🆒💯🆒💯💯🆒🆒😂
|
|
||||||
😂🆒💯🆒🆒🆒💯🆒💯💯💯🆒🆒🆒😂
|
|
||||||
😂🆒🆒🆒🆒🆒🆒🆒🆒🆒🆒🆒🆒🆒😂
|
|
||||||
😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂
|
|
||||||
{[para]}
|
|
||||||
We are contacting users interested in mass-marketing for their poop-chutes.
|
We are contacting users interested in mass-marketing for their poop-chutes.
|
||||||
|
|
||||||
Our team operates large-scale promotional campaigns here on Reddit, and we are able to increase the exposure of any brown eye significantly. We specialize in reviews, likes, comments, posts, upvotes, installations, ratings, articles, and pictures of men's anuses.
|
Our team operates large-scale promotional campaigns here on Reddit, and we are able to increase the exposure of any brown eye significantly. We specialize in reviews, likes, comments, posts, upvotes, installations, ratings, articles, and pictures of men's anuses.
|
||||||
|
@ -2069,7 +2031,7 @@ Basically gaming has legitamatley been a fucking horrible plauge on the world an
|
||||||
{[para]}
|
{[para]}
|
||||||
I don't even hate women, and I'm sure as hell not an incel. You seem to have just fabricated that bit. I've literally said like 20 times on here the "I hate women" bit is ironic.
|
I don't even hate women, and I'm sure as hell not an incel. You seem to have just fabricated that bit. I've literally said like 20 times on here the "I hate women" bit is ironic.
|
||||||
|
|
||||||
-@pizzashill
|
~ @pizzashill
|
||||||
{[para]}
|
{[para]}
|
||||||
This is a story of how i learned about the meaning of life... by shitting violently on my bathroom.
|
This is a story of how i learned about the meaning of life... by shitting violently on my bathroom.
|
||||||
|
|
||||||
|
@ -2149,3 +2111,22 @@ I cut my fucking ASSHOLE open shaving it because I wanted a nice, pretty, presen
|
||||||
{[para]}
|
{[para]}
|
||||||
'bussy' (boy pussy) should be a transmasculine exclusive term, not a term for cisgays to describe their assholes.
|
'bussy' (boy pussy) should be a transmasculine exclusive term, not a term for cisgays to describe their assholes.
|
||||||
edit: oh dear god stop the madness I didn't realize it was AAVE don't crucify me
|
edit: oh dear god stop the madness I didn't realize it was AAVE don't crucify me
|
||||||
|
{[para]}
|
||||||
|
Lots of people trying to explain to me that this is a joke, and look, I looked at the timeline, and it did seem to contain other racist material that may have been intended to be edgy and funny. But look, your racist “satire” is still racist, and you make lots of racist satire? Kinda makes me think you‘re actually a racist.
|
||||||
|
I promise whatever satirical aim you think this person has, they could TOTALLY exercise it in a way that wasn’t horribly racist. They’re being racist because they know that will get a rise out of people. And at that point, that’s not actually satire.
|
||||||
|
Hey, notice how this tweet acknowledges that I understand what the person is trying to accomplish? That means you don’t need to explain the “joke” to me. The problem with trying to be so absurdly racist that it’s satire is that you’re still being absurdly racist. If we’ve learned anything from the last four years, it’s that absurd racism does not in fact highlight how absurd racism is. It just makes absurd racism more common.
|
||||||
|
I don’t like it. I’m not going to start liking it. Saying the exact same things that absurdly racist people do but then saying it’s satire just makes me not trust you at all.
|
||||||
|
{[para]}
|
||||||
|
I swear to god I'm starting to hate the word cope, it's getting up there with based and "king shit" on my list of stuff that internetfags say way too much
|
||||||
|
|
||||||
|
The other day I made the case that just having kids doesn't mean you're contributing to society and the copefags came out of the woodwork there too, as if it's not possible to not be a permavirgin and also question whether filling a pussy with baby batter is actually an accomplishment
|
||||||
|
|
||||||
|
I'm starting to get the sneaking suspicion that there's a lot of projection going on around here. If you can only ever hope to cum inside someone twice in your life I guess getting them pregnant would seem like more of an accomplishment
|
||||||
|
|
||||||
|
Anyway, where am I? Oh, right, we were talking about fatties
|
||||||
|
|
||||||
|
Fuck it, I'm gonna take my meds and go out for my daily run
|
||||||
|
|
||||||
|
Because I'm not fat, you see, but I am a schizo
|
||||||
|
|
||||||
|
:crazyeyes:
|
Loading…
Reference in New Issue