Added View Server Page & Discord API Handler
This commit is contained in:
23
core/discordAPI.py
Normal file
23
core/discordAPI.py
Normal 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)
|
||||
@@ -1 +1,10 @@
|
||||
{}
|
||||
{
|
||||
"view_server": {
|
||||
"rule": "/server/<serverID>",
|
||||
"strict_slashes": false
|
||||
},
|
||||
"view_server_default": {
|
||||
"rule": "/server/",
|
||||
"strict_slashes": false
|
||||
}
|
||||
}
|
||||
28
main.py
28
main.py
@@ -22,19 +22,45 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
"""
|
||||
|
||||
from flask import Flask, render_template
|
||||
from flask import Flask, render_template, redirect, url_for
|
||||
|
||||
import humanfriendly
|
||||
|
||||
from PyJS import JSON
|
||||
from PyJS.modules import fs
|
||||
|
||||
from core import discordAPI
|
||||
from core.database import Servers
|
||||
from core.routes import route_for
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
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("/")
|
||||
def index():
|
||||
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)
|
||||
@@ -18,7 +18,6 @@ html(lang="en")
|
||||
div#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/base.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://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous")
|
||||
|
||||
43
pug/view_server.pug
Normal file
43
pug/view_server.pug
Normal 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);
|
||||
}
|
||||
|
||||
})
|
||||
@@ -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)
|
||||
47
static/styles/view_server.css
Normal file
47
static/styles/view_server.css
Normal 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;
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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();
|
||||
|
||||
|
||||
17
templates/view_server.html
Normal file
17
templates/view_server.html
Normal 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>
|
||||
Reference in New Issue
Block a user