From 07b1281d61bb0e83442eb05cb0af87d944f6989c Mon Sep 17 00:00:00 2001 From: adevopg <133045315+adevopg@users.noreply.github.com> Date: Fri, 29 Nov 2024 20:52:11 +0100 Subject: [PATCH] Implementado Unstuck y Cambio de correo --- home/__pycache__/models.cpython-313.pyc | Bin 13745 -> 14091 bytes home/__pycache__/urls.cpython-313.pyc | Bin 4310 -> 4549 bytes home/__pycache__/views.cpython-313.pyc | Bin 62746 -> 66679 bytes home/models.py | 4 + .../nw-js-handlers/change_email_response.js | 53 +++-- .../nw-ryu/nw-js-handlers/unstuck_response.js | 41 ++++ .../account/confirm_new_email_success.html | 9 + .../account/confirm_old_email_success.html | 9 + home/templates/account/expired_link.html | 9 + home/templates/account/unstuck_character.html | 9 + .../partials/confirm_new_email_success.html | 15 ++ .../partials/confirm_old_email_success.html | 15 ++ home/templates/partials/expired_link.html | 27 +++ home/templates/partials/head.html | 1 + home/templates/partials/my-account.html | 195 ++++++++++++++++++ .../templates/partials/unstuck_character.html | 43 ++++ home/urls.py | 2 + home/views.py | 97 +++++++-- novawow/__pycache__/settings.cpython-313.pyc | Bin 4593 -> 4593 bytes novawow/__pycache__/urls.cpython-313.pyc | Bin 814 -> 814 bytes novawow/settings.py | 1 - 21 files changed, 494 insertions(+), 36 deletions(-) create mode 100644 home/static/nw-themes/nw-ryu/nw-js-handlers/unstuck_response.js create mode 100644 home/templates/account/confirm_new_email_success.html create mode 100644 home/templates/account/confirm_old_email_success.html create mode 100644 home/templates/account/expired_link.html create mode 100644 home/templates/account/unstuck_character.html create mode 100644 home/templates/partials/confirm_new_email_success.html create mode 100644 home/templates/partials/confirm_old_email_success.html create mode 100644 home/templates/partials/expired_link.html create mode 100644 home/templates/partials/unstuck_character.html diff --git a/home/__pycache__/models.cpython-313.pyc b/home/__pycache__/models.cpython-313.pyc index 37632d778d3cdf2cbbbf1365aa4c256a62bb7f0a..5b1bf2b9aced4cc948481253c3182d87f8f04fa4 100644 GIT binary patch delta 1711 zcmXw3ZA_b06y`uF@Ing(N_e3iZJ~u01PUDsvN;&;gMGkboiSO65yLc^soP}PmSrEtxhyV@F#Iu6f6SRhMH7=LE+$LVdv38wpPctO&%O8D zbIv^%dX9%Qe`+*R0{Y z)?y6@mVq61tEH5iF|F@4FZ2480P}>reF0`CGNnHf@O!)pPRaUuC#@i$^$`J4y*B-%tqLYQdW!9Nm7D3?8<6~PP~|P zUfoFKZrrCU01rlWZ-W=VWmahfjcI5?hPe`A=XE zs^r$J4kDriq6CBJmv=}5^i8k}Z^{e?sG>7l3NoPB$H`cxuh$#w<2}U!Z+MwMVozkv zv|=4WJsvD{@PvI>_ztW`hrtAcxW&)_Jve08{ro19i0xa*8YiF-Vv^VA3-^Z zD4Z0f`_xtu;XnyiF-0-^Y|&ft=@6i$nC zuaJUZ7@KX~a7C2zYg;djqqB4y9K%DUV=#fbvVNGvp|W$yce!>F8|;NJOCum&%R98o z3W8ZQ+w!GbWD<rpDrqNIBsW5k$@V-&ECgnjxzO8A{g4si+BoK%1!Fq zM2zB>x+aw!m|LXsUbzlF#)svN;6_u0oG*%~-X9Kzl;xHe8I3pT9Bn`_g>P281#=X` zjP^M-7|#ChVOP1u(@Ebnnl`W_{Gp#x)AME%{75^@;L}RCOEl~Ru_D1Dx8KvJXcIa# zrtS4c6wm8nCE!tbpR$WMP*o=_kci+c-l!UY1wL0~Y_C3(bD48)ez7SMBogqW%Ve}U zYvCHc;(W<8OXOn?*Z4m|HRVGyr{s8Qd^XPVc9Zc(=Ows_r)xU&BE&^n^DDt`1hb;V zkH{prj1{%5YO?G`JX-s~x>e*6qfd-2F_419i3cuTjA(w*oYW+urXs20QtT1#aT%q* hxQCv4qy~pvmAc$Su#UFB+d0;`l)%j;2`{;x{Rb?a&0zol delta 1537 zcmXw3eN3BW5a$ZC^yQ-;K;KadJuPEn45k@O zoS^JnmIw}~OBPKQoYlC@Y#NO*FcY22oN1>1qXztIWYL%yKc0KQ_m5xhxx44NyWib= zr^1&9Gw)|+N=f{C`R|8JQcBiZwussxehIC-s?6Lm`;3OZ9C^Fx62W?@E3n z8FgvLAs1gwdkJKG)0Bg?+9GJg9<5WV=T9+$Ts)y|!hbYoyraDYR-BgH;KHlY5$@_Bd;$%XWfBTu-l)nn)zDVo63fG~vOFO|^}buK07AMu2KO znsqX_n`;spuiwuC(P$!NB*J2B7kcehse^n8Z1}KFfeyT9m+>Rr+t7gf_1EA*lnt#g zfKM4ZrG9cHXuwN`e(1*(<9q6zq}+>Fjb_+~w~fbOKN{*}9LmmDKT4(pIG0^(A0RP> z;291H{jk@kgu>An8}-FPk#Lkb$mSIp`A8(#iBis9@ZrB2IX;oo2RylNax2Wt&u!y| z_DDDu2#5TUqF^8#VBR6N4~?cd=;d^~dB(R*(;yx^oulP9UwGhs2#Mml^ZvAWD29t5 zgTn@Jcn6q{6npSld6VDwn0xfSq?jZSluzLY=3Z%x&IBIRERWQ-Iah9kIM9D+&QT`~=GqJ5hsW_TVmN}u3oPiZG7^<3#d`Z;=Mnc%$W z)EN>9MzE@E9nJ`PYs!Diqf|JbRQHCOoVJ3`Vx29t9U*QracRxgX%kgz$V*gxg(RXo zks6B(2Eto)E@PA34k*IL$%9}9U$h4y&cjZ_0v@W^1rzv*B;yYihv7BscZ|YW{K~PC z`UUqri^rY$u!>90@~yUhMz0hQtl~{)o^+i=f(5+qbi?)SS#jcE~(Cd zs!$&##UO^O3ORf8RYmGgNimE1?6wpKux?_}sPB)&0)3%aphi*ntSia|EURv9pr4Ud zb4VnQvY~`FH0%uq6fSNxTRjp9g=5>lgkXE?zqmoy2$t|#^#t6Y1mk@*YOq}V-@-oR zl84RGnL6FU#&I}P#`)S~Y7upT=jDJEY_9XT#c(f>tLT6r|2sO0!J@#4tRZhSrX1o` zC^0_MYz05B+acW|CxVNZTt5l7_|B1WvHn6f^~A%gUnB<=!8q=2=z=S_-0)=4Dk*;A zKpl=!!)KDd&n`Qa#)`?Z%E$3*_!xh5?a39X{Y=_l2!7qN)4IA#B0(Gvx_i_lIV||4 z`+SSogdJoSdx{na3lWGPiY8KwsuXThbYgWbh<8?Dkk?n9d(T7owlYxqXj@A&IK DJHnu+ diff --git a/home/__pycache__/urls.cpython-313.pyc b/home/__pycache__/urls.cpython-313.pyc index bd4ad0c1633dcb82a0a24181b4eccba13e8be8b2..a07f2f172519809dce258086b2945c96b239ef26 100644 GIT binary patch delta 1071 zcmZvb&rcIU6vublX>5UQL!ov18w=R2Kr2>gu^<*fC_mcLQcuK&K!FOhT3Rr~M7iO~ z;vU?KhG=3qVz}@Rcr~4i8%>DuKNzD&L+qOp1K3G6nKz&B_sx5=GheQJYUO@$Tpd#x z@4khXe(!Q7w)D}(tGJ28r9Nehon@U&Vp5z`+2eFNHLHxrKz@ECB4^~$iY9)ZLzIYB zHTi3a>3qjh+?_ZqsQxIdT>8nQOg_EPwVKJUc()qPhKD)zCOfDvX4ebF`IWBu<+=Ra zd?B6pZZ-b5w$;3xTT6R3GU?5APc~ObE#`{Zg^0WJ@I>>0e?@SmoVS)sm;ww_`=y#GYQ!i3`evCSZvaKl^{-WW^)DqR5L2gj;S;vH@D&Dw*89FM>K-C&G9{e8!EW0 zF-s$|)r+m(gNGP}2nR$zl! zuU&SAurpL1dw@}jTn5C8L}yT#1Tm^L(Os=jl)03Y4K8eO?Po9w5F04%G|9zw9D?{p zTW!Y)PMf5Xc>(jn{!@(lNvj}Yt&tXSwWi+%sRdeuTM+F!eg+mgsn#YHWk(P@g5{wk zM)yea7gX4xf`3ikF*$#l5PMu;5=4+FuhsRPCM_dVfTY40KhI8WRn-0 zya#I-4U;|qw*Xj5Y1!z;M)yG-MnMt;&<_pu55V*`-SEP{8U%8Ot&umx0vck)Y0mKM zE)9mM?m}N96x{=KddC9T7AOx+V-zQ&6pm4!v1EAd*mdk}VB{fT3dXB0db4`5wYNMF i!6-^5D4eW9IQy2fhd%}Mc|Dn78ExBkT|QEI5Pt#6BS!Q9 delta 746 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 B5+eWr delta 9202 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 diff --git a/home/models.py b/home/models.py index 1ed077f..f986ee9 100644 --- a/home/models.py +++ b/home/models.py @@ -16,6 +16,10 @@ class Noticia(models.Model): def __str__(self): return self.titulo + +class UnstuckHistory(models.Model): + character_name = models.CharField(max_length=50) + used_at = models.DateTimeField() class ClienteCategoria(models.Model): diff --git a/home/static/nw-themes/nw-ryu/nw-js-handlers/change_email_response.js b/home/static/nw-themes/nw-ryu/nw-js-handlers/change_email_response.js index cc0b6bb..ffed7b2 100644 --- a/home/static/nw-themes/nw-ryu/nw-js-handlers/change_email_response.js +++ b/home/static/nw-themes/nw-ryu/nw-js-handlers/change_email_response.js @@ -1,34 +1,45 @@ $(document).ready(function() { - $('#nw-change-email-form').on('submit', function(e) { - e.preventDefault(); // Evitar el envío por defecto del formulario + function handleResponse(response, button, originalText) { + $("#change-email-response").html(response.message).hide().slideDown(); + + if (response.redirect_url) { + setTimeout(function() { + window.location.href = response.redirect_url; + }, 2000); + return; + } + + if (response.success) { + button.html("Proceso completado"); + } else { + setTimeout(function() { + $("#change-email-response").slideUp(function() { + $("#change-email-response").empty(); + button.html(originalText); + button.prop("disabled", false); + }); + }, 5000); + } + } + + // Manejar los enlaces de confirmación + $('.confirm-link').on('click', function(e) { + e.preventDefault(); $("#change-email-response").empty(); - var form = $(this); - var button = $('.change-email-button'); + var button = $(this); + var url = button.attr('href'); var originalText = button.html(); - button.html("Cambiando correo..."); + button.html("Verificando..."); button.prop("disabled", true); $.ajax({ - type: 'POST', - url: form.attr('action'), - data: form.serialize(), // Serializar los datos correctamente + type: 'GET', + url: url, dataType: 'json', success: function(response) { - $("#change-email-response").html(response.message).hide().slideDown(); - - if (response.success) { - button.html("Correo cambiado"); - } else { - setTimeout(function() { - $("#change-email-response").slideUp(function() { - $("#change-email-response").empty(); - button.html(originalText); - button.prop("disabled", false); - }); - }, 5000); - } + handleResponse(response, button, originalText); }, error: function(xhr, status, error) { console.error("Error:", error); diff --git a/home/static/nw-themes/nw-ryu/nw-js-handlers/unstuck_response.js b/home/static/nw-themes/nw-ryu/nw-js-handlers/unstuck_response.js new file mode 100644 index 0000000..ab7bb27 --- /dev/null +++ b/home/static/nw-themes/nw-ryu/nw-js-handlers/unstuck_response.js @@ -0,0 +1,41 @@ +$(function() { + $('.unstuck-button').on('click', function(e) { + e.preventDefault(); + e.stopPropagation(); + $("#unstuck-response").empty(); + + var button = $(this); + var originalText = button.html(); + var data = $("#uw-unstuck-form").serialize(); + + button.html("Desbloqueando..."); + button.prop("disabled", true); + + $.ajax({ + type: 'POST', + url: '', + data: data, + dataType: 'json', + success: function(data) { + $("#unstuck-response").html(data.message).hide().slideDown(); + + if (data.success) { + button.html("Desbloqueado"); + setTimeout(function() { + $("#uw-unstuck-form")[0].reset(); + button.html(originalText); + button.prop("disabled", false); + }, 5000); + } else { + button.html(originalText); + button.prop("disabled", false); + } + }, + error: function() { + $("#unstuck-response").html('Algo ha salido mal. Inténtelo más tarde.'); + button.html(originalText); + button.prop("disabled", false); + } + }); + }); +}); diff --git a/home/templates/account/confirm_new_email_success.html b/home/templates/account/confirm_new_email_success.html new file mode 100644 index 0000000..40745ea --- /dev/null +++ b/home/templates/account/confirm_new_email_success.html @@ -0,0 +1,9 @@ + + + {% include 'partials/head.html' %} + {% include 'partials/header.html' %} + {% include 'partials/video.html' %} + {% include 'partials/confirm_new_email_success.html' %} + {% include 'partials/social.html' %} + {% include 'partials/footer.html' %} + {% include 'partials/final.html' %} \ No newline at end of file diff --git a/home/templates/account/confirm_old_email_success.html b/home/templates/account/confirm_old_email_success.html new file mode 100644 index 0000000..e507d48 --- /dev/null +++ b/home/templates/account/confirm_old_email_success.html @@ -0,0 +1,9 @@ + + + {% include 'partials/head.html' %} + {% include 'partials/header.html' %} + {% include 'partials/video.html' %} + {% include 'partials/confirm_old_email_success.html' %} + {% include 'partials/social.html' %} + {% include 'partials/footer.html' %} + {% include 'partials/final.html' %} \ No newline at end of file diff --git a/home/templates/account/expired_link.html b/home/templates/account/expired_link.html new file mode 100644 index 0000000..1e11adf --- /dev/null +++ b/home/templates/account/expired_link.html @@ -0,0 +1,9 @@ + + + {% include 'partials/head.html' %} + {% include 'partials/header.html' %} + {% include 'partials/video.html' %} + {% include 'partials/expired_link.html' %} + {% include 'partials/social.html' %} + {% include 'partials/footer.html' %} + {% include 'partials/final.html' %} \ No newline at end of file diff --git a/home/templates/account/unstuck_character.html b/home/templates/account/unstuck_character.html new file mode 100644 index 0000000..4fa7a83 --- /dev/null +++ b/home/templates/account/unstuck_character.html @@ -0,0 +1,9 @@ + + + {% include 'partials/head.html' %} + {% include 'partials/header.html' %} + {% include 'partials/video.html' %} + {% include 'partials/unstuck_character.html' %} + {% include 'partials/social.html' %} + {% include 'partials/footer.html' %} + {% include 'partials/final.html' %} \ No newline at end of file diff --git a/home/templates/partials/confirm_new_email_success.html b/home/templates/partials/confirm_new_email_success.html new file mode 100644 index 0000000..918a284 --- /dev/null +++ b/home/templates/partials/confirm_new_email_success.html @@ -0,0 +1,15 @@ + + + + + Confirmación de Nuevo Correo + + + +
+

