From 1268fbe28bc1f4a9b078e2cbce207188173ad06e Mon Sep 17 00:00:00 2001 From: niansa Date: Mon, 11 Jan 2021 12:02:59 +0100 Subject: [PATCH] Implemented registering bots --- CMakeLists.txt | 5 +++ controllers/views.cc | 78 +++++++++++++++++++++++++++++++++++++------ controllers/views.h | 16 +++++++-- static/global.css | 22 +++++++++--- views/authsuccess.csp | 1 - views/botdetail.csp | 6 ++-- views/botlist.csp | 17 ++++++---- views/botregister.csp | 31 +++++++++++++++++ views/exception.csp | 20 +++++++++++ 9 files changed, 168 insertions(+), 28 deletions(-) create mode 100644 views/botregister.csp create mode 100644 views/exception.csp diff --git a/CMakeLists.txt b/CMakeLists.txt index 3b1061e..934abf2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,3 +66,8 @@ foreach(file ${files}) message("${file}: ${filename}") configure_file("${file}" "./${filename}" COPYONLY) endforeach() + +find_package(PkgConfig REQUIRED) +pkg_check_modules(format REQUIRED IMPORTED_TARGET fmt) +target_link_libraries(${PROJECT_NAME} PUBLIC + PkgConfig::format) diff --git a/controllers/views.cc b/controllers/views.cc index b39c152..b5ae9b5 100644 --- a/controllers/views.cc +++ b/controllers/views.cc @@ -1,6 +1,10 @@ #include #include #include +#include +#include +#include +#include #include #include "../config.h" #include "views.h" @@ -42,9 +46,27 @@ Bot deserializeBot(orm::Row row) { return thisbot; } -auto dbErr = [](const orm::DrogonDbException &e) { - std::cerr << "Database error:" << e.base().what() << std::endl; -}; +std::string dbEsc(const std::string& src) { + std::ostringstream fres; + for (const auto &character : src) { + if (character == '\'') { + fres << "''"; + } else { + fres << character; + } + } + return fres.str(); +} + +auto dbErr = [](const orm::DrogonDbException &) {}; + +void LoginFilter::doFilter(const HttpRequestPtr &req, FilterCallback &&fcb, FilterChainCallback &&fccb) { + if (req->session()->isAuthed()) { + fccb(); + } else { + authenticate(fcb); + } +} void views::botlist( const HttpRequestPtr& req, std::function &&callback @@ -54,9 +76,6 @@ void views::botlist( auto authed = session->isAuthed(); auto justMine = req->getPath()=="/bots/@me"; auto modView = req->getPath()=="/bots/@unapproved"; - if (justMine and not authed) { - authenticate(callback); - } std::string q = "SELECT * FROM bots WHERE "; if (justMine) { @@ -113,10 +132,6 @@ void views::botdetail( void views::botvote(const HttpRequestPtr& req, std::function &&callback, uint64_t bot_id) { auto session = req->session(); - // Check if user is authenticated - if (not session->isAuthed()) { - authenticate(callback); - } // Check if user is able to vote again auto user_id = session->get("discord_user_id"); auto vote_id = voteID(user_id, bot_id); @@ -138,6 +153,49 @@ void views::botvote(const HttpRequestPtr& req, std::function &&callback + ) { + auto session = req->session(); + // Display page + HttpViewData data; + data.insert("owner", session->get("discord_user_fullname")); + + callback(HttpResponse::newHttpViewResponse("botregister.csp", data)); +} +void views::botregister_submit(const HttpRequestPtr& req, std::function &&callback + ) { + 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); + }; + try { + auto name = req->getParameter("name"); + 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("discord_user_fullname"), dbEsc(support_server), dbEsc(prefix), session->get("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); + } +} + void views::discorddeauth( const HttpRequestPtr& req, std::function &&callback ) { diff --git a/controllers/views.h b/controllers/views.h index 62406ad..5da07b9 100644 --- a/controllers/views.h +++ b/controllers/views.h @@ -10,6 +10,14 @@ struct Bot { bool approved = false; }; +class LoginFilter:public drogon::HttpFilter +{ +public: + virtual void doFilter(const drogon::HttpRequestPtr &, + drogon::FilterCallback &&, + drogon::FilterChainCallback &&) override; +}; + using namespace drogon; class views: public drogon::HttpController { orm::DbClientPtr db; @@ -19,15 +27,19 @@ public: void botlist(const HttpRequestPtr&, std::function &&); void botdetail(const HttpRequestPtr&, std::function &&, uint64_t); void botvote(const HttpRequestPtr&, std::function &&, uint64_t); + void botregister_view(const HttpRequestPtr&, std::function &&); + void botregister_submit(const HttpRequestPtr&, std::function &&); void discordauth(const HttpRequestPtr&, std::function &&, const std::string&); void discorddeauth(const HttpRequestPtr&, std::function &&); METHOD_LIST_BEGIN ADD_METHOD_TO(views::start, "/", Get); ADD_METHOD_TO(views::botlist, "/bots/@all", Get); - ADD_METHOD_TO(views::botlist, "/bots/@me", 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_submit, "/bots/register", Post, "LoginFilter"); ADD_METHOD_TO(views::botdetail, "/bots/{1}/detail", Get); - ADD_METHOD_TO(views::botvote, "/bots/{1}/vote", Get); + ADD_METHOD_TO(views::botvote, "/bots/{1}/vote", Get, "LoginFilter"); ADD_METHOD_TO(views::discordauth, "/discordauth?code={1}", Get); ADD_METHOD_TO(views::discorddeauth, "/discorddeauth", Get); METHOD_LIST_END diff --git a/static/global.css b/static/global.css index fa6faea..d61410d 100644 --- a/static/global.css +++ b/static/global.css @@ -15,28 +15,36 @@ body { } } -.linkButton { +[class*="special-"] { background-color:transparent; border-radius:4px; border:2px solid #ffffff; display:inline-block; - cursor:pointer; color:#ffffff; font-family:Arial; font-size:15px; - text-align:center; padding:9px 23px; text-decoration:none; text-shadow:0px 0px 11px #263666; margin:10px; } -.linkButton:hover { + +.special-input { + cursor:text; + text-align:left; +} + +.special-button { + cursor:pointer; + text-align:center; +} +.special-button:hover { background-color: #fff; color: #263666; text-shadow: 0px; transform: scale(1.03); } -.linkButton:active { +.special-button:active { position:relative; top:1px; } @@ -48,3 +56,7 @@ body { .text-center { text-align: center; } + +.maxwidth { + width:100%; +} diff --git a/views/authsuccess.csp b/views/authsuccess.csp index 612925b..37420bc 100644 --- a/views/authsuccess.csp +++ b/views/authsuccess.csp @@ -1,4 +1,3 @@ -<%inc#include "controllers/views.h" %> <%c++ auto fullname = @@.get("fullname");%> diff --git a/views/botdetail.csp b/views/botdetail.csp index b8dcb2b..72d11a3 100644 --- a/views/botdetail.csp +++ b/views/botdetail.csp @@ -25,8 +25,8 @@ @@ -54,7 +54,7 @@
- Support Server + Support Server diff --git a/views/botlist.csp b/views/botlist.csp index 0f3205a..3ee9ab7 100644 --- a/views/botlist.csp +++ b/views/botlist.csp @@ -1,5 +1,5 @@ <%inc#include "controllers/views.h" %> -<%c++ auto viewHidden = @@.get("viewHidden");%> +<%c++ auto modView = @@.get("modView");%> <%c++ auto justMine = @@.get("justMine");%> @@ -16,19 +16,19 @@

