From 6792a779c3e279531ca6a6efc236adc5ed956fed Mon Sep 17 00:00:00 2001 From: pppscn <35696959@qq.com> Date: Thu, 11 Jan 2024 22:53:57 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A`=E9=A3=9E=E4=B9=A6?= =?UTF-8?q?=E7=BE=A4=E6=9C=BA=E5=99=A8=E4=BA=BA`=E5=92=8C`=E9=A3=9E?= =?UTF-8?q?=E4=B9=A6=E4=BC=81=E4=B8=9A=E5=BA=94=E7=94=A8`=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E8=87=AA=E5=AE=9A=E4=B9=89`=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=8D=A1=E7=89=87`=E6=A8=A1=E6=9D=BF=20#381=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=EF=BC=9A`=E9=A3=9E=E4=B9=A6=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=BA=94=E7=94=A8`=E6=94=AF=E6=8C=81=E6=8C=87=E5=AE=9A`?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=8E=A5=E6=94=B6=E8=80=85ID=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../idormy/sms/forwarder/entity/MsgInfo.kt | 63 +++++++- .../entity/setting/FeishuAppSetting.kt | 13 ++ .../forwarder/entity/setting/FeishuSetting.kt | 1 + .../sms/forwarder/fragment/SendersFragment.kt | 1 + .../fragment/senders/FeishuAppFragment.kt | 66 +++++++- .../fragment/senders/FeishuFragment.kt | 53 ++++++- .../forwarder/utils/sender/FeishuAppUtils.kt | 13 +- .../sms/forwarder/utils/sender/FeishuUtils.kt | 17 ++- .../res/layout/fragment_senders_feishu.xml | 88 ++++++++++- .../layout/fragment_senders_feishu_app.xml | 141 +++++++++++++++++- app/src/main/res/values-en/strings.xml | 6 + app/src/main/res/values-zh-rCN/strings.xml | 6 + app/src/main/res/values-zh-rTW/strings.xml | 6 + app/src/main/res/values/strings.xml | 6 + 14 files changed, 447 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/com/idormy/sms/forwarder/entity/MsgInfo.kt b/app/src/main/java/com/idormy/sms/forwarder/entity/MsgInfo.kt index 8ea6d655..4974f6f9 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/entity/MsgInfo.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/entity/MsgInfo.kt @@ -2,12 +2,13 @@ package com.idormy.sms.forwarder.entity import android.annotation.SuppressLint import android.text.TextUtils -import com.idormy.sms.forwarder.utils.Log +import com.google.gson.Gson import com.idormy.sms.forwarder.App import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.utils.AppUtils import com.idormy.sms.forwarder.utils.BatteryUtils import com.idormy.sms.forwarder.utils.HttpServerUtils +import com.idormy.sms.forwarder.utils.Log import com.idormy.sms.forwarder.utils.SettingUtils import com.idormy.sms.forwarder.utils.SettingUtils.Companion.enableSmsTemplate import com.idormy.sms.forwarder.utils.SettingUtils.Companion.extraDeviceMark @@ -72,6 +73,10 @@ data class MsgInfo( .replace(getString(R.string.tag_device_name), deviceMark) .replace(getString(R.string.tag_app_version), versionName) .replace(getString(R.string.tag_call_type), callTypeMap[callType.toString()] ?: getString(R.string.unknown_call)) + .replace(getString(R.string.tag_battery_pct), TaskUtils.batteryPct.toString()) + .replace(getString(R.string.tag_battery_status), BatteryUtils.getStatus(TaskUtils.batteryStatus)) + .replace(getString(R.string.tag_battery_plugged), BatteryUtils.getPlugged(TaskUtils.batteryPlugged)) + .replace(getString(R.string.tag_battery_info), TaskUtils.batteryInfo) .trim() return replaceLocationTag(replaceAppName(regexReplace(titleForSend, regexReplace), from)) } @@ -129,6 +134,42 @@ data class MsgInfo( return replaceLocationTag(replaceAppName(regexReplace(smsVoForSend, regexReplace), from)) } + @SuppressLint("SimpleDateFormat") + fun getContentFromJson(jsonTemplate: String): String { + var template = jsonTemplate.replace("null", "") + if (TextUtils.isEmpty(template)) template = getString(R.string.tag_from) + val deviceMark = extraDeviceMark.trim() + val versionName = AppUtils.getAppVersionName() + val splitSimInfo = simInfo.split("#####") + var title = splitSimInfo.getOrElse(0) { simInfo } + title = jsonInnerStr(title) + var scheme = splitSimInfo.getOrElse(1) { "" } + scheme = jsonInnerStr(scheme) + from = jsonInnerStr(from) + content = jsonInnerStr(content) + + val msgForSend: String = template.replace(getString(R.string.tag_from), from) + .replace(getString(R.string.tag_package_name), from) + .replace(getString(R.string.tag_sms), content) + .replace(getString(R.string.tag_msg), content) + .replace(getString(R.string.tag_card_slot), title) + .replace(getString(R.string.tag_card_subid), subId.toString()) + .replace(getString(R.string.tag_title), title) + .replace(getString(R.string.tag_scheme), scheme) + .replace(getString(R.string.tag_uid), uid.toString()) + .replace(getString(R.string.tag_receive_time), jsonInnerStr(SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date))) + .replace(getString(R.string.tag_current_time), jsonInnerStr(SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date()))) + .replace(getString(R.string.tag_device_name), jsonInnerStr(deviceMark)) + .replace(getString(R.string.tag_app_version), jsonInnerStr(versionName)) + .replace(getString(R.string.tag_call_type), jsonInnerStr(callTypeMap[callType.toString()] ?: getString(R.string.unknown_call))) + .replace(getString(R.string.tag_battery_pct), jsonInnerStr(TaskUtils.batteryPct.toString())) + .replace(getString(R.string.tag_battery_status), jsonInnerStr(BatteryUtils.getStatus(TaskUtils.batteryStatus))) + .replace(getString(R.string.tag_battery_plugged), jsonInnerStr(BatteryUtils.getPlugged(TaskUtils.batteryPlugged))) + .replace(getString(R.string.tag_battery_info), jsonInnerStr(TaskUtils.batteryInfo)) + .trim() + return replaceLocationTag(replaceAppName(msgForSend, from, true), true) + } + //正则替换内容 private fun regexReplace(content: String, regexReplace: String): String { return if (TextUtils.isEmpty(regexReplace)) content else try { @@ -150,7 +191,7 @@ data class MsgInfo( } //替换{{APP名称}}标签 - private fun replaceAppName(content: String, packageName: String): String { + private fun replaceAppName(content: String, packageName: String, needJson: Boolean = false): String { if (TextUtils.isEmpty(content)) return content if (content.indexOf(getString(R.string.tag_app_name)) == -1) return content @@ -171,18 +212,32 @@ data class MsgInfo( } } } + if (needJson) { + appName = jsonInnerStr(appName) + } return content.replace(getString(R.string.tag_app_name), appName) } //替换 {{定位信息}} 标签 - private fun replaceLocationTag(content: String): String { + private fun replaceLocationTag(content: String, needJson: Boolean = false): String { if (TextUtils.isEmpty(content)) return content if (content.indexOf(getString(R.string.tag_location)) == -1) return content - val location = HttpServerUtils.apiLocationCache.toString() + var location = HttpServerUtils.apiLocationCache.toString() + if (needJson) { + location = jsonInnerStr(location) + } return content.replace(getString(R.string.tag_location), location) } + private fun jsonInnerStr(string: String?): String { + if (string == null) return "null" + if (string == "") return "\"\"" + + val jsonStr: String = Gson().toJson(string) + return if (jsonStr.length >= 2) jsonStr.substring(1, jsonStr.length - 1) else jsonStr + } + override fun toString(): String { return "MsgInfo{" + "mobile='" + from + '\'' + diff --git a/app/src/main/java/com/idormy/sms/forwarder/entity/setting/FeishuAppSetting.kt b/app/src/main/java/com/idormy/sms/forwarder/entity/setting/FeishuAppSetting.kt index 5463ee0b..763d9cd9 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/entity/setting/FeishuAppSetting.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/entity/setting/FeishuAppSetting.kt @@ -10,8 +10,21 @@ data class FeishuAppSetting( val receiveId: String = "", val msgType: String = "interactive", val titleTemplate: String = "", + val receiveIdType: String = "user_id", + val messageCard: String = "", //自定义消息卡片 ) : Serializable { + fun getReceiveIdTypeCheckId(): Int { + return when (receiveIdType) { + "open_id" -> R.id.rb_receive_id_type_open_id + "user_id" -> R.id.rb_receive_id_type_user_id + "union_id" -> R.id.rb_receive_id_type_union_id + "email" -> R.id.rb_receive_id_type_email + "chat_id" -> R.id.rb_receive_id_type_chat_id + else -> R.id.rb_receive_id_type_user_id + } + } + fun getMsgTypeCheckId(): Int { return if (msgType == null || msgType == "interactive") { R.id.rb_msg_type_interactive diff --git a/app/src/main/java/com/idormy/sms/forwarder/entity/setting/FeishuSetting.kt b/app/src/main/java/com/idormy/sms/forwarder/entity/setting/FeishuSetting.kt index 621ebc7a..fd5a937a 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/entity/setting/FeishuSetting.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/entity/setting/FeishuSetting.kt @@ -8,6 +8,7 @@ data class FeishuSetting( val secret: String? = "", val msgType: String? = "interactive", val titleTemplate: String? = "", + val messageCard: String = "", //自定义消息卡片 ) : Serializable { fun getMsgTypeCheckId(): Int { diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/SendersFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/SendersFragment.kt index 98ff1e1a..ff28295b 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/SendersFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/SendersFragment.kt @@ -328,6 +328,7 @@ class SendersFragment : BaseFragment(), .setNewActivity(true) .putInt(KEY_SENDER_TYPE, pos) //注意:目前刚好是这个顺序而已 .open(this) + dialog.dismiss() } catch (e: Exception) { e.printStackTrace() Log.e(TAG, "onItemClick error: ${e.message}") diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/FeishuAppFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/FeishuAppFragment.kt index 1c392556..2a7a6528 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/FeishuAppFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/FeishuAppFragment.kt @@ -94,6 +94,16 @@ class FeishuAppFragment : BaseFragment(), View } }) + binding!!.rgMsgType.setOnCheckedChangeListener { _, checkedId -> + if (checkedId == R.id.rb_msg_type_interactive) { + binding!!.layoutTitleTemplate.visibility = View.VISIBLE + binding!!.layoutMessageCard.visibility = View.VISIBLE + } else { + binding!!.layoutTitleTemplate.visibility = View.GONE + binding!!.layoutMessageCard.visibility = View.GONE + } + } + //新增 if (senderId <= 0) { titleBar?.setSubTitle(getString(R.string.add_sender)) @@ -128,16 +138,23 @@ class FeishuAppFragment : BaseFragment(), View if (settingVo != null) { binding!!.etAppId.setText(settingVo.appId) binding!!.etAppSecret.setText(settingVo.appSecret) - binding!!.etUserId.setText(settingVo.receiveId) + binding!!.rgReceiveIdType.check(settingVo.getReceiveIdTypeCheckId()) + binding!!.etReceiveId.setText(settingVo.receiveId) binding!!.rgMsgType.check(settingVo.getMsgTypeCheckId()) binding!!.etTitleTemplate.setText(settingVo.titleTemplate) + binding!!.etMessageCard.setText(settingVo.messageCard) } } }) } override fun initListeners() { + binding!!.btInsertSenderToTitle.setOnClickListener(this) + binding!!.btInsertExtraToTitle.setOnClickListener(this) + binding!!.btInsertTimeToTitle.setOnClickListener(this) + binding!!.btInsertDeviceNameToTitle.setOnClickListener(this) binding!!.btInsertSender.setOnClickListener(this) + binding!!.btInsertContent.setOnClickListener(this) binding!!.btInsertExtra.setOnClickListener(this) binding!!.btInsertTime.setOnClickListener(this) binding!!.btInsertDeviceName.setOnClickListener(this) @@ -151,27 +168,53 @@ class FeishuAppFragment : BaseFragment(), View override fun onClick(v: View) { try { val etTitleTemplate: EditText = binding!!.etTitleTemplate + val etMessageCard: EditText = binding!!.etMessageCard when (v.id) { - R.id.bt_insert_sender -> { + R.id.bt_insert_sender_to_title -> { CommonUtils.insertOrReplaceText2Cursor(etTitleTemplate, getString(R.string.tag_from)) return } - R.id.bt_insert_extra -> { + R.id.bt_insert_extra_to_title -> { CommonUtils.insertOrReplaceText2Cursor(etTitleTemplate, getString(R.string.tag_card_slot)) return } - R.id.bt_insert_time -> { + R.id.bt_insert_time_to_title -> { CommonUtils.insertOrReplaceText2Cursor(etTitleTemplate, getString(R.string.tag_receive_time)) return } - R.id.bt_insert_device_name -> { + R.id.bt_insert_device_name_to_title -> { CommonUtils.insertOrReplaceText2Cursor(etTitleTemplate, getString(R.string.tag_device_name)) return } + R.id.bt_insert_sender -> { + CommonUtils.insertOrReplaceText2Cursor(etMessageCard, getString(R.string.tag_from)) + return + } + + R.id.bt_insert_content -> { + CommonUtils.insertOrReplaceText2Cursor(etMessageCard, getString(R.string.tag_sms)) + return + } + + R.id.bt_insert_extra -> { + CommonUtils.insertOrReplaceText2Cursor(etMessageCard, getString(R.string.tag_card_slot)) + return + } + + R.id.bt_insert_time -> { + CommonUtils.insertOrReplaceText2Cursor(etMessageCard, getString(R.string.tag_receive_time)) + return + } + + R.id.bt_insert_device_name -> { + CommonUtils.insertOrReplaceText2Cursor(etMessageCard, getString(R.string.tag_device_name)) + return + } + R.id.btn_test -> { mCountDownHelper?.start() Thread { @@ -239,15 +282,24 @@ class FeishuAppFragment : BaseFragment(), View private fun checkSetting(): FeishuAppSetting { val appId = binding!!.etAppId.text.toString().trim() val appSecret = binding!!.etAppSecret.text.toString().trim() - val receiveId = binding!!.etUserId.text.toString().trim() + val receiveId = binding!!.etReceiveId.text.toString().trim() if (TextUtils.isEmpty(appId) || TextUtils.isEmpty(appSecret) || TextUtils.isEmpty(receiveId)) { throw Exception(getString(R.string.invalid_feishu_app_parameter)) } + val receiveIdType = when (binding!!.rgReceiveIdType.checkedRadioButtonId) { + R.id.rb_receive_id_type_open_id -> "open_id" + R.id.rb_receive_id_type_user_id -> "user_id" + R.id.rb_receive_id_type_union_id -> "union_id" + R.id.rb_receive_id_type_email -> "email" + R.id.rb_receive_id_type_chat_id -> "chat_id" + else -> "user_id" + } val msgType = if (binding!!.rgMsgType.checkedRadioButtonId == R.id.rb_msg_type_interactive) "interactive" else "text" val title = binding!!.etTitleTemplate.text.toString().trim() + val messageCard = binding!!.etMessageCard.text.toString().trim() - return FeishuAppSetting(appId, appSecret, receiveId, msgType, title) + return FeishuAppSetting(appId, appSecret, receiveId, msgType, title, receiveIdType, messageCard) } override fun onDestroyView() { diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/FeishuFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/FeishuFragment.kt index 524bd971..b6fa686b 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/FeishuFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/FeishuFragment.kt @@ -94,6 +94,16 @@ class FeishuFragment : BaseFragment(), View.OnCli } }) + binding!!.rgMsgType.setOnCheckedChangeListener { _, checkedId -> + if (checkedId == R.id.rb_msg_type_interactive) { + binding!!.layoutTitleTemplate.visibility = View.VISIBLE + binding!!.layoutMessageCard.visibility = View.VISIBLE + } else { + binding!!.layoutTitleTemplate.visibility = View.GONE + binding!!.layoutMessageCard.visibility = View.GONE + } + } + //新增 if (senderId <= 0) { titleBar?.setSubTitle(getString(R.string.add_sender)) @@ -127,13 +137,19 @@ class FeishuFragment : BaseFragment(), View.OnCli binding!!.etSecret.setText(settingVo.secret) binding!!.rgMsgType.check(settingVo.getMsgTypeCheckId()) binding!!.etTitleTemplate.setText(settingVo.titleTemplate) + binding!!.etMessageCard.setText(settingVo.messageCard) } } }) } override fun initListeners() { + binding!!.btInsertSenderToTitle.setOnClickListener(this) + binding!!.btInsertExtraToTitle.setOnClickListener(this) + binding!!.btInsertTimeToTitle.setOnClickListener(this) + binding!!.btInsertDeviceNameToTitle.setOnClickListener(this) binding!!.btInsertSender.setOnClickListener(this) + binding!!.btInsertContent.setOnClickListener(this) binding!!.btInsertExtra.setOnClickListener(this) binding!!.btInsertTime.setOnClickListener(this) binding!!.btInsertDeviceName.setOnClickListener(this) @@ -147,27 +163,53 @@ class FeishuFragment : BaseFragment(), View.OnCli override fun onClick(v: View) { try { val etTitleTemplate: EditText = binding!!.etTitleTemplate + val etMessageCard: EditText = binding!!.etMessageCard when (v.id) { - R.id.bt_insert_sender -> { + R.id.bt_insert_sender_to_title -> { CommonUtils.insertOrReplaceText2Cursor(etTitleTemplate, getString(R.string.tag_from)) return } - R.id.bt_insert_extra -> { + R.id.bt_insert_extra_to_title -> { CommonUtils.insertOrReplaceText2Cursor(etTitleTemplate, getString(R.string.tag_card_slot)) return } - R.id.bt_insert_time -> { + R.id.bt_insert_time_to_title -> { CommonUtils.insertOrReplaceText2Cursor(etTitleTemplate, getString(R.string.tag_receive_time)) return } - R.id.bt_insert_device_name -> { + R.id.bt_insert_device_name_to_title -> { CommonUtils.insertOrReplaceText2Cursor(etTitleTemplate, getString(R.string.tag_device_name)) return } + R.id.bt_insert_sender -> { + CommonUtils.insertOrReplaceText2Cursor(etMessageCard, getString(R.string.tag_from)) + return + } + + R.id.bt_insert_content -> { + CommonUtils.insertOrReplaceText2Cursor(etMessageCard, getString(R.string.tag_sms)) + return + } + + R.id.bt_insert_extra -> { + CommonUtils.insertOrReplaceText2Cursor(etMessageCard, getString(R.string.tag_card_slot)) + return + } + + R.id.bt_insert_time -> { + CommonUtils.insertOrReplaceText2Cursor(etMessageCard, getString(R.string.tag_receive_time)) + return + } + + R.id.bt_insert_device_name -> { + CommonUtils.insertOrReplaceText2Cursor(etMessageCard, getString(R.string.tag_device_name)) + return + } + R.id.btn_test -> { mCountDownHelper?.start() Thread { @@ -235,8 +277,9 @@ class FeishuFragment : BaseFragment(), View.OnCli val secret = binding!!.etSecret.text.toString().trim() val msgType = if (binding!!.rgMsgType.checkedRadioButtonId == R.id.rb_msg_type_interactive) "interactive" else "text" val title = binding!!.etTitleTemplate.text.toString().trim() + val messageCard = binding!!.etMessageCard.text.toString().trim() - return FeishuSetting(webhook, secret, msgType, title) + return FeishuSetting(webhook, secret, msgType, title, messageCard) } override fun onDestroyView() { diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/sender/FeishuAppUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/sender/FeishuAppUtils.kt index bd9ac1b3..d642ab71 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/sender/FeishuAppUtils.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/sender/FeishuAppUtils.kt @@ -91,7 +91,7 @@ class FeishuAppUtils private constructor() { logId: Long = 0L, msgId: Long = 0L ) { - val requestUrl = "https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=user_id" + val requestUrl = "https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=${setting.receiveIdType}" Log.d(TAG, "requestUrl:$requestUrl") val content: String = if (rule != null) { @@ -106,7 +106,16 @@ class FeishuAppUtils private constructor() { } else { msgInfo.getTitleForSend(setting.titleTemplate) } - "{\"elements\":[{\"tag\":\"markdown\",\"content\":\"**[{{MSG_TITLE}}]({{MSG_URL}})**\\n --------------\\n{{MSG_CONTENT}}\"}]}".trimIndent().replace("{{MSG_TITLE}}", jsonInnerStr(title)).replace("{{MSG_URL}}", jsonInnerStr("https://github.com/pppscn/SmsForwarder")).replace("{{MSG_CONTENT}}", jsonInnerStr(content)) + if (TextUtils.isEmpty(setting.messageCard.trim())) { + "{\"elements\":[{\"tag\":\"markdown\",\"content\":\"**[{{MSG_TITLE}}]({{MSG_URL}})**\\n --------------\\n{{MSG_CONTENT}}\"}]}".trimIndent().replace("{{MSG_TITLE}}", jsonInnerStr(title)).replace("{{MSG_URL}}", jsonInnerStr("https://github.com/pppscn/SmsForwarder")).replace("{{MSG_CONTENT}}", jsonInnerStr(content)) + } else { + msgInfo.getContentFromJson( + setting.messageCard.trimIndent() + .replace("{{MSG_TITLE}}", jsonInnerStr(title)) + .replace("{{MSG_URL}}", jsonInnerStr("https://github.com/pppscn/SmsForwarder")) + .replace("{{MSG_CONTENT}}", jsonInnerStr(content)) + ) + } } else { "{\"text\":\"{{MSG_CONTENT}}\"}".trimIndent().replace("{{MSG_CONTENT}}", jsonInnerStr(content)) } diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/sender/FeishuUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/sender/FeishuUtils.kt index fc962fea..968c6a0c 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/sender/FeishuUtils.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/sender/FeishuUtils.kt @@ -1,5 +1,6 @@ package com.idormy.sms.forwarder.utils.sender +import android.text.TextUtils import android.util.Base64 import com.google.gson.Gson import com.idormy.sms.forwarder.database.entity.Rule @@ -121,8 +122,20 @@ class FeishuUtils private constructor() { val requestMsg: String if (setting.msgType == null || setting.msgType == "interactive") { msgMap["msg_type"] = "interactive" - msgMap["card"] = "{{CARD_BODY}}" - requestMsg = Gson().toJson(msgMap).replace("\"{{CARD_BODY}}\"", buildMsg(title, content, from, msgInfo.date)) + if (TextUtils.isEmpty(setting.messageCard.trim())) { + msgMap["card"] = "{{CARD_BODY}}" + requestMsg = Gson().toJson(msgMap).replace("\"{{CARD_BODY}}\"", buildMsg(title, content, from, msgInfo.date)) + } else { + val msgTime = jsonInnerStr(SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(msgInfo.date)) + msgMap["card"] = msgInfo.getContentFromJson( + setting.messageCard.trimIndent() + .replace("{{MSG_TITLE}}", jsonInnerStr(title)) + .replace("{{MSG_TIME}}", msgTime) + .replace("{{MSG_FROM}}", jsonInnerStr(from)) + .replace("{{MSG_CONTENT}}", jsonInnerStr(content)) + ) + requestMsg = Gson().toJson(msgMap) + } } else { msgMap["msg_type"] = "text" val contentMap: MutableMap = mutableMapOf() diff --git a/app/src/main/res/layout/fragment_senders_feishu.xml b/app/src/main/res/layout/fragment_senders_feishu.xml index ca46861f..0f7ff94f 100644 --- a/app/src/main/res/layout/fragment_senders_feishu.xml +++ b/app/src/main/res/layout/fragment_senders_feishu.xml @@ -123,7 +123,7 @@ @@ -190,6 +190,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_senders_feishu_app.xml b/app/src/main/res/layout/fragment_senders_feishu_app.xml index 924eeda0..3c230ac4 100644 --- a/app/src/main/res/layout/fragment_senders_feishu_app.xml +++ b/app/src/main/res/layout/fragment_senders_feishu_app.xml @@ -95,6 +95,53 @@ + + + + + + + + + + + + + + + + + + + + @@ -220,6 +267,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 6bfc0b42..9d887da6 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -323,10 +323,12 @@ Email Title Webhook Secret (optional) + Receive Id Type" Msg Type Text Interactive Interactive Title + Message Card Json Customize API Corp ID Agent ID @@ -1331,4 +1333,8 @@ 【Logs】 Close Logs Stopped + Open ID + Union ID + Chat ID + Receive ID diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index f29dcf20..8da1da3c 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -324,10 +324,12 @@ 邮件主题 Webhook 地址 加签 Secret (没有可不填) + 消息接收者ID类型 消息类型 纯文本 消息卡片 标题模板 + 自定义消息卡片 自定义API 企业ID AgentId @@ -1332,4 +1334,8 @@ 【日志】 关闭日志 已停止 + Open ID + Union ID + Chat ID + 消息接收者ID diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index db6f0c74..9b25498d 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -324,10 +324,12 @@ 郵件主題 Webhook 地址 加簽 Secret (沒有可不填) + 訊息接收者ID類型 消息類型 純文本 消息卡片 標題模板 + 自定義消息卡片 自定義API 企業ID AgentId @@ -1333,4 +1335,8 @@ 【日誌】 關閉日誌 已停止 + Open ID + Union ID + Chat ID + 訊息接收者ID diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8017ff56..932df0c3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -324,10 +324,12 @@ 邮件主题 Webhook 地址 加签 Secret (没有可不填) + 消息接收者ID类型 消息类型 纯文本 消息卡片 标题模板 + 自定义消息卡片 自定义API 企业ID AgentId @@ -1332,4 +1334,8 @@ 【日志】 关闭日志 已停止 + Open ID + Union ID + Chat ID + 消息接收者ID