Beispiel #1
0
def approve_post(post):
    '''Given a post, set it to an approved state and update the user's SP and titles.'''
    post.status = POST_APPROVED
    if Post.query.get(post.id) is None:
        db.session.add(post)
    db.session.commit()
    u = post.author
    update_user_sp(u)
    update_user_titles(u)
Beispiel #2
0
def unrank_post(post):
    '''Given a post, set it to unranked.'''
    post.status = POST_UNRANKED
    if Post.query.get(post.id) is None:
        db.session.add(post)
    db.session.commit()
    u = post.author
    update_user_sp(u)
    update_user_titles(u)
Beispiel #3
0
def delete_score(score_id):
    score = Post.query.get_or_404(score_id)
    if score.author == current_user or current_user.id == 1:
        if score.image_file != "None":
            try:
                os.remove(
                    os.path.join(current_app.root_path,
                                 'static/score_screenshots', score.image_file))
            except:
                flash('Score screenshot couldn\'t be found.', 'info')
        db.session.delete(score)
        db.session.commit()
        update_user_sp(current_user)
        flash('Your score has been deleted!', 'success')
        return redirect(url_for('main.home'))
    elif score.author != current_user:
        abort(403)
Beispiel #4
0
def delete_score(score_id):
    score = Post.query.get(score_id)

    if not score or not (score.author == current_user
                         or current_user.has_any_role("Moderator", "Admin")):
        current_app.logger.info(
            f"Access denied for user {current_user} to delete score {score_id}, returning 403"
        )
        abort(403)

    if score.image_file != "None":
        try:
            os.remove(
                os.path.join(current_app.root_path, pic_directories['score'],
                             score.image_file))
        except:
            flash('Score screenshot couldn\'t be found.', 'info')
    db.session.delete(score)
    db.session.commit()
    update_user_sp(score.author)
    flash('The score has been deleted!', 'success')

    return redirect(url_for('main.home'))
Beispiel #5
0
def new_score():
    form = ScoreForm()
    current_app.logger.info(request.form)
    if form.validate_on_submit():
        current_app.logger.info("Form validated.")
        difficulty = request.form.get('diffDrop')
        try:
            file = request.files['file']
        except:
            picture_file = "None"
            file = None
            flash('No file uploaded', 'info')
        if file.filename != '':
            if file and allowed_file(file.filename):
                picture_file = save_picture(file)
                flash('File uploaded successfully!', 'success')
            elif file and not allowed_file(file.filename):
                picture_file = "None"
                flash('You can\'t upload that!', 'error')
        else:
            picture_file = "None"
        current_app.logger.info("Converting to post type...")
        post = Post(song=form.song.data,
                    song_id=int(songname_to_id(form.song.data), 16)
                    if songname_to_id(form.song.data) != '' else None,
                    score=form.score.data,
                    exscore=calc_exscore(form.perfect.data, form.great.data,
                                         form.good.data, form.bad.data,
                                         form.miss.data),
                    lettergrade=form.lettergrade.data,
                    type=get_difftype(difficulty),
                    difficulty=difficulty,
                    difficultynum=get_diffnum(difficulty),
                    platform=form.platform.data,
                    stagepass=form.stagepass.data,
                    perfect=form.perfect.data,
                    great=form.great.data,
                    good=form.good.data,
                    bad=form.bad.data,
                    miss=form.miss.data,
                    maxcombo=form.maxcombo.data,
                    modifiers=mods_to_int(request.form.getlist('modifiers'),
                                          form.judgement.data),
                    noteskin=form.noteskin.data,
                    rushspeed=form.rushspeed.data
                    if form.rushspeed.data != None else 1.0,
                    ranked=form.ranked.data,
                    length=raw_songdata[form.song.data]['length'],
                    acsubmit='False',
                    author=current_user,
                    image_file=picture_file)
        post.sp = calc_performance(post.song, post.difficulty,
                                   post.difficultynum, post.perfect,
                                   post.great, post.good, post.bad, post.miss,
                                   int_to_judge(post.modifiers),
                                   post.rushspeed, post.stagepass == "True")
        update_user_sp(current_user)
        current_app.logger.info("Converted.")
        db.session.add(post)
        current_app.logger.info("Committing to database...")
        db.session.commit()
        flash('Score has been submitted!', 'success')
        return redirect(url_for('main.home'))
    return render_template("new_score.html",
                           title="New Score",
                           form=form,
                           songdata=raw_songdata)
