2022-11-15 09:19:08 +00:00
|
|
|
import random
|
|
|
|
import time
|
2022-12-04 21:46:27 +00:00
|
|
|
from typing import Type
|
2022-11-15 09:19:08 +00:00
|
|
|
from urllib.parse import quote
|
2023-03-04 18:33:10 +00:00
|
|
|
from sqlalchemy.sql import func
|
2022-11-15 09:19:08 +00:00
|
|
|
import gevent
|
|
|
|
import requests
|
2022-06-15 19:33:21 +00:00
|
|
|
from flask import g
|
2023-03-04 18:33:10 +00:00
|
|
|
|
2022-11-15 09:19:08 +00:00
|
|
|
from files.classes.flags import Flag
|
|
|
|
from files.classes.mod_logs import ModAction
|
|
|
|
from files.classes.notifications import Notification
|
2022-12-04 21:46:27 +00:00
|
|
|
from files.classes.polls import CommentOption, SubmissionOption
|
2023-03-25 22:06:44 +00:00
|
|
|
from files.classes.award import AwardRelationship
|
2022-11-15 09:19:08 +00:00
|
|
|
|
2023-02-24 06:48:30 +00:00
|
|
|
from files.helpers.alerts import send_repeatable_notification, push_notif
|
2022-12-11 23:44:34 +00:00
|
|
|
from files.helpers.config.const import *
|
2023-03-25 22:06:44 +00:00
|
|
|
from files.helpers.config.awards import AWARDS
|
2022-11-15 09:19:08 +00:00
|
|
|
from files.helpers.const_stateful import *
|
2022-07-08 11:44:17 +00:00
|
|
|
from files.helpers.get import *
|
2022-11-30 18:09:31 +00:00
|
|
|
from files.helpers.logging import log_file
|
2022-07-08 11:44:17 +00:00
|
|
|
from files.helpers.sanitize import *
|
2022-11-30 17:37:35 +00:00
|
|
|
from files.helpers.settings import get_setting
|
2022-11-07 00:08:50 +00:00
|
|
|
from files.helpers.slots import check_slots_command
|
2022-07-08 11:44:17 +00:00
|
|
|
|
2022-12-09 03:35:28 +00:00
|
|
|
post_target_type = Union[Submission, User]
|
2022-10-30 22:39:37 +00:00
|
|
|
|
2022-11-15 09:19:08 +00:00
|
|
|
def _archiveorg(url):
|
2022-11-21 23:52:21 +00:00
|
|
|
headers = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}
|
|
|
|
try:
|
|
|
|
requests.get(f'https://web.archive.org/save/{url}',
|
|
|
|
headers=headers, timeout=10, proxies=proxies)
|
|
|
|
except: pass
|
|
|
|
try:
|
|
|
|
requests.post('https://ghostarchive.org/archive2', data={"archive": url},
|
|
|
|
headers=headers, timeout=10, proxies=proxies)
|
2022-09-03 14:24:16 +00:00
|
|
|
except: pass
|
2022-10-30 22:39:37 +00:00
|
|
|
|
2022-09-03 03:10:14 +00:00
|
|
|
|
2023-01-01 11:36:20 +00:00
|
|
|
def archive_url(url):
|
2022-11-15 09:19:08 +00:00
|
|
|
gevent.spawn(_archiveorg, url)
|
2022-09-03 03:10:14 +00:00
|
|
|
if url.startswith('https://twitter.com/'):
|
2022-09-29 05:36:10 +00:00
|
|
|
url = url.replace('https://twitter.com/', 'https://nitter.lacontrevoie.fr/')
|
2022-11-15 09:19:08 +00:00
|
|
|
gevent.spawn(_archiveorg, url)
|
2022-09-03 03:10:14 +00:00
|
|
|
if url.startswith('https://instagram.com/'):
|
2023-01-23 06:28:54 +00:00
|
|
|
url = url.replace('https://instagram.com/p/', 'https://imginn.com/p/')
|
2022-11-15 09:19:08 +00:00
|
|
|
gevent.spawn(_archiveorg, url)
|
2022-09-03 03:10:14 +00:00
|
|
|
|
2023-03-18 10:59:30 +00:00
|
|
|
def snappy_report(post, reason):
|
|
|
|
flag = Flag(post_id=post.id, user_id=SNAPPY_ID, reason=reason)
|
|
|
|
g.db.add(flag)
|
|
|
|
message = f'@Snappy reported [{post.title}]({post.shortlink})\n\n> {reason}'
|
|
|
|
send_repeatable_notification(post.author_id, message)
|
|
|
|
|
2022-12-09 03:35:28 +00:00
|
|
|
def execute_snappy(post:Submission, v:User):
|
2022-12-19 16:19:33 +00:00
|
|
|
ghost = post.ghost
|
|
|
|
|
2022-07-08 11:44:17 +00:00
|
|
|
snappy = get_account(SNAPPY_ID)
|
|
|
|
|
2023-02-24 07:07:40 +00:00
|
|
|
if v.id == CARP_ID:
|
2022-07-08 11:44:17 +00:00
|
|
|
if random.random() < 0.02: body = "i love you carp"
|
2023-03-12 13:02:31 +00:00
|
|
|
elif random.random() < 0.02: body = "https://i.rdrama.net/images/16614707883108485.webp"
|
2022-07-08 11:44:17 +00:00
|
|
|
else: body = ":#marseyfuckoffcarp:"
|
|
|
|
elif v.id == LAWLZ_ID:
|
|
|
|
if random.random() < 0.5: body = "wow, this lawlzpost sucks!"
|
|
|
|
else: body = "wow, a good lawlzpost for once!"
|
|
|
|
else:
|
2023-03-18 15:33:24 +00:00
|
|
|
if SNAPPY_MARSEYS and SNAPPY_QUOTES:
|
2023-03-08 06:51:40 +00:00
|
|
|
if IS_FISTMAS() or random.random() > 0.5:
|
2022-12-19 01:20:14 +00:00
|
|
|
SNAPPY_CHOICES = SNAPPY_QUOTES
|
2023-01-01 11:36:20 +00:00
|
|
|
else:
|
2023-03-18 15:33:24 +00:00
|
|
|
SNAPPY_CHOICES = SNAPPY_MARSEYS
|
|
|
|
elif SNAPPY_MARSEYS: SNAPPY_CHOICES = SNAPPY_MARSEYS
|
2022-08-15 05:10:15 +00:00
|
|
|
elif SNAPPY_QUOTES: SNAPPY_CHOICES = SNAPPY_QUOTES
|
2022-10-15 11:02:02 +00:00
|
|
|
else: SNAPPY_CHOICES = [""]
|
2022-08-15 05:10:15 +00:00
|
|
|
|
|
|
|
body = random.choice(SNAPPY_CHOICES).strip()
|
2022-12-13 16:36:16 +00:00
|
|
|
if body.startswith('â–¼') or body.startswith(':#marseydownvote'):
|
2023-01-28 12:01:18 +00:00
|
|
|
if body.startswith('â–¼'): body = body[1:]
|
2022-07-08 11:44:17 +00:00
|
|
|
vote = Vote(user_id=SNAPPY_ID,
|
|
|
|
vote_type=-1,
|
|
|
|
submission_id=post.id,
|
|
|
|
real = True
|
|
|
|
)
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(vote)
|
2022-07-08 11:44:17 +00:00
|
|
|
post.downvotes += 1
|
|
|
|
if body.startswith('OP is a Trump supporter'):
|
2023-03-18 10:59:30 +00:00
|
|
|
snappy_report(post, 'Trump supporter')
|
2022-07-08 11:44:17 +00:00
|
|
|
elif body.startswith('You had your chance. Downvoted and reported'):
|
2023-03-18 10:59:30 +00:00
|
|
|
snappy_report(post, 'Retard')
|
2022-11-22 21:45:50 +00:00
|
|
|
elif body.startswith('â–²') or body.startswith(':#marseyupvote'):
|
2023-01-28 12:01:18 +00:00
|
|
|
if body.startswith('â–²'): body = body[1:]
|
2022-07-08 11:44:17 +00:00
|
|
|
vote = Vote(user_id=SNAPPY_ID,
|
|
|
|
vote_type=1,
|
|
|
|
submission_id=post.id,
|
|
|
|
real = True
|
|
|
|
)
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(vote)
|
2022-07-08 11:44:17 +00:00
|
|
|
post.upvotes += 1
|
2022-12-19 16:19:33 +00:00
|
|
|
elif body.startswith(':#marseyghost'):
|
|
|
|
ghost = True
|
2023-03-04 18:33:10 +00:00
|
|
|
elif body == '!slots':
|
|
|
|
body = f'!slots{snappy.coins}'
|
|
|
|
elif body == '!pinggroup':
|
2023-03-16 06:27:58 +00:00
|
|
|
group = g.db.query(Group).order_by(func.random()).first()
|
2023-03-04 18:33:10 +00:00
|
|
|
|
|
|
|
members = group.member_ids
|
|
|
|
|
|
|
|
if group.name == 'biofoids': mul = 10
|
|
|
|
else: mul = 5
|
|
|
|
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.query(User).filter(User.id.in_(members)).update({ User.coins: User.coins + mul })
|
2023-03-04 18:33:10 +00:00
|
|
|
|
|
|
|
cost = len(members) * mul
|
|
|
|
snappy.charge_account('coins', cost)
|
|
|
|
|
|
|
|
body = f'!{group.name}'
|
2023-03-25 22:08:36 +00:00
|
|
|
elif body.startswith(':#marseyglow'):
|
2023-03-25 22:06:44 +00:00
|
|
|
award_object = AwardRelationship(
|
|
|
|
user_id=snappy.id,
|
|
|
|
kind="glowie",
|
|
|
|
submission_id=post.id,
|
|
|
|
)
|
|
|
|
g.db.add(award_object)
|
|
|
|
|
|
|
|
awarded_coins = int(AWARDS["glowie"]['price'] * COSMETIC_AWARD_COIN_AWARD_PCT) if AWARDS["glowie"]['cosmetic'] else 0
|
|
|
|
if AWARDS["glowie"]['cosmetic']:
|
|
|
|
post.author.pay_account('coins', awarded_coins)
|
|
|
|
|
|
|
|
msg = f"@Snappy has given your [post]({post.shortlink}) the {AWARDS['glowie']['title']} Award"
|
|
|
|
if awarded_coins > 0:
|
|
|
|
msg += f" and you have received {awarded_coins} coins as a result"
|
|
|
|
msg += "!"
|
|
|
|
send_repeatable_notification(post.author.id, msg)
|
2023-03-04 18:33:10 +00:00
|
|
|
|
2022-07-08 11:44:17 +00:00
|
|
|
|
|
|
|
body += "\n\n"
|
|
|
|
|
2023-03-21 15:39:26 +00:00
|
|
|
if post.url and not post.url.startswith('/') and not post.url.startswith(SITE_FULL) and not post.url.startswith(SITE_FULL_IMAGES):
|
2022-07-08 11:44:17 +00:00
|
|
|
if post.url.startswith('https://old.reddit.com/r/'):
|
|
|
|
rev = post.url.replace('https://old.reddit.com/', '')
|
2023-02-26 10:20:32 +00:00
|
|
|
rev = f"* [unddit.com](https://unddit.com/{rev})\n\n"
|
2022-07-08 11:44:17 +00:00
|
|
|
elif post.url.startswith("https://old.reddit.com/u/"):
|
|
|
|
rev = post.url.replace('https://old.reddit.com/u/', '')
|
2023-02-26 10:20:32 +00:00
|
|
|
rev = "* [camas.unddit.com](https://camas.unddit.com/reddit-search/#\u007b\"author\":\"{rev}\",\"resultSize\":100\u007d)\n\n"
|
2022-07-08 11:44:17 +00:00
|
|
|
else: rev = ''
|
2022-11-11 08:45:28 +00:00
|
|
|
|
2023-02-26 10:20:32 +00:00
|
|
|
body += f"Snapshots:\n\n{rev}* [archive.org](https://web.archive.org/{post.url})\n\n* [ghostarchive.org](https://ghostarchive.org/search?term={quote(post.url)})\n\n* [archive.ph](https://archive.ph/?url={quote(post.url)}&run=1) (click to archive)\n\n"
|
2022-09-22 20:45:26 +00:00
|
|
|
archive_url(post.url)
|
2022-08-15 17:45:43 +00:00
|
|
|
|
2022-07-08 11:44:17 +00:00
|
|
|
captured = []
|
|
|
|
body_for_snappy = post.body_html.replace(' data-src="', ' src="')
|
|
|
|
|
|
|
|
|
2022-07-11 17:45:07 +00:00
|
|
|
for i in list(snappy_url_regex.finditer(body_for_snappy)):
|
|
|
|
href = i.group(1)
|
|
|
|
if href in [x[0] for x in captured]: continue
|
2022-07-08 11:44:17 +00:00
|
|
|
title = i.group(2)
|
2022-07-11 17:45:07 +00:00
|
|
|
captured.append((href, title))
|
|
|
|
|
|
|
|
for i in list(snappy_youtube_regex.finditer(body_for_snappy)):
|
|
|
|
href = f'https://youtube.com/watch?v={i.group(1)}'
|
|
|
|
if href in [x[0] for x in captured]: continue
|
|
|
|
captured.append((href, href))
|
|
|
|
|
|
|
|
|
|
|
|
for href, title in captured:
|
2023-03-21 15:39:26 +00:00
|
|
|
if href.startswith(SITE_FULL) or href.startswith(SITE_FULL_IMAGES): continue
|
2022-07-08 11:44:17 +00:00
|
|
|
if "Snapshots:\n\n" not in body: body += "Snapshots:\n\n"
|
|
|
|
if f'**[{title}]({href})**:\n\n' not in body:
|
|
|
|
addition = f'**[{title}]({href})**:\n\n'
|
|
|
|
if href.startswith('https://old.reddit.com/r/'):
|
|
|
|
rev = href.replace('https://old.reddit.com/', '')
|
2023-02-26 10:20:32 +00:00
|
|
|
addition += f'* [unddit.com](https://unddit.com/{rev})\n\n'
|
2022-07-08 11:44:17 +00:00
|
|
|
if href.startswith('https://old.reddit.com/u/'):
|
|
|
|
rev = href.replace('https://old.reddit.com/u/', '')
|
2023-02-26 10:20:32 +00:00
|
|
|
addition += "* [camas.unddit.com](https://camas.unddit.com/reddit-search/#\u007b\"author\":\"{rev}\",\"resultSize\":100\u007d)\n\n"
|
|
|
|
addition += f'* [archive.org](https://web.archive.org/{href})\n\n'
|
|
|
|
addition += f'* [ghostarchive.org](https://ghostarchive.org/search?term={quote(href)})\n\n'
|
|
|
|
addition += f'* [archive.ph](https://archive.ph/?url={quote(href)}&run=1) (click to archive)\n\n'
|
2022-10-14 13:19:47 +00:00
|
|
|
if len(f'{body}{addition}') > COMMENT_BODY_LENGTH_LIMIT: break
|
2022-07-08 11:44:17 +00:00
|
|
|
body += addition
|
2022-09-03 03:10:14 +00:00
|
|
|
archive_url(href)
|
2022-08-15 17:45:43 +00:00
|
|
|
|
2022-10-14 13:19:47 +00:00
|
|
|
body = body.strip()[:COMMENT_BODY_LENGTH_LIMIT]
|
2023-01-21 04:18:02 +00:00
|
|
|
body_html = sanitize(body, snappy=True)
|
2022-07-08 11:44:17 +00:00
|
|
|
|
2022-07-09 10:50:53 +00:00
|
|
|
if len(body_html) == 0:
|
|
|
|
return
|
|
|
|
|
2022-10-14 13:19:47 +00:00
|
|
|
if len(body_html) < COMMENT_BODY_HTML_LENGTH_LIMIT:
|
2022-07-08 11:44:17 +00:00
|
|
|
c = Comment(author_id=SNAPPY_ID,
|
|
|
|
distinguish_level=6,
|
|
|
|
parent_submission=post.id,
|
|
|
|
level=1,
|
|
|
|
over_18=False,
|
|
|
|
is_bot=True,
|
|
|
|
app_id=None,
|
|
|
|
body=body,
|
|
|
|
body_html=body_html,
|
2022-12-19 16:19:33 +00:00
|
|
|
ghost=ghost
|
2022-07-08 11:44:17 +00:00
|
|
|
)
|
|
|
|
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(c)
|
2022-07-08 11:44:17 +00:00
|
|
|
|
2022-12-09 05:55:18 +00:00
|
|
|
check_slots_command(c, v, snappy)
|
2022-11-07 00:08:50 +00:00
|
|
|
|
2022-07-08 11:44:17 +00:00
|
|
|
snappy.comment_count += 1
|
2022-11-20 10:50:02 +00:00
|
|
|
snappy.pay_account('coins', 1)
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(snappy)
|
2022-07-08 11:44:17 +00:00
|
|
|
|
2022-07-18 05:10:01 +00:00
|
|
|
if FEATURES['PINS'] and (body.startswith(':#marseypin:') or body.startswith(':#marseypin2:')):
|
2022-07-08 11:44:17 +00:00
|
|
|
post.stickied = "Snappy"
|
|
|
|
post.stickied_utc = int(time.time()) + 3600
|
|
|
|
|
2022-10-01 17:37:59 +00:00
|
|
|
elif SITE_NAME == 'rDrama' and body.startswith(':#marseyban:'):
|
2022-10-01 17:37:25 +00:00
|
|
|
days = 0.01
|
|
|
|
reason = f'<a href="/post/{post.id}">/post/{post.id}</a>'
|
|
|
|
v.ban(admin=snappy, reason=reason, days=days)
|
|
|
|
text = f"@Snappy has banned you for **{days}** days for the following reason:\n\n> {reason}"
|
|
|
|
send_repeatable_notification(v.id, text)
|
|
|
|
duration = f"for {days} days"
|
|
|
|
ma=ModAction(
|
|
|
|
kind="ban_user",
|
|
|
|
user_id=snappy.id,
|
|
|
|
target_user_id=v.id,
|
2022-12-30 15:47:40 +00:00
|
|
|
_note=f'duration: {duration}, reason: "{reason}"'
|
2022-10-01 17:37:25 +00:00
|
|
|
)
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(ma)
|
2022-10-01 17:37:25 +00:00
|
|
|
post.bannedfor = f'{duration} by @Snappy'
|
|
|
|
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.flush()
|
2022-07-08 11:44:17 +00:00
|
|
|
|
|
|
|
c.top_comment_id = c.id
|
|
|
|
|
|
|
|
post.comment_count += 1
|
2022-07-09 10:50:53 +00:00
|
|
|
post.replies = [c]
|
2022-10-09 13:28:18 +00:00
|
|
|
|
2022-12-09 03:35:28 +00:00
|
|
|
def execute_zozbot(c:Comment, level:int, post_target:post_target_type, v):
|
|
|
|
if SITE_NAME != 'rDrama': return
|
|
|
|
posting_to_submission = isinstance(post_target, Submission)
|
2022-10-09 13:28:18 +00:00
|
|
|
if random.random() >= 0.001: return
|
|
|
|
c2 = Comment(author_id=ZOZBOT_ID,
|
2022-12-09 03:35:28 +00:00
|
|
|
parent_submission=post_target.id if posting_to_submission else None,
|
|
|
|
wall_user_id=post_target.id if not posting_to_submission else None,
|
2022-10-09 13:29:58 +00:00
|
|
|
parent_comment_id=c.id,
|
|
|
|
level=level+1,
|
|
|
|
is_bot=True,
|
|
|
|
body="zoz",
|
2022-11-23 00:09:42 +00:00
|
|
|
body_html='<p class="zozbot">zoz</p>',
|
2022-10-09 13:29:58 +00:00
|
|
|
top_comment_id=c.top_comment_id,
|
|
|
|
ghost=c.ghost,
|
|
|
|
distinguish_level=6
|
|
|
|
)
|
2022-10-09 13:28:18 +00:00
|
|
|
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(c2)
|
|
|
|
g.db.flush()
|
2022-10-09 13:28:18 +00:00
|
|
|
n = Notification(comment_id=c2.id, user_id=v.id)
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(n)
|
2022-10-09 13:28:18 +00:00
|
|
|
|
|
|
|
c3 = Comment(author_id=ZOZBOT_ID,
|
2022-12-09 03:35:28 +00:00
|
|
|
parent_submission=post_target.id if posting_to_submission else None,
|
|
|
|
wall_user_id=post_target.id if not posting_to_submission else None,
|
2022-10-09 13:28:18 +00:00
|
|
|
parent_comment_id=c2.id,
|
|
|
|
level=level+2,
|
|
|
|
is_bot=True,
|
|
|
|
body="zle",
|
2022-11-23 00:09:42 +00:00
|
|
|
body_html='<p class="zozbot">zle</p>',
|
2022-10-09 13:28:18 +00:00
|
|
|
top_comment_id=c.top_comment_id,
|
|
|
|
ghost=c.ghost,
|
|
|
|
distinguish_level=6
|
|
|
|
)
|
|
|
|
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(c3)
|
|
|
|
g.db.flush()
|
2022-11-11 08:45:28 +00:00
|
|
|
|
2022-10-09 13:28:18 +00:00
|
|
|
|
|
|
|
c4 = Comment(author_id=ZOZBOT_ID,
|
2022-12-09 03:35:28 +00:00
|
|
|
parent_submission=post_target.id if posting_to_submission else None,
|
|
|
|
wall_user_id=post_target.id if not posting_to_submission else None,
|
2022-10-09 13:28:18 +00:00
|
|
|
parent_comment_id=c3.id,
|
|
|
|
level=level+3,
|
|
|
|
is_bot=True,
|
|
|
|
body="zozzle",
|
2022-11-23 00:09:42 +00:00
|
|
|
body_html='<p class="zozbot">zozzle</p>',
|
2022-10-09 13:28:18 +00:00
|
|
|
top_comment_id=c.top_comment_id,
|
|
|
|
ghost=c.ghost,
|
|
|
|
distinguish_level=6
|
|
|
|
)
|
|
|
|
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(c4)
|
2022-10-09 13:28:18 +00:00
|
|
|
|
|
|
|
zozbot = get_account(ZOZBOT_ID)
|
|
|
|
zozbot.comment_count += 3
|
2022-11-20 10:50:02 +00:00
|
|
|
zozbot.pay_account('coins', 1)
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(zozbot)
|
2022-10-09 13:28:18 +00:00
|
|
|
|
2023-02-18 21:59:17 +00:00
|
|
|
if posting_to_submission:
|
|
|
|
post_target.comment_count += 3
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(post_target)
|
2023-02-18 21:59:17 +00:00
|
|
|
|
2023-02-27 13:35:53 +00:00
|
|
|
push_notif({v.id}, f'New reply by @{c2.author_name}', "zoz", c2)
|
2023-02-18 21:59:17 +00:00
|
|
|
|
2022-12-09 03:35:28 +00:00
|
|
|
def execute_longpostbot(c:Comment, level:int, body, body_html, post_target:post_target_type, v:User):
|
|
|
|
if SITE_NAME != 'rDrama': return
|
|
|
|
posting_to_submission = isinstance(post_target, Submission)
|
2022-10-09 16:40:20 +00:00
|
|
|
if not len(c.body.split()) >= 200: return
|
2022-10-09 20:13:55 +00:00
|
|
|
if "</blockquote>" in body_html: return
|
2022-10-09 13:28:18 +00:00
|
|
|
body = random.choice(LONGPOST_REPLIES)
|
|
|
|
if body.startswith('â–¼'):
|
|
|
|
body = body[1:]
|
|
|
|
vote = CommentVote(user_id=LONGPOSTBOT_ID,
|
|
|
|
vote_type=-1,
|
|
|
|
comment_id=c.id,
|
|
|
|
real = True
|
|
|
|
)
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(vote)
|
2022-10-09 13:28:18 +00:00
|
|
|
c.downvotes = 1
|
|
|
|
|
2023-02-25 16:09:20 +00:00
|
|
|
body_html = sanitize(body)
|
|
|
|
|
2022-10-09 13:28:18 +00:00
|
|
|
c2 = Comment(author_id=LONGPOSTBOT_ID,
|
2022-12-09 03:35:28 +00:00
|
|
|
parent_submission=post_target.id if posting_to_submission else None,
|
|
|
|
wall_user_id=post_target.id if not posting_to_submission else None,
|
2022-10-09 13:28:18 +00:00
|
|
|
parent_comment_id=c.id,
|
|
|
|
level=level+1,
|
|
|
|
is_bot=True,
|
|
|
|
body=body,
|
2023-02-25 16:09:20 +00:00
|
|
|
body_html=body_html,
|
2022-10-09 13:28:18 +00:00
|
|
|
top_comment_id=c.top_comment_id,
|
|
|
|
ghost=c.ghost
|
|
|
|
)
|
|
|
|
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(c2)
|
2022-10-09 13:28:18 +00:00
|
|
|
|
|
|
|
longpostbot = get_account(LONGPOSTBOT_ID)
|
|
|
|
longpostbot.comment_count += 1
|
2022-11-20 10:50:02 +00:00
|
|
|
longpostbot.pay_account('coins', 1)
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(longpostbot)
|
|
|
|
g.db.flush()
|
2022-10-09 13:28:18 +00:00
|
|
|
n = Notification(comment_id=c2.id, user_id=v.id)
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(n)
|
2022-10-09 13:49:08 +00:00
|
|
|
|
2023-02-18 21:59:17 +00:00
|
|
|
if posting_to_submission:
|
|
|
|
post_target.comment_count += 3
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(post_target)
|
2023-02-18 21:59:17 +00:00
|
|
|
|
2023-02-27 13:35:53 +00:00
|
|
|
push_notif({v.id}, f'New reply by @{c2.author_name}', c2.body, c2)
|
2023-02-18 21:59:17 +00:00
|
|
|
|
2022-10-12 05:11:20 +00:00
|
|
|
def execute_antispam_submission_check(title, v, url):
|
|
|
|
now = int(time.time())
|
|
|
|
cutoff = now - 60 * 60 * 24
|
|
|
|
|
2023-03-16 06:27:58 +00:00
|
|
|
similar_posts = g.db.query(Submission).filter(
|
2022-10-12 05:11:20 +00:00
|
|
|
Submission.author_id == v.id,
|
|
|
|
Submission.title.op('<->')(title) < SPAM_SIMILARITY_THRESHOLD,
|
|
|
|
Submission.created_utc > cutoff
|
|
|
|
).all()
|
|
|
|
|
|
|
|
if url:
|
2023-03-16 06:27:58 +00:00
|
|
|
similar_urls = g.db.query(Submission).filter(
|
2022-10-12 05:11:20 +00:00
|
|
|
Submission.author_id == v.id,
|
|
|
|
Submission.url.op('<->')(url) < SPAM_URL_SIMILARITY_THRESHOLD,
|
|
|
|
Submission.created_utc > cutoff
|
|
|
|
).all()
|
|
|
|
else: similar_urls = []
|
|
|
|
|
|
|
|
threshold = SPAM_SIMILAR_COUNT_THRESHOLD
|
|
|
|
if v.age >= (60 * 60 * 24 * 7): threshold *= 3
|
|
|
|
elif v.age >= (60 * 60 * 24): threshold *= 2
|
|
|
|
|
|
|
|
if max(len(similar_urls), len(similar_posts)) >= threshold:
|
|
|
|
text = "Your account has been banned for **1 day** for the following reason:\n\n> Too much spam!"
|
|
|
|
send_repeatable_notification(v.id, text)
|
|
|
|
|
|
|
|
v.ban(reason="Spamming.",
|
|
|
|
days=1)
|
|
|
|
|
|
|
|
for post in similar_posts + similar_urls:
|
|
|
|
post.is_banned = True
|
|
|
|
post.is_pinned = False
|
|
|
|
post.ban_reason = "AutoJanny"
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(post)
|
2022-10-12 05:11:20 +00:00
|
|
|
ma=ModAction(
|
|
|
|
user_id=AUTOJANNY_ID,
|
|
|
|
target_submission_id=post.id,
|
|
|
|
kind="ban_post",
|
2023-02-19 13:24:42 +00:00
|
|
|
_note="Spam"
|
2022-10-12 05:11:20 +00:00
|
|
|
)
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(ma)
|
2022-10-12 05:11:20 +00:00
|
|
|
return False
|
|
|
|
return True
|
|
|
|
|
2022-11-14 03:48:52 +00:00
|
|
|
def execute_antispam_duplicate_comment_check(v:User, body_html:str):
|
2023-03-07 01:08:10 +00:00
|
|
|
if v.admin_level >= PERMS['USE_ADMIGGER_THREADS']: return
|
|
|
|
|
2022-11-14 03:48:52 +00:00
|
|
|
'''
|
|
|
|
Sanity check for newfriends
|
|
|
|
'''
|
2022-11-23 20:45:09 +00:00
|
|
|
ANTISPAM_DUPLICATE_THRESHOLD = 3
|
2022-11-14 03:48:52 +00:00
|
|
|
if v.id in ANTISPAM_BYPASS_IDS or v.admin_level: return
|
|
|
|
if v.age >= NOTIFICATION_SPAM_AGE_THRESHOLD: return
|
|
|
|
if len(body_html) < 16: return
|
|
|
|
if body_html == '!wordle': return # wordle
|
|
|
|
compare_time = int(time.time()) - 60 * 60 * 24
|
2023-03-16 06:27:58 +00:00
|
|
|
count = g.db.query(Comment.id).filter(Comment.body_html == body_html,
|
2022-11-23 20:45:09 +00:00
|
|
|
Comment.created_utc >= compare_time).count()
|
|
|
|
if count <= ANTISPAM_DUPLICATE_THRESHOLD: return
|
2022-11-14 03:48:52 +00:00
|
|
|
v.ban(reason="Spamming.", days=0.0)
|
|
|
|
send_repeatable_notification(v.id, "Your account has been banned **permanently** for the following reason:\n\n> Too much spam!")
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(v)
|
|
|
|
g.db.commit()
|
2022-11-14 03:48:52 +00:00
|
|
|
abort(403, "Too much spam!")
|
|
|
|
|
2022-10-24 17:27:25 +00:00
|
|
|
def execute_antispam_comment_check(body:str, v:User):
|
2023-03-07 01:08:10 +00:00
|
|
|
if v.admin_level >= PERMS['USE_ADMIGGER_THREADS']: return
|
|
|
|
|
2022-10-24 17:27:25 +00:00
|
|
|
if v.id in ANTISPAM_BYPASS_IDS: return
|
2022-10-12 05:11:20 +00:00
|
|
|
if len(body) <= COMMENT_SPAM_LENGTH_THRESHOLD: return
|
|
|
|
now = int(time.time())
|
|
|
|
cutoff = now - 60 * 60 * 24
|
|
|
|
|
2023-03-16 06:27:58 +00:00
|
|
|
similar_comments = g.db.query(Comment).filter(
|
2022-10-12 05:11:20 +00:00
|
|
|
Comment.author_id == v.id,
|
|
|
|
Comment.body.op('<->')(body) < COMMENT_SPAM_SIMILAR_THRESHOLD,
|
|
|
|
Comment.created_utc > cutoff
|
|
|
|
).all()
|
|
|
|
|
|
|
|
threshold = COMMENT_SPAM_COUNT_THRESHOLD
|
|
|
|
if v.age >= (60 * 60 * 24 * 7):
|
|
|
|
threshold *= 3
|
|
|
|
elif v.age >= (60 * 60 * 24):
|
|
|
|
threshold *= 2
|
2022-11-11 08:45:28 +00:00
|
|
|
|
2022-10-12 05:11:20 +00:00
|
|
|
if len(similar_comments) <= threshold: return
|
|
|
|
text = "Your account has been banned for **1 day** for the following reason:\n\n> Too much spam!"
|
|
|
|
send_repeatable_notification(v.id, text)
|
|
|
|
v.ban(reason="Spamming.",
|
|
|
|
days=1)
|
|
|
|
for comment in similar_comments:
|
|
|
|
comment.is_banned = True
|
|
|
|
comment.ban_reason = "AutoJanny"
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(comment)
|
2022-10-12 05:11:20 +00:00
|
|
|
ma=ModAction(
|
|
|
|
user_id=AUTOJANNY_ID,
|
|
|
|
target_comment_id=comment.id,
|
|
|
|
kind="ban_comment",
|
2023-02-19 13:24:42 +00:00
|
|
|
_note="Spam"
|
2022-10-12 05:11:20 +00:00
|
|
|
)
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(ma)
|
|
|
|
g.db.commit()
|
2022-10-21 00:28:05 +00:00
|
|
|
abort(403, "Too much spam!")
|
2022-10-23 17:01:00 +00:00
|
|
|
|
2022-12-22 20:03:40 +00:00
|
|
|
def execute_under_siege(v:User, target:Optional[Union[Submission, Comment]], body, type:str) -> bool:
|
2022-11-30 17:37:35 +00:00
|
|
|
if not get_setting("under_siege"): return True
|
2023-02-27 12:49:19 +00:00
|
|
|
|
2023-03-16 06:27:58 +00:00
|
|
|
unshadowbannedcels = [x[0] for x in g.db.query(ModAction.target_user_id).filter_by(kind='unshadowban').all()]
|
2023-03-13 19:22:39 +00:00
|
|
|
if v.id in unshadowbannedcels: return True
|
2023-03-12 20:46:13 +00:00
|
|
|
|
2023-02-27 12:49:19 +00:00
|
|
|
if type in ('flag', 'message'):
|
|
|
|
threshold = 86400
|
|
|
|
else:
|
|
|
|
threshold = UNDER_SIEGE_AGE_THRESHOLD
|
|
|
|
|
|
|
|
if not v.shadowbanned and v.age < threshold and not v.admin_level >= PERMS['SITE_BYPASS_UNDER_SIEGE_MODE']:
|
2022-12-13 18:50:38 +00:00
|
|
|
v.shadowbanned = AUTOJANNY_ID
|
2022-12-18 14:23:59 +00:00
|
|
|
|
2022-12-18 14:25:24 +00:00
|
|
|
ma = ModAction(
|
|
|
|
kind="shadowban",
|
|
|
|
user_id=AUTOJANNY_ID,
|
|
|
|
target_user_id=v.id,
|
2023-03-02 00:37:17 +00:00
|
|
|
_note=f'reason: "Under Siege ({type}, {v.age} seconds)"'
|
2022-12-18 14:25:24 +00:00
|
|
|
)
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(ma)
|
2022-12-18 14:25:24 +00:00
|
|
|
|
|
|
|
v.ban_reason = "Under Siege"
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(v)
|
2022-11-30 18:09:31 +00:00
|
|
|
t = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(time.time()))
|
2022-11-30 17:37:35 +00:00
|
|
|
return False
|
|
|
|
return True
|
|
|
|
|
2022-10-23 17:01:00 +00:00
|
|
|
def execute_lawlz_actions(v:User, p:Submission):
|
|
|
|
if v.id != LAWLZ_ID: return
|
|
|
|
if SITE_NAME != 'rDrama': return
|
2022-10-23 17:14:27 +00:00
|
|
|
if not FEATURES['PINS']: return
|
2022-10-23 17:01:00 +00:00
|
|
|
p.stickied_utc = int(time.time()) + 86400
|
2022-12-01 12:27:12 +00:00
|
|
|
p.stickied = "AutoJanny"
|
2022-10-23 17:01:00 +00:00
|
|
|
p.distinguish_level = 6
|
2022-11-05 02:24:30 +00:00
|
|
|
p.flair = filter_emojis_only(":ben10: Required Reading")
|
2022-10-23 17:01:00 +00:00
|
|
|
ma_1=ModAction(
|
|
|
|
kind="pin_post",
|
2022-11-26 01:56:04 +00:00
|
|
|
user_id=AUTOJANNY_ID,
|
2022-10-23 17:01:00 +00:00
|
|
|
target_submission_id=p.id,
|
2022-12-30 15:47:40 +00:00
|
|
|
_note='for 1 day'
|
2022-10-23 17:01:00 +00:00
|
|
|
)
|
|
|
|
ma_2=ModAction(
|
|
|
|
kind="distinguish_post",
|
2022-11-26 01:56:04 +00:00
|
|
|
user_id=AUTOJANNY_ID,
|
2022-10-23 17:01:00 +00:00
|
|
|
target_submission_id=p.id
|
|
|
|
)
|
|
|
|
ma_3=ModAction(
|
|
|
|
kind="flair_post",
|
2022-11-26 01:56:04 +00:00
|
|
|
user_id=AUTOJANNY_ID,
|
2022-10-23 17:01:00 +00:00
|
|
|
target_submission_id=p.id,
|
|
|
|
_note=f'"{p.flair}"'
|
|
|
|
)
|
2023-03-16 06:27:58 +00:00
|
|
|
g.db.add(p)
|
|
|
|
g.db.add(ma_1)
|
|
|
|
g.db.add(ma_2)
|
|
|
|
g.db.add(ma_3)
|
2022-12-04 21:46:27 +00:00
|
|
|
|
2022-12-09 03:35:28 +00:00
|
|
|
|
2022-12-09 05:55:18 +00:00
|
|
|
def execute_wordle(c:Comment, body:str):
|
2022-12-09 03:35:28 +00:00
|
|
|
if not FEATURES['WORDLE']: return
|
|
|
|
if not "!wordle" in body: return
|
|
|
|
answer = random.choice(WORDLE_LIST)
|
|
|
|
c.wordle_result = f'_active_{answer}'
|
2023-02-28 22:09:16 +00:00
|
|
|
|
|
|
|
|
|
|
|
def process_poll_options(v:User, target:Union[Submission, Comment]):
|
|
|
|
|
|
|
|
patterns = [(poll_regex, 0), (choice_regex, 1)]
|
|
|
|
|
2023-03-12 17:36:35 +00:00
|
|
|
if v.admin_level >= PERMS['POST_BETS']:
|
2023-02-28 22:09:16 +00:00
|
|
|
patterns.append((bet_regex, 2))
|
|
|
|
|
|
|
|
option_count = 0
|
|
|
|
|
2023-03-23 15:52:31 +00:00
|
|
|
option_objects = []
|
|
|
|
|
2023-02-28 22:09:16 +00:00
|
|
|
for pattern, exclusive in patterns:
|
|
|
|
for i in pattern.finditer(target.body):
|
|
|
|
option_count += 1
|
|
|
|
|
|
|
|
if option_count > POLL_MAX_OPTIONS:
|
|
|
|
abort(400, f"Max number of poll options is {POLL_MAX_OPTIONS}")
|
|
|
|
|
2023-03-12 18:40:18 +00:00
|
|
|
body = i.group(2)
|
2023-02-28 22:09:16 +00:00
|
|
|
|
|
|
|
if len(body) > 500:
|
|
|
|
abort(400, f"Poll option body too long! (Max 500 characters)")
|
|
|
|
|
|
|
|
if isinstance(target, Submission):
|
|
|
|
cls = SubmissionOption
|
|
|
|
else:
|
|
|
|
cls = CommentOption
|
|
|
|
|
2023-03-19 17:53:33 +00:00
|
|
|
body_html=filter_emojis_only(body, strip=False) #dont strip cuz ppl sometimes leave spaces before && or after it, which breaks the replacing logic
|
2023-02-28 22:56:46 +00:00
|
|
|
|
2023-03-16 06:27:58 +00:00
|
|
|
existing = g.db.query(cls).filter_by(
|
2023-02-28 22:09:16 +00:00
|
|
|
parent_id=target.id,
|
2023-02-28 22:56:46 +00:00
|
|
|
body_html=body_html,
|
2023-02-28 22:09:16 +00:00
|
|
|
exclusive=exclusive,
|
2023-02-28 23:46:11 +00:00
|
|
|
).first()
|
2023-02-28 22:09:16 +00:00
|
|
|
|
|
|
|
if not existing:
|
|
|
|
option = cls(
|
|
|
|
parent_id=target.id,
|
2023-02-28 22:56:46 +00:00
|
|
|
body_html=body_html,
|
2023-02-28 22:09:16 +00:00
|
|
|
exclusive=exclusive,
|
|
|
|
)
|
2023-03-23 15:53:01 +00:00
|
|
|
option_objects.append(option) #shitty hack to bypass autoflush
|
2023-03-23 15:52:31 +00:00
|
|
|
|
|
|
|
g.db.add_all(option_objects)
|