diff --git a/controllers/views.cc b/controllers/views.cc index b06776b..8c160ac 100644 --- a/controllers/views.cc +++ b/controllers/views.cc @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include "../config.h" @@ -119,6 +120,18 @@ views::views() { moderators = MODERATORS; } +std::string views::htmlBr(const std::string& src) { + std::ostringstream fres; + for (const auto& character : src) { + if (character == '\n') { + fres << "
"; + } else { + fres << character; + } + } + return fres.str(); +} + void views::start( const HttpRequestPtr&, std::function &&callback ) @@ -228,18 +241,71 @@ void views::botedit(const HttpRequestPtr& req, std::functionsession()); db->execSqlAsync("SELECT * FROM bots WHERE app_id = '"+std::to_string(bot_id)+"'", - [sessionData, callback, action] (const orm::Result &rows) { + [this, sessionData, callback, action, req] (const orm::Result &rows) { if (rows.empty()) { callback(HttpResponse::newNotFoundResponse()); } else { auto bot = deserializeBot(rows[0]); // Check if user is botowner or moderator if (sessionData->discord_id == bot.owner_id or sessionData->moderator) { + auto final = [callback] () { + callback(HttpResponse::newRedirectionResponse("../detail")); + }; // Get action if (action == "edit") { - // TODO + switch (req->getMethod()) { + case Get: { + auto data = HttpViewDataPrep(sessionData); + data.insert("bot", bot); + + callback(HttpResponse::newHttpViewResponse("botedit.csp", data)); + } break; + case Post: { + bool refresh = req->getParameter("refresh") == "on"; + db->execSqlAsync("UPDATE bots SET short_description = '"+dbEsc(req->getParameter("short_description"))+"'," + "long_description = '"+dbEsc(req->getParameter("long_description"))+"'," + "support_server = '"+dbEsc(req->getParameter("support_server"))+"'," + "prefix = '"+dbEsc(req->getParameter("prefix"))+"' " + "WHERE app_id = '"+std::to_string(bot.app_id)+"'", + [this, sessionData, refresh, bot, final] (const orm::Result &) { + if (refresh) { + auto app_id = bot.app_id; + getUser(app_id, [this, sessionData, app_id, final] (const Json::Value& botuser) { + if (not botuser.empty()) { + db->execSqlAsync("UPDATE bots SET name = '"+dbEsc(botuser["username"].asString())+"'," + "avatar_url = '"+dbEsc(botuser["avatar_url"].asString())+"'," + "owner = '"+dbEsc(sessionData->discord_fullname())+"' " + "WHERE app_id = '"+std::to_string(app_id)+"'", + [final] (const orm::Result &) { + final(); + }, dbErr); + } else { + final(); + } + }); + } else { + final(); + } + }, dbErr); + } break; + default: break; + } } else if (action == "delete") { - // TODO + switch (req->getMethod()) { + case Get: { + auto data = HttpViewDataPrep(sessionData); + data.insert("botname", HttpViewData::htmlTranslate(bot.name)); + + callback(HttpResponse::newHttpViewResponse("botdelete.csp", data)); + } break; + case Post: { + db->execSqlAsync("DELETE FROM bots WHERE app_id = '"+std::to_string(bot.app_id)+"'", + [callback] (const orm::Result &) { + toStartPage(callback); + }, dbErr); + } break; + default: break; + } } else if (not sessionData->moderator) { goto else_part; } else if (action == "approve") { @@ -275,10 +341,10 @@ void views::botregister_submit(const HttpRequestPtr& req, std::functiongetParameter("app_id")); - short_description = HttpViewData::htmlTranslate(req->getParameter("short_description")); - long_description = HttpViewData::htmlTranslate(req->getParameter("long_description")); - support_server = HttpViewData::htmlTranslate(req->getParameter("support_server")); - prefix = HttpViewData::htmlTranslate(req->getParameter("prefix")); + short_description = req->getParameter("short_description"); + long_description = req->getParameter("long_description"); + support_server = req->getParameter("support_server"); + prefix = req->getParameter("prefix"); } catch (std::exception& e) { onError(e.what()); } diff --git a/controllers/views.h b/controllers/views.h index f676d2b..33c4035 100644 --- a/controllers/views.h +++ b/controllers/views.h @@ -35,6 +35,7 @@ class views: public drogon::HttpController { std::vector moderators; public: views(); + static std::string htmlBr(const std::string&); void start(const HttpRequestPtr&, std::function &&); void menu(const HttpRequestPtr&, std::function &&); void botlist(const HttpRequestPtr&, std::function &&); @@ -54,7 +55,7 @@ public: 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"); - ADD_METHOD_TO(views::botedit, "/bots/{1}/edit/{2}", Get, "LoginFilter"); + ADD_METHOD_TO(views::botedit, "/bots/{1}/edit/{2}", Get, Post, "LoginFilter"); ADD_METHOD_TO(views::discordauth, "/discordauth?code={1}", Get); ADD_METHOD_TO(views::discorddeauth, "/discorddeauth", Get); ADD_METHOD_TO(views::menu, "/menu", Get); diff --git a/main.cc b/main.cc index 67e2e95..57aa6c5 100644 --- a/main.cc +++ b/main.cc @@ -2,12 +2,12 @@ #include "config.h" int main() { - //Set HTTP listener address and port + // Set HTTP listener address and port drogon::app().addListener(LISTEN_ADDR, LISTEN_PORT). enableSession(std::chrono::minutes(1200)). createDbClient(DB_TYPE, DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD). setFileTypes({"css", "png", "ico"}); - //Run HTTP framework, the method will block in the internal event loop + // Run HTTP framework, the method will block in the internal event loop drogon::app().run(); return 0; } diff --git a/static/dontloose.js b/static/dontloose.js new file mode 100644 index 0000000..f1f3c83 --- /dev/null +++ b/static/dontloose.js @@ -0,0 +1,18 @@ +function dontLoose() { + window.onbeforeunload = function (e) { + e = e || window.event; + let txt = "YOU MIGHT LOOSE DATA WHEN CONTINUING"; + + // For IE and Firefox prior to version 4 + if (e) { + e.returnValue = txt; + } + + // For Safari + return txt; + }; +} + +function loose() { + window.onbeforeunload = null; +} diff --git a/views/botdelete.csp b/views/botdelete.csp new file mode 100644 index 0000000..8a962cb --- /dev/null +++ b/views/botdelete.csp @@ -0,0 +1,12 @@ +<%c++ auto botname = @@.get("botname");%> +<%layout global_layout%> + +Deleting a bot - DFB + +
+

Are you sure you want to delete {%botname%}?

+
+ + No +
+
diff --git a/views/botdetail.csp b/views/botdetail.csp index 85660f9..8f43a08 100644 --- a/views/botdetail.csp +++ b/views/botdetail.csp @@ -15,17 +15,17 @@
- {%bot.name%} + {%HttpViewData::htmlTranslate(bot.name)%}
<%c++ if (sessionData and (bot.owner_id == sessionData->discord_id or sessionData->moderator)) {%> <%c++ if (sessionData->moderator and not bot.approved) {%> <%c++ }%> <%c++ }%> @@ -37,24 +37,28 @@

- {%bot.long_description%} + {%HttpViewData::htmlTranslate(views::htmlBr(bot.long_description))%}

Overview

- - - - + <%c++ if (not bot.prefix.empty()) {%> + + + + + <%c++ }%> - +
Prefix{%bot.prefix%}
Prefix{%HttpViewData::htmlTranslate(bot.prefix)%}
Owner{%bot.owner%}{%HttpViewData::htmlTranslate(bot.owner)%}

- Support Server + <%c++ if (not bot.support_server.empty()) {%> + Support Server + <%c++ }%>
diff --git a/views/botedit.csp b/views/botedit.csp new file mode 100644 index 0000000..7f867bc --- /dev/null +++ b/views/botedit.csp @@ -0,0 +1,19 @@ +<%inc#include "controllers/views.h" %> +<%c++ auto bot = @@.get("bot");%> +<%layout global_layout%> + +Editing a bot - DFB + +
+
+

Editing {%HttpViewData::htmlTranslate(bot.name)%}

+

Short description

+

Long description

+

Prefix

+

Permanent support server invite code

+

Refresh data

+


+ +
+ +
diff --git a/views/botregister.csp b/views/botregister.csp index 9b43e3e..7684e23 100644 --- a/views/botregister.csp +++ b/views/botregister.csp @@ -12,26 +12,11 @@

Client ID

Short description

Long description

-

Prefix

-

Permanent support server invite code

+

Prefix

+

Permanent support server invite code

Owner




- + - +