Added View Server Page & Discord API Handler

This commit is contained in:
Nemika
2021-03-08 21:30:47 +02:00
parent c19cceb7cb
commit d702272069
10 changed files with 169 additions and 15 deletions

23
core/discordAPI.py Normal file
View File

@@ -0,0 +1,23 @@
import requests
from PyJS import JSON
from PyJS.modules import fs
settings = JSON.parse(fs.createReadStream('settings.json'))
params = {
"headers":{
"Authorization": "Bot " + settings['bot_token'],
"Content-Type": "application/json"
}
}
def get_guild(guild_id):
return requests.get("https://discord.com/api/guilds/" + str(guild_id) + "?with_counts=true", **params).json()
def get_invite(channel_id):
data = {
"max_age": 0,
"max_uses": 0,
"unique": False
}
return requests.post("https://discord.com/api/channels/" + str(channel_id) + "/invites", json=data, **params)

View File

@@ -1 +1,10 @@
{} {
"view_server": {
"rule": "/server/<serverID>",
"strict_slashes": false
},
"view_server_default": {
"rule": "/server/",
"strict_slashes": false
}
}

28
main.py
View File

@@ -22,19 +22,45 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
""" """
from flask import Flask, render_template from flask import Flask, render_template, redirect, url_for
import humanfriendly
from PyJS import JSON from PyJS import JSON
from PyJS.modules import fs from PyJS.modules import fs
from core import discordAPI
from core.database import Servers from core.database import Servers
from core.routes import route_for
app = Flask(__name__) app = Flask(__name__)
settings = JSON.parse(fs.createReadStream('settings.json')) settings = JSON.parse(fs.createReadStream('settings.json'))
settings["len"] = len
settings["human"] = humanfriendly
@app.errorhandler(404)
def _404Err(err):
return redirect(url_for('index'))
@app.route("/") @app.route("/")
def index(): def index():
return render_template('index.html', servers=Servers.get_all(),**settings) return render_template('index.html', servers=Servers.get_all(),**settings)
@app.route(**route_for('view_server_default'), defaults={"serverID": None})
@app.route(**route_for('view_server'))
def view_server(serverID):
if not serverID:
redirect(url_for('index'))
server = Servers.get_one(_id=int(serverID))
_data = discordAPI.get_guild(serverID)
inv = discordAPI.get_invite(server['invite']).json()
_data["invite"]= f"https://discord.gg/{inv['code']}"
return render_template('view_server.html', server=server, discord=_data, **settings)
app.run(debug=True) app.run(debug=True)

View File

@@ -18,7 +18,6 @@ html(lang="en")
div#particles-js div#particles-js
script(src="{{url_for('static', filename='js/particles.js')}}") script(src="{{url_for('static', filename='js/particles.js')}}")
script(src="{{url_for('static', filename='js/app.js')}}") script(src="{{url_for('static', filename='js/app.js')}}")
script(src="{{url_for('static', filename='js/base.js')}}")
script(src="https://cdnjs.cloudflare.com/ajax/libs/markdown-it/12.0.4/markdown-it.js") script(src="https://cdnjs.cloudflare.com/ajax/libs/markdown-it/12.0.4/markdown-it.js")
script(src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.bundle.min.js" integrity="sha384-b5kHyXgcpbZJO/tY9Ul7kGkf1S0CWuKcCD38l8YkeH8z8QjE0GmW1gYU5S9FOnJ0" crossorigin="anonymous") script(src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.bundle.min.js" integrity="sha384-b5kHyXgcpbZJO/tY9Ul7kGkf1S0CWuKcCD38l8YkeH8z8QjE0GmW1gYU5S9FOnJ0" crossorigin="anonymous")
script(src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous") script(src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous")

43
pug/view_server.pug Normal file
View File

