2021-10-15 14:08:27 +00:00
from files . helpers . wrappers import *
from files . helpers . get import *
2022-01-14 10:13:03 +00:00
from files . __main__ import app , cache , limiter
2021-10-15 14:08:27 +00:00
from files . classes . submission import Submission
2022-01-13 02:59:17 +00:00
defaulttimefilter = environ . get ( " DEFAULT_TIME_FILTER " , " all " ) . strip ( )
2021-10-15 14:08:27 +00:00
2021-11-11 00:26:25 +00:00
@app.post ( " /clear " )
@auth_required
def clear ( v ) :
for n in v . notifications . filter_by ( read = False ) . all ( ) :
n . read = True
g . db . add ( n )
g . db . commit ( )
return { " message " : " Notifications cleared! " }
2022-01-21 23:04:10 +00:00
@app.get ( " /unread " )
@auth_required
def unread ( v ) :
listing = g . db . query ( Comment ) . join ( Notification . comment ) . filter (
Notification . read == False ,
Notification . user_id == v . id ,
Comment . is_banned == False ,
Comment . deleted_utc == 0 ,
Comment . author_id != AUTOJANNY_ID ,
2022-02-16 01:16:01 +00:00
) . order_by ( Notification . created_utc . desc ( ) ) . all ( )
2022-01-21 23:04:10 +00:00
for n in v . notifications . filter_by ( read = False ) . all ( ) :
n . read = True
g . db . add ( n )
g . db . commit ( )
return { " data " : [ x . json for x in listing ] }
2022-02-03 10:49:47 +00:00
2021-10-15 14:08:27 +00:00
@app.get ( " /notifications " )
@auth_required
def notifications ( v ) :
try : page = int ( request . values . get ( ' page ' , 1 ) )
except : page = 1
2022-01-06 17:21:30 +00:00
messages = request . values . get ( ' messages ' )
modmail = request . values . get ( ' modmail ' )
posts = request . values . get ( ' posts ' )
2022-02-24 18:31:28 +00:00
if modmail and v . admin_level > 2 :
2022-02-21 03:07:36 +00:00
comments = g . db . query ( Comment ) . filter ( Comment . sentto == 2 ) . order_by ( Comment . id . desc ( ) ) . offset ( 25 * ( page - 1 ) ) . limit ( 26 ) . all ( )
next_exists = ( len ( comments ) > 25 )
comments = comments [ : 25 ]
2021-10-15 14:08:27 +00:00
elif messages :
2022-01-06 18:47:11 +00:00
comments = g . db . query ( Comment ) . filter ( or_ ( Comment . author_id == v . id , Comment . sentto == v . id ) , Comment . parent_submission == None , not_ ( Comment . child_comments . any ( ) ) ) . order_by ( Comment . id . desc ( ) ) . offset ( 25 * ( page - 1 ) ) . limit ( 26 ) . all ( )
2021-10-15 14:08:27 +00:00
next_exists = ( len ( comments ) > 25 )
2022-01-06 17:29:07 +00:00
comments = comments [ : 25 ]
2021-10-15 14:08:27 +00:00
elif posts :
2022-02-16 01:16:01 +00:00
notifications = v . notifications . join ( Notification . comment ) . filter ( Comment . author_id == AUTOJANNY_ID ) . order_by ( Notification . created_utc . desc ( ) ) . offset ( 25 * ( page - 1 ) ) . limit ( 101 ) . all ( )
2022-02-03 10:49:47 +00:00
listing = [ ]
2021-10-15 14:08:27 +00:00
for index , x in enumerate ( notifications [ : 100 ] ) :
2022-02-03 10:49:47 +00:00
c = x . comment
if x . read and index > 24 : break
elif not x . read :
x . read = True
c . unread = True
g . db . add ( x )
2022-02-26 13:33:18 +00:00
if not c . created_utc : c . created_utc = x . created_utc
2022-02-03 10:49:47 +00:00
listing . append ( c )
2021-10-15 14:08:27 +00:00
g . db . commit ( )
next_exists = ( len ( notifications ) > len ( listing ) )
else :
2022-02-03 10:49:47 +00:00
notifications = v . notifications . join ( Notification . comment ) . filter (
2021-11-14 02:27:55 +00:00
Comment . is_banned == False ,
Comment . deleted_utc == 0 ,
2021-11-18 14:21:19 +00:00
Comment . author_id != AUTOJANNY_ID ,
2022-02-16 01:16:01 +00:00
) . order_by ( Notification . created_utc . desc ( ) ) . offset ( 50 * ( page - 1 ) ) . limit ( 51 ) . all ( )
2021-10-15 14:08:27 +00:00
2022-02-05 13:49:54 +00:00
next_exists = ( len ( notifications ) > 50 )
notifications = notifications [ : 50 ]
2022-02-03 10:49:47 +00:00
cids = [ x . comment_id for x in notifications ]
comments = get_comments ( cids , v = v , load_parent = True )
2021-10-15 14:08:27 +00:00
2022-02-03 10:49:47 +00:00
i = 0
2021-11-14 02:27:55 +00:00
for x in notifications :
2022-02-26 13:31:49 +00:00
try : c = comments [ i ]
2022-02-03 10:49:47 +00:00
except : continue
2022-02-26 13:31:49 +00:00
if not x . read : c . unread = True
if not c . created_utc : c . created_utc = x . created_utc
2022-02-03 10:49:47 +00:00
x . read = True
g . db . add ( x )
i + = 1
2021-11-14 02:28:08 +00:00
g . db . commit ( )
2021-10-15 14:08:27 +00:00
if not posts :
2022-01-31 03:31:01 +00:00
listing = [ ]
2022-01-31 03:33:43 +00:00
for c in comments :
2022-02-04 05:30:46 +00:00
if c . parent_submission :
2022-02-04 05:20:14 +00:00
2022-02-04 05:30:46 +00:00
if c . replies2 == None : c . replies2 = [ ]
for x in c . child_comments :
2022-02-04 05:15:20 +00:00
if x . author_id == v . id :
x . voted = 1
2022-02-04 05:44:16 +00:00
if x not in c . replies2 : c . replies2 . append ( x )
2022-02-04 05:15:20 +00:00
2022-02-04 05:33:49 +00:00
while c . parent_comment and ( c . parent_comment . author_id == v . id or c . parent_comment in comments ) :
2021-10-15 14:08:27 +00:00
parent = c . parent_comment
2022-02-04 05:30:46 +00:00
if parent . replies2 == None : parent . replies2 = [ c ]
elif c not in parent . replies2 : parent . replies2 . append ( c )
2021-10-15 14:08:27 +00:00
c = parent
2022-02-04 05:20:14 +00:00
2022-02-04 05:35:18 +00:00
if c . replies2 == None : c . replies2 = [ ]
2021-10-15 14:08:27 +00:00
else :
2022-02-04 05:30:46 +00:00
while c . parent_comment :
c = c . parent_comment
2022-02-17 06:32:04 +00:00
c . replies2 = g . db . query ( Comment ) . filter_by ( parent_comment_id = c . id ) . order_by ( Comment . id ) . all ( )
2022-02-04 05:30:46 +00:00
if c not in listing : listing . append ( c )
2021-10-15 14:08:27 +00:00
2021-12-14 18:35:56 +00:00
if request . headers . get ( " Authorization " ) : return { " data " : [ x . json for x in listing ] }
2021-10-15 14:08:27 +00:00
2022-01-14 12:04:35 +00:00
return render_template ( " notifications.html " ,
2021-10-15 14:08:27 +00:00
v = v ,
notifications = listing ,
next_exists = next_exists ,
page = page ,
standalone = True ,
render_replies = True
)
@app.get ( " / " )
@app.get ( " /logged_out " )
2022-02-04 18:35:39 +00:00
@app.get ( " /s/<sub> " )
@app.get ( " /logged_out/s/<sub> " )
2022-02-20 01:09:55 +00:00
@limiter.limit ( " 3/second;30/minute;1000/hour;5000/day " )
2022-01-11 22:57:05 +00:00
@auth_desired
2022-02-04 18:35:39 +00:00
def front_all ( v , sub = None ) :
2022-02-10 20:54:45 +00:00
if sub : sub = g . db . query ( Sub ) . filter_by ( name = sub . strip ( ) . lower ( ) ) . one_or_none ( )
2022-02-05 21:51:00 +00:00
if request . path . startswith ( ' /s/ ' ) and not sub : abort ( 404 )
2022-02-05 21:09:17 +00:00
2022-02-04 04:16:52 +00:00
if g . webview and not session . get ( " session_id " ) :
2022-01-27 20:15:05 +00:00
session . permanent = True
session [ " session_id " ] = secrets . token_hex ( 49 )
2021-10-15 14:08:27 +00:00
2022-01-17 11:06:12 +00:00
if not v and request . path == " / " and not request . headers . get ( " Authorization " ) :
2022-01-24 19:40:58 +00:00
return redirect ( f " { SITE_FULL } /logged_out { request . full_path } " )
2021-10-15 14:08:27 +00:00
2021-10-16 10:07:32 +00:00
try : page = max ( int ( request . values . get ( " page " , 1 ) ) , 1 )
2021-10-15 14:08:27 +00:00
except : abort ( 400 )
if v :
defaultsorting = v . defaultsorting
2022-02-10 20:35:16 +00:00
if sub or SITE_NAME != ' Drama ' : defaulttime = ' all '
2022-02-08 19:12:06 +00:00
else : defaulttime = v . defaulttime
2021-10-15 14:08:27 +00:00
else :
defaultsorting = " hot "
2022-02-10 20:35:16 +00:00
if sub or SITE_NAME != ' Drama ' : defaulttime = ' all '
2022-02-08 20:07:52 +00:00
else : defaulttime = defaulttimefilter
2021-10-15 14:08:27 +00:00
sort = request . values . get ( " sort " , defaultsorting )
t = request . values . get ( ' t ' , defaulttime )
2022-02-25 17:39:25 +00:00
ccmode = request . values . get ( ' ccmode ' , " false " ) . lower ( )
2022-02-24 12:03:28 +00:00
subs = session . get ( ' subs ' , False )
2022-02-25 17:39:25 +00:00
subsonly = request . values . get ( ' subsonly ' , " false " ) . lower ( )
2021-10-15 14:08:27 +00:00
2022-02-08 10:42:45 +00:00
try : gt = int ( request . values . get ( " utc_greater_than " , 0 ) )
except : gt = 0
try : lt = int ( request . values . get ( " utc_less_than " , 0 ) )
except : lt = 0
2021-10-15 14:08:27 +00:00
ids , next_exists = frontlist ( sort = sort ,
page = page ,
t = t ,
v = v ,
2022-01-31 21:32:11 +00:00
ccmode = ccmode ,
2022-02-21 06:24:35 +00:00
subs = subs ,
2021-10-15 14:08:27 +00:00
filter_words = v . filter_words if v else [ ] ,
2022-02-08 10:42:45 +00:00
gt = gt ,
lt = lt ,
2022-02-10 22:21:32 +00:00
sub = sub ,
2022-02-25 16:28:19 +00:00
site = SITE ,
subsonly = subsonly
2021-10-15 14:08:27 +00:00
)
posts = get_posts ( ids , v = v )
2022-02-03 07:00:43 +00:00
2022-02-04 04:21:47 +00:00
if v :
if v . hidevotedon : posts = [ x for x in posts if not hasattr ( x , ' voted ' ) or not x . voted ]
if v . patron_utc and v . patron_utc < time . time ( ) :
v . patron = 0
v . patron_utc = 0
send_repeatable_notification ( v . id , " Your paypig status has expired! " )
g . db . add ( v )
g . db . commit ( )
if v . unban_utc and v . unban_utc < time . time ( ) :
v . is_banned = 0
v . unban_utc = 0
v . ban_evade = 0
send_repeatable_notification ( v . id , " You have been unbanned! " )
g . db . add ( v )
g . db . commit ( )
2022-02-12 23:10:29 +00:00
if v . agendaposter and v . agendaposter < time . time ( ) :
v . agendaposter = 0
2022-02-04 04:21:47 +00:00
send_repeatable_notification ( v . id , " Your chud theme has expired! " )
g . db . add ( v )
2022-02-19 21:42:55 +00:00
badge = v . has_badge ( 28 )
2022-02-04 04:21:47 +00:00
if badge : g . db . delete ( badge )
g . db . commit ( )
if v . flairchanged and v . flairchanged < time . time ( ) :
v . flairchanged = None
send_repeatable_notification ( v . id , " Your flair lock has expired. You can now change your flair! " )
g . db . add ( v )
badge = v . has_badge ( 96 )
if badge : g . db . delete ( badge )
g . db . commit ( )
if v . marseyawarded and v . marseyawarded < time . time ( ) :
v . marseyawarded = None
send_repeatable_notification ( v . id , " Your marsey award has expired! " )
g . db . add ( v )
badge = v . has_badge ( 98 )
if badge : g . db . delete ( badge )
g . db . commit ( )
if v . longpost and v . longpost < time . time ( ) :
v . longpost = None
send_repeatable_notification ( v . id , " Your pizzashill award has expired! " )
g . db . add ( v )
badge = v . has_badge ( 97 )
if badge : g . db . delete ( badge )
g . db . commit ( )
if v . bird and v . bird < time . time ( ) :
v . bird = None
send_repeatable_notification ( v . id , " Your bird site award has expired! " )
g . db . add ( v )
badge = v . has_badge ( 95 )
if badge : g . db . delete ( badge )
g . db . commit ( )
if v . progressivestack and v . progressivestack < time . time ( ) :
v . progressivestack = None
send_repeatable_notification ( v . id , " Your progressive stack has expired! " )
g . db . add ( v )
badge = v . has_badge ( 94 )
if badge : g . db . delete ( badge )
g . db . commit ( )
if v . rehab and v . rehab < time . time ( ) :
v . rehab = None
send_repeatable_notification ( v . id , " Your rehab has finished! " )
g . db . add ( v )
badge = v . has_badge ( 109 )
if badge : g . db . delete ( badge )
g . db . commit ( )
2021-10-15 14:08:27 +00:00
if request . headers . get ( " Authorization " ) : return { " data " : [ x . json for x in posts ] , " next_exists " : next_exists }
2022-02-25 17:33:44 +00:00
return render_template ( " home.html " , v = v , listing = posts , next_exists = next_exists , sort = sort , t = t , page = page , ccmode = ccmode , sub = sub , subs = subs , subsonly = subsonly , home = True )
2021-10-15 14:08:27 +00:00
@cache.memoize ( timeout = 86400 )
2022-02-25 17:39:12 +00:00
def frontlist ( v = None , sort = " hot " , page = 1 , t = " all " , ids_only = True , ccmode = " false " , subs = False , filter_words = ' ' , gt = 0 , lt = 0 , sub = None , site = None , subsonly = " false " ) :
2021-10-15 14:08:27 +00:00
2021-11-11 22:52:26 +00:00
posts = g . db . query ( Submission )
2022-02-08 10:42:45 +00:00
2022-02-05 21:09:17 +00:00
if sub : posts = posts . filter_by ( sub = sub . name )
2022-02-25 17:39:12 +00:00
elif subsonly == " true " :
2022-02-25 16:39:03 +00:00
posts = posts . filter ( Submission . sub != None )
if v and v . all_blocks : posts = posts . filter ( Submission . sub . notin_ ( v . all_blocks ) )
2022-02-24 12:03:28 +00:00
elif subs :
2022-02-21 06:24:35 +00:00
if v and v . all_blocks : posts = posts . filter ( or_ ( Submission . sub == None , Submission . sub . notin_ ( v . all_blocks ) ) )
2022-02-25 16:39:03 +00:00
elif SITE_NAME == ' Drama ' : posts = posts . filter ( Submission . sub == None )
elif v and v . all_blocks : posts = posts . filter ( or_ ( Submission . sub == None , Submission . sub . notin_ ( v . all_blocks ) ) )
2022-02-04 14:49:27 +00:00
2022-02-08 10:42:45 +00:00
if gt : posts = posts . filter ( Submission . created_utc > gt )
if lt : posts = posts . filter ( Submission . created_utc < lt )
if not gt and not lt :
if t == ' all ' : cutoff = 0
else :
now = int ( time . time ( ) )
if t == ' hour ' : cutoff = now - 3600
elif t == ' week ' : cutoff = now - 604800
elif t == ' month ' : cutoff = now - 2592000
elif t == ' year ' : cutoff = now - 31536000
else : cutoff = now - 86400
posts = posts . filter ( Submission . created_utc > = cutoff )
2021-11-11 20:04:49 +00:00
2022-01-31 21:32:11 +00:00
if ( ccmode == " true " ) :
posts = posts . filter ( Submission . club == True )
2022-02-08 13:49:17 +00:00
posts = posts . filter_by ( is_banned = False , private = False , deleted_utc = 0 )
2022-02-08 13:49:42 +00:00
if ( sort == " hot " or ( v and v . id == Q_ID ) ) and ccmode == " false " and not gt and not lt :
2022-02-08 13:49:17 +00:00
posts = posts . filter_by ( stickied = None )
2021-10-15 14:08:27 +00:00
if v and v . admin_level == 0 :
blocking = [ x [ 0 ] for x in g . db . query (
2021-11-06 15:52:48 +00:00
UserBlock . target_id ) . filter_by (
2021-10-15 14:08:27 +00:00
user_id = v . id ) . all ( ) ]
blocked = [ x [ 0 ] for x in g . db . query (
2021-11-06 15:52:48 +00:00
UserBlock . user_id ) . filter_by (
2021-10-15 14:08:27 +00:00
target_id = v . id ) . all ( ) ]
posts = posts . filter (
Submission . author_id . notin_ ( blocking ) ,
Submission . author_id . notin_ ( blocked )
)
if not ( v and v . changelogsub ) :
2022-01-07 21:03:14 +00:00
posts = posts . filter ( not_ ( Submission . title . ilike ( ' [changelog] % ' ) ) )
2021-10-15 14:08:27 +00:00
if v and filter_words :
for word in filter_words :
posts = posts . filter ( not_ ( Submission . title . ilike ( f ' % { word } % ' ) ) )
if not ( v and v . shadowbanned ) :
2021-11-06 00:33:32 +00:00
posts = posts . join ( User , User . id == Submission . author_id ) . filter ( User . shadowbanned == None )
2021-10-15 14:08:27 +00:00
2022-01-17 20:44:49 +00:00
if sort == " hot " :
2021-10-15 14:08:27 +00:00
ti = int ( time . time ( ) ) + 3600
2022-02-21 06:13:05 +00:00
posts = posts . order_by ( - 1000000 * ( Submission . realupvotes + 1 + Submission . comment_count / 5 + ( func . length ( Submission . body_html ) - func . length ( func . replace ( Submission . body_html , ' </a> ' , ' ' ) ) ) ) / ( func . power ( ( ( ti - Submission . created_utc ) / 1000 ) , 1.23 ) ) )
2021-10-15 14:08:27 +00:00
elif sort == " new " :
posts = posts . order_by ( Submission . created_utc . desc ( ) )
elif sort == " old " :
posts = posts . order_by ( Submission . created_utc . asc ( ) )
elif sort == " controversial " :
2022-02-09 23:27:10 +00:00
posts = posts . order_by ( ( Submission . upvotes + 1 ) / ( Submission . downvotes + 1 ) + ( Submission . downvotes + 1 ) / ( Submission . upvotes + 1 ) , Submission . downvotes . desc ( ) )
2021-10-15 14:08:27 +00:00
elif sort == " top " :
2021-11-30 23:21:29 +00:00
posts = posts . order_by ( Submission . downvotes - Submission . upvotes )
2021-10-15 14:08:27 +00:00
elif sort == " bottom " :
2021-11-30 23:21:29 +00:00
posts = posts . order_by ( Submission . upvotes - Submission . downvotes )
2021-10-15 14:08:27 +00:00
elif sort == " comments " :
posts = posts . order_by ( Submission . comment_count . desc ( ) )
2021-12-11 05:02:58 +00:00
if v : size = v . frontsize or 0
2021-10-15 14:08:27 +00:00
else : size = 25
posts = posts . offset ( size * ( page - 1 ) ) . limit ( size + 1 ) . all ( )
next_exists = ( len ( posts ) > size )
posts = posts [ : size ]
2022-02-08 13:49:17 +00:00
if ( sort == " hot " or ( v and v . id == Q_ID ) ) and page == 1 and ccmode == " false " and not gt and not lt :
2021-12-09 21:21:52 +00:00
pins = g . db . query ( Submission ) . filter ( Submission . stickied != None , Submission . is_banned == False )
2022-02-05 21:09:17 +00:00
if sub : pins = pins . filter_by ( sub = sub . name )
2022-02-25 17:39:12 +00:00
elif subsonly == " true " :
2022-02-25 16:39:03 +00:00
pins = pins . filter ( Submission . sub != None )
if v and v . all_blocks : pins = pins . filter ( Submission . sub . notin_ ( v . all_blocks ) )
2022-02-24 12:03:28 +00:00
elif subs :
2022-02-21 06:32:06 +00:00
if v and v . all_blocks : pins = pins . filter ( or_ ( Submission . sub == None , Submission . sub . notin_ ( v . all_blocks ) ) )
2022-02-25 16:39:03 +00:00
elif SITE_NAME == ' Drama ' : pins = pins . filter ( Submission . sub == None )
elif v and v . all_blocks : pins = pins . filter ( or_ ( Submission . sub == None , Submission . sub . notin_ ( v . all_blocks ) ) )
2022-02-08 19:05:06 +00:00
2021-12-09 21:21:52 +00:00
if v and v . admin_level == 0 :
blocking = [ x [ 0 ] for x in g . db . query ( UserBlock . target_id ) . filter_by ( user_id = v . id ) . all ( ) ]
blocked = [ x [ 0 ] for x in g . db . query ( UserBlock . user_id ) . filter_by ( target_id = v . id ) . all ( ) ]
pins = pins . filter ( Submission . author_id . notin_ ( blocking ) , Submission . author_id . notin_ ( blocked ) )
2021-10-15 14:08:27 +00:00
2021-12-24 03:59:07 +00:00
pins = pins . all ( )
for pin in pins :
2021-12-26 01:03:21 +00:00
if pin . stickied_utc and int ( time . time ( ) ) > pin . stickied_utc :
2021-12-24 03:59:07 +00:00
pin . stickied = None
2021-12-26 01:03:21 +00:00
pin . stickied_utc = None
2021-12-24 03:59:07 +00:00
g . db . add ( pin )
pins . remove ( pin )
posts = pins + posts
2021-10-15 14:08:27 +00:00
2021-11-11 22:52:26 +00:00
if ids_only : posts = [ x . id for x in posts ]
2021-10-15 14:08:27 +00:00
2021-12-24 03:59:07 +00:00
g . db . commit ( )
2021-10-15 14:08:27 +00:00
return posts , next_exists
@app.get ( " /changelog " )
2022-01-11 21:54:41 +00:00
@auth_required
2021-10-15 14:08:27 +00:00
def changelog ( v ) :
page = int ( request . values . get ( " page " ) or 1 )
page = max ( page , 1 )
sort = request . values . get ( " sort " , " new " )
t = request . values . get ( ' t ' , " all " )
ids = changeloglist ( sort = sort ,
page = page ,
t = t ,
v = v ,
)
next_exists = ( len ( ids ) > 25 )
ids = ids [ : 25 ]
posts = get_posts ( ids , v = v )
if request . headers . get ( " Authorization " ) : return { " data " : [ x . json for x in posts ] , " next_exists " : next_exists }
2022-01-14 12:04:35 +00:00
return render_template ( " changelog.html " , v = v , listing = posts , next_exists = next_exists , sort = sort , t = t , page = page )
2021-10-15 14:08:27 +00:00
@cache.memoize ( timeout = 86400 )
def changeloglist ( v = None , sort = " new " , page = 1 , t = " all " ) :
2021-11-06 15:52:48 +00:00
posts = g . db . query ( Submission . id ) . filter_by ( is_banned = False , private = False , ) . filter ( Submission . deleted_utc == 0 )
2021-10-15 14:08:27 +00:00
if v and v . admin_level == 0 :
blocking = [ x [ 0 ] for x in g . db . query (
2021-11-06 15:52:48 +00:00
UserBlock . target_id ) . filter_by (
2021-10-15 14:08:27 +00:00
user_id = v . id ) . all ( ) ]
blocked = [ x [ 0 ] for x in g . db . query (
2021-11-06 15:52:48 +00:00
UserBlock . user_id ) . filter_by (
2021-10-15 14:08:27 +00:00
target_id = v . id ) . all ( ) ]
posts = posts . filter (
Submission . author_id . notin_ ( blocking ) ,
Submission . author_id . notin_ ( blocked )
)
2022-02-04 09:32:18 +00:00
admins = [ x [ 0 ] for x in g . db . query ( User . id ) . filter ( User . admin_level > 0 ) . all ( ) ]
2021-10-15 14:08:27 +00:00
posts = posts . filter ( Submission . title . ilike ( ' _changelog % ' ) , Submission . author_id . in_ ( admins ) )
if t != ' all ' :
cutoff = 0
now = int ( time . time ( ) )
if t == ' hour ' :
cutoff = now - 3600
elif t == ' day ' :
cutoff = now - 86400
elif t == ' week ' :
cutoff = now - 604800
elif t == ' month ' :
cutoff = now - 2592000
elif t == ' year ' :
cutoff = now - 31536000
posts = posts . filter ( Submission . created_utc > = cutoff )
if sort == " new " :
posts = posts . order_by ( Submission . created_utc . desc ( ) )
elif sort == " old " :
posts = posts . order_by ( Submission . created_utc . asc ( ) )
elif sort == " controversial " :
2022-02-09 23:29:34 +00:00
posts = posts . order_by ( ( Submission . upvotes + 1 ) / ( Submission . downvotes + 1 ) + ( Submission . downvotes + 1 ) / ( Submission . upvotes + 1 ) , Submission . downvotes . desc ( ) )
2021-10-15 14:08:27 +00:00
elif sort == " top " :
2021-11-30 23:21:29 +00:00
posts = posts . order_by ( Submission . downvotes - Submission . upvotes )
2021-10-15 14:08:27 +00:00
elif sort == " bottom " :
2021-11-30 23:21:29 +00:00
posts = posts . order_by ( Submission . upvotes - Submission . downvotes )
2021-10-15 14:08:27 +00:00
elif sort == " comments " :
posts = posts . order_by ( Submission . comment_count . desc ( ) )
posts = posts . offset ( 25 * ( page - 1 ) ) . limit ( 26 ) . all ( )
return [ x [ 0 ] for x in posts ]
@app.get ( " /random " )
2022-01-11 21:54:41 +00:00
@auth_required
2021-10-15 14:08:27 +00:00
def random_post ( v ) :
2021-11-06 15:52:48 +00:00
x = g . db . query ( Submission ) . filter ( Submission . deleted_utc == 0 , Submission . is_banned == False )
2021-10-15 14:08:27 +00:00
total = x . count ( )
n = random . randint ( 1 , total - 2 )
2022-01-02 00:06:46 +00:00
post = x . offset ( n ) . limit ( 1 ) . one_or_none ( )
2022-01-24 20:26:15 +00:00
return redirect ( f " { SITE_FULL } /post/ { post . id } " )
2021-10-15 14:08:27 +00:00
@cache.memoize ( timeout = 86400 )
2021-12-17 17:55:11 +00:00
def comment_idlist ( page = 1 , v = None , nsfw = False , sort = " new " , t = " all " ) :
2021-10-15 14:08:27 +00:00
2022-02-18 09:19:58 +00:00
cc_or_private = [ x [ 0 ] for x in g . db . query ( Submission . id ) . filter ( or_ ( Submission . club == True , Submission . private == True ) ) . all ( ) ]
2021-10-15 14:08:27 +00:00
2022-02-18 09:19:58 +00:00
comments = g . db . query ( Comment . id ) . filter ( Comment . parent_submission != None , Comment . parent_submission . notin_ ( cc_or_private ) )
2021-10-15 14:08:27 +00:00
if v and v . admin_level < = 3 :
blocking = [ x [ 0 ] for x in g . db . query (
2021-11-06 15:52:48 +00:00
UserBlock . target_id ) . filter_by (
2021-10-15 14:08:27 +00:00
user_id = v . id ) . all ( ) ]
blocked = [ x [ 0 ] for x in g . db . query (
2021-11-06 15:52:48 +00:00
UserBlock . user_id ) . filter_by (
2021-10-15 14:08:27 +00:00
target_id = v . id ) . all ( ) ]
2021-11-16 03:34:37 +00:00
comments = comments . filter ( Comment . author_id . notin_ ( blocking ) , Comment . author_id . notin_ ( blocked ) )
2021-10-15 14:08:27 +00:00
2021-11-15 22:19:59 +00:00
if not v or not v . admin_level > 1 :
2021-11-16 03:34:37 +00:00
comments = comments . filter ( Comment . is_banned == False , Comment . deleted_utc == 0 )
2021-10-15 14:08:27 +00:00
now = int ( time . time ( ) )
if t == ' hour ' :
cutoff = now - 3600
elif t == ' day ' :
cutoff = now - 86400
elif t == ' week ' :
cutoff = now - 604800
elif t == ' month ' :
cutoff = now - 2592000
elif t == ' year ' :
cutoff = now - 31536000
else :
cutoff = 0
comments = comments . filter ( Comment . created_utc > = cutoff )
if sort == " new " :
comments = comments . order_by ( Comment . created_utc . desc ( ) )
elif sort == " old " :
comments = comments . order_by ( Comment . created_utc . asc ( ) )
elif sort == " controversial " :
2022-02-09 23:29:34 +00:00
comments = comments . order_by ( ( Comment . upvotes + 1 ) / ( Comment . downvotes + 1 ) + ( Comment . downvotes + 1 ) / ( Comment . upvotes + 1 ) , Comment . downvotes . desc ( ) )
2021-10-15 14:08:27 +00:00
elif sort == " top " :
2022-01-17 11:06:12 +00:00
comments = comments . order_by ( Comment . downvotes - Comment . upvotes )
2021-10-15 14:08:27 +00:00
elif sort == " bottom " :
2021-11-30 23:21:29 +00:00
comments = comments . order_by ( Comment . upvotes - Comment . downvotes )
2021-10-15 14:08:27 +00:00
comments = comments . offset ( 25 * ( page - 1 ) ) . limit ( 26 ) . all ( )
return [ x [ 0 ] for x in comments ]
@app.get ( " /comments " )
2022-01-11 21:54:41 +00:00
@auth_required
2021-10-15 14:08:27 +00:00
def all_comments ( v ) :
page = int ( request . values . get ( " page " , 1 ) )
sort = request . values . get ( " sort " , " new " )
t = request . values . get ( " t " , defaulttimefilter )
2021-12-05 18:58:46 +00:00
idlist = comment_idlist ( v = v ,
page = page ,
sort = sort ,
t = t ,
2021-12-17 17:55:11 +00:00
)
comments = get_comments ( idlist , v = v )
2021-10-15 14:08:27 +00:00
next_exists = len ( idlist ) > 25
idlist = idlist [ : 25 ]
if request . headers . get ( " Authorization " ) : return { " data " : [ x . json for x in comments ] }
2022-01-17 12:06:26 +00:00
return render_template ( " home_comments.html " , v = v , sort = sort , t = t , page = page , comments = comments , standalone = True , next_exists = next_exists )
@app.get ( " /transfers " )
@auth_required
def transfers ( v ) :
2022-01-18 10:36:52 +00:00
comments = g . db . query ( Comment ) . filter ( Comment . author_id == NOTIFICATIONS_ID , Comment . parent_submission == None , Comment . distinguish_level == 6 , Comment . body_html . like ( " % </a> has transferred % " ) , Comment . created_utc == 0 ) . order_by ( Comment . id . desc ( ) )
2022-01-17 12:06:26 +00:00
2022-01-18 10:36:52 +00:00
if request . headers . get ( " Authorization " ) : return { " data " : [ x . json for x in comments . all ( ) ] }
2022-01-17 12:06:26 +00:00
2022-01-18 10:36:52 +00:00
page = int ( request . values . get ( " page " , 1 ) )
comments = comments . offset ( 25 * ( page - 1 ) ) . limit ( 26 ) . all ( )
2022-01-17 12:06:26 +00:00
next_exists = len ( comments ) > 25
comments = comments [ : 25 ]
2022-01-17 14:14:24 +00:00
return render_template ( " transfers.html " , v = v , page = page , comments = comments , standalone = True , next_exists = next_exists )