From f823618439d90d8ad826b19d518e6d8c4f4d718a 2015-12-08 17:58:56 From: Jan Kaluza Date: 2015-12-08 17:58:56 Subject: [PATCH] Slack: Support me_message and bot_message --- diff --git a/spectrum/src/frontends/slack/SlackAPI.cpp b/spectrum/src/frontends/slack/SlackAPI.cpp index 33946d5e346f831a4826464a9a07e40ea0da5698..584b4d1621f3b2366fe7a32c4c636c3ae30eafee 100644 --- a/spectrum/src/frontends/slack/SlackAPI.cpp +++ b/spectrum/src/frontends/slack/SlackAPI.cpp @@ -58,6 +58,18 @@ DEFINE_LOGGER(logger, "SlackAPI"); } \ bool NAME = NAME##_tmp.GetBool(); +#define GET_OBJECT(FROM, NAME) rapidjson::Value &NAME = FROM[#NAME]; \ + if (!NAME.IsObject()) { \ + LOG4CXX_ERROR(logger, "No '" << #NAME << "' object in the reply."); \ + return; \ + } + +#define STORE_STRING_OPTIONAL(FROM, NAME) rapidjson::Value &NAME##_tmp = FROM[#NAME]; \ + std::string NAME; \ + if (NAME##_tmp.IsString()) { \ + NAME = NAME##_tmp.GetString(); \ + } + SlackAPI::SlackAPI(Component *component, const std::string &token) : HTTPRequestQueue(component) { m_component = component; m_token = token; @@ -272,6 +284,13 @@ void SlackAPI::getSlackUserInfo(HTTPRequest *req, bool ok, rapidjson::Document & ret[info.id] = info; LOG4CXX_INFO(logger, info.id << " " << info.name); + + GET_OBJECT(users[i], profile); + STORE_STRING_OPTIONAL(profile, bot_id); + if (!bot_id.empty()) { + ret[bot_id] = info; + LOG4CXX_INFO(logger, bot_id << " " << info.name); + } } return; diff --git a/spectrum/src/frontends/slack/SlackRTM.cpp b/spectrum/src/frontends/slack/SlackRTM.cpp index 4bd807107d47d691482d55d5eaa282b94e1e8be4..88c3e0914840192ef93ab049429366ce5a4e271d 100644 --- a/spectrum/src/frontends/slack/SlackRTM.cpp +++ b/spectrum/src/frontends/slack/SlackRTM.cpp @@ -75,6 +75,12 @@ SlackRTM::~SlackRTM() { } \ std::string NAME = NAME##_tmp.GetString(); +#define STORE_STRING_OPTIONAL(FROM, NAME) rapidjson::Value &NAME##_tmp = FROM[#NAME]; \ + std::string NAME; \ + if (NAME##_tmp.IsString()) { \ + NAME = NAME##_tmp.GetString(); \ + } + void SlackRTM::handlePayloadReceived(const std::string &payload) { rapidjson::Document d; if (d.Parse<0>(payload.c_str()).HasParseError()) { @@ -87,10 +93,23 @@ void SlackRTM::handlePayloadReceived(const std::string &payload) { if (type == "message") { STORE_STRING(d, channel); - STORE_STRING(d, user); STORE_STRING(d, text); STORE_STRING(d, ts); - onMessageReceived(channel, user, text, ts); + STORE_STRING_OPTIONAL(d, subtype); + + if (subtype == "bot_message") { + STORE_STRING(d, bot_id); + onMessageReceived(channel, bot_id, text, ts); + } + else if (subtype == "me_message") { + text = "/me " + text; + STORE_STRING(d, user); + onMessageReceived(channel, user, text, ts); + } + else { + STORE_STRING(d, user); + onMessageReceived(channel, user, text, ts); + } } }