Skip to content

Commit 12213b3

Browse files
authored
feat: Update payload builder to support formatted titles (#336)
1 parent e314db4 commit 12213b3

File tree

6 files changed

+48
-32
lines changed

6 files changed

+48
-32
lines changed

docs/modules/ROOT/pages/index.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -618,7 +618,7 @@ A Trigger defines actions to take when monitored conditions are met. Triggers ca
618618
"value": "https://hooks.slack.com/services/A/B/C"
619619
},
620620
"message": {
621-
"title": "large_transfer_slack triggered",
621+
"title": "${monitor.name} triggered",
622622
"body": "Large transfer of ${events.0.args.value} USDC from ${events.0.args.from} to ${events.0.args.to} | https://etherscan.io/tx/${transaction.hash}#eventlog"
623623
}
624624
}

examples/config/triggers/discord_notifications.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"value": "https://discord.com/api/webhooks/123-456-789"
99
},
1010
"message": {
11-
"title": "large_transfer_discord triggered",
11+
"title": "${monitor.name} triggered",
1212
"body": "Large transfer of ${events.0.args.value} USDC from ${events.0.args.from} to ${events.0.args.to} | https://etherscan.io/tx/${transaction.hash}#eventlog"
1313
}
1414
}
@@ -22,7 +22,7 @@
2222
"value": "https://discord.com/api/webhooks/123-456-789"
2323
},
2424
"message": {
25-
"title": "large_transfer_discord triggered",
25+
"title": "${monitor.name} triggered",
2626
"body": "**Large transfer** of **${events.0.args.value} USDC** from `${events.0.args.from}` to `${events.0.args.to}`\n[View on Etherscan](https://etherscan.io/tx/${transaction.hash}#eventlog)"
2727
}
2828
}

examples/config/triggers/slack_notifications.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"value": "https://hooks.slack.com/services/A/B/C"
99
},
1010
"message": {
11-
"title": "large_transfer_slack triggered",
11+
"title": "${monitor.name} triggered",
1212
"body": "Large transfer of ${events.0.args.value} USDC from ${events.0.args.from} to ${events.0.args.to} | https://etherscan.io/tx/${transaction.hash}#eventlog"
1313
}
1414
}
@@ -22,7 +22,7 @@
2222
"value": "https://hooks.slack.com/services/A/B/C"
2323
},
2424
"message": {
25-
"title": "large_transfer_slack triggered",
25+
"title": "${monitor.name} triggered",
2626
"body": "*USDC Transfer Details*\n*Amount:* ${events.0.args.value} USDC\n*From:* ${events.0.args.from}\n*To:* ${events.0.args.to}\n*Transaction:* <https://etherscan.io/tx/${transaction.hash}#eventlog|View on Etherscan>"
2727
}
2828
}

examples/config/triggers/telegram_notifications.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"chat_id": "9876543210",
1111
"disable_web_preview": true,
1212
"message": {
13-
"title": "large_transfer_telegram triggered",
13+
"title": "${monitor.name} triggered",
1414
"body": "Large transfer of ${events.0.args.value} USDC from ${events.0.args.from} to ${events.0.args.to} | https://etherscan.io/tx/${transaction.hash}#eventlog"
1515
}
1616
}
@@ -26,7 +26,7 @@
2626
"chat_id": "9876543210",
2727
"disable_web_preview": true,
2828
"message": {
29-
"title": "large_transfer_telegram triggered",
29+
"title": "${monitor.name} triggered",
3030
"body": "*USDC Transfer Details*\n*Amount:* ${events.0.args.value} USDC\n*From:* ${events.0.args.from}\n*To:* ${events.0.args.to}\n*Transaction:* [View on Etherscan](https://etherscan.io/tx/${transaction.hash}#eventlog)"
3131
}
3232
}

examples/config/triggers/webhook_notifications.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"Content-Type": "application/json"
1717
},
1818
"message": {
19-
"title": "large_transfer_webhook triggered",
19+
"title": "${monitor.name} triggered",
2020
"body": "Large transfer of ${events.0.args.value} USDC from ${events.0.args.from} to ${events.0.args.to} | https://etherscan.io/tx/${transaction.hash}#eventlog"
2121
}
2222
}
@@ -38,7 +38,7 @@
3838
"Content-Type": "application/json"
3939
},
4040
"message": {
41-
"title": "large_transfer_webhook triggered",
41+
"title": "${monitor.name} triggered",
4242
"body": "# USDC Transfer Alert\n\n**Large transfer detected**\n\n- **Amount:** ${events.0.args.value} USDC\n- **From:** `${events.0.args.from}`\n- **To:** `${events.0.args.to}`\n\n[View on Etherscan](https://etherscan.io/tx/${transaction.hash}#eventlog)"
4343
}
4444
}
@@ -60,7 +60,7 @@
6060
"Content-Type": "application/json"
6161
},
6262
"message": {
63-
"title": "large_swap_by_dex_webhook triggered",
63+
"title": "${monitor.name} triggered",
6464
"body": "${monitor.name} triggered because of a large swap of ${functions.0.args.out_min} tokens | https://stellar.expert/explorer/public/tx/${transaction.hash}"
6565
}
6666
}

