remotes/1693045480750635534/spooky-22
Aevann1 2021-07-25 15:50:57 +02:00
commit a9043b82cd
27 changed files with 221 additions and 284 deletions

1
.gitignore vendored
View File

@ -1,5 +1,4 @@
dramacache/
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

View File

@ -52,9 +52,7 @@ app.config['SQLALCHEMY_READ_URIS'] = [
]
app.config['SECRET_KEY'] = environ.get('MASTER_KEY')
app.config["SERVER_NAME"] = environ.get(
"domain", environ.get(
"SERVER_NAME", "")).strip()
app.config["SERVER_NAME"] = environ.get("domain", environ.get("SERVER_NAME", "")).strip()
app.config["SHORT_DOMAIN"]=environ.get("SHORT_DOMAIN","").strip()
app.config["SESSION_COOKIE_NAME"] = "session_drama"
@ -177,7 +175,8 @@ def retry(f):
return f(self, *args, **kwargs)
except OperationalError as e:
#self.session.rollback()
raise(DatabaseOverload)
#raise(DatabaseOverload)
print("sex")
except:
self.session.rollback()
return f(self, *args, **kwargs)

View File

@ -421,7 +421,7 @@ class Submission(Base, Stndrd, Age_times, Scores, Fuzzing):
elif self.url:
if v and not v.oldreddit: return self.url.replace("old.reddit.com", "reddit.com")
if self.url: return self.url
return ""
return ""
@property
def body(self):

View File

@ -68,6 +68,8 @@ def upload_file(name, file, resize=None):
print(e)
print(req)
print(req.text)
return
else:
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']
@ -75,11 +77,14 @@ def upload_file(name, file, resize=None):
print(e)
print(req)
print(req.text)
return
try: url = resp['link'].replace(".png", "_d.png").replace(".jpg", "_d.jpg").replace(".jpeg", "_d.jpeg") + "?maxwidth=9999"
except Exception as e:
print(e)
print(req)
print(req.text)
return
new_image = Image(
text=url,

View File

@ -271,14 +271,11 @@ def validate_formkey(f):
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)

View File

@ -275,28 +275,24 @@ def admin_vote_info_get(v):
ups = g.db.query(Vote
).options(joinedload(Vote.user)
).filter_by(submission_id=thing.id, vote_type=1
).order_by(Vote.creation_ip.asc()
).all()
).all()
downs = g.db.query(Vote
).options(joinedload(Vote.user)
).filter_by(submission_id=thing.id, vote_type=-1
).order_by(Vote.creation_ip.asc()
).all()
).all()
elif isinstance(thing, Comment):
ups = g.db.query(CommentVote
).options(joinedload(CommentVote.user)
).filter_by(comment_id=thing.id, vote_type=1
).order_by(CommentVote.creation_ip.asc()
).all()
).all()
downs = g.db.query(CommentVote
).options(joinedload(CommentVote.user)
).filter_by(comment_id=thing.id, vote_type=-1
).order_by(CommentVote.creation_ip.asc()
).all()
).all()
else:
abort(400)

View File

@ -17,9 +17,10 @@ def api_flag_post(pid, v):
if existing:
return "", 409
reason = request.form.get("reason", "")[:100].strip()
flag = Flag(post_id=post.id,
user_id=v.id,
reason=reason,
created_utc=int(time.time())
)
@ -43,8 +44,10 @@ def api_flag_comment(cid, v):
if existing:
return "", 409
reason = request.form.get("reason", "")[:100].strip()
flag = CommentFlag(comment_id=comment.id,
user_id=v.id,
reason=reason,
created_utc=int(time.time())
)

View File

