diff --git a/spectrum/src/frontends/slack/SlackAPI.cpp b/spectrum/src/frontends/slack/SlackAPI.cpp index 8f970f61cf6a289150050d5846c03c67658faeb1..910a5b5e8190f62b2bca2ebdba78b2143a127a79 100644 --- a/spectrum/src/frontends/slack/SlackAPI.cpp +++ b/spectrum/src/frontends/slack/SlackAPI.cpp @@ -147,6 +147,15 @@ void SlackAPI::channelsList( HTTPRequest::Callback callback) { queueRequest(req); } +void SlackAPI::channelsInvite(const std::string &channel, const std::string &user, HTTPRequest::Callback callback) { + std::string url = "https://slack.com/api/channels.invite?"; + url += "&channel=" + Util::urlencode(channel); + url += "&user=" + Util::urlencode(user); + url += "&token=" + Util::urlencode(m_token); + HTTPRequest *req = new HTTPRequest(THREAD_POOL(m_component), HTTPRequest::Get, url, callback); + queueRequest(req); +} + void SlackAPI::channelsCreate(const std::string &name, HTTPRequest::Callback callback) { std::string url = "https://slack.com/api/channels.create?name=" + Util::urlencode(name) + "&token=" + Util::urlencode(m_token); HTTPRequest *req = new HTTPRequest(THREAD_POOL(m_component), HTTPRequest::Get, url, callback); diff --git a/spectrum/src/frontends/slack/SlackAPI.h b/spectrum/src/frontends/slack/SlackAPI.h index 32e6b9f357b0b17795f9da756c1634bc1d83c6ae..abf2cad37092548dedf49ab87382959b8b746426 100644 --- a/spectrum/src/frontends/slack/SlackAPI.h +++ b/spectrum/src/frontends/slack/SlackAPI.h @@ -76,6 +76,7 @@ class SlackAPI : public HTTPRequestQueue { std::string getOwnerId(HTTPRequest *req, bool ok, rapidjson::Document &resp, const std::string &data); void channelsCreate(const std::string &name, HTTPRequest::Callback callback); + void channelsInvite(const std::string &channel, const std::string &user, HTTPRequest::Callback callback); void channelsList(HTTPRequest::Callback callback); void imOpen(const std::string &uid, HTTPRequest::Callback callback); diff --git a/spectrum/src/frontends/slack/SlackRTM.cpp b/spectrum/src/frontends/slack/SlackRTM.cpp index 98a19205b6d4525d8926ced88c695e21eefe2632..34825636ce1fd752a0d80eb6d54e19010fda1702 100644 --- a/spectrum/src/frontends/slack/SlackRTM.cpp +++ b/spectrum/src/frontends/slack/SlackRTM.cpp @@ -184,6 +184,15 @@ void SlackRTM::handleRTMStart(HTTPRequest *req, bool ok, rapidjson::Document &re m_selfName = selfName.GetString(); + rapidjson::Value &selfId = self["id"]; + if (!selfId.IsString()) { + LOG4CXX_ERROR(logger, "No 'id' string in the reply."); + LOG4CXX_ERROR(logger, data); + return; + } + + m_selfId = selfId.GetString(); + SlackAPI::getSlackChannelInfo(req, ok, resp, data, m_channels); SlackAPI::getSlackImInfo(req, ok, resp, data, m_ims); SlackAPI::getSlackUserInfo(req, ok, resp, data, m_users); diff --git a/spectrum/src/frontends/slack/SlackRTM.h b/spectrum/src/frontends/slack/SlackRTM.h index e244718a3c3dcbbdf9274652de3306a65e6c5508..3b9a8f967f08e8711ec2d6b824f0ea1f34c62ddd 100644 --- a/spectrum/src/frontends/slack/SlackRTM.h +++ b/spectrum/src/frontends/slack/SlackRTM.h @@ -89,6 +89,10 @@ class SlackRTM { return m_selfName; } + const std::string &getSelfId() { + return m_selfId; + } + private: void handlePayloadReceived(const std::string &payload); void handleRTMStart(HTTPRequest *req, bool ok, rapidjson::Document &resp, const std::string &data); @@ -100,6 +104,7 @@ class SlackRTM { std::map m_ims; std::map m_users; std::string m_selfName; + std::string m_selfId; private: Component *m_component; diff --git a/spectrum/src/frontends/slack/SlackSession.cpp b/spectrum/src/frontends/slack/SlackSession.cpp index e1a151de9e4b4ac6011544fd86acf77aca32ae48..e33e9d5f26d271e32d019c8de6d4d1c7cc71578b 100644 --- a/spectrum/src/frontends/slack/SlackSession.cpp +++ b/spectrum/src/frontends/slack/SlackSession.cpp @@ -215,6 +215,15 @@ void SlackSession::handleJoinMessage(const std::string &message, std::vectorchannelsList(boost::bind(&SlackSession::handleJoinRoomList, this, _1, _2, _3, _4, args)); } +void SlackSession::handleSlackChannelInvite(HTTPRequest *req, bool ok, rapidjson::Document &resp, const std::string &data) { + Swift::Presence::ref presence = Swift::Presence::create(); + presence->setFrom(Swift::JID("", m_uinfo.jid, "default")); + presence->setTo(m_component->getJID()); + presence->setType(Swift::Presence::Available); + presence->addPayload(boost::shared_ptr(new Swift::MUCPayload())); + m_component->getFrontend()->onPresenceReceived(presence); +} + void SlackSession::handleSlackChannelCreate(HTTPRequest *req, bool ok, rapidjson::Document &resp, const std::string &data) { std::string channelId = m_api->getChannelId(req, ok, resp, data); if (channelId.empty()) { @@ -223,12 +232,7 @@ void SlackSession::handleSlackChannelCreate(HTTPRequest *req, bool ok, rapidjson } m_slackChannel = channelId; - Swift::Presence::ref presence = Swift::Presence::create(); - presence->setFrom(Swift::JID("", m_uinfo.jid, "default")); - presence->setTo(m_component->getJID()); - presence->setType(Swift::Presence::Available); - presence->addPayload(boost::shared_ptr(new Swift::MUCPayload())); - m_component->getFrontend()->onPresenceReceived(presence); + m_api->channelsInvite(m_slackChannel, m_rtm->getSelfId(), boost::bind(&SlackSession::handleSlackChannelInvite, this, _1, _2, _3, _4)); } void SlackSession::handleSlackChannelList(HTTPRequest *req, bool ok, rapidjson::Document &resp, const std::string &data) { @@ -237,12 +241,7 @@ void SlackSession::handleSlackChannelList(HTTPRequest *req, bool ok, rapidjson:: if (channels.find(m_slackChannel) != channels.end()) { m_slackChannel = channels[m_slackChannel].id; - Swift::Presence::ref presence = Swift::Presence::create(); - presence->setFrom(Swift::JID("", m_uinfo.jid, "default")); - presence->setTo(m_component->getJID()); - presence->setType(Swift::Presence::Available); - presence->addPayload(boost::shared_ptr(new Swift::MUCPayload())); - m_component->getFrontend()->onPresenceReceived(presence); + m_api->channelsInvite(m_slackChannel, m_rtm->getSelfId(), boost::bind(&SlackSession::handleSlackChannelInvite, this, _1, _2, _3, _4)); } else { m_api->channelsCreate(m_slackChannel, boost::bind(&SlackSession::handleSlackChannelCreate, this, _1, _2, _3, _4)); diff --git a/spectrum/src/frontends/slack/SlackSession.h b/spectrum/src/frontends/slack/SlackSession.h index 7cb3962838cec43bed1154f1779ceaf51317244c..9164a6dedf7b7ca45b40ae38dffe0940d6713255 100644 --- a/spectrum/src/frontends/slack/SlackSession.h +++ b/spectrum/src/frontends/slack/SlackSession.h @@ -75,6 +75,7 @@ class SlackSession { void handleSlackChannelCreate(HTTPRequest *req, bool ok, rapidjson::Document &resp, const std::string &data); void handleSlackChannelList(HTTPRequest *req, bool ok, rapidjson::Document &resp, const std::string &data); + void handleSlackChannelInvite(HTTPRequest *req, bool ok, rapidjson::Document &resp, const std::string &data); void sendOnlineBuddies();