/* SlackMessageHookProfile.java Copyright (c) 2016 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.slackmessagehook.profile; import android.content.Intent; import android.os.Bundle; import android.util.Log; import org.deviceconnect.android.deviceplugin.slackmessagehook.SlackMessageHookDeviceService; import org.deviceconnect.android.deviceplugin.slackmessagehook.slack.SlackManager; import org.deviceconnect.android.event.EventError; import org.deviceconnect.android.event.EventManager; import org.deviceconnect.android.message.MessageUtils; import org.deviceconnect.android.profile.MessageHookProfile; import org.deviceconnect.android.profile.api.DConnectApi; import org.deviceconnect.android.profile.api.DeleteApi; import org.deviceconnect.android.profile.api.GetApi; import org.deviceconnect.android.profile.api.PostApi; import org.deviceconnect.android.profile.api.PutApi; import org.deviceconnect.message.DConnectMessage; import org.json.JSONObject; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; /** * MessageHook プロファイルの実装クラス. * @author docomo */ public class SlackMessageHookProfile extends MessageHookProfile { /** * コンストラクタ */ public SlackMessageHookProfile() { addApi(mGetMessageApi); addApi(mGetChannelsApi); addApi(mPostMessageApi); addApi(mGetOnMessageApi); addApi(mOnPutOnMessageReceivedApi); addApi(mOnDeleteOnMessageReceivedApi); } /** * ServiceIDチェック. * @param serviceId サービスID * @param response レスポンス * @return エラー時はtrue */ private boolean checkServiceId(String serviceId, Intent response) { if (serviceId == null) { MessageUtils.setEmptyServiceIdError(response); return true; } if (!SlackMessageHookDeviceService.SERVICE_ID.equals(serviceId)) { MessageUtils.setNotFoundServiceError(response); return true; } return false; } /** * メッセージ取得API */ private final DConnectApi mGetMessageApi = new GetApi() { @Override public String getAttribute() { return ATTRIBUTE_MESSAGE; } @Override public boolean onRequest(final Intent request, final Intent response) { return getMessage(request, response); } }; /** * Channelリスト取得API */ private final DConnectApi mGetChannelsApi = new GetApi() { @Override public String getAttribute() { return ATTRIBUTE_CHANNEL; } @Override public boolean onRequest(final Intent request, final Intent response) { String serviceId = getServiceID(request); // ServiceIDチェック if (checkServiceId(serviceId, response)) { return true; } // 接続チェック if (!SlackManager.INSTANCE.isConnected()) { MessageUtils.setUnknownError(response, "Not connected to the Slack server"); return true; } // Channelリストを取得 SlackManager.INSTANCE.getAllChannelList(new SlackManager.FinishCallback<List<SlackManager.ListInfo>>() { @Override public void onFinish(List<SlackManager.ListInfo> listInfos, Exception error) { if (error == null) { List<Bundle> bundleList = new ArrayList<>(); for (SlackManager.ListInfo info : listInfos) { Bundle bundle = new Bundle(); bundle.putString(PARAM_ID, info.id); bundle.putString(PARAM_NAME, info.name); bundle.putString(PARAM_TYPE, "slack"); bundleList.add(bundle); } Bundle[] bundles = new Bundle[bundleList.size()]; bundleList.toArray(bundles); response.putExtra(PARAM_CHANNELS, bundles); setResult(response, DConnectMessage.RESULT_OK); } else { MessageUtils.setUnknownError(response); setResult(response, DConnectMessage.RESULT_ERROR); } SlackMessageHookDeviceService service = (SlackMessageHookDeviceService) getContext(); service.sendResponse(response); } }); return false; } }; /** * メッセージ投稿API */ private final DConnectApi mPostMessageApi = new PostApi() { @Override public String getAttribute() { return ATTRIBUTE_MESSAGE; } @Override public boolean onRequest(final Intent request, final Intent response) { String serviceId = getServiceID(request); String channelid = request.getStringExtra(PARAM_CHANNELID); String text = request.getStringExtra(PARAM_TEXT); String resource = request.getStringExtra(PARAM_RESOURCE); // ServiceIDチェック if (checkServiceId(serviceId, response)) { return true; } // channelIDチェック if (channelid == null) { MessageUtils.setInvalidRequestParameterError(response, "Needs to have a \"channelId\" parameter"); return true; } // 接続チェック if (!SlackManager.INSTANCE.isConnected()) { MessageUtils.setUnknownError(response, "Not connected to the Slack server"); return true; } if (resource == null) { if (text == null) { // 最低限textパラメータは必要 MessageUtils.setInvalidRequestParameterError(response, "Needs to have a \"text\" parameter"); } else { // メッセージ送信 SlackManager.INSTANCE.sendMessage(text, channelid, new SlackManager.FinishCallback<String>() { @Override public void onFinish(String s, Exception error) { if (error == null) { setResult(response, DConnectMessage.RESULT_OK); } else { MessageUtils.setUnknownError(response); setResult(response, DConnectMessage.RESULT_ERROR); } SlackMessageHookDeviceService service = (SlackMessageHookDeviceService) getContext(); service.sendResponse(response); } }); return false; } } else { try { // ファイルアップロード URL url = new URL(resource); String origin = getContext().getPackageName(); SlackManager.INSTANCE.uploadFile(text, channelid, url, origin, new SlackManager.FinishCallback<JSONObject>() { @Override public void onFinish(JSONObject jsonObject, Exception error) { if (error == null) { setResult(response, DConnectMessage.RESULT_OK); } else { MessageUtils.setUnknownError(response); setResult(response, DConnectMessage.RESULT_ERROR); } SlackMessageHookDeviceService service = (SlackMessageHookDeviceService) getContext(); service.sendResponse(response); } }); return false; } catch (MalformedURLException e) { MessageUtils.setInvalidRequestParameterError(response, "Invalid resource url"); } } return true; } }; /** * メッセージ取得API. * メッセージ履歴の最新の一件を返却する. */ private final DConnectApi mGetOnMessageApi = new GetApi() { @Override public String getAttribute() { return ATTRIBUTE_ONMESSAGE; } @Override public boolean onRequest(final Intent request, final Intent response) { // ServiceIDチェック String serviceId = getServiceID(request); if (checkServiceId(serviceId, response)) { return true; } // 接続チェック if (!SlackManager.INSTANCE.isConnected()) { MessageUtils.setUnknownError(response, "Not connected to the Slack server"); return true; } new Thread() { @Override public void run() { // 履歴を返す SlackMessageHookDeviceService service = (SlackMessageHookDeviceService) getContext(); List<Bundle> history = service.getHistory(); if (history.size() > 0) { response.putExtra(PARAM_MESSAGE, history.get(history.size() - 1)); } setResult(response, DConnectMessage.RESULT_OK); service.sendResponse(response); } }.start(); return false; } }; /** * メッセージイベント登録API */ private final DConnectApi mOnPutOnMessageReceivedApi = new PutApi() { @Override public String getAttribute() { return ATTRIBUTE_ONMESSAGE; } @Override public boolean onRequest(final Intent request, final Intent response) { if (!SlackManager.INSTANCE.isConnected()) { MessageUtils.setUnknownError(response, "Not connected to the Slack server"); return true; } EventError error = EventManager.INSTANCE.addEvent(request); switch (error) { case NONE: setResult(response, DConnectMessage.RESULT_OK); break; case INVALID_PARAMETER: MessageUtils.setInvalidRequestParameterError(response); break; default: MessageUtils.setUnknownError(response); break; } return true; } }; /** * メッセージイベント解除API */ private final DConnectApi mOnDeleteOnMessageReceivedApi = new DeleteApi() { @Override public String getAttribute() { return ATTRIBUTE_ONMESSAGE; } @Override public boolean onRequest(final Intent request, final Intent response) { if (!SlackManager.INSTANCE.isConnected()) { MessageUtils.setUnknownError(response, "Not connected to the Slack server"); return true; } EventError error = EventManager.INSTANCE.removeEvent(request); switch (error) { case NONE: setResult(response, DConnectMessage.RESULT_OK); break; case INVALID_PARAMETER: MessageUtils.setInvalidRequestParameterError(response); break; default: MessageUtils.setUnknownError(response); break; } return true; } }; private boolean getMessage(Intent request, final Intent response) { // ServiceIDチェック String serviceId = getServiceID(request); if (checkServiceId(serviceId, response)) { return true; } // 接続チェック if (!SlackManager.INSTANCE.isConnected()) { MessageUtils.setUnknownError(response, "Not connected to the Slack server"); return true; } new Thread() { @Override public void run() { // 履歴を返す SlackMessageHookDeviceService service = (SlackMessageHookDeviceService) getContext(); List<Bundle> history = service.getHistory(); Bundle[] bundles = new Bundle[history.size()]; history.toArray(bundles); response.putExtra(PARAM_MESSAGES, bundles); setResult(response, DConnectMessage.RESULT_OK); service.sendResponse(response); } }.start(); return false; } }