diff options
Diffstat (limited to 'protocols/Slack')
-rw-r--r-- | protocols/Slack/src/api/api_oauth.h | 35 | ||||
-rw-r--r-- | protocols/Slack/src/http_request.h | 1 | ||||
-rw-r--r-- | protocols/Slack/src/slack_accounts.cpp | 8 | ||||
-rw-r--r-- | protocols/Slack/src/slack_connection.cpp | 11 | ||||
-rw-r--r-- | protocols/Slack/src/slack_contacts.cpp | 3 | ||||
-rw-r--r-- | protocols/Slack/src/slack_proto.cpp | 7 | ||||
-rw-r--r-- | protocols/Slack/src/slack_proto.h | 3 | ||||
-rw-r--r-- | protocols/Slack/src/slack_utils.cpp | 10 | ||||
-rw-r--r-- | protocols/Slack/src/stdafx.h | 1 |
9 files changed, 67 insertions, 12 deletions
diff --git a/protocols/Slack/src/api/api_oauth.h b/protocols/Slack/src/api/api_oauth.h new file mode 100644 index 0000000000..cc1c35ae3e --- /dev/null +++ b/protocols/Slack/src/api/api_oauth.h @@ -0,0 +1,35 @@ +#ifndef _SLACK_API_OAUTH_H_ +#define _SLACK_API_OAUTH_H_ + +class OAuhtAccessRequest : public HttpRequest +{ +public: + OAuhtAccessRequest(const char *code, const char *state = NULL) : + HttpRequest(HttpMethod::HttpPost, SLACK_API_URL "/oauth.access") + { + Headers + << CHAR_VALUE("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); + Content + << CHAR_VALUE("client_id", SLACK_CLIENT_ID) + << CHAR_VALUE("client_secret", SLACK_CLIENT_SECRET) + << ENCODED_VALUE("code", code) + << ENCODED_VALUE("state", state) + << ENCODED_VALUE("redirect_uri", SLACK_REDIRECT_URL); + } +}; + +class AuthRevokeRequest : public HttpRequest +{ +public: + AuthRevokeRequest(const char *token) : + HttpRequest(HttpMethod::HttpPost, SLACK_API_URL "/auth.revoke") + { + timeout = 1; // in seconds? + Headers + << CHAR_VALUE("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); + Content + << CHAR_VALUE("token", token); + } +}; + +#endif //_SLACK_API_OAUTH_H_
\ No newline at end of file diff --git a/protocols/Slack/src/http_request.h b/protocols/Slack/src/http_request.h index 03f5894c6f..9c0d52816f 100644 --- a/protocols/Slack/src/http_request.h +++ b/protocols/Slack/src/http_request.h @@ -332,6 +332,7 @@ public: { cbSize = sizeof(NETLIBHTTPREQUEST); requestType = method; + flags = NLHRF_HTTP11 | NLHRF_SSL | NLHRF_NODUMPHEADERS; } ~HttpRequest() diff --git a/protocols/Slack/src/slack_accounts.cpp b/protocols/Slack/src/slack_accounts.cpp index 50640ae37a..47ebdecdc6 100644 --- a/protocols/Slack/src/slack_accounts.cpp +++ b/protocols/Slack/src/slack_accounts.cpp @@ -37,6 +37,14 @@ int CSlackProto::OnAccountLoaded(WPARAM, LPARAM) return 0; } +int CSlackProto::OnAccountDeleted(WPARAM, LPARAM) +{ + ptrA token(getStringA("TokenSecret")); + SendRequest(new AuthRevokeRequest(token)); + + return 0; +}; + INT_PTR CSlackProto::OnAccountManagerInit(WPARAM, LPARAM) { return NULL;// (INT_PTR)(CSlackOptionsMain::CreateAccountManagerPage(this, (HWND)lParam))->GetHwnd(); diff --git a/protocols/Slack/src/slack_connection.cpp b/protocols/Slack/src/slack_connection.cpp index 0cbb73992a..17f8eb5adf 100644 --- a/protocols/Slack/src/slack_connection.cpp +++ b/protocols/Slack/src/slack_connection.cpp @@ -22,16 +22,7 @@ void CSlackProto::Login() return; } - HttpRequest *request = new HttpRequest(HttpMethod::HttpPost, SLACK_API_URL "/oauth.access"); - request->Headers - << CHAR_VALUE("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); - request->Content - << CHAR_VALUE("client_id", SLACK_CLIENT_ID) - << CHAR_VALUE("client_secret", SLACK_CLIENT_SECRET) - << ENCODED_VALUE("code", oauth.GetAuthCode()) - << ENCODED_VALUE("redirect_uri", SLACK_REDIRECT_URL); - - PushRequest(request, &CSlackProto::OnAuthorize); + PushRequest(new OAuhtAccessRequest(oauth.GetAuthCode()), &CSlackProto::OnAuthorize); } void CSlackProto::OnAuthorize(JSONNode &root, void*) diff --git a/protocols/Slack/src/slack_contacts.cpp b/protocols/Slack/src/slack_contacts.cpp index 5054e6003c..82798cb9ca 100644 --- a/protocols/Slack/src/slack_contacts.cpp +++ b/protocols/Slack/src/slack_contacts.cpp @@ -127,6 +127,9 @@ void CSlackProto::OnGotUserList(JSONNode &root, void*) if (!status.IsEmpty()) setWString(hContact, "StatusMsg", status); + json_string presence = user["presence"].as_string(); + SetContactStatus(hContact, SlackToMirandaStatus(presence.c_str())); + JSONNode profile = root["profile"].as_node(); OnGotUserProfile(hContact, profile); } diff --git a/protocols/Slack/src/slack_proto.cpp b/protocols/Slack/src/slack_proto.cpp index e3731794d4..318e1366bc 100644 --- a/protocols/Slack/src/slack_proto.cpp +++ b/protocols/Slack/src/slack_proto.cpp @@ -23,9 +23,9 @@ DWORD_PTR CSlackProto::GetCaps(int type, MCONTACT) case PFLAGNUM_1: return PF1_IMSEND; case PFLAGNUM_2: - return PF2_ONLINE; + return PF2_ONLINE | PF2_SHORTAWAY; case PFLAGNUM_3: - return PF2_ONLINE; + return PF2_ONLINE | PF2_SHORTAWAY; case PFLAG_UNIQUEIDTEXT: return (INT_PTR)"User Id"; case PFLAG_UNIQUEIDSETTING: @@ -154,6 +154,9 @@ int CSlackProto::OnEvent(PROTOEVENTTYPE iEventType, WPARAM wParam, LPARAM lParam case EV_PROTO_ONLOAD: return OnAccountLoaded(wParam, lParam); + case EV_PROTO_ONERASE: + return OnAccountDeleted(wParam, lParam); + case EV_PROTO_ONCONTACTDELETED: return OnContactDeleted(wParam, lParam); } diff --git a/protocols/Slack/src/slack_proto.h b/protocols/Slack/src/slack_proto.h index 25b667eea2..c7dd739f32 100644 --- a/protocols/Slack/src/slack_proto.h +++ b/protocols/Slack/src/slack_proto.h @@ -89,6 +89,7 @@ private: static CSlackProto* GetContactAccount(MCONTACT hContact); int __cdecl OnAccountLoaded(WPARAM, LPARAM); + int __cdecl OnAccountDeleted(WPARAM, LPARAM); INT_PTR __cdecl OnAccountManagerInit(WPARAM, LPARAM); @@ -143,6 +144,8 @@ private: int __cdecl OnPreCreateMessage(WPARAM wParam, LPARAM lParam); // utils + static int SlackToMirandaStatus(const char *presence); + static void ShowNotification(const TCHAR *message, int flags = 0, MCONTACT hContact = NULL); static void ShowNotification(const TCHAR *caption, const TCHAR *message, int flags = 0, MCONTACT hContact = NULL); diff --git a/protocols/Slack/src/slack_utils.cpp b/protocols/Slack/src/slack_utils.cpp index 40a6680788..bcfe5916c2 100644 --- a/protocols/Slack/src/slack_utils.cpp +++ b/protocols/Slack/src/slack_utils.cpp @@ -1,5 +1,15 @@ #include "stdafx.h" +int CSlackProto::SlackToMirandaStatus(const char *presence) +{ + if (!mir_strcmpi(presence, "active")) + return ID_STATUS_ONLINE; + else if (!mir_strcmpi(presence, "away")) + return ID_STATUS_AWAY; + else + return ID_STATUS_OFFLINE; +} + void CSlackProto::ShowNotification(const TCHAR *caption, const TCHAR *message, int flags, MCONTACT hContact) { if (Miranda_IsTerminated()) diff --git a/protocols/Slack/src/stdafx.h b/protocols/Slack/src/stdafx.h index 8a24cb29f7..82ee0ac61d 100644 --- a/protocols/Slack/src/stdafx.h +++ b/protocols/Slack/src/stdafx.h @@ -51,6 +51,7 @@ struct CSlackProto; #include "slack_options.h" #include "slack_proto.h" +#include "api\api_oauth.h" #include "api\api_users.h" #include "api\api_chat.h" #include "api\api_im.h" |