2121 gpss_console_bin ,
2222 legality_check_pkm ,
2323 legality_generation ,
24+ legalize_pkm ,
2425)
2526from pkm import (
2627 effective_nickname ,
@@ -385,6 +386,8 @@ def do_POST(self) -> None:
385386 parsed = urlparse (self .path )
386387 if parsed .path == "/api/legality" :
387388 return self ._legality_check ()
389+ if parsed .path == "/api/legalize" :
390+ return self ._legalize ()
388391
389392 self .send_error (HTTPStatus .METHOD_NOT_ALLOWED )
390393
@@ -427,6 +430,51 @@ def _legality_check(self) -> None:
427430 except Exception as err :
428431 return self ._json (500 , {"error" : f"legality check failed: { err } " })
429432
433+ def _legalize (self ) -> None :
434+ """Auto-legalize a Pokemon: POST raw PKM bytes + generation + version."""
435+ length = int (self .headers .get ("Content-Length" , 0 ))
436+ if not length :
437+ return self ._json (400 , {"error" : "empty body" })
438+ if length > 1_000_000 :
439+ return self ._json (413 , {"error" : "payload too large" })
440+
441+ generation = self .headers .get ("X-Generation" , "" ).strip ()
442+ if not generation :
443+ return self ._json (400 , {"error" : "missing X-Generation header" })
444+
445+ version = self .headers .get ("X-Version" , "Any" ).strip ()
446+
447+ pkm_bytes = self .rfile .read (length )
448+
449+ if gpss_console_bin () is None :
450+ return self ._json (503 , {"error" : "legality engine not available" })
451+
452+ try :
453+ check = legality_check_pkm (generation , pkm_bytes , None )
454+ report_before = [
455+ line .strip ()
456+ for line in check .get ("report" , [])
457+ if line and line .strip () and line .strip () != "Legal!"
458+ ] if "error" not in check else []
459+
460+ result = legalize_pkm (generation , pkm_bytes , version )
461+ if "error" in result :
462+ return self ._json (200 , {"error" : str (result ["error" ])})
463+ report_after = [
464+ line .strip ()
465+ for line in result .get ("report" , [])
466+ if line and line .strip () and line .strip () != "Legal!"
467+ ]
468+ return self ._json (200 , {
469+ "legal" : bool (result .get ("legal" , False )),
470+ "modified" : bool (result .get ("ran" , False )),
471+ "pokemon" : result .get ("pokemon" ),
472+ "report_before" : report_before ,
473+ "report_after" : report_after ,
474+ })
475+ except Exception as err :
476+ return self ._json (500 , {"error" : f"legalization failed: { err } " })
477+
430478 _SORT_ORDERS = {
431479 "recent" : "upload_datetime DESC, id DESC" ,
432480 "dl" : "download_count DESC, id DESC" ,
@@ -679,19 +727,30 @@ def do_GET(self) -> None:
679727 })
680728 self .send_error (HTTPStatus .NOT_FOUND )
681729
730+ def _read_pkm_request (self ):
731+ length = int (self .headers .get ("Content-Length" , 0 ))
732+ if not length :
733+ self ._json (400 , {"error" : "empty body" })
734+ return None , None , None
735+ if length > 1_000_000 :
736+ self ._json (413 , {"error" : "payload too large" })
737+ return None , None , None
738+ generation = self .headers .get ("X-Generation" , "" ).strip ()
739+ if not generation :
740+ self ._json (400 , {"error" : "missing X-Generation header" })
741+ return None , None , None
742+ if gpss_console_bin () is None :
743+ self ._json (503 , {"error" : "legality engine not available" })
744+ return None , None , None
745+ pkm_bytes = self .rfile .read (length )
746+ return pkm_bytes , generation , self .headers .get ("X-Version" , "Any" ).strip ()
747+
682748 def do_POST (self ) -> None :
683- if urlparse (self .path ).path == "/api/legality" :
684- length = int (self .headers .get ("Content-Length" , 0 ))
685- if not length :
686- return self ._json (400 , {"error" : "empty body" })
687- if length > 1_000_000 :
688- return self ._json (413 , {"error" : "payload too large" })
689- generation = self .headers .get ("X-Generation" , "" ).strip ()
690- if not generation :
691- return self ._json (400 , {"error" : "missing X-Generation header" })
692- pkm_bytes = self .rfile .read (length )
693- if gpss_console_bin () is None :
694- return self ._json (503 , {"error" : "legality engine not available" })
749+ path = urlparse (self .path ).path
750+ if path == "/api/legality" :
751+ pkm_bytes , generation , _ = self ._read_pkm_request ()
752+ if pkm_bytes is None :
753+ return
695754 try :
696755 result = legality_check_pkm (generation , pkm_bytes , None )
697756 if "error" in result :
@@ -711,4 +770,33 @@ def do_POST(self) -> None:
711770 })
712771 except Exception as err :
713772 return self ._json (500 , {"error" : f"legality check failed: { err } " })
773+ if path == "/api/legalize" :
774+ pkm_bytes , generation , version = self ._read_pkm_request ()
775+ if pkm_bytes is None :
776+ return
777+ try :
778+ check = legality_check_pkm (generation , pkm_bytes , None )
779+ report_before = [
780+ line .strip ()
781+ for line in check .get ("report" , [])
782+ if line and line .strip () and line .strip () != "Legal!"
783+ ] if "error" not in check else []
784+
785+ result = legalize_pkm (generation , pkm_bytes , version )
786+ if "error" in result :
787+ return self ._json (200 , {"error" : str (result ["error" ])})
788+ report_after = [
789+ line .strip ()
790+ for line in result .get ("report" , [])
791+ if line and line .strip () and line .strip () != "Legal!"
792+ ]
793+ return self ._json (200 , {
794+ "legal" : bool (result .get ("legal" , False )),
795+ "modified" : bool (result .get ("ran" , False )),
796+ "pokemon" : result .get ("pokemon" ),
797+ "report_before" : report_before ,
798+ "report_after" : report_after ,
799+ })
800+ except Exception as err :
801+ return self ._json (500 , {"error" : f"legalization failed: { err } " })
714802 self .send_error (HTTPStatus .NOT_FOUND )
0 commit comments