add web
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
from flask import Blueprint, render_template, request, redirect, url_for, jsonify, make_response, flash
|
||||
from app.models.user import User
|
||||
from app.models.invite_key import InviteKey
|
||||
from app.util import auth, transactions
|
||||
from app.services import invitekeys, economy
|
||||
from app.extensions import db, limiter, csrf
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
inviteKeyRoute = Blueprint("invitekey", __name__, url_prefix="/")
|
||||
|
||||
@inviteKeyRoute.route("/invite-keys", methods=["GET"])
|
||||
@auth.authenticated_required
|
||||
def inviteKeysPage():
|
||||
AuthenticatedUser : User = auth.GetCurrentUser()
|
||||
pageNumber = request.args.get("page", 1, int)
|
||||
if pageNumber < 1:
|
||||
pageNumber = 1
|
||||
createdKeys = InviteKey.query.filter_by(created_by=AuthenticatedUser.id).order_by(InviteKey.created_at.desc()).paginate( page = pageNumber, per_page = 10, error_out=False )
|
||||
|
||||
return render_template("invitekeys/index.html", createdKeys=createdKeys)
|
||||
|
||||
@inviteKeyRoute.route("/invite-keys/create", methods=["POST"])
|
||||
@auth.authenticated_required
|
||||
@csrf.exempt
|
||||
def createInviteKey():
|
||||
AuthenticatedUser : User = auth.GetCurrentUser()
|
||||
if AuthenticatedUser is None:
|
||||
return jsonify({"success": False, "message": "Unauthorized"}),401
|
||||
|
||||
robuxBalance, _ = economy.GetUserBalance(AuthenticatedUser)
|
||||
if robuxBalance < 20:
|
||||
flash("You do not have enough robux to create an invite key.", "error")
|
||||
return redirect("/invite-keys")
|
||||
|
||||
activeKeys = InviteKey.query.filter_by(created_by=AuthenticatedUser.id, used_by=None).count()
|
||||
if activeKeys >= 3 and AuthenticatedUser.id != 1:
|
||||
flash("You have reached the maximum amount of active invite keys, please wait until one of your invite keys are used.", "error")
|
||||
return redirect("/invite-keys")
|
||||
|
||||
keysCreatedPast24Hours = InviteKey.query.filter(InviteKey.created_at > datetime.utcnow() - timedelta(hours=24)).filter_by(created_by=AuthenticatedUser.id).count()
|
||||
if keysCreatedPast24Hours >= 3 and AuthenticatedUser.id != 1:
|
||||
flash("You have reached the maximum amount of invite keys you can create in 24 hours.", "error")
|
||||
return redirect("/invite-keys")
|
||||
|
||||
if AuthenticatedUser.created > datetime.utcnow() - timedelta(days=3):
|
||||
flash("Your account must be more than 3 days old to create a invite key.", "error")
|
||||
return redirect("/invite-keys")
|
||||
|
||||
try:
|
||||
economy.DecrementTargetBalance(AuthenticatedUser, 20, 0)
|
||||
except economy.InsufficientFundsException:
|
||||
flash("You do not have enough robux to create an invite key.", "error")
|
||||
return redirect("/invite-keys")
|
||||
except economy.EconomyLockAcquireException:
|
||||
flash("There was an error creating your invite key, please try again later.", "error")
|
||||
return redirect("/invite-keys")
|
||||
|
||||
newInviteKey : InviteKey = invitekeys.CreateInviteKey(AuthenticatedUser)
|
||||
transactions.CreateTransaction(
|
||||
Reciever = User.query.filter_by(id=1).first(),
|
||||
Sender = AuthenticatedUser,
|
||||
CurrencyAmount = 20,
|
||||
CurrencyType = 0,
|
||||
CustomText = "Created Invite Key"
|
||||
)
|
||||
|
||||
flash("Invite key created successfully.", "success")
|
||||
return redirect("/invite-keys")
|
||||
@@ -0,0 +1,80 @@
|
||||
{% extends '__layout__.html' %}
|
||||
{% block title %}Invite Keys{% endblock %}
|
||||
{% block head %}
|
||||
<style>
|
||||
.text-secondary {
|
||||
color: rgb(199, 199, 199) !important;
|
||||
}
|
||||
.text-robux {
|
||||
color: rgb(26, 212, 103) !important;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<div class="container" style="min-height: 100vh; margin-top: 120px;max-width: 1000px;">
|
||||
<div class="d-flex align-items-center">
|
||||
<h1>Invite Keys</h1>
|
||||
<form action="/invite-keys/create" method="post" class="ms-auto">
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||
<button class="btn btn-outline-warning ms-auto">
|
||||
Create R$20
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
<p style="font-size: 14px;" class="text-secondary m-0">Note: It is not recommended to give away your invite key to strangers as you may be responsible for their actions.</p>
|
||||
{% 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 %}
|
||||
<table class="table table-dark table-striped mt-2">
|
||||
<thead>
|
||||
<tr class="rounded-top">
|
||||
<th scope="col">Created</th>
|
||||
<th scope="col">Key</th>
|
||||
<th scope="col">Used By</th>
|
||||
<th scope="col">Used On</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="table-group-divider" style="border-color: rgb(20,20,20);">
|
||||
{% for key in createdKeys.items %}
|
||||
<tr>
|
||||
<td>{{key.created_at.strftime("%d/%m/%Y")}}</td>
|
||||
<td>{{key.key}}</td>
|
||||
<td>
|
||||
{% if key.used_by %}
|
||||
<a href="/users/{{key.used_by}}/profile" class="text-decoration-none">
|
||||
<img class="rounded" style="aspect-ratio: 1/1;max-width: 35px;" src="/Thumbs/Head.ashx?x=48&y=48&userId={{key.used_by}}" alt="{{key.user.username}}">
|
||||
<span class="ms-1">{{key.user.username}}</span>
|
||||
</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{% if key.used_on %}{{key.used_on.strftime("%d/%m/%Y")}}{%else%}None{%endif%}</td>
|
||||
</tr>
|
||||
{%endfor%}
|
||||
</tbody>
|
||||
</table>
|
||||
{% if len(createdKeys.items) == 0 %}
|
||||
<p class="w-100 text-center ps-5 pe-5 mt-4 mb-4">No results found</p>
|
||||
{%endif%}
|
||||
<div class="align-items-center d-flex justify-content-center mt-2">
|
||||
<a class="ms-auto m-0 text-decoration-none {% if not createdKeys.has_prev %}text-secondary{%endif%}" {% if createdKeys.has_prev %}href="/invite-keys?page={{createdKeys.prev_num}}"{%endif%}>Previous</a>
|
||||
<p class="ms-2 me-2 text-white m-0">Page {{createdKeys.page}} of {{createdKeys.pages}}</p>
|
||||
<a class="me-auto m-0 text-decoration-none {% if not createdKeys.has_next %}text-secondary{%endif%}" {% if createdKeys.has_next %}href="/invite-keys?page={{createdKeys.next_num}}"{%endif%}>Next</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{%endblock%}
|
||||
Reference in New Issue
Block a user