dont give shekels to ppl not notified bc of blocks + dont give shekels to ppl ALSO mentioned directly + prevent group double charging on edit + do this https://stupidpol.site/h/countryclub/post/79285/-/3695711#context

pull/136/head
Aevann 2023-03-02 21:56:43 +02:00
parent e9a15cd0b8
commit d7f42ac50a
6 changed files with 80 additions and 63 deletions

View File

@ -37,7 +37,7 @@ class Group(Base):
@property
@lazy
def member_ids(self):
return [x.user_id for x in self.memberships if x.approved_utc]
return set([x.user_id for x in self.memberships if x.approved_utc])
@property
@lazy

View File

@ -480,8 +480,8 @@ class User(Base):
@property
@lazy
def all_twoway_blocks(self):
return [x[0] for x in g.db.query(UserBlock.target_id).filter_by(user_id=self.id).all() + \
g.db.query(UserBlock.user_id).filter_by(target_id=self.id).all()]
return set([x[0] for x in g.db.query(UserBlock.target_id).filter_by(user_id=self.id).all() + \
g.db.query(UserBlock.user_id).filter_by(target_id=self.id).all()])
def validate_2fa(self, token):

View File

@ -122,7 +122,7 @@ def add_notif(cid, uid, text, pushnotif_url=''):
push_notif({uid}, 'New notification', text, pushnotif_url)
def NOTIFY_USERS(text, v):
def NOTIFY_USERS(text, v, oldtext=None):
# Restrict young accounts from generating notifications
if v.age < NOTIFICATION_SPAM_AGE_THRESHOLD:
return set()
@ -130,37 +130,6 @@ def NOTIFY_USERS(text, v):
text = text.lower()
notify_users = set()
if FEATURES['PING_GROUPS']:
billed = set()
everyone = False
for i in group_mention_regex.finditer(text):
if i.group(2) == 'everyone' and not v.shadowbanned:
everyone = True
break
else:
group = g.db.get(Group, i.group(2))
if group:
if v.id not in group.member_ids:
billed.update(group.member_ids)
notify_users.update(group.member_ids)
if everyone:
cost = g.db.query(User).count() * 5
if cost > v.coins:
abort(403, f"You need {cost} coins for this!")
g.db.query(User).update({ User.coins: User.coins + 5 })
v.coins -= cost
g.db.add(v)
return 'everyone'
if billed:
cost = len(billed) * 5
if cost > v.coins:
abort(403, f"You need {cost} coins for this!")
g.db.query(User).filter(User.id.in_(billed)).update({ User.coins: User.coins + 5 })
v.coins -= cost
g.db.add(v)
for word, id in NOTIFIED_USERS.items():
if word in text:
notify_users.add(id)
@ -173,9 +142,49 @@ def NOTIFY_USERS(text, v):
admin_ids = [x[0] for x in g.db.query(User.id).filter(User.admin_level >= PERMS['NOTIFICATIONS_SPECIFIC_WPD_COMMENTS']).all()]
notify_users.update(admin_ids)
notify_users = set([id for id in notify_users if id not in v.all_twoway_blocks])
return notify_users - bots - {v.id, 0}
if FEATURES['PING_GROUPS']:
cost = 0
for i in group_mention_regex.finditer(text):
if oldtext and i.group(2) in oldtext:
continue
if i.group(2) == 'everyone' and not v.shadowbanned:
cost = g.db.query(User).count() * 5
if cost > v.coins:
abort(403, f"You need {cost} coins for this!")
g.db.query(User).update({ User.coins: User.coins + 5 })
v.coins -= cost
g.db.add(v)
return 'everyone'
else:
group = g.db.get(Group, i.group(2))
if not group: continue
members = group.member_ids - notify_users - v.all_twoway_blocks
notify_users.update(members)
if v.id not in members:
if group.name == 'biofoids': mul = 10
else: mul = 5
cost += len(members) * mul
if cost > v.coins:
abort(403, f"You need {cost} coins for this!")
g.db.query(User).filter(User.id.in_(members)).update({ User.coins: User.coins + mul })
v.coins -= cost
g.db.add(v)
return notify_users - bots - {v.id, 0} - v.all_twoway_blocks
def push_notif(uids, title, body, url_or_comment):

