2
2
import os
3
3
from logging import getLogger
4
4
import shlex
5
- from typing import List , Dict , Iterable
5
+ from typing import List , Dict , Iterable , Union , Tuple , Set
6
6
from rare .utils import config_helper as config
7
7
8
8
from PySide6 .QtCore import QSettings
14
14
logger = getLogger ("Wrappers" )
15
15
16
16
17
+ class WrapperEntry :
18
+ def __init__ (self , checksum : str , enabled : bool = True ):
19
+ self .__checksum : str = checksum
20
+ self .__enabled : bool = enabled
21
+
22
+ @property
23
+ def checksum (self ) -> str :
24
+ return self .__checksum
25
+
26
+ @property
27
+ def enabled (self ) -> bool :
28
+ return self .__enabled
29
+
30
+ @classmethod
31
+ def from_dict (cls , data : Dict ):
32
+ return cls (checksum = data .get ("checksum" ), enabled = data .get ("enabled" , True ))
33
+
34
+ @property
35
+ def __dict__ (self ):
36
+ return dict (checksum = self .__checksum , enabled = self .__enabled )
37
+
38
+ # def __eq__(self, other) -> bool:
39
+ # return self.checksum == other.checksum
40
+
41
+
17
42
class Wrappers :
18
43
def __init__ (self ):
19
44
self .__file = os .path .join (config_dir (), "wrappers.json" )
@@ -30,9 +55,15 @@ def __init__(self):
30
55
for wrap_id , wrapper in self .__wrappers_dict .get ("wrappers" , {}).items ():
31
56
self .__wrappers .update ({wrap_id : Wrapper .from_dict (wrapper )})
32
57
33
- self .__applists : Dict [str , List [str ]] = {}
58
+ self .__applists : Dict [str , List [WrapperEntry ]] = {}
34
59
for app_name , wrapper_list in self .__wrappers_dict .get ("applists" , {}).items ():
35
- self .__applists .update ({app_name : wrapper_list })
60
+ if all (isinstance (x , str ) for x in wrapper_list ):
61
+ wlist = [WrapperEntry (y ) for y in wrapper_list ]
62
+ elif all (isinstance (x , dict ) for x in wrapper_list ):
63
+ wlist = [WrapperEntry .from_dict (y ) for y in wrapper_list ]
64
+ else :
65
+ wlist = []
66
+ self .__applists .update ({app_name : wlist })
36
67
37
68
def import_wrappers (self , core : LegendaryCore , settings : QSettings , app_names : List ):
38
69
for app_name in app_names :
@@ -69,34 +100,31 @@ def user_wrappers(self) -> Iterable[Wrapper]:
69
100
# yield wrap
70
101
71
102
def get_game_wrapper_string (self , app_name : str ) -> str :
72
- commands = [wrapper .as_str for wrapper in self .get_game_wrapper_list (app_name )]
103
+ commands = [wrapper .as_str for wrapper in self .get_game_wrapper_list (app_name ) if wrapper . is_enabled ]
73
104
return " " .join (commands )
74
105
75
106
def get_game_wrapper_list (self , app_name : str ) -> List [Wrapper ]:
76
- _wrappers = []
77
- for wrap_id in self .__applists .get (app_name , []):
78
- if wrap := self .__wrappers .get (wrap_id , None ):
79
- _wrappers .append (wrap )
80
- return _wrappers
107
+ wrappers = []
108
+ for entry in self .__applists .get (app_name , []):
109
+ if wrap := self .__wrappers .get (entry .checksum , None ):
110
+ wrap .is_enabled = entry .enabled
111
+ wrappers .append (wrap )
112
+ return wrappers
81
113
82
- def get_game_md5sum_list (self , app_name : str ) -> List [str ]:
83
- return self .__applists .get (app_name , [])
114
+ def get_game_csum_list (self , app_name : str ) -> Set [str ]:
115
+ return { entry . checksum for entry in self .__applists .get (app_name , [])}
84
116
85
117
def set_game_wrapper_list (self , app_name : str , wrappers : List [Wrapper ]) -> None :
86
118
_wrappers = sorted (wrappers , key = lambda w : w .is_compat_tool )
87
119
for w in _wrappers :
88
120
if (md5sum := w .checksum ) in self .__wrappers .keys ():
89
121
if w != self .__wrappers [md5sum ]:
90
- logger .error (
91
- "Non-unique md5sum for different wrappers %s, %s" ,
92
- w .name ,
93
- self .__wrappers [md5sum ].name ,
94
- )
122
+ logger .error ("Equal csum for unequal wrappers %s, %s" , w .name , self .__wrappers [md5sum ].name )
95
123
if w .is_compat_tool :
96
124
self .__wrappers .update ({md5sum : w })
97
125
else :
98
126
self .__wrappers .update ({md5sum : w })
99
- self .__applists [app_name ] = [w .checksum for w in _wrappers ]
127
+ self .__applists [app_name ] = [WrapperEntry ( w .checksum , w . is_enabled ) for w in _wrappers ]
100
128
self .__save_config (app_name )
101
129
self .__save_wrappers ()
102
130
@@ -105,8 +133,8 @@ def __save_config(self, app_name: str):
105
133
config .save_option (app_name , "wrapper" , command_string )
106
134
107
135
def __save_wrappers (self ):
108
- existing = {wrap_id for wrap_id in self .__wrappers .keys ()}
109
- in_use = {wrap_id for wrappers in self .__applists .values () for wrap_id in wrappers }
136
+ existing = {csum for csum in self .__wrappers .keys ()}
137
+ in_use = {entry . checksum for wrappers in self .__applists .values () for entry in wrappers }
110
138
111
139
for redudant in existing .difference (in_use ):
112
140
del self .__wrappers [redudant ]
@@ -128,15 +156,16 @@ def __save_wrappers(self):
128
156
config_dir = os .getcwd
129
157
global config
130
158
config = Namespace ()
131
- config .set_option = lambda x , y , z : print (x , y , z )
132
- config .remove_option = lambda x , y : print (x , y )
133
- config .save_config = lambda : print ()
159
+ config .set_option = lambda x , y , z : print ("set_option:" , x , y , z )
160
+ config .remove_option = lambda x , y : print ("remove_option:" , x , y )
161
+ config .save_config = lambda : print ("save_config:" )
162
+ config .save_option = lambda x , y , z : print ("save_option:" , x , y , z )
134
163
135
164
wr = Wrappers ()
136
165
137
166
w1 = Wrapper (command = ["/usr/bin/w1" ], wtype = WrapperType .NONE )
138
167
w2 = Wrapper (command = ["/usr/bin/w2" ], wtype = WrapperType .COMPAT_TOOL )
139
- w3 = Wrapper (command = ["/usr/bin/w3" ], wtype = WrapperType .USER_DEFINED )
168
+ w3 = Wrapper (command = ["/usr/bin/w3" ], wtype = WrapperType .USER_DEFINED , enabled = False )
140
169
w4 = Wrapper (command = ["/usr/bin/w4" ], wtype = WrapperType .USER_DEFINED )
141
170
wr .set_game_wrapper_list ("testgame" , [w1 , w2 , w3 , w4 ])
142
171
@@ -147,19 +176,21 @@ def __save_wrappers(self):
147
176
wr .set_game_wrapper_list ("testgame" , [w1 , w2 , w3 , w6 ])
148
177
149
178
w7 = Wrapper (command = ["/usr/bin/w2" ], wtype = WrapperType .COMPAT_TOOL )
150
- wrs = wr .get_game_wrapper_list ("testgame" )
151
- wrs .remove (w7 )
152
- wr .set_game_wrapper_list ("testgame" , wrs )
179
+ app_wrappers = wr .get_game_wrapper_list ("testgame" )
180
+ pprint ([w .as_str for w in app_wrappers ])
181
+ # item = next(item for item in app_wrappers if item.checksum == w3.checksum)
182
+ app_wrappers .remove (w3 )
183
+ wr .set_game_wrapper_list ("testgame" , app_wrappers )
153
184
154
185
game_wrappers = wr .get_game_wrapper_list ("testgame" )
155
- pprint (game_wrappers )
186
+ pprint ([ w . as_str for w in game_wrappers ] )
156
187
game_wrappers = wr .get_game_wrapper_list ("testgame2" )
157
- pprint (game_wrappers )
188
+ pprint ([ w . as_str for w in game_wrappers ] )
158
189
159
- for i , tool in enumerate (steam .find_tools ()):
160
- wt = Wrapper (command = tool .command (), name = tool .name , wtype = WrapperType .COMPAT_TOOL )
161
- wr .set_game_wrapper_list (f"compat_game_{ i } " , [wt ])
162
- print (wt .as_str )
190
+ # for i, tool in enumerate(steam.find_tools()):
191
+ # wt = Wrapper(command=tool.command(), name=tool.name, wtype=WrapperType.COMPAT_TOOL)
192
+ # wr.set_game_wrapper_list(f"compat_game_{i}", [wt])
193
+ # print(wt.as_str)
163
194
164
195
for wrp in wr .user_wrappers :
165
- pprint (wrp )
196
+ pprint (wrp . as_str )
0 commit comments