diff --git a/main.cpp b/main.cpp index f31bbc0..9d8c08f 100644 --- a/main.cpp +++ b/main.cpp @@ -34,6 +34,9 @@ along with pilang. If not, see . #include #include +#include +using json = nlohmann::json; + #include static std::string server_url = "https://unterricht.sh.schulcommsy.de"; @@ -315,9 +318,11 @@ std::string get_rss_url(GumboNode *node) { // Currently unused -int mode_cli(char *argv[], unsigned long numposts, std::vector postsmap_numname, std::vector postsmap_nummeta, - std::vector postsmap_numurl, std::vector postsmap_numdesc, - std::vector> postsmap_numfileurls, std::vector> postsmap_numfilenames) { +#define mode_tmpl(func) func(char *argv[], int argc, unsigned long numposts, std::vector postsmap_numname, std::vector postsmap_nummeta,std::vector postsmap_numurl, std::vector postsmap_numdesc,std::vector> postsmap_numfileurls, std::vector> postsmap_numfilenames) +typedef std::function mode; +#pragma GCC diagnostic ignored "-Wunused-parameter" + +int mode_tmpl(mode_cli) { // Show overview for (unsigned long it = 0; it != numposts; it++) { std::cout << it << ") " << postsmap_numname[it] << " – " << postsmap_nummeta[it] << std::endl; @@ -368,11 +373,52 @@ int mode_cli(char *argv[], unsigned long numposts, std::vector post return 0; } +int mode_tmpl(mode_json) { + json jsonroot = json::array(); + // Iterate through the posts + for (unsigned long it = 0; it != numposts; it++) { + jsonroot[it] = json::object(); + jsonroot[it]["name"] = postsmap_numname[it]; + jsonroot[it]["meta"] = postsmap_nummeta[it]; + jsonroot[it]["description"] = postsmap_numdesc[it]; + jsonroot[it]["url"] = postsmap_numurl[it]; + jsonroot[it]["files"] = json::array(); + for (unsigned long it2 = 0; it2 != postsmap_numfileurls[it].size(); it2++) { + jsonroot[it]["files"][it2] = json::object(); + jsonroot[it]["files"][it2]["name"] = postsmap_numfilenames[it][it2]; + jsonroot[it]["files"][it2]["url"] = postsmap_numfileurls[it][it2]; + } + } + // Serialise to cout... + std::cout << jsonroot.dump() << std::endl; + return 0; +} + + +static std::map modes; +static std::map mode_requires_description; +static std::map mode_minargc; +void modedef_init() { + modes["cli"] = mode_cli; + mode_requires_description["cli"] = true; + mode_minargc["cli"] = 4; + modes["json"] = mode_json; + mode_requires_description["json"] = true; + mode_minargc["json"] = 4; +} + +void cmdusage(char *argv[]) { + std::cerr << "Usage: " << argv[0] << " license" << std::endl + << " " << argv[0] << " cli " << std::endl + << " " << argv[0] << " json " << std::endl + << " " << argv[0] << " * " << std::endl; +} + int main(int argc, char *argv[]) { // Catch SIGSEGV signal(SIGSEGV, sigsegv_panic); // Show license note if --license was given as first argument - if (argc > 1 and !strncmp(argv[1], "--license", 9)) { + if (argc > 1 and !strncmp(argv[1], "license", 9)) { std::cout << "CommSyFuse Copyright (C) 2020 niansa" << std::endl; std::cout << "This program comes with ABSOLUTELY NO WARRANTY; for details type `warranty'." << std::endl; std::cout << "This is free software, and you are welcome to redistribute it" << std::endl; @@ -380,13 +426,13 @@ int main(int argc, char *argv[]) { return 0; } // Check arguments - if (argc < 3) { - std::cerr << "Usage: " << argv[0] << " " << std::endl; + if (argc < 4) { + cmdusage(argv); return 1; } // Create required variables - server_sid = argv[1]; - room = argv[2]; + server_sid = argv[2]; + room = argv[3]; std::stringstream httpcontent; std::vector postsmap_numname; std::vector postsmap_nummeta; @@ -397,7 +443,7 @@ int main(int argc, char *argv[]) { std::vector postsmap_numnode; GumboOutput *document; // Check connection and download document - std::cout << "Connecting to server..." << std::endl; + //std::clog << "Connecting to server..." << std::endl; long statuscode = curlreq(httpcontent, server_sid, server_url+"/room/" + room + "/material"); if (statuscode == 302) { std::cerr << "Connection error: Invalid SID" << std::endl; @@ -414,7 +460,10 @@ int main(int argc, char *argv[]) { httpcontent.str(std::string()); // Clear buffer just in case we need it later // Get posts auto posts = get_posts(document->root); + // Initialise mode definitions + modedef_init(); // Map posts and their corresponding URL to a number + //std::clog << "Loading data..." << std::endl; unsigned long numposts = 0; for (auto it = posts.begin(); it != posts.end(); it++) { // Get posts name @@ -424,7 +473,8 @@ int main(int argc, char *argv[]) { // Get posts URL postsmap_numurl.push_back(get_post_url(*it)); // Get posts description - postsmap_numdesc.push_back(get_post_desc(server_url + *(postsmap_numurl.end() - 1))); + if (mode_requires_description[argv[1]]) + postsmap_numdesc.push_back(get_post_desc(server_url + *(postsmap_numurl.end() - 1))); // Get posts files auto urlnamefilemap = get_post_files(*it); for (auto it2 = urlnamefilemap.begin(); it2 != urlnamefilemap.end(); it2++) { @@ -436,7 +486,18 @@ int main(int argc, char *argv[]) { } numposts++; } - // Start CLI - return mode_cli(argv, numposts, postsmap_numname, postsmap_nummeta,postsmap_numurl, - postsmap_numdesc, postsmap_numfileurls, postsmap_numfilenames); + // Check specified mode + std::string mode = static_cast(argv[1]); + if (mode_minargc[mode] > argc) { + cmdusage(argv); + return 1; + } + // Start it + if (modes.find(mode) != modes.end()) { + return modes[mode](argv, argc, numposts, postsmap_numname, postsmap_nummeta,postsmap_numurl, + postsmap_numdesc, postsmap_numfileurls, postsmap_numfilenames); + } else { + std::cout << "It works!" << std::endl; + } + return 0; }