View File

@ -644,6 +644,19 @@ def edit_comment(cid, v):
if v.marseyawarded and marseyaward_body_regex.search(body_html):
abort(403, "You can only type marseys!")
notify_users = NOTIFY_USERS(body, v, c.body)
if notify_users == 'everyone':
alert_everyone(c.id)
else:
for x in notify_users-bots:
notif = g.db.query(Notification).filter_by(comment_id=c.id, user_id=x).one_or_none()
if not notif:
n = Notification(comment_id=c.id, user_id=x)
g.db.add(n)
if not v.shadowbanned:
push_notif({x}, f'New mention of you by @{c.author_name}', c.body, c)
c.body = body
process_poll_options(v, c)
@ -661,18 +674,6 @@ def edit_comment(cid, v):
g.db.add(c)
notify_users = NOTIFY_USERS(body, v)
if notify_users == 'everyone':
alert_everyone(c.id)
else:
for x in notify_users-bots:
notif = g.db.query(Notification).filter_by(comment_id=c.id, user_id=x).one_or_none()
if not notif:
n = Notification(comment_id=c.id, user_id=x)
g.db.add(n)
if not v.shadowbanned:
push_notif({x}, f'New mention of you by @{c.author_name}', c.body, c)
g.db.commit()
return {"body": c.body, "comment": c.realbody(v)}

View File

@ -984,6 +984,19 @@ def edit_post(pid, v):
if not title:
abort(400, "Please enter a better title!")
if not p.private:
notify_users = NOTIFY_USERS(f'{title} {body}', v, f'{p.title} {p.body}')
if notify_users:
cid, text = notif_comment2(p)
if notify_users == 'everyone':
alert_everyone(cid)
else:
for x in notify_users:
add_notif(cid, x, text, pushnotif_url=p.permalink)
if title != p.title:
torture = (v.agendaposter and not v.marseyawarded and p.sub != 'chudrama' and v.id == p.author_id)
@ -1028,16 +1041,6 @@ def edit_post(pid, v):
abort(403, f'You have to include "{AGENDAPOSTER_PHRASE}" in your post!')
if not p.private:
notify_users = NOTIFY_USERS(f'{p.title} {p.body}', v)
if notify_users:
cid, text = notif_comment2(p)
if notify_users == 'everyone':
alert_everyone(cid)
else:
for x in notify_users:
add_notif(cid, x, text, pushnotif_url=p.permalink)
if v.id == p.author_id:
if int(time.time()) - p.created_utc > 60 * 3: p.edited_utc = int(time.time())
g.db.add(p)

View File

@ -254,7 +254,9 @@ def settings_personal_post(v):
v=v,
error="Your friends list is too long")
notify_users = NOTIFY_USERS(friends, v)
friends = friends[:1000]
notify_users = NOTIFY_USERS(friends, v, v.friends)
if notify_users:
text = f"@{v.username} has added you to their friends list!"
@ -265,7 +267,7 @@ def settings_personal_post(v):
for x in notify_users:
add_notif(cid, x, text)
v.friends = friends[:1000]
v.friends = friends
v.friends_html=friends_html
g.db.add(v)
return render_template("settings/personal.html",
@ -283,7 +285,9 @@ def settings_personal_post(v):
v=v,
error="Your enemies list is too long")
notify_users = NOTIFY_USERS(enemies, v)
enemies = enemies[:1000]
notify_users = NOTIFY_USERS(enemies, v, v.enemies)
if notify_users:
text = f"@{v.username} has added you to their enemies list!"
cid = notif_comment(text)
@ -293,7 +297,7 @@ def settings_personal_post(v):
for x in notify_users:
add_notif(cid, x, text)
v.enemies = enemies[:1000]
v.enemies = enemies
v.enemies_html=enemies_html
g.db.add(v)
return render_template("settings/personal.html",