55
66import brawlstats
77from sanic import Blueprint , response
8+ from sanic .exceptions import abort
89
9- from core .utils import disable_xss , login_required , open_db_connection , render_template
10+ from core .utils import add_message , disable_xss , login_required , open_db_connection , render_template
1011from core .utils import daterange , thisweek
1112
1213root = Blueprint ('root' )
1314
15+ @root .middleware ('request' )
16+ async def setup_session_dict (request ):
17+ """Sets up session attributes if they do not exist already"""
18+ if request .ctx .session .get ('logged_in' , None ) is None :
19+ request .ctx .session ['logged_in' ] = False
20+
21+ if request .ctx .session .get ('messages' , None ) is None :
22+ request .ctx .session ['messages' ] = []
23+
1424@root .get ('/' )
1525async def index (request ):
1626 async with request .app .session .get ('https://api.github.com/users/SharpBit/events/public' ) as resp :
@@ -29,7 +39,7 @@ async def repo(request, name):
2939
3040@root .get ('/login' )
3141async def login (request ):
32- if request .ctx .session . get ( 'logged_in' ) :
42+ if request .ctx .session [ 'logged_in' ] :
3343 return response .redirect ('/' )
3444 return response .redirect (request .app .oauth .discord_login_url )
3545
@@ -89,24 +99,32 @@ async def url_shortener_home(request):
8999async def create_url (request ):
90100 chars = string .ascii_letters + string .digits
91101 code = '' .join (random .choice (chars ) for i in range (8 ))
92- url = request .form ['url' ][0 ]
102+ try :
103+ url = request .form ['url' ][0 ]
104+ except KeyError :
105+ return add_message (request , 'error' , 'Enter a URL to redirect to.' , '/urlshortener' )
93106 account = request .ctx .session .get ('id' , 'no_account' )
94107
95108 async with open_db_connection (request .app ) as conn :
96109 if request .form .get ('code' ):
97110 code = request .form ['code' ][0 ]
98111 existing = await conn .fetchrow ('SELECT * FROM urls WHERE code = $1' , code )
99112 if existing :
100- return response . text ( 'Error: Code already exists ' )
113+ return add_message ( request , 'error' , 'That code is already taken. Try another one.' , '/urlshortener ' )
101114 await conn .execute ('INSERT INTO urls(user_id, code, url) VALUES ($1, $2, $3)' , account , code , url )
102- return response .text (f'Here is your shortened URL: https://{ request .app .config .DOMAIN } /{ code } ' )
115+ return add_message (
116+ request ,
117+ 'success' ,
118+ f'Shortened URL created at <a href="https://{ request .app .config .DOMAIN } /{ code } ">https://{ request .app .config .DOMAIN } /{ code } </a>' ,
119+ '/urlshortener'
120+ )
103121
104122@root .get ('/<code>' )
105123async def existing_code (request , code ):
106124 async with open_db_connection (request .app ) as conn :
107125 res = await conn .fetchrow ('SELECT * FROM urls WHERE code = $1' , code )
108126 if not res :
109- return response . text ( f'No such URL shortener code " { code } " found. ' )
127+ abort ( 404 , message = f'Requested URL { request . path } not found' )
110128 return response .redirect (res ['url' ])
111129
112130@root .get ('/pastebin' )
@@ -118,7 +136,10 @@ async def pastebin_home(request):
118136async def create_pastebin (request ):
119137 chars = string .ascii_letters + string .digits
120138 code = '' .join (random .choice (chars ) for i in range (8 ))
121- text = request .form ['text' ][0 ]
139+ try :
140+ text = request .form ['text' ][0 ]
141+ except KeyError :
142+ return add_message (request , 'error' , 'Paste some code in to save.' , '/pastebin' )
122143 account = request .ctx .session .get ('id' , 'no_account' )
123144 async with open_db_connection (request .app ) as conn :
124145 await conn .execute ('INSERT INTO pastebin(user_id, code, text) VALUES ($1, $2, $3)' , account , code , text )
@@ -129,7 +150,7 @@ async def existing_pastebin(request, code):
129150 async with open_db_connection (request .app ) as conn :
130151 res = await conn .fetchrow ('SELECT * FROM pastebin WHERE code = $1' , code )
131152 if not res :
132- return response . text ( f'No such pastebin code " { code } " found. ' )
153+ abort ( 404 , message = f'Requested URL { request . path } not found' )
133154 text = disable_xss (res ['text' ])
134155 return await render_template ('saved_pastebin' , request , title = "Pastebin - Saved" , description = "Saved Pastebin" , code = text )
135156
@@ -145,17 +166,16 @@ async def challenge_home(request):
145166@root .post ('/challenges/post' )
146167async def challenge_post (request ):
147168 try :
148- tag = brawlstats .utils .bstag (request .form ['tag' ][0 ])
169+ form_tag = request .form ['tag' ][0 ]
170+ except KeyError :
171+ return add_message (request , 'error' , 'Enter a player tag.' , '/challenges' )
172+
173+ try :
174+ tag = brawlstats .utils .bstag (form_tag )
149175 except brawlstats .NotFoundError as e :
150- invalid_chars = e .error .split ('\n ' )
151- invalid_chars = invalid_chars [len (invalid_chars ) - 1 ]
152- return await render_template (
153- template = 'challenge_home' ,
154- request = request ,
155- invalid_chars = invalid_chars ,
156- title = 'Brawl Stars Challenges' ,
157- description = 'Search up your tag to view the logs of your Brawl Stars challenge games.'
158- )
176+ invalid_chars = e .message .split ('\n ' )
177+ invalid_chars = invalid_chars [- 1 ]
178+ return add_message (request , 'error' , invalid_chars , '/challenges' )
159179 return response .redirect (f'/challenges/{ tag } ' )
160180
161181@root .get ('/challenges/<tag>' )
@@ -164,14 +184,7 @@ async def challenge_stats(request, tag):
164184 try :
165185 logs = await client .get_battle_logs (tag )
166186 except brawlstats .NotFoundError :
167- return await render_template (
168- 'challenge_stats' ,
169- request ,
170- tag_found = False ,
171- entered_tag = disable_xss (tag .upper ()),
172- title = 'Brawl Stars Challenges' ,
173- description = 'View the logs of your Brawl Stars challenge games.'
174- )
187+ return add_message (request , 'error' , f'Tag { disable_xss (tag .upper ())} was not found.' , '/challenges' )
175188
176189 event_map = {
177190 'gemGrab' : 'Gem Grab' ,
@@ -200,15 +213,7 @@ def filter_challenge_games(battle):
200213 games = list (filter (filter_challenge_games , logs ))[::- 1 ]
201214
202215 if len (games ) == 0 :
203- return await render_template (
204- template = 'challenge_stats' ,
205- request = request ,
206- tag_found = True ,
207- games = [],
208- len = len ,
209- title = 'Brawl Stars Challenges' ,
210- description = 'View the logs of your Brawl Stars challenge games.'
211- )
216+ return add_message (request , 'error' , 'No recent challenge games were found.' , '/challenges' )
212217
213218 battlelog = []
214219 for battle in games :
@@ -229,10 +234,8 @@ def filter_challenge_games(battle):
229234 return await render_template (
230235 template = 'challenge_stats' ,
231236 request = request ,
232- tag_found = True ,
233237 games = battlelog ,
234238 brawler_key = {'EL PRIMO' : 'El-Primo' , 'MR. P' : 'Mr.P' },
235- len = len , # allow len() to be called in the template
236239 title = 'Brawl Stars Challenges' ,
237240 description = 'View the logs of your Brawl Stars challenge games.'
238241 )
@@ -247,8 +250,6 @@ async def brawlstats_tests_proxy(request, endpoint):
247250 'Authorization' : f'Bearer { request .token } ' ,
248251 'Accept-Encoding' : 'gzip'
249252 }
250- print (headers )
251- print (f'https://api.brawlstars.com/v1/{ endpoint } ' )
252253 try :
253254 async with app .session .get (f'https://api.brawlstars.com/v1/{ endpoint } ' , timeout = 30 , headers = headers ) as resp :
254255 return response .json (await resp .json (), status = resp .status )
@@ -339,7 +340,24 @@ async def schoolweek(request, requested_date_str):
339340 template = 'schoolweek' ,
340341 request = request ,
341342 week = week_fmt ,
342- title = 'School Week' ,
343343 requested_date = requested_date ,
344+ title = 'School Week' ,
344345 description = 'This week\' s maroon and gray A and B days.'
345346 )
347+
348+
349+ @root .post ('/schoolweek/subscribe' )
350+ # @authorized()
351+ async def email_subscribe (request ):
352+ try :
353+ email = request .form ['email' ][0 ]
354+ except KeyError :
355+ return add_message (request , 'error' , 'Enter an email in the field.' , '/schoolweek' )
356+
357+ async with open_db_connection (request .app ) as conn :
358+ existing = await conn .fetchrow ('SELECT * FROM mailing_list WHERE email = $1' , email )
359+ if existing :
360+ return add_message (request , 'error' , 'Email already subscribed.' , '/schoolweek' )
361+ await conn .execute ('INSERT INTO mailing_list(email) VALUES ($1)' , email )
362+
363+ return add_message (request , 'success' , 'Your email has been added to the mailing list.' , '/schoolweek' )
0 commit comments