src/services/notification/payload_builder.rs

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,9 @@ impl WebhookPayloadBuilder for SlackPayloadBuilder {
4646
body_template: &str,
4747
variables: &HashMap<String, String>,
4848
) -> serde_json::Value {
49-
let message = format_template(body_template, variables);
50-
let full_message = format!("*{}*\n\n{}", title, message);
49+
let formatted_title = format_template(title, variables);
50+
let formatted_message = format_template(body_template, variables);
51+
let full_message = format!("*{}*\n\n{}", formatted_title, formatted_message);
5152
json!({
5253
"blocks": [
5354
{
@@ -72,8 +73,9 @@ impl WebhookPayloadBuilder for DiscordPayloadBuilder {
7273
body_template: &str,
7374
variables: &HashMap<String, String>,
7475
) -> serde_json::Value {
75-
let message = format_template(body_template, variables);
76-
let full_message = format!("*{}*\n\n{}", title, message);
76+
let formatted_title = format_template(title, variables);
77+
let formatted_message = format_template(body_template, variables);
78+
let full_message = format!("*{}*\n\n{}", formatted_title, formatted_message);
7779
json!({
7880
"content": full_message
7981
})
@@ -159,11 +161,12 @@ impl WebhookPayloadBuilder for TelegramPayloadBuilder {
159161
variables: &HashMap<String, String>,
160162
) -> serde_json::Value {
161163
// First, substitute variables.
162-
let message = format_template(body_template, variables);
164+
let formatted_title = format_template(title, variables);
165+
let formatted_message = format_template(body_template, variables);
163166

164167
// Then, escape both the title and the formatted message for Telegram MarkdownV2.
165-
let escaped_title = Self::escape_markdown_v2(title);
166-
let escaped_message = Self::escape_markdown_v2(&message);
168+
let escaped_title = Self::escape_markdown_v2(&formatted_title);
169+
let escaped_message = Self::escape_markdown_v2(&formatted_message);
167170

168171
let full_message = format!("*{}* \n\n{}", escaped_title, escaped_message);
169172
json!({
@@ -185,10 +188,11 @@ impl WebhookPayloadBuilder for GenericWebhookPayloadBuilder {
185188
body_template: &str,
186189
variables: &HashMap<String, String>,
187190
) -> serde_json::Value {
188-
let message = format_template(body_template, variables);
191+
let formatted_title = format_template(title, variables);
192+
let formatted_message = format_template(body_template, variables);
189193
json!({
190-
"title": title,
191-
"body": message
194+
"title": formatted_title,
195+
"body": formatted_message
192196
})
193197
}
194198
}
@@ -200,9 +204,12 @@ mod tests {
200204

201205
#[test]
202206
fn test_slack_payload_builder() {
203-
let title = "Test Title";
204-
let message = "Test Message";
205-
let variables = HashMap::from([("value".to_string(), "42".to_string())]);
207+
let title = "Test ${title_value}";
208+
let message = "Test ${message_value}";
209+
let variables = HashMap::from([
210+
("title_value".to_string(), "Title".to_string()),
211+
("message_value".to_string(), "Message".to_string()),
212+
]);
206213
let payload = SlackPayloadBuilder.build_payload(title, message, &variables);
207214
assert_eq!(
208215
payload,
@@ -222,9 +229,12 @@ mod tests {
222229

223230
#[test]
224231
fn test_discord_payload_builder() {
225-
let title = "Test Title";
226-
let message = "Test Message";
227-
let variables = HashMap::from([("value".to_string(), "42".to_string())]);
232+
let title = "Test ${title_value}";
233+
let message = "Test ${message_value}";
234+
let variables = HashMap::from([
235+
("title_value".to_string(), "Title".to_string()),
236+
("message_value".to_string(), "Message".to_string()),
237+
]);
228238
let payload = DiscordPayloadBuilder.build_payload(title, message, &variables);
229239
assert_eq!(
230240
payload,
@@ -240,9 +250,12 @@ mod tests {
240250
chat_id: "12345".to_string(),
241251
disable_web_preview: true,
242252
};
243-
let title = "Test Title";
244-
let message = "Test Message";
245-
let variables = HashMap::from([("value".to_string(), "42".to_string())]);
253+
let title = "Test ${title_value}";
254+
let message = "Test ${message_value}";
255+
let variables = HashMap::from([
256+
("title_value".to_string(), "Title".to_string()),
257+
("message_value".to_string(), "Message".to_string()),
258+
]);
246259
let payload = builder.build_payload(title, message, &variables);
247260
assert_eq!(
248261
payload,
@@ -257,9 +270,12 @@ mod tests {
257270

258271
#[test]
259272
fn test_generic_webhook_payload_builder() {
260-
let title = "Test Title";
261-
let message = "Test Message";
262-
let variables = HashMap::from([("value".to_string(), "42".to_string())]);
273+
let title = "Test ${title_value}";
274+
let message = "Test ${message_value}";
275+
let variables = HashMap::from([
276+
("title_value".to_string(), "Title".to_string()),
277+
("message_value".to_string(), "Message".to_string()),
278+
]);
263279
let payload = GenericWebhookPayloadBuilder.build_payload(title, message, &variables);
264280
assert_eq!(
265281
payload,

0 commit comments

Comments
 (0)