2022-06-15 19:33:21 +00:00
from flask import g
from files . classes . badges import Badge
from files . helpers . alerts import send_repeatable_notification
2022-07-08 11:44:17 +00:00
from files . helpers . const import *
from files . helpers . get import *
from files . helpers . sanitize import *
import random
2022-07-08 12:40:07 +00:00
from urllib . parse import quote
2022-07-08 11:44:17 +00:00
2022-09-21 20:27:12 +00:00
def badge_grant ( user , badge_id , description = None , url = None , notify = True ) :
2022-06-15 21:17:31 +00:00
assert user != None
2022-06-15 20:29:25 +00:00
if user . has_badge ( badge_id ) :
2022-06-15 20:08:26 +00:00
return
2022-06-06 04:07:38 +00:00
badge = Badge (
2022-06-15 20:08:26 +00:00
badge_id = int ( badge_id ) ,
user_id = user . id ,
description = description ,
url = url ,
2022-06-06 04:07:38 +00:00
)
g . db . add ( badge )
2022-08-17 17:57:32 +00:00
g . db . flush ( )
2022-06-15 19:33:21 +00:00
2022-09-21 20:27:12 +00:00
if notify :
send_repeatable_notification ( user . id ,
f " @AutoJanny has given you the following profile badge: \n \n " +
f " ![]( { badge . path } ) \n \n ** { badge . name } ** \n \n { badge . badge . description } " )
2022-07-08 11:44:17 +00:00
2022-07-08 12:40:07 +00:00
def archiveorg ( url ) :
2022-09-26 04:01:25 +00:00
try : requests . get ( f ' https://web.archive.org/save/ { url } ' , headers = { ' User-Agent ' : ' Mozilla/4.0 (compatible; MSIE 5.5; Windows NT) ' } , timeout = 100 )
2022-09-03 14:24:16 +00:00
except : pass
2022-09-03 03:10:14 +00:00
2022-09-03 18:05:00 +00:00
def archive_url ( url ) :
2022-09-03 03:10:14 +00:00
gevent . spawn ( archiveorg , url )
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-09-03 03:10:14 +00:00
gevent . spawn ( archiveorg , url )
if url . startswith ( ' https://instagram.com/ ' ) :
2022-09-03 19:37:20 +00:00
url = url . replace ( ' https://instagram.com/ ' , ' https://imginn.com/ ' )
2022-09-03 03:10:14 +00:00
gevent . spawn ( archiveorg , url )
2022-07-08 12:40:07 +00:00
2022-07-08 11:44:17 +00:00
def execute_snappy ( post , v ) :
snappy = get_account ( SNAPPY_ID )
if post . sub == ' dankchristianmemes ' or post . sub == ' truth ' :
body = random . choice ( christian_emojis )
elif v . id == CARP_ID :
if random . random ( ) < 0.02 : body = " i love you carp "
2022-08-25 23:40:57 +00:00
elif random . random ( ) < 0.02 : body = " ![](/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! "
2022-08-15 05:10:15 +00:00
elif not SNAPPY_MARSEYS and not SNAPPY_QUOTES :
2022-07-09 10:50:53 +00:00
body = " "
2022-07-08 11:44:17 +00:00
else :
2022-08-15 05:10:15 +00:00
if SNAPPY_MARSEYS and SNAPPY_QUOTES :
if random . random ( ) < 0.5 : SNAPPY_CHOICES = SNAPPY_MARSEYS
else : SNAPPY_CHOICES = SNAPPY_QUOTES
elif SNAPPY_MARSEYS : SNAPPY_CHOICES = SNAPPY_MARSEYS
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-07-08 11:44:17 +00:00
if body . startswith ( ' â–¼ ' ) :
body = body [ 1 : ]
vote = Vote ( user_id = SNAPPY_ID ,
vote_type = - 1 ,
submission_id = post . id ,
real = True
)
g . db . add ( vote )
post . downvotes + = 1
if body . startswith ( ' OP is a Trump supporter ' ) :
flag = Flag ( post_id = post . id , user_id = SNAPPY_ID , reason = ' Trump supporter ' )
g . db . add ( flag )
elif body . startswith ( ' You had your chance. Downvoted and reported ' ) :
flag = Flag ( post_id = post . id , user_id = SNAPPY_ID , reason = ' Retard ' )
g . db . add ( flag )
elif body . startswith ( ' â–² ' ) :
body = body [ 1 : ]
vote = Vote ( user_id = SNAPPY_ID ,
vote_type = 1 ,
submission_id = post . id ,
real = True
)
g . db . add ( vote )
post . upvotes + = 1
body + = " \n \n "
2022-10-30 18:01:01 +00:00
if post . url and not post . url . startswith ( SITE_FULL ) and not post . url . startswith ( ' / ' ) and not post . url . startswith ( f ' https:// { BAN_EVASION_DOMAIN } ' ) :
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/ ' , ' ' )
rev = f " * [unddit.com](https://unddit.com/ { rev } ) \n "
elif post . url . startswith ( " https://old.reddit.com/u/ " ) :
rev = post . url . replace ( ' https://old.reddit.com/u/ ' , ' ' )
2022-07-15 13:00:51 +00:00
rev = f " * [camas.unddit.com](https://camas.unddit.com/reddit-search/# \u007b \" author \" : \" { rev } \" , \" resultSize \" :100 \u007d ) \n "
2022-07-08 11:44:17 +00:00
else : rev = ' '
2022-09-22 20:45:26 +00:00
body + = f " Snapshots: \n \n { rev } * [archive.org](https://web.archive.org/ { post . url } ) \n * [archive.ph](https://archive.ph/?url= { quote ( post . url ) } &run=1) (click to archive) \n * [ghostarchive.org](https://ghostarchive.org/search?term= { quote ( post . url ) } ) (click to archive) \n \n "
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 :
2022-10-30 18:01:01 +00:00
if href . startswith ( SITE_FULL ) or href . startswith ( f ' https:// { BAN_EVASION_DOMAIN } ' ) : continue
2022-09-03 18:05:00 +00:00
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/ ' , ' ' )
addition + = f ' * [unddit.com](https://unddit.com/ { rev } ) \n '
if href . startswith ( ' https://old.reddit.com/u/ ' ) :
rev = href . replace ( ' https://old.reddit.com/u/ ' , ' ' )
2022-07-15 13:00:51 +00:00
addition + = f " * [camas.unddit.com](https://camas.unddit.com/reddit-search/# \u007b \" author \" : \" { rev } \" , \" resultSize \" :100 \u007d ) \n "
2022-07-08 11:44:17 +00:00
addition + = f ' * [archive.org](https://web.archive.org/ { href } ) \n '
addition + = f ' * [archive.ph](https://archive.ph/?url= { quote ( href ) } &run=1) (click to archive) \n '
addition + = f ' * [ghostarchive.org](https://ghostarchive.org/search?term= { quote ( href ) } ) (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 ]
2022-07-08 11:44:17 +00:00
body_html = sanitize ( body )
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 ,
ghost = post . ghost
)
g . db . add ( c )
snappy . comment_count + = 1
snappy . coins + = 1
g . db . add ( snappy )
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 "
note = f ' reason: " { reason } " , duration: { duration } '
ma = ModAction (
kind = " ban_user " ,
user_id = snappy . id ,
target_user_id = v . id ,
_note = note
)
g . db . add ( ma )
post . bannedfor = f ' { duration } by @Snappy '
2022-07-08 11:44:17 +00:00
g . db . flush ( )
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
def execute_zozbot ( c , level , parent_submission , v ) :
if random . random ( ) > = 0.001 : return
c2 = Comment ( author_id = ZOZBOT_ID ,
2022-10-09 13:29:58 +00:00
parent_submission = parent_submission ,
parent_comment_id = c . id ,
level = level + 1 ,
is_bot = True ,
body = " zoz " ,
body_html = " <p>zoz</p> " ,
top_comment_id = c . top_comment_id ,
ghost = c . ghost ,
distinguish_level = 6
)
2022-10-09 13:28:18 +00:00
g . db . add ( c2 )
g . db . flush ( )
n = Notification ( comment_id = c2 . id , user_id = v . id )
g . db . add ( n )
c3 = Comment ( author_id = ZOZBOT_ID ,
parent_submission = parent_submission ,
parent_comment_id = c2 . id ,
level = level + 2 ,
is_bot = True ,
body = " zle " ,
body_html = " <p>zle</p> " ,
top_comment_id = c . top_comment_id ,
ghost = c . ghost ,
distinguish_level = 6
)
g . db . add ( c3 )
g . db . flush ( )
c4 = Comment ( author_id = ZOZBOT_ID ,
parent_submission = parent_submission ,
parent_comment_id = c3 . id ,
level = level + 3 ,
is_bot = True ,
body = " zozzle " ,
body_html = " <p>zozzle</p> " ,
top_comment_id = c . top_comment_id ,
ghost = c . ghost ,
distinguish_level = 6
)
g . db . add ( c4 )
zozbot = get_account ( ZOZBOT_ID )
zozbot . comment_count + = 3
zozbot . coins + = 3
g . db . add ( zozbot )
def execute_longpostbot ( c , level , body , body_html , parent_submission , v ) :
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
)
g . db . add ( vote )
c . downvotes = 1
c2 = Comment ( author_id = LONGPOSTBOT_ID ,
parent_submission = parent_submission ,
parent_comment_id = c . id ,
level = level + 1 ,
is_bot = True ,
body = body ,
body_html = f " <p> { body } </p> " ,
top_comment_id = c . top_comment_id ,
ghost = c . ghost
)
g . db . add ( c2 )
longpostbot = get_account ( LONGPOSTBOT_ID )
longpostbot . comment_count + = 1
longpostbot . coins + = 1
g . db . add ( longpostbot )
g . db . flush ( )
n = Notification ( comment_id = c2 . id , user_id = v . id )
2022-10-09 13:49:08 +00:00
g . db . add ( n )
2022-10-30 20:08:20 +00:00
def execute_basedbot ( c , level , body , parent_post , v ) :
2022-10-09 13:49:08 +00:00
pill = based_regex . match ( body )
if level == 1 : basedguy = get_account ( parent_post . author_id )
else : basedguy = get_account ( c . parent_comment . author_id )
basedguy . basedcount + = 1
if pill :
if basedguy . pills : basedguy . pills + = f " , { pill . group ( 1 ) } "
else : basedguy . pills + = f " { pill . group ( 1 ) } "
g . db . add ( basedguy )
body2 = f " @ { basedguy . username } ' s Based Count has increased by 1. Their Based Count is now { basedguy . basedcount } . "
if basedguy . pills : body2 + = f " \n \n Pills: { basedguy . pills } "
body_based_html = sanitize ( body2 )
c_based = Comment ( author_id = BASEDBOT_ID ,
2022-10-30 20:08:20 +00:00
parent_submission = parent_post . id ,
2022-10-09 13:49:08 +00:00
distinguish_level = 6 ,
parent_comment_id = c . id ,
level = level + 1 ,
is_bot = True ,
body_html = body_based_html ,
top_comment_id = c . top_comment_id ,
ghost = c . ghost
)
g . db . add ( c_based )
g . db . flush ( )
n = Notification ( comment_id = c_based . id , user_id = v . id )
2022-10-09 13:52:41 +00:00
g . db . add ( n )
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
similar_posts = g . db . query ( Submission ) . filter (
Submission . author_id == v . id ,
Submission . title . op ( ' <-> ' ) ( title ) < SPAM_SIMILARITY_THRESHOLD ,
Submission . created_utc > cutoff
) . all ( )
if url :
similar_urls = g . db . query ( Submission ) . filter (
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 "
g . db . add ( post )
ma = ModAction (
user_id = AUTOJANNY_ID ,
target_submission_id = post . id ,
kind = " ban_post " ,
_note = " spam "
)
g . db . add ( ma )
return False
return True
2022-10-21 00:28:05 +00:00
def execute_blackjack ( v , target , body , type ) :
2022-10-21 00:29:20 +00:00
if not blackjack or not body : return True
2022-10-21 00:28:05 +00:00
if any ( i in body . lower ( ) for i in blackjack . split ( ) ) :
v . shadowbanned = ' AutoJanny '
if not v . is_banned : v . ban_reason = f " Blackjack "
g . db . add ( v )
notif = None
2022-10-21 00:31:03 +00:00
extra_info = " unknown entity "
2022-10-21 00:28:05 +00:00
if type == ' submission ' :
extra_info = f " submission ( { target . permalink } ) "
elif type == ' comment ' or type == ' message ' :
extra_info = f " { type } ( { target . permalink } ) "
notif = Notification ( comment_id = target . id , user_id = CARP_ID )
elif type == ' chat ' :
extra_info = " chat message "
elif type == ' flag ' :
extra_info = f " reports on { target . permalink } "
2022-10-21 00:31:03 +00:00
2022-10-21 00:28:05 +00:00
if notif :
g . db . add ( notif )
g . db . flush ( )
elif extra_info : send_repeatable_notification ( CARP_ID , f " Blackjack for { v . name } : { extra_info } " )
return False
return True
2022-10-24 17:27:25 +00:00
def execute_antispam_comment_check ( body : str , v : User ) :
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
similar_comments = g . db . query ( Comment ) . filter (
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
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 "
g . db . add ( comment )
ma = ModAction (
user_id = AUTOJANNY_ID ,
target_comment_id = comment . id ,
kind = " ban_comment " ,
_note = " spam "
)
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
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
p . stickied = v . username
p . distinguish_level = 6
p . flair = " :ben10: Required Reading "
pin_time = ' for 1 day '
ma_1 = ModAction (
kind = " pin_post " ,
user_id = v . id ,
target_submission_id = p . id ,
_note = pin_time
)
ma_2 = ModAction (
kind = " distinguish_post " ,
user_id = v . id ,
target_submission_id = p . id
)
ma_3 = ModAction (
kind = " flair_post " ,
user_id = v . id ,
target_submission_id = p . id ,
_note = f ' " { p . flair } " '
)
g . db . add ( p )
g . db . add ( ma_1 )
g . db . add ( ma_2 )
g . db . add ( ma_3 )
2022-10-30 06:03:23 +00:00
def execute_pizza_autovote ( v : User , target : Union [ Submission , Comment ] ) :
if v . id != PIZZASHILL_ID : return
if SITE_NAME != ' rDrama ' : return
votes = len ( PIZZA_VOTERS )
for uid in PIZZA_VOTERS :
if isinstance ( target , Submission ) :
autovote = Vote ( user_id = uid , submission_id = target . id , vote_type = 1 )
elif isinstance ( target , Comment ) :
autovote = CommentVote ( user_id = uid , comment_id = target . id , vote_type = 1 )
else :
raise TypeError ( " Expected Submission or Comment " )
autovote . created_utc + = 1
g . db . add ( autovote )
v . coins + = votes
v . truecoins + = votes
g . db . add ( v )
target . upvotes + = votes
g . db . add ( target )