diff --git a/include/dpp/message.h b/include/dpp/message.h index 4a593ecf7a..1c274b3ae8 100644 --- a/include/dpp/message.h +++ b/include/dpp/message.h @@ -1172,6 +1172,20 @@ struct DPP_EXPORT attachment { * @return true if remixed */ bool is_remix() const; + + /** + * @brief Returns expiration timestamp for attachment's URL + * + * @return timestamp of URL expiration + */ + time_t get_expire_time() const; + + /** + * @brief Returns creation timestamp for attachment's URL + * + * @return timestamp of URL creation + */ + time_t get_issued_time() const; }; /** diff --git a/src/dpp/message.cpp b/src/dpp/message.cpp index 9b304cf094..b7da4fc5af 100644 --- a/src/dpp/message.cpp +++ b/src/dpp/message.cpp @@ -882,6 +882,38 @@ bool attachment::is_remix() const { return flags & a_is_remix; } +time_t attachment::get_expire_time() const { + size_t attr_position = url.find('?'); + /* If no attributes were sent in url, we do not need to parse more */ + if(url.npos == attr_position){ + return 0; + } + std::string attributes = url.substr(attr_position + 1); + std::vector attr_list = utility::tokenize(attributes, "&"); + auto ex_attr = std::find_if(attr_list.begin(), attr_list.end(), [](const std::string& s){return s.substr(0, 3) == "ex=";}); + if(attr_list.end() == ex_attr){ + return 0; + } + /* Erase 'ex=' prefix before parsing */ + return std::stol(ex_attr->substr(3), nullptr, 16); +} + +time_t attachment::get_issued_time() const { + size_t attr_position = url.find('?'); + /* No attributes were sent in url, so we do not need to parse more */ + if(url.npos == attr_position){ + return 0; + } + std::string attributes = url.substr(attr_position + 1); + std::vector attr_list = utility::tokenize(attributes, "&"); + auto is_attr = std::find_if(attr_list.begin(), attr_list.end(), [](const std::string& s){return s.substr(0, 3) == "is=";}); + if(attr_list.end() == is_attr){ + return 0; + } + /* Erase 'is=' prefix before parsing */ + return std::stol(is_attr->substr(3), nullptr, 16); +} + json message::to_json(bool with_id, bool is_interaction_response) const { /* This is the basics. once it works, expand on it. */ json j({