Skip to content

Commit 36fcdff

Browse files
authored
Merge pull request #156 from ilyarolf/develop
Develop
2 parents 1ddf8ad + 0e3378e commit 36fcdff

File tree

15 files changed

+198
-87
lines changed

15 files changed

+198
-87
lines changed

bot.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
from models.user import UserAdmin
3535
from processing.processing import processing_router
3636
from repositories.button_media import ButtonMediaRepository
37+
from services.media import MediaService
3738
from services.notification import NotificationService
3839
from services.wallet import WalletService
3940
from utils.utils import validate_i18n
@@ -91,16 +92,20 @@ async def on_startup():
9192
if photos.total_count == 0:
9293
photo_id_list = []
9394
for admin_id in config.ADMIN_ID_LIST:
94-
msg = await bot.send_photo(chat_id=admin_id,
95-
photo=URLInputFile(url="https://i.imgur.com/CxWRPwY.png",
96-
filename="no_image.png"))
97-
bot_photo_id = msg.photo[-1].file_id
98-
photo_id_list.append(bot_photo_id)
95+
try:
96+
msg = await bot.send_photo(chat_id=admin_id,
97+
photo=URLInputFile(url="https://img.freepik.com/premium-vector/no-photo-available-vector-icon-default-image-symbol-picture-coming-soon-web-site-mobile-app_87543-18055.jpg",
98+
filename="no_image.png"))
99+
bot_photo_id = msg.photo[-1].file_id
100+
photo_id_list.append(bot_photo_id)
101+
except Exception as _:
102+
pass
99103
bot_photo_id = photo_id_list[0]
100104
else:
101105
bot_photo_id = photos.photos[0][-1].file_id
102106
with open("static/no_image.jpeg", "w") as f:
103107
f.write(bot_photo_id)
108+
await MediaService.update_inaccessible_media(bot)
104109
validate_i18n()
105110
await ButtonMediaRepository.init_buttons_media()
106111
if config.CRYPTO_FORWARDING_MODE:

