Refactor reddit mentions, move to cron.

The reddit mentions system contained much duplicated code and was
grafted onto the post thumbnail pipeline to achieve semi-regular
invocation. Instead, we now run it through the new cron system,
and the duplicate code has been refactored out.
master
Snakes 2022-06-07 10:42:24 -04:00
parent 152315f73e
commit 995375decc
4 changed files with 92 additions and 102 deletions

View File

@ -799,14 +799,21 @@ FACTCHECK_REPLIES = ('<b style="color:#6023f8">Factcheck: This claim has been co
if SITE_NAME == 'rDrama': patron = 'Paypig' if SITE_NAME == 'rDrama': patron = 'Paypig'
else: patron = 'Patron' else: patron = 'Patron'
REDDIT_NOTIFS = { REDDIT_NOTIFS_SITE = []
'idio3': IDIO_ID, REDDIT_NOTIFS_USERS = {}
'aevann': AEVANN_ID,
'carpflo': CARP_ID, if SITE_NAME == 'rDrama':
'carpathianflorist': CARP_ID, REDDIT_NOTIFS_SITE = ['rdrama', 'marsey',]
'carpathian florist': CARP_ID, REDDIT_NOTIFS_USERS = {
'the_homocracy': HOMO_ID 'idio3': IDIO_ID,
} 'aevann': AEVANN_ID,
'carpflo': CARP_ID,
'carpathianflorist': CARP_ID,
'carpathian florist': CARP_ID,
'the_homocracy': HOMO_ID,
}
elif SITE_NAME == 'PCM':
REDDIT_NOTIFS_SITE = ['pcmemes.net',]
discounts = { discounts = {
# Big Spender badges, 2pp additive discount each # Big Spender badges, 2pp additive discount each

View File

@ -1,7 +1,9 @@
from files.cli import g, app, db_session from files.cli import g, app, db_session
import click import click
import files.helpers.const as const import files.helpers.const as const
import files.helpers.lottery as lottery import files.helpers.lottery as lottery
import files.helpers.offsitementions as offsitementions
import files.helpers.stats as stats import files.helpers.stats as stats
@app.cli.command('cron', help='Run scheduled tasks.') @app.cli.command('cron', help='Run scheduled tasks.')
@ -13,6 +15,7 @@ def cron(every_5m, every_1h, every_1d):
if every_5m: if every_5m:
lottery.check_if_end_lottery_task() lottery.check_if_end_lottery_task()
offsitementions.offsite_mentions_task()
if every_1h: if every_1h:
pass pass

View File

@ -0,0 +1,74 @@
from flask import g
import itertools
import requests
import files.helpers.const as const
from files.classes.user import User
from files.classes.comment import Comment
from files.classes.notifications import Notification
# https://api.pushshift.io/meta provides key server_ratelimit_per_minute
# At time of writing, the ratelimit is 120 req/min. We get nowhere near this
# with current keyword quantities. If this ever changes, consider reading the
# value from /meta and doing a random selection of keywords.
def offsite_mentions_task():
if const.REDDIT_NOTIFS_SITE:
# Site-specific logic: send to JL1+, except on PCM JL3+
jl_min = 3 if const.SITE_NAME == 'PCM' else 1
row_send_to = g.db.query(User.id).filter(User.admin_level >= jl_min).all()
send_to = [x[0] for x in row_send_to]
site_mentions = get_mentions(const.REDDIT_NOTIFS_SITE)
notify_mentions(send_to, site_mentions)
if const.REDDIT_NOTIFS_USERS:
for query, send_user in const.REDDIT_NOTIFS_USERS.items():
if not send_user: continue
user_mentions = get_mentions([query])
notify_mentions([send_user], user_mentions, mention_str='mention of you')
def get_mentions(queries):
kinds = ['submission', 'comment']
mentions = []
for kind, query in itertools.product(kinds, queries):
try:
data = requests.get(f'https://api.pushshift.io/reddit/{kind}/search'
+ f'?html_decode=true&q={query}&size=1', timeout=5).json()['data']
except: break
for i in data:
# Special case: PokemonGoRaids says 'Marsey' a lot unrelated to us.
if i['subreddit'] == 'PokemonGoRaids': continue
mentions.append(i['permalink'])
return mentions
def notify_mentions(send_to, mentions, mention_str='site mention'):
for m in mentions:
notif_text = f'<p>New {mention_str}: <a href="https://old.reddit.com{m}' \
f'?context=89" rel="nofollow noopener noreferrer" target="_blank">' \
f'https://old.reddit.com{m}?context=89</a></p>'
existing_comment = g.db.query(Comment.id).filter_by(
author_id=const.NOTIFICATIONS_ID,
parent_submission=None,
body_html=notif_text).one_or_none()
if existing_comment: break
new_comment = Comment(
author_id=const.NOTIFICATIONS_ID,
parent_submission=None,
body_html=notif_text,
distinguish_level=6)
g.db.add(new_comment)
g.db.flush()
new_comment.top_comment_id = new_comment.id
for user_id in send_to:
notif = Notification(comment_id=new_comment.id, user_id=user_id)
g.db.add(notif)
g.db.commit()

View File

@ -707,100 +707,6 @@ def thumbnail_thread(pid):
post.thumburl = process_image(0, name, resize=100) post.thumburl = process_image(0, name, resize=100)
db.add(post) db.add(post)
db.commit() db.commit()
if SITE_NAME == 'rDrama':
for t in ("submission","comment"):
word = random.choice(('rdrama','marsey'))
try:
data = requests.get(f'https://api.pushshift.io/reddit/{t}/search?html_decode=true&q={word}&size=1', timeout=5).json()["data"]
except: break
for i in data:
if i["subreddit"] == 'PokemonGoRaids': continue
body_html = f'''<p>New site mention: <a href="https://old.reddit.com{i["permalink"]}?context=89" rel="nofollow noopener noreferrer" target="_blank">https://old.reddit.com{i["permalink"]}?context=89</a></p>'''
existing_comment = db.query(Comment.id).filter_by(author_id=NOTIFICATIONS_ID, parent_submission=None, body_html=body_html).one_or_none()
if existing_comment: break
new_comment = Comment(author_id=NOTIFICATIONS_ID,
parent_submission=None,
body_html=body_html,
distinguish_level=6
)
db.add(new_comment)
db.flush()
new_comment.top_comment_id = new_comment.id
admins = db.query(User).filter(User.admin_level > 0).all()
for admin in admins:
notif = Notification(comment_id=new_comment.id, user_id=admin.id)
db.add(notif)
k,val = random.choice(tuple(REDDIT_NOTIFS.items()))
try:
data = requests.get(f'https://api.pushshift.io/reddit/{t}/search?html_decode=true&q={k}&size=1', timeout=5).json()["data"]
except: break
for i in data:
body_html = f'''<p>New mention of you: <a href="https://old.reddit.com{i["permalink"]}?context=89" rel="nofollow noopener noreferrer" target="_blank">https://old.reddit.com{i["permalink"]}?context=89</a></p>'''
existing_comment = db.query(Comment.id).filter_by(author_id=NOTIFICATIONS_ID, parent_submission=None,body_html=body_html).one_or_none()
if existing_comment: break
new_comment = Comment(author_id=NOTIFICATIONS_ID,
parent_submission=None,
body_html=body_html,
distinguish_level=6
)
db.add(new_comment)
db.flush()
new_comment.top_comment_id = new_comment.id
notif = Notification(comment_id=new_comment.id, user_id=val)
db.add(notif)
if SITE == 'pcmemes.net':
for t in ("submission","comment"):
try:
data = requests.get(f'https://api.pushshift.io/reddit/{t}/search?html_decode=true&q=pcmemes.net&size=1', timeout=5).json()["data"]
except: break
for i in data:
body_html = f'''<p>New site mention: <a href="https://old.reddit.com{i["permalink"]}?context=89" rel="nofollow noopener noreferrer" target="_blank">https://old.reddit.com{i["permalink"]}?context=89</a></p>'''
existing_comment = db.query(Comment.id).filter_by(author_id=NOTIFICATIONS_ID, parent_submission=None, body_html=body_html).one_or_none()
if existing_comment: break
new_comment = Comment(author_id=NOTIFICATIONS_ID,
parent_submission=None,
body_html=body_html,
distinguish_level=6
)
db.add(new_comment)
db.flush()
new_comment.top_comment_id = new_comment.id
admins = db.query(User).filter(User.admin_level > 2).all()
for admin in admins:
notif = Notification(comment_id=new_comment.id, user_id=admin.id)
db.add(notif)
db.commit()
db.close() db.close()
stdout.flush() stdout.flush()
return return