mirror of
https://gitlab.com/niansa/discordlistforbots.git
synced 2025-03-06 20:49:22 +01:00
Fixes
This commit is contained in:
parent
1268fbe28b
commit
0695343e65
4 changed files with 84 additions and 41 deletions
1
config.h
1
config.h
|
@ -12,3 +12,4 @@
|
|||
#define CLIENT_ID "797565592835457024"
|
||||
#define CLIENT_SECRET "8ZbKPseob8n1UmLLunPb06MNUKfPGRi1"
|
||||
#define REDIRECT_URI "http://localhost:8082/discordauth"
|
||||
#define BOT_TOKEN "Nzk3NTY1NTkyODM1NDU3MDI0.X_oU1w.fCVL8j58pphoEaU7e3q4yH7cFa4"
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include <sstream>
|
||||
#include <iomanip>
|
||||
#include <exception>
|
||||
#include <functional>
|
||||
#include <fmt/core.h>
|
||||
#include <drogon/drogon.h>
|
||||
#include "../config.h"
|
||||
|
@ -18,17 +19,6 @@ static unordered_map <std::string, trantor::Date> last_votes;
|
|||
|
||||
|
||||
|
||||
views::views() {
|
||||
db = drogon::app().getDbClient();
|
||||
}
|
||||
|
||||
void views::start(
|
||||
const HttpRequestPtr&, std::function<void (const HttpResponsePtr &)> &&callback
|
||||
)
|
||||
{
|
||||
callback(HttpResponse::newRedirectionResponse("/bots/@all", HttpStatusCode::k301MovedPermanently));
|
||||
}
|
||||
|
||||
Bot deserializeBot(orm::Row row) {
|
||||
Bot thisbot;
|
||||
# define sf(f) thisbot.f = row[#f]
|
||||
|
@ -58,8 +48,50 @@ std::string dbEsc(const std::string& src) {
|
|||
return fres.str();
|
||||
}
|
||||
|
||||
auto errPage(const std::exception& e) {
|
||||
HttpViewData data;
|
||||
data.insert("message", e.what());
|
||||
|
||||
auto resp = HttpResponse::newHttpViewResponse("exception.csp", data);
|
||||
resp->setStatusCode(HttpStatusCode::k500InternalServerError);
|
||||
return resp;
|
||||
}
|
||||
|
||||
void getUser(uint64_t user_id, std::function<void (const Json::Value&)> callback) {
|
||||
auto discordapi = HttpClient::newHttpClient("https://discord.com");
|
||||
auto req = HttpRequest::newHttpRequest();
|
||||
req->setPath("/api/v8/users/"+std::to_string(user_id));
|
||||
req->setMethod(HttpMethod::Get);
|
||||
req->addHeader("Authorization", "Bot " BOT_TOKEN);
|
||||
discordapi->sendRequest(req, [callback, user_id] (ReqResult, const HttpResponsePtr &response) {
|
||||
if (response->getStatusCode() == HttpStatusCode::k200OK) {
|
||||
auto &json = *response->getJsonObject().get();
|
||||
auto avatar_hash = json["avatar"].asString();
|
||||
if (avatar_hash.empty()) {
|
||||
json["avatar_url"] = "https://cdn.discordapp.com/embed/avatars/"+std::to_string(std::stoi(json["discriminator"].asString()) % 5)+".png";
|
||||
} else {
|
||||
json["avatar_url"] = "https://cdn.discordapp.com/avatars/"+std::to_string(user_id)+"/"+avatar_hash+".png";
|
||||
}
|
||||
callback(json);
|
||||
} else {
|
||||
callback({});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
auto dbErr = [](const orm::DrogonDbException &) {};
|
||||
|
||||
views::views() {
|
||||
db = drogon::app().getDbClient();
|
||||
}
|
||||
|
||||
void views::start(
|
||||
const HttpRequestPtr&, std::function<void (const HttpResponsePtr &)> &&callback
|
||||
)
|
||||
{
|
||||
callback(HttpResponse::newRedirectionResponse("/bots/@all", HttpStatusCode::k301MovedPermanently));
|
||||
}
|
||||
|
||||
void LoginFilter::doFilter(const HttpRequestPtr &req, FilterCallback &&fcb, FilterChainCallback &&fccb) {
|
||||
if (req->session()->isAuthed()) {
|
||||
fccb();
|
||||
|
@ -153,12 +185,13 @@ void views::botvote(const HttpRequestPtr& req, std::function<void (const HttpRes
|
|||
}, dbErr);
|
||||
}
|
||||
|
||||
void views::botregister_view(const HttpRequestPtr& req, std::function<void (const HttpResponsePtr &)> &&callback
|
||||
) {
|
||||
void views::botregister_view(const HttpRequestPtr& req, std::function<void (const HttpResponsePtr &)> &&callback,
|
||||
const std::string& error) {
|
||||
auto session = req->session();
|
||||
// Display page
|
||||
HttpViewData data;
|
||||
data.insert("owner", session->get<std::string>("discord_user_fullname"));
|
||||
data.insert("error", error);
|
||||
|
||||
callback(HttpResponse::newHttpViewResponse("botregister.csp", data));
|
||||
}
|
||||
|
@ -166,33 +199,42 @@ void views::botregister_submit(const HttpRequestPtr& req, std::function<void (co
|
|||
) {
|
||||
auto session = req->session();
|
||||
// Get and check parameters
|
||||
auto onError = [callback] (const std::exception& e) {
|
||||
HttpViewData data;
|
||||
data.insert("message", e.what());
|
||||
|
||||
auto resp = HttpResponse::newHttpViewResponse("exception.csp", data);
|
||||
resp->setStatusCode(HttpStatusCode::k500InternalServerError);
|
||||
callback(resp);
|
||||
auto onError = [callback] (const std::string& e) {
|
||||
callback(HttpResponse::newRedirectionResponse("register?error="+e));
|
||||
};
|
||||
try {
|
||||
auto name = req->getParameter("name");
|
||||
auto app_id = std::stoul(req->getParameter("app_id"));
|
||||
auto short_description = req->getParameter("short_description");
|
||||
auto long_description = req->getParameter("long_description");
|
||||
auto avatar_url = req->getParameter("avatar_url");
|
||||
auto support_server = req->getParameter("support_server");
|
||||
auto prefix = req->getParameter("prefix");
|
||||
auto app_id = std::stoul(req->getParameter("app_id"));
|
||||
// Perform database operation
|
||||
db->execSqlAsync(fmt::format("INSERT INTO bots (name, short_description, long_description, avatar_url, owner, support_server, prefix, owner_id, app_id, votes, approved) "
|
||||
"VALUES('{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', 0, 'f')",
|
||||
dbEsc(name), dbEsc(short_description), dbEsc(long_description), dbEsc(avatar_url), session->get<std::string>("discord_user_fullname"), dbEsc(support_server), dbEsc(prefix), session->get<uint64_t>("discord_user_id"), app_id),
|
||||
[app_id, callback] (const orm::Result &) {
|
||||
callback(HttpResponse::newRedirectionResponse(std::to_string(app_id)+"/detail"));
|
||||
}, [onError] (const orm::DrogonDbException &e) {
|
||||
onError(e.base());
|
||||
});
|
||||
} catch (std::exception& e) {
|
||||
onError(e);
|
||||
// Check if bot already exists
|
||||
db->execSqlAsync("select 1 from bots where app_id ='"+std::to_string(app_id)+"'",
|
||||
[=] (const orm::Result &r) {
|
||||
if (not r.empty()) {
|
||||
onError("Bot%20has%20already%20been%20registered");
|
||||
return;
|
||||
}
|
||||
// Get bots avatar
|
||||
getUser(app_id, [=] (const Json::Value& botuser) {
|
||||
// Check result
|
||||
if (botuser.empty() or not botuser["bot"].asBool()) {
|
||||
onError("Invalid%20client%20ID");
|
||||
return;
|
||||
}
|
||||
// Perform database operation
|
||||
db->execSqlAsync(fmt::format("INSERT INTO bots (name, short_description, long_description, avatar_url, owner, support_server, prefix, owner_id, app_id, votes, approved) "
|
||||
"VALUES('{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', 0, 'f')",
|
||||
dbEsc(botuser["username"].asString()), dbEsc(short_description), dbEsc(long_description), dbEsc(botuser["avatar_url"].asString()), session->get<std::string>("discord_user_fullname"), dbEsc(support_server), dbEsc(prefix), session->get<uint64_t>("discord_user_id"), app_id),
|
||||
[app_id, callback] (const orm::Result &) {
|
||||
callback(HttpResponse::newRedirectionResponse(std::to_string(app_id)+"/detail"));
|
||||
}, [onError] (const orm::DrogonDbException &e) {
|
||||
onError(e.base().what());
|
||||
});
|
||||
});
|
||||
}, dbErr);
|
||||
} catch (std::exception& e) {
|
||||
onError(e.what());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@ public:
|
|||
void botlist(const HttpRequestPtr&, std::function<void (const HttpResponsePtr &)> &&);
|
||||
void botdetail(const HttpRequestPtr&, std::function<void (const HttpResponsePtr &)> &&, uint64_t);
|
||||
void botvote(const HttpRequestPtr&, std::function<void (const HttpResponsePtr &)> &&, uint64_t);
|
||||
void botregister_view(const HttpRequestPtr&, std::function<void (const HttpResponsePtr &)> &&);
|
||||
void botregister_view(const HttpRequestPtr&, std::function<void (const HttpResponsePtr &)> &&, const std::string&);
|
||||
void botregister_submit(const HttpRequestPtr&, std::function<void (const HttpResponsePtr &)> &&);
|
||||
void discordauth(const HttpRequestPtr&, std::function<void (const HttpResponsePtr &)> &&, const std::string&);
|
||||
void discorddeauth(const HttpRequestPtr&, std::function<void (const HttpResponsePtr &)> &&);
|
||||
|
@ -36,7 +36,7 @@ public:
|
|||
ADD_METHOD_TO(views::start, "/", Get);
|
||||
ADD_METHOD_TO(views::botlist, "/bots/@all", Get);
|
||||
ADD_METHOD_TO(views::botlist, "/bots/@me", Get, "LoginFilter");
|
||||
ADD_METHOD_TO(views::botregister_view, "/bots/register", Get, "LoginFilter");
|
||||
ADD_METHOD_TO(views::botregister_view, "/bots/register?error={1}", Get, "LoginFilter");
|
||||
ADD_METHOD_TO(views::botregister_submit, "/bots/register", Post, "LoginFilter");
|
||||
ADD_METHOD_TO(views::botdetail, "/bots/{1}/detail", Get);
|
||||
ADD_METHOD_TO(views::botvote, "/bots/{1}/vote", Get, "LoginFilter");
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
<%c++ auto owner = @@.get<std::string>("owner");%>
|
||||
<%c++ auto error = @@.get<std::string>("error");%>
|
||||
|
||||
|
||||
<!DOCTYPE html>
|
||||
|
@ -14,14 +15,13 @@
|
|||
<div class="container">
|
||||
<form action="register" method="POST">
|
||||
<p class="title text-center">Registering a bot</p>
|
||||
<p>Name</p><input class="special-input maxwidth" name="name" maxlength="10" required autofocus>
|
||||
<p>Owner</p><input class="special-input maxwidth" value="{%owner%}" autocomplete="off" disabled>
|
||||
<p>Avatar URL</p><input type="url" class="special-input maxwidth" name="avatar_url" required>
|
||||
<p>Short description</p><input class="special-input maxwidth" name="short_description" maxlength="36" required>
|
||||
<i style="color:red;">{%error%}</i>
|
||||
<p>Client ID</p><input tyep="number" class="special-input maxwidth" name="app_id" maxlength="19" minlength="17" pattern="^[0-9]+$" required>
|
||||
<p>Short description</p><input class="special-input maxwidth" name="short_description" maxlength="80" required>
|
||||
<p>Long description</p><textarea class="special-input maxwidth" name="long_description" style="height:200px;" required></textarea>
|
||||
<p>Prefix</p><input class="special-input maxwidth" name="prefix" maxlength="6" required>
|
||||
<p>Permanent support server invite code</p><input class="special-input maxwidth" name="support_server" maxlength="15" minlength="5" required>
|
||||
<p>Client ID</p><input tyep="number" class="special-input maxwidth" name="app_id" maxlength="19" minlength="17" pattern="^[0-9]+$" required>
|
||||
<p>Owner</p><input class="special-input maxwidth" value="{%owner%}" autocomplete="off" disabled>
|
||||
<br><br><br>
|
||||
<input type="submit" class="special-button" style="margin:0px;" value="Submit">
|
||||
</form>
|
||||
|
|
Loading…
Add table
Reference in a new issue