Beispiel #6
0
def edit_score(score_id):
    form = ScoreForm()
    current_app.logger.info(request.form)

    post = Post.query.get(score_id)
    if not post or not (post.author == current_user
                        or current_user.has_any_role("Moderator", "Admin")):
        current_app.logger.info(
            f"Access denied for user {current_user} to edit score {score_id}, returning 403"
        )
        abort(403)

    if flask.request.method == "GET":
        form.score.data = post.score
        form.lettergrade.data = post.lettergrade
        form.platform.data = post.platform
        form.stagepass.data = post.stagepass
        form.perfect.data = post.perfect
        form.great.data = post.great
        form.good.data = post.good
        form.bad.data = post.bad
        form.miss.data = post.miss
        form.maxcombo.data = post.maxcombo
        modifiers, form.judgement.data = int_to_mods(post.modifiers,
                                                     separate_judge=True)
        form.noteskin.data = post.noteskin
        form.rushspeed.data = post.rushspeed
        form.ranked.data = post.ranked

        if request.form.get('lettergrade') is not None:
            form.lettergrade.data = request.form.get('lettergrade')
        if request.form.get('stagepass') is not None:
            form.stagepass.data = request.form.get('stagepass')
        if request.form.get('platform') is not None:
            form.platform.data = request.form.get('platform')
        try:
            if request.form.get('score') is not None:
                form.score.data = int(request.form.get('score'))
            if request.form.get('perfect') is not None:
                form.perfect.data = int(request.form.get('perfect'))
            if request.form.get('great') is not None:
                form.great.data = int(request.form.get('great'))
            if request.form.get('good') is not None:
                form.good.data = int(request.form.get('good'))
            if request.form.get('bad') is not None:
                form.bad.data = int(request.form.get('bad'))
            if request.form.get('miss') is not None:
                form.miss.data = int(request.form.get('miss'))
            if request.form.get('maxcombo') is not None:
                form.maxcombo.data = int(request.form.get('maxcombo'))
            if request.form.get('noteskin') is not None:
                form.noteskin.data = int(request.form.get('noteskin'))
            if request.form.get('rushspeed') is not None:
                form.rushspeed.data = float(request.form.get('rushspeed'))
        except:
            pass
        if request.form.get('gamemix') is not None:
            form.gamemix.data = request.form.get('gamemix')
        if request.form.get('ranked') is not None:
            form.ranked.data = request.form.get('ranked')
        if request.form.get('judgement') is not None:
            form.judgement.data = request.form.get('judgement')

    if form.validate_on_submit():
        current_app.logger.info("Form validated.")
        difficulty = request.form.get('diffDrop')
        try:
            file = request.files['file']
        except:
            picture_file = "None"
            file = None
            flash('No file uploaded', 'info')
        if file.filename != '':
            if file and allowed_file(file.filename):
                picture_file = save_picture(file, 'score')
                flash('File uploaded successfully!', 'success')
            elif file and not allowed_file(file.filename):
                picture_file = "None"
                flash('You can\'t upload that!', 'error')
        else:
            picture_file = "None"
        current_app.logger.info("Updating post info...")
        # instead of converting form to a post, edit an existing post ID and update some info
        post = Post.query.get(score_id)

        post.score = form.score.data
        post.exscore = calc_exscore(form.perfect.data, form.great.data,
                                    form.good.data, form.bad.data,
                                    form.miss.data)
        post.lettergrade = form.lettergrade.data
        post.platform = form.platform.data
        post.stagepass = form.stagepass.data
        post.perfect = form.perfect.data
        post.great = form.great.data
        post.good = form.good.data
        post.bad = form.bad.data
        post.miss = form.miss.data
        post.maxcombo = form.maxcombo.data
        post.modifiers = mods_to_int(request.form.getlist('modifiers'),
                                     form.judgement.data)
        post.noteskin = form.noteskin.data
        post.rushspeed = form.rushspeed.data if form.rushspeed.data != None else 1.0
        post.ranked = form.ranked.data
        if picture_file != None:
            post.image_file = picture_file

        # SP should always be calculated in score submission, non-approved posts will get ignored
        post.sp = calc_performance(
            Post.query.get(post.chart_id).first(), post.perfect,
            post.great, post.good, post.bad, post.miss,
            int_to_judge(post.modifiers), post.rushspeed,
            post.stagepass == "True")

        # if already unranked before, do not set to pending
        post.status = POST_PENDING if post.sp >= 0 and post.status != POST_UNRANKED else POST_UNRANKED
        if post.acsubmit:
            post.status = POST_APPROVED

        current_app.logger.info("Committing to database...")
        db.session.commit()

        update_user_sp(current_user)
        current_app.logger.info("Updated user SP.")

        flash(
            'Score has been edited! If your score was approved before it has re-entered the moderator queue. If it was unranked it stays unranked.',
            'success')
        return redirect(url_for('scores.score', score_id=score_id))
    # generate form from post here
    return render_template("new_score.html",
                           title="Edit Score",
                           form=form,
                           currpost=post)
