what a mess

remotes/1693045480750635534/spooky-22
Aevann1 2022-03-24 21:44:12 +02:00
parent cbbeaf209c
commit eec1738d01
14 changed files with 280 additions and 244 deletions

View File

@ -13,7 +13,7 @@ from sqlalchemy import *
import gevent
import redis
import time
from sys import stdout
from sys import stdout, argv
import faulthandler
from json import loads
@ -116,4 +116,8 @@ def after_request(response):
response.headers.add("X-Frame-Options", "deny")
return response
from files.routes import *
if "load_chat" in argv or app.config["SERVER_NAME"] == 'localhost':
from files.routes.chat import *
if "load_chat" not in argv:
from files.routes import *

View File

@ -724,7 +724,7 @@ def sub_matcher_upper(match):
return SLURS[match.group(0).lower()].upper()
def censor_slurs(body, logged_user):
if not logged_user or logged_user.slurreplacer:
if not logged_user or logged_user == 'chat' or logged_user.slurreplacer:
body = slur_regex_upper.sub(sub_matcher_upper, body)
body = slur_regex.sub(sub_matcher, body)
return body

View File

@ -326,6 +326,10 @@ def sanitize(sanitized, noimages=False, alert=False, comment=False, edit=False):
marsey.count += 1
g.db.add(marsey)
if '#fortune' in sanitized:
sanitized = sanitized.replace('#fortune', '')
sanitized += '\n\n<p>' + random.choice(FORTUNE_REPLIES) + '</p>'
signal.alarm(0)
return sanitized

View File

@ -15,5 +15,4 @@ from .votes import *
from .feeds import *
from .awards import *
from .giphy import *
from .subs import *
from .chat import *
from .subs import *

View File

@ -1,90 +1,95 @@
import time
from files.helpers.wrappers import auth_required
from files.helpers.sanitize import sanitize
from files.helpers.const import *
from datetime import datetime
from flask_socketio import SocketIO, emit
from files.__main__ import app, limiter, cache
from flask import render_template, make_response, send_from_directory
import sys
from files.helpers.const import SITE, SITE_FULL
if "load_chat" in sys.argv or SITE == 'localhost':
import time
from files.helpers.wrappers import auth_required
from files.helpers.sanitize import sanitize
from datetime import datetime
from flask_socketio import SocketIO, emit
from files.__main__ import app, limiter, cache
from flask import render_template, make_response, send_from_directory, abort
import sys
import atexit
import atexit
if SITE == 'localhost':
socketio = SocketIO(app, async_mode='gevent', cors_allowed_origins=[SITE_FULL], logger=True, engineio_logger=True, debug=True)
else:
socketio = SocketIO(app, async_mode='gevent', cors_allowed_origins=[SITE_FULL])
typing = []
online = []
messages = cache.get('chat') or []
typing = []
online = []
messages = cache.get('chat') or []
total = cache.get('total') or 0
@app.get("/chat")
@auth_required
def chat( v):
return render_template("chat.html", v=v, messages=messages)
@app.get("/chat")
@auth_required
def chat( v):
return render_template("chat.html", v=v, messages=messages)
@app.get('/chat.js')
@limiter.exempt
def chatjs():
resp = make_response(send_from_directory('assets', 'js/chat.js'))
return resp
@app.get('/chat.js')
@limiter.exempt
def chatjs():
resp = make_response(send_from_directory('assets', 'js/chat.js'))
return resp
@socketio.on('speak')
@limiter.limit("3/second;10/minute")
@auth_required
def speak(data, v):
if v.is_banned: return '', 403
global messages, total
text = data[:1000].strip()
if not text: return '', 403
text_html = sanitize(text)
data={
"avatar": v.profile_url,
"username":v.username,
"namecolor":v.namecolor,
"text":text,
"text_html":text_html,
"text_censored":censor_slurs(text_html, 'chat')
}
messages.append(data)
messages = messages[-20:]
total += 1
emit('speak', data, broadcast=True)
return '', 204
@socketio.on('connect')
@auth_required
def connect(v):
if v.username not in online:
online.append(v.username)
emit("online", online, broadcast=True)
emit('typing', typing)
return '', 204
@socketio.on('disconnect')
@auth_required
def disconnect(v):
if v.username in online:
online.remove(v.username)
emit("online", online, broadcast=True)
if v.username in typing: typing.remove(v.username)
emit('typing', typing, broadcast=True)
return '', 204
@socketio.on('typing')
@auth_required
def typing_indicator(data, v):
if data and v.username not in typing: typing.append(v.username)
elif not data and v.username in typing: typing.remove(v.username)
emit('typing', typing, broadcast=True)
return '', 204
@socketio.on('speak')
@limiter.limit("3/second;10/minute")
@auth_required
def speak(data, v):
if v.is_banned: abort(403)
global messages
text = data[:1000].strip()
if not text: abort(403)
data={
"avatar": v.profile_url,
"username":v.username,
"namecolor":v.namecolor,
"text":text,
"text_html":sanitize(text),
}
messages.append(data)
messages = messages[-500:]
emit('speak', data, broadcast=True)
return '', 204
@socketio.on('connect')
@auth_required
def connect(v):
if v.username not in online:
online.append(v.username)
emit("online", online, broadcast=True)
emit('typing', typing)
return '', 204
@socketio.on('disconnect')
@auth_required
def disconnect(v):
if v.username in online:
online.remove(v.username)
emit("online", online, broadcast=True)
if v.username in typing: typing.remove(v.username)
emit('typing', typing, broadcast=True)
return '', 204
@socketio.on('typing')
@auth_required
def typing_indicator(data, v):
if data and v.username not in typing: typing.append(v.username)
elif not data and v.username in typing: typing.remove(v.username)
emit('typing', typing, broadcast=True)
return '', 204
def close_running_threads():
cache.set('chat', messages)
atexit.register(close_running_threads)
def close_running_threads():
cache.set('chat', messages)
cache.set('total', total)
atexit.register(close_running_threads)

