fg
This commit is contained in:
parent
23fbca2223
commit
00c5d17d78
9 changed files with 55 additions and 65 deletions
|
@ -10,7 +10,7 @@ class Treasure:
|
||||||
self.db = g.db
|
self.db = g.db
|
||||||
|
|
||||||
def check_for_treasure(self, in_text, from_comment):
|
def check_for_treasure(self, in_text, from_comment):
|
||||||
if '!slots' not in in_text and '!blackjack' not in in_text:
|
if '!slots' not in in_text and '!blackjack' not in in_text and '!wordle' not in in_text:
|
||||||
seed = random.randint(1, 1000)
|
seed = random.randint(1, 1000)
|
||||||
is_special = seed == 1000
|
is_special = seed == 1000
|
||||||
is_standard = seed >= 990
|
is_standard = seed >= 990
|
||||||
|
|
|
@ -29,6 +29,11 @@ class Wordle:
|
||||||
guesses = []
|
guesses = []
|
||||||
count = len(guesses)
|
count = len(guesses)
|
||||||
|
|
||||||
|
if (guess.lower() == answer):
|
||||||
|
status = "won"
|
||||||
|
elif (count == 5):
|
||||||
|
status = "lost"
|
||||||
|
|
||||||
if (guess != None and len(guess) == 5 and status == "active"):
|
if (guess != None and len(guess) == 5 and status == "active"):
|
||||||
result = ["🟥"]*5
|
result = ["🟥"]*5
|
||||||
pos = 0 # letter position
|
pos = 0 # letter position
|
||||||
|
@ -43,13 +48,5 @@ class Wordle:
|
||||||
result[pos] = result[pos] + "🟥" # red
|
result[pos] = result[pos] + "🟥" # red
|
||||||
pos += 1 # add 1 to the letter position
|
pos += 1 # add 1 to the letter position
|
||||||
guesses.append("/".join(result))
|
guesses.append("/".join(result))
|
||||||
else:
|
|
||||||
return
|
|
||||||
|
|
||||||
if (guess.lower() in answer):
|
|
||||||
status = "won"
|
|
||||||
elif (count == 6):
|
|
||||||
status = "lost"
|
|
||||||
|
|
||||||
from_comment.wordle_result = format_all(guesses, status, answer)
|
from_comment.wordle_result = format_all(guesses, status, answer)
|
||||||
|
|
|
@ -287,7 +287,7 @@ def sanitize(sanitized, noimages=False, alert=False, comment=False, edit=False):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def filter_emojis_only(title, edit=False):
|
def filter_emojis_only(title, edit=False, graceful=False):
|
||||||
|
|
||||||
title = title.replace('<','<').replace('>','>').replace("\n", "").replace("\r", "").replace("\t", "").strip()
|
title = title.replace('<','<').replace('>','>').replace("\n", "").replace("\r", "").replace("\t", "").strip()
|
||||||
|
|
||||||
|
@ -321,5 +321,5 @@ def filter_emojis_only(title, edit=False):
|
||||||
if path.isfile(f'files/assets/images/emojis/{emoji}.webp'):
|
if path.isfile(f'files/assets/images/emojis/{emoji}.webp'):
|
||||||
title = re.sub(f'(?<!"):{old}:', f'<img loading="lazy" data-bs-toggle="tooltip" alt=":{old}:" title=":{old}:" delay="0" class="{classes}" src="/static/assets/images/emojis/{emoji}.webp">', title, re.I)
|
title = re.sub(f'(?<!"):{old}:', f'<img loading="lazy" data-bs-toggle="tooltip" alt=":{old}:" title=":{old}:" delay="0" class="{classes}" src="/static/assets/images/emojis/{emoji}.webp">', title, re.I)
|
||||||
|
|
||||||
if len(title) > 1500: abort(400)
|
if len(title) > 1500 and not graceful: abort(400)
|
||||||
else: return title
|
else: return title
|
|
@ -275,7 +275,7 @@ def api_comment(v):
|
||||||
if ban.reason: reason += f" {ban.reason}"
|
if ban.reason: reason += f" {ban.reason}"
|
||||||
return {"error": reason}, 401
|
return {"error": reason}, 401
|
||||||
|
|
||||||
if parent_post.id not in (37696,37697,37749,37833,37838) and not body.startswith('!slots') and not body.startswith('!casino'):
|
if parent_post.id not in (37696,37697,37749,37833,37838) and '!slots' not in body.lower() and '!blackjack' not in body.lower() and '!wordle' not in body.lower() and AGENDAPOSTER_PHRASE not in body.lower():
|
||||||
existing = g.db.query(Comment.id).filter(Comment.author_id == v.id,
|
existing = g.db.query(Comment.id).filter(Comment.author_id == v.id,
|
||||||
Comment.deleted_utc == 0,
|
Comment.deleted_utc == 0,
|
||||||
Comment.parent_comment_id == parent_comment_id,
|
Comment.parent_comment_id == parent_comment_id,
|
||||||
|
@ -289,7 +289,7 @@ def api_comment(v):
|
||||||
|
|
||||||
is_bot = bool(request.headers.get("Authorization"))
|
is_bot = bool(request.headers.get("Authorization"))
|
||||||
|
|
||||||
if '!slots' not in body.lower() and '!blackjack' not in body.lower() and parent_post.id not in (37696,37697,37749,37833,37838) and not is_bot and not v.marseyawarded and AGENDAPOSTER_PHRASE not in body.lower() and len(body) > 10:
|
if '!slots' not in body.lower() and '!blackjack' not in body.lower() and '!wordle' not in body.lower() and parent_post.id not in (37696,37697,37749,37833,37838) and not is_bot and not v.marseyawarded and AGENDAPOSTER_PHRASE not in body.lower() and len(body) > 10:
|
||||||
now = int(time.time())
|
now = int(time.time())
|
||||||
cutoff = now - 60 * 60 * 24
|
cutoff = now - 60 * 60 * 24
|
||||||
|
|
||||||
|
|
|
@ -252,10 +252,8 @@ def sign_up_post(v):
|
||||||
|
|
||||||
args = {"error": error}
|
args = {"error": error}
|
||||||
if request.values.get("referred_by"):
|
if request.values.get("referred_by"):
|
||||||
user = g.db.query(User).filter_by(
|
user = g.db.query(User).filter_by(id=request.values.get("referred_by")).one_or_none()
|
||||||
id=request.values.get("referred_by")).one_or_none()
|
if user: args["ref"] = user.username
|
||||||
if user:
|
|
||||||
args["ref"] = user.username
|
|
||||||
|
|
||||||
return redirect(f"{SITE_FULL}/signup?{urlencode(args)}")
|
return redirect(f"{SITE_FULL}/signup?{urlencode(args)}")
|
||||||
|
|
||||||
|
|
|
@ -823,11 +823,11 @@ def submit_post(v, sub=None):
|
||||||
sub = sub[0]
|
sub = sub[0]
|
||||||
else: sub = None
|
else: sub = None
|
||||||
|
|
||||||
if v.is_suspended: return {"error": "You can't perform this action while banned."}, 403
|
if v.is_suspended: error( "You can't perform this action while banned.")
|
||||||
|
|
||||||
if v and v.patron:
|
if v and v.patron:
|
||||||
if request.content_length > 8 * 1024 * 1024: return {"error": "Max file size is 8 MB."}, 413
|
if request.content_length > 8 * 1024 * 1024: error( "Max file size is 8 MB.")
|
||||||
elif request.content_length > 4 * 1024 * 1024: return {"error": "Max file size is 4 MB."}, 413
|
elif request.content_length > 4 * 1024 * 1024: error( "Max file size is 4 MB.")
|
||||||
|
|
||||||
title = request.values.get("title", "").strip()[:500].replace('','')
|
title = request.values.get("title", "").strip()[:500].replace('','')
|
||||||
|
|
||||||
|
@ -835,15 +835,22 @@ def submit_post(v, sub=None):
|
||||||
|
|
||||||
if v.agendaposter and not v.marseyawarded: title = torture_ap(title, v.username)
|
if v.agendaposter and not v.marseyawarded: title = torture_ap(title, v.username)
|
||||||
|
|
||||||
title_html = filter_emojis_only(title)
|
|
||||||
body = request.values.get("body", "").strip().replace('','')
|
body = request.values.get("body", "").strip().replace('','')
|
||||||
|
|
||||||
if v.marseyawarded and len(list(re.finditer('>[^<\s+]|[^>\s+]<', title_html, re.A))): return {"error":"You can only type marseys!"}, 40
|
def error(error):
|
||||||
|
print(sub, flush=True)
|
||||||
|
if request.headers.get("Authorization") or request.headers.get("xhr"): error(error)
|
||||||
|
return render_template("submit.html", SUBS=() if SITE_NAME == 'Drama' else tuple(x[0] for x in g.db.query(Sub.name).order_by(Sub.name).all()), v=v, error=error, title=title, url=url, body=body), 400
|
||||||
|
|
||||||
|
title_html = filter_emojis_only(title, graceful=True)
|
||||||
|
if len(title_html) > 1500: return error("Rendered title is too big!")
|
||||||
|
|
||||||
|
if v.marseyawarded and len(list(re.finditer('>[^<\s+]|[^>\s+]<', title_html, re.A))): return error("You can only type marseys!")
|
||||||
|
|
||||||
if v.longpost:
|
if v.longpost:
|
||||||
if len(body) < 280 or ' [](' in body or body.startswith('[]('): return {"error":"You have to type more than 280 characters!"}, 403
|
if len(body) < 280 or ' [](' in body or body.startswith('[]('): return error("You have to type more than 280 characters!")
|
||||||
elif v.bird:
|
elif v.bird:
|
||||||
if len(body) > 140 : return {"error":"You have to type less than 140 characters!"}, 403
|
if len(body) > 140 : return error("You have to type less than 140 characters!")
|
||||||
|
|
||||||
if url:
|
if url:
|
||||||
if "/i.imgur.com/" in url: url = url.replace(".png", ".webp").replace(".jpg", ".webp").replace(".jpeg", ".webp")
|
if "/i.imgur.com/" in url: url = url.replace(".png", ".webp").replace(".jpg", ".webp").replace(".jpeg", ".webp")
|
||||||
|
@ -893,8 +900,7 @@ def submit_post(v, sub=None):
|
||||||
if not domain_obj: domain_obj = get_domain(domain+parsed_url.path)
|
if not domain_obj: domain_obj = get_domain(domain+parsed_url.path)
|
||||||
if domain_obj:
|
if domain_obj:
|
||||||
reason = f"Remove the {domain_obj.domain} link from your post and try again. {domain_obj.reason}"
|
reason = f"Remove the {domain_obj.domain} link from your post and try again. {domain_obj.reason}"
|
||||||
if request.headers.get("Authorization") or request.headers.get("xhr"): return {"error":reason}, 400
|
return error(reason)
|
||||||
return render_template("submit.html", SUBS=() if SITE_NAME == 'Drama' else tuple(x[0] for x in g.db.query(Sub.name).order_by(Sub.name).all()), v=v, error=reason, title=title, url=url, body=request.values.get("body", "")), 400
|
|
||||||
elif "twitter.com" == domain:
|
elif "twitter.com" == domain:
|
||||||
try: embed = requests.get("https://publish.twitter.com/oembed", timeout=5, params={"url":url, "omit_script":"t"}).json()["html"]
|
try: embed = requests.get("https://publish.twitter.com/oembed", timeout=5, params={"url":url, "omit_script":"t"}).json()["html"]
|
||||||
except: embed = None
|
except: embed = None
|
||||||
|
@ -915,27 +921,24 @@ def submit_post(v, sub=None):
|
||||||
else: embed = None
|
else: embed = None
|
||||||
|
|
||||||
if not url and not request.values.get("body") and not request.files.get("file", None):
|
if not url and not request.values.get("body") and not request.files.get("file", None):
|
||||||
if request.headers.get("Authorization") or request.headers.get("xhr"): return {"error": "`url` or `body` parameter required."}, 400
|
return error("Please enter a url or some text.")
|
||||||
return render_template("submit.html", SUBS=() if SITE_NAME == 'Drama' else tuple(x[0] for x in g.db.query(Sub.name).order_by(Sub.name).all()), v=v, error="Please enter a url or some text.", title=title, url=url, body=request.values.get("body", "")), 400
|
|
||||||
|
|
||||||
if not title:
|
if not title:
|
||||||
if request.headers.get("Authorization") or request.headers.get("xhr"): return {"error": "Please enter a better title"}, 400
|
return error("Please enter a better title.")
|
||||||
return render_template("submit.html", SUBS=() if SITE_NAME == 'Drama' else tuple(x[0] for x in g.db.query(Sub.name).order_by(Sub.name).all()), v=v, error="Please enter a better title.", title=title, url=url, body=request.values.get("body", "")), 400
|
|
||||||
|
|
||||||
|
|
||||||
elif len(title) > 500:
|
elif len(title) > 500:
|
||||||
if request.headers.get("Authorization") or request.headers.get("xhr"): return {"error": "500 character limit for titles"}, 400
|
return error("There's a 500 character limit for titles.")
|
||||||
else: render_template("submit.html", SUBS=() if SITE_NAME == 'Drama' else tuple(x[0] for x in g.db.query(Sub.name).order_by(Sub.name).all()), v=v, error="500 character limit for titles.", title=title[:500], url=url, body=request.values.get("body", "")), 400
|
|
||||||
|
|
||||||
if v.marseyawarded:
|
if v.marseyawarded:
|
||||||
marregex = list(re.finditer("^(:[!#]{0,2}m\w+:\s*)+$", title, re.A))
|
marregex = list(re.finditer("^(:[!#]{0,2}m\w+:\s*)+$", title, re.A))
|
||||||
if len(marregex) == 0: return {"error":"You can only type marseys!"}, 403
|
if len(marregex) == 0: return error("You can only type marseys!")
|
||||||
if body:
|
if body:
|
||||||
marregex = list(re.finditer("^(:[!#]{0,2}m\w+:\s*)+$", body, re.A))
|
marregex = list(re.finditer("^(:[!#]{0,2}m\w+:\s*)+$", body, re.A))
|
||||||
if len(marregex) == 0: return {"error":"You can only type marseys!"}, 403
|
if len(marregex) == 0: return error("You can only type marseys!")
|
||||||
|
|
||||||
if v.longpost and len(body) < 280 or ' [](' in body or body.startswith('[]('): return {"error":"You have to type more than 280 characters!"}, 403
|
if v.longpost and len(body) < 280 or ' [](' in body or body.startswith('[]('): return error("You have to type more than 280 characters!")
|
||||||
elif v.bird and len(body) > 140: return {"error":"You have to type less than 140 characters!"}, 403
|
elif v.bird and len(body) > 140: return error("You have to type less than 140 characters!")
|
||||||
|
|
||||||
dup = g.db.query(Submission).filter(
|
dup = g.db.query(Submission).filter(
|
||||||
Submission.author_id == v.id,
|
Submission.author_id == v.id,
|
||||||
|
@ -992,14 +995,10 @@ def submit_post(v, sub=None):
|
||||||
return redirect(f"{SITE_FULL}/notifications")
|
return redirect(f"{SITE_FULL}/notifications")
|
||||||
|
|
||||||
if len(str(body)) > 20000:
|
if len(str(body)) > 20000:
|
||||||
|
return error("There's a 20000 character limit for text body.")
|
||||||
if request.headers.get("Authorization") or request.headers.get("xhr"): return {"error":"There's a 20000 character limit for text body."}, 400
|
|
||||||
return render_template("submit.html", SUBS=() if SITE_NAME == 'Drama' else tuple(x[0] for x in g.db.query(Sub.name).order_by(Sub.name).all()), v=v, error="There's a 20000 character limit for text body.", title=title, url=url, body=request.values.get("body", "")), 400
|
|
||||||
|
|
||||||
if len(url) > 2048:
|
if len(url) > 2048:
|
||||||
|
return error("There's a 2048 character limit for URLs.")
|
||||||
if request.headers.get("Authorization") or request.headers.get("xhr"): return {"error":"2048 character limit for URLs."}, 400
|
|
||||||
return render_template("submit.html", SUBS=() if SITE_NAME == 'Drama' else tuple(x[0] for x in g.db.query(Sub.name).order_by(Sub.name).all()), v=v, error="2048 character limit for URLs.", title=title, url=url,body=request.values.get("body", "")), 400
|
|
||||||
|
|
||||||
for i in re.finditer('^(https:\/\/.*\.(png|jpg|jpeg|gif|webp|PNG|JPG|JPEG|GIF|WEBP|9999)($|\s|\n))', body, re.M|re.A):
|
for i in re.finditer('^(https:\/\/.*\.(png|jpg|jpeg|gif|webp|PNG|JPG|JPEG|GIF|WEBP|9999)($|\s|\n))', body, re.M|re.A):
|
||||||
if "wikipedia" not in i.group(1): body = body.replace(i.group(1), f'})')
|
if "wikipedia" not in i.group(1): body = body.replace(i.group(1), f'})')
|
||||||
|
@ -1032,12 +1031,11 @@ def submit_post(v, sub=None):
|
||||||
file.save("video.mp4")
|
file.save("video.mp4")
|
||||||
with open("video.mp4", 'rb') as f:
|
with open("video.mp4", 'rb') as f:
|
||||||
try: url = requests.request("POST", "https://api.imgur.com/3/upload", headers={'Authorization': f'Client-ID {IMGUR_KEY}'}, files=[('video', f)]).json()['data']['link']
|
try: url = requests.request("POST", "https://api.imgur.com/3/upload", headers={'Authorization': f'Client-ID {IMGUR_KEY}'}, files=[('video', f)]).json()['data']['link']
|
||||||
except: return {"error": "Imgur error"}, 400
|
except: error( "Imgur error")
|
||||||
if url.endswith('.'): url += 'mp4'
|
if url.endswith('.'): url += 'mp4'
|
||||||
body += f"\n\n{url}"
|
body += f"\n\n{url}"
|
||||||
else:
|
else:
|
||||||
if request.headers.get("Authorization") or request.headers.get("xhr"): return {"error": "Image/Video files only"}, 400
|
return error("Image/Video files only.")
|
||||||
return render_template("submit.html", SUBS=() if SITE_NAME == 'Drama' else tuple(x[0] for x in g.db.query(Sub.name).order_by(Sub.name).all()), v=v, error="Image/Video files only."), 400
|
|
||||||
|
|
||||||
if '#fortune' in body:
|
if '#fortune' in body:
|
||||||
body = body.replace('#fortune', '')
|
body = body.replace('#fortune', '')
|
||||||
|
@ -1045,22 +1043,21 @@ def submit_post(v, sub=None):
|
||||||
|
|
||||||
body_html = sanitize(body)
|
body_html = sanitize(body)
|
||||||
|
|
||||||
if v.marseyawarded and len(list(re.finditer('>[^<\s+]|[^>\s+]<', body_html, re.A))): return {"error":"You can only type marseys!"}, 400
|
if v.marseyawarded and len(list(re.finditer('>[^<\s+]|[^>\s+]<', body_html, re.A))): return error("You can only type marseys!")
|
||||||
|
|
||||||
if v.longpost:
|
if v.longpost:
|
||||||
if len(body) < 280 or ' [](' in body or body.startswith('[]('): return {"error":"You have to type more than 280 characters!"}, 403
|
if len(body) < 280 or ' [](' in body or body.startswith('[]('): return error("You have to type more than 280 characters!")
|
||||||
elif v.bird:
|
elif v.bird:
|
||||||
if len(body) > 140 : return {"error":"You have to type less than 140 characters!"}, 403
|
if len(body) > 140 : return error("You have to type less than 140 characters!")
|
||||||
|
|
||||||
if len(body_html) > 40000: return {"error":"Submission body too long!"}, 400
|
if len(body_html) > 40000: return error("Submission body too long!")
|
||||||
|
|
||||||
bans = filter_comment_html(body_html)
|
bans = filter_comment_html(body_html)
|
||||||
if bans:
|
if bans:
|
||||||
ban = bans[0]
|
ban = bans[0]
|
||||||
reason = f"Remove the {ban.domain} link from your post and try again."
|
reason = f"Remove the {ban.domain} link from your post and try again."
|
||||||
if ban.reason: reason += f" {ban.reason}"
|
if ban.reason: reason += f" {ban.reason}"
|
||||||
if request.headers.get("Authorization") or request.headers.get("xhr"): return {"error": reason}, 403
|
return error(reason)
|
||||||
return render_template("submit.html", SUBS=() if SITE_NAME == 'Drama' else tuple(x[0] for x in g.db.query(Sub.name).order_by(Sub.name).all()), v=v, error=reason, title=title, url=url, body=request.values.get("body", "")), 403
|
|
||||||
|
|
||||||
if v.club_allowed == False: club = False
|
if v.club_allowed == False: club = False
|
||||||
else: club = bool(request.values.get("club",""))
|
else: club = bool(request.values.get("club",""))
|
||||||
|
@ -1141,13 +1138,11 @@ def submit_post(v, sub=None):
|
||||||
file.save("video.mp4")
|
file.save("video.mp4")
|
||||||
with open("video.mp4", 'rb') as f:
|
with open("video.mp4", 'rb') as f:
|
||||||
try: url = requests.request("POST", "https://api.imgur.com/3/upload", headers={'Authorization': f'Client-ID {IMGUR_KEY}'}, files=[('video', f)]).json()['data']['link']
|
try: url = requests.request("POST", "https://api.imgur.com/3/upload", headers={'Authorization': f'Client-ID {IMGUR_KEY}'}, files=[('video', f)]).json()['data']['link']
|
||||||
except: return {"error": "Imgur error"}, 400
|
except: error( "Imgur error")
|
||||||
if url.endswith('.'): url += 'mp4'
|
if url.endswith('.'): url += 'mp4'
|
||||||
new_post.url = url
|
new_post.url = url
|
||||||
else:
|
else:
|
||||||
if request.headers.get("Authorization") or request.headers.get("xhr"): return {"error": "File type not allowed"}, 400
|
return error("Image/Video files only.")
|
||||||
return render_template("submit.html", SUBS=() if SITE_NAME == 'Drama' else tuple(x[0] for x in g.db.query(Sub.name).order_by(Sub.name).all()), v=v, error="File type not allowed.", title=title, body=request.values.get("body", "")), 400
|
|
||||||
|
|
||||||
|
|
||||||
if not new_post.thumburl and new_post.url:
|
if not new_post.thumburl and new_post.url:
|
||||||
if request.host in new_post.url or new_post.url.startswith('/') or new_post.domain == SITE:
|
if request.host in new_post.url or new_post.url.startswith('/') or new_post.domain == SITE:
|
||||||
|
|
|
@ -962,19 +962,19 @@
|
||||||
|
|
||||||
{% if v %}
|
{% if v %}
|
||||||
<script src="/static/assets/js/marked.js?a=242"></script>
|
<script src="/static/assets/js/marked.js?a=242"></script>
|
||||||
<script src="/static/assets/js/comments_v.js?a=246"></script>
|
<script src="/static/assets/js/comments_v.js?a=247"></script>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<script src="/static/assets/js/clipboard.js"></script>
|
<script src="/static/assets/js/clipboard.js?a=250"></script>
|
||||||
|
|
||||||
{% if v and v.admin_level > 1 %}
|
{% if v and v.admin_level > 1 %}
|
||||||
<script src="/static/assets/js/comments_admin.js"></script>
|
<script src="/static/assets/js/comments_admin.js?a=250"></script>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% include "expanded_image_modal.html" %}
|
{% include "expanded_image_modal.html" %}
|
||||||
|
|
||||||
<script src="/static/assets/js/comments+submission_listing.js"></script>
|
<script src="/static/assets/js/comments+submission_listing.js?a=250"></script>
|
||||||
<script src="/static/assets/js/comments.js"></script>
|
<script src="/static/assets/js/comments.js?a=250"></script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
{% if p and (not v or v.highlightcomments) %}
|
{% if p and (not v or v.highlightcomments) %}
|
||||||
|
|
|
@ -89,7 +89,7 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% for s in SUBS %}
|
{% for s in SUBS %}
|
||||||
<option value="{{s}}" {% if sub.name == s %}selected{% endif %}>
|
<option value="{{s}}" {% if sub and sub.name == s %}selected{% endif %}>
|
||||||
/s/{{s}}
|
/s/{{s}}
|
||||||
</option>
|
</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
@ -299,8 +299,8 @@ CREATE TABLE public.comments (
|
||||||
is_pinned_utc integer,
|
is_pinned_utc integer,
|
||||||
ghost boolean,
|
ghost boolean,
|
||||||
slots_result character varying(50),
|
slots_result character varying(50),
|
||||||
blackjack_result character varying(3000),
|
blackjack_result character varying(855),
|
||||||
wordle_result character varying(3000),
|
wordle_result character varying(97),
|
||||||
treasure_amount character varying(10)
|
treasure_amount character varying(10)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue