Raz 9 months ago
commit eea4c69b4a
  1. 11
      api/utils.py
  2. 15
      api/views.py
  3. 19
      shared/discord.py
  4. 40
      tournaments/signals.py

@ -3,3 +3,14 @@ import re
def is_valid_email(email): def is_valid_email(email):
email_regex = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$' email_regex = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
return re.match(email_regex, email) is not None return re.match(email_regex, email) is not None
def check_version_smaller_than_1_1_12(version_str):
# Remove the parentheses part if it exists, example of version: 1.1.12 (2)
version_str = version_str.split()[0]
# Split version into components
version_parts = [int(x) for x in version_str.split('.')]
target_parts = [1, 1, 12]
# Compare version components
return version_parts < target_parts

@ -19,11 +19,13 @@ from django.db.models import Q
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from .permissions import IsClubOwner from .permissions import IsClubOwner
from .utils import is_valid_email from .utils import is_valid_email, check_version_smaller_than_1_1_12
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from shared.discord import send_discord_log_message
@method_decorator(csrf_exempt, name='dispatch') @method_decorator(csrf_exempt, name='dispatch')
class CustomAuthToken(APIView): class CustomAuthToken(APIView):
permission_classes = [] permission_classes = []
@ -112,6 +114,17 @@ class TournamentViewSet(SoftDeleteViewSet):
return [] return []
return self.queryset.filter(event__creator=self.request.user) return self.queryset.filter(event__creator=self.request.user)
def perform_create(self, serializer):
serializer.save()
# version check
app_version = self.request.headers.get('App-Version')
self.warn_if_version_is_too_small(app_version)
def warn_if_version_is_too_small(self, version):
if check_version_smaller_than_1_1_12(version):
message = f'{self.request.user.username} app version is {version}'
send_discord_log_message(message)
class PurchaseViewSet(SoftDeleteViewSet): class PurchaseViewSet(SoftDeleteViewSet):
queryset = Purchase.objects.all() queryset = Purchase.objects.all()
serializer_class = PurchaseSerializer serializer_class = PurchaseSerializer

@ -0,0 +1,19 @@
import requests
DISCORD_FAILED_CALLS_WEBHOOK_URL = 'https://discord.com/api/webhooks/1248191778134163486/sSoTL6cULCElWr2YFwyllsg7IXxHcCx_YMDJA_cUHtVUU4WOfN-5M7drCJuwNBBfAk9a'
DISCORD_LOGS_WEBHOOK_URL = 'https://discord.com/api/webhooks/1257987637449588736/TtOUwzYgSlQH2d3Ps7SfIKRcFALQVa3hfkC-j9K4_UAcWtsfiw4v8NUPbnX2_ZPOYzuv'
def send_discord_failed_calls_message(message):
send_discord_message(DISCORD_FAILED_CALLS_WEBHOOK_URL, message)
def send_discord_log_message(message):
send_discord_message(DISCORD_LOGS_WEBHOOK_URL, message)
def send_discord_message(webhook_url, content):
try:
data = {
"content": content
}
requests.post(webhook_url, json=data)
except Exception as e:
print(f"Failed to send Discord message: {str(e)}")

@ -12,6 +12,8 @@ import requests
from tournaments.services.email_service import TournamentEmailService from tournaments.services.email_service import TournamentEmailService
from tournaments.models import PlayerDataSource from tournaments.models import PlayerDataSource
from shared.discord import send_discord_log_message, send_discord_failed_calls_message
def generate_unique_code(): def generate_unique_code():
characters = string.ascii_lowercase + string.digits characters = string.ascii_lowercase + string.digits
while True: while True:
@ -25,39 +27,37 @@ def assign_unique_code(sender, instance, created, **kwargs):
instance.broadcast_code = generate_unique_code() instance.broadcast_code = generate_unique_code()
instance.save() instance.save()
DISCORD_FAILED_CALLS_WEBHOOK_URL = 'https://discord.com/api/webhooks/1248191778134163486/sSoTL6cULCElWr2YFwyllsg7IXxHcCx_YMDJA_cUHtVUU4WOfN-5M7drCJuwNBBfAk9a'
DISCORD_LOGS_WEBHOOK_URL = 'https://discord.com/api/webhooks/1257987637449588736/TtOUwzYgSlQH2d3Ps7SfIKRcFALQVa3hfkC-j9K4_UAcWtsfiw4v8NUPbnX2_ZPOYzuv'
@receiver(post_save, sender=FailedApiCall) @receiver(post_save, sender=FailedApiCall)
def notify_discord_on_create(sender, instance, created, **kwargs): def notify_discord_on_create(sender, instance, created, **kwargs):
notify_object_creation_on_discord(created, instance, DISCORD_FAILED_CALLS_WEBHOOK_URL) notify_object_creation_on_discord(created, instance)
# @receiver(post_save, sender=CustomUser)
# def notify_user_creation_on_discord(sender, instance, created, **kwargs):
# notify_object_creation_on_discord(created, instance, DISCORD_LOGS_WEBHOOK_URL)
@receiver(post_save, sender=Log) @receiver(post_save, sender=Log)
def notify_log_creation_on_discord(sender, instance, created, **kwargs): def notify_log_creation_on_discord(sender, instance, created, **kwargs):
notify_object_creation_on_discord(created, instance, DISCORD_LOGS_WEBHOOK_URL) notify_object_creation_on_discord(created, instance)
# WARNING: using this method requires the instance to have a discord_string method # WARNING: using this method requires the instance to have a discord_string method
def notify_object_creation_on_discord(created, instance, webhook_url): def notify_object_creation_on_discord(created, instance):
if created: if created:
default_db_engine = settings.DATABASES['default']['ENGINE'] default_db_engine = settings.DATABASES['default']['ENGINE']
if default_db_engine != 'django.db.backends.sqlite3': if default_db_engine != 'django.db.backends.sqlite3':
site_name = settings.SITE_NAME site_name = settings.SITE_NAME
message = f'{site_name} > New {instance.__class__.__name__} created: {instance.discord_string()}' message = f'{site_name} > New {instance.__class__.__name__} created: {instance.discord_string()}'
send_discord_message(webhook_url, message) if isinstance(instance, FailedApiCall):
send_discord_failed_calls_message(message)
def send_discord_message(webhook_url, content): else:
data = { send_discord_log_message(message)
"content": content
}
requests.post(webhook_url, json=data) # def send_discord_message(webhook_url, content):
# if response.status_code != 204: # data = {
# raise ValueError( # "content": content
# f'Error sending message to Discord webhook: {response.status_code}, {response.text}' # }
# ) # requests.post(webhook_url, json=data)
# # if response.status_code != 204:
# # raise ValueError(
# # f'Error sending message to Discord webhook: {response.status_code}, {response.text}'
# # )
@receiver(pre_delete, sender=TeamRegistration) @receiver(pre_delete, sender=TeamRegistration)
def unregister_team(sender, instance, **kwargs): def unregister_team(sender, instance, **kwargs):

Loading…
Cancel
Save