View File

@ -335,10 +335,6 @@ def api_comment(v):
if v.agendaposter and not v.marseyawarded and parent_post.id not in ADMIGGERS:
body = torture_ap(body, v.username)
if '#fortune' in body:
body = body.replace('#fortune', '')
body += '\n\n<p>' + random.choice(FORTUNE_REPLIES) + '</p>'
body_html = sanitize(body, comment=True)
if v.marseyawarded and parent_post.id not in ADMIGGERS and marseyaward_body_regex.search(body_html):

View File

@ -1034,10 +1034,6 @@ def submit_post(v, sub=None):
else:
return error("Image/Video files only.")
if '#fortune' in body:
body = body.replace('#fortune', '')
body += '\n\n<p>' + random.choice(FORTUNE_REPLIES) + '</p>'
body_html = sanitize(body)
if v.marseyawarded and marseyaward_body_regex.search(body_html):

View File

@ -1,132 +1,165 @@
{% extends "default.html" %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="description" content="{{config('DESCRIPTION')}}">
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'; connect-src 'self'; object-src 'none';">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="author" content="">
<link id="favicon" rel="icon" type="image/png" href="/static/assets/images/{{SITE_NAME}}/icon.webp?v=1012">
{% block title %}
<title>Chat</title>
<meta name="description" content="Chat">
{% endblock %}
{% block content %}
<style>:root{--primary:#{{v.themecolor}}}</style>
<link rel="stylesheet" href="/static/assets/css/main.css?v=188">
<link rel="stylesheet" href="/static/assets/css/{{v.theme}}.css?v=30">
{% if v.css %}
<link rel="stylesheet" href="/@{{v.username}}/css">
{% endif %}
<div class="border-right py-3 px-3">
<span data-toggle="tooltip" data-placement="bottom" data-bs-title="Users online right now" title="Users online right now" class="text-muted">
<i class="far fa-user fa-sm mr-1"></i>
<span class="board-chat-count">0</span>
</span>
</div>
<style>
#chat-window {
max-height:90vh;
overflow-y: scroll;
}
<div id="chat-line-template" class="d-none">
<div class="chat-line">
<div class="d-flex align-items-center">
<span class="rounded mb-auto d-none d-md-block chat-profile">
<img class="desktop-avatar rounded-circle w-100">
</span>
<div class="pl-md-3 text-muted">
<div>
<img class="mobile-avatar profile-pic-30 mr-1 d-inline-block d-md-none" data-toggle="tooltip" data-placement="right">
<a href="" class="font-weight-bold text-black userlink" target="_blank"></a>
<div style="overflow:hidden">
<span class="chat-message text-black text-break"></span>
<span class="text d-none"></span>
<button class="quote-btn btn d-inline-block pt-0" onclick="quote(this)"><i class="fas fa-reply" aria-hidden="true"></i></button>
</div>
</div>
#chat-window .chat-profile {
min-width: 42px;
width: 42px;
height: 42px;
}
#chat-window::-webkit-scrollbar {
display: none;
}
#chat-window {
-ms-overflow-style: none;
scrollbar-width: none;
}
.chat-mention {
background-color: var(--primary55);
border-radius: 5px;
}
.chat-message p {
display: inline-block;
}
.diff {
margin-top: 1rem;
}
@media (max-width: 768px) {
#shrink * {
font-size: 10px !important;
}
.fa-reply:before {
font-size: 9px;
}
.diff {
margin-top: 0.5rem;
}
}
#input-text {
max-height: 50px!important;
}
p {
margin: 0!important;
margin-left: 27px !important;
}
</style>
</head>
<body>
<script src="/static/assets/js/bootstrap.js?v=245"></script>
{% include "header.html" %}
<div class="container {% if request.path=='/' or '/post/' in request.path or '/comment/' in request.path %}transparent{% endif %}">
<div class="row justify-content-around" id="main-content-row">
<div class="col h-100 {% block customPadding %}{% if request.path.startswith('/@') %}user-gutters{% else %}custom-gutters{% endif %}{% endblock %}" id="main-content-col">
<div class="border-right py-3 px-3">
<span data-toggle="tooltip" data-placement="bottom" data-bs-title="Users online right now" title="Users online right now" class="text-muted">
<i class="far fa-user fa-sm mr-1"></i>
<span class="board-chat-count">0</span>
</span>
</div>
</div>
</div>
</div>
<div class="container py-0 chat-container">
<div id="chat-window">
<div id="chat-text" class="fullchat">
{% for m in messages %}
{% set text_html = m['text_html'] %}
{% set link = '<a href="/id/' + v.id|string + '">' %}
<div class="chat-line {% if link in text_html %}chat-mention{% endif %}">
<div id="chat-line-template" class="d-none">
<div class="chat-line">
<div class="d-flex align-items-center">
<span class="rounded mb-auto d-none d-md-block chat-profile">
<img class="desktop-avatar rounded-circle w-100" src="{{m['avatar']}}">
</span>
<div class="pl-md-3 text-muted">
<div>
<img src="{{m['avatar']}}" class="mobile-avatar profile-pic-30 mr-1 d-inline-block d-md-none" data-toggle="tooltip" data-placement="right">
<a class="font-weight-bold text-black userlink" style="color:#{{m['namecolor']}}" target="_blank" href="/@{{m['username']}}">{{m['username']}}</a>
<img class="avatar pp20 mr-1" data-toggle="tooltip" data-placement="right">
<a href="" class="font-weight-bold text-black userlink" target="_blank"></a>
<div style="overflow:hidden">
<span class="chat-message text-black text-break">{{text_html | safe}}</span>
<span class="d-none">{{m['text']}}</span>
<button class="btn d-inline-block pt-0" onclick="quote(this)"><i class="fas fa-reply" aria-hidden="true"></i></button>
<span class="chat-message text-black text-break"></span>
<span class="text d-none"></span>
<button class="quote-btn btn d-inline-block py-0" onclick="quote(this)"><i class="fas fa-reply" aria-hidden="true"></i></button>
</div>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
<div id="system-template">
<div class="system-line">
<p class="message text-muted"></p>
</div>
</div>
<div id="shrink">
<div id="chat-window" class="container py-0">
{% for m in messages %}
{% set text_html = m['text_censored'] if v.slurreplacer else m['text_html'] %}
{% set link = '<a href="/id/' + v.id|string + '">' %}
{% set same = m['username'] == messages[loop.index-2]['username'] %}
<div class="chat-line {% if link in text_html %}chat-mention{% endif %} {% if not same %}diff{% endif %}">
<div class="d-flex align-items-center">
<div class="pl-md-3 text-muted">
<div>
{% if not same %}<img src="{{m['avatar']}}" class="avatar pp20 mr-1" data-toggle="tooltip" data-placement="right">{% endif %}
<a class="{% if same %}d-none{% endif %} font-weight-bold text-black userlink" style="color:#{{m['namecolor']}}" target="_blank" href="/@{{m['username']}}">{{m['username']}}</a>
<div style="overflow:hidden">
<span class="chat-message text-black text-break">{{text_html | safe}}</span>
<span class="d-none">{{m['text']}}</span>
<button class="btn d-inline-block py-0" onclick="quote(this)"><i class="fas fa-reply" aria-hidden="true"></i></button>
</div>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
<div id='message' class="d-none position-relative form-group d-flex mt-4">
<div class="position-absolute text-muted text-small" style="bottom: -1.5rem; line-height: 1;">
<span id="typing-indicator"></span>
<span id="loading-indicator" class="d-none"></span>
</div>
<i class="btn btn-secondary mr-2 fas fa-smile-beam" style="padding-top:0.65rem" onclick="loadEmojis('input-text')" aria-hidden="true" data-bs-toggle="modal" data-bs-target="#emojiModal" data-bs-placement="bottom" title="Add Emoji"></i>
<textarea id="input-text" minlength="1" maxlength="1000" type="text" class="form-control" placeholder="Message" autocomplete="off" autofocus rows="1"></textarea>
<button id="chatsend" onclick="send()" class="btn btn-primary ml-3" type="submit">Send</button>
</div>
</div>
</div>
</div>
<div id='message' class="d-none position-relative form-group d-flex pb-3">
<div class="position-absolute text-muted text-small" style="bottom: -1.5rem; line-height: 1;">
<span id="typing-indicator"></span>
<span id="loading-indicator" class="d-none"></span>
<div id="online" class="col sidebar text-left d-none d-lg-block pt-3 bg-white" style="max-width:300px">
</div>
<i class="btn btn-secondary mr-2 fas fa-smile-beam" style="padding-top:0.65rem" onclick="loadEmojis('input-text')" aria-hidden="true" data-bs-toggle="modal" data-bs-target="#emojiModal" data-bs-placement="bottom" title="Add Emoji"></i>
<textarea id="input-text" minlength="1" maxlength="1000" type="text" class="form-control" placeholder="Message" autocomplete="off" autofocus rows="1"></textarea>
<button id="chatsend" onclick="send()" class="btn btn-primary ml-3" type="submit">Send</button>
</div>
</div>
<input id="vid" type="hidden" value="{{v.id}}">
<input id="site_name" type="hidden" value="{{SITE_NAME}}">
<input id="slurreplacer" type="hidden" value="{{v.slurreplacer}}">
<script data-cfasync="false" src="/chat.js?v=2"></script>
<style>
#chat-window {
max-height:calc(100vh - 300px);
overflow-y: scroll;
}
.fullchat .chat-profile {
min-width: 42px;
width: 42px;
height: 42px;
}
#chat-window::-webkit-scrollbar {
display: none;
}
#chat-window {
-ms-overflow-style: none;
scrollbar-width: none;
}
.chat-mention {
background-color: var(--primary55);
border-radius: 5px;
}
.profile-pic-30 {
width: 30px;
height: 30px;
border-radius: 50%;
text-align: center;
object-fit: cover;
}
.chat-message p {
display: inline-block;
}
@media (max-width: 768px) {
* {
font-size: 10px !important;
}
}
</style>
<script data-cfasync="false" src="/chat.js?v=4"></script>
<script>
box.scrollTo(0, box.scrollHeight)
@ -135,4 +168,6 @@
{% include "emoji_modal.html" %}
{% include "expanded_image_modal.html" %}
{% endblock %}
<script src="/static/assets/js/lozad.js?v=240"></script>
</body>

