Skip to content

Commit fc7ca39

Browse files
author
Deathgiver
committed
feat(minigames): add prize win limits, win messages, and jackpot-only launch
- Cap each prize's total wins via a new `quantity` field; exhausted prizes drop out of the draw pool under an advisory lock to prevent two concurrent plays from both winning the last unit. - Let each prize send its own win message (text or flow), mirroring the existing lose-message flow. - Restrict minigame creation to Jackpot for now, since it is the only type with a working play experience; other types show as "coming soon". - Fix `findDMByContact` to resolve the DM conversation for the channel the player actually used, not just any DM for the contact. - Move minigame page breadcrumb/tabs into a shared layout instead of duplicating them per page.
1 parent 8d36fde commit fc7ca39

63 files changed

Lines changed: 2745 additions & 702 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/builder/messages/ar.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5156,7 +5156,7 @@
51565156
}
51575157
},
51585158
"minigames": {
5159-
"title": "الألعاب المصغّرة",
5159+
"title": "التلعيب",
51605160
"description": "أنشئ وأدر ألعاب سحب الحظ المصغّرة لعملائك.",
51615161
"types": {
51625162
"luckyWheel": "عجلة الحظ",
@@ -5166,7 +5166,8 @@
51665166
"scratchOff": "البطاقة الكاشطة"
51675167
},
51685168
"createDialog": {
5169-
"title": "اختر نوع اللعبة المصغّرة"
5169+
"title": "اختر نوع اللعبة المصغّرة",
5170+
"comingSoon": "قريباً"
51705171
},
51715172
"prizeSettings": {
51725173
"sumOfProbabilities": "مجموع جميع الاحتمالات: {value}%",
@@ -5180,7 +5181,10 @@
51805181
"prizeNameLabel": "اسم الجائزة",
51815182
"nonWinningTitleLabel": "العنوان",
51825183
"loseImageDescription": "الحجم الموصى به 120×120 بكسل",
5184+
"quantityLabel": "كمية الجائزة",
5185+
"quantityDescription": "عدد المرات المتبقية التي يمكن فيها الفوز بهذه الجائزة؛ ينقص بمقدار 1 مع كل فوز. اتركه فارغًا لعدد غير محدود.",
51835186
"sendMessage": "إرسال رسالة عند عدم فوز اللاعب",
5187+
"sendWinMessage": "إرسال رسالة إلى الفائز الذي حصل على الجائزة",
51845188
"messageMode": "نوع الرسالة",
51855189
"messageModeText": "نص",
51865190
"messageModeFlow": "تدفق",

apps/builder/messages/da.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5156,7 +5156,7 @@
51565156
}
51575157
},
51585158
"minigames": {
5159-
"title": "Minispil",
5159+
"title": "Gamification",
51605160
"description": "Opret og administrer lykkehjul-minispil til dine kunder.",
51615161
"types": {
51625162
"luckyWheel": "Lykkehjul",
@@ -5166,7 +5166,8 @@
51665166
"scratchOff": "Skrabelod"
51675167
},
51685168
"createDialog": {
5169-
"title": "Vælg en minispiltype"
5169+
"title": "Vælg en minispiltype",
5170+
"comingSoon": "Kommer snart"
51705171
},
51715172
"prizeSettings": {
51725173
"sumOfProbabilities": "Sum af alle sandsynligheder: {value}%",
@@ -5180,7 +5181,10 @@
51805181
"prizeNameLabel": "Gevinstnavn",
51815182
"nonWinningTitleLabel": "Titel",
51825183
"loseImageDescription": "Anbefalet størrelse 120x120px",
5184+
"quantityLabel": "Præmieantal",
5185+
"quantityDescription": "Antal gange denne præmie stadig kan vindes; falder med 1 for hver gevinst. Lad stå tomt for ubegrænset.",
51835186
"sendMessage": "Send en besked, når spilleren ikke vinder",
5187+
"sendWinMessage": "Send besked til vinderen, der modtog præmien",
51845188
"messageMode": "Beskedtype",
51855189
"messageModeText": "Tekst",
51865190
"messageModeFlow": "Flow",

apps/builder/messages/de.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5156,7 +5156,7 @@
51565156
}
51575157
},
51585158
"minigames": {
5159-
"title": "Minispiele",
5159+
"title": "Gamification",
51605160
"description": "Erstellen und verwalten Sie Gewinnspiel-Minispiele für Ihre Kunden.",
51615161
"types": {
51625162
"luckyWheel": "Glücksrad",
@@ -5166,7 +5166,8 @@
51665166
"scratchOff": "Rubbellos"
51675167
},
51685168
"createDialog": {
5169-
"title": "Minispiel-Typ auswählen"
5169+
"title": "Minispiel-Typ auswählen",
5170+
"comingSoon": "Demnächst verfügbar"
51705171
},
51715172
"prizeSettings": {
51725173
"sumOfProbabilities": "Summe aller Wahrscheinlichkeiten: {value}%",
@@ -5180,7 +5181,10 @@
51805181
"prizeNameLabel": "Gewinnname",
51815182
"nonWinningTitleLabel": "Titel",
51825183
"loseImageDescription": "Empfohlene Größe 120x120px",
5184+
"quantityLabel": "Preismenge",
5185+
"quantityDescription": "Anzahl, wie oft dieser Preis noch gewonnen werden kann; verringert sich bei jedem Gewinn um 1. Leer lassen für unbegrenzt.",
51835186
"sendMessage": "Eine Nachricht senden, wenn der Spieler nicht gewinnt",
5187+
"sendWinMessage": "Nachricht an den Gewinner senden, der den Preis erhalten hat",
51845188
"messageMode": "Nachrichtentyp",
51855189
"messageModeText": "Text",
51865190
"messageModeFlow": "Flow",

apps/builder/messages/en.json

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
"exportContacts": "Export Contacts",
5656
"filter": "Filter",
5757
"selectFile": "Select file",
58-
"insertLink": "Insert link",
58+
"insertLink": "Insert Link",
5959
"addNew": "Add new",
6060
"send": "Send",
6161
"loginWithMagicLink": "Login with Magic Link",
@@ -1161,7 +1161,7 @@
11611161
"label": "Input Custom Field"
11621162
},
11631163
"insertLink": {
1164-
"label": "Insert link"
1164+
"label": "Insert Link"
11651165
},
11661166
"instructions": {
11671167
"label": "System Message (Prompt)"
@@ -5156,7 +5156,7 @@
51565156
}
51575157
},
51585158
"minigames": {
5159-
"title": "Minigames",
5159+
"title": "Gamification",
51605160
"description": "Create and manage lucky-draw minigames for your customers.",
51615161
"types": {
51625162
"luckyWheel": "Lucky Wheel",
@@ -5166,7 +5166,8 @@
51665166
"scratchOff": "Scratch Off"
51675167
},
51685168
"createDialog": {
5169-
"title": "Choose a minigame type"
5169+
"title": "Choose a minigame type",
5170+
"comingSoon": "Coming soon"
51705171
},
51715172
"prizeSettings": {
51725173
"sumOfProbabilities": "Sum of all probabilities: {value}%",
@@ -5180,7 +5181,10 @@
51805181
"prizeNameLabel": "Prize Name",
51815182
"nonWinningTitleLabel": "Title",
51825183
"loseImageDescription": "Recommended size 120x120px",
5184+
"quantityLabel": "Prize Quantity",
5185+
"quantityDescription": "Number of times this prize can still be won; decreases by 1 each time it's won. Leave empty for unlimited.",
51835186
"sendMessage": "Send a message when the player doesn't win",
5187+
"sendWinMessage": "Send message to winner who received the prize",
51845188
"messageMode": "Message type",
51855189
"messageModeText": "Text",
51865190
"messageModeFlow": "Flow",

apps/builder/messages/es.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5156,7 +5156,7 @@
51565156
}
51575157
},
51585158
"minigames": {
5159-
"title": "Minijuegos",
5159+
"title": "Gamificación",
51605160
"description": "Crea y gestiona minijuegos de sorteo para tus clientes.",
51615161
"types": {
51625162
"luckyWheel": "Ruleta de la suerte",
@@ -5166,7 +5166,8 @@
51665166
"scratchOff": "Rasca y gana"
51675167
},
51685168
"createDialog": {
5169-
"title": "Elige un tipo de minijuego"
5169+
"title": "Elige un tipo de minijuego",
5170+
"comingSoon": "Próximamente"
51705171
},
51715172
"prizeSettings": {
51725173
"sumOfProbabilities": "Suma de todas las probabilidades: {value}%",
@@ -5180,7 +5181,10 @@
51805181
"prizeNameLabel": "Nombre del premio",
51815182
"nonWinningTitleLabel": "Título",
51825183
"loseImageDescription": "Tamaño recomendado 120x120px",
5184+
"quantityLabel": "Cantidad del premio",
5185+
"quantityDescription": "Número de veces que este premio aún se puede ganar; disminuye en 1 cada vez que se gana. Deja vacío para ilimitado.",
51835186
"sendMessage": "Enviar un mensaje cuando el jugador no gane",
5187+
"sendWinMessage": "Enviar mensaje al ganador que recibió el premio",
51845188
"messageMode": "Tipo de mensaje",
51855189
"messageModeText": "Texto",
51865190
"messageModeFlow": "Flujo",

apps/builder/messages/fi.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5156,7 +5156,7 @@
51565156
}
51575157
},
51585158
"minigames": {
5159-
"title": "Minipelit",
5159+
"title": "Pelillistäminen",
51605160
"description": "Luo ja hallinnoi onnenpyörä-minipelejä asiakkaillesi.",
51615161
"types": {
51625162
"luckyWheel": "Onnenpyörä",
@@ -5166,7 +5166,8 @@
51665166
"scratchOff": "Raaputusarpa"
51675167
},
51685168
"createDialog": {
5169-
"title": "Valitse minipelin tyyppi"
5169+
"title": "Valitse minipelin tyyppi",
5170+
"comingSoon": "Tulossa pian"
51705171
},
51715172
"prizeSettings": {
51725173
"sumOfProbabilities": "Kaikkien todennäköisyyksien summa: {value}%",
@@ -5180,7 +5181,10 @@
51805181
"prizeNameLabel": "Palkinnon nimi",
51815182
"nonWinningTitleLabel": "Otsikko",
51825183
"loseImageDescription": "Suositeltu koko 120x120px",
5184+
"quantityLabel": "Palkinnon määrä",
5185+
"quantityDescription": "Kuinka monta kertaa tämän palkinnon voi vielä voittaa; vähenee yhdellä joka voitolla. Jätä tyhjäksi rajoittamatonta varten.",
51835186
"sendMessage": "Lähetä viesti, kun pelaaja ei voita",
5187+
"sendWinMessage": "Lähetä viesti voittajalle, joka sai palkinnon",
51845188
"messageMode": "Viestin tyyppi",
51855189
"messageModeText": "Teksti",
51865190
"messageModeFlow": "Flow",

apps/builder/messages/fr.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5156,7 +5156,7 @@
51565156
}
51575157
},
51585158
"minigames": {
5159-
"title": "Mini-jeux",
5159+
"title": "Gamification",
51605160
"description": "Créez et gérez des mini-jeux de tirage au sort pour vos clients.",
51615161
"types": {
51625162
"luckyWheel": "Roue de la chance",
@@ -5166,7 +5166,8 @@
51665166
"scratchOff": "Carte à gratter"
51675167
},
51685168
"createDialog": {
5169-
"title": "Choisissez un type de mini-jeu"
5169+
"title": "Choisissez un type de mini-jeu",
5170+
"comingSoon": "Bientôt disponible"
51705171
},
51715172
"prizeSettings": {
51725173
"sumOfProbabilities": "Somme de toutes les probabilités : {value}%",
@@ -5180,7 +5181,10 @@
51805181
"prizeNameLabel": "Nom du lot",
51815182
"nonWinningTitleLabel": "Titre",
51825183
"loseImageDescription": "Taille recommandée : 120x120px",
5184+
"quantityLabel": "Quantité du lot",
5185+
"quantityDescription": "Nombre de fois où ce lot peut encore être gagné ; diminue de 1 à chaque gain. Laissez vide pour illimité.",
51835186
"sendMessage": "Envoyer un message lorsque le joueur ne gagne pas",
5187+
"sendWinMessage": "Envoyer un message au gagnant ayant reçu le lot",
51845188
"messageMode": "Type de message",
51855189
"messageModeText": "Texte",
51865190
"messageModeFlow": "Flux",

apps/builder/messages/he.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5156,7 +5156,7 @@
51565156
}
51575157
},
51585158
"minigames": {
5159-
"title": "מיני-משחקים",
5159+
"title": "גיימיפיקציה",
51605160
"description": "צרו ונהלו מיני-משחקי הגרלה עבור הלקוחות שלכם.",
51615161
"types": {
51625162
"luckyWheel": "גלגל המזל",
@@ -5166,7 +5166,8 @@
51665166
"scratchOff": "כרטיס גירוד"
51675167
},
51685168
"createDialog": {
5169-
"title": "בחרו סוג מיני-משחק"
5169+
"title": "בחרו סוג מיני-משחק",
5170+
"comingSoon": "בקרוב"
51705171
},
51715172
"prizeSettings": {
51725173
"sumOfProbabilities": "סכום כל ההסתברויות: {value}%",
@@ -5180,7 +5181,10 @@
51805181
"prizeNameLabel": "שם הפרס",
51815182
"nonWinningTitleLabel": "כותרת",
51825183
"loseImageDescription": "גודל מומלץ 120x120 פיקסלים",
5184+
"quantityLabel": "כמות הפרס",
5185+
"quantityDescription": "מספר הפעמים שניתן עדיין לזכות בפרס זה; יורד ב-1 בכל זכייה. השאירו ריק ללא הגבלה.",
51835186
"sendMessage": "שליחת הודעה כאשר השחקן לא זוכה",
5187+
"sendWinMessage": "שליחת הודעה לזוכה שקיבל את הפרס",
51845188
"messageMode": "סוג הודעה",
51855189
"messageModeText": "טקסט",
51865190
"messageModeFlow": "פלואו",

apps/builder/messages/id.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5156,7 +5156,7 @@
51565156
}
51575157
},
51585158
"minigames": {
5159-
"title": "Minigame",
5159+
"title": "Gamifikasi",
51605160
"description": "Buat dan kelola minigame undian berhadiah untuk pelanggan Anda.",
51615161
"types": {
51625162
"luckyWheel": "Roda Keberuntungan",
@@ -5166,7 +5166,8 @@
51665166
"scratchOff": "Gosok Kartu"
51675167
},
51685168
"createDialog": {
5169-
"title": "Pilih jenis minigame"
5169+
"title": "Pilih jenis minigame",
5170+
"comingSoon": "Segera hadir"
51705171
},
51715172
"prizeSettings": {
51725173
"sumOfProbabilities": "Total semua probabilitas: {value}%",
@@ -5180,7 +5181,10 @@
51805181
"prizeNameLabel": "Nama Hadiah",
51815182
"nonWinningTitleLabel": "Judul",
51825183
"loseImageDescription": "Ukuran yang disarankan 120x120px",
5184+
"quantityLabel": "Jumlah Hadiah",
5185+
"quantityDescription": "Jumlah berapa kali hadiah ini masih bisa dimenangkan; berkurang 1 setiap kali dimenangkan. Biarkan kosong untuk tanpa batas.",
51835186
"sendMessage": "Kirim pesan saat pemain tidak menang",
5187+
"sendWinMessage": "Kirim pesan ke pemenang yang menerima hadiah",
51845188
"messageMode": "Jenis pesan",
51855189
"messageModeText": "Teks",
51865190
"messageModeFlow": "Flow",

apps/builder/messages/it.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5156,7 +5156,7 @@
51565156
}
51575157
},
51585158
"minigames": {
5159-
"title": "Minigiochi",
5159+
"title": "Gamification",
51605160
"description": "Crea e gestisci minigiochi a estrazione per i tuoi clienti.",
51615161
"types": {
51625162
"luckyWheel": "Ruota della fortuna",
@@ -5166,7 +5166,8 @@
51665166
"scratchOff": "Gratta e vinci"
51675167
},
51685168
"createDialog": {
5169-
"title": "Scegli un tipo di minigioco"
5169+
"title": "Scegli un tipo di minigioco",
5170+
"comingSoon": "Prossimamente"
51705171
},
51715172
"prizeSettings": {
51725173
"sumOfProbabilities": "Somma di tutte le probabilità: {value}%",
@@ -5180,7 +5181,10 @@
51805181
"prizeNameLabel": "Nome del premio",
51815182
"nonWinningTitleLabel": "Titolo",
51825183
"loseImageDescription": "Dimensione consigliata 120x120px",
5184+
"quantityLabel": "Quantità del premio",
5185+
"quantityDescription": "Numero di volte in cui questo premio può ancora essere vinto; diminuisce di 1 a ogni vincita. Lascia vuoto per illimitato.",
51835186
"sendMessage": "Invia un messaggio quando il giocatore non vince",
5187+
"sendWinMessage": "Invia un messaggio al vincitore che ha ricevuto il premio",
51845188
"messageMode": "Tipo di messaggio",
51855189
"messageModeText": "Testo",
51865190
"messageModeFlow": "Flow",

0 commit comments

Comments
 (0)