add web
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
from flask import Blueprint, render_template, request, redirect, url_for, flash
|
||||
from app.routes.asset import GetOriginalAssetInfo, AddAudioAssetToAudioMigrationQueue
|
||||
from app.models.asset import Asset
|
||||
from app.models.user import User
|
||||
from app.services import economy
|
||||
from app.util import auth, websiteFeatures, turnstile, transactions
|
||||
from app.extensions import db, redis_controller
|
||||
from app.enums.TransactionType import TransactionType
|
||||
|
||||
AudioMigratorRoute = Blueprint('assetmigrator', __name__, template_folder='pages')
|
||||
|
||||
@AudioMigratorRoute.route('/audiomigrator', methods=['GET'])
|
||||
@auth.authenticated_required
|
||||
def audiomigrator():
|
||||
return render_template('audiomigrator/index.html')
|
||||
|
||||
@AudioMigratorRoute.route('/audiomigrator', methods=['POST'])
|
||||
@auth.authenticated_required
|
||||
def audiomigrator_post():
|
||||
AuthenticatedUser : User = auth.GetCurrentUser()
|
||||
if not websiteFeatures.GetWebsiteFeature("AudioMigrator"):
|
||||
flash("Audio migration is temporarily disabled", "error")
|
||||
return redirect("/audiomigrator")
|
||||
|
||||
CFTurnstileResponse = request.form.get( key="cf-turnstile-response", default=None, type=str)
|
||||
if CFTurnstileResponse is None:
|
||||
flash("Invalid captcha", "error")
|
||||
return redirect("/audiomigrator")
|
||||
if not turnstile.VerifyToken(CFTurnstileResponse):
|
||||
flash("Invalid captcha", "error")
|
||||
return redirect("/audiomigrator")
|
||||
|
||||
PlaceId = request.form.get( key = "placeid", default = None, type = int )
|
||||
if PlaceId is None:
|
||||
flash("Invalid place ID", "error")
|
||||
return redirect("/audiomigrator")
|
||||
RequestedAudioIds = request.form.get( key = "audio-ids", default = None, type = str )
|
||||
if RequestedAudioIds is None:
|
||||
flash("Invalid audio IDs", "error")
|
||||
return redirect("/audiomigrator")
|
||||
|
||||
RequestedAudioIds = RequestedAudioIds.split("\n")
|
||||
for i in range(len(RequestedAudioIds)):
|
||||
RequestedAudioIds[i] = RequestedAudioIds[i].strip()
|
||||
if RequestedAudioIds[i].isdigit():
|
||||
RequestedAudioIds[i] = int(RequestedAudioIds[i])
|
||||
else:
|
||||
RequestedAudioIds.remove(RequestedAudioIds[i])
|
||||
|
||||
if len(RequestedAudioIds) > 100:
|
||||
flash("You can only migrate 100 audios at a time", "error")
|
||||
return redirect("/audiomigrator")
|
||||
if len(RequestedAudioIds) < 1:
|
||||
flash("You must migrate at least 1 audio", "error")
|
||||
return redirect("/audiomigrator")
|
||||
|
||||
if PlaceId < 1:
|
||||
flash("Invalid place ID", "error")
|
||||
return redirect("/audiomigrator")
|
||||
|
||||
RobuxBalance, _ = economy.GetUserBalance(AuthenticatedUser)
|
||||
RequiredAmountRobux = 0
|
||||
AudioIdsToMigrate : list[int] = []
|
||||
for RequestedAudio in RequestedAudioIds:
|
||||
if Asset.query.filter_by(id = RequestedAudio ).first():
|
||||
continue
|
||||
if redis_controller.lrange("migrate_audio_assets_queue", 0, -1).count(str(RequestedAudio)) > 0:
|
||||
continue
|
||||
if RequestedAudio in AudioIdsToMigrate:
|
||||
continue
|
||||
AudioIdsToMigrate.append(RequestedAudio)
|
||||
RequiredAmountRobux += 5
|
||||
|
||||
if len(AudioIdsToMigrate) == 0:
|
||||
flash(f"Queued 0 / {len(RequestedAudioIds)} audios to be migrated", "success")
|
||||
return redirect("/audiomigrator")
|
||||
|
||||
if RobuxBalance < RequiredAmountRobux:
|
||||
flash(f"You don't have enough robux to migrate these audios, Required R${RequiredAmountRobux}", "error")
|
||||
return redirect("/audiomigrator")
|
||||
|
||||
try:
|
||||
economy.DecrementTargetBalance( AuthenticatedUser, Amount = RequiredAmountRobux, CurrencyType = 0 )
|
||||
except economy.InsufficientFundsException:
|
||||
flash(f"You don't have enough robux to migrate these audios, Required R${RequiredAmountRobux}", "error")
|
||||
return redirect("/audiomigrator")
|
||||
except Exception as e:
|
||||
flash(f"An error occured while deducting robux", "error")
|
||||
return redirect("/audiomigrator")
|
||||
|
||||
transactions.CreateTransaction(
|
||||
Reciever = User.query.filter_by(id = 1).first(),
|
||||
Sender = AuthenticatedUser,
|
||||
CurrencyAmount = RequiredAmountRobux,
|
||||
CurrencyType = 0,
|
||||
TransactionType = TransactionType.Purchase,
|
||||
CustomText = f"Audio migration"
|
||||
)
|
||||
|
||||
for AudioId in AudioIdsToMigrate:
|
||||
AddAudioAssetToAudioMigrationQueue(AudioId, bypassQueueLimit = True ,placeId=PlaceId)
|
||||
|
||||
flash(f"Queued {len(AudioIdsToMigrate)} / {len(RequestedAudioIds)} audios to be migrated", "success")
|
||||
return redirect("/audiomigrator")
|
||||
@@ -0,0 +1,54 @@
|
||||
{% extends '__layout__.html' %}
|
||||
{% block title %}Audio Migrator{% endblock %}
|
||||
{% block head %}
|
||||
<link href="/static/css/settings.css" rel="stylesheet"/> <!-- Its just easier to resuse this-->
|
||||
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
|
||||
<style>
|
||||
.text-secondary {
|
||||
color: rgb(199, 199, 199) !important;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<div id="main">
|
||||
<div class="settings-container" style="max-width: 700px;">
|
||||
<h1 class="mb-2">Audio Migrator</h1>
|
||||
{% with messages = get_flashed_messages(with_categories=true) %}
|
||||
{% if messages %}
|
||||
<div>
|
||||
{% for category, message in messages %}
|
||||
{% if category == 'error': %}
|
||||
<div class="alert border p-2 text-center alert-danger border-danger">
|
||||
{{ message }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if category == 'success': %}
|
||||
<div class="alert border p-2 text-center alert-success border-success">
|
||||
{{ message }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
<form method="post">
|
||||
<div class="form-floating">
|
||||
<input type="text" name="placeid" class="form-control w-100" placeholder="PlaceId associated with Audio" required>
|
||||
<label for="placeid">PlaceID</label>
|
||||
</div>
|
||||
<div class="form-floating mt-2">
|
||||
<textarea name="audio-ids" class="form-control w-100 mt-2" placeholder="Audio IDs, please enter a new line for each audio id" required style="min-height: 200px;"></textarea>
|
||||
<label for="audio-ids">Audio IDs, separate each audio with a new line</label>
|
||||
</div>
|
||||
<div class="d-flex justify-content-end align-items-top mt-2">
|
||||
<p class="m-0 text-secondary me-1" style="font-size:11px;">Note: As a processing fee, each Audio will cost R$5 even if audio migration fails, this is to prevent spam and abuse of our systems. It can take a few minutes for audios to be processed so please be patient, you will not be charged for any audios that already exist on Vortexi.</p>
|
||||
<div class="cf-turnstile" data-theme="dark" data-sitekey="{{turnstilekey}}"></div>
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
|
||||
<div class="ms-3">
|
||||
<button type="submit" class="btn btn-primary btn-sm">Migrate</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user