View File

@ -843,7 +843,7 @@
{% if v %}
<script src="/static/assets/js/marked.js?v=249"></script>
<script src="/static/assets/js/comments_v.js?v=262"></script>
<script src="/static/assets/js/comments_v.js?v=263"></script>
{% endif %}
<script src="/static/assets/js/clipboard.js?v=250"></script>
@ -854,7 +854,7 @@
{% include "expanded_image_modal.html" %}
<script src="/static/assets/js/comments+submission_listing.js?v=253"></script>
<script src="/static/assets/js/comments+submission_listing.js?v=254"></script>
<script src="/static/assets/js/comments.js?v=253"></script>
<script>
@ -885,8 +885,9 @@
xhr.setRequestHeader('xhr', 'xhr');
xhr.onload=function(){
if (xhr.status==200) {
document.getElementById(`morecomments-${cid}`).innerHTML = xhr.response.replace(/data-src/g, 'src').replace(/data-cfsrc/g, 'src').replace(/style="display:none;visibility:hidden;"/g, '');
bs_trigger()
let e = document.getElementById(`morecomments-${cid}`)
e.innerHTML = xhr.response.replace(/data-src/g, 'src').replace(/data-cfsrc/g, 'src').replace(/style="display:none;visibility:hidden;"/g, '');
bs_trigger(e)
{% if p %}
comments = JSON.parse(localStorage.getItem("old-comment-counts")) || {}

View File

@ -88,7 +88,7 @@
<link rel="apple-touch-icon" sizes="180x180" href="/static/assets/images/{{SITE_NAME}}/icon.webp?v=1012">
<link rel="manifest" href="/static/assets/manifest.json?v=1">
<link rel="mask-icon" href="/static/assets/images/{{SITE_NAME}}/icon.webp?v=1012">
<link id="favicon" rel="shortcut icon" href="/static/assets/images/{{SITE_NAME}}/icon.webp?v=1012">
<link rel="shortcut icon" href="/static/assets/images/{{SITE_NAME}}/icon.webp?v=1012">
<meta name="apple-mobile-web-app-title" content="{{SITE_NAME}}">
<meta name="application-name" content="{{SITE_NAME}}">
<meta name="msapplication-TileColor" content="#{{config('DEFAULT_COLOR')}}">
@ -233,24 +233,20 @@
{% block Banner %}
{% if '@' not in request.path %}
{% if v %}
{% if request.path != '/chat' %}
{% if sub %}
<img alt="/h/{{sub.name}} banner" role="button" data-bs-toggle="modal" data-bs-target="#expandImageModal" onclick="expandDesktopImage('{{sub.banner_url}}')" loading="lazy" src="{{sub.banner_url}}" width=100% style="object-fit:cover;max-height:25vw">
{% elif SITE_NAME == 'Drama' %}
{% set path = "assets/images/" + SITE_NAME + "/banners" %}
{% set image = "/static/" + path + "/" + listdir('files/' + path)|random() + '?v=23' %}
{% if sub %}
<img alt="/h/{{sub.name}} banner" role="button" data-bs-toggle="modal" data-bs-target="#expandImageModal" onclick="expandDesktopImage('{{sub.banner_url}}')" loading="lazy" src="{{sub.banner_url}}" width=100% style="object-fit:cover;max-height:25vw">
{% elif SITE_NAME == 'Drama' %}
{% set path = "assets/images/" + SITE_NAME + "/banners" %}
{% set image = "/static/" + path + "/" + listdir('files/' + path)|random() + '?v=23' %}
<a href="https://secure.transequality.org/site/Donation2?df_id=1480">
<img alt="site banner" src="{{image}}" width="100%">
</a>
{% else %}
<a href="/">
<img alt="site banner" src="/static/assets/images/{{SITE_NAME}}/banner.webp?v=1042" width="100%">
</a>
{% endif %}
<a href="https://secure.transequality.org/site/Donation2?df_id=1480">
<img alt="site banner" src="{{image}}" width="100%">
</a>
{% else %}
<a href="/">
<img alt="site banner" src="/static/assets/images/{{SITE_NAME}}/banner.webp?v=1042" width="100%">
</a>
{% endif %}
{% else %}
<a href="/login">
<img class="banner" alt="site banner" src="/static/assets/images/{{SITE_NAME}}/cached.webp?v=1012" width="100%">
@ -270,7 +266,7 @@
{% block postNav %}
{% endblock %}
<div class="container {% if request.path=='/' or '/post/' in request.path or '/comment/' in request.path %}transparent{% elif request.path == '/chat' %}pb-0{% endif %}">
<div class="container {% if request.path=='/' or '/post/' in request.path or '/comment/' in request.path %}transparent{% endif %}">
<div class="row justify-content-around" id="main-content-row">
<div class="col h-100 {% block customPadding %}{% if request.path.startswith('/@') %}user-gutters{% else %}custom-gutters{% endif %}{% endblock %}" id="main-content-col">
@ -297,9 +293,6 @@
{% block sidebar %}
{% if home or sub and p %}
{% include "sidebar_" + SITE_NAME + ".html" %}
{% elif request.path == '/chat' %}
<div id="online" class="col sidebar text-left d-none d-lg-block pt-3 bg-white" style="max-width:300px">
</div>
{% endif %}
{% endblock %}
</div>

View File

@ -256,7 +256,7 @@
</div>
</nav>
<script src="/static/assets/js/header.js?v=253"></script>
<script src="/static/assets/js/header.js?v=254"></script>
{% if v and not err %}
<div id="formkey" class="d-none">{{v.formkey}}</div>

View File

@ -999,8 +999,9 @@
xhr.setRequestHeader('xhr', 'xhr');
xhr.onload=function(){
if (xhr.status==200) {
document.getElementById(`viewmore-${offset}`).innerHTML = xhr.response.replace(/data-src/g, 'src').replace(/data-cfsrc/g, 'src').replace(/style="display:none;visibility:hidden;"/g, '');
bs_trigger()
let e = document.getElementById(`viewmore-${offset}`);
e.innerHTML = xhr.response.replace(/data-src/g, 'src').replace(/data-cfsrc/g, 'src').replace(/style="display:none;visibility:hidden;"/g, '');
bs_trigger(e)
comments = JSON.parse(localStorage.getItem("old-comment-counts")) || {}
lastCount = comments['{{p.id}}']

View File

@ -445,5 +445,5 @@
{% include "expanded_image_modal.html" %}
<script src="/static/assets/js/clipboard.js?v=240"></script>
<script src="/static/assets/js/comments+submission_listing.js?v=253"></script>
<script src="/static/assets/js/comments+submission_listing.js?v=254"></script>
<script src="/static/assets/js/submission_listing.js?v=240"></script>

View File

@ -3631,20 +3631,22 @@ I cannot think or comprehend of anything more cucked than having a daughter. Hon
{[para]}
watch this go nowhere in 2 weeks
{[para]}
I would appreciate you removing my post from the site asap,and I won't sign up to your site just to have a 'word' I hate the fact I have to explain
myself inregards to my weight. But if it helps you take down my post. Here you go - I hate myself. Ive struggled with depression my entire life I was
bullied at school for being taller than most girls and not being stick thin (yet according to the bmi calculator I was healthy at 16-17) but to everyone I
was fat, and white and gross. I turned to self harm and eating as coping mechanisms. Even now at a bmi of 40 (yes I'm actively losing weight) I'm still
not the biggest person in the room. I'm guessing your admin thinks I have fat rolls dripping down me, breathing heavy and unable to leave my bed.
Sadly for him thats not the case. I do alot for my kids, I have to be active but I use to eat a crazy amount of sugary shit to just get through the day
because of my depression. Im ashamed of how I look, I can't stand to see myself in the mirror, let alone get on the scales every day. I almost lost my
veteran husband 3 years ago to a disease, I care for him 24/7. What I sub to in reddit are my outlets for my depression, for my loneliness. I have four
kids and my husband but I dont have friends no one to vent to about the hard shit. I design clothes for my "creepy" dolls as an outlet a way to stay
creative I use to make dresses and outfits for my daughters dolls when she was younger and I just continued it. I even use to draw furry art (hi gay
furry femboy) but I gave that up years ago. I honestly thought twox chromosome was a safe place for me to say stuff that made me happy,
everything I write is true however sad you think it is. I dont want to be made fun of its hard enough looking at myself everyday without a chorus of
people telling me exactly what my own thoughts are. Ive attempted suicide numerous times and its my kids that pull me through it. So please take it
down. I dont deserve to be shamed, im just a sad pathetic woman who cares about her kids and if she could end it without hurting anyone she
I would appreciate you removing my post from the site asap,and I won't sign up to your site just to have a 'word' I hate the fact I have to explain
myself inregards to my weight. But if it helps you take down my post. Here you go - I hate myself. Ive struggled with depression my entire life I was
bullied at school for being taller than most girls and not being stick thin (yet according to the bmi calculator I was healthy at 16-17) but to everyone I
was fat, and white and gross. I turned to self harm and eating as coping mechanisms. Even now at a bmi of 40 (yes I'm actively losing weight) I'm still
not the biggest person in the room. I'm guessing your admin thinks I have fat rolls dripping down me, breathing heavy and unable to leave my bed.
Sadly for him thats not the case. I do alot for my kids, I have to be active but I use to eat a crazy amount of sugary shit to just get through the day
because of my depression. Im ashamed of how I look, I can't stand to see myself in the mirror, let alone get on the scales every day. I almost lost my
veteran husband 3 years ago to a disease, I care for him 24/7. What I sub to in reddit are my outlets for my depression, for my loneliness. I have four
kids and my husband but I dont have friends no one to vent to about the hard shit. I design clothes for my "creepy" dolls as an outlet a way to stay
creative I use to make dresses and outfits for my daughters dolls when she was younger and I just continued it. I even use to draw furry art (hi gay
furry femboy) but I gave that up years ago. I honestly thought twox chromosome was a safe place for me to say stuff that made me happy,
everything I write is true however sad you think it is. I dont want to be made fun of its hard enough looking at myself everyday without a chorus of
people telling me exactly what my own thoughts are. Ive attempted suicide numerous times and its my kids that pull me through it. So please take it
down. I dont deserve to be shamed, im just a sad pathetic woman who cares about her kids and if she could end it without hurting anyone she
would.
{[para]}
My husband use to snore like a chainsaw then he got nose surgery and it was like white noise and then a cpap so nice and quiet. He farts so much and I HATE IT. He is so freaking proud of them, throws his leg in the air and pretends to kick start a bike while farting. Then he tries to crop dust me. Ive asked him to stop but Nada. Im am disgusted by it. We've both put on a lot of weight in the last few years and that doesn't repulse me but his hygiene and man funk do.
My husband use to snore like a chainsaw then he got nose surgery and it was like white noise and then a cpap so nice and quiet. He farts so much and I HATE IT. He is so freaking proud of them, throws his leg in the air and pretends to kick start a bike while farting. Then he tries to crop dust me. Ive asked him to stop but Nada. Im am disgusted by it. We've both put on a lot of weight in the last few years and that doesn't repulse me but his hygiene and man funk do.
{[para]}
The only thing that is advanced from this thread is my stage 4 cancer from reading it.