Skip to content

Commit 7e25e28

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 416131b commit 7e25e28

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
@@ -7621,6 +7621,9 @@ void dc_event_unref(dc_event_t* event);
76217621
/// @deprecated 2025-06-05
76227622
#define DC_STR_SECUREJOIN_TAKES_LONGER 192
76237623

7624+
/// "❤️ Seems you're enjoying Delta Chat!"… (donation request device message)
7625+
#define DC_STR_DONATION_REQUEST 193
7626+
76247627
/// "Contact". Deprecated, currently unused.
76257628
#define DC_STR_CONTACT 200
76267629

src/chat.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2908,6 +2908,9 @@ async fn prepare_send_msg(
29082908
let row_ids = create_send_msg_jobs(context, msg)
29092909
.await
29102910
.context("Failed to create send jobs")?;
2911+
if !row_ids.is_empty() {
2912+
donation_request_maybe(context).await.log_err(context).ok();
2913+
}
29112914
Ok(row_ids)
29122915
}
29132916

@@ -3152,6 +3155,31 @@ pub async fn send_videochat_invitation(context: &Context, chat_id: ChatId) -> Re
31523155
send_msg(context, chat_id, &mut msg).await
31533156
}
31543157

3158+
async fn donation_request_maybe(context: &Context) -> Result<()> {
3159+
let secs_between_checks = 30 * 24 * 60 * 60;
3160+
let now = time();
3161+
let ts = context
3162+
.get_config_i64(Config::DonationRequestNextCheck)
3163+
.await?;
3164+
if ts > now {
3165+
return Ok(());
3166+
}
3167+
let msg_cnt = context.sql.count(
3168+
"SELECT COUNT(*) FROM msgs WHERE state>=? AND hidden=0",
3169+
(MessageState::OutDelivered,),
3170+
);
3171+
let ts = if ts == 0 || msg_cnt.await? < 100 {
3172+
now.saturating_add(secs_between_checks)
3173+
} else {
3174+
let mut msg = Message::new_text(stock_str::donation_request(context).await);
3175+
add_device_msg(context, None, Some(&mut msg)).await?;
3176+
i64::MAX
3177+
};
3178+
context
3179+
.set_config_internal(Config::DonationRequestNextCheck, Some(&ts.to_string()))
3180+
.await
3181+
}
3182+
31553183
/// Chat message list request options.
31563184
#[derive(Debug)]
31573185
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
@@ -1041,6 +1041,12 @@ impl Context {
10411041
.await?
10421042
.to_string(),
10431043
);
1044+
res.insert(
1045+
"donation_request_next_check",
1046+
self.get_config_i64(Config::DonationRequestNextCheck)
1047+
.await?
1048+
.to_string(),
1049+
);
10441050

10451051
let elapsed = time_elapsed(&self.creation_time);
10461052
res.insert("uptime", duration_to_str(elapsed));

src/stock_str.rs

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

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

421431
impl StockMessage {
@@ -788,6 +798,11 @@ pub(crate) async fn securejoin_wait(context: &Context) -> String {
788798
translated(context, StockMessage::SecurejoinWait).await
789799
}
790800

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

0 commit comments

Comments
 (0)