async def is_valid(self): data = await self.request.post() roomname = data.get('roomname', '').lower() if not re.match(r'^[a-z]\w{0,31}$', roomname): add_message(self.request, 'warning', f'Room name should start with letter and be alphanumeric.') return False return roomname
async def email_subscribe(request): try: email = request.form['email'][0] except KeyError: return add_message(request, 'error', 'Enter an email in the field.', '/schoolweek') async with open_db_connection(request.app) as conn: existing = await conn.fetchrow('SELECT * FROM mailing_list WHERE email = $1', email) if existing: return add_message(request, 'error', 'Email already subscribed.', '/schoolweek') msg = EmailMessage() msg['Subject'] = 'Thank you for subscribing to GCHS Daily Updates!' msg['From'] = request.app.config.CUSTOM_EMAIL msg['To'] = email body = MIMEText( f"If this wasn't you, click <a href=\"http{'s' if not request.app.config.DEV else ''}://{request.app.config.DOMAIN}" f"/schoolweek/unsubscribe/{email}\">here</a> to unsubscribe.", 'html') msg.set_content(body) with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp: smtp.login(request.app.config.NOREPLY_EMAIL, request.app.config.EMAIL_APP_PASSWORD) smtp.send_message(msg) async with open_db_connection(request.app) as conn: await conn.execute('INSERT INTO mailing_list(email) VALUES ($1)', email) return add_message(request, 'success', 'Your email has been added to the mailing list.', '/schoolweek')
async def challenge_stats(request, tag): client = request.app.brawl_client try: logs = await client.get_battle_logs(tag) except brawlstats.NotFoundError: return add_message(request, 'error', f'Tag {disable_xss(tag.upper())} was not found.', '/challenges') event_map = { 'gemGrab': 'Gem Grab', 'brawlBall': 'Brawl Ball', 'bounty': 'Bounty', 'heist': 'Heist', 'siege': 'Siege' } def filter_challenge_games(battle): try: if battle.battle.trophy_change == 1 and 'Showdown' not in battle.event.mode: return True except: valid_modes = ['gemGrab', 'brawlBall', 'bounty', 'heist', 'siege'] if battle.event.mode in valid_modes: # Hacky way to filter out ranked matches # still possible for a ranked match to be in the result but very unlikely for team in battle.battle.teams: for player in team: if player.brawler.trophies % 100 > 3 or player.brawler.power < 10: return False return True return False games = list(filter(filter_challenge_games, logs))[::-1] if len(games) == 0: return add_message(request, 'error', 'No recent challenge games were found.', '/challenges') battlelog = [] for battle in games: battle_info = { 'event': event_map[battle.event.mode], 'map': battle.event.map, 'result': battle.battle.result.title(), 'teams': battle.battle.teams.to_list() } for i, team in enumerate(battle_info['teams']): for j, player in enumerate(team): if player['tag'] == battle.battle.star_player.tag: battle_info['teams'][i][j]['star_player'] = 'star' else: battle_info['teams'][i][j]['star_player'] = 'normal' battlelog.append(battle_info) return await render_template( template='challenge_stats', request=request, games=battlelog, brawler_key={'EL PRIMO': 'El-Primo', 'MR. P': 'Mr.P'}, title='Brawl Stars Challenges', description='View the logs of your Brawl Stars challenge games.' )
async def create_url(request): chars = string.ascii_letters + string.digits code = ''.join(random.choice(chars) for i in range(8)) try: url = request.form['url'][0] except KeyError: return add_message(request, 'error', 'Enter a URL to redirect to.', '/urlshortener') account = request.ctx.session.get('id', 'no_account') async with open_db_connection(request.app) as conn: if request.form.get('code'): code = request.form['code'][0] existing = await conn.fetchrow( 'SELECT * FROM urls WHERE code = $1', code) if existing: return add_message( request, 'error', 'That code is already taken. Try another one.', '/urlshortener') await conn.execute( 'INSERT INTO urls(user_id, code, url) VALUES ($1, $2, $3)', account, code, url) return add_message( request, 'success', f"Shortened URL created at <a href=\"http{'s' if not request.app.config.DEV else ''}://{request.app.config.DOMAIN}/{code}\">" f"http{'s' if not request.app.config.DEV else ''}://{request.app.config.DOMAIN}/{code}</a>", '/urlshortener')
async def post(self): room_name = await self.is_valid() if not room_name: redirect(self.request, 'create_room') if await Room.query.where(Room.name == room_name).gino.first(): add_message(self.request, 'danger', f'Room with {room_name} already exists.') redirect(self.request, 'create_room') room = await Room.create(name=room_name, created_date=datetime.now()) redirect(self.request, 'room', slug=room.name)
async def challenge_post(request): try: form_tag = request.form['tag'][0] except KeyError: return add_message(request, 'error', 'Enter a player tag.', '/challenges') try: tag = brawlstats.utils.bstag(form_tag) except brawlstats.NotFoundError as e: invalid_chars = e.message.split('\n') invalid_chars = invalid_chars[-1] return add_message(request, 'error', invalid_chars, '/challenges') return response.redirect(f'/challenges/{tag}')
async def create_pastebin(request): chars = string.ascii_letters + string.digits code = ''.join(random.choice(chars) for i in range(8)) try: text = request.form['text'][0] except KeyError: return add_message(request, 'error', 'Paste some code in to save.', '/pastebin') account = request.ctx.session.get('id', 'no_account') async with open_db_connection(request.app) as conn: await conn.execute('INSERT INTO pastebin(user_id, code, text) VALUES ($1, $2, $3)', account, code, text) return response.redirect(f'/pastebin/{code}')
async def form_valid(self, form): username = form.username.data email = form.email.data password = form.password.data password_repeat = form.password_repeat.data user_match = await User.query.where(User.username == username ).gino.first() email_match = await User.query.where(User.email == email).gino.first() if user_match or email_match: add_message(self.request, 'danger', f'Username or email already taken') redirect(self.request, 'register') if password != password_repeat: add_message(self.request, 'warning', f'Password confirmation does not match') redirect(self.request, 'register') password = encrypt_password(password) await User.create(username=username, email=email, password=password) redirect(self.request, 'login')
async def email_unsubscribe(request, email): async with open_db_connection(request.app) as conn: await conn.execute('DELETE FROM mailing_list WHERE email = $1', email) return add_message(request, 'success', 'Your email has been removed from mailing list.', '/schoolweek')