@@ -0,0 +1,43 @@
extends base.pug
block title
title {{server['server_name']}} | {{site_name}}
block links
link(rel="stylesheet", href="{{url_for('static', filename='styles/view_server.css')}}")
block content
.container.shadow-lg
.card-header.bg-danger.bg-gradient.text-light.mx-auto#serverName {{server['server_name']}}
.card-body
.info
img.rounded-pill.border.border-5.border-danger(src="{{server['icon_url']}}", alt="")
.info-column.mx-auto
a.btn.btn-success(href="{{discord['invite']}}" target="_blank") Join {{server['server_name']}} ({{discord['approximate_member_count']}})
.card-body.bg-primary.bg-gradient.rounded.mx-auto
a.btn-warning.btn.rounded Members: {{human.format_number(discord['approximate_member_count'])}}
a.btn-warning.btn.rounded Emojis: {{len(discord['emojis'])}}
a.btn-warning.btn.rounded Roles: {{len(discord['roles'])}}
a.btn-warning.btn.rounded Boost Tier: {{discord['premium_tier']}} ({{discord['premium_subscription_count']}} Boosts)
p.renderMarkdown.
{% for line in server['description'].split('\n') %}
{{line.replace(">", "").replace("\\", "")}}
{% endfor %}
block scripts
script.
$(document).ready(() => {
const md = window.markdownit();
const elements = document.getElementsByClassName("renderMarkdown");
for(var i = 0; i<elements.length; i++) {
elements[i].innerHTML = md.render(elements[i].innerHTML);
}
})

View File

@@ -1,10 +0,0 @@
// Update Time
const updateTime = setInterval(() => {
const currentTime = new Date();
let hours = currentTime.getHours();
let minutes = currentTime.getMinutes();
let seconds = currentTime.getSeconds();
document.getElementById("time").innerHTML = `${hours > 9 ? hours : '0' + hours}:${minutes> 9 ? minutes : '0' + minutes}:${seconds> 9 ? seconds : '0' + seconds}`;
}, 1000)

View File

