From 0b7aa02704f6ece97d17fbb118519c5cc62caaba Mon Sep 17 00:00:00 2001 From: Joel Grunbaum <joelgrun@gmail.com> Date: Wed, 19 Jan 2022 07:45:21 +0000 Subject: [PATCH] Bot prints exchange feed --- bom.cpp | 68 +++++++++++++++++++--------------- 1 files changed, 38 insertions(+), 30 deletions(-) diff --git a/bom.cpp b/bom.cpp index 79c7d66..64058ba 100644 --- a/bom.cpp +++ b/bom.cpp @@ -1,49 +1,57 @@ #include "bom.hpp" #include "book.hpp" +#include "ftplibpp/ftplib.h" +#include "rapidxml/rapidxml.hpp" #include <cstddef> #include <cstdio> -#include <curl/curl.h> -#include <stdio.h> +#include <fstream> +#include <iterator> #include <string> #include <unordered_map> +#include <vector> namespace bom { +ftplib* ftp; -static size_t my_fwrite(void* buffer, size_t size, size_t nmemb, void* stream) +void initialise() { - FILE* out = (FILE*)stream; - if (!out) { - out = tmpfile(); - if (!out) { - return -1; - } - } - return fwrite(buffer, size, nmemb, out); + ftp = new ftplib(); + ftp->Connect("ftp.bom.gov.au:21"); + ftp->Login("anonymous", ""); } + +void destroy() +{ + ftp->Quit(); + delete ftp; +} + void updateBom(std::unordered_map<std::string, book::Book>& bs) { - CURL* curl; - CURLcode res; - FILE* f{NULL}; - curl_global_init(CURL_GLOBAL_DEFAULT); - curl = curl_easy_init(); - if (curl) { - curl_easy_setopt(curl, CURLOPT_URL, - "ftp://ftp.bom.gov.au/anon/gen/fwo/IDN60920.xml"); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, &f); - curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); - res = curl_easy_perform(curl); - curl_easy_cleanup(curl); - if (CURLE_OK != res) { - fprintf(stderr, "Curl failed: %d\n", res); + ftp->Get("bom_data.xml", "/anon/gen/fwo/IDN60920.xml", + ftplib::transfermode::ascii); + std::ifstream fs("bom_data.xml"); + std::vector<char> buffer{std::istreambuf_iterator<char>(fs), + istreambuf_iterator<char>()}; + buffer.push_back('\0'); + rapidxml::xml_document<> d; + d.parse<0>(&buffer[0]); + // Walk stations + for (rapidxml::xml_node<>* n = d.first_node()->last_node()->first_node(); n; + n = n->next_sibling()) { + int bom_id = std::stoi(n->first_attribute()->next_attribute()->value()); + for (auto& i : bs) { + if (i.second.stationId == bom_id) { + // Should be apparent temp + i.second.bomPrice = std::stod(n->first_node() + ->first_node() + ->first_node() + ->first_node() + ->value()); + } } } - if (f) { - fclose(f); - } - curl_global_cleanup(); } } // namespace bom -- Gitblit v1.9.3