Cambio de Correo Completado

+

El cambio de correo ha sido confirmado y completado con éxito.

+ Regresar a Mi Cuenta +
+ + diff --git a/home/templates/partials/confirm_old_email_success.html b/home/templates/partials/confirm_old_email_success.html new file mode 100644 index 0000000..b96b992 --- /dev/null +++ b/home/templates/partials/confirm_old_email_success.html @@ -0,0 +1,15 @@ + + + + + Confirmación de Correo Anterior + + + +
+

Confirmación de Correo Anterior Exitosa

+

Has confirmado tu correo anterior. Se ha enviado un enlace al nuevo correo para completar el cambio.

+ Regresar a Mi Cuenta +
+ + diff --git a/home/templates/partials/expired_link.html b/home/templates/partials/expired_link.html new file mode 100644 index 0000000..286eab0 --- /dev/null +++ b/home/templates/partials/expired_link.html @@ -0,0 +1,27 @@ +
+
+
+
+

Enlace Expirado

+
+
+
+

Enlace Expirado

+ + +
+
+
+
+
+ Lo sentimos, el enlace que ha utilizado ha expirado o no es válido. +
+
+ No hay códigos de promoción disponibles + +
+
+
+
+
+
diff --git a/home/templates/partials/head.html b/home/templates/partials/head.html index 4fdc02b..576b91f 100644 --- a/home/templates/partials/head.html +++ b/home/templates/partials/head.html @@ -52,6 +52,7 @@ + diff --git a/home/templates/partials/my-account.html b/home/templates/partials/my-account.html index 65d2334..03f8752 100644 --- a/home/templates/partials/my-account.html +++ b/home/templates/partials/my-account.html @@ -207,6 +207,201 @@
+ {% for character in characters %} +
OPCIONES DE PERSONAJE + + +
+ + +
HISTORIALES
diff --git a/home/templates/partials/unstuck_character.html b/home/templates/partials/unstuck_character.html new file mode 100644 index 0000000..39ba380 --- /dev/null +++ b/home/templates/partials/unstuck_character.html @@ -0,0 +1,43 @@ +
+
+
+
+