@@ -0,0 +1,47 @@
.container {
margin-top : 10px;
background: rgb(233, 233, 233);
}
#serverName {
text-align: center;
font-size: 20px;
font-weight: 600;
margin: 10px;
}
.info {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
.info-column {
display: flex;
flex-direction: column;
flex-wrap: wrap;
height: 100%;
margin-left: 30px;
width: 80%;
margin-top: 20px;
}
.info > img {
height: 200px;
margin-bottom: 10px;
}
.info-column > a {
height: 100%;
}
.info-column > .card-body {
margin-top: 10px;
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
.card-body > a {
margin-right: 10px;
}

View File

@@ -1 +1 @@
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous"><link rel="stylesheet" href="{{url_for('static', filename='styles/base.css')}}"></head><body><div id="particles-js"></div><script src="{{url_for('static', filename='js/particles.js')}}"> </script><script src="{{url_for('static', filename='js/app.js')}}"> </script><script src="{{url_for('static', filename='js/base.js')}}"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/markdown-it/12.0.4/markdown-it.js"></script><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.bundle.min.js" integrity="sha384-b5kHyXgcpbZJO/tY9Ul7kGkf1S0CWuKcCD38l8YkeH8z8QjE0GmW1gYU5S9FOnJ0" crossorigin="anonymous"></script><script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script></body></html> <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous"><link rel="stylesheet" href="{{url_for('static', filename='styles/base.css')}}"></head><body><div id="particles-js"></div><script src="{{url_for('static', filename='js/particles.js')}}"> </script><script src="{{url_for('static', filename='js/app.js')}}"> </script><script src="https://cdnjs.cloudflare.com/ajax/libs/markdown-it/12.0.4/markdown-it.js"></script><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.bundle.min.js" integrity="sha384-b5kHyXgcpbZJO/tY9Ul7kGkf1S0CWuKcCD38l8YkeH8z8QjE0GmW1gYU5S9FOnJ0" crossorigin="anonymous"></script><script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script></body></html>

View File

@@ -1,4 +1,4 @@
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous"><link rel="stylesheet" href="{{url_for('static', filename='styles/base.css')}}"><link rel="stylesheet" href="{{url_for('static', filename='styles/index.css')}}"><title>Home | {{site_name}}</title></head><body><div class="servers">{% for server in servers %}<div class="card shadow-lg" style="width: 18rem; margin:5px;"><img class="card-img-top" src="{{server['icon_url']}}"><div class="card-body"><div class="card-header bg-danger bg-gradient text-light" style="margin-bottom:5px;"><strong>{{server['server_name']}}</strong></div><p class="card-text">{{server['description'][:100] + '...'}}</p><a class="btn btn-outline-success d-block mx-auto" href="/server/{{server['_id']}}">View Server</a></div></div>{% endfor %}</div><div id="particles-js"></div><script src="{{url_for('static', filename='js/particles.js')}}"> </script><script src="{{url_for('static', filename='js/app.js')}}"> </script><script src="{{url_for('static', filename='js/base.js')}}"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/markdown-it/12.0.4/markdown-it.js"></script><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.bundle.min.js" integrity="sha384-b5kHyXgcpbZJO/tY9Ul7kGkf1S0CWuKcCD38l8YkeH8z8QjE0GmW1gYU5S9FOnJ0" crossorigin="anonymous"></script><script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script><script>$(document).ready(() => { <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous"><link rel="stylesheet" href="{{url_for('static', filename='styles/base.css')}}"><link rel="stylesheet" href="{{url_for('static', filename='styles/index.css')}}"><title>Home | {{site_name}}</title></head><body><div class="servers">{% for server in servers %}<div class="card shadow-lg" style="width: 18rem; margin:5px;"><img class="card-img-top" src="{{server['icon_url']}}"><div class="card-body"><div class="card-header bg-danger bg-gradient text-light" style="margin-bottom:5px;"><strong>{{server['server_name']}}</strong></div><p class="card-text">{{server['description'][:100] + '...'}}</p><a class="btn btn-outline-success d-block mx-auto" href="/server/{{server['_id']}}">View Server</a></div></div>{% endfor %}</div><div id="particles-js"></div><script src="{{url_for('static', filename='js/particles.js')}}"> </script><script src="{{url_for('static', filename='js/app.js')}}"> </script><script src="https://cdnjs.cloudflare.com/ajax/libs/markdown-it/12.0.4/markdown-it.js"></script><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.bundle.min.js" integrity="sha384-b5kHyXgcpbZJO/tY9Ul7kGkf1S0CWuKcCD38l8YkeH8z8QjE0GmW1gYU5S9FOnJ0" crossorigin="anonymous"></script><script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script><script>$(document).ready(() => {
const md = window.markdownit(); const md = window.markdownit();

View File

@@ -0,0 +1,17 @@
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous"><link rel="stylesheet" href="{{url_for('static', filename='styles/base.css')}}"><link rel="stylesheet" href="{{url_for('static', filename='styles/view_server.css')}}"><title>{{server['server_name']}} | {{site_name}}</title></head><body><div class="container shadow-lg"><div class="card-header bg-danger bg-gradient text-light mx-auto" id="serverName">{{server['server_name']}}</div><div class="card-body"> <div class="info"><img class="rounded-pill border border-5 border-danger" src="{{server['icon_url']}}" alt=""><div class="info-column mx-auto"><a class="btn btn-success" href="{{discord['invite']}}" target="_blank">Join {{server['server_name']}} ({{discord['approximate_member_count']}})</a><div class="card-body bg-primary bg-gradient rounded mx-auto"><a class="btn-warning btn rounded">Members: {{human.format_number(discord['approximate_member_count'])}}</a><a class="btn-warning btn rounded">Emojis: {{len(discord['emojis'])}}</a><a class="btn-warning btn rounded">Roles: {{len(discord['roles'])}}</a><a class="btn-warning btn rounded">Boost Tier: {{discord['premium_tier']}} ({{discord['premium_subscription_count']}} Boosts)</a></div></div></div><p class="renderMarkdown">{% for line in server['description'].split('\n') %}
{{line.replace(">", "").replace("\\", "")}}
{% endfor %}
</p></div></div><div id="particles-js"></div><script src="{{url_for('static', filename='js/particles.js')}}"> </script><script src="{{url_for('static', filename='js/app.js')}}"> </script><script src="https://cdnjs.cloudflare.com/ajax/libs/markdown-it/12.0.4/markdown-it.js"></script><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.bundle.min.js" integrity="sha384-b5kHyXgcpbZJO/tY9Ul7kGkf1S0CWuKcCD38l8YkeH8z8QjE0GmW1gYU5S9FOnJ0" crossorigin="anonymous"></script><script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script><script>$(document).ready(() => {
const md = window.markdownit();
const elements = document.getElementsByClassName("renderMarkdown");
for(var i = 0; i<elements.length; i++) {
elements[i].innerHTML = md.render(elements[i].innerHTML);
}
})</script></body></html>