Beispiel #7
0
def submit():
    response = {'status': 'success'}
    try:
        if not apikey_required or (
                valid_api_key(request.form['api_key']) and
            (request.environ.get('REMOTE_ADDR') in approved_ips
             or request.environ.get('HTTP_X_FORWARDED_FOR') in approved_ips)):
            if int(request.form['Score']) > 0:
                if current_app.debug:
                    current_app.logger.debug(
                        "Score above 0, submitting score...")
                u = accesscode_to_user(request.form['AccessCode'].lower())
                if u == None:
                    current_app.logger.error(
                        "Access code does not resolve to a valid user!")
                    raise
                s = id_to_songname(
                    hex(int(request.form['SongID'])).replace('0x', '').upper())
                if s == None:
                    current_app.logger.error(
                        "Song ID does not resolve to a valid song!")
                    raise
                post = Post(
                    approved=STATUS_PASS_PENDING,
                    song=s,
                    song_id=int(request.form['SongID']),
                    score=int(request.form['Score']),
                    exscore=calc_exscore(int(request.form['Perfect']),
                                         int(request.form['Great']),
                                         int(request.form['Good']),
                                         int(request.form['Bad']),
                                         int(request.form['Miss'])),
                    lettergrade=prime_grade[int(request.form['Grade']) %
                                            0x100],
                    type=prime_charttype[int(request.form['Type'])],
                    difficultynum=int(request.form['ChartLevel']),
                    difficulty=get_diffstr(
                        prime_charttype[int(request.form['Type'])],
                        int(request.form['ChartLevel'])),
                    platform='pad',
                    perfect=int(request.form['Perfect']),
                    great=int(request.form['Great']),
                    good=int(request.form['Good']),
                    bad=int(request.form['Bad']),
                    miss=int(request.form['Miss']),
                    maxcombo=int(request.form['MaxCombo']),
                    pp=int(request.form['PP']),
                    runningstep=int(request.form['RunningStep']),
                    kcal=float(request.form['Kcal']),
                    scrollspeed=(int(request.form['NoteSkinSpeed']) % 0x100) /
                    4.0,
                    noteskin=int(request.form['NoteSkinSpeed']) // 0x10000,
                    modifiers=int(request.form['Modifiers']),
                    rushspeed=float(request.form['RushSpeed']),
                    #gamemix = request.form['Gamemix'],
                    gameversion=request.form['GameVersion'],
                    gameflag=int(request.form['Flag']),
                    ranked='True'
                    if request.form['Flag'] == '128' else 'False',
                    #length = prime_songcategory[int(request.form['SongCategory'])],
                    length=raw_songdata[s]['length'],
                    accesscode=request.form['AccessCode'],
                    acsubmit='True',
                    user_id=u.id)
                if current_app.debug:
                    current_app.logger.debug("Created post object.")
                prime_to_xx_diff(post)
                if current_app.debug:
                    current_app.logger.debug(
                        "Converted Prime difficulty to XX difficulty.")
                if post.difficulty == None or post.difficulty == '':
                    raise
                if post.rushspeed == 0.0:
                    post.rushspeed = 1.0
                song_maxcombo = post.perfect + post.great + post.good + post.bad + post.miss
                if song_maxcombo > get_max_combo(post.song, post.difficulty):
                    update_max_combo(post.song, post.difficulty, song_maxcombo)
                    update_song_list()
                    if current_app.debug:
                        current_app.logger.debug(
                            "Updated max combo for song %s, difficulty %s with max combo of %s"
                            % (post.song, post.difficulty, song_maxcombo))
                post.sp = calc_performance(post.song, post.difficulty,
                                           post.difficultynum, post.perfect,
                                           post.great, post.good, post.bad,
                                           post.miss,
                                           int_to_judge(post.modifiers),
                                           post.rushspeed,
                                           post.stagepass == "True")
                add_exp(u, int(request.form['EXP']))
                add_pp(u, int(request.form['PP']))
                if current_app.debug:
                    current_app.logger.debug("EXP and PP added to profile.")
                if high_score(post):
                    if current_app.debug:
                        current_app.logger.debug(
                            "High score detected, saving score...")
                    del_high_score(post)
                    db.session.add(post)
                    db.session.commit()
                    if current_app.debug:
                        current_app.logger.debug(
                            "Committed score to database.")
                    update_user_sp(u)
                    if current_app.debug:
                        current_app.logger.debug("User SP updated.")
                elif current_app.debug:
                    current_app.logger.debug(
                        "High score not detected, not saving score.")
        else:
            response['status'] = 'failure'
            if current_app.debug:
                current_app.logger.error(
                    'Forbidden IP attempted to submit through PrimeServer: ' +
                    (request.environ.get('REMOTE_ADDR')
                     if request.environ.get('REMOTE_ADDR') != None else "") +
                    ' and ' +
                    (request.environ.get('HTTP_X_FORWARDED_FOR') if request.
                     environ.get('HTTP_X_FORWARDED_FOR') != None else ""))
                response['reason'] = 'forbidden IP ' + (
                    request.environ.get('REMOTE_ADDR')
                    if request.environ.get('REMOTE_ADDR') != None else ""
                ) + ' and ' + (request.environ.get('HTTP_X_FORWARDED_FOR')
                               if request.environ.get('HTTP_X_FORWARDED_FOR')
                               != None else "")
            else:
                response['reason'] = 'forbidden'
    except Exception as e:
        response['status'] = 'failure'
        #response['reason'] = type(e).__name__
        if current_app.debug:
            if isinstance(e, BadRequestKeyError):
                current_app.logger.error(json.dumps(request.form, indent=4))
            response['reason'] = traceback.format_exc()
        else:
            response['reason'] = 'internal error'
        current_app.logger.error('Error submitting through PrimeServer: %s' %
                                 traceback.format_exc())
    return jsonify(response)