Find a lot of bots that will be useful to your server

<%c++ if (@@.get("authed")) {%> <%c++ if (justMine) {%> - All bots + All bots <%c++ } else {%> - My bots + My bots <%c++ }%> - Logout + Register bot + Logout <%c++ } else {%> - Login + Login <%c++ }%>

<%c++ for (const auto& [bot_id, bot] : @@.get>("bots")) {%> - <%c++ if (bot.approved == viewHidden) continue;%> - +
@@ -37,6 +37,9 @@

{%bot.name%}

{%bot.short_description%}

+ <%c++ if (not bot.approved) {%> + Not yet approved + <%c++ }%>
diff --git a/views/botregister.csp b/views/botregister.csp new file mode 100644 index 0000000..0f39219 --- /dev/null +++ b/views/botregister.csp @@ -0,0 +1,31 @@ +<%c++ auto owner = @@.get("owner");%> + + + + + + + + + Registering a bot - DFB + + + +
+
+

Registering a bot

+

Name

+

Owner

+

Avatar URL

+

Short description

+

Long description

+

Prefix

+

Permanent support server invite code

+

Client ID

+


+ +
+
+ + + diff --git a/views/exception.csp b/views/exception.csp new file mode 100644 index 0000000..3265764 --- /dev/null +++ b/views/exception.csp @@ -0,0 +1,20 @@ +<%c++ auto message = @@.get("message");%> + + + + + + + + + Exception - DFB + + + +
+

An exception has occured

+

{%message%}

+
+ + +