Skip to content

Commit 349664f

Browse files
committed
feat: Donation request device message (#6913)
A donation request device message is added if >= 100 messages have been sent and delivered. The condition is checked every 30 days since the first message is sent. The message is added only once.
1 parent f5e8c80 commit 349664f

File tree

5 files changed

+55
-0
lines changed

5 files changed

+55
-0
lines changed

deltachat-ffi/deltachat.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7667,6 +7667,9 @@ void dc_event_unref(dc_event_t* event);
76677667
/// @deprecated 2025-06-05
76687668
#define DC_STR_SECUREJOIN_TAKES_LONGER 192
76697669

7670+
/// "❤️ Seems you're enjoying Delta Chat!"… (donation request device message)
7671+
#define DC_STR_DONATION_REQUEST 193
7672+
76707673
/// "Contact". Deprecated, currently unused.
76717674
#define DC_STR_CONTACT 200
76727675

src/chat.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2967,6 +2967,9 @@ async fn prepare_send_msg(
29672967
let row_ids = create_send_msg_jobs(context, msg)
29682968
.await
29692969
.context("Failed to create send jobs")?;
2970+
if !row_ids.is_empty() {
2971+
donation_request_maybe(context).await.log_err(context).ok();
2972+
}
29702973
Ok(row_ids)
29712974
}
29722975

@@ -3211,6 +3214,31 @@ pub async fn send_videochat_invitation(context: &Context, chat_id: ChatId) -> Re
32113214
send_msg(context, chat_id, &mut msg).await
32123215
}
32133216

3217+
async fn donation_request_maybe(context: &Context) -> Result<()> {
3218+
let secs_between_checks = 30 * 24 * 60 * 60;
3219+
let now = time();
3220+
let ts = context
3221+
.get_config_i64(Config::DonationRequestNextCheck)
3222+
.await?;
3223+
if ts > now {
3224+
return Ok(());
3225+
}
3226+
let msg_cnt = context.sql.count(
3227+
"SELECT COUNT(*) FROM msgs WHERE state>=? AND hidden=0",
3228+
(MessageState::OutDelivered,),
3229+
);
3230+
let ts = if ts == 0 || msg_cnt.await? < 100 {
3231+
now.saturating_add(secs_between_checks)
3232+
} else {
3233+
let mut msg = Message::new_text(stock_str::donation_request(context).await);
3234+
add_device_msg(context, None, Some(&mut msg)).await?;
3235+
i64::MAX
3236+
};
3237+
context
3238+
.set_config_internal(Config::DonationRequestNextCheck, Some(&ts.to_string()))
3239+
.await
3240+
}
3241+
32143242
/// Chat message list request options.
32153243
#[derive(Debug)]
32163244
pub struct MessageListOptions {

src/config.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,9 @@ pub enum Config {
369369
#[strum(props(default = "0"))]
370370
DisableIdle,
371371

372+
/// Timestamp of the next check for donation request need.
373+
DonationRequestNextCheck,
374+
372375
/// Defines the max. size (in bytes) of messages downloaded automatically.
373376
/// 0 = no limit.
374377
#[strum(props(default = "0"))]

src/context.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1054,6 +1054,12 @@ impl Context {
10541054
.await?
10551055
.to_string(),
10561056
);
1057+
res.insert(
1058+
"donation_request_next_check",
1059+
self.get_config_i64(Config::DonationRequestNextCheck)
1060+
.await?
1061+
.to_string(),
1062+
);
10571063
res.insert(
10581064
"first_key_contacts_msg_id",
10591065
self.sql

src/stock_str.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,16 @@ pub enum StockMessage {
413413

414414
#[strum(props(fallback = "Establishing guaranteed end-to-end encryption, please wait…"))]
415415
SecurejoinWait = 190,
416+
417+
#[strum(props(fallback = "❤️ Seems you're enjoying Delta Chat!
418+
419+
Please consider donating to help that Delta Chat stays free for everyone.
420+
421+
While Delta Chat is free to use and open source, development costs money.
422+
Help keeping us to keep Delta Chat independent and make it more awesome in the future.
423+
424+
https://delta.chat/donate"))]
425+
DonationRequest = 193,
416426
}
417427

418428
impl StockMessage {
@@ -785,6 +795,11 @@ pub(crate) async fn securejoin_wait(context: &Context) -> String {
785795
translated(context, StockMessage::SecurejoinWait).await
786796
}
787797

798+
/// Stock string: `❤️ Seems you're enjoying Delta Chat!`…
799+
pub(crate) async fn donation_request(context: &Context) -> String {
800+
translated(context, StockMessage::DonationRequest).await
801+
}
802+
788803
/// Stock string: `Scan to chat with %1$s`.
789804
pub(crate) async fn setup_contact_qr_description(
790805
context: &Context,

0 commit comments

Comments
 (0)