Exemple #1
0
 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
Exemple #2
0
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')
Exemple #3
0
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.'
    )
Exemple #4
0
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')
Exemple #5
0
 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)
Exemple #6
0
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}')
Exemple #7
0
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}')
Exemple #8
0
    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')
Exemple #9
0
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')