Commit d30b53b3 authored by ben.eastwood's avatar ben.eastwood

Initial commit

parents
from flask import Flask, render_template, request, flash, redirect, url_for
from flaskext.mysql import MySQL
from datetime import datetime
import requests
import json
app = Flask(__name__)
app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'ben.eastwood'
app.config['MYSQL_PASSWORD'] = 'QC2BKP4E'
app.config['MYSQL_DB'] = 'beneastwood_aws'
mysql = MySQL(app, host='localhost', user='ben.eastwood', password='QC2BKP4E', db='beneastwood_aws')
mysql.init_app(app)
conn = mysql.connect()
@app.route('/')
def index():
return render_template('index.html')
@app.route('/regions')
def regions():
cursor = conn.cursor()
cursor.execute('''SELECT * FROM Regions''')
data = cursor.fetchall()
cursor.close()
return render_template('regions.html', data=data)
@app.route('/regionsAdd', methods = ('GET', 'POST'))
def regionsAdd():
if(request.method == 'POST'):
name = request.form['name'].lower()
displayName = request.form['displayName']
if not name:
flash('Name is required!')
elif len(name) != 2:
flash('Name can only be two letters!')
elif not displayName:
flash('Display Name is required!')
else:
cursor = conn.cursor()
cursor.execute('''INSERT INTO Regions (Name, DisplayName) VALUES (%s,%s)''', (name, displayName))
conn.commit()
cursor.close()
return redirect(url_for('regions'))
return render_template('regionsAdd.html')
def get_region(RegionID):
cursor = conn.cursor()
cursor.execute('''SELECT * FROM Regions WHERE RegionID = %s''', (RegionID))
region = cursor.fetchone()
return region
@app.route('/region/<int:RegionID>')
def region(RegionID):
region = get_region(RegionID)
return render_template('region.html', region=region)
@app.route('/<int:RegionID>/regionsEdit', methods = ('GET', 'POST'))
def regionsEdit(RegionID):
region = get_region(RegionID)
if(request.method == 'POST'):
name = request.form['name']
displayName = request.form['displayName']
if not name:
flash('Name is required!')
elif len(name) != 2:
flash('Name can only be two letters!')
elif not displayName:
flash('Display Name is required!')
else:
cursor = conn.cursor()
cursor.execute('''UPDATE Regions SET Name = %s, DisplayName = %s WHERE RegionID = %s''', (name, displayName, RegionID))
conn.commit()
cursor.close()
return redirect(url_for('regions'))
return render_template('regionsEdit.html', region=region)
@app.route('/<int:RegionID>/regionsDelete', methods = ('POST',))
def regionsDelete(RegionID):
region = get_region(RegionID)
cursor = conn.cursor()
cursor.execute('''DELETE FROM Regions WHERE RegionID = %s''', (RegionID))
conn.commit()
cursor.close()
flash('"{}" was successfully deleted!'.format(region[1]))
return redirect(url_for('regions'))
@app.route('/users')
def users():
cursor = conn.cursor()
cursor.execute('''SELECT * FROM Users''')
data = cursor.fetchall()
cursor.close()
return render_template('users.html', data=data)
@app.route('/usersAdd', methods = ('GET', 'POST'))
def usersAdd():
if(request.method == 'POST'):
name = request.form['name']
tag = request.form['tag']
if not name:
flash('Name is required!')
elif not tag:
flash('Tag is required!')
elif len(tag) > 10:
flash('Tag cannot be more than 10 letters.')
else:
createdOn = datetime.now()
updatedOn = datetime.now()
cursor = conn.cursor()
cursor.execute('''INSERT INTO Users (Name, Tag, CreatedOn, UpdatedOn) VALUES (%s,%s,%s,%s)''', (name, tag, createdOn, updatedOn))
conn.commit()
cursor.close()
return redirect(url_for('users'))
return render_template('usersAdd.html')
def get_user(UserID):
cursor = conn.cursor()
cursor.execute('''SELECT * FROM Users WHERE UserID = %s''', (UserID))
user = cursor.fetchone()
return user
@app.route('/user/<int:UserID>')
def user(UserID):
user = get_user(UserID)
return render_template('user.html', user=user)
@app.route('/<int:UserID>/usersEdit', methods = ('GET', 'POST'))
def usersEdit(UserID):
user = get_user(UserID)
if(request.method == 'POST'):
name = request.form['name']
tag = request.form['tag']
if not name:
flash('Name is required!')
elif not tag:
flash('Tag is required!')
elif len(tag) > 10:
flash('Tag cannot be more than 10 letters!')
else:
updatedOn = datetime.now()
cursor = conn.cursor()
cursor.execute('''UPDATE Users SET Name = %s, Tag = %s, UpdatedOn = %s WHERE UserID = %s''', (name, tag, updatedOn, UserID))
conn.commit()
cursor.close()
return redirect(url_for('users'))
return render_template('usersEdit.html', user=user)
@app.route('/<int:UserID>/usersDelete', methods = ('POST',))
def usersDelete(UserID):
user = get_user(UserID)
cursor = conn.cursor()
cursor.execute('''DELETE FROM Users WHERE UserID = %s''', (UserID))
conn.commit()
cursor.close()
flash('"{}" was successfully deleted!'.format(user[1]))
return redirect(url_for('users'))
@app.route('/elos')
def elos():
cursor = conn.cursor()
cursor.execute('''SELECT * FROM Elos''')
elosData = cursor.fetchall()
cursor.execute('''SELECT * FROM Users''')
usersData = cursor.fetchall()
cursor.execute('''SELECT * FROM Regions''')
regionsData = cursor.fetchall()
cursor.close()
return render_template('elos.html', elosData=elosData, usersData=usersData, regionsData=regionsData)
@app.route('/elosCheck')
def elosCheck():
cursor = conn.cursor()
cursor.execute('''SELECT * FROM Users''')
data = cursor.fetchall()
cursor.close()
return render_template('elosCheck.html', data=data)
@app.route('/elo/<int:UserID>')
def elo(UserID):
user = get_user(UserID)
cursor = conn.cursor()
cursor.execute('''SELECT * FROM Regions''')
data = cursor.fetchall()
cursor.close()
return render_template('elo.html', user=user, data=data)
@app.route('/<int:UserID>/<int:RegionID>/eloFetch', methods = ('GET', 'POST'))
def eloFetch(UserID, RegionID):
user = get_user(UserID)
region = get_region(RegionID)
api_url = "https://api.henrikdev.xyz/valorant/v1/mmr/" + region[1] + "/" + user[1] + "/" + user[2]
if(request.method == 'POST'):
rank = request.form['rank']
elo = request.form.get("elo")
overallElo = request.form.get("overallElo")
createdOn = datetime.now()
updatedOn = datetime.now()
cursor = conn.cursor()
cursor.execute('''INSERT INTO Elos (UserID, RegionID, Rank, RatingInRank, OverallRating, CreatedOn, UpdatedOn) VALUES (%s,%s,%s,%s,%s,%s,%s)''', (user[0], region[0], rank, elo, overallElo, createdOn, updatedOn))
conn.commit()
cursor.close()
return redirect(url_for('elos'))
return render_template('eloFetch.html', user=user, region=region, api_url=api_url, checkElo="True")
@app.route('/<int:EloID>/elosUpdate', methods = ('GET', 'POST'))
def elosUpdate(EloID):
elo = get_elo(EloID)
user = get_user(elo[1])
region = get_region(elo[2])
api_url = "https://api.henrikdev.xyz/valorant/v1/mmr/" + region[1] + "/" + user[1] + "/" + user[2]
if(request.method == 'POST'):
rank = request.form['rank']
eloText = request.form.get("elo")
overallElo = request.form.get("overallElo")
updatedOn = datetime.now()
cursor = conn.cursor()
cursor.execute('''UPDATE Elos SET Rank = %s, RatingInRank = %s, OverallRating = %s, UpdatedOn = %s WHERE EloID = %s''', (rank, eloText, overallElo, updatedOn, elo[0]))
conn.commit()
cursor.close()
return redirect(url_for('elos'))
return render_template('elosUpdate.html', elo=elo, user=user, region=region, api_url=api_url, checkElo="True")
def get_elo(EloID):
cursor = conn.cursor()
cursor.execute('''SELECT * FROM Elos WHERE EloID = %s''', (EloID))
user = cursor.fetchone()
return user
if __name__ == '__main__':
print("== Running in debug mode ==")
app.secret_key = "secret key"
app.run(host='ysjcs.net', port=5007, debug=True)
\ No newline at end of file
<!doctype html>
<!-- made with https://www.digitalocean.com/community/tutorials/how-to-make-a-web-application-using-flask-in-python-3 -->
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<!-- JQuery-->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<title>{% block title %} {% endblock %}</title>
</head>
<body>
<nav class="navbar navbar-expand-md navbar-light bg-light">
<a class="navbar-brand" href="{{ url_for('index')}}">MMR Checker</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="{{ url_for('regions') }}">Regions</a>
</li>
<li class="nav-item active">
<a class="nav-link" href="{{ url_for('users') }}">Users</a>
</li>
<li class="nav-item active">
<a class="nav-link" href="{{ url_for('elos') }}">Elos</a>
</li>
</ul>
</div>
</nav>
<div class="container">
{% for message in get_flashed_messages() %}
<div class="alert alert-danger">{{ message }}</div>
{% endfor %}
{% block content %} {% endblock %}
</div>
<footer class="bg-light text-center text-lg-start fixed-bottom">
<div class="text-center p-3">
Ben Eastwood
</div>
</footer>
<!-- Optional JavaScript -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
</body>
</html>
\ No newline at end of file
{% extends 'base.html' %}
{% block content %}
<h2>{% block title %} {{ user[1] }} {% endblock %}</h2>
<h2>{{ user[2] }}</h2>
<hr>
<div class="dropdown">
<button class="btn btn-primary dropdown-toggle" type="button" id="regionDropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Region
</button>
<div class="dropdown-menu" aria-labelledby="regionDropdown">
{% for region in data %}
<a href="{{ url_for('eloFetch', UserID=user[0], RegionID=region[0]) }}" class="dropdown-item">{{ region[1] }}</a>
{% endfor %}
</div>
</div>
{% endblock %}
\ No newline at end of file
{% extends 'base.html' %}
{% block content %}
<h2>{% block title %} {{ user[1] }} {% endblock %}</h2>
<h2>{{ user[2] }}</h2>
<hr>
<!-- <a id="url">{{ api_url }}</a> -->
<body onload="getData()">
<form method="post">
<div class="form-group">
<label for="rank">Rank:</label>
<input readonly type="text" name="rank" placeholder="Loading Rank..." class="form-control" value="{{ request.form['rank'] }}"></input>
</div>
<div class="form-group">
<label for="elo">Elo:</label>
<input readonly type="text" name="elo" placeholder="Loading Elo..." class="form-control" value="{{ request.form['elo'] }}"></input>
</div>
<div class="form-group">
<label for="overallElo">Overall Elo:</label>
<input readonly type="text" name="overallElo" placeholder="Loading Overall Elo..." class="form-control" value="{{ request.form['overallElo'] }}"></input>
</div>
<hr>
<div class="form-group">
<input type="submit" class="btn btn-success btn-sm" value="Add"></input>
</div>
</form>
<script>
function getData(user, tag, region) {
if("{{ checkElo }}" == "True") {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if(this.readyState == 4 && this.status == 200) {
var output = JSON.parse(this.responseText);
$("input[name=rank]").val(output.data.currenttierpatched);
$("input[name=elo]").val(output.data.ranking_in_tier);
$("input[name=overallElo]").val(output.data.elo);
}
}
xhttp.open("GET", "{{ api_url }}", true);
xhttp.send();
}
}
</script>
</body>
{% endblock %}
\ No newline at end of file
{% extends 'base.html' %}
{% block content %}
<h1>{% block title %} Elos {% endblock %}</h1>
<h2>Click on the Name to update.</h2>
<a href="{{ url_for('elosCheck') }}">
<button type="button" class="btn btn-primary">Check Elo</button>
</a>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th>Tagline</th>
<th>Region</th>
<th>Rank</th>
<th>Elo in Rank</th>
<th>Overall Rank</th>
<th>Created On</th>
<th>Updated On</th>
</tr>
</thead>
<tbody>
{% for elo in elosData %}
<tr>
{% for user in usersData %}
{% if elo[1] == user[0] %}
<td>
<a href="{{ url_for('elosUpdate', EloID=elo[0]) }}">{{ user[1] }}</a>
</td>
<td>{{ user[2] }}</td>
{% endif %}
{% endfor %}
{% for region in regionsData %}
{% if elo[2] == region[0] %}
<td>{{ region[2] }}</td>
{% endif %}
{% endfor %}
<td>{{ elo[3] }}</td>
<td>{{ elo[4] }}</td>
<td>{{ elo[5] }}</td>
<td>{{ elo[6] }}</td>
<td>{{ elo[7] }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
\ No newline at end of file
{% extends 'base.html' %}
{% block content %}
<h1>{% block title %} Users {% endblock %}</h1>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th>Tagline</th>
</tr>
</thead>
<tbody>
{% for user in data %}
<tr>
<td>
<a href="{{ url_for('elo', UserID=user[0]) }}">{{ user[1] }}</a>
</td>
<td>{{ user[2] }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
\ No newline at end of file
{% extends 'base.html' %}
{% block content %}
<h2>{% block title %} {{ user[1] }} {% endblock %}</h2>
<h2>{{ user[2] }}</h2>
<hr>
<!-- <a id="url">{{ api_url }}</a> -->
<body onload="getData()">
<form method="post">
<div class="form-group">
<label for="rank">Rank:</label>
<input readonly type="text" name="rank" placeholder="Loading Rank..." class="form-control" value="{{ request.form['rank'] }}"></input>
</div>
<div class="form-group">
<label for="elo">Elo:</label>
<input readonly type="text" name="elo" placeholder="Loading Elo..." class="form-control" value="{{ request.form['elo'] }}"></input>
</div>
<div class="form-group">
<label for="overallElo">Overall Elo:</label>
<input readonly type="text" name="overallElo" placeholder="Loading Overall Elo..." class="form-control" value="{{ request.form['overallElo'] }}"></input>
</div>
<hr>
<div class="form-group">
<input type="submit" class="btn btn-success btn-sm" value="Update"></input>
</div>
</form>
<script>
function getData(user, tag, region) {
if("{{ checkElo }}" == "True") {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if(this.readyState == 4 && this.status == 200) {
var output = JSON.parse(this.responseText);
$("input[name=rank]").val(output.data.currenttierpatched);
$("input[name=elo]").val(output.data.ranking_in_tier);
$("input[name=overallElo]").val(output.data.elo);
}
}
xhttp.open("GET", "{{ api_url }}", true);
xhttp.send();
}
}
</script>
</body>
{% endblock %}
\ No newline at end of file
{% extends 'base.html' %}
{% block content %}
<h1>{% block title %} Elo Checker {% endblock %}</h1>
<br>
<h3>1. Ensure the region you wish to use is added. For LATAM or BR use NA.</h3>
<h3>2. Add your username with your tagline.</h3>
<h3>3. Fetch your Elo using Hendrik's Valorant API.</h3>
{% endblock %}
\ No newline at end of file
{% extends 'base.html' %}
{% block content %}
<h2>{{ region[1] }}</h2>
<h2>{% block title %} {{ region[2] }} {% endblock %}</h2>
<hr>
<a href = "{{ url_for('regionsEdit', RegionID=region[0]) }}">
<h2>
<span class="badge badge-warning">Edit</span>
</h2>
</a>
<form action="{{ url_for('regionsDelete', RegionID=region[0]) }}" method="post">
<input type="submit" value="Delete" class="btn btn-danger btn-sm" onclick="return confirm('Are you sure you want to delete this region?')"></input>
</form>
{% endblock %}
\ No newline at end of file
{% extends 'base.html' %}
{% block content %}
<h1>{% block title %} Regions {% endblock %}</h1>
<a href="{{ url_for('regionsAdd') }}">
<button type="button" class="btn btn-primary">Add Regions</button>
</a>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th>Display Name</th>
</tr>
</thead>
<tbody>
{% for region in data %}
<tr>
<td>
<a href="{{ url_for('region', RegionID=region[0]) }}">{{ region[1] }}</a>
</td>
<td>{{ region[2] }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
\ No newline at end of file
{% extends 'base.html' %}
{% block content %}
<h1>{% block title %} Add Regions {% endblock %}</h1>
<form method="post">
<div class="form-group">
<label for="name">Name</label>
<input type="text" name="name" placeholder="Region Shorthand Name" class="form-control" value="{{ request.form['name'] }}"></input>
</div>
<div class="form-group">
<label for="displayName">Display Name</label>
<input type="text" name="displayName" placeholder="Region Display Name" class="form-control" value="{{ request.form['displayName'] }}"></input>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</form>
{% endblock %}
\ No newline at end of file
{% extends 'base.html' %}
{% block content %}
<h1>{% block title %} Edit "{{ region[2] }}" {% endblock %}</h1>
<form method="post">
<div class="form-group">
<label for="name">Name</label>
<input type="text" name="name" placeholder="Region Shorthand Name" class="form-control" value="{{ request.form['name'] }}"></input>
</div>
<div class="form-group">
<label for="displayName">Display Name</label>
<input type="text" name="displayName" placeholder="Region Display Name" class="form-control" value="{{ request.form['displayName'] }}"></input>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</form>
<hr>
{% endblock %}
\ No newline at end of file
{% extends 'base.html' %}
{% block content %}
<h2>{% block title %} {{ user[1] }} {% endblock %}</h2>
<h2>{{ user[2] }}</h2>
<hr>
<a href = "{{ url_for('usersEdit', UserID=user[0]) }}">
<h2>
<span class="badge badge-warning">Edit</span>
</h2>
</a>
<form action="{{ url_for('usersDelete', UserID=user[0]) }}" method="post">
<input type="submit" value="Delete" class="btn btn-danger btn-sm" onclick="return confirm('Are you sure you want to delete this user?')"></input>
</form>
{% endblock %}
\ No newline at end of file
{% extends 'base.html' %}
{% block content %}
<h1>{% block title %} Users {% endblock %}</h1>
<a href="{{ url_for('usersAdd') }}">
<button type="button" class="btn btn-primary">Add Users</button>
</a>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th>Tagline</th>
<th>Created On</th>
<th>Updated On</th>
</tr>
</thead>
<tbody>
{% for user in data %}
<tr>
<td>
<a href="{{ url_for('user', UserID=user[0]) }}">{{ user[1] }}</a>
</td>
<td>{{ user[2] }}</td>
<td>{{ user[3] }}</td>
<td>{{ user[4] }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
\ No newline at end of file
{% extends 'base.html' %}
{% block content %}
<h1>{% block title %} Add Users {% endblock %}</h1>
<form method="post">
<div class="form-group">
<label for="name">Name</label>
<input type="text" name="name" placeholder="Player Username" class="form-control" value="{{ request.form['name'] }}"></input>
</div>
<div class="form-group">
<label for="tag">Tag</label>
<input type="text" name="tag" placeholder="Player Tagline" class="form-control" value="{{ request.form['tag'] }}"></input>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</form>
{% endblock %}
\ No newline at end of file
{% extends 'base.html' %}
{% block content %}
<h1>{% block title %} Edit "{{ user[1] }}" {% endblock %}</h1>
<form method="post">
<div class="form-group">
<label for="name">Name</label>
<input type="text" name="name" placeholder="Player Username" class="form-control" value="{{ request.form['name'] }}"></input>
</div>
<div class="form-group">
<label for="tag">Tag</label>
<input type="text" name="tag" placeholder="Player Tagline" class="form-control" value="{{ request.form['tag'] }}"></input>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</form>
<hr>
{% endblock %}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment