Exclude sb'd from vote counts, retain in tables.

Addressing the downvote spamming on WPD. Correctly shows jannies which
users are SB'd, shows all voters (sans SB icons) to SB'd users, and
only shows real voters to normies. SB'd users votes are still tracked
so the icons look to them like they're doing something.
pull/34/head
Snakes 2022-12-01 10:04:08 -05:00
parent 4ab8825d35
commit ebc3e9a3f2
Signed by: Snakes
GPG Key ID: E745A82778055C7E
1 changed files with 46 additions and 16 deletions

View File

@ -17,20 +17,42 @@ def vote_info_get(v, link):
if thing.ghost and v.id != AEVANN_ID: abort(403)
if isinstance(thing, Submission):
if thing.author.shadowbanned and not (v and v.admin_level >= PERMS['USER_SHADOWBAN']):
thing_id = g.db.query(Submission.id).filter_by(upvotes=thing.upvotes, downvotes=thing.downvotes).order_by(Submission.id).first()[0]
if (thing.author.shadowbanned
and not (v and v.admin_level >= PERMS['USER_SHADOWBAN'])):
thing_id = g.db.query(Submission.id) \
.filter_by(upvotes=thing.upvotes, downvotes=thing.downvotes) \
.order_by(Submission.id).first()[0]
else: thing_id = thing.id
ups = g.db.query(Vote).filter_by(submission_id=thing_id, vote_type=1).order_by(Vote.created_utc).all()
downs = g.db.query(Vote).filter_by(submission_id=thing_id, vote_type=-1).order_by(Vote.created_utc).all()
query = g.db.query(Vote).join(Vote.user).filter(
Vote.submission_id == thing_id,
Vote.vote_type == 1,
).order_by(Vote.created_utc)
if not v.can_see_shadowbanned:
query = query.filter(User.shadowbanned == None)
ups = query.filter(Vote.vote_type == 1).all()
downs = query.filter(Vote.vote_type == -1).all()
elif isinstance(thing, Comment):
if thing.author.shadowbanned and not (v and v.admin_level >= PERMS['USER_SHADOWBAN']):
thing_id = g.db.query(Comment.id).filter_by(upvotes=thing.upvotes, downvotes=thing.downvotes).order_by(Comment.id).first()[0]
if (thing.author.shadowbanned
and not (v and v.admin_level >= PERMS['USER_SHADOWBAN'])):
thing_id = g.db.query(Comment.id) \
.filter_by(upvotes=thing.upvotes, downvotes=thing.downvotes) \
.order_by(Comment.id).first()[0]
else: thing_id = thing.id
ups = g.db.query(CommentVote).filter_by(comment_id=thing_id, vote_type=1).order_by(CommentVote.created_utc).all()
downs = g.db.query(CommentVote).filter_by(comment_id=thing_id, vote_type=-1 ).order_by(CommentVote.created_utc).all()
query = g.db.query(CommentVote).join(CommentVote.user).filter(
CommentVote.comment_id == thing_id,
CommentVote.vote_type == 1,
).order_by(CommentVote.created_utc)
if not v.can_see_shadowbanned:
query = query.filter(User.shadowbanned == None)
ups = query.filter(CommentVote.vote_type == 1).all()
downs = query.filter(CommentVote.vote_type == -1).all()
else: abort(400)
@ -40,6 +62,7 @@ def vote_info_get(v, link):
ups=ups,
downs=downs)
def vote_post_comment(target_id, new, v, cls, vote_cls):
if new == "-1" and DISABLE_DOWNVOTES: abort(403)
if new not in {"-1", "0", "1"}: abort(400)
@ -91,7 +114,8 @@ def vote_post_comment(target_id, new, v, cls, vote_cls):
existing.coins = coin_value
g.db.add(existing)
elif existing.vote_type != 0 and new == 0:
target.author.charge_account('coins', existing.coins, should_check_balance=False)
target.author.charge_account('coins', existing.coins,
should_check_balance=False)
target.author.truescore -= coin_delta
g.db.add(target.author)
g.db.delete(existing)
@ -126,16 +150,17 @@ def vote_post_comment(target_id, new, v, cls, vote_cls):
# this is hacky but it works, we should probably do better later
def get_vote_count(dir, real_instead_of_dir):
votes = g.db.query(vote_cls)
votes = g.db.query(vote_cls).join(vote_cls.user) \
.filter(User.shadowbanned == None)
if real_instead_of_dir:
votes = votes.filter_by(real=True)
votes = votes.filter(vote_cls.real == True)
else:
votes = votes.filter_by(vote_type=dir)
votes = votes.filter(vote_cls.vote_type == dir)
if vote_cls == Vote:
votes = votes.filter_by(submission_id=target.id)
votes = votes.filter(vote_cls.submission_id == target.id)
elif vote_cls == CommentVote:
votes = votes.filter_by(comment_id=target.id)
votes = votes.filter(vote_cls.comment_id == target.id)
else:
return 0
return votes.count()
@ -150,9 +175,13 @@ def vote_post_comment(target_id, new, v, cls, vote_cls):
if target.author.progressivestack or target.author.id in BOOSTED_USERS:
mul = 2
elif cls == Submission:
if target.domain.endswith('.win') or (target.domain in BOOSTED_SITES and not target.url.startswith('/')) or target.sub in BOOSTED_HOLES:
if (target.domain.endswith('.win')
or (target.domain in BOOSTED_SITES and not target.url.startswith('/'))
or target.sub in BOOSTED_HOLES):
mul = 2
elif not target.sub and target.body_html and target.author.id not in {8768,3402,5214,12719}:
elif (not target.sub
and target.body_html
and target.author.id not in {8768,3402,5214,12719}):
x = target.body_html.count('" target="_blank" rel="nofollow noopener">')
x += target.body_html.count('<a href="/images/')
target.realupvotes += min(x*2, 20)
@ -164,6 +193,7 @@ def vote_post_comment(target_id, new, v, cls, vote_cls):
g.db.add(target)
return "", 204
@app.post("/vote/post/<post_id>/<new>")
@limiter.limit("5/second;60/minute;1000/hour;2000/day")
@is_not_permabanned