Aqui está um exemplo de código para um sistema de bônus extra em uma plataforma de apostas (stake):
“`python
import random
from datetime import datetime, timedelta
from enum import Enum
class BonusType(Enum):
DEPOSIT = “deposit”
RELOAD = “reload”
FREE_SPIN = “free_spin”
CASHBACK = “cashback”
LOYALTY = “loyalty”
class BonusStatus(Enum):
ACTIVE = “active”
USED = “used”
EXPIRED = “expired”
CANCELLED = “cancelled”
class ExtraStakeBonus:
def __init__(self, user_id: str):
self.user_id = user_id
self.active_bonuses = []
self.bonus_history = []
def generate_bonus_code(self, length=8):
“””Gera um código de bônus único”””
chars = “ABCDEFGHJKLMNPQRSTUVWXYZ23456789″
return ”.join(random.choice(chars) for _ in range(length))
def create_deposit_bonus(self, deposit_amount: float, percentage: int = 100,
max_bonus: float = 100, wagering_requirement: int = 30):
“””Cria bônus de depósito”””
bonus_amount = min(deposit_amount * (percentage / 100), max_bonus)
bonus = {
“id”: self.generate_bonus_code(),
“type”: BonusType.DEPOSIT.value,
“amount”: bonus_amount,
“original_amount”: deposit_amount,
“percentage”: percentage,
“wagering_requirement”: wagering_requirement,
“wagering_progress”: 0,
“created_at”: datetime.now(),
“expires_at”: datetime.now() + timedelta(days=7),
“status”: BonusStatus.ACTIVE.value,
“conditions”: {
“min_deposit”: 20,
“max_bet_with_bonus”: 5,
“game_restrictions”: [], # Lista de jogos permitidos
“max_withdrawal”: bonus_amount * 5
}
}
self.active_bonuses.append(bonus)
return bonus
def create_free_spins_bonus(self, spins: int, bet_per_spin: float = 1.0,
game_id: str = “starburst”):
“””Cria bônus de free spins”””
bonus = {
“id”: self.generate_bonus_code(),
“type”: BonusType.FREE_SPIN.value,
“spins”: spins,
“bet_per_spin”: bet_per_spin,
“game_id”: game_id,
“created_at”: datetime.now(),
“expires_at”: datetime.now() + timedelta(days=3),
“status”: BonusStatus.ACTIVE.value,
“winnings”: 0,
“max_winnings”: spins * bet_per_spin * 10 # Limite de ganhos
}
self.active_bonuses.append(bonus)
return bonus
def create_cashback_bonus(self, losses_period: float, percentage: int = 10):
“””Cria bônus de cashback baseado em perdas”””
cashback_amount = losses_period * (percentage / 100)
bonus = {
“id”: self.generate_bonus_code(),
“type”: BonusType.CASHBACK.value,
“amount”: cashback_amount,
“losses_period”: losses_period,
“percentage”: percentage,
“created_at”: datetime.now(),
“expires_at”: datetime.now() + timedelta(days=1),
“status”: BonusStatus.ACTIVE.value,
“conditions”: {
“min_losses”: 50,
“wagering_requirement”: 1
}
}
self.active_bonuses.append(bonus)
return bonus
def update_wagering(self, bonus_id: str, bet_amount: float):
“””Atualiza requisito de rollover”””
for bonus in self.active_bonuses:
if bonus[“id”] == bonus_id and bonus[“status”] == BonusStatus.ACTIVE.value:
if “wagering_requirement” in bonus:
wagering_needed = bonus[“amount”] * bonus[“wagering_requirement”]
bonus[“wagering_progress”] += bet_amount
# Verifica se cumpriu os requisitos
if bonus[“wagering_progress”] >= wagering_needed:
bonus[“status”] = BonusStatus.USED.value
self._move_to_history(bonus)
return True
return False
def use_free_spin(self, bonus_id: str, win_amount: float = 0):
“””Usa um free spin do bônus”””
for bonus in self.active_bonuses:
if bonus[“id”] == bonus_id and bonus[“status”] == BonusStatus.ACTIVE.value:
if bonus[“spins”] > 0:
bonus[“spins”] -= 1
bonus[“winnings”] += win_amount
# Verifica limite de ganhos
if bonus[“winnings”] >= bonus[“max_winnings”]:
bonus[“spins”] = 0
if bonus[“spins”] == 0:
bonus[“status”] = BonusStatus.USED.value
self._move_to_history(bonus)
return True
return False
def check_expired_bonuses(self):
“””Verifica e expira bônus vencidos”””
now = datetime.now()
expired = []
for bonus in self.active_bonuses[:]:
if bonus[“status”] == BonusStatus.ACTIVE.value and bonus[“expires_at”] < now:
bonus["status"] = BonusStatus.EXPIRED.value
expired.append(bonus)
self._move_to_history(bonus)
return expired
def _move_to_history(self, bonus):
"""Move bônus para histórico"""
self.active_bonuses = [b for b in self.active_bonuses if b["id"] != bonus["id"]]
bonus["used_at"] = datetime.now()
self.bonus_history.append(bonus)
def get_active_bonuses(self):
"""Retorna bônus ativos"""
return [b for b in self.active_bonuses if b["status"] == BonusStatus.ACTIVE.value]
def get_bonus_value(self):
"""Calcula valor total de bônus ativos"""
total = 0
for bonus in self.active_bonuses:
if bonus["status"] == BonusStatus.ACTIVE.value:
if "amount" in bonus:
total += bonus["amount"]
elif "winnings" in bonus:
total += bonus["winnings"]
return total
# Exemplo de uso
class BonusSystem:
def __init__(self):
self.user_bonuses = {}
def get_user_bonus(self, user_id: str):
if user_id not in self.user_bonuses:
self.user_bonuses[user_id] = ExtraStakeBonus(user_id)
return self.user_bonuses[user_id]
def apply_deposit_bonus(self, user_id: str, deposit_amount: float):
"""Aplica bônus de depósito com regras específicas"""
user_bonus = self.get_user_bonus(user_id)
# Regras de bônus (exemplo)

if deposit_amount >= 100:
return user_bonus.create_deposit_bonus(
deposit_amount,
percentage=200,
max_bonus=500,
wagering_requirement=35
)
elif deposit_amount >= 50:
return user_bonus.create_deposit_bonus(
deposit_amount,
percentage=150,
max_bonus=200,
wagering_requirement=30
)
elif deposit_amount >= 20:
return user_bonus.create_deposit_bonus(
deposit_amount,
percentage=100,
max_bonus=100,
wagering_requirement=25
)
return None
def daily_reward(self, user_id: str, streak_days: int):
“””Recompensa diária baseada em streak”””
user_bonus = self.get_user_bonus(user_id)
if streak_days >= 7:
return user_bonus.create_free_spins_bonus(
spins=50,
bet_per_spin=0.5,
game_id=”book_of_dead”
)
elif streak_days >= 3:
return user_bonus.create_free_spins_bonus(
spins=20,
bet_per_spin=0.2
)
return None
# Teste do sistema
if __name__ == “__main__”:
system = BonusSystem()
# Usuário faz depósito
user_id = “player123″
deposit_bonus = system.apply_deposit_bonus(user_id, 75)
print(f”Bônus de depósito criado: {deposit_bonus[‘amount’]}€”)
# Recompensa diária
daily_bonus = system.daily_reward(user_id, 5)
if daily_bonus:
print(f”Free spins: {daily_bonus[‘spins’]} spins no jogo {daily_bonus[‘game_id’]}”)
# Cashback semanal
user_bonus = system.get_user_bonus(user_id)
cashback = user_bonus.create_cashback_bonus(losses_period=200, percentage=15)
print(f”Cashback: {cashback[‘amount’]}€”)
# Listar bônus ativos
active = user_bonus.get_active_bonuses()
print(f”\nBônus ativos: {len(active)}”)
for bonus in active:
print(f”- {bonus[‘type’]}: {bonus.get(‘amount’, bonus.get(‘spins’, ‘N/A’))}”)
“`
Este código inclui:
## Principais Funcionalidades:
1. **Tipos de Bônus**:
– Bônus de depósito (match bonus)
– Free spins
– Cashback
– Bônus de reload
2. **Características**:
– Códigos de bônus únicos
– Requisitos de rollover (wagering)
– Validade temporal
– Restrições de jogo
– Limites de apostas
3. **Gestão**:
– Controle de status (ativo/usado/expirado)
– Histórico de bônus
– Verificação de expiração
– Cálculo de progresso de rollover
4. **Exemplos de Regras**:
– Bônus progressivo por valor de depósito
– Recompensas por streak diário
– Cashback baseado em perdas
## Para expandir o sistema, você poderia adicionar:
1. **Banco de dados** para persistência
2. **API REST** para integração
3. **Sistema de promoções** sazonais
4. **Programa de fidelidade** (tiers VIP)
5. **Verificação de elegibilidade**
6. **Ferramentas administrativas**
7. **Notificações** de bônus expirando
Lembre-se de adaptar as regras e valores conforme a regulamentação do seu país e os termos da sua plataforma!

