Merge branch 'master' into mistletoe
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 30 KiB |
BIN
files/assets/images/badges/Fish.webp
Normal file
After Width: | Height: | Size: 85 KiB |
BIN
files/assets/images/badges/Patron-1.webp
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
files/assets/images/badges/Patron-2.webp
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
files/assets/images/badges/Patron-3.webp
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
files/assets/images/badges/Patron-4.webp
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
files/assets/images/badges/Patron-5.webp
Normal file
After Width: | Height: | Size: 59 KiB |
BIN
files/assets/images/badges/fish.webp
Normal file
After Width: | Height: | Size: 85 KiB |
|
@ -1,4 +1,4 @@
|
|||
function removeFollower(event, username) {
|
||||
function removeFollowing(event, username) {
|
||||
post_toast('/unfollow/' + username);
|
||||
let table = document.getElementById("followers-table");
|
||||
table.removeChild(event.target.parentElement.parentElement);
|
||||
|
|
|
@ -95,6 +95,7 @@ class User(Base):
|
|||
sig_html = Column(String)
|
||||
fp = Column(String)
|
||||
sigs_disabled = Column(Boolean)
|
||||
fish = Column(Boolean)
|
||||
friends = deferred(Column(String))
|
||||
friends_html = deferred(Column(String))
|
||||
enemies = deferred(Column(String))
|
||||
|
|
|
@ -106,7 +106,7 @@ SLURS = {
|
|||
"kung flu": "SARS-CoV-2 syndemic",
|
||||
}
|
||||
|
||||
LONGPOST_REPLIES = ['Wow, you must be a JP fan.', 'This is one of the worst posts I have EVER seen. Delete it.', "No, don't reply like this, please do another wall of unhinged rant please.", '# 😴😴😴', "Ma'am we've been over this before. You need to stop.", "I've known more coherent downies.", "Your pulitzer's in the mail", "That's great and all, but I asked for my burger without cheese.", 'That degree finally paying off', "That's nice sweaty. Why don't you have a seat in the time out corner with Pizzashill until you calm down, then you can have your Capri Sun.", "All them words won't bring your pa back.", "You had a chance to not be completely worthless, but it looks like you threw it away. At least you're consistent.", 'Some people are able to display their intelligence by going on at length on a subject and never actually saying anything. This ability is most common in trades such as politics, public relations, and law. You have impressed me by being able to best them all, while still coming off as an absolute idiot.', "You can type 10,000 characters and you decided that these were the one's that you wanted.", 'Have you owned the libs yet?', "I don't know what you said, because I've seen another human naked.", 'Impressive. Normally people with such severe developmental disabilities struggle to write much more than a sentence or two. He really has exceded our expectations for the writing portion. Sadly the coherency of his writing, along with his abilities in the social skills and reading portions, are far behind his peers with similar disabilities.', "This is a really long way of saying you don't fuck.", "Sorry ma'am, looks like his delusions have gotten worse. We'll have to admit him,", '', 'If only you could put that energy into your relationships', 'Posts like this is why I do Heroine.', 'still unemployed then?', 'K', 'look im gunna have 2 ask u 2 keep ur giant dumps in the toilet not in my replys 😷😷😷', "Mommy is soooo proud of you, sweaty. Let's put this sperg out up on the fridge with all your other failures.", "Good job bobby, here's a star", "That was a mistake. You're about to find out the hard way why.", 'You sat down and wrote all this shit. You could have done so many other things with your life. What happened to your life that made you decide writing novels of bullshit on rdrama.net was the best option?', "I don't have enough spoons to read this shit", "All those words won't bring daddy back.", 'OUT!']
|
||||
LONGPOST_REPLIES = ['Wow, you must be a JP fan.', 'This is one of the worst posts I have EVER seen. Delete it.', "No, don't reply like this, please do another wall of unhinged rant please.", '# 😴😴😴', "Ma'am we've been over this before. You need to stop.", "I've known more coherent downies.", "Your pulitzer's in the mail", "That's great and all, but I asked for my burger without cheese.", 'That degree finally paying off', "That's nice sweaty. Why don't you have a seat in the time out corner with Pizzashill until you calm down, then you can have your Capri Sun.", "All them words won't bring your pa back.", "You had a chance to not be completely worthless, but it looks like you threw it away. At least you're consistent.", 'Some people are able to display their intelligence by going on at length on a subject and never actually saying anything. This ability is most common in trades such as politics, public relations, and law. You have impressed me by being able to best them all, while still coming off as an absolute idiot.', "You can type 10,000 characters and you decided that these were the one's that you wanted.", 'Have you owned the libs yet?', "I don't know what you said, because I've seen another human naked.", 'Impressive. Normally people with such severe developmental disabilities struggle to write much more than a sentence or two. He really has exceded our expectations for the writing portion. Sadly the coherency of his writing, along with his abilities in the social skills and reading portions, are far behind his peers with similar disabilities.', "This is a really long way of saying you don't fuck.", "Sorry ma'am, looks like his delusions have gotten worse. We'll have to admit him,", ':#marseywoah:', 'If only you could put that energy into your relationships', 'Posts like this is why I do Heroine.', 'still unemployed then?', 'K', 'look im gunna have 2 ask u 2 keep ur giant dumps in the toilet not in my replys 😷😷😷', "Mommy is soooo proud of you, sweaty. Let's put this sperg out up on the fridge with all your other failures.", "Good job bobby, here's a star", "That was a mistake. You're about to find out the hard way why.", 'You sat down and wrote all this shit. You could have done so many other things with your life. What happened to your life that made you decide writing novels of bullshit on rdrama.net was the best option?', "I don't have enough spoons to read this shit", "All those words won't bring daddy back.", 'OUT!']
|
||||
|
||||
AGENDAPOSTER_MSG = """Hi @{username},\n\nYour comment has been automatically removed because you forgot
|
||||
to include `trans lives matter`.\n\nDon't worry, we're here to help! We
|
||||
|
@ -415,6 +415,10 @@ BADGES = {
|
|||
'name': 'Dinner',
|
||||
'description': 'Yes, it is edible'
|
||||
},
|
||||
90: {
|
||||
'name': 'Fish',
|
||||
'description': 'This user cannot be unfollowed'
|
||||
},
|
||||
}
|
||||
|
||||
AWARDS = {
|
||||
|
@ -536,7 +540,7 @@ AWARDS = {
|
|||
"description": "Pins the post/comment.",
|
||||
"icon": "fas fa-thumbtack fa-rotate--45",
|
||||
"color": "text-warning",
|
||||
"price": 750
|
||||
"price": 1000
|
||||
},
|
||||
"unpin": {
|
||||
"kind": "unpin",
|
||||
|
@ -626,6 +630,14 @@ AWARDS = {
|
|||
"color": "text-lightgreen",
|
||||
"price": 10000
|
||||
},
|
||||
"fish": {
|
||||
"kind": "fish",
|
||||
"title": "Fish",
|
||||
"description": "This user cannot be unfollowed",
|
||||
"icon": "fas fa-fish",
|
||||
"color": "text-lightblue",
|
||||
"price": 20000
|
||||
},
|
||||
"pause": {
|
||||
"kind": "pause",
|
||||
"title": "Pause",
|
||||
|
@ -715,7 +727,7 @@ AWARDS2 = {
|
|||
"description": "Pins the post/comment.",
|
||||
"icon": "fas fa-thumbtack fa-rotate--45",
|
||||
"color": "text-warning",
|
||||
"price": 750
|
||||
"price": 1000
|
||||
},
|
||||
"unpin": {
|
||||
"kind": "unpin",
|
||||
|
@ -805,6 +817,14 @@ AWARDS2 = {
|
|||
"color": "text-lightgreen",
|
||||
"price": 10000
|
||||
},
|
||||
"fish": {
|
||||
"kind": "fish",
|
||||
"title": "Fish",
|
||||
"description": "This user cannot be unfollowed",
|
||||
"icon": "fas fa-fish",
|
||||
"color": "text-lightblue",
|
||||
"price": 20000
|
||||
},
|
||||
"pause": {
|
||||
"kind": "pause",
|
||||
"title": "Pause",
|
||||
|
@ -875,4 +895,4 @@ NOTIFIED_USERS = {
|
|||
'landlordmessiah': LLM_ID,
|
||||
' llm ': LLM_ID,
|
||||
'landlet': LLM_ID,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -183,7 +183,7 @@ def sanitize(sanitized, noimages=False):
|
|||
remoji = emoji
|
||||
|
||||
if path.isfile(f'./files/assets/images/emojis/{remoji}.webp'):
|
||||
new = re.sub(f'(?<!"):{emoji}:', f'<img loading="lazy" data-bs-toggle="tooltip" alt=":{emoji}:" title=":{emoji}:" delay="0" {classes}src="https://{site}/assets/images/emojis/{remoji}.webp" >', new)
|
||||
new = re.sub(f'(?<!"):{emoji}:', f'<img loading="lazy" data-bs-toggle="tooltip" alt=":{emoji}:" title=":{emoji}:" delay="0" {classes}src="https://{site}/assets/images/emojis/{remoji}.webp" >', new, flags=re.I)
|
||||
|
||||
sanitized = sanitized.replace(old, new)
|
||||
|
||||
|
@ -193,10 +193,10 @@ def sanitize(sanitized, noimages=False):
|
|||
if emoji.startswith("!"):
|
||||
emoji = emoji[1:]
|
||||
if path.isfile(f'./files/assets/images/emojis/{emoji}.webp'):
|
||||
sanitized = re.sub(f'(?<!"):!{emoji}:', f'<img loading="lazy" data-bs-toggle="tooltip" alt=":!{emoji}:" title=":!{emoji}:" delay="0" height=30 class="emj mirrored" src="https://{site}/assets/images/emojis/{emoji}.webp">', sanitized)
|
||||
sanitized = re.sub(f'(?<!"):!{emoji}:', f'<img loading="lazy" data-bs-toggle="tooltip" alt=":!{emoji}:" title=":!{emoji}:" delay="0" height=30 class="emj mirrored" src="https://{site}/assets/images/emojis/{emoji}.webp">', sanitized, flags=re.I)
|
||||
|
||||
elif path.isfile(f'./files/assets/images/emojis/{emoji}.webp'):
|
||||
sanitized = re.sub(f'(?<!"):{emoji}:', f'<img loading="lazy" data-bs-toggle="tooltip" alt=":{emoji}:" title=":{emoji}:" delay="0" height=30 class="emj" src="https://{site}/assets/images/emojis/{emoji}.webp">', sanitized)
|
||||
sanitized = re.sub(f'(?<!"):{emoji}:', f'<img loading="lazy" data-bs-toggle="tooltip" alt=":{emoji}:" title=":{emoji}:" delay="0" height=30 class="emj" src="https://{site}/assets/images/emojis/{emoji}.webp">', sanitized, flags=re.I)
|
||||
|
||||
sanitized = sanitized.replace("https://www.", "https://").replace("https://youtu.be/", "https://youtube.com/watch?v=").replace("https://music.youtube.com/watch?v=", "https://youtube.com/watch?v=").replace("https://open.spotify.com/", "https://open.spotify.com/embed/").replace("https://streamable.com/", "https://streamable.com/e/").replace("https://youtube.com/shorts/", "https://youtube.com/watch?v=").replace("https://mobile.twitter", "https://twitter").replace("https://m.facebook", "https://facebook").replace("https://m.wikipedia", "https://wikipedia").replace("https://m.youtube", "https://youtube")
|
||||
|
||||
|
@ -235,15 +235,15 @@ def filter_emojis_only(title):
|
|||
title = bleach.clean(title, tags=[])
|
||||
|
||||
for i in re.finditer('(?<!"):([!A-Za-z0-9]{1,30}?):', title):
|
||||
emoji = i.group(1)
|
||||
emoji = i.group(1).lower()
|
||||
|
||||
if emoji.startswith("!"):
|
||||
emoji = emoji[1:]
|
||||
if path.isfile(f'./files/assets/images/emojis/{emoji}.webp'):
|
||||
title = re.sub(f'(?<!"):!{emoji}:', f'<img loading="lazy" data-bs-toggle="tooltip" alt=":!{emoji}:" title=":!{emoji}:" delay="0" height=30 src="https://{site}/assets/images/emojis/{emoji}.webp" class="emj mirrored">', title)
|
||||
title = re.sub(f'(?<!"):!{emoji}:', f'<img loading="lazy" data-bs-toggle="tooltip" alt=":!{emoji}:" title=":!{emoji}:" delay="0" height=30 src="https://{site}/assets/images/emojis/{emoji}.webp" class="emj mirrored">', title, flags=re.I)
|
||||
|
||||
elif path.isfile(f'./files/assets/images/emojis/{emoji}.webp'):
|
||||
title = re.sub(f'(?<!"):{emoji}:', f'<img loading="lazy" data-bs-toggle="tooltip" alt=":{emoji}:" title=":{emoji}:" delay="0" height=30 class="emj" src="https://{site}/assets/images/emojis/{emoji}.webp">', title)
|
||||
title = re.sub(f'(?<!"):{emoji}:', f'<img loading="lazy" data-bs-toggle="tooltip" alt=":{emoji}:" title=":{emoji}:" delay="0" height=30 class="emj" src="https://{site}/assets/images/emojis/{emoji}.webp">', title, flags=re.I)
|
||||
|
||||
if len(title) > 1500: abort(400)
|
||||
else: return title
|
|
@ -726,7 +726,7 @@ def admin_title_change(user_id, v):
|
|||
kind=kind,
|
||||
user_id=v.id,
|
||||
target_user_id=user.id,
|
||||
_note=f'"{new_name}"'
|
||||
_note=f'"{user.customtitleplain}"'
|
||||
)
|
||||
g.db.add(ma)
|
||||
g.db.commit()
|
||||
|
|
|
@ -82,7 +82,7 @@ def shop(v):
|
|||
"icon": "fas fa-thumbtack fa-rotate--45",
|
||||
"color": "text-warning",
|
||||
"owned": 0,
|
||||
"price": 750
|
||||
"price": 1000
|
||||
},
|
||||
"unpin": {
|
||||
"kind": "unpin",
|
||||
|
@ -183,6 +183,15 @@ def shop(v):
|
|||
"owned": 0,
|
||||
"price": 10000
|
||||
},
|
||||
"fish": {
|
||||
"kind": "fish",
|
||||
"title": "Fish",
|
||||
"description": "This user cannot be unfollowed",
|
||||
"icon": "fas fa-fish",
|
||||
"color": "text-lightblue",
|
||||
"owned": 0,
|
||||
"price": 20000
|
||||
},
|
||||
"pause": {
|
||||
"kind": "pause",
|
||||
"title": "Pause",
|
||||
|
@ -303,7 +312,7 @@ def buy(v, award):
|
|||
"description": "Pins the post/comment.",
|
||||
"icon": "fas fa-thumbtack fa-rotate--45",
|
||||
"color": "text-warning",
|
||||
"price": 750
|
||||
"price": 1000
|
||||
},
|
||||
"unpin": {
|
||||
"kind": "unpin",
|
||||
|
@ -393,6 +402,14 @@ def buy(v, award):
|
|||
"color": "text-lightgreen",
|
||||
"price": 10000
|
||||
},
|
||||
"fish": {
|
||||
"kind": "fish",
|
||||
"title": "Fish",
|
||||
"description": "This user cannot be unfollowed",
|
||||
"icon": "fas fa-fish",
|
||||
"color": "text-lightblue",
|
||||
"price": 20000
|
||||
},
|
||||
"pause": {
|
||||
"kind": "pause",
|
||||
"title": "Pause",
|
||||
|
@ -468,7 +485,7 @@ def buy(v, award):
|
|||
|
||||
if request.values.get("mb"):
|
||||
if v.procoins < price: return {"error": "Not enough marseybux."}, 400
|
||||
if award in ["grass","alt"]: return {"error": "You can't buy those awards with marseybux."}, 403
|
||||
if award == "grass": return {"error": "You can't buy the grass award with marseybux."}, 403
|
||||
v.procoins -= price
|
||||
else:
|
||||
if v.coins < price: return {"error": "Not enough coins."}, 400
|
||||
|
@ -661,8 +678,15 @@ def award_post(pid, v):
|
|||
new_badge = Badge(badge_id=87, user_id=author.id)
|
||||
g.db.add(new_badge)
|
||||
for block in g.db.query(UserBlock).filter_by(target_id=author.id).all(): g.db.delete(block)
|
||||
elif kind == "fish":
|
||||
author.fish = True
|
||||
send_notification(CARP_ID, f"@{v.username} used {kind} award!")
|
||||
if not author.has_badge(90):
|
||||
new_badge = Badge(badge_id=90, user_id=author.id)
|
||||
g.db.add(new_badge)
|
||||
|
||||
post.author.received_award_count += 1
|
||||
if post.author.received_award_count: post.author.received_award_count += 1
|
||||
else: post.author.received_award_count = 1
|
||||
g.db.add(post.author)
|
||||
|
||||
g.db.commit()
|
||||
|
@ -816,8 +840,15 @@ def award_comment(cid, v):
|
|||
new_badge = Badge(badge_id=87, user_id=author.id)
|
||||
g.db.add(new_badge)
|
||||
for block in g.db.query(UserBlock).filter_by(target_id=author.id).all(): g.db.delete(block)
|
||||
elif kind == "fish":
|
||||
author.fish = True
|
||||
send_notification(CARP_ID, f"@{v.username} used {kind} award!")
|
||||
if not author.has_badge(90):
|
||||
new_badge = Badge(badge_id=90, user_id=author.id)
|
||||
g.db.add(new_badge)
|
||||
|
||||
c.author.received_award_count += 1
|
||||
if c.author.received_award_count: c.author.received_award_count += 1
|
||||
else: c.author.received_award_count = 1
|
||||
g.db.add(c.author)
|
||||
|
||||
g.db.commit()
|
||||
|
|
|
@ -192,7 +192,7 @@ def api_comment(v):
|
|||
file=request.files["file"]
|
||||
if not file.content_type.startswith('image/'): return {"error": "That wasn't an image!"}, 400
|
||||
|
||||
name = f'/images/{int(time.time())}{secrets.token_urlsafe(2)}.webp'
|
||||
name = f'/images/{time.time()}'.replace('.','') + '.webp'
|
||||
file.save(name)
|
||||
url = request.host_url[:-1] + process_image(name)
|
||||
|
||||
|
@ -595,11 +595,6 @@ def api_comment(v):
|
|||
|
||||
g.db.commit()
|
||||
|
||||
if v.agendaposter and random.randint(1, 10) < 4:
|
||||
if request.host == 'rdrama.net':
|
||||
return redirect(random.choice(['https://secure.actblue.com/donate/ms_blm_homepage_2019','https://rdrama.net/post/19711/a-short-guide-on-how-to','https://secure.transequality.org/site/Donation2?df_id=1480']))
|
||||
return redirect('https://secure.actblue.com/donate/ms_blm_homepage_2019')
|
||||
|
||||
if request.headers.get("Authorization"): return c.json
|
||||
else: return render_template("comments.html", v=v, comments=[c])
|
||||
|
||||
|
@ -726,7 +721,7 @@ def edit_comment(cid, v):
|
|||
file=request.files["file"]
|
||||
if not file.content_type.startswith('image/'): return {"error": "That wasn't an image!"}, 400
|
||||
|
||||
name = f'/images/{int(time.time())}{secrets.token_urlsafe(2)}.webp'
|
||||
name = f'/images/{time.time()}'.replace('.','') + '.webp'
|
||||
file.save(name)
|
||||
url = request.host_url[:-1] + process_image(name)
|
||||
|
||||
|
|
|
@ -93,10 +93,6 @@ def post_id(pid, anything=None, v=None):
|
|||
|
||||
if v and request.path.startswith('/logged_out'): v = None
|
||||
|
||||
if v and v.agendaposter and random.randint(1, 20) == 1:
|
||||
if request.host == 'rdrama.net':
|
||||
return redirect(random.choice(['https://secure.actblue.com/donate/ms_blm_homepage_2019','https://rdrama.net/post/19711/a-short-guide-on-how-to','https://secure.transequality.org/site/Donation2?df_id=1480']))
|
||||
return redirect('https://secure.actblue.com/donate/ms_blm_homepage_2019')
|
||||
|
||||
try: pid = int(pid)
|
||||
except Exception as e: pass
|
||||
|
@ -381,7 +377,7 @@ def edit_post(pid, v):
|
|||
file=request.files["file"]
|
||||
if not file.content_type.startswith('image/'): return {"error": "That wasn't an image!"}, 400
|
||||
|
||||
name = f'/images/{int(time.time())}{secrets.token_urlsafe(2)}.webp'
|
||||
name = f'/images/{time.time()}'.replace('.','') + '.webp'
|
||||
file.save(name)
|
||||
url = request.host_url[:-1] + process_image(name)
|
||||
|
||||
|
@ -650,7 +646,7 @@ def thumbnail_thread(pid):
|
|||
db.close()
|
||||
return
|
||||
|
||||
name = f'/images/{int(time.time())}{secrets.token_urlsafe(2)}.webp'
|
||||
name = f'/images/{time.time()}'.replace('.','') + '.webp'
|
||||
|
||||
with open(name, "wb") as file:
|
||||
for chunk in image_req.iter_content(1024):
|
||||
|
@ -868,7 +864,7 @@ def submit_post(v):
|
|||
file=request.files["file2"]
|
||||
if not file.content_type.startswith('image/'): return {"error": "That wasn't an image!"}, 400
|
||||
|
||||
name = f'/images/{int(time.time())}{secrets.token_urlsafe(2)}.webp'
|
||||
name = f'/images/{time.time()}'.replace('.','') + '.webp'
|
||||
file.save(name)
|
||||
url = request.host_url[:-1] + process_image(name)
|
||||
|
||||
|
@ -956,7 +952,7 @@ def submit_post(v):
|
|||
), 403
|
||||
|
||||
if file.content_type.startswith('image/'):
|
||||
name = f'/images/{int(time.time())}{secrets.token_urlsafe(2)}.webp'
|
||||
name = f'/images/{time.time()}'.replace('.','') + '.webp'
|
||||
file.save(name)
|
||||
new_post.url = request.host_url[:-1] + process_image(name)
|
||||
|
||||
|
@ -1140,10 +1136,6 @@ def submit_post(v):
|
|||
|
||||
g.db.commit()
|
||||
|
||||
if v.agendaposter and random.randint(1, 10) < 4:
|
||||
if request.host == 'rdrama.net':
|
||||
return redirect(random.choice(['https://secure.actblue.com/donate/ms_blm_homepage_2019','https://rdrama.net/post/19711/a-short-guide-on-how-to','https://secure.transequality.org/site/Donation2?df_id=1480']))
|
||||
return redirect('https://secure.actblue.com/donate/ms_blm_homepage_2019')
|
||||
|
||||
if request.headers.get("Authorization"): return new_post.json
|
||||
else: return redirect(new_post.permalink)
|
||||
|
|
|
@ -124,7 +124,7 @@ def settings_profile_post(v):
|
|||
if request.headers.get("Authorization"): return {"error": f"Image files only"}, 400
|
||||
else: return render_template("settings_profile.html", v=v, error=f"Image files only."), 400
|
||||
|
||||
name = f'/images/{int(time.time())}{secrets.token_urlsafe(2)}.webp'
|
||||
name = f'/images/{time.time()}'.replace('.','') + '.webp'
|
||||
file.save(name)
|
||||
url = request.host_url[:-1] + process_image(name)
|
||||
|
||||
|
@ -314,7 +314,7 @@ def settings_profile_post(v):
|
|||
if request.headers.get("Authorization"): return {"error": f"Image files only"}, 400
|
||||
else: return render_template("settings_profile.html", v=v, error=f"Image files only."), 400
|
||||
|
||||
name = f'/images/{int(time.time())}{secrets.token_urlsafe(2)}.webp'
|
||||
name = f'/images/{time.time()}'.replace('.','') + '.webp'
|
||||
file.save(name)
|
||||
url = request.host_url[:-1] + process_image(name)
|
||||
|
||||
|
@ -720,7 +720,7 @@ def settings_images_profile(v):
|
|||
|
||||
file = request.files["profile"]
|
||||
|
||||
name = f'/images/{int(time.time())}{secrets.token_urlsafe(2)}.webp'
|
||||
name = f'/images/{time.time()}'.replace('.','') + '.webp'
|
||||
file.save(name)
|
||||
highres = request.host_url[:-1] + process_image(name)
|
||||
|
||||
|
@ -756,7 +756,7 @@ def settings_images_banner(v):
|
|||
|
||||
file = request.files["banner"]
|
||||
|
||||
name = f'/images/{int(time.time())}{secrets.token_urlsafe(2)}.webp'
|
||||
name = f'/images/{time.time()}'.replace('.','') + '.webp'
|
||||
file.save(name)
|
||||
bannerurl = request.host_url[:-1] + process_image(name)
|
||||
|
||||
|
@ -816,10 +816,7 @@ def settings_css_get(v):
|
|||
def settings_css(v):
|
||||
css = request.values.get("css").strip().replace('\\', '').strip()[:4000]
|
||||
|
||||
if not v.agendaposter:
|
||||
v.css = css
|
||||
else:
|
||||
v.css = 'body *::before, body *::after { content: "Trans rights are human rights!"; }'
|
||||
v.css = css
|
||||
g.db.add(v)
|
||||
g.db.commit()
|
||||
|
||||
|
|
|
@ -262,10 +262,11 @@ def static_service(path):
|
|||
return resp
|
||||
|
||||
@app.get('/images/<path:path>')
|
||||
@app.get('/IMAGES/<path:path>')
|
||||
@app.get('/hostedimages/<path:path>')
|
||||
@limiter.exempt
|
||||
def images(path):
|
||||
resp = make_response(send_from_directory('/images', path))
|
||||
resp = make_response(send_from_directory('/images', path.replace('.WEBP','.webp')))
|
||||
resp.headers.remove("Cache-Control")
|
||||
resp.headers.add("Cache-Control", "public, max-age=2628000")
|
||||
if request.path.endswith('.webp'):
|
||||
|
|
|
@ -765,7 +765,7 @@ def unfollow_user(username, v):
|
|||
|
||||
target = get_user(username)
|
||||
|
||||
if target.id == CARP_ID: abort(403)
|
||||
if target.fish: return {"error": "You can't unfollow this user!"}
|
||||
|
||||
follow = g.db.query(Follow).filter_by(user_id=v.id, target_id=target.id).first()
|
||||
|
||||
|
|
|
@ -101,7 +101,7 @@ def api_vote_post(post_id, new, v):
|
|||
post.author.coins += 1
|
||||
post.author.truecoins += 1
|
||||
g.db.add(post.author)
|
||||
real = bool(v.profileurl) or bool(v.customtitle) or v.namecolor != defaultcolor and not v.agendaposter and not v.shadowbanned
|
||||
real = (bool(v.profileurl) or bool(v.customtitle) or v.namecolor != defaultcolor) and not v.agendaposter and not v.shadowbanned
|
||||
vote = Vote(user_id=v.id,
|
||||
vote_type=new,
|
||||
submission_id=post_id,
|
||||
|
|
|
@ -55,7 +55,7 @@
|
|||
{% for k, v in badge_types.items() %}
|
||||
<tr>
|
||||
<td><input type="radio" id="badge-{{k}}" name="badge_id" value="{{k}}"></td>
|
||||
<td><label for="badge-{{k}}"><img loading="lazy" src="/assets/images/badges/{{v['name']}}.webp" width="70px" height="70px"></label></td>
|
||||
<td><label for="badge-{{k}}"><img loading="lazy" src="/assets/images/badges/{{v['name']}}.webp?v=1" width="70px" height="70px"></label></td>
|
||||
<td>{{v['name']}}</td>
|
||||
<td>{{v['description']}}</td>
|
||||
</tr>
|
||||
|
|
|
@ -13,11 +13,11 @@
|
|||
|
||||
{% if v %}
|
||||
<style>:root{--primary:#{{v.themecolor}}}</style>
|
||||
<link rel="stylesheet" href="/assets/css/main.css?v=139"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=125">
|
||||
<link rel="stylesheet" href="/assets/css/main.css?v=142"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=125">
|
||||
{% if v.agendaposter %}<link rel="stylesheet" href="/assets/css/agendaposter.css?v=125">{% elif v.css %}<link rel="stylesheet" href="/@{{v.username}}/css">{% endif %}
|
||||
{% else %}
|
||||
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
|
||||
<link rel="stylesheet" href="/assets/css/main.css?v=139"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=125">
|
||||
<link rel="stylesheet" href="/assets/css/main.css?v=142"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=125">
|
||||
{% endif %}
|
||||
|
||||
</head>
|
||||
|
|
|
@ -27,6 +27,11 @@
|
|||
</label>
|
||||
</div>
|
||||
{% endfor %}
|
||||
<a class="card disabled d-md-none" style="border:none">
|
||||
<i class="fas fa-volume-mute" style="opacity:0"></i>
|
||||
<div class="pt-2" style="font-weight: bold; font-size: 14px; color:#E1E1E1"> </div>
|
||||
<div class="text-muted"> </div>
|
||||
</a>
|
||||
</div>
|
||||
<label id="notelabel" for="note" class="pt-4 label">
|
||||
Note
|
||||
|
@ -80,7 +85,7 @@
|
|||
|
||||
@media (min-width: 767.98px) {
|
||||
.award-columns {
|
||||
column-count: 9 !important;
|
||||
column-count: 7 !important;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -21,7 +21,7 @@
|
|||
{% for k,v in badges.items() %}
|
||||
<tr>
|
||||
<td>{{v['name']}}</td>
|
||||
<td><img loading="lazy" src="/assets/images/badges/{{v['name']}}.webp" width=50 height=50>
|
||||
<td><img loading="lazy" src="/assets/images/badges/{{v['name']}}.webp?v=1" width=50 height=50>
|
||||
<td>{{v['description']}}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{% extends "default.html" %}
|
||||
{% block content %}
|
||||
<script src="/assets/js/following.js?v=2"></script>
|
||||
<script src="/assets/js/following.js?v=3"></script>
|
||||
<pre>
|
||||
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
|||
<td style="font-weight: bold">{{loop.index}}</td>
|
||||
<td><a style="color:#{{user.namecolor}}; font-weight:bold;" href="/@{{user.username}}"><img loading="lazy" src="/uid/{{user.id}}/pic" class="pp20"><span {% if user.patron %}class="patron" style="background-color:#{{user.namecolor}};"{% endif %}>{{user.username}}</span></a></td>
|
||||
{% if v.id == u.id %}
|
||||
<td><div class="btn btn-danger" onclick="removeFollower(event, '{{user.username}}')">Unfollow</div></td>
|
||||
<td><div class="btn btn-danger" onclick="removeFollowing(event, '{{user.username}}')">Unfollow</div></td>
|
||||
{% endif %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
|
|
@ -69,7 +69,7 @@ You can use Markdown formatting:
|
|||
<tr>
|
||||
<td>WEBM Files</td>
|
||||
<td>https://files.catbox.moe/v4om92.mp4</td>
|
||||
<td><video controls preload="none" class="embedvid"><source src="https://files.catbox.moe/v4om92.mp4" type="video/mp4"></video></td>
|
||||
<td><video controls preload="none" class="embedvid"><source src="https://files.catbox.moe/nr9joo.webm" type="video/webm"></video></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Emojis</td>
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
<div class="navbar navbar-expand-md navbar-light" id="navbar">
|
||||
<div class="container-fluid" style="padding:0;">
|
||||
<div class="flex-grow-1">
|
||||
<a {% if v %}href="/"{% else %}href="/logged_out"{% endif %} class="navbar-brand mr-auto">
|
||||
<a href="/" class="navbar-brand mr-auto">
|
||||
<img loading="lazy" height="30" src="/assets/images/{{'SITE_NAME' | app_config}}/headericon.webp?v=4">
|
||||
{% if "gigachadlife" in request.host %}
|
||||
<span style="font-weight: bold; font-size: 1.2rem;">GigaChadLife</span>
|
||||
|
|
|
@ -6,11 +6,11 @@
|
|||
{% block content %}
|
||||
{% if v %}
|
||||
<style>:root{--primary:#{{v.themecolor}}}</style>
|
||||
<link rel="stylesheet" href="/assets/css/main.css?v=139"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=125">
|
||||
<link rel="stylesheet" href="/assets/css/main.css?v=142"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=125">
|
||||
{% if v.agendaposter %}<link rel="stylesheet" href="/assets/css/agendaposter.css?v=125">{% elif v.css %}<link rel="stylesheet" href="/@{{v.username}}/css">{% endif %}
|
||||
{% else %}
|
||||
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
|
||||
<link rel="stylesheet" href="/assets/css/main.css?v=139"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=125">
|
||||
<link rel="stylesheet" href="/assets/css/main.css?v=142"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=125">
|
||||
{% endif %}
|
||||
|
||||
<div class="row justify-content-around">
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
<title>2-Step Login - {{'SITE_NAME' | app_config}}</title>
|
||||
|
||||
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
|
||||
<link rel="stylesheet" href="/assets/css/main.css?v=139"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=125">
|
||||
<link rel="stylesheet" href="/assets/css/main.css?v=142"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=125">
|
||||
|
||||
</head>
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
<td style="font-weight:bold;">{{loop.index}}</td>
|
||||
<td><a style="color:#{{u.namecolor}}; font-weight:bold;" href="/@{{u.username}}"><img loading="lazy" src="{{u.profile_url}}" class="pp20"><span {% if u.patron %}class="patron" style="background-color:#{{u.namecolor}};"{% endif %}>{{u.username}}</span></a></td>
|
||||
|
||||
<td><img loading="lazy" width=32 height=32 src="/assets/images/badges/patron-{{u.patron}}.webp?v=2"></td>
|
||||
<td><img loading="lazy" width=32 height=32 src="/assets/images/badges/Patron-{{u.patron}}.webp?v=2"></td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
|
|
@ -36,13 +36,13 @@
|
|||
|
||||
{% if v %}
|
||||
<style>:root{--primary:#{{v.themecolor}}}</style>
|
||||
<link rel="stylesheet" href="/assets/css/main.css?v=139"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=125">
|
||||
<link rel="stylesheet" href="/assets/css/main.css?v=142"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=125">
|
||||
{% else %}
|
||||
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
|
||||
<link rel="stylesheet" href="/assets/css/main.css?v=139"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=125">
|
||||
<link rel="stylesheet" href="/assets/css/main.css?v=142"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=125">
|
||||
{% endif %}
|
||||
|
||||
<link href="/assets/css/fa.css?v=54" rel="stylesheet">
|
||||
<link href="/assets/css/fa.css?v=55" rel="stylesheet">
|
||||
</head>
|
||||
|
||||
<body id="settings2" style="overflow-x: hidden; {% if v and v.background %} background:url(/assets/images/backgrounds/{{v.background}}) no-repeat center center fixed !important; background-size: cover!important; background-color: #000!important;{% endif %}">
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
<title>{% if ref_user %}{{ref_user.username}} invites you to {{'SITE_NAME' | app_config}}{% else %}{{'SITE_NAME' | app_config}}{% endif %}</title>
|
||||
|
||||
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
|
||||
<link rel="stylesheet" href="/assets/css/main.css?v=139"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=125">
|
||||
<link rel="stylesheet" href="/assets/css/main.css?v=142"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=125">
|
||||
|
||||
</head>
|
||||
|
||||
|
|
|
@ -86,7 +86,7 @@
|
|||
|
||||
<div class="post-actions d-none d-md-block">
|
||||
<ul class="list-inline text-left mb-2">
|
||||
<li class="list-inline-item"><a {% if v %}href="{{p.permalink}}"{% else %}href="/logged_out{{p.permalink}}"{% endif %}><i
|
||||
<li class="list-inline-item"><a href="{{p.permalink}}"><i
|
||||
class="fas fa-comment-dots"></i>{{p.comment_count}} Comment{{'s' if p.comment_count != 1 else ''}}</a>
|
||||
</li>
|
||||
|
||||
|
|
|
@ -766,7 +766,8 @@ CREATE TABLE public.users (
|
|||
longpost integer,
|
||||
unblockable boolean,
|
||||
teddit boolean,
|
||||
bird integer
|
||||
bird integer,
|
||||
fish boolean
|
||||
);
|
||||
|
||||
|
||||
|
|