Desbloquear personaje

+
+
+
+

Información

+ + +
+
+

La herramienta Desbloquear personaje te permite desbloquear un personaje que esté atascado y lo mueve a la ubicación de su Piedra Hogar.

+

Usa esta opción cuando tu personaje se encuentre atrapado y ninguna otra opción te sirva.

+
+ NOTA +
+

Se requiere que el personaje esté desconectado.

+

Se puede repetir la acción en un mismo personaje cada 12 horas.

+
+
+
+

Escoge el personaje que quieres desbloquear

+
+ {% csrf_token %} + +
+ + +
+
+
+
+
+
+
+
diff --git a/home/urls.py b/home/urls.py index 6be487d..41f8a1f 100644 --- a/home/urls.py +++ b/home/urls.py @@ -26,6 +26,7 @@ urlpatterns = [ path('change-email/', views.change_email_view, name='change-email'), path('confirm-old-email/', views.confirm_old_email_view, name='confirm-old-email'), path('confirm-new-email/', views.confirm_new_email_view, name='confirm-new-email'), + path('expired-link/', views.expired_link_view, name='expired-link'), path('promo-code/', views.promo_code_view, name='promo_code'), path('transfer-d-points/', views.transfer_d_points_view, name='transfer_d_points'), path('rename-guild/', views.rename_guild_view, name='rename-guild'), @@ -39,6 +40,7 @@ urlpatterns = [ path('activate-account', views.activate_account_view, name='activate_account'), path('help', views.help_view, name='help'), path('novawow-players', views.novawow_players_view, name='novawow_players'), + path('unstuck-character/', views.unstuck_character_view, name='unstuck-character'), ] diff --git a/home/views.py b/home/views.py index aee4310..83187e6 100644 --- a/home/views.py +++ b/home/views.py @@ -5,12 +5,13 @@ import binascii import os import re from django.shortcuts import render, redirect +from django.urls import reverse from django.http import HttpResponse, JsonResponse from django.db import connections from django.contrib import messages from django.contrib.auth import logout from django import forms -from .models import Noticia, ClienteCategoria, ServerSelection, RecruitAFriend, DownloadClientPage, ContentCreator, RecruitReward, ClaimedReward, AccountActivation, SecurityToken, GuildRenameSettings, VoteSite, VoteLog, HomeApiPoints +from .models import Noticia, ClienteCategoria, ServerSelection, RecruitAFriend, DownloadClientPage, ContentCreator, RecruitReward, ClaimedReward, AccountActivation, SecurityToken, GuildRenameSettings, VoteSite, VoteLog, HomeApiPoints, UnstuckHistory from django.views.decorators.csrf import csrf_exempt import logging from datetime import datetime, timedelta @@ -1001,22 +1002,22 @@ def change_email_view(request): # Validar los campos if not all([current_password, current_email_input, new_email, conf_new_email, token]): - return JsonResponse({'success': False, 'message': 'Por favor, complete todos los campos.'}) + return JsonResponse({'success': False, 'message': 'Por favor, complete todos los campos.'}) if current_email_input != current_email: - return JsonResponse({'success': False, 'message': 'El correo actual no es correcto.'}) + return JsonResponse({'success': False, 'message': 'El correo actual no es correcto.'}) if new_email != conf_new_email: - return JsonResponse({'success': False, 'message': 'Los correos no coinciden.'}) + return JsonResponse({'success': False, 'message': 'Los correos no coinciden.'}) if not re.match(r'^[a-zA-Z0-9._%+-]+@gmail\.com$', new_email): - return JsonResponse({'success': False, 'message': 'El nuevo correo no es válido.'}) + return JsonResponse({'success': False, 'message': 'El nuevo correo no es válido.'}) if not security_token or security_token.token != token: - return JsonResponse({'success': False, 'message': 'Token de seguridad incorrecto.'}) + return JsonResponse({'success': False, 'message': 'Token de seguridad incorrecto.'}) if not authenticate(username, current_password): - return JsonResponse({'success': False, 'message': 'Contraseña incorrecta.'}) + return JsonResponse({'success': False, 'message': 'Contraseña incorrecta.'}) # Generar hashes old_email_hash = secrets.token_urlsafe(16) @@ -1049,7 +1050,7 @@ def change_email_view(request): context=context_old_email ) - return JsonResponse({'success': True, 'message': 'Se ha enviado un correo de confirmación al correo actual.'}) + return JsonResponse({'success': True, 'message': 'Se ha enviado un correo de confirmación al correo actual.'}) return render(request, 'account/change_email.html') @@ -1059,7 +1060,11 @@ def confirm_old_email_view(request): activation = AccountActivation.objects.filter(old_email_hash=hash, is_used=False).first() if not activation or activation.is_expired(): - return HttpResponse('Enlace no válido o expirado.', status=400) + return JsonResponse({ + 'success': False, + 'message': 'Enlace no válido o expirado.', + 'redirect_url': reverse('expired-link') + }) # Marcar solo el old_email_hash como usado activation.is_used = True @@ -1079,15 +1084,18 @@ def confirm_old_email_view(request): context=context_new_email ) - return HttpResponse('Correo confirmado. Se ha enviado un enlace al nuevo correo.') - + return JsonResponse({'success': True, 'message': 'Correo confirmado. Se ha enviado un enlace al nuevo correo.'}) def confirm_new_email_view(request): hash = request.GET.get('hash') activation = AccountActivation.objects.filter(hash=hash, is_new_email_used=False).first() if not activation or activation.is_expired(): - return HttpResponse('Enlace no válido o expirado.', status=400) + return JsonResponse({ + 'success': False, + 'message': 'Enlace no válido o expirado.', + 'redirect_url': reverse('expired-link') + }) # Marcar solo el new_email_hash como usado activation.is_new_email_used = True @@ -1114,11 +1122,72 @@ def confirm_new_email_view(request): context=context_old_email ) - return HttpResponse('El cambio de correo ha sido confirmado y completado con éxito.') + return JsonResponse({'success': True, 'message': 'El cambio de correo ha sido confirmado y completado con éxito.'}) + +def expired_link_view(request): + return render(request, 'account/expired_link.html') - def promo_code_view(request): return render(request, 'account/promo_code.html') + +from django.utils.timezone import now +from datetime import timedelta + +def unstuck_character_view(request): + username = request.session.get('username') + if not username: + return redirect('login') + + # Obtener personajes del usuario desde la base de datos `acore_characters` + with connections['acore_characters'].cursor() as cursor: + cursor.execute(""" + SELECT name, online + FROM characters + WHERE account = ( + SELECT id + FROM acore_auth.account + WHERE username = %s + ) + """, [username]) + characters_data = cursor.fetchall() + characters = {row[0]: row[1] for row in characters_data} # Diccionario con nombre y estado de conexión + + if request.method == 'POST': + character_name = request.POST.get('character') + + # Validar si el personaje fue seleccionado + if not character_name: + return JsonResponse({'success': False, 'message': 'Por favor, seleccione un personaje.'}) + + # Verificar si el personaje pertenece al usuario + if character_name not in characters: + return JsonResponse({'success': False, 'message': 'No tienes permiso para desbloquear este personaje.'}) + + # Verificar si el personaje está desconectado + if characters[character_name] == 1: # Si está conectado + return JsonResponse({'success': False, 'message': 'El personaje debe estar desconectado para ser desbloqueado.'}) + + # Verificar el historial de uso del comando + last_unstuck = UnstuckHistory.objects.filter(character_name=character_name).order_by('-used_at').first() + if last_unstuck and last_unstuck.used_at > now() - timedelta(hours=12): + return JsonResponse({'success': False, 'message': 'El personaje solo puede desbloquearse una vez cada 12 horas.'}) + + # Ejecutar el comando SOAP + command = f".unstuck {character_name} startzone" + response = execute_soap_command(command) + + if response is None: + return JsonResponse({'success': False, 'message': 'Error de comunicación con el servidor. Intente nuevamente más tarde.'}) + + # Analizar la respuesta + if f"You are summoning {character_name} (offline)" in response: + # Registrar el uso del comando + UnstuckHistory.objects.create(character_name=character_name, used_at=now()) + return JsonResponse({'success': True, 'message': f'El personaje {character_name} ha sido desbloqueado con éxito.'}) + else: + return JsonResponse({'success': False, 'message': f'Error: {response}'}) + + return render(request, 'account/unstuck_character.html', {'characters': characters.keys()}) def transfer_d_points_view(request): # Renderizar la plantilla para la transferencia de puntos diff --git a/novawow/__pycache__/settings.cpython-313.pyc b/novawow/__pycache__/settings.cpython-313.pyc index 93e06ad8cc88c3bff902eddea1bbefe44394ca63..b334c19608659c9d06c76a76a42bf6051ebdcebd 100644 GIT binary patch delta 29 jcmeyU{85?rGcPX}0}xnBd!;Yl$a|Hakz?~?em*7ug$@W+ delta 29 jcmeyU{85?rGcPX}0}y!ru}WXMk@qS;BiH7~{CrFRl7R_2 diff --git a/novawow/__pycache__/urls.cpython-313.pyc b/novawow/__pycache__/urls.cpython-313.pyc index 14d4b537fa67e90b012202181a405610210410aa..41612c3f657d2383e01b4abacdd38c85ba69b5a6 100644 GIT binary patch delta 20 acmZ3-wvLVaGcPX}0}yE5^xVj;%nSfFR0OyH delta 20 acmZ3-wvLVaGcPX}0}zDH(BH_d%nSfEfCPyE diff --git a/novawow/settings.py b/novawow/settings.py index 29a3463..7c47601 100644 --- a/novawow/settings.py +++ b/novawow/settings.py @@ -27,7 +27,6 @@ DEBUG = True ALLOWED_HOSTS = ['*'] - # Application definition INSTALLED_APPS = [