From c623343b044f2406ce0abcb1c47f579ead8062f6 Mon Sep 17 00:00:00 2001
From: "B. Petersen"



Delta Chat is a reliable, decentralized and secure messaging app, +
Delta Chat is a reliable, decentralized and secure instant messaging app, available for mobile and desktop platforms.
-Delta Chat feels like Whatsapp or Telegram but you can also use and regard it as an e-mail app. -You can signup anonymously to a variety of interoperable chatmail servers -which are minimal e-mail servers optimized for fast and secure operations. -Or you may use classic e-mail servers and an existing e-mail account -in which case Delta Chat acts as an e-mail app.
- -
To securely setup contact with others scan an invite QR code -or share an invite link. -This is required when using a (default) chatmail-based chat profile -because chatmail servers reject un-encrypted outgoing messages.
- -If you create a chat profile with a classic e-mail address -you may manually create a contact if you know their e-mail address -and then write a message to them -even if the recipient is not using Delta Chat.
- -Anonymous chat profiles with fast, secure and interoperable chatmail servers -which offer instant Push Notifications for iOS and Android devices.
+Instant creation of private chat profiles +with secure and interoperable chatmail relays +that offer instant message delivery, and Push Notifications for iOS and Android devices.
Pervasive multi-profile and multi-device support on all platforms.
+Pervasive multi-profile and +multi-device support on all platforms +and between different chatmail apps.
Interactive web apps in chats for gaming and collaboration
+Interactive in-chat apps for gaming and collaboration
Audited end-to-end encryption +
Audited end-to-end encryption safe against network and server attacks.
Free and Open Source software, both app and server side. -Built on E-mail and Web Internet Standards, -to avoid “yet another standard syndrome (xkcd 927)”
+Free and Open Source software, both app and server side, +built on Internet Standards.
If a message comes from an unknown contact, it appears as a request.
+First, note that Delta Chat is a private messenger. +There is no public discovery, you decide about your contacts.
+ +If you are face to face with your friend or family,
+tap the QR Code icon
+on the main screen.
+Ask your chat partner to scan the QR image
+with their Delta Chat app.
For a remote contact setup, +from the same screen, +click “Copy” or “Share” and send the invite link +through another private chat.
+Now wait while connection gets established.
+ +If both sides are online, they will soon see a chat +and can start messaging securely.
+If one side is offline or in bad network, +the ability to chat is delayed until connectivity is restored.
+Congratulations! +You now will automatically use end-to-end encryption with this contact. +If you add each other to groups, end-to-end encryption will be established among all members.
+ +As being a private messenger, +only friends and family you share your QR code or invite link with can write to you.
+ +Your friends may share your contact with other friends, this appears as a request.
Attach the first contact to the chat of the second using
Attachment Button → Contact.
+You can also add a little introduction message.
The second contact will receive a card then +and can tap it to start chatting with the first contact.
+Yes. Images, videos, files, voice messages etc. are handled as usual.
+Yes. Images, videos, files, voice messages etc. can be sent using the
Attachment-
+or
Voice Message buttons
For performance, images are optimized and sent at a smaller size by default, but you can send it as a “file” to preserve the original.
@@ -228,16 +242,14 @@ receive messages from this person, consider blocking them.A profile is a name, a picture and some additional information for encrypting messages. A profile lives on your device(s) only -and uses a chatmail or a classic e-mail server to transport messages.
+and uses the server only to relay messages.On first installation of Delta Chat a first profile is created.
Later, you can tap your profile image in the upper left corner to Add Profiles or to Switch Profiles.
-You may want to use separate profiles for political, family or work related activities, -or e. g. for a dedicated “spam-profile” with which you register at websites and platforms -that tend to cause unsolicited messages (“spam”) sooner or later.
+You may want to use separate profiles for political, family or work related activities.
You may also wish to learn how to use the same profile on multiple devices.
@@ -253,35 +265,25 @@ that tend to cause unsolicited messages (“spam”) sooner or later.You can add a profile picture in your settings. If you write to your contacts or add them via QR code, they automatically see it as your profile picture.
-Contacts who don’t use Delta Chat do not see the profile picture -(however, of course, they can install Delta Chat :)
For privacy reasons, no one sees your profile picture until you write a message to them.
Your profile picture isn’t sent with every message, but regularly enough that -your contacts will re-receive your profile picture, even if they add a new -device.
-Yes, you can do so under Settings → Profile → Bio. -Your contacts who use Delta Chat will see it -when they view your contact details. -Moreover, it will appear as a classic e-mail signature.
+Once you sent a message to a contact, +they will see it when they view your contact details.You can sometimes see a green dot
next to the avatar of a contact.
-It means they were recently seen in the last 10 minutes:
So this is not a real time online status - -and if someone doesn’t answer right away even though they seem to be online, -don’t worry and give them some space :)
- -On the other hand, others will not always “see that you are online”. -If you have turned off read receipts, -they will not see the green dot -until one of the above conditions are met.
+So this is not a real time online status +and others will as well not always see that you are “online”.
One tick
+means that the message was sent successfully to your provider.
Two ticks
+mean that at least one recipient’s device
+reported back to having received the message.
Recipients may have disabled read-receipts, +so even if you see only one tick, the message may have been read.
+The other way round, two ticks do not automatically mean +that a human has read or understood the message ;)
+Note that you can rely on disappearing messages only as long as you trust your chat partners; @@ -452,36 +451,29 @@ or otherwise save, copy or forward messages before deletion.
Apart from that, if one chat partner uninstalls Delta Chat, -the messages will not get deleted from their email account. -They will most likely also not be decryptable anymore -(as long as they were encrypted in the first place).
+the (anyway encrypted) messages may take longer to get deleted from their server. -By default, Delta Chat stores all messages locally on your device. -If you e.g. want to save storage space at your mail provider, -you can configure Delta Chat -to delete old already-received messages on the server automatically. -They still remain on your device until you delete them there, too.
+If you are using only one device, +messages are deleted At once from the server.
To turn it on, go to Delete Old Messages → Delete Messages from Server -in the “Chats and Media” settings. -You can set a timeframe between “At once” and “After 1 year”. -All e-mails received by Delta Chat will be deleted from the server after this timeframe.
+If you are using Multiple devices, +this option is switched to Automatic, +meaning the server will keep the messages for a while so that all devices have a chance to receive them.
Note that if you use Delta Chat on more than one device, -you need to leave the message on the server with a sufficient timeframe -so that the other device(s) can download them, too.
+If you are no longer using additional devices, +you can switch the option manually at Delete Old Messages → Delete Messages from Server.
If you are using more than one chat profile, +you can remove single ones in the top profile switcher menu (on Android and iOS), +or in the sidebar with a right click (in the Desktop app). +Chat profiles are only removed on the device where deletion was triggered. +Chat profiles on other devices will continue to fully function.
+ +If you use a single default chat profile you can simply uninstall the app. +This will still automatically trigger deletion of all associated address data on the chatmail server. +For more info, please refer to nine.testrun.org address-deletion +or the respective page from your chosen 3rd party chatmail server.
+Groups let several people chat together privately with equal rights.
+ +Anyone can +change the group name or avatar, +add or remove members (including the creator), +set disappearing messages, +and delete their own messages from all member’s devices.
+ +Because all members have the same rights, groups work best among trusted friends and family.
All group members have the same rights. +For this reason, everyone can delete any member or add new ones.
+To add or delete members, tap the group name in the chat and select the member to add or remove.
+If the member is not yet in your contact list, but face to face with you,
+from the same screen, show a QR code.
+Ask your chat partner to scan the QR image with their Delta Chat app by tapping
+
on the main screen.
For a remote member addition, +click “Copy” or “Share” and send the invite link +through another private chat to the new member.
+QR code and invite link can be reused to add several members. +However, since groups are meant for trusted people, avoid sharing them publicly.
You can duplicate a group to start a separate discussion +or to exclude members without them noticing.
+ +Open the group profile and tap Clone Chat (Android/iOS), +or right-click the group in the chat list (Desktop).
+Set a new name, choose an avatar, and adjust the member list if needed.
+The new group is fully independent from the original, +which continues to work as before.
+As of May 2024, classic e-mail servers do not support Push Notifications -for Delta Chat users.
If a “Push Service” is available, Delta Chat enables Push Notifications -to achieve instant message delivery for all chatmail users. -If you are using a classic e-mail provider instead of chatmail servers, -Push Notifications are not available.
+to achieve instant message delivery for all chatmail users.In the Delta Chat “Notifications” settings for “Instant delivery” you can change the following settings effecting all chat profiles:
@@ -667,7 +726,7 @@ safe to try if you experience messages arrive only with long delays.Delta Chat Push Notification support avoids leakage of private information. -It does not leak e-mail, IP address or message content (not even encrypted) +It does not leak profile data, IP address or message content (not even encrypted) to any system involved in the delivery of Push Notifications.
Here is how Delta Chat apps perform Push Notification delivery:
@@ -678,20 +737,20 @@ to any system involved in the delivery of Push Notifications. on the chatmail server.When a chatmail server receives an e-mail for a Delta Chat user +
When a chatmail server receives a message for a Delta Chat user it forwards the encrypted device token to the central Delta Chat notification proxy.
The central Delta Chat notification proxy decrypts the device token and forwards it to the respective Push service (Apple, Google, etc.), -without ever knowing the IP or e-mail address of Delta Chat users.
+without ever knowing the IP or profile data of Delta Chat users.The central Push Service (Apple, Google, etc.) wakes up the Delta Chat app on your device to check for new messages in the background. -It does not know about the chatmail or e-mail address of the device it wakes up. -The central Apple/Google Push services never see an e-mail address (sender or receiver) +It does not know about the profile data of the device it wakes up. +The central Apple/Google Push services never see any profile data (sender or receiver) and also never see any message content (also not in encrypted forms).
Note that the device token is encrypted between apps and notification proxy but it is not signed. -The notification proxy thus never sees e-mail addresses, IP-addresses or +The notification proxy thus never sees profile data, IP-addresses or any cryptographic identity information associated with a user’s device (token).
Resulting from this overall privacy design, even the seizure of a chatmail server, @@ -725,7 +784,331 @@ without asking questions up-front that are more suited to expert users or develo
Note that Delta Chat has a small and privacy-preserving Push Notification system that achieves “instant delivery” of messages for all chatmail servers including a potential one you might setup yourself without our permission. -Welcome to the power of the interoperable and massive chatmail and e-mail system :)
+Welcome to the power of the interoperable chatmail relay network :) + +Yes. You can use the same profile on different devices:
+ +Make sure both devices are on the same Wi-Fi or network
+On the first device, go to Settings → Add Second Device, unlock the screen if needed +and wait a moment until a QR code is shown
+On the second device, install Delta Chat
+On the second device, start Delta Chat, select Add as Second Device, and scan the QR code from the old device
+Transfer should start after a few seconds and during transfer both devices will show the progress. +Wait until it is finished on both devices.
+In contrast to many other messengers, after successful transfer, +both devices are completely independent. +One device is not needed for the other to work.
+ +Double-check both devices are in the same Wi-Fi or network
+On Windows, go to Control Panel / Network and Internet +and make sure, Private Network is selected as “Network profile type” +(after transfer, you can change back to the original value)
+On iOS, make sure “System Settings / Apps / Delta Chat / Local Network” access is granted
+On macOS, enable “System Settings / Privacy & Security / Local Network / Delta Chat”
+Your system might have a “personal firewall”, +which is known to cause problems (especially on Windows). +Disable the personal firewall for Delta Chat on both ends and try again
+Guest Networks may not allow devices to communicate with each other. +If possible, use a non-guest network.
+If you still have troubles using the same network, +try to open Mobile Hotspot on one device and join that Wi-Fi from the other one
+Ensure there is enough storage on the destination device
+If transfer started, make sure, the devices stay active and do not fall asleep. +Do not exit Delta Chat. +(we try hard to make the app work in background, but systems tend to kill apps, unfortunately)
+Delta Chat is already logged in on the destination device? +You can use multiple profiles per device, just add another profile
+If you still have problems or if you cannot scan a QR code +try the manual transfer described below
+This method is only recommended if “Add Second Device” as described above does not work.
+ +You can send apps to a chat - games, editors, polls and other tools. +This makes Delta Chat a truly extensible messenger.
+ +In a chat, using
Attachment Button → Apps
You can also create your own app and attach it using
Attachment Button → File
In-chat apps can not send data to the Internet, or download anything.
+An in-chat app can only exchange data within a Delta Chat chat, with its +copies on the devices of your chat partners. Other than that, it’s completely +isolated from the Internet.
+The privacy an in-chat app offers is the privacy of your chat - as long as you +trust the people you chat with, you can trust the in-chat app as well.
+This also means: Just like for web links, do not open apps from untrusted contacts.
+In-chat apps are zip files with .xdc extension containing html, css, and javascript code.
You can extend the Hello World example app +to get started.
+All else you need to know is written in the +Webxdc documentation.
+If you have question, you can ask others with experience +in the Delta Chat Forum.
+At Settings → Advanced → Experimental Features +you can try out features we are working on.
+ +The features may be unstable and may be changed or removed.
+ +You can find more information +and give feedback in the Forum.
+ +Yes, but only if the email address is used exclusively by chatmail clients.
+ +It is not supported to share usage of an email address with non-chatmail apps or web-based mailers, +for the following reasons:
+ +Non-chatmail apps are largely not accomplishing automatic end-to-end email encryption for their users, +while chatmail apps and relays pervasively enforce end-to-end encryption and security standards.
+Non-chatmail apps use email servers as a long-term message archive +while chatmail clients use email servers for ephemeral instant message transport.
+Supporting the full variety of classic email setups +would require considerable development and maintenance efforts, +and complicate making chatmail-based messaging more resilient, reliable and fast.
+First off, please do not use the same classic email address also from non-chatmail classic email apps +unless you are prepared to deal with encrypted messages in the inbox, +double notifications, accidentally deleted emails or similar annoyances.
+ +You can configure a email address for chatting at New Profile → Use Other Server → Use Classic Mail as Transport.
+Note that classic email providers will generally not support Push Notifications
+and have other limitations, see Provider Overview.
+Chatmail uses the default INBOX for relay; ensure the provider setup does too.
+A chat profile using a classic email address allows to to send and receive unencrypted messages.
+These messages, and the chats they appear in, are marked with an email icon
+
.
Any well behaving email server setup will do fine +except if your users’ devices require Google/Apple Push Notifications to work properly.
+ +We generally recommend to set up a chatmail relay. +Chatmail is a community-driven project that encompasses both the setup of relays +and core Rust developments +that power chatmail clients of which Delta Chat is the most well known.
+ +If you use default chatmail relays, it is impossible to receive or send messages without end-to-end encryption.
-If you instead create a profile using a classic e-mail server, +
If you instead use a classic email server,
you can send and receive messages with or without end-to-end encryption.
-Messages lacking end-to-end encryption are marked with an e-mail icon
+Messages lacking end-to-end encryption are marked with an email icon
.
You can send an invite link through another private chat, -show an invitation QR code when next to each other or in a video call, -or click on a “contact” that was shared in a chat.
- -For Group invitations, -tap the chat group title to see its member list, -and select “QR Invite code”.
-For direct 1:1 chat invitations,
-tap the QR Code icon
-on the Delta Chat app main screen.
Ask your chat partner to scan the QR image -with their Delta Chat app, -or click “Copy” or “Share” to create an invite link -and share it with your chat partner.
- -Now wait while end-to-end encryption is getting established.
- -If both sides are online, they will soon see a (group or direct) chat -and can start messaging securely.
-If one side is offline or in bad network, -the ability to chat is delayed until connectivity is restored.
-Congratulations! -You now will automatically use end-to-end encryption -with this contact. -If you add each other to chat groups, -end-to-end encryption will be established among all members.
-Yes, we are following efforts like MLS -or Saltpack -but adopting them would mean breaking end-to-end encryption interoperability -with all other e-mail apps that typically support OpenPGP encryption. +but adopting them would mean breaking end-to-end encryption interoperability. So it would not be a light decision to take and there must be tangible improvements for users.
@@ -958,19 +1290,19 @@ as defined by the Autocrypt Level 1 specification. -If you are sending or receiving e-mail messages without end-to-end encryption (using a classic e-mail server), -they are still protected from cell or cable companies who can not read or modify your e-mail messages. -But both your and your recipient’s e-mail providers +
If you are sending or receiving email messages without end-to-end encryption (using a classic email server), +they are still protected from cell or cable companies who can not read or modify your email messages. +But both your and your recipient’s email providers may read, analyze or modify your messages, including any attachments.
Delta Chat by default uses strict TLS encryption -which secures connections between your device and your e-mail provider. +which secures connections between your device and your email provider. All of Delta Chat’s TLS-handling has been independently security audited. -Moreover, the connection between your and the recipient’s e-mail provider +Moreover, the connection between your and the recipient’s email provider will typically be transport-encrypted as well. -If the involved e-mail servers support MTA-STS -then transport encryption will be enforced between e-mail providers +If the involved email servers support MTA-STS +then transport encryption will be enforced between email providers in which case Delta Chat communications will never be exposed in cleartext to the Internet even if the message was not end-to-end encrypted.
@@ -986,20 +1318,15 @@ even if the message was not end-to-end encrypted. Delta Chat apps do not store any metadata about contacts or groups on servers, also not in encrypted form. Instead, all group metadata is end-to-end encrypted and stored on end-user devices, only. -E-mail Servers can therefore only see
+Servers can therefore only see:
the message date,
-sender and receiver addresses
-and message size.
-By default, the addresses are randomly generated.
+All other message, contact and group metadata resides in the end-to-end encrypted part of messages.
Both for protecting against metadata-collecting e-mail servers +
Both for protecting against metadata-collecting servers as well as against the threat of device seizure we recommend to use a chatmail relay -to create chat profiles using random e-mail addresses for transport. +to create chat profiles using random addresses for transport. Note that Delta Chat apps on all platforms support multiple profiles so you can easily use situation-specific profiles next to your “main” profile with the knowledge that all their data, along with all metadata, will be deleted. @@ -1038,7 +1365,7 @@ which is usually associated with a passport identity.
Even if chatmail relays do not ask for any private data (including no phone numbers), it might still be worthwhile to protect relational metadata between addresses. -We don’t foresee bigger problems in using random throw-away e-mail addresses for sealed sending +We don’t foresee bigger problems in using random throw-away addresses for sealed sending but an implementation has not been agreed as a priority yet.
Yes. You can use the same profile on different devices:
- -Make sure both devices are on the same Wi-Fi or network
-On the first device, go to Settings → Add Second Device, unlock the screen if needed -and wait a moment until a QR code is shown
-On the second device, install Delta Chat
-On the second device, start Delta Chat, select Add as Second Device, and scan the QR code from the old device
-Transfer should start after a few seconds and during transfer both devices will show the progress. -Wait until it is finished on both devices.
-In contrast to many other messengers, after successful transfer, -both devices are completely independent. -One device is not needed for the other to work.
- -Double-check both devices are in the same Wi-Fi or network
-On Windows, go to Control Panel / Network and Internet -and make sure, Private Network is selected as “Network profile type” -(after transfer, you can change back to the original value)
-On iOS, make sure “System Settings / Apps / Delta Chat / Local Network” access is granted
-On macOS, enable “System Settings / Privacy & Security / Local Network / Delta Chat”
-Your system might have a “personal firewall”, -which is known to cause problems (especially on Windows). -Disable the personal firewall for Delta Chat on both ends and try again
-Guest Networks may not allow devices to communicate with each other. -If possible, use a non-guest network.
-If you still have troubles using the same network, -try to open Mobile Hotspot on one device and join that Wi-Fi from the other one
-Ensure there is enough storage on the destination device
-If transfer started, make sure, the devices stay active and do not fall asleep. -Do not exit Delta Chat. -(we try hard to make the app work in background, but systems tend to kill apps, unfortunately)
-Delta Chat is already logged in on the destination device? -You can use multiple profiles per device, just add another profile
-If you still have problems or if you cannot scan a QR code -try the manual transfer described below
-This method is only recommended if “Add Second Device” as described above does not work.
- -Yes.
- -If you e.g. delete a chat or a message from your phone, -it will be deleted on your desktop as soon as it comes online again.
- -Notable exceptions are Delete old messages from Device, -as different devices may have different storage capacities, -and system specific settings as notification sounds.
- -In Delta Chat, you can share webxdc apps, attachments with an .xdc file
-extension. They can do very different things, and make Delta Chat a truly
-extendable messenger.
Yes, but it is not recommended.
- -Parallel usage with the same E-Mail address might lead to the following inconveniences:
- -Sieve rules can solve these problems.
- -As with other E-Mail programs like Thunderbird, K9-Mail, or Outlook, the -program needs the password so you can use it to send and receive mails. Of course, the -password is stored only on your device. The password is only transmitted to -your E-Mail provider (when you login), which has access to your mails anyway.
- -As Delta Chat is Open Source, you can check the Source -Code -if you want to verify that your credentials are handled securely. We are happy -about feedback which makes the app more secure for all of our users.
- -By default, Delta Chat shows all e-mails.
- -At “Settings → Advanced → Show Classic E-Mails”, -you can change this. You have these options:
- -Yes, incoming HTML messages come with a “Show full message” button. -Outgoing messages always use plain text.
- -Delta Chat sets (and encrypts!) the classic e-mail subject -automatically to the group name or to the sender name.
- -So if you want to set the subject yourself, -for example for a formal e-mail to a business contact, -you can create a group -with only yourself and the recipient(s). -Set the Chat Title to the Subject you want, -and then send your e-mail as the first message. -If the recipients don’t use Delta Chat, -it will look like a normal, -formal e-mail to them. -You will get bonus professionalism points -if you set a signature text.
- -Sending a copy of your messages to yourself ensures that you receive your own -messages on all devices. If you have multiple devices and don’t turn it on, you -see only the messages from other people, and the messages you send from the -current device.
- -The copy is sent to the Inbox, and then moved to the DeltaChat folder; it’s not -put into the “Sent” folder. Delta Chat never uploads anything to the Sent -folder because this would mean uploading a message twice (once through SMTP, -and once through IMAP to Sent folder).
- -The default setting for “Send Copy to Self” is “on”.
- -The only reason one wants to watch the Sent folder is if you are using another -mail program (like Thunderbird) next to your Delta Chat app, and want your MUA -to participate in chat conversations.
- -However, we recommend using the Delta Chat Desktop Client; you can download it -on get.delta.chat. The option to watch the “Sent” -folder might go away in the future. It was introduced at a time where there was -no Delta Chat Desktop client available on all platforms.
- -This is an experimental setting for some people who are experimenting with -server-side rules. Not all providers support this, but with some you can move -all mails with a “Chat-Version” header to the DeltaChat folder. Normally, this -would be done by the Delta Chat app.
- -Enabling “Only Fetch from DeltaChat folder” makes sense if you have both:
- -In this case, Delta Chat doesn’t need to watch the Inbox, and it’s enough to only watch the DeltaChat folder.
- -We are very grateful for feedback on these features - do you want to share -your ideas? Join the Forum to contribute. -You may conveniently login via Delta Chat and a QR code scan, -another rather stable experiment we run on the side (sic!).
- -https://meet.jit.si/$ROOM. The $ROOM variable will be a random value;
-this way, you will have a new random Jitsi room every time you call someone.With a Broadcast List you can send a message to many recipients at once; -the recipients cannot reply in that list. -Broadcast lists are still highly experimental -and will very probably be replaced by something else, stay tuned :)
- -Note: -Changing email addresses is temporarily disabled -because of ongoing changes to the DeltaChat core. -It should be available again in a few months.
- -Change your address in “Settings → Advanced → Password and Account” and -enter the password of your new e-mail account (and if necessary, server settings). -You will get an information notice about the fact that you are moving to a new address. -An additional notice will also show up in your “Device messages” chat.
-If possible, let your old e-mail provider forward all messages to your new address.
-Tell your contacts that you changed your address. -Writing to guaranteed end-to-end encrypted chats and groups, -will make them notice your move automatically -and they will continue chatting with you using your new address.
-Note that Delta Chat will not retrieve messages anymore from your old e-mail provider. -If you didn’t configure your e-mail provider to forward messages (step 2.) -only those contacts to whom you sent a message in a guaranteed end-to-end encrypted chat -will send messages to your new address.
- -To learn more about this the details behind this, read our blogpost on -it.
-Depending on the operating system in use, -you may be asked to grant permissions to the app. -This is what Delta Chat does with these permissions:
+Some features require certain permissions, +e.g. you need to grant camera permission if you want to scan an invite QR code.
-If you use a default chat profile -you can simply uninstall the app. -This will automatically trigger deletion of all associated account data on the chatmail server. -For more info, please refer to nine.testrun.org account-deletion for the default onboarding server, -or the respective page from your chosen 3rd party chatmail server.
- -If you have set up your chat profile on multiple devices -you need to remove it from all devices.
- -If you are using more than one account, -but don’t want to get rid of all of them, -you can remove it in the account switcher menu (on android and iOS), -or in the sidebar with a right click (in the desktop client).
- -Accounts on classic e-mail providers -will not be deleted automatically; -how you can delete your account depends on your e-mail provider. -We don’t have any control over e-mail accounts at those providers, -so unfortunately we can’t help you with that.
- -If you want to continue using a classic e-mail account with other apps, -but uninstall Delta Chat, -it is recommended to leave any group chat before uninstalling Delta Chat. -Otherwise you might receive undecryptable messages from those group chats.
+See Privacy Policy for a detailed overview.
Open one of the following app stores and search for “Delta Chat”: -Google Play Store, F-Droid, Huawei App Gallery, Amazon App Store, iOS and macOS App Store, Microsoft Store
+Google Play Store, F-Droid, Huawei App Gallery, iOS and macOS App Store, Microsoft StoreCheck the package manager of your Linux distributions
@@ -1927,13 +1607,13 @@ completing Rust/Python bindings and instigating a Chat-bot eco-system.In 2021 we received further EU funding for two Next-Generation-Internet -proposals, namely for EPPD - e-mail provider portability directory (~97K EUR) and AEAP - email address porting (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.
+proposals, namely for EPPD - email provider portability directory (~97K EUR) and AEAP - email address porting (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.From End 2021 till March 2023 we received Internet Freedom funding (500K USD) from the U.S. Bureau of Democracy, Human Rights and Labor (DRL). This funding supported our long-running goals to make Delta Chat more usable -and compatible with a wide range of e-mail servers world-wide, and more resilient and secure +and compatible with a wide range of email servers world-wide, and more resilient and secure in places often affected by internet censorship and shutdowns.










Delta Chat przypomina Whatsapp lub Telegram, ale możesz go również używać i traktować jako aplikację e-mail. Możesz zarejestrować się anonimowo na różnych interoperacyjnych serwerach chatmail, które są minimalnymi serwerami poczty e-mail zoptymalizowanymi pod kątem szybkich i bezpiecznych operacji. Możesz też skorzystać z klasycznych serwerów pocztowych i istniejącego konta e-mail, w którym to przypadku Delta Chat będzie pełnić funkcję aplikacji pocztowej.
-









Delta Chat схожий на Whatsapp або Telegram, але ви також можете використовувати його як додаток електронної пошти. Ви можете анонімно зареєструватися на різних сумісних chatmail-серверах які є мінімальними поштовими серверами, оптимізованими для швидкої та безпечної роботи. Або ви можете використовувати класичні поштові сервери та існуючий профіль електронної пошти в цьому випадку Delta Chat буде працювати як поштовий додаток.
-



+ * If no events have happened since the last `get_next_event` + * (i.e. if the event queue is empty), the response will be returned + * only when a new event fires. + *
+ * Note that if you are using the `BaseDeltaChat` JavaScript class
+ * or the `Rpc` Python class, this function will be invoked
+ * by those classes internally and should not be used manually.
+ */
+ public Event getNextEvent() throws RpcException {
+ return transport.callForResult(new TypeReference
+ * The `AccountsBackgroundFetchDone` event is emitted at the end even in case of timeout.
+ * Process all events until you get this one and you can safely return to the background
+ * without forgetting to create notifications caused by timing race conditions.
+ */
+ public void backgroundFetch(Float timeoutInSeconds) throws RpcException {
+ transport.call("background_fetch", mapper.valueToTree(timeoutInSeconds));
+ }
+
+ public void stopBackgroundFetch() throws RpcException {
+ transport.call("stop_background_fetch");
+ }
+
+ /* Starts background tasks for a single account. */
+ public void startIo(Integer accountId) throws RpcException {
+ transport.call("start_io", mapper.valueToTree(accountId));
+ }
+
+ /* Stops background tasks for a single account. */
+ public void stopIo(Integer accountId) throws RpcException {
+ transport.call("stop_io", mapper.valueToTree(accountId));
+ }
+
+ /* Get top-level info for an account. */
+ public Account getAccountInfo(Integer accountId) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * This function looks up domain in offline database.
+ *
+ * For compatibility, email address can be passed to this function
+ * instead of the domain.
+ */
+ public ProviderInfo getProviderInfo(Integer accountId, String email) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * Internally, the function will call dc_set_config() with the appropriate keys,
+ */
+ public void setConfigFromQr(Integer accountId, String qrContent) throws RpcException {
+ transport.call("set_config_from_qr", mapper.valueToTree(accountId), mapper.valueToTree(qrContent));
+ }
+
+ public Qr checkQr(Integer accountId, String qrContent) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * Deprecated as of 2025-02; use `add_transport_from_qr()`
+ * or `add_or_update_transport()` instead.
+ */
+ public void configure(Integer accountId) throws RpcException {
+ transport.call("configure", mapper.valueToTree(accountId));
+ }
+
/**
* Configures a new email account using the provided parameters
* and adds it as a transport.
@@ -97,6 +279,11 @@ public class Rpc {
transport.call("add_or_update_transport", mapper.valueToTree(accountId), mapper.valueToTree(param));
}
+ /* Deprecated 2025-04. Alias for [Self::add_or_update_transport()]. */
+ public void addTransport(Integer accountId, EnteredLoginParam param) throws RpcException {
+ transport.call("add_transport", mapper.valueToTree(accountId), mapper.valueToTree(param));
+ }
+
/**
* Adds a new email account as a transport
* using the server encoded in the QR code.
@@ -106,6 +293,345 @@ public class Rpc {
transport.call("add_transport_from_qr", mapper.valueToTree(accountId), mapper.valueToTree(qr));
}
+ /**
+ * Returns the list of all email accounts that are used as a transport in the current profile.
+ * Use [Self::add_or_update_transport()] to add or change a transport
+ * and [Self::delete_transport()] to delete a transport.
+ */
+ public java.util.List
+ * Messages belonging to muted chats or to the contact requests are not returned;
+ * these messages should not be notified
+ * and also badge counters should not include these messages.
+ *
+ * To get the number of fresh messages for a single chat, muted or not,
+ * use `get_fresh_msg_cnt()`.
+ */
+ public java.util.List
+ * If the specified chat is muted,
+ * the UI should show the badge counter "less obtrusive",
+ * e.g. using "gray" instead of "red" color.
+ */
+ public Integer getFreshMsgCnt(Integer accountId, Integer chatId) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * Only messages with database ID higher than `last_msg_id` config value
+ * are returned. After processing the messages, the bot should
+ * update `last_msg_id` by calling [`markseen_msgs`]
+ * or manually updating the value to avoid getting already
+ * processed messages.
+ *
+ * [`markseen_msgs`]: Self::markseen_msgs
+ */
+ public java.util.List
+ * This function is similar to [`get_next_msgs`],
+ * but waits for internal new message notification before returning.
+ * New message notification is sent when new message is added to the database,
+ * on initialization, when I/O is started and when I/O is stopped.
+ * This allows bots to use `wait_next_msgs` in a loop to process
+ * old messages after initialization and during the bot runtime.
+ * To shutdown the bot, stopping I/O can be used to interrupt
+ * pending or next `wait_next_msgs` call.
+ *
+ * [`get_next_msgs`]: Self::get_next_msgs
+ */
+ public java.util.List
+ * Experimental API, subject to change without notice.
+ */
+ public java.util.List
+ * Messages are deleted from the device and the chat database entry is deleted.
+ * After that, the event #DC_EVENT_MSGS_CHANGED is posted.
+ *
+ * Things that are _not done_ implicitly:
+ *
+ * - Messages are **not deleted from the server**.
+ * - The chat or the contact is **not blocked**, so new messages from the user/the group may appear as a contact request
+ * and the user may create the chat again.
+ * - **Groups are not left** - this would
+ * be unexpected as (1) deleting a normal chat also does not prevent new mails
+ * from arriving, (2) leaving a group requires sending a message to
+ * all group members - especially for groups not used for a longer time, this is
+ * really unexpected when deletion results in contacting all members again,
+ * (3) only leaving groups is also a valid usecase.
+ *
+ * To leave a chat explicitly, use leave_group()
+ */
+ public void deleteChat(Integer accountId, Integer chatId) throws RpcException {
+ transport.call("delete_chat", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
+ }
+
+ /**
+ * Get encryption info for a chat.
+ * Get a multi-line encryption info, containing encryption preferences of all members.
+ * Can be used to find out why messages sent to group are not encrypted.
+ *
+ * returns Multi-line text
+ */
+ public String getChatEncryptionInfo(Integer accountId, Integer chatId) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * If `chat_id` is a group chat ID, SecureJoin QR code for the group is returned.
+ * If `chat_id` is unset, setup contact QR code is returned.
+ */
+ public String getChatSecurejoinQrCode(Integer accountId, Integer chatId) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * The scanning device will pass the scanned content to `checkQr()` then;
+ * if `checkQr()` returns `askVerifyContact` or `askVerifyGroup`
+ * an out-of-band-verification can be joined using `secure_join()`
+ *
+ * chat_id: If set to a group-chat-id,
+ * the Verified-Group-Invite protocol is offered in the QR code;
+ * works for protected groups as well as for normal groups.
+ * If not set, the Setup-Contact protocol is offered in the QR code.
+ * See https://securejoin.delta.chat/ for details about both protocols.
+ *
+ * return format: `[code, svg]`
+ */
+ public Pair
+ * The function returns immediately and the handshake runs in background,
+ * sending and receiving several messages.
+ * During the handshake, info messages are added to the chat,
+ * showing progress, success or errors.
+ *
+ * Subsequent calls of `secure_join()` will abort previous, unfinished handshakes.
+ *
+ * See https://securejoin.delta.chat/ for details about both protocols.
+ *
+ * **qr**: The text of the scanned QR code. Typically, the same string as given
+ * to `check_qr()`.
+ *
+ * **returns**: The chat ID of the joined chat, the UI may redirect to the this chat.
+ * A returned chat ID does not guarantee that the chat is protected or the belonging contact is verified.
+ *
+ */
+ public Integer secureJoin(Integer accountId, String qr) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * **source**: The source where the QR code came from.
+ * E.g. a link that was clicked inside or outside Delta Chat,
+ * the "Paste from Clipboard" action,
+ * the "Load QR code as image" action,
+ * or a QR code scan.
+ *
+ * **uipath**: Which UI path did the user use to arrive at the QR code screen.
+ * If the SecurejoinSource was ExternalLink or InternalLink,
+ * pass `None` here, because the QR code screen wasn't even opened.
+ * ```
+ */
+ public Integer secureJoinWithUxInfo(Integer accountId, String qr, SecurejoinSource source, SecurejoinUiPath uipath) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * If the group is already _promoted_ (any message was sent to the group),
+ * all group members are informed by a special status message that is sent automatically by this function.
+ *
+ * Sends out #DC_EVENT_CHAT_MODIFIED and #DC_EVENT_MSGS_CHANGED if a status message was sent.
+ */
+ public void removeContactFromChat(Integer accountId, Integer chatId, Integer contactId) throws RpcException {
+ transport.call("remove_contact_from_chat", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(contactId));
+ }
+
+ /**
+ * Add a member to a group.
+ *
+ * If the group is already _promoted_ (any message was sent to the group),
+ * all group members are informed by a special status message that is sent automatically by this function.
+ *
+ * If the group has group protection enabled, only verified contacts can be added to the group.
+ *
+ * Sends out #DC_EVENT_CHAT_MODIFIED and #DC_EVENT_MSGS_CHANGED if a status message was sent.
+ */
+ public void addContactToChat(Integer accountId, Integer chatId, Integer contactId) throws RpcException {
+ transport.call("add_contact_to_chat", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(contactId));
+ }
+
+ /**
+ * Get the contact IDs belonging to a chat.
+ *
+ * - for normal chats, the function always returns exactly one contact,
+ * DC_CONTACT_ID_SELF is returned only for SELF-chats.
+ *
+ * - for group chats all members are returned, DC_CONTACT_ID_SELF is returned
+ * explicitly as it may happen that oneself gets removed from a still existing
+ * group
+ *
+ * - for broadcast channels, all recipients are returned, DC_CONTACT_ID_SELF is not included
+ *
+ * - for mailing lists, the behavior is not documented currently, we will decide on that later.
+ * for now, the UI should not show the list for mailing lists.
+ * (we do not know all members and there is not always a global mailing list address,
+ * so we could return only SELF or the known members; this is not decided yet)
+ */
+ public java.util.List
+ * After creation,
+ * the group has one member with the ID DC_CONTACT_ID_SELF
+ * and is in _unpromoted_ state.
+ * This means, you can add or remove members, change the name,
+ * the group image and so on without messages being sent to all group members.
+ *
+ * This changes as soon as the first message is sent to the group members
+ * and the group becomes _promoted_.
+ * After that, all changes are synced with all group members
+ * by sending status message.
+ *
+ * To check, if a chat is still unpromoted, you can look at the `is_unpromoted` property of `BasicChat` or `FullChat`.
+ * This may be useful if you want to show some help for just created groups.
+ *
+ * `protect` argument is deprecated as of 2025-10-22 and is left for compatibility.
+ * Pass `false` here.
+ */
+ public Integer createGroupChat(Integer accountId, String name, Boolean protect) throws RpcException {
+ return transport.callForResult(new TypeReference
@@ -116,8 +642,13 @@ public class Rpc {
return transport.callForResult(new TypeReference
* Broadcast channels are similar to groups on the sending device,
@@ -137,16 +668,369 @@ public class Rpc {
return transport.callForResult(new TypeReference
+ * If the group is already _promoted_ (any message was sent to the group),
+ * all group members are informed by a special status message that is sent automatically by this function.
+ *
+ * Sends out #DC_EVENT_CHAT_MODIFIED and #DC_EVENT_MSGS_CHANGED if a status message was sent.
+ */
+ public void setChatName(Integer accountId, Integer chatId, String newName) throws RpcException {
+ transport.call("set_chat_name", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(newName));
+ }
+
+ /**
+ * Set group profile image.
+ *
+ * If the group is already _promoted_ (any message was sent to the group),
+ * all group members are informed by a special status message that is sent automatically by this function.
+ *
+ * Sends out #DC_EVENT_CHAT_MODIFIED and #DC_EVENT_MSGS_CHANGED if a status message was sent.
+ *
+ * To find out the profile image of a chat, use dc_chat_get_profile_image()
+ *
+ * @param image_path Full path of the image to use as the group image. The image will immediately be copied to the
+ * `blobdir`; the original image will not be needed anymore.
+ * If you pass null here, the group image is deleted (for promoted groups, all members are informed about
+ * this change anyway).
+ */
+ public void setChatProfileImage(Integer accountId, Integer chatId, String imagePath) throws RpcException {
+ transport.call("set_chat_profile_image", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(imagePath));
+ }
+
+ public void setChatVisibility(Integer accountId, Integer chatId, ChatVisibility visibility) throws RpcException {
+ transport.call("set_chat_visibility", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(visibility));
+ }
+
+ public void setChatEphemeralTimer(Integer accountId, Integer chatId, Integer timer) throws RpcException {
+ transport.call("set_chat_ephemeral_timer", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(timer));
+ }
+
+ public Integer getChatEphemeralTimer(Integer accountId, Integer chatId) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * Sends the `MsgsChanged` event on success.
+ *
+ * Setting msg to None will prevent the device message with this label from being added in the future.
+ */
+ public Integer addDeviceMessage(Integer accountId, String label, MessageData msg) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * Calling this function usually results in the event #DC_EVENT_MSGS_NOTICED.
+ * See also markseen_msgs().
+ */
+ public void marknoticedChat(Integer accountId, Integer chatId) throws RpcException {
+ transport.call("marknoticed_chat", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
+ }
+
+ /**
+ * Returns the message that is immediately followed by the last seen
+ * message.
+ * From the point of view of the user this is effectively
+ * "first unread", but in reality in the database a seen message
+ * _can_ be followed by a fresh (unseen) message
+ * if that message has not been individually marked as seen.
+ */
+ public Integer getFirstUnreadMessageOfChat(Integer accountId, Integer chatId) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * The UI can then call is_chat_muted() when receiving a new message
+ * to decide whether it should trigger an notification.
+ *
+ * Muted chats should not sound or vibrate
+ * and should not show a visual notification in the system area.
+ * Moreover, muted chats should be excluded from global badge counter
+ * (get_fresh_msgs() skips muted chats therefore)
+ * and the in-app, per-chat badge counter should use a less obtrusive color.
+ *
+ * Sends out #DC_EVENT_CHAT_MODIFIED.
+ */
+ public void setChatMuteDuration(Integer accountId, Integer chatId, MuteDuration duration) throws RpcException {
+ transport.call("set_chat_mute_duration", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(duration));
+ }
+
+ /**
+ * Check whether the chat is currently muted (can be changed by set_chat_mute_duration()).
+ *
+ * This is available as a standalone function outside of fullchat, because it might be only needed for notification
+ */
+ public Boolean isChatMuted(Integer accountId, Integer chatId) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * - For normal chats, the IMAP state is updated, MDN is sent
+ * (if set_config()-options `mdns_enabled` is set)
+ * and the internal state is changed to @ref DC_STATE_IN_SEEN to reflect these actions.
+ *
+ * - For contact requests, no IMAP or MDNs is done
+ * and the internal state is not changed therefore.
+ * See also marknoticed_chat().
+ *
+ * Moreover, timer is started for incoming ephemeral messages.
+ * This also happens for contact requests chats.
+ *
+ * This function updates `last_msg_id` configuration value
+ * to the maximum of the current value and IDs passed to this function.
+ * Bots which mark messages as seen can rely on this side effect
+ * to avoid updating `last_msg_id` value manually.
+ *
+ * One #DC_EVENT_MSGS_NOTICED event is emitted per modified chat.
+ */
+ public void markseenMsgs(Integer accountId, java.util.List
+ * * `add_daymarker` - If `true`, add day markers as `DC_MSG_ID_DAYMARKER` to the result,
+ * e.g. [1234, 1237, 9, 1239]. The day marker timestamp is the midnight one for the
+ * corresponding (following) day in the local timezone.
+ */
+ public java.util.List
+ * this is the batch variant of [get_message]
+ */
+ public java.util.Map
+ * The max. text returned is typically longer (about 100000 characters) than the
+ * max. text returned by dc_msg_get_text() (about 30000 characters).
+ */
+ public String getMessageInfo(Integer accountId, Integer messageId) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * On success, the @ref DC_MSG "view type of the message" may change
+ * or the message may be replaced completely by one or more messages with other message IDs.
+ * That may happen e.g. in cases where the message was encrypted
+ * and the type could not be determined without fully downloading.
+ * Downloaded content can be accessed as usual after download.
+ *
+ * To reflect these changes a @ref DC_EVENT_MSGS_CHANGED event will be emitted.
+ */
+ public void downloadFullMessage(Integer accountId, Integer messageId) throws RpcException {
+ transport.call("download_full_message", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
+ }
+
+ /**
+ * Search messages containing the given query string.
+ * Searching can be done globally (chat_id=None) or in a specified chat only (chat_id set).
+ *
+ * Global search results are typically displayed using dc_msg_get_summary(), chat
+ * search results may just highlight the corresponding messages and present a
+ * prev/next button.
+ *
+ * For the global search, the result is limited to 1000 messages,
+ * this allows an incremental search done fast.
+ * So, when getting exactly 1000 messages, the result actually may be truncated;
+ * the UIs may display sth. like "1000+ messages found" in this case.
+ * The chat search (if chat_id is set) is not limited.
+ */
+ public java.util.List
+ * This will always create or look up an address-contact,
+ * i.e. a contact identified by an email address,
+ * with all messages sent to and from this contact being unencrypted.
+ * If the user just clicked on an email address,
+ * you should first check [`Self::lookup_contact_id_by_addr`]/`lookupContactIdByAddr.`,
+ * and only if there is no contact yet, call this function here.
+ *
+ * Returns contact id of the created or existing contact.
+ */
+ public Integer createContact(Integer accountId, String email, String name) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * By default, key-contacts are listed.
+ *
+ * * `list_flags` - A combination of flags:
+ * - `DC_GCL_ADD_SELF` - Add SELF unless filtered by other parameters.
+ * - `DC_GCL_ADDRESS` - List address-contacts instead of key-contacts.
+ * * `query` - A string to filter the list.
+ */
+ public java.util.List
+ * Formerly called `getContacts2` in Desktop.
+ * See [`Self::get_contact_ids`] for parameters and more info.
+ */
+ public java.util.List
+ * **POTENTIAL SECURITY ISSUE**: If there are multiple contacts with this address
+ * (e.g. an address-contact and a key-contact),
+ * this looks up the most recently seen contact,
+ * i.e. which contact is returned depends on which contact last sent a message.
+ * If the user just clicked on a mailto: link, then this is the best thing you can do.
+ * But **DO NOT** internally represent contacts by their email address
+ * and do not use this function to look them up;
+ * otherwise this function will sometimes look up the wrong contact.
+ * Instead, you should internally represent contacts by their ids.
+ *
+ * To validate an e-mail address independently of the contact database
+ * use check_email_validity().
+ */
+ public Integer lookupContactIdByAddr(Integer accountId, String addr) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * Returns the ids of created/modified contacts in the order they appear in the vCard.
+ */
+ public java.util.List
+ * If it does not exist, `None` is returned.
+ */
+ public Integer getChatIdByContactId(Integer accountId, Integer contactId) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * The list is already sorted and starts with the oldest message.
+ * Clients should not try to re-sort the list as this would be an expensive action
+ * and would result in inconsistencies between clients.
+ *
+ * Setting `chat_id` to `None` (`null` in typescript) means get messages with media
+ * from any chat of the currently used account.
+ */
+ public java.util.List
+ * Can be canceled by stopping the ongoing process. Success or failure can be tracked
+ * via the `ImexProgress` event which should either reach `1000` for success or `0` for
+ * failure.
+ *
+ * This **stops IO** while it is running.
+ *
+ * Returns once a remote device has retrieved the backup, or is canceled.
+ */
+ public void provideBackup(Integer accountId) throws RpcException {
+ transport.call("provide_backup", mapper.valueToTree(accountId));
+ }
+
+ /**
+ * Returns the text of the QR code for the running [`CommandApi::provide_backup`].
+ *
+ * This QR code text can be used in [`CommandApi::get_backup`] on a second device to
+ * retrieve the backup and setup this second device.
+ *
+ * This call will block until the QR code is ready,
+ * even if there is no concurrent call to [`CommandApi::provide_backup`],
+ * but will fail after 60 seconds to avoid deadlocks.
+ */
+ public String getBackupQr(Integer accountId) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * This QR code can be used in [`CommandApi::get_backup`] on a second device to
+ * retrieve the backup and setup this second device.
+ *
+ * This call will block until the QR code is ready,
+ * even if there is no concurrent call to [`CommandApi::provide_backup`],
+ * but will fail after 60 seconds to avoid deadlocks.
+ *
+ * Returns the QR code rendered as an SVG image.
+ */
+ public String getBackupQrSvg(Integer accountId) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * This retrieves the backup from a remote device over the network and imports it into
+ * the current device.
+ *
+ * Can be canceled by stopping the ongoing process.
+ *
+ * Do not forget to call start_io on the account after a successful import,
+ * otherwise it will not connect to the email server.
+ */
+ public void getBackup(Integer accountId, String qrText) throws RpcException {
+ transport.call("get_backup", mapper.valueToTree(accountId), mapper.valueToTree(qrText));
+ }
+
+ /**
+ * Indicate that the network likely has come back.
+ * or just that the network conditions might have changed
+ */
+ public void maybeNetwork() throws RpcException {
+ transport.call("maybe_network");
+ }
+
+ /**
+ * Get the current connectivity, i.e. whether the device is connected to the IMAP server.
+ * One of:
+ * - DC_CONNECTIVITY_NOT_CONNECTED (1000-1999): Show e.g. the string "Not connected" or a red dot
+ * - DC_CONNECTIVITY_CONNECTING (2000-2999): Show e.g. the string "Connecting…" or a yellow dot
+ * - DC_CONNECTIVITY_WORKING (3000-3999): Show e.g. the string "Getting new messages" or a spinning wheel
+ * - DC_CONNECTIVITY_CONNECTED (>=4000): Show e.g. the string "Connected" or a green dot
+ *
+ * We don't use exact values but ranges here so that we can split up
+ * states into multiple states in the future.
+ *
+ * Meant as a rough overview that can be shown
+ * e.g. in the title of the main screen.
+ *
+ * If the connectivity changes, a #DC_EVENT_CONNECTIVITY_CHANGED will be emitted.
+ */
+ public Integer getConnectivity(Integer accountId) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * If this page changes, a #DC_EVENT_CONNECTIVITY_CHANGED will be emitted.
+ *
+ * This comes as an HTML from the core so that we can easily improve it
+ * and the improvement instantly reaches all UIs.
+ */
+ public String getConnectivityHtml(Integer accountId) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * path is the path of the file within webxdc archive
+ */
+ public String getWebxdcBlob(Integer accountId, Integer instanceMsgId, String path) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * All types of messages can be forwarded,
+ * however, they will be flagged as such (dc_msg_is_forwarded() is set).
+ *
+ * Original sender, info-state and webxdc updates are not forwarded on purpose.
+ */
+ public void forwardMessages(Integer accountId, java.util.List
+ * Some messages cannot be resent, eg. info-messages, drafts, already pending messages or messages that are not sent by SELF.
+ *
+ * message_ids all message IDs that should be resend. All messages must belong to the same chat.
+ */
+ public void resendMessages(Integer accountId, java.util.List
@@ -237,9 +1352,102 @@ public class Rpc {
return transport.callForResult(new TypeReference
+ * Fails if file already exists at the provided path.
+ */
+ public void saveMsgFile(Integer accountId, Integer msgId, String path) throws RpcException {
+ transport.call("save_msg_file", mapper.valueToTree(accountId), mapper.valueToTree(msgId), mapper.valueToTree(path));
+ }
+
+ public void removeDraft(Integer accountId, Integer chatId) throws RpcException {
+ transport.call("remove_draft", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
+ }
+
+ /* Get draft for a chat, if any. */
+ public Message getDraft(Integer accountId, Integer chatId) throws RpcException {
+ return transport.callForResult(new TypeReference
+ * This function returns after the message has been placed in the sending queue.
+ * This does not imply that the message was really sent out yet.
+ * However, from your view, you're done with the message.
+ * Sooner or later it will find its way.
+ *
+ * **Attaching files:**
+ *
+ * Pass the file path in the `file` parameter.
+ * If `file` is not in the blob directory yet,
+ * it will be copied into the blob directory.
+ * If you want, you can delete the file immediately after this function returns.
+ *
+ * You can also write the attachment directly into the blob directory
+ * and then pass the path as the `file` parameter;
+ * this will prevent an unnecessary copying of the file.
+ *
+ * In `filename`, you can pass the original name of the file,
+ * which will then be shown in the UI.
+ * in this case the current name of `file` on the filesystem will be ignored.
+ *
+ * In order to deduplicate files that contain the same data,
+ * the file will be named `
+ * NOTE:
+ * - This function will rename the file. To get the new file path, call `get_file()`.
+ * - The file must not be modified after this function was called.
+ * - Images etc. will NOT be recoded.
+ * In order to recode images,
+ * use `misc_set_draft` and pass `Image` as the viewtype.
+ */
+ public Pair
+ * used when you only need the basic metadata of a chat like type, name, profile picture
+ */
+public class BasicChat {
+ public Boolean archived;
+ public ChatType chatType;
+ public String color;
+ public Integer id;
+ public Boolean isContactRequest;
+ public Boolean isDeviceChat;
+ /**
+ * True if the chat is encrypted. This means that all messages in the chat are encrypted, and all contacts in the chat are "key-contacts", i.e. identified by the PGP key fingerprint.
+ *
+ * False if the chat is unencrypted. This means that all messages in the chat are unencrypted, and all contacts in the chat are "address-contacts", i.e. identified by the email address. The UI should mark this chat e.g. with a mail-letter icon.
+ *
+ * Unencrypted groups are called "ad-hoc groups" and the user can't add/remove members, create a QR invite code, or set an avatar. These options should therefore be disabled in the UI.
+ *
+ * Note that it can happen that an encrypted chat contains unencrypted messages that were received in core <= v1.159.* and vice versa.
+ *
+ * See also `is_key_contact` on `Contact`.
+ */
+ public Boolean isEncrypted;
+ public Boolean isMuted;
+ public Boolean isSelfTalk;
+ public Boolean isUnpromoted;
+ public String name;
+ public Boolean pinned;
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String profileImage;
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/ChatListItemFetchResult.java b/src/main/java/chat/delta/rpc/types/ChatListItemFetchResult.java
new file mode 100644
index 000000000..687aa35be
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/ChatListItemFetchResult.java
@@ -0,0 +1,71 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
+import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
+
+@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
+@JsonSubTypes({@Type(value = ChatListItemFetchResult.ChatListItem.class, name="ChatListItem"), @Type(value = ChatListItemFetchResult.ArchiveLink.class, name="ArchiveLink"), @Type(value = ChatListItemFetchResult.Error.class, name="Error")})
+public abstract class ChatListItemFetchResult {
+
+ public static class ChatListItem extends ChatListItemFetchResult {
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String avatarPath;
+ public ChatType chatType;
+ public String color;
+ /* contact id if this is a dm chat (for view profile entry in context menu) */
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public Integer dmChatContact;
+ public Integer freshMessageCounter;
+ public Integer id;
+ public Boolean isArchived;
+ public Boolean isContactRequest;
+ public Boolean isDeviceTalk;
+ /**
+ * True if the chat is encrypted. This means that all messages in the chat are encrypted, and all contacts in the chat are "key-contacts", i.e. identified by the PGP key fingerprint.
+ *
+ * False if the chat is unencrypted. This means that all messages in the chat are unencrypted, and all contacts in the chat are "address-contacts", i.e. identified by the email address. The UI should mark this chat e.g. with a mail-letter icon.
+ *
+ * Unencrypted groups are called "ad-hoc groups" and the user can't add/remove members, create a QR invite code, or set an avatar. These options should therefore be disabled in the UI.
+ *
+ * Note that it can happen that an encrypted chat contains unencrypted messages that were received in core <= v1.159.* and vice versa.
+ *
+ * See also `is_key_contact` on `Contact`.
+ */
+ public Boolean isEncrypted;
+ /* deprecated 2025-07, use chat_type instead */
+ public Boolean isGroup;
+ public Boolean isMuted;
+ public Boolean isPinned;
+ public Boolean isSelfInGroup;
+ public Boolean isSelfTalk;
+ public Boolean isSendingLocation;
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public Integer lastMessageId;
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public Viewtype lastMessageType;
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public Integer lastUpdated;
+ public String name;
+ /* showing preview if last chat message is image */
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String summaryPreviewImage;
+ public Integer summaryStatus;
+ public String summaryText1;
+ public String summaryText2;
+ public Boolean wasSeenRecently;
+ }
+
+ public static class ArchiveLink extends ChatListItemFetchResult {
+ public Integer freshMessageCounter;
+ }
+
+ public static class Error extends ChatListItemFetchResult {
+ public String error;
+ public Integer id;
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/ChatType.java b/src/main/java/chat/delta/rpc/types/ChatType.java
new file mode 100644
index 000000000..ef7d360e9
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/ChatType.java
@@ -0,0 +1,10 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+public enum ChatType {
+ Single,
+ Group,
+ Mailinglist,
+ OutBroadcast,
+ InBroadcast,
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/ChatVisibility.java b/src/main/java/chat/delta/rpc/types/ChatVisibility.java
new file mode 100644
index 000000000..340595a61
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/ChatVisibility.java
@@ -0,0 +1,8 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+public enum ChatVisibility {
+ Normal,
+ Archived,
+ Pinned,
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/Contact.java b/src/main/java/chat/delta/rpc/types/Contact.java
new file mode 100644
index 000000000..91ed6d273
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/Contact.java
@@ -0,0 +1,52 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+public class Contact {
+ public String address;
+ public String authName;
+ public String color;
+ public String displayName;
+ /**
+ * Is encryption available for this contact.
+ *
+ * This can only be true for key-contacts. However, it is possible to have a key-contact for which encryption is not available because we don't have a key yet, e.g. if we just scanned the fingerprint from a QR code.
+ */
+ public Boolean e2eeAvail;
+ public Integer id;
+ public Boolean isBlocked;
+ /* If the contact is a bot. */
+ public Boolean isBot;
+ /* Is the contact a key contact. */
+ public Boolean isKeyContact;
+ /**
+ * True if the contact can be added to protected chats because SELF and contact have verified their fingerprints in both directions.
+ *
+ * See [`Self::verifier_id`]/`Contact.verifierId` for a guidance how to display these information.
+ */
+ public Boolean isVerified;
+ /* the contact's last seen timestamp */
+ public Integer lastSeen;
+ public String name;
+ public String nameAndAddr;
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String profileImage;
+ public String status;
+ /**
+ * The contact ID that verified a contact.
+ *
+ * As verifier may be unknown, use [`Self::is_verified`]/`Contact.isVerified` to check if a contact can be added to a protected chat.
+ *
+ * UI should display the information in the contact's profile as follows:
+ *
+ * - If `verifierId` != 0, display text "Introduced by ..." with the name and address of the contact formatted by `name_and_addr`/`nameAndAddr`. Prefix the text by a green checkmark.
+ *
+ * - If `verifierId` == 0 and `isVerified` != 0, display "Introduced" prefixed by a green checkmark.
+ *
+ * - if `verifierId` == 0 and `isVerified` == 0, display nothing
+ *
+ * This contains the contact ID of the verifier. If it is `DC_CONTACT_ID_SELF`, we verified the contact ourself. If it is None/Null, we don't have verifier information or the contact is not verified.
+ */
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public Integer verifierId;
+ public Boolean wasSeenRecently;
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/DownloadState.java b/src/main/java/chat/delta/rpc/types/DownloadState.java
new file mode 100644
index 000000000..4a8cbad3c
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/DownloadState.java
@@ -0,0 +1,10 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+public enum DownloadState {
+ Done,
+ Available,
+ Failure,
+ Undecipherable,
+ InProgress,
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/EphemeralTimer.java b/src/main/java/chat/delta/rpc/types/EphemeralTimer.java
new file mode 100644
index 000000000..fb4e34f72
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/EphemeralTimer.java
@@ -0,0 +1,28 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
+import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
+
+@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
+@JsonSubTypes({@Type(value = EphemeralTimer.Disabled.class, name="Disabled"), @Type(value = EphemeralTimer.Enabled.class, name="Enabled")})
+public abstract class EphemeralTimer {
+
+/* Timer is disabled. */
+ public static class Disabled extends EphemeralTimer {
+ }
+
+/* Timer is enabled. */
+ public static class Enabled extends EphemeralTimer {
+ /**
+ * Timer duration in seconds.
+ *
+ * The value cannot be 0.
+ */
+ public Integer duration;
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/Event.java b/src/main/java/chat/delta/rpc/types/Event.java
new file mode 100644
index 000000000..0d23609d7
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/Event.java
@@ -0,0 +1,9 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+public class Event {
+ /* Account ID. */
+ public Integer contextId;
+ /* Event payload. */
+ public EventType event;
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/EventType.java b/src/main/java/chat/delta/rpc/types/EventType.java
new file mode 100644
index 000000000..c5110c0d5
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/EventType.java
@@ -0,0 +1,412 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
+import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
+
+@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
+@JsonSubTypes({@Type(value = EventType.Info.class, name="Info"), @Type(value = EventType.SmtpConnected.class, name="SmtpConnected"), @Type(value = EventType.ImapConnected.class, name="ImapConnected"), @Type(value = EventType.SmtpMessageSent.class, name="SmtpMessageSent"), @Type(value = EventType.ImapMessageDeleted.class, name="ImapMessageDeleted"), @Type(value = EventType.ImapMessageMoved.class, name="ImapMessageMoved"), @Type(value = EventType.ImapInboxIdle.class, name="ImapInboxIdle"), @Type(value = EventType.NewBlobFile.class, name="NewBlobFile"), @Type(value = EventType.DeletedBlobFile.class, name="DeletedBlobFile"), @Type(value = EventType.Warning.class, name="Warning"), @Type(value = EventType.Error.class, name="Error"), @Type(value = EventType.ErrorSelfNotInGroup.class, name="ErrorSelfNotInGroup"), @Type(value = EventType.MsgsChanged.class, name="MsgsChanged"), @Type(value = EventType.ReactionsChanged.class, name="ReactionsChanged"), @Type(value = EventType.IncomingReaction.class, name="IncomingReaction"), @Type(value = EventType.IncomingWebxdcNotify.class, name="IncomingWebxdcNotify"), @Type(value = EventType.IncomingMsg.class, name="IncomingMsg"), @Type(value = EventType.IncomingMsgBunch.class, name="IncomingMsgBunch"), @Type(value = EventType.MsgsNoticed.class, name="MsgsNoticed"), @Type(value = EventType.MsgDelivered.class, name="MsgDelivered"), @Type(value = EventType.MsgFailed.class, name="MsgFailed"), @Type(value = EventType.MsgRead.class, name="MsgRead"), @Type(value = EventType.MsgDeleted.class, name="MsgDeleted"), @Type(value = EventType.ChatModified.class, name="ChatModified"), @Type(value = EventType.ChatEphemeralTimerModified.class, name="ChatEphemeralTimerModified"), @Type(value = EventType.ChatDeleted.class, name="ChatDeleted"), @Type(value = EventType.ContactsChanged.class, name="ContactsChanged"), @Type(value = EventType.LocationChanged.class, name="LocationChanged"), @Type(value = EventType.ConfigureProgress.class, name="ConfigureProgress"), @Type(value = EventType.ImexProgress.class, name="ImexProgress"), @Type(value = EventType.ImexFileWritten.class, name="ImexFileWritten"), @Type(value = EventType.SecurejoinInviterProgress.class, name="SecurejoinInviterProgress"), @Type(value = EventType.SecurejoinJoinerProgress.class, name="SecurejoinJoinerProgress"), @Type(value = EventType.ConnectivityChanged.class, name="ConnectivityChanged"), @Type(value = EventType.SelfavatarChanged.class, name="SelfavatarChanged"), @Type(value = EventType.ConfigSynced.class, name="ConfigSynced"), @Type(value = EventType.WebxdcStatusUpdate.class, name="WebxdcStatusUpdate"), @Type(value = EventType.WebxdcRealtimeData.class, name="WebxdcRealtimeData"), @Type(value = EventType.WebxdcRealtimeAdvertisementReceived.class, name="WebxdcRealtimeAdvertisementReceived"), @Type(value = EventType.WebxdcInstanceDeleted.class, name="WebxdcInstanceDeleted"), @Type(value = EventType.AccountsBackgroundFetchDone.class, name="AccountsBackgroundFetchDone"), @Type(value = EventType.ChatlistChanged.class, name="ChatlistChanged"), @Type(value = EventType.ChatlistItemChanged.class, name="ChatlistItemChanged"), @Type(value = EventType.AccountsChanged.class, name="AccountsChanged"), @Type(value = EventType.AccountsItemChanged.class, name="AccountsItemChanged"), @Type(value = EventType.EventChannelOverflow.class, name="EventChannelOverflow"), @Type(value = EventType.IncomingCall.class, name="IncomingCall"), @Type(value = EventType.IncomingCallAccepted.class, name="IncomingCallAccepted"), @Type(value = EventType.OutgoingCallAccepted.class, name="OutgoingCallAccepted"), @Type(value = EventType.CallEnded.class, name="CallEnded")})
+public abstract class EventType {
+
+/**
+ * The library-user may write an informational string to the log.
+ *
+ * This event should *not* be reported to the end-user using a popup or something like that.
+ */
+ public static class Info extends EventType {
+ public String msg;
+ }
+
+/* Emitted when SMTP connection is established and login was successful. */
+ public static class SmtpConnected extends EventType {
+ public String msg;
+ }
+
+/* Emitted when IMAP connection is established and login was successful. */
+ public static class ImapConnected extends EventType {
+ public String msg;
+ }
+
+/* Emitted when a message was successfully sent to the SMTP server. */
+ public static class SmtpMessageSent extends EventType {
+ public String msg;
+ }
+
+/* Emitted when an IMAP message has been marked as deleted */
+ public static class ImapMessageDeleted extends EventType {
+ public String msg;
+ }
+
+/* Emitted when an IMAP message has been moved */
+ public static class ImapMessageMoved extends EventType {
+ public String msg;
+ }
+
+/* Emitted before going into IDLE on the Inbox folder. */
+ public static class ImapInboxIdle extends EventType {
+ }
+
+/* Emitted when an new file in the $BLOBDIR was created */
+ public static class NewBlobFile extends EventType {
+ public String file;
+ }
+
+/* Emitted when an file in the $BLOBDIR was deleted */
+ public static class DeletedBlobFile extends EventType {
+ public String file;
+ }
+
+/**
+ * The library-user should write a warning string to the log.
+ *
+ * This event should *not* be reported to the end-user using a popup or something like that.
+ */
+ public static class Warning extends EventType {
+ public String msg;
+ }
+
+/**
+ * The library-user should report an error to the end-user.
+ *
+ * As most things are asynchronous, things may go wrong at any time and the user should not be disturbed by a dialog or so. Instead, use a bubble or so.
+ *
+ * However, for ongoing processes (eg. configure()) or for functions that are expected to fail (eg. autocryptContinueKeyTransfer()) it might be better to delay showing these events until the function has really failed (returned false). It should be sufficient to report only the *last* error in a message box then.
+ */
+ public static class Error extends EventType {
+ public String msg;
+ }
+
+/* An action cannot be performed because the user is not in the group. Reported eg. after a call to setChatName(), setChatProfileImage(), addContactToChat(), removeContactFromChat(), and messages sending functions. */
+ public static class ErrorSelfNotInGroup extends EventType {
+ public String msg;
+ }
+
+/* Messages or chats changed. One or more messages or chats changed for various reasons in the database: - Messages sent, received or removed - Chats created, deleted or archived - A draft has been set */
+ public static class MsgsChanged extends EventType {
+ /* Set if only a single chat is affected by the changes, otherwise 0. */
+ public Integer chatId;
+ /* Set if only a single message is affected by the changes, otherwise 0. */
+ public Integer msgId;
+ }
+
+/* Reactions for the message changed. */
+ public static class ReactionsChanged extends EventType {
+ /* ID of the chat which the message belongs to. */
+ public Integer chatId;
+ /* ID of the contact whose reaction set is changed. */
+ public Integer contactId;
+ /* ID of the message for which reactions were changed. */
+ public Integer msgId;
+ }
+
+/**
+ * A reaction to one's own sent message received. Typically, the UI will show a notification for that.
+ *
+ * In addition to this event, ReactionsChanged is emitted.
+ */
+ public static class IncomingReaction extends EventType {
+ /* ID of the chat which the message belongs to. */
+ public Integer chatId;
+ /* ID of the contact whose reaction set is changed. */
+ public Integer contactId;
+ /* ID of the message for which reactions were changed. */
+ public Integer msgId;
+ /* The reaction. */
+ public String reaction;
+ }
+
+/* Incoming webxdc info or summary update, should be notified. */
+ public static class IncomingWebxdcNotify extends EventType {
+ /* ID of the chat. */
+ public Integer chatId;
+ /* ID of the contact sending. */
+ public Integer contactId;
+ /* Link assigned to this notification, if any. */
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String href;
+ /* ID of the added info message or webxdc instance in case of summary change. */
+ public Integer msgId;
+ /* Text to notify. */
+ public String text;
+ }
+
+/**
+ * There is a fresh message. Typically, the user will show a notification when receiving this message.
+ *
+ * There is no extra #DC_EVENT_MSGS_CHANGED event sent together with this event.
+ */
+ public static class IncomingMsg extends EventType {
+ /* ID of the chat where the message is assigned. */
+ public Integer chatId;
+ /* ID of the message. */
+ public Integer msgId;
+ }
+
+/* Downloading a bunch of messages just finished. This is an event to allow the UI to only show one notification per message bunch, instead of cluttering the user with many notifications. */
+ public static class IncomingMsgBunch extends EventType {
+ }
+
+/* Messages were seen or noticed. chat id is always set. */
+ public static class MsgsNoticed extends EventType {
+ public Integer chatId;
+ }
+
+/* A single message is sent successfully. State changed from DC_STATE_OUT_PENDING to DC_STATE_OUT_DELIVERED, see `Message.state`. */
+ public static class MsgDelivered extends EventType {
+ /* ID of the chat which the message belongs to. */
+ public Integer chatId;
+ /* ID of the message that was successfully sent. */
+ public Integer msgId;
+ }
+
+/* A single message could not be sent. State changed from DC_STATE_OUT_PENDING or DC_STATE_OUT_DELIVERED to DC_STATE_OUT_FAILED, see `Message.state`. */
+ public static class MsgFailed extends EventType {
+ /* ID of the chat which the message belongs to. */
+ public Integer chatId;
+ /* ID of the message that could not be sent. */
+ public Integer msgId;
+ }
+
+/* A single message is read by the receiver. State changed from DC_STATE_OUT_DELIVERED to DC_STATE_OUT_MDN_RCVD, see `Message.state`. */
+ public static class MsgRead extends EventType {
+ /* ID of the chat which the message belongs to. */
+ public Integer chatId;
+ /* ID of the message that was read. */
+ public Integer msgId;
+ }
+
+/**
+ * A single message was deleted.
+ *
+ * This event means that the message will no longer appear in the messagelist. UI should remove the message from the messagelist in response to this event if the message is currently displayed.
+ *
+ * The message may have been explicitly deleted by the user or expired. Internally the message may have been removed from the database, moved to the trash chat or hidden.
+ *
+ * This event does not indicate the message deletion from the server.
+ */
+ public static class MsgDeleted extends EventType {
+ /* ID of the chat where the message was prior to deletion. Never 0. */
+ public Integer chatId;
+ /* ID of the deleted message. Never 0. */
+ public Integer msgId;
+ }
+
+/**
+ * Chat changed. The name or the image of a chat group was changed or members were added or removed. See setChatName(), setChatProfileImage(), addContactToChat() and removeContactFromChat().
+ *
+ * This event does not include ephemeral timer modification, which is a separate event.
+ */
+ public static class ChatModified extends EventType {
+ public Integer chatId;
+ }
+
+/* Chat ephemeral timer changed. */
+ public static class ChatEphemeralTimerModified extends EventType {
+ /* Chat ID. */
+ public Integer chatId;
+ /* New ephemeral timer value. */
+ public Integer timer;
+ }
+
+/* Chat deleted. */
+ public static class ChatDeleted extends EventType {
+ /* Chat ID. */
+ public Integer chat_id;
+ }
+
+/* Contact(s) created, renamed, blocked or deleted. */
+ public static class ContactsChanged extends EventType {
+ /* If set, this is the contact_id of an added contact that should be selected. */
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public Integer contactId;
+ }
+
+/* Location of one or more contact has changed. */
+ public static class LocationChanged extends EventType {
+ /* contact_id of the contact for which the location has changed. If the locations of several contacts have been changed, this parameter is set to `None`. */
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public Integer contactId;
+ }
+
+/* Inform about the configuration progress started by configure(). */
+ public static class ConfigureProgress extends EventType {
+ /* Progress comment or error, something to display to the user. */
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String comment;
+ /**
+ * Progress.
+ *
+ * 0=error, 1-999=progress in permille, 1000=success and done
+ */
+ public Integer progress;
+ }
+
+/* Inform about the import/export progress started by imex(). */
+ public static class ImexProgress extends EventType {
+ /* 0=error, 1-999=progress in permille, 1000=success and done */
+ public Integer progress;
+ }
+
+/**
+ * A file has been exported. A file has been written by imex(). This event may be sent multiple times by a single call to imex().
+ *
+ * A typical purpose for a handler of this event may be to make the file public to some system services.
+ *
+ * @param data2 0
+ */
+ public static class ImexFileWritten extends EventType {
+ public String path;
+ }
+
+/**
+ * Progress event sent when SecureJoin protocol has finished from the view of the inviter (Alice, the person who shows the QR code).
+ *
+ * These events are typically sent after a joiner has scanned the QR code generated by getChatSecurejoinQrCodeSvg().
+ */
+ public static class SecurejoinInviterProgress extends EventType {
+ /* ID of the chat in case of success. */
+ public Integer chatId;
+ /* The type of the joined chat. This can take the same values as `BasicChat.chatType` ([`crate::api::types::chat::BasicChat::chat_type`]). */
+ public ChatType chatType;
+ /* ID of the contact that wants to join. */
+ public Integer contactId;
+ /* Progress, always 1000. */
+ public Integer progress;
+ }
+
+/* Progress information of a secure-join handshake from the view of the joiner (Bob, the person who scans the QR code). The events are typically sent while secureJoin(), which may take some time, is executed. */
+ public static class SecurejoinJoinerProgress extends EventType {
+ /* ID of the inviting contact. */
+ public Integer contactId;
+ /* Progress as: 400=vg-/vc-request-with-auth sent, typically shown as "alice@addr verified, introducing myself." (Bob has verified alice and waits until Alice does the same for him) 1000=vg-member-added/vc-contact-confirm received */
+ public Integer progress;
+ }
+
+/* The connectivity to the server changed. This means that you should refresh the connectivity view and possibly the connectivtiy HTML; see getConnectivity() and getConnectivityHtml() for details. */
+ public static class ConnectivityChanged extends EventType {
+ }
+
+/* Deprecated by `ConfigSynced`. */
+ public static class SelfavatarChanged extends EventType {
+ }
+
+/* A multi-device synced config value changed. Maybe the app needs to refresh smth. For uniformity this is emitted on the source device too. The value isn't here, otherwise it would be logged which might not be good for privacy. */
+ public static class ConfigSynced extends EventType {
+ /* Configuration key. */
+ public String key;
+ }
+
+ public static class WebxdcStatusUpdate extends EventType {
+ /* Message ID. */
+ public Integer msgId;
+ /* Status update ID. */
+ public Integer statusUpdateSerial;
+ }
+
+/* Data received over an ephemeral peer channel. */
+ public static class WebxdcRealtimeData extends EventType {
+ /* Realtime data. */
+ public java.util.List
+ * This event is only emitted by the account manager
+ */
+ public static class AccountsBackgroundFetchDone extends EventType {
+ }
+
+/**
+ * Inform that set of chats or the order of the chats in the chatlist has changed.
+ *
+ * Sometimes this is emitted together with `UIChatlistItemChanged`.
+ */
+ public static class ChatlistChanged extends EventType {
+ }
+
+/* Inform that a single chat list item changed and needs to be rerendered. If `chat_id` is set to None, then all currently visible chats need to be rerendered, and all not-visible items need to be cleared from cache if the UI has a cache. */
+ public static class ChatlistItemChanged extends EventType {
+ /* ID of the changed chat */
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public Integer chatId;
+ }
+
+/**
+ * Inform that the list of accounts has changed (an account removed or added or (not yet implemented) the account order changes)
+ *
+ * This event is only emitted by the account manager
+ */
+ public static class AccountsChanged extends EventType {
+ }
+
+/**
+ * Inform that an account property that might be shown in the account list changed, namely: - is_configured (see is_configured()) - displayname - selfavatar - private_tag
+ *
+ * This event is emitted from the account whose property changed.
+ */
+ public static class AccountsItemChanged extends EventType {
+ }
+
+/* Inform than some events have been skipped due to event channel overflow. */
+ public static class EventChannelOverflow extends EventType {
+ /* Number of events skipped. */
+ public Integer n;
+ }
+
+/* Incoming call. */
+ public static class IncomingCall extends EventType {
+ /* ID of the chat which the message belongs to. */
+ public Integer chat_id;
+ /* True if incoming call is a video call. */
+ public Boolean has_video;
+ /* ID of the info message referring to the call. */
+ public Integer msg_id;
+ /* User-defined info as passed to place_outgoing_call() */
+ public String place_call_info;
+ }
+
+/* Incoming call accepted. This is esp. interesting to stop ringing on other devices. */
+ public static class IncomingCallAccepted extends EventType {
+ /* ID of the chat which the message belongs to. */
+ public Integer chat_id;
+ /* ID of the info message referring to the call. */
+ public Integer msg_id;
+ }
+
+/* Outgoing call accepted. */
+ public static class OutgoingCallAccepted extends EventType {
+ /* User-defined info passed to dc_accept_incoming_call( */
+ public String accept_call_info;
+ /* ID of the chat which the message belongs to. */
+ public Integer chat_id;
+ /* ID of the info message referring to the call. */
+ public Integer msg_id;
+ }
+
+/* Call ended. */
+ public static class CallEnded extends EventType {
+ /* ID of the chat which the message belongs to. */
+ public Integer chat_id;
+ /* ID of the info message referring to the call. */
+ public Integer msg_id;
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/FullChat.java b/src/main/java/chat/delta/rpc/types/FullChat.java
new file mode 100644
index 000000000..141a57b02
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/FullChat.java
@@ -0,0 +1,42 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+public class FullChat {
+ public Boolean archived;
+ public Boolean canSend;
+ public ChatType chatType;
+ public String color;
+ public java.util.List
+ * False if the chat is unencrypted. This means that all messages in the chat are unencrypted, and all contacts in the chat are "address-contacts", i.e. identified by the email address. The UI should mark this chat e.g. with a mail-letter icon.
+ *
+ * Unencrypted groups are called "ad-hoc groups" and the user can't add/remove members, create a QR invite code, or set an avatar. These options should therefore be disabled in the UI.
+ *
+ * Note that it can happen that an encrypted chat contains unencrypted messages that were received in core <= v1.159.* and vice versa.
+ *
+ * See also `is_key_contact` on `Contact`.
+ */
+ public Boolean isEncrypted;
+ public Boolean isMuted;
+ public Boolean isSelfTalk;
+ public Boolean isUnpromoted;
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String mailingListAddress;
+ public String name;
+ /* Contact IDs of the past chat members. */
+ public java.util.List
+ * Today, the UIs should instead show a small email-icon on the message if `show_padlock` is `false`, and nothing if it is `true`.
+ */
+ public Boolean showPadlock;
+ public Integer sortTimestamp;
+ public Integer state;
+ public String subject;
+ /* when is_info is true this describes what type of system message it is */
+ public SystemMessageType systemMessageType;
+ public String text;
+ public Integer timestamp;
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public VcardContact vcardContact;
+ public Viewtype viewType;
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String webxdcHref;
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/MessageData.java b/src/main/java/chat/delta/rpc/types/MessageData.java
new file mode 100644
index 000000000..647b586e0
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/MessageData.java
@@ -0,0 +1,24 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+public class MessageData {
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String file;
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String filename;
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String html;
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public Pair
+ * Today, the UIs should instead show a small email-icon on the message if `show_padlock` is `false`, and nothing if it is `true`.
+ */
+ public Boolean showPadlock;
+ public Integer sortTimestamp;
+ public Integer state;
+ public String subject;
+ /* when is_info is true this describes what type of system message it is */
+ public SystemMessageType systemMessageType;
+ public String text;
+ public Integer timestamp;
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public VcardContact vcardContact;
+ public Viewtype viewType;
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String webxdcHref;
+ }
+
+ public static class LoadingError extends MessageLoadResult {
+ public String error;
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/MessageNotificationInfo.java b/src/main/java/chat/delta/rpc/types/MessageNotificationInfo.java
new file mode 100644
index 000000000..c8b6669b3
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/MessageNotificationInfo.java
@@ -0,0 +1,20 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+public class MessageNotificationInfo {
+ public Integer accountId;
+ public Integer chatId;
+ public String chatName;
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String chatProfileImage;
+ public Integer id;
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String image;
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String imageMimeType;
+ /* also known as summary_text1 */
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String summaryPrefix;
+ /* also known as summary_text2 */
+ public String summaryText;
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/MessageQuote.java b/src/main/java/chat/delta/rpc/types/MessageQuote.java
new file mode 100644
index 000000000..3a11ee806
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/MessageQuote.java
@@ -0,0 +1,33 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
+import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
+
+@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
+@JsonSubTypes({@Type(value = MessageQuote.JustText.class, name="JustText"), @Type(value = MessageQuote.WithMessage.class, name="WithMessage")})
+public abstract class MessageQuote {
+
+ public static class JustText extends MessageQuote {
+ public String text;
+ }
+
+ public static class WithMessage extends MessageQuote {
+ public String authorDisplayColor;
+ public String authorDisplayName;
+ /* The quoted message does not always belong to the same chat, e.g. when "Reply Privately" is used. */
+ public Integer chatId;
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String image;
+ public Boolean isForwarded;
+ public Integer messageId;
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String overrideSenderName;
+ public String text;
+ public Viewtype viewType;
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/MessageReadReceipt.java b/src/main/java/chat/delta/rpc/types/MessageReadReceipt.java
new file mode 100644
index 000000000..88c4e1908
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/MessageReadReceipt.java
@@ -0,0 +1,7 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+public class MessageReadReceipt {
+ public Integer contactId;
+ public Integer timestamp;
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/MessageSearchResult.java b/src/main/java/chat/delta/rpc/types/MessageSearchResult.java
new file mode 100644
index 000000000..d5caadc74
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/MessageSearchResult.java
@@ -0,0 +1,22 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+public class MessageSearchResult {
+ public String authorColor;
+ public Integer authorId;
+ /* if sender name if overridden it will show it as ~alias */
+ public String authorName;
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String authorProfileImage;
+ public String chatColor;
+ public Integer chatId;
+ public String chatName;
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String chatProfileImage;
+ public ChatType chatType;
+ public Integer id;
+ public Boolean isChatArchived;
+ public Boolean isChatContactRequest;
+ public String message;
+ public Integer timestamp;
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/MuteDuration.java b/src/main/java/chat/delta/rpc/types/MuteDuration.java
new file mode 100644
index 000000000..88363bfbb
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/MuteDuration.java
@@ -0,0 +1,24 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
+import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
+
+@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
+@JsonSubTypes({@Type(value = MuteDuration.NotMuted.class, name="NotMuted"), @Type(value = MuteDuration.Forever.class, name="Forever"), @Type(value = MuteDuration.Until.class, name="Until")})
+public abstract class MuteDuration {
+
+ public static class NotMuted extends MuteDuration {
+ }
+
+ public static class Forever extends MuteDuration {
+ }
+
+ public static class Until extends MuteDuration {
+ public Integer duration;
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/NotifyState.java b/src/main/java/chat/delta/rpc/types/NotifyState.java
new file mode 100644
index 000000000..41f2ea388
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/NotifyState.java
@@ -0,0 +1,13 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+public enum NotifyState {
+ /* Not subscribed to push notifications. */
+ NotConnected,
+
+ /* Subscribed to heartbeat push notifications. */
+ Heartbeat,
+
+ /* Subscribed to push notifications for new messages. */
+ Connected,
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/Pair.java b/src/main/java/chat/delta/rpc/types/Pair.java
new file mode 100644
index 000000000..141be5c22
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/Pair.java
@@ -0,0 +1,36 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+public class Pair
+ * If the user agrees, pass this QR code to [`crate::securejoin::join_securejoin`].
+ */
+ public static class AskVerifyContact extends Qr {
+ /* Authentication code. */
+ public String authcode;
+ /* ID of the contact. */
+ public Integer contact_id;
+ /* Fingerprint of the contact key as scanned from the QR code. */
+ public String fingerprint;
+ /* Invite number. */
+ public String invitenumber;
+ }
+
+/* Ask the user whether to join the group. */
+ public static class AskVerifyGroup extends Qr {
+ /* Authentication code. */
+ public String authcode;
+ /* ID of the contact. */
+ public Integer contact_id;
+ /* Fingerprint of the contact key as scanned from the QR code. */
+ public String fingerprint;
+ /* Group ID. */
+ public String grpid;
+ /* Group name. */
+ public String grpname;
+ /* Invite number. */
+ public String invitenumber;
+ }
+
+/* Ask the user whether to join the broadcast channel. */
+ public static class AskJoinBroadcast extends Qr {
+ /* Authentication code. */
+ public String authcode;
+ /* ID of the contact who owns the broadcast channel and created the QR code. */
+ public Integer contact_id;
+ /* Fingerprint of the broadcast channel owner's key as scanned from the QR code. */
+ public String fingerprint;
+ /* A string of random characters, uniquely identifying this broadcast channel across all databases/clients. Called `grpid` for historic reasons: The id of multi-user chats is always called `grpid` in the database because groups were once the only multi-user chats. */
+ public String grpid;
+ /* Invite number. */
+ public String invitenumber;
+ /* The user-visible name of this broadcast channel */
+ public String name;
+ }
+
+/**
+ * Contact fingerprint is verified.
+ *
+ * Ask the user if they want to start chatting.
+ */
+ public static class FprOk extends Qr {
+ /* Contact ID. */
+ public Integer contact_id;
+ }
+
+/* Scanned fingerprint does not match the last seen fingerprint. */
+ public static class FprMismatch extends Qr {
+ /* Contact ID. */
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public Integer contact_id;
+ }
+
+/* The scanned QR code contains a fingerprint but no e-mail address. */
+ public static class FprWithoutAddr extends Qr {
+ /* Key fingerprint. */
+ public String fingerprint;
+ }
+
+/* Ask the user if they want to create an account on the given domain. */
+ public static class Account extends Qr {
+ /* Server domain name. */
+ public String domain;
+ }
+
+/* Provides a backup that can be retrieved using iroh-net based backup transfer protocol. */
+ public static class Backup2 extends Qr {
+ /* Authentication token. */
+ public String auth_token;
+ /* Iroh node address. */
+ public String node_addr;
+ }
+
+ public static class BackupTooNew extends Qr {
+ }
+
+/* Ask the user if they want to use the given service for video chats. */
+ public static class WebrtcInstance extends Qr {
+ public String domain;
+ public String instance_pattern;
+ }
+
+/**
+ * Ask the user if they want to use the given proxy.
+ *
+ * Note that HTTP(S) URLs without a path and query parameters are treated as HTTP(S) proxy URL. UI may want to still offer to open the URL in the browser if QR code contents starts with `http://` or `https://` and the QR code was not scanned from the proxy configuration screen.
+ */
+ public static class Proxy extends Qr {
+ /* Host extracted from the URL to display in the UI. */
+ public String host;
+ /* Port extracted from the URL to display in the UI. */
+ public Integer port;
+ /**
+ * Proxy URL.
+ *
+ * This is the URL that is going to be added.
+ */
+ public String url;
+ }
+
+/**
+ * Contact address is scanned.
+ *
+ * Optionally, a draft message could be provided. Ask the user if they want to start chatting.
+ */
+ public static class Addr extends Qr {
+ /* Contact ID. */
+ public Integer contact_id;
+ /* Draft message. */
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String draft;
+ }
+
+/**
+ * URL scanned.
+ *
+ * Ask the user if they want to open a browser or copy the URL to clipboard.
+ */
+ public static class Url extends Qr {
+ public String url;
+ }
+
+/**
+ * Text scanned.
+ *
+ * Ask the user if they want to copy the text to clipboard.
+ */
+ public static class Text extends Qr {
+ public String text;
+ }
+
+/* Ask the user if they want to withdraw their own QR code. */
+ public static class WithdrawVerifyContact extends Qr {
+ /* Authentication code. */
+ public String authcode;
+ /* Contact ID. */
+ public Integer contact_id;
+ /* Fingerprint of the contact key as scanned from the QR code. */
+ public String fingerprint;
+ /* Invite number. */
+ public String invitenumber;
+ }
+
+/* Ask the user if they want to withdraw their own group invite QR code. */
+ public static class WithdrawVerifyGroup extends Qr {
+ /* Authentication code. */
+ public String authcode;
+ /* Contact ID. */
+ public Integer contact_id;
+ /* Fingerprint of the contact key as scanned from the QR code. */
+ public String fingerprint;
+ /* Group ID. */
+ public String grpid;
+ /* Group name. */
+ public String grpname;
+ /* Invite number. */
+ public String invitenumber;
+ }
+
+/* Ask the user if they want to withdraw their own broadcast channel invite QR code. */
+ public static class WithdrawJoinBroadcast extends Qr {
+ /* Authentication code. */
+ public String authcode;
+ /* Contact ID. Always `ContactId::SELF`. */
+ public Integer contact_id;
+ /* Fingerprint of the contact key as scanned from the QR code. */
+ public String fingerprint;
+ /* ID, uniquely identifying this chat. Called grpid for historic reasons. */
+ public String grpid;
+ /* Invite number. */
+ public String invitenumber;
+ /* Broadcast name. */
+ public String name;
+ }
+
+/* Ask the user if they want to revive their own QR code. */
+ public static class ReviveVerifyContact extends Qr {
+ /* Authentication code. */
+ public String authcode;
+ /* Contact ID. */
+ public Integer contact_id;
+ /* Fingerprint of the contact key as scanned from the QR code. */
+ public String fingerprint;
+ /* Invite number. */
+ public String invitenumber;
+ }
+
+/* Ask the user if they want to revive their own group invite QR code. */
+ public static class ReviveVerifyGroup extends Qr {
+ /* Authentication code. */
+ public String authcode;
+ /* Contact ID. */
+ public Integer contact_id;
+ /* Fingerprint of the contact key as scanned from the QR code. */
+ public String fingerprint;
+ /* Group ID. */
+ public String grpid;
+ /* Contact ID. */
+ public String grpname;
+ /* Invite number. */
+ public String invitenumber;
+ }
+
+/* Ask the user if they want to revive their own broadcast channel invite QR code. */
+ public static class ReviveJoinBroadcast extends Qr {
+ /* Authentication code. */
+ public String authcode;
+ /* Contact ID. Always `ContactId::SELF`. */
+ public Integer contact_id;
+ /* Fingerprint of the contact key as scanned from the QR code. */
+ public String fingerprint;
+ /* Globally unique chat ID. Called grpid for historic reasons. */
+ public String grpid;
+ /* Invite number. */
+ public String invitenumber;
+ /* Broadcast name. */
+ public String name;
+ }
+
+/**
+ * `dclogin:` scheme parameters.
+ *
+ * Ask the user if they want to login with the email address.
+ */
+ public static class Login extends Qr {
+ public String address;
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/SecurejoinSource.java b/src/main/java/chat/delta/rpc/types/SecurejoinSource.java
new file mode 100644
index 000000000..e9688b9e6
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/SecurejoinSource.java
@@ -0,0 +1,22 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+public enum SecurejoinSource {
+ /* Because of some problem, it is unknown where the QR code came from. */
+ Unknown,
+
+ /* The user opened a link somewhere outside Delta Chat */
+ ExternalLink,
+
+ /* The user clicked on a link in a message inside Delta Chat */
+ InternalLink,
+
+ /* The user clicked "Paste from Clipboard" in the QR scan activity */
+ Clipboard,
+
+ /* The user clicked "Load QR code as image" in the QR scan activity */
+ ImageLoaded,
+
+ /* The user scanned a QR code */
+ Scan,
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/SecurejoinUiPath.java b/src/main/java/chat/delta/rpc/types/SecurejoinUiPath.java
new file mode 100644
index 000000000..9cbe52e90
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/SecurejoinUiPath.java
@@ -0,0 +1,13 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+public enum SecurejoinUiPath {
+ /* The UI path is unknown, or the user didn't open the QR code screen at all. */
+ Unknown,
+
+ /* The user directly clicked on the QR icon in the main screen */
+ QrIcon,
+
+ /* The user first clicked on the `+` button in the main screen, and then on "New Contact" */
+ NewContact,
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/SystemMessageType.java b/src/main/java/chat/delta/rpc/types/SystemMessageType.java
new file mode 100644
index 000000000..f10b2c1a9
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/SystemMessageType.java
@@ -0,0 +1,39 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+public enum SystemMessageType {
+ Unknown,
+ GroupNameChanged,
+ GroupImageChanged,
+ MemberAddedToGroup,
+ MemberRemovedFromGroup,
+ AutocryptSetupMessage,
+ SecurejoinMessage,
+ LocationStreamingEnabled,
+ LocationOnly,
+ InvalidUnencryptedMail,
+ ChatE2ee,
+ ChatProtectionEnabled,
+ ChatProtectionDisabled,
+ WebxdcStatusUpdate,
+ CallAccepted,
+ CallEnded,
+
+ /* 1:1 chats info message telling that SecureJoin has started and the user should wait for it to complete. */
+ SecurejoinWait,
+
+ /* 1:1 chats info message telling that SecureJoin is still running, but the user may already send messages. */
+ SecurejoinWaitTimeout,
+
+ /* Chat ephemeral message timer is changed. */
+ EphemeralTimerChanged,
+
+ /* Self-sent-message that contains only json used for multi-device-sync; if possible, we attach that to other messages as for locations. */
+ MultiDeviceSync,
+
+ /* Webxdc info added with `info` set in `send_webxdc_status_update()`. */
+ WebxdcInfoMessage,
+
+ /* This message contains a users iroh node address. */
+ IrohNodeAddr,
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/Viewtype.java b/src/main/java/chat/delta/rpc/types/Viewtype.java
new file mode 100644
index 000000000..f7cf9f9a0
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/Viewtype.java
@@ -0,0 +1,43 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+public enum Viewtype {
+ Unknown,
+
+ /* Text message. */
+ Text,
+
+ /* Image message. If the image is an animated GIF, the type `Viewtype.Gif` should be used. */
+ Image,
+
+ /* Animated GIF message. */
+ Gif,
+
+ /**
+ * Message containing a sticker, similar to image. NB: When sending, the message viewtype may be changed to `Image` by some heuristics like checking for transparent pixels. Use `Message::force_sticker()` to disable them.
+ *
+ * If possible, the ui should display the image without borders in a transparent way. A click on a sticker will offer to install the sticker set in some future.
+ */
+ Sticker,
+
+ /* Message containing an Audio file. */
+ Audio,
+
+ /* A voice message that was directly recorded by the user. For all other audio messages, the type `Viewtype.Audio` should be used. */
+ Voice,
+
+ /* Video messages. */
+ Video,
+
+ /* Message containing any file, eg. a PDF. */
+ File,
+
+ /* Message is a call. */
+ Call,
+
+ /* Message is an webxdc instance. */
+ Webxdc,
+
+ /* Message containing shared contacts represented as a vCard (virtual contact file) with email addresses and possibly other fields. Use `parse_vcard()` to retrieve them. */
+ Vcard,
+}
\ No newline at end of file
diff --git a/src/main/java/chat/delta/rpc/types/WebxdcMessageInfo.java b/src/main/java/chat/delta/rpc/types/WebxdcMessageInfo.java
new file mode 100644
index 000000000..8b869d7ed
--- /dev/null
+++ b/src/main/java/chat/delta/rpc/types/WebxdcMessageInfo.java
@@ -0,0 +1,36 @@
+/* Autogenerated file, do not edit manually */
+package chat.delta.rpc.types;
+
+public class WebxdcMessageInfo {
+ /* if the Webxdc represents a document, then this is the name of the document */
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String document;
+ /**
+ * App icon file name. Defaults to an standard icon if nothing is set in the manifest.
+ *
+ * To get the file, use dc_msg_get_webxdc_blob(). (not yet in jsonrpc, use rust api or cffi for it)
+ *
+ * App icons should should be square, the implementations will add round corners etc. as needed.
+ */
+ public String icon;
+ /* True if full internet access should be granted to the app. */
+ public Boolean internetAccess;
+ /**
+ * The name of the app.
+ *
+ * Defaults to the filename if not set in the manifest.
+ */
+ public String name;
+ /* Address to be used for `window.webxdc.selfAddr` in JS land. */
+ public String selfAddr;
+ /* Milliseconds to wait before calling `sendUpdate()` again since the last call. Should be exposed to `window.sendUpdateInterval` in JS land. */
+ public Integer sendUpdateInterval;
+ /* Maximum number of bytes accepted for a serialized update object. Should be exposed to `window.sendUpdateMaxSize` in JS land. */
+ public Integer sendUpdateMaxSize;
+ /* URL where the source code of the Webxdc and other information can be found; defaults to an empty string. Implementations may offer an menu or a button to open this URL. */
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String sourceCodeUrl;
+ /* short string describing the state of the app, sth. as "2 votes", "Highscore: 123", can be changed by the apps */
+ @com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
+ public String summary;
+}
\ No newline at end of file
From d9daae7f416f221bd2ac1d4ea1140126c233e84e Mon Sep 17 00:00:00 2001
From: adbenitez