crypto_api/CryptoApiWrapper.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ async def fetch_api_request(url: str, params: dict | None = None, method: str =
2020
async def get_crypto_prices() -> dict:
2121
url = f"https://api.coingecko.com/api/v3/simple/price"
2222
params = {
23-
"ids": "bitcoin,litecoin,solana,ethereum,binancecoin",
23+
"ids": "bitcoin,litecoin,solana,ethereum,binancecoin,tether,usd-coin",
2424
"vs_currencies": "usd,eur,gbp,jpy,cad"
2525
}
2626
return await CryptoApiWrapper.fetch_api_request(url, params)
2727

2828
@staticmethod
29-
async def get_wallet_balance() -> dict:
29+
async def get_wallet_balance() -> dict[Cryptocurrency, float]:
3030
url = f"{config.KRYPTO_EXPRESS_API_URL}/wallet"
3131
headers = {
3232
"X-Api-Key": config.KRYPTO_EXPRESS_API_KEY
@@ -35,7 +35,7 @@ async def get_wallet_balance() -> dict:
3535
url,
3636
headers=headers
3737
)
38-
return {k: v for k, v in response.items() if v > 0}
38+
return {Cryptocurrency(k): v for k, v in response.items()}
3939

4040
@staticmethod
4141
async def withdrawal(cryptocurrency: Cryptocurrency,

handlers/admin/announcement.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,8 @@ async def send_confirmation(**kwargs):
5959
callback_data: AnnouncementCallback = kwargs.get("callback_data")
6060
session: AsyncSession = kwargs.get("session")
6161
language: Language = kwargs.get("language")
62-
msg = await AnnouncementService.send_announcement(callback, callback_data, session, language)
63-
if callback.message.caption:
64-
await callback.message.delete()
65-
await callback.message.answer(text=msg)
66-
elif callback.message.text:
67-
await callback.message.edit_text(text=msg)
62+
await AnnouncementService.send_announcement(callback, callback_data, session, language)
63+
await callback.message.delete()
6864

6965

7066
@announcement_router.callback_query(AdminIdFilter(), AnnouncementCallback.filter())

i18n/de.json

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,8 @@
3131
"credit_management_request_user_entity": "👤 <b>Sende die Telegram-ID oder den Benutzernamen des Nutzers:</b>",
3232
"credit_management_user_not_found": "⚠️ <b>Nutzer nicht gefunden.</b>",
3333
"crypto_withdraw": "👛 Wallet",
34-
"crypto_wallet": "\n\n<b>🤖 Bot-Guthaben\n\n⚖️ BTC-Saldo: <code>{btc_balance}</code> BTC\n⚖️ LTC-Saldo: <code>{ltc_balance}</code> LTC\n⚖️ ETH-Saldo: <code>{eth_balance}</code> ETH\n⚖️ SOL-Saldo: <code>{sol_balance}</code> SOL\n⚖️ BNB-Saldo: <code>{bnb_balance}</code> BNB</b>",
3534
"current_stock_header": "🗂️ Aktueller Lagerbestand\n",
3635
"deposits_statistics": "📊 Einzahlungsstatistik",
37-
"deposits_statistics_msg": "📊 <b>Einzahlungsstatistiken der letzten {timedelta}.\n\n💸 Gesamteinzahlungen: {deposits_count}\n\n💰 BTC-Einzahlungen in Höhe von: {btc_amount} BTC\n💰 LTC-Einzahlungen in Höhe von: {ltc_amount} LTC\n💰 SOL-Einzahlungen in Höhe von: {sol_amount} SOL\n💰 ETH-Einzahlungen in Höhe von: {eth_amount} ETH\n💰 BNB-Einzahlungen in Höhe von: {bnb_amount} BNB\n\n💼 Gesamtbetrag in Fiat: {fiat_amount:.2f} {currency_text}</b>",
3836
"delete_entity": "🗑️ {entity} löschen",
3937
"delete_entity_confirmation": "❓ <b>Möchtest du {entity} mit dem Namen <u>{entity_name}</u> wirklich löschen?</b>",
4038
"get_database_file": "💾 Datenbankdatei herunterladen",
@@ -55,7 +53,6 @@
5553
"restocking_message_header": "🆕 Neue Lagerbestände! 🆕\n",
5654
"sales_statistics": "📊 <b>Verkaufsstatistiken der letzten {timedelta}.\n💰 Gesamtgewinn: {currency_sym}{total_profit:.2f}\n🛍️ Verkaufte Artikel: {items_sold}\n💼 Gesamtkäufe: {buys_count}</b>",
5755
"send_everyone": "📢 An alle senden",
58-
"sending_result": "✅ <b>Nachricht an {counter} von {len} aktiven Nutzern gesendet.\nGesamtzahl der Nutzer: {users_count}</b>",
5956
"sending_started": "🚀 Versand gestartet",
6057
"stock": "📦 Vollständige Lagerbestandsmeldung",
6158
"statistics": "📊 Analytik und Berichte",
@@ -135,7 +132,14 @@
135132
"remove_review_image_confirmation": "❓ <b>Sind Sie sicher, dass Sie das Bewertungsbild entfernen möchten?</b>",
136133
"reviews_management": "⭐ Bewertungsverwaltung",
137134
"notification_new_deposit_id": "💰 Neue Einzahlung von Benutzer mit ID {telegram_id} für {currency_sym}{deposit_amount_fiat:.2f} mit 💰 {value} {crypto_name}\n💰 Empfehlungsbonus: {currency_sym}{referral_bonus:.2f}\n💰 Empfehlerbonus: {currency_sym}{referrer_bonus:.2f}",
138-
"notification_new_deposit_username": "💰 Neue Einzahlung von Benutzer mit Benutzername @{username} für {currency_sym}{deposit_amount_fiat:.2f} mit 💰 {value} {crypto_name}\n💰 Empfehlungsbonus: {currency_sym}{referral_bonus:.2f}\n💰 Empfehlerbonus: {currency_sym}{referrer_bonus:.2f}"
135+
"notification_new_deposit_username": "💰 Neue Einzahlung von Benutzer mit Benutzername @{username} für {currency_sym}{deposit_amount_fiat:.2f} mit 💰 {value} {crypto_name}\n💰 Empfehlungsbonus: {currency_sym}{referral_bonus:.2f}\n💰 Empfehlerbonus: {currency_sym}{referrer_bonus:.2f}",
136+
"crypto_wallet": "\n\n<b>🤖 Bot-Guthaben\n\n{wallet_content}</b>",
137+
"crypto_wallet_line": "⚖️ {crypto_name} Guthaben: <code>{crypto_balance:.8f}</code> {crypto_name}",
138+
"deposits_statistics_msg": "📊 <b>Einzahlungsstatistiken der letzten {timedelta}.\n\n💰 Gesamteinzahlungen: {deposits_count}\n\n{deposits_content}\n\n💼 Gesamte Kryptowährungseinzahlungen im Wert: {fiat_amount:.2f} {currency_text}</b>",
139+
"deposits_statistics_line": "💰 Gesamte {crypto_name}-Einzahlungen im Wert: {crypto_amount:.8f} {crypto_name}",
140+
"sending_result": "✅ <b>Nachricht an {counter} von {len} aktiven Benutzern gesendet.\n👤 Benutzer insgesamt: {users_count}\nStatus: {status}</b>",
141+
"in_progress": "🟡 In Bearbeitung...",
142+
"finished": "🟢 Abgeschlossen."
139143
},
140144
"common": {
141145
"back_button": "⬅️ Zurück",

i18n/en.json

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,8 @@
3131
"credit_management_request_user_entity": "👤 <b>Send the user's telegram id or their telegram username:</b>",
3232
"credit_management_user_not_found": "⚠️ <b>The user with this data is not found in the database.</b>",
3333
"crypto_withdraw": "👛 Wallet",
34-
"crypto_wallet": "\n\n<b>\uD83E\uDD16 Bot balances\n\n\uFE0F BTC Balance: <code>{btc_balance}</code> BTC\n\uFE0F LTC Balance: <code>{ltc_balance}</code> LTC\n\uFE0F ETH Balance: <code>{eth_balance}</code> ETH\n\uFE0F SOL Balance: <code>{sol_balance}</code> SOL\n\uFE0F BNB Balance: <code>{bnb_balance}</code> BNB</b>",
3534
"current_stock_header": "🗂️ Current Stock\n",
3635
"deposits_statistics": "📊 Deposits statistics",
37-
"deposits_statistics_msg": "📊 <b>Deposit statistics for the last {timedelta}.\n\n\uD83D\uDCB8 Total deposits: {deposits_count}\n\n\uD83D\uDCB0 Total BTC deposits for the amount: {btc_amount} BTC\n\uD83D\uDCB0 Total LTC deposits for the amount: {ltc_amount} LTC\n\uD83D\uDCB0 Total SOL deposits for the amount: {sol_amount} SOL\n\uD83D\uDCB0 Total ETH deposits in amount: {eth_amount} ETH\n\uD83D\uDCB0 Total BNB deposits in amount: {bnb_amount} BNB\n\n\uD83D\uDCBC Total cryptocurrency deposits for the amount: {fiat_amount:.2f} {currency_text}</b>",
3836
"delete_entity": "🗑️ Delete {entity}",
3937
"delete_entity_confirmation": "❓ <b>Do you really want to delete the {entity} with name <u>{entity_name}</u>?</b>",
4038
"get_database_file": "💾 Get database file",
@@ -55,7 +53,6 @@
5553
"restocking_message_header": "🆕 New Stock Alert! 🆕\n",
5654
"sales_statistics": "📊 <b>Sales statistics for the last {timedelta}.\n\uD83D\uDCB0 Total profit: {currency_sym}{total_profit:.2f}\n\uD83D\uDECD\uFE0F Items sold: {items_sold}\n\uD83D\uDCBC Total buys: {buys_count}</b>",
5755
"send_everyone": "📢 Send to Everyone",
58-
"sending_result": "✅ <b>Message sent to {counter} out of {len} active users.\nTotal users:{users_count}</b>",
5956
"sending_started": "🚀 Sending started",
6057
"stock": "📦 Full Inventory Message",
6158
"statistics": "📊 Analytics & Reports ",
@@ -135,7 +132,14 @@
135132
"remove_review_image_confirmation": "❓ <b>Are you sure you want to remove the review image?</b>",
136133
"reviews_management": "⭐ Reviews Management",
137134
"notification_new_deposit_id": "💰 New deposit by user with ID {telegram_id} for {currency_sym}{deposit_amount_fiat:.2f} with \uD83D\uDCB0 {value} {crypto_name}\n💰 Referral bonus: {currency_sym}{referral_bonus:.2f}\n💰 Referrer bonus: {currency_sym}{referrer_bonus:.2f}",
138-
"notification_new_deposit_username": "💰 New deposit by user with username @{username} for {currency_sym}{deposit_amount_fiat:.2f} with \uD83D\uDCB0 {value} {crypto_name}\n💰 Referral bonus: {currency_sym}{referral_bonus:.2f}\n💰 Referrer bonus: {currency_sym}{referrer_bonus:.2f}"
135+
"notification_new_deposit_username": "💰 New deposit by user with username @{username} for {currency_sym}{deposit_amount_fiat:.2f} with \uD83D\uDCB0 {value} {crypto_name}\n💰 Referral bonus: {currency_sym}{referral_bonus:.2f}\n💰 Referrer bonus: {currency_sym}{referrer_bonus:.2f}",
136+
"crypto_wallet": "\n\n<b>\uD83E\uDD16 Bot balances\n\n{wallet_content}</b>",
137+
"crypto_wallet_line": "\uFE0F {crypto_name} Balance: <code>{crypto_balance:.8f}</code> {crypto_name}",
138+
"deposits_statistics_msg": "📊 <b>Deposit statistics for the last {timedelta}.\n\n\uD83D\uDCB8 Total deposits: {deposits_count}\n\n{deposits_content}\n\n\uD83D\uDCBC Total cryptocurrency deposits for the amount: {fiat_amount:.2f} {currency_text}</b>",
139+
"deposits_statistics_line": "💰 Total {crypto_name} deposits for the amount: {crypto_amount:.8f} {crypto_name}",
140+
"sending_result": "✅ <b>Message sent to {counter} out of {len} active users.\n\uD83D\uDC64 Total users:{users_count}\nStatus: {status}</b>",
141+
"in_progress": "🟡 In progress...",
142+
"finished": "🟢 Finished."
139143
},
140144
"common": {
141145
"back_button": "⬅️ Back",

i18n/es.json

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,8 @@
3131
"credit_management_request_user_entity": "👤 <b>Envía el telegram id del usuario o su nombre de usuario:</b>",
3232
"credit_management_user_not_found": "⚠️ <b>No se encontró al usuario con estos datos.</b>",
3333
"crypto_withdraw": "👛 Billetera",
34-
"crypto_wallet": "\n\n<b>🤖 Saldos del bot\n\n⚖️ Saldo BTC: <code>{btc_balance}</code> BTC\n⚖️ Saldo LTC: <code>{ltc_balance}</code> LTC\n⚖️ Saldo ETH: <code>{eth_balance}</code> ETH\n⚖️ Saldo SOL: <code>{sol_balance}</code> SOL\n⚖️ Saldo BNB: <code>{bnb_balance}</code> BNB</b>",
3534
"current_stock_header": "🗂️ Inventario actual\n",
3635
"deposits_statistics": "📊 Estadísticas de depósitos",
37-
"deposits_statistics_msg": "📊 <b>Estadísticas de depósitos de los últimos {timedelta}.\n\n💸 Depósitos totales: {deposits_count}\n\n💰 Depósitos BTC por un monto de: {btc_amount} BTC\n💰 Depósitos LTC por un monto de: {ltc_amount} LTC\n💰 Depósitos SOL por un monto de: {sol_amount} SOL\n💰 Depósitos ETH por un monto de: {eth_amount} ETH\n💰 Depósitos BNB por un monto de: {bnb_amount} BNB\n\n💼 Total en moneda fiduciaria: {fiat_amount:.2f} {currency_text}</b>",
3836
"delete_entity": "🗑️ Eliminar {entity}",
3937
"delete_entity_confirmation": "❓ <b>¿Realmente deseas eliminar {entity} con el nombre <u>{entity_name}</u>?</b>",
4038
"get_database_file": "💾 Obtener archivo de base de datos",
@@ -55,7 +53,6 @@
5553
"restocking_message_header": "🆕 ¡Nueva llegada de stock! 🆕\n",
5654
"sales_statistics": "📊 <b>Estadísticas de ventas de los últimos {timedelta}.\n💰 Beneficio total: {currency_sym}{total_profit:.2f}\n🛍️ Artículos vendidos: {items_sold}\n💼 Total de compras: {buys_count}</b>",
5755
"send_everyone": "📢 Enviar a todos",
58-
"sending_result": "✅ <b>Mensaje enviado a {counter} de {len} usuarios activos.\nUsuarios totales: {users_count}</b>",
5956
"sending_started": "🚀 Envío iniciado",
6057
"stock": "📦 Mensaje de inventario completo",
6158
"statistics": "📊 Analítica y reportes",
@@ -135,7 +132,14 @@
135132
"remove_review_image_confirmation": "❓ <b>¿Estás seguro de que quieres eliminar la imagen de la reseña?</b>",
136133
"reviews_management": "⭐ Gestión de reseñas",
137134
"notification_new_deposit_id": "💰 Nuevo depósito del usuario con ID {telegram_id} por {currency_sym}{deposit_amount_fiat:.2f} con 💰 {value} {crypto_name}\n💰 Bono por referido: {currency_sym}{referral_bonus:.2f}\n💰 Bono del referidor: {currency_sym}{referrer_bonus:.2f}",
138-
"notification_new_deposit_username": "💰 Nuevo depósito del usuario con nombre de usuario @{username} por {currency_sym}{deposit_amount_fiat:.2f} con 💰 {value} {crypto_name}\n💰 Bono por referido: {currency_sym}{referral_bonus:.2f}\n💰 Bono del referidor: {currency_sym}{referrer_bonus:.2f}"
135+
"notification_new_deposit_username": "💰 Nuevo depósito del usuario con nombre de usuario @{username} por {currency_sym}{deposit_amount_fiat:.2f} con 💰 {value} {crypto_name}\n💰 Bono por referido: {currency_sym}{referral_bonus:.2f}\n💰 Bono del referidor: {currency_sym}{referrer_bonus:.2f}",
136+
"crypto_wallet": "\n\n<b>🤖 Saldos del Bot\n\n{wallet_content}</b>",
137+
"crypto_wallet_line": "⚖️ Saldo de {crypto_name}: <code>{crypto_balance:.8f}</code> {crypto_name}",
138+
"deposits_statistics_msg": "📊 <b>Estadísticas de depósitos de los últimos {timedelta}.\n\n💰 Depósitos totales: {deposits_count}\n\n{deposits_content}\n\n💼 Depósitos totales de criptomonedas por valor: {fiat_amount:.2f} {currency_text}</b>",
139+
"deposits_statistics_line": "💰 Depósitos totales de {crypto_name} por valor: {crypto_amount:.8f} {crypto_name}",
140+
"sending_result": "✅ <b>Mensaje enviado a {counter} de {len} usuarios activos.\n👤 Usuarios totales: {users_count}\nEstado: {status}</b>",
141+
"in_progress": "🟡 En progreso...",
142+
"finished": "🟢 Finalizado."
139143
},
140144
"common": {
141145
"back_button": "⬅️ Atrás",

i18n/fr.json

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,8 @@
3131
"credit_management_request_user_entity": "👤 <b>Envoyez l’ID Telegram ou le nom d’utilisateur :</b>",
3232
"credit_management_user_not_found": "⚠️ <b>Aucun utilisateur trouvé.</b>",
3333
"crypto_withdraw": "👛 Portefeuille",
34-
"crypto_wallet": "\n\n<b>🤖 Soldes du bot\n\n⚖️ Solde BTC : <code>{btc_balance}</code> BTC\n⚖️ Solde LTC : <code>{ltc_balance}</code> LTC\n⚖️ Solde ETH : <code>{eth_balance}</code> ETH\n⚖️ Solde SOL : <code>{sol_balance}</code> SOL\n⚖️ Solde BNB : <code>{bnb_balance}</code> BNB</b>",
3534
"current_stock_header": "🗂️ Stock actuel\n",
3635
"deposits_statistics": "📊 Statistiques de dépôts",
37-
"deposits_statistics_msg": "📊 <b>Statistiques des dépôts pour les {timedelta} derniers jours.\n\n💸 Nombre total de dépôts : {deposits_count}\n\n💰 Dépôts BTC pour un montant de : {btc_amount} BTC\n💰 Dépôts LTC pour un montant de : {ltc_amount} LTC\n💰 Dépôts SOL pour un montant de : {sol_amount} SOL\n💰 Dépôts ETH pour un montant de : {eth_amount} ETH\n💰 Dépôts BNB pour un montant de : {bnb_amount} BNB\n\n💼 Total en monnaie fiduciaire : {fiat_amount:.2f} {currency_text}</b>",
3836
"delete_entity": "🗑️ Supprimer {entity}",
3937
"delete_entity_confirmation": "❓ <b>Voulez-vous vraiment supprimer {entity} nommé <u>{entity_name}</u> ?</b>",
4038
"get_database_file": "💾 Télécharger la base de données",
@@ -55,7 +53,6 @@
5553
"restocking_message_header": "🆕 Nouveau stock disponible ! 🆕\n",
5654
"sales_statistics": "📊 <b>Statistiques des ventes des {timedelta} derniers jours.\n💰 Profit total : {currency_sym}{total_profit:.2f}\n🛍️ Articles vendus : {items_sold}\n💼 Nombre total d’achats : {buys_count}</b>",
5755
"send_everyone": "📢 Envoyer à tout le monde",
58-
"sending_result": "✅ <b>Message envoyé à {counter} sur {len} utilisateurs actifs.\nTotal des utilisateurs : {users_count}</b>",
5956
"sending_started": "🚀 Envoi lancé",
6057
"stock": "📦 Annonce complète du stock",
6158
"statistics": "📊 Analyses et rapports",
@@ -135,7 +132,14 @@
135132
"remove_review_image_confirmation": "❓ <b>Êtes-vous sûr de vouloir supprimer l'image de l'avis?</b>",
136133
"reviews_management": "⭐ Gestion des avis",
137134
"notification_new_deposit_id": "💰 Nouveau dépôt de l'utilisateur avec ID {telegram_id} pour {currency_sym}{deposit_amount_fiat:.2f} avec 💰 {value} {crypto_name}\n💰 Bonus parrainé: {currency_sym}{referral_bonus:.2f}\n💰 Bonus parrain: {currency_sym}{referrer_bonus:.2f}",
138-
"notification_new_deposit_username": "💰 Nouveau dépôt de l'utilisateur avec nom d'utilisateur @{username} pour {currency_sym}{deposit_amount_fiat:.2f} avec 💰 {value} {crypto_name}\n💰 Bonus parrainé: {currency_sym}{referral_bonus:.2f}\n💰 Bonus parrain: {currency_sym}{referrer_bonus:.2f}"
135+
"notification_new_deposit_username": "💰 Nouveau dépôt de l'utilisateur avec nom d'utilisateur @{username} pour {currency_sym}{deposit_amount_fiat:.2f} avec 💰 {value} {crypto_name}\n💰 Bonus parrainé: {currency_sym}{referral_bonus:.2f}\n💰 Bonus parrain: {currency_sym}{referrer_bonus:.2f}",
136+
"crypto_wallet": "\n\n<b>🤖 Soldes du Bot\n\n{wallet_content}</b>",
137+
"crypto_wallet_line": "⚖️ Solde {crypto_name}: <code>{crypto_balance:.8f}</code> {crypto_name}",
138+
"deposits_statistics_msg": "📊 <b>Statistiques des dépôts des derniers {timedelta}.\n\n💰 Dépôts totaux: {deposits_count}\n\n{deposits_content}\n\n💼 Dépôts totaux de cryptomonnaies d'une valeur de: {fiat_amount:.2f} {currency_text}</b>",
139+
"deposits_statistics_line": "💰 Dépôts totaux de {crypto_name} d'une valeur de: {crypto_amount:.8f} {crypto_name}",
140+
"sending_result": "✅ <b>Message envoyé à {counter} sur {len} utilisateurs actifs.\n👤 Utilisateurs totaux: {users_count}\nStatut: {status}</b>",
141+
"in_progress": "🟡 En cours...",
142+
"finished": "🟢 Terminé."
139143
},
140144
"common": {
141145
"back_button": "⬅️ Retour",

0 commit comments

Comments
 (0)