@ -40,7 +40,7 @@ def notifications(v):
for c in comments:
c._is_blocked = 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:
parent = c.parent_comment
if c not in parent.replies2:
@ -50,6 +50,8 @@ def notifications(v):
if c not in listing:
listing.append(c)
c.replies = c.replies2
elif c.parent_submission and c not in listing:
listing.append(c)
else:
if c.parent_comment:
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):
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:
blocking = g.db.query(
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
words = [' captainmeta4 ', ' cm4 ', ' dissident001 ', ' ladine ']
words = ['captainmeta4', ' cm4 ', 'dissident001', 'ladine']
for post in posts:
if post.author and post.author.admin_level == 0:

View File

@ -1,7 +1,6 @@
from urllib.parse import urlparse
import mistletoe
import urllib.parse
import threading
import gevent
from drama.helpers.wrappers import *
@ -23,27 +22,28 @@ from PIL import Image as PILimage
with open("snappy.txt", "r") as f:
snappyquotes = f.read().split("{[para]}")
@app.route("/resize")
def resize():
u = g.db.query(User).filter(User.profileurl != None, User.resized != True).first()
print(u.username)
print(f"1 {u.profileurl}")
x = requests.get(u.profileurl)
if u:
print(u.username)
print(f"1 {u.profileurl}")
x = requests.get(u.profileurl)
with open("resizing", "wb") as file:
for chunk in x.iter_content(1024):
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}")
with open("resizing", "wb") as file:
for chunk in x.iter_content(1024):
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}")
@app.route("/banaward/post/<post_id>")
@auth_required
@ -94,7 +94,7 @@ def submit_get(v):
if v and v.is_banned and not v.unban_utc: return render_template("seized.html")
b = get_guild("general")
return render_template("submit.html",
v=v,
b=b
@ -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}")
resize()
return redirect(p.permalink)
@app.route("/submit/title", methods=['GET'])
@ -1045,8 +1043,6 @@ def submit_post(v):
g.db.add(n)
g.db.commit()
send_message(f"https://rdrama.net{new_post.permalink}")
resize()
return {"html": lambda: redirect(new_post.permalink),
"api": lambda: jsonify(new_post.json)
@ -1072,8 +1068,6 @@ def delete_post_pid(pid, v):
cache.delete_memoized(frontlist)
resize()
return "", 204
@app.route("/undelete_post/<pid>", methods=["POST"])

View File

@ -1,6 +1,7 @@
import qrcode
import io
from datetime import datetime
import time
from drama.classes.user import ViewerRelationship
from drama.helpers.alerts import *
@ -10,7 +11,6 @@ from drama.mail import *
from flask import *
from drama.__main__ import app, cache, limiter, db_session
from pusher_push_notifications import PushNotifications
from .posts import resize
PUSHER_KEY = environ.get("PUSHER_KEY", "").strip()
@ -43,9 +43,6 @@ def user_info(v, username):
def leaderboard(v):
if v and v.is_banned and not v.unban_utc:return render_template("seized.html")
users1, users2 = leaderboard()
resize()
return render_template("leaderboard.html", v=v, users1=users1, users2=users2)
@cache.memoize(timeout=86400)
@ -76,7 +73,7 @@ def get_profilecss(username):
@app.route("/@<username>/reply/<id>", methods=["POST"])
@auth_required
def messagereply(v, username, id):
message = request.form.get("message", "")
message = request.form.get("message", "")[:1000].strip()
user = get_user(username)
with CustomRenderer() as renderer: text_html = renderer.render(mistletoe.Document(message))
text_html = sanitize(text_html, linkgen=True)
@ -125,7 +122,7 @@ def message2(v, username):
user = get_user(username, v=v)
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
message = request.form.get("message", "")
message = request.form.get("message", "")[:1000].strip()
send_pm(v.id, user, message)
beams_client.publish_to_interests(
interests=[str(user.id)],

View File

@ -12,12 +12,10 @@ from .users import leaderboard
@validate_formkey
def api_vote_post(post_id, x, v):
if x not in ["-1", "0", "1"]:
abort(400)
if x not in ["-1", "0", "1"]: abort(400)
# disallow bots
if request.headers.get("X-User-Type","") == "Bot":
abort(403)
if request.headers.get("X-User-Type","") == "Bot": abort(403)
x = int(x)
@ -36,41 +34,27 @@ def api_vote_post(post_id, x, v):
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
existing = g.db.query(Vote).filter_by(
user_id=v.id, submission_id=post.id).first()
existing = g.db.query(Vote).filter_by(user_id=v.id, submission_id=post.id).first()
if existing:
existing.change_to(x)
g.db.add(existing)
else:
vote = Vote(user_id=v.id,
vote_type=x,
submission_id=base36decode(post_id),
creation_ip=request.remote_addr,
app_id=v.client.application.id if v.client else None
)
g.db.add(vote)
try:
g.db.flush()
except:
return jsonify({"error":"Vote already exists."}), 422
g.db.flush()
posts = []
posts.append(post)
post.upvotes = post.ups
post.downvotes = post.downs
g.db.add(post)
g.db.commit()
users1, users2 = leaderboard()
return "", 204

View File

@ -114,7 +114,7 @@
<div class="user-info">
<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>&nbsp;{% endif %}
{% if c.active_flags %}&nbsp;<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>&nbsp;{% endif %}
{% if c.active_flags %}&nbsp;<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>&nbsp;{% endif %}
{% if c.over_18 %}<span class="badge badge-danger text-small-extra mr-1">+18</span>&nbsp;{% endif %}
{% if c.is_nsfl %}<span class="badge text-black border-danger border-1 text-small-extra">nsfl</span>&nbsp;{% 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>&nbsp;{% 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;">
<strong style="color: #999b2e;"><i class="far fa-fw fa-flag"></i> Reported by:</strong>
<ul style="margin-bottom: 0;">
{% for u in c.flagged_by %}
<li><a href="{{ u.url }}">@{{ u.username }}</a></li>
{% endfor %}
</ul>
{% for f in c.flags %}
<li><a href="{{ f.user.url }}">@{{ f.user.username }}</a>: "{{f.reason}}"</li>
{% endfor %}
</ul>
</div>
{% endif %}
@ -280,7 +280,7 @@
<div class="dropdown-menu border-0 shadow" aria-labelledby="dropdownMoreLink">
{% if not (v and v.id==c.author_id) %}
{% 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 %}
<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 %}
@ -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>
{% 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 %}
{% if v and c.parent_submission and c.author_id==v.id %}

View File

@ -225,13 +225,21 @@
this.innerHTML='<span class="spinner-border spinner-border-sm mr-2" role="status" aria-hidden="true"></span>Reporting comment';
this.disabled = true;
post('/api/flag/comment/' + id,
callback = function() {
var xhr = new XMLHttpRequest();
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');
document.getElementById("reportCommentFormAfter").classList.remove('d-none');
}
)
xhr.withCredentials=true;
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;
selectbox=document.getElementById('report-type-dropdown');
selectbox.value='reason_not_selected';
submitbutton=document.getElementById("reportPostButton");
submitbutton.disabled=true;
submitbutton.onclick = function() {
@ -275,9 +279,7 @@
xhr.open("POST", '/api/flag/post/'+id, true);
var form = new FormData()
form.append("formkey", formkey());
dropdown=document.getElementById("report-type-dropdown");
form.append("report_type", dropdown.options[dropdown.selectedIndex].value);
form.append("reason", document.getElementById("reason").value);
xhr.withCredentials=true;
@ -310,6 +312,9 @@
});
$('.expandable-image').click( function(event) {
if (event.which != 1) {

View File

@ -17,4 +17,4 @@
</div>
</div>
</div>
{% endblock %}
{% endblock %}

View File

@ -17,4 +17,4 @@
</div>
</div>
</div>
{% endblock %}
{% endblock %}

View File

@ -17,4 +17,4 @@
</div>
</div>
</div>
{% endblock %}
{% endblock %}

View File

@ -17,4 +17,4 @@
</div>
</div>
</div>
{% endblock %}
{% endblock %}

View File

@ -16,4 +16,4 @@
</div>
</div>
</div>
{% endblock %}
{% endblock %}

View File

@ -18,4 +18,4 @@
</div>
</div>
</div>
{% endblock %}
{% endblock %}

View File

@ -10,23 +10,16 @@
</div>
<!-- Before report is made, show this -->
<div class="" id="reportCommentFormBefore">
<form>
<form id="report-comment-form" method="post">
<div class="modal-body">
<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>
<input type="hidden" name="formkey" value="{{v.formkey}}">
<select name="report_type" class="custom-select mt-3">
<option disabled selected>
Reason for flagging?
</option>
<option value="admin">
This comment breaks Drama policy
</option>
</select>
<small class="form-text text-muted">Please enter a reason for reporting below.</small>
<pre></pre>
<input maxlength="100" id="reason-comment" class="form-control"/>
</div>
<div class="modal-footer">
<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>
</form>
</div>

View File

@ -13,22 +13,13 @@
<form id="report-post-form" method="post">
<div class="modal-body">
<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>
<input type="hidden" name="formkey" value="{{v.formkey}}">
<select id="report-type-dropdown" name="report_type" form="report-post-form" class="custom-select mt-3" onchange="document.getElementById('reportPostButton').disabled=false;">
<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>
<small class="form-text text-muted">Please enter a reason for reporting below.</small>
<pre></pre>
<input maxlength="100" id="reason" class="form-control"/>
</div>
<div class="modal-footer">
<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>
</form>
</div>

View File

@ -3,11 +3,9 @@
<script>
var date = new Date('{{p.created_datetime}}');
document.getElementById('timestamp').title = date.toString();
document.getElementById('timestamp-2').title = date.toString();
{% if p.edited_utc %}
var date = new Date('{{p.edited_datetime}}');
document.getElementById('edited_timestamp').title = date.toString();
document.getElementById('edited_timestamp-2').title = date.toString();
{% endif %}
</script>
@ -112,7 +110,7 @@
<div class="modal-body">
<ul class="list-group post-actions">
{% 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 %}
{% if v and v.id==p.author_id %}
{% 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.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').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 %}&nbsp;<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">&nbsp;&nbsp;{{p.author.username}}</a>{% if p.author.customtitle %}&nbsp;<bdi style="color: #{{p.author.titlecolor}}">&nbsp;{{p.author.customtitle | safe}}</bdi>{% endif %}{% endif %}
<span data-toggle="tooltip" data-placement="bottom" id="timestamp" title="">&nbsp;{{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 %})
@ -351,7 +349,7 @@
{% endif %}
{% 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 %}
{% 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;">
<strong style="color: #999b2e;"><i class="far fa-fw fa-flag"></i> Reported by:</strong>
<ul style="margin-bottom: 0;">
{% for u in p.flagged_by %}
<li><a href="{{ u.url }}">@{{ u.username }}</a></li>
{% for f in p.flags %}
<li><a href="{{ f.user.url }}">@{{ f.user.username }}</a>: "{{f.reason}}"</li>
{% endfor %}
</ul>
</div>

View File

@ -3,11 +3,9 @@
<script>
var date = new Date('{{p.created_datetime}}');
document.getElementById('timestamp-{{p.id}}').title = date.toString();
document.getElementById('timestamp-{{p.id}}-2').title = date.toString();
{% if p.edited_utc %}
var date = new Date('{{p.edited_datetime}}');
document.getElementById('edited_timestamp-{{p.id}}').title = date.toString();
document.getElementById('edited_timestamp-{{p.id}}-2').title = date.toString();
{% endif %}
</script>
@ -126,52 +124,28 @@
<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>&nbsp;{% 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>&nbsp;{% endif %}
{% if p.stickied %}<i class="fas fa-thumbtack text-admin fa-rotate--45" data-toggle="tooltip" data-placement="bottom" title="Pinned post"></i>&nbsp;{% 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>&nbsp;{% 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>&nbsp;{% endif %}
{% if p.over_18 %}&nbsp;<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 %}&nbsp;<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 %}&nbsp;<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}}">&nbsp;&nbsp;{{p.author.customtitle | safe}}</bdi>{% endif %}{% endif %}
<span data-toggle="tooltip" data-placement="bottom" id="timestamp-{{p.id}}" title="">&nbsp;{{p.age_string}}</span>
&nbsp;
({% 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 %}&nbsp;&nbsp;Edited <span data-toggle="tooltip" data-placement="bottom" id="edited_timestamp-{{p.id}}" title="">{{p.edited_string}}</span>{% endif %}
&nbsp;&nbsp;{{p.views}} views
<div class="post-meta text-left x-scroll" style="overflow-x: scroll;">
{% 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>&nbsp;{% 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>&nbsp;{% endif %}
{% if p.stickied %}<i class="fas fa-thumbtack text-admin fa-rotate--45" data-toggle="tooltip" data-placement="bottom" title="Pinned post"></i>&nbsp;{% 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>&nbsp;{% 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>&nbsp;{% 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>&nbsp;{% 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>&nbsp;{% endif %}
{% if p.active_flags %}&nbsp;<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 %}&nbsp;<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}}">&nbsp;&nbsp;{{p.author.customtitle | safe}}</bdi>{% endif %}
<span data-toggle="tooltip" data-placement="bottom" id="timestamp-{{p.id}}" title="">&nbsp;{{p.age_string}}</span>
{% endif %}&nbsp;({{p.domain}})
{% if p.edited_utc %}&nbsp;&nbsp;Edited <span data-toggle="tooltip" data-placement="bottom" id="edited_timestamp-{{p.id}}" title="">{{p.edited_string}}</span>{% endif %}
&nbsp;&nbsp;{{p.views}} views
</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>&nbsp;{% 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>&nbsp;{% endif %}
{% if p.stickied %}<i class="fas fa-thumbtack text-admin fa-rotate--45" data-toggle="tooltip" data-placement="bottom" title="Pinned post"></i>&nbsp;{% 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>&nbsp;{% 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>&nbsp;{% endif %}
{% if p.over_18 %}&nbsp;<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 %}&nbsp;<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 %}&nbsp;<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}}">&nbsp;&nbsp;{{p.author.customtitle | safe}}</bdi>{% endif %}{% endif %}
<span data-toggle="tooltip" data-placement="bottom" id="timestamp-{{p.id}}-2" title="">&nbsp;{{p.age_string}}</span>
&nbsp;
({% 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 %}&nbsp;&nbsp;Edited <span data-toggle="tooltip" data-placement="bottom" id="edited_timestamp-{{p.id}}-2" title="">{{p.edited_string}}</span>{% endif %}
&nbsp;&nbsp;{{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 %}>
{{p.realtitle(v) | safe}}
@ -217,7 +191,7 @@
{% endif %}
{% 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 %}
{% 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;">
<strong style="color: #999b2e;"><i class="far fa-fw fa-flag"></i> Reported by:</strong>
<ul style="margin-bottom: 0;">
{% for u in p.flagged_by %}
<li><a href="{{ u.url }}">@{{ u.username }}</a></li>
{% for f in p.flags %}
<li><a href="{{ f.user.url }}">@{{ f.user.username }}</a>: "{{f.reason}}"</li>
{% endfor %}
</ul>
</div>
@ -401,7 +375,7 @@
{% endif %}
{% 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 %}
{% 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>

View File

@ -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 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">
<pre></pre>
<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 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">
<pre></pre>
<textarea id="input-message-mobile" form="message-mobile" name="message" rows="3" class="form-control" required></textarea>

View File

@ -1,6 +1,6 @@
{% extends "default.html" %}
{% block content %}
<pre class="d-none d-md-inline-block"></pre>
<pre></pre>
<h5>Users who viewed your profile</h5>
<pre></pre>
<table class="table table-striped mb-5">

View File

@ -2,8 +2,8 @@
-- PostgreSQL database dump
--
-- Dumped from database version 10.17 (Ubuntu 10.17-0ubuntu0.18.04.1)
-- Dumped by pg_dump 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 12.7 (Ubuntu 12.7-0ubuntu0.20.04.1)
SET statement_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.accepted_idx;
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_pkey;
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.alts DROP CONSTRAINT alts_pkey;
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.userflags 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;
DROP SEQUENCE public.votes_id_seq;
DROP TABLE public.votes;
DROP SEQUENCE public.viewers_id_seq;
DROP TABLE public.viewers;
DROP SEQUENCE public.users_id_seq;
DROP SEQUENCE public.userflags_id_seq;
DROP TABLE public.userflags;
@ -445,47 +449,8 @@ DROP TABLE public.boards;
DROP EXTENSION pg_trgm;
DROP EXTENSION pg_stat_statements;
DROP EXTENSION fuzzystrmatch;
DROP EXTENSION plpgsql;
DROP SCHEMA public;
--
-- Name: DATABASE postgres; Type: COMMENT; Schema: -; Owner: postgres
--
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:
-- Name: fuzzystrmatch; Type: EXTENSION; Schema: -; Owner: -
--
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;
@ -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;
@ -528,7 +493,7 @@ COMMENT ON EXTENSION pg_trgm IS 'text similarity measurement and index searching
SET default_tablespace = '';
SET default_with_oids = false;
SET default_table_access_method = heap;
--
-- Name: boards; Type: TABLE; Schema: public; Owner: postgres
@ -624,7 +589,8 @@ CREATE TABLE public.comments (
creation_region character(2) DEFAULT NULL::bpchar,
purged_utc integer DEFAULT 0,
sentto integer,
shadowbanned boolean
shadowbanned boolean,
banaward text
);
@ -687,7 +653,8 @@ CREATE TABLE public.submissions (
is_bot boolean DEFAULT false,
thumburl text,
private boolean,
views integer
views integer,
banaward text
);
@ -797,7 +764,11 @@ CREATE TABLE public.users (
dramacoins integer,
agendaposter boolean,
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,
user_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,
user_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,
user_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;
--
-- 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
--
@ -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);
--
-- 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
--
@ -4465,6 +4482,14 @@ ALTER TABLE ONLY public.users
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
--
@ -5608,13 +5633,6 @@ ALTER TABLE ONLY public.users
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
--

View File

@ -745,8 +745,6 @@ And you can thank America for my attitude.
{[para]}
No.
{[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.
{[para]}
Youre gonna need to go home after this one. Certainly laughed though! Had a great time! You gotta go though, they dont allow this kinda shit here. To be honest its 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 🅱🅾rng🙄😣.
{[para]}
The only thing more pathetic than this post is how you think people actually actually care.
{[para]}
⣿⣿⣿⣿⣿⣿⣿⣿⠟⠛⢉⢉⠉⠉⠻⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⠟⠠⡰⣕⣗⣷⣧⣀⣅⠘⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⠃⣠⣳⣟⣿⣿⣷⣿⡿⣜⠄⣿⣿⣿⣿⣿
⣿⣿⣿⣿⡿⠁⠄⣳⢷⣿⣿⣿⣿⡿⣝⠖⠄⣿⣿⣿⣿⣿
⣿⣿⣿⣿⠃⠄⢢⡹⣿⢷⣯⢿⢷⡫⣗⠍⢰⣿⣿⣿⣿⣿
⣿⣿⣿⡏⢀⢄⠤⣁⠋⠿⣗⣟⡯⡏⢎⠁⢸⣿⣿⣿⣿⣿
⣿⣿⣿⠄⢔⢕⣯⣿⣿⡲⡤⡄⡤⠄⡀⢠⣿⣿⣿⣿⣿⣿
⣿⣿⠇⠠⡳⣯⣿⣿⣾⢵⣫⢎⢎⠆⢀⣿⣿⣿⣿⣿⣿⣿
⣿⣿⠄⢨⣫⣿⣿⡿⣿⣻⢎⡗⡕⡅⢸⣿⣿⣿⣿⣿⣿⣿
⣿⣿⠄⢜⢾⣾⣿⣿⣟⣗⢯⡪⡳⡀⢸⣿⣿⣿⣿⣿⣿⣿
⣿⣿⠄⢸⢽⣿⣷⣿⣻⡮⡧⡳⡱⡁⢸⣿⣿⣿⣿⣿⣿⣿
⣿⣿⡄⢨⣻⣽⣿⣟⣿⣞⣗⡽⡸⡐⢸⣿⣿⣿⣿⣿⣿⣿
⣿⣿⡇⢀⢗⣿⣿⣿⣿⡿⣞⡵⡣⣊⢸⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⡀⡣⣗⣿⣿⣿⣿⣯⡯⡺⣼⠎⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣧⠐⡵⣻⣟⣯⣿⣷⣟⣝⢞⡿⢹⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⡆⢘⡺⣽⢿⣻⣿⣗⡷⣹⢩⢃⢿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣷⠄⠪⣯⣟⣿⢯⣿⣻⣜⢎⢆⠜⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⡆⠄⢣⣻⣽⣿⣿⣟⣾⡮⡺⡸⠸⣿⣿⣿⣿
⣿⣿⡿⠛⠉⠁⠄⢕⡳⣽⡾⣿⢽⣯⡿⣮⢚⣅⠹⣿⣿⣿
⡿⠋⠄⠄⠄⠄⢀⠒⠝⣞⢿⡿⣿⣽⢿⡽⣧⣳⡅⠌⠻⣿
⠁⠄⠄⠄⠄⠄⠐⡐⠱⡱⣻⡻⣝⣮⣟⣿⣻⣷⣏⣾⢰⣈
{[para]}
 
{[para]}
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]}
skrrt skrrt my heart hurt
{[para]}
😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂
😂🆒🆒🆒🆒🆒🆒🆒🆒🆒🆒🆒🆒🆒😂
😂🆒💯🆒🆒🆒💯🆒💯💯💯🆒🆒🆒😂
😂🆒💯💯🆒💯💯🆒💯🆒💯💯🆒🆒😂
😂🆒🆒💯🆒💯🆒🆒💯🆒🆒💯💯🆒😂
😂🆒🆒💯💯💯🆒🆒💯🆒🆒🆒💯🆒😂
😂🆒🆒🆒💯🆒🆒🆒💯🆒🆒🆒💯🆒😂
😂🆒🆒💯💯💯🆒🆒💯🆒🆒🆒💯🆒😂
😂🆒🆒💯🆒💯🆒🆒💯🆒🆒💯💯🆒😂
😂🆒💯💯🆒💯💯🆒💯🆒💯💯🆒🆒😂
😂🆒💯🆒🆒🆒💯🆒💯💯💯🆒🆒🆒😂
😂🆒🆒🆒🆒🆒🆒🆒🆒🆒🆒🆒🆒🆒😂
😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂
{[para]}
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.
@ -2069,7 +2031,7 @@ Basically gaming has legitamatley been a fucking horrible plauge on the world an
{[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.
-@pizzashill
~ @pizzashill
{[para]}
This is a story of how i learned about the meaning of life... by shitting violently on my bathroom.
@ -2148,4 +2110,23 @@ Don't mock my community. Don't mock Harry Potter fans or those winning with Auti
I cut my fucking ASSHOLE open shaving it because I wanted a nice, pretty, presentable hole. Im not talking like a little baby papercut but like, DEEP, hemorrhaging squirting GASH and now 10 hours later I am laying in bed with the most unimaginable throbbing pain you can imagine emanating from my boypucci lips every time I give it a lil squeeze but I need to take a mega shit now and this is literally worse than childbirth help me please
{[para]}
'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 youre actually a racist.
I promise whatever satirical aim you think this person has, they could TOTALLY exercise it in a way that wasnt horribly racist. Theyre being racist because they know that will get a rise out of people. And at that point, thats not actually satire.
Hey, notice how this tweet acknowledges that I understand what the person is trying to accomplish? That means you dont need to explain the “joke” to me. The problem with trying to be so absurdly racist that its satire is that youre still being absurdly racist. If weve learned anything from the last four years, its that absurd racism does not in fact highlight how absurd racism is. It just makes absurd racism more common.
I dont like it. Im not going to start liking it. Saying the exact same things that absurdly racist people do but then saying its 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: