forked from MarseyWorld/MarseyWorld
100 lines
3.1 KiB
Python
100 lines
3.1 KiB
Python
import time
|
|
import secrets
|
|
|
|
from random import randint
|
|
from typing import Optional, Union
|
|
|
|
from flask import g, session
|
|
|
|
from files.classes import Alt, Comment, User, Submission
|
|
from files.helpers.const import *
|
|
from files.helpers.security import generate_hash, validate_hash
|
|
|
|
def get_raw_formkey(u:User):
|
|
if not session.get("session_id"):
|
|
session.permanent = True
|
|
session["session_id"] = secrets.token_hex(49)
|
|
|
|
return f"{session['session_id']}+{u.id}+{u.login_nonce}"
|
|
|
|
def get_formkey(u:Optional[User]):
|
|
if not u: return "" # if no user exists, give them a blank formkey
|
|
return generate_hash(get_raw_formkey(u))
|
|
|
|
def validate_formkey(u:User, formkey:Optional[str]) -> bool:
|
|
if not formkey: return False
|
|
return validate_hash(get_raw_formkey(u), formkey)
|
|
|
|
def check_for_alts(current:User, include_current_session=True):
|
|
current_id = current.id
|
|
if current_id in (1691,6790,7069,36152) and include_current_session:
|
|
session["history"] = []
|
|
return
|
|
ids = [x[0] for x in g.db.query(User.id).all()]
|
|
past_accs = set(session.get("history", [])) if include_current_session else set()
|
|
|
|
def add_alt(user1:int, user2:int):
|
|
li = [user1, user2]
|
|
existing = g.db.query(Alt).filter(Alt.user1.in_(li), Alt.user2.in_(li)).one_or_none()
|
|
if not existing:
|
|
new_alt = Alt(user1=user1, user2=user2)
|
|
g.db.add(new_alt)
|
|
g.db.flush()
|
|
|
|
for past_id in list(past_accs):
|
|
if past_id not in ids:
|
|
past_accs.remove(past_id)
|
|
continue
|
|
|
|
if past_id == MOM_ID or current_id == MOM_ID: break
|
|
if past_id == current_id: continue
|
|
|
|
li = [past_id, current_id]
|
|
add_alt(past_id, current_id)
|
|
other_alts = g.db.query(Alt).filter(Alt.user1.in_(li), Alt.user2.in_(li)).all()
|
|
for a in other_alts:
|
|
if a.deleted:
|
|
if include_current_session:
|
|
try: session["history"].remove(a.user1)
|
|
except: pass
|
|
try: session["history"].remove(a.user2)
|
|
except: pass
|
|
continue # don't propagate deleted alt links
|
|
if a.user1 != past_id: add_alt(a.user1, past_id)
|
|
if a.user1 != current_id: add_alt(a.user1, current_id)
|
|
if a.user2 != past_id: add_alt(a.user2, past_id)
|
|
if a.user2 != current_id: add_alt(a.user2, current_id)
|
|
|
|
past_accs.add(current_id)
|
|
if include_current_session:
|
|
session["history"] = list(past_accs)
|
|
g.db.flush()
|
|
for u in current.alts_unique:
|
|
if u._alt_deleted: continue
|
|
if u.shadowbanned:
|
|
current.shadowbanned = u.shadowbanned
|
|
if not current.is_banned: current.ban_reason = u.ban_reason
|
|
g.db.add(current)
|
|
elif current.shadowbanned:
|
|
u.shadowbanned = current.shadowbanned
|
|
if not u.is_banned: u.ban_reason = current.ban_reason
|
|
g.db.add(u)
|
|
|
|
def execute_shadowban_viewers_and_voters(v:Optional[User], target:Union[Submission, Comment]):
|
|
if not v or not v.shadowbanned: return
|
|
if not target: return
|
|
if v.id != target.author_id: return
|
|
if not (86400 > time.time() - target.created_utc > 60): return
|
|
ti = max(int((time.time() - target.created_utc)/60), 1)
|
|
max_upvotes = min(ti, 13)
|
|
rand = randint(0, max_upvotes)
|
|
if target.upvotes >= rand: return
|
|
|
|
amount = randint(0, 3)
|
|
if amount != 1: return
|
|
|
|
target.upvotes += amount
|
|
if isinstance(target, Submission):
|
|
target.views += amount*randint(3, 5)
|
|
g.db.add(target)
|