1+ import importlib
2+ import importlib .util
3+ import json
4+ import sys
5+ from podrum .plugin_manager import plugin_manager
6+ from podrum .version import version
7+ from podrum .server import server
8+ from podrum .console .logger import logger
9+ import os
10+ import shutil
11+
12+ class Main :
13+ def __init__ (self ):
14+ self .logger : logger = logger ()
15+
16+ self .server : server
17+
18+ self .plugin_folder_path : str = os .path .join (os .getcwd (),"plugins" )
19+
20+ self .loaded_plugins :list = []
21+
22+
23+
24+ def on_load (self ):
25+ self .logger .info ("DevTools is on fire!!!" )
26+ self .getAllFolders ()
27+
28+ def on_unload (self ):
29+ self .logger .notice ("Goodbye my friend :)" )
30+
31+ def toxic_load (self ,path :str ) -> int :
32+ plugin_info :dict = json .load (open (os .path .join (path ,"info.json" ),'r' ))
33+ name = plugin_info ["name" ]
34+ file_name ,class_name = plugin_info ["main" ].rsplit ("." ,1 )
35+ plugin_version = plugin_info ["version" ]
36+ if (plugin_info ["name" ] in self .loaded_plugins ):
37+ return 0
38+ self .logger .notice (f"Getting plugin { name } infos..." )
39+
40+ if (plugin_info ["api_version" ] != version .podrum_api_version ):
41+ self .logger .warn (f"Plugin " + plugin_info ["name" ]+ " can't be loaded due to bad plugin API version. " )
42+ self .logger .warn (f"Plugin API version " + plugin_info ["api_version" ])
43+ self .logger .warn (f"Required API version { version .podrum_api_version } " )
44+ return 1
45+ if (plugin_info ["name" ] in self .server .managers .plugin_manager .plugins ):
46+ self .logger .info ("Unloading stage 1/1 ..." )
47+ del self .server .managers .plugin_manager .plugins [plugin_info ["name" ]]
48+
49+ # self.logger.info("Making new ZIP file")
50+ # shutil.make_archive(f"{name}_{plugin_version}","zip",path)
51+ # shutil.move(f"{name}_{plugin_version}.zip",f"plugins/{name}_{plugin_version}.zip")
52+ # self.logger.success("Successfully maked ZIP file")
53+
54+ self .logger .info ("Server please load this plugin now..." )
55+ #self.server.managers.plugin_manager.load(f"{self.server.get_root_path()}\\..\\plugins\\{name}_{plugin_version}.zip")
56+ spec = importlib .util .spec_from_file_location (f"{ class_name } " ,f"{ path } \{ file_name } .py" )
57+ prev_main_class = spec .loader .load_module (spec .name )
58+ main_class = getattr (prev_main_class ,class_name )
59+ self .server .managers .plugin_manager .plugins [plugin_info ["name" ]] = main_class ()
60+ self .server .managers .plugin_manager .plugins [plugin_info ["name" ]].server = self .server
61+ self .server .managers .plugin_manager .plugins [plugin_info ["name" ]].path = path
62+ self .server .managers .plugin_manager .plugins [plugin_info ["name" ]].version = plugin_info ["version" ]
63+ self .server .managers .plugin_manager .plugins [plugin_info ["name" ]].description = plugin_info ["description" ]
64+ self .server .managers .plugin_manager .plugins [plugin_info ["name" ]].author = plugin_info ["author" ]
65+ if (hasattr (main_class ,"on_load" )):
66+ self .server .managers .plugin_manager .plugins [plugin_info ["name" ]].on_load ()
67+
68+ self .logger .success ("Thank you server for loading " + plugin_info ["name" ])
69+ return 0
70+
71+ def getAllFolders (self ) -> None :
72+ howMuch = 0
73+ for dirs in os .listdir (self .plugin_folder_path ):
74+ if os .path .isdir (os .path .join (self .plugin_folder_path ,dirs )):
75+ if (dirs != "DevTools" ):
76+ self .logger .info (f"Loading { os .path .join (self .plugin_folder_path ,dirs )} plugin" )
77+ if (self .toxic_load (os .path .join (self .plugin_folder_path ,dirs ))== 0 ):
78+ howMuch = howMuch + 1
79+ if howMuch != 0 :
80+ self .logger .info (f"Loaded { howMuch } plugins" )
81+ else :
82+ self .logger .info ("There is no plugins to load" )
0 commit comments