113 lines
No EOL
5.2 KiB
Python
Executable file
113 lines
No EOL
5.2 KiB
Python
Executable file
# yourapp/middleware.py
|
|
from django.shortcuts import redirect
|
|
from django.core.cache import cache
|
|
from django.utils import timezone
|
|
from .models import User, VisitorStats
|
|
from messagerie.models import PrivateMessage, PrivateMessageSubject
|
|
from django.utils.deprecation import MiddlewareMixin
|
|
from django.contrib import messages
|
|
|
|
# On vérifie que l'user existe dans la table user_level. Si pas, on le redirige vers la page tuto de la nouvelle feature
|
|
class UserLevelMiddleware(MiddlewareMixin):
|
|
# On vérifie que l'on est pas sur la page de tuto de la nouvelle feature
|
|
def process_request(self, request):
|
|
if request.user.is_authenticated:
|
|
if request.path != '/users/new/feature':
|
|
if not request.user.levels.exists():
|
|
return redirect('new_feature_user')
|
|
|
|
if request.path != '/users/new/feature':
|
|
if not request.user.inventory.exists():
|
|
return redirect('new_feature_user')
|
|
|
|
class UserLevelUpMiddleware(MiddlewareMixin):
|
|
def process_request(self, request):
|
|
if request.user.is_authenticated and request.user.levels.exists():
|
|
if not request.session.get('level_up_processed', False):
|
|
user = request.user
|
|
user_level = user.level # Accède à l'objet UserLevel associé à l'utilisateur
|
|
|
|
# Calcul de l'XP requise pour le prochain niveau
|
|
def xp_required(level):
|
|
return int(33.33 * (level ** 2) - 16.66 * level)
|
|
|
|
if user_level.experience >= xp_required(user_level.level):
|
|
user_level.level += 1
|
|
user_level.save()
|
|
messages.success(request, f"Bravo ! Vous avez atteint le niveau {user_level.level} !")
|
|
|
|
subject = PrivateMessageSubject.objects.create(
|
|
receiver=user,
|
|
sender=User.objects.get(username='RetroBot'),
|
|
subject=f"Bravo { request.user } ! Tu as atteint un nouveau niveau !"
|
|
)
|
|
|
|
PrivateMessage.objects.create(
|
|
subject=subject,
|
|
author=User.objects.get(username='RetroBot'),
|
|
message=f"""[b]🎉 Félicitations {request.user}! 🎉[/b]
|
|
|
|
Tu viens de passer au [b]Niveau Supérieur[/b] ! Tu es maintenant [b]Niveau { user_level.level }[/b] !
|
|
|
|
💰 En récompense, tu gagnes [b]20 Or[/b] ! 💰
|
|
|
|
[i]Continue tes efforts, aventurier, et vise toujours plus haut ![/i]
|
|
"""
|
|
)
|
|
|
|
# Marquez le niveau comme traité pour cette requête
|
|
request.session['level_up_processed'] = True
|
|
|
|
# Ajouter 20 Or à l'inventaire de l'utilisateur
|
|
if request.user.inventory.exists():
|
|
inventory_item = request.user.inventory.get(item__name='Or')
|
|
inventory_item.quantity += 20
|
|
inventory_item.save()
|
|
|
|
# On affiche l'experience restante pour le prochain niveau
|
|
request.user.experience_left = xp_required(user_level.level) - user_level.experience
|
|
else:
|
|
# On affiche l'expérience restante pour le prochain niveau même si le niveau n'a pas changé
|
|
user_level = request.user.level
|
|
def xp_required(level):
|
|
return int(33.33 * (level ** 2) - 16.66 * level)
|
|
request.user.experience_left = xp_required(user_level.level) - user_level.experience
|
|
|
|
class UserStatsMiddleware(MiddlewareMixin):
|
|
def process_request(self, request):
|
|
# Nombre total d'utilisateurs
|
|
total_users = User.objects.count()
|
|
|
|
# Dernier utilisateur inscrit
|
|
last_user = User.objects.latest('date_joined') if total_users > 0 else None
|
|
|
|
# Gestion des visiteurs actuels
|
|
current_time = timezone.now()
|
|
visitor_key = request.session.session_key or request.META.get('REMOTE_ADDR')
|
|
|
|
# Mise à jour du cache des visiteurs actuels
|
|
active_visitors = cache.get('active_visitors', set())
|
|
active_visitors.add(visitor_key)
|
|
cache.set('active_visitors', active_visitors, 300) # expire après 5 minutes
|
|
visitor_count = len(active_visitors)
|
|
|
|
# Gestion du total des visiteurs
|
|
stats, created = VisitorStats.objects.get_or_create(pk=1)
|
|
if 'first_visit' not in request.session:
|
|
request.session['first_visit'] = True
|
|
stats.total_visitors += 1
|
|
stats.save()
|
|
total_visitor_count = stats.total_visitors
|
|
|
|
# Si l'utilisateur est authentifié
|
|
if request.user.is_authenticated:
|
|
theme_active = request.user.theme
|
|
else:
|
|
theme_active = '00s'
|
|
|
|
# Ajouter les variables à l'objet request
|
|
request.total_users = total_users
|
|
request.last_user = last_user
|
|
request.visitor_count = visitor_count
|
|
request.total_visitor_count = total_visitor_count
|
|
request.theme_active = theme_active |