@@ -41,109 +41,113 @@ def __dict__(self):
41
41
42
42
class Wrappers :
43
43
def __init__ (self ):
44
- self .__file = os .path .join (config_dir (), "wrappers.json" )
45
- self .__wrappers_dict = {}
44
+ self ._file = os .path .join (config_dir (), "wrappers.json" )
45
+ self ._wrappers_dict = {}
46
46
try :
47
- with open (self .__file , "r" , encoding = "utf-8" ) as f :
48
- self .__wrappers_dict = json .load (f )
47
+ with open (self ._file , "r" , encoding = "utf-8" ) as f :
48
+ self ._wrappers_dict = json .load (f )
49
49
except FileNotFoundError :
50
- logger .info ("%s does not exist" , self .__file )
50
+ logger .info ("%s does not exist" , self ._file )
51
51
except json .JSONDecodeError :
52
- logger .warning ("%s is corrupt" , self .__file )
52
+ logger .warning ("%s is corrupt" , self ._file )
53
53
54
- self .__wrappers : Dict [str , Wrapper ] = {}
55
- for wrap_id , wrapper in self .__wrappers_dict .get ("wrappers" , {}).items ():
56
- self .__wrappers .update ({wrap_id : Wrapper .from_dict (wrapper )})
54
+ self ._version = self ._wrappers_dict .get ("version" , 1 )
57
55
58
- self .__applists : Dict [str , List [WrapperEntry ]] = {}
59
- for app_name , wrapper_list in self .__wrappers_dict .get ("applists" , {}).items ():
56
+ self ._wrappers : Dict [str , Wrapper ] = {}
57
+ for wrap_id , wrapper in self ._wrappers_dict .get ("wrappers" , {}).items ():
58
+ self ._wrappers .update ({wrap_id : Wrapper .from_dict (wrapper )})
59
+
60
+ self ._applists : Dict [str , List [WrapperEntry ]] = {}
61
+ for app_name , wrapper_list in self ._wrappers_dict .get ("applists" , {}).items ():
60
62
if all (isinstance (x , str ) for x in wrapper_list ):
61
63
wlist = [WrapperEntry (y ) for y in wrapper_list ]
62
64
elif all (isinstance (x , dict ) for x in wrapper_list ):
63
65
wlist = [WrapperEntry .from_dict (y ) for y in wrapper_list ]
64
66
else :
65
67
wlist = []
66
- self .__applists .update ({app_name : wlist })
68
+ self ._applists .update ({app_name : wlist })
69
+
70
+ # set current file version
71
+ self ._version = 2
67
72
68
73
def import_wrappers (self , core : LegendaryCore , settings : QSettings , app_names : List ):
69
74
for app_name in app_names :
70
- wrappers = self .get_game_wrapper_list (app_name )
71
- if not wrappers and (commands := settings .value (f"{ app_name } /wrapper" , [], list )):
75
+ wrappers = self .get_wrappers (app_name )
76
+ if not wrappers and (commands := settings .value (f"{ app_name } /wrapper" , [], type = list )):
72
77
logger .info ("Importing wrappers from Rare's config" )
73
78
settings .remove (f"{ app_name } /wrapper" )
74
79
for command in commands :
75
80
wrapper = Wrapper (command = shlex .split (command ))
76
81
wrappers .append (wrapper )
77
- self .set_game_wrapper_list (app_name , wrappers )
82
+ self .set_wrappers (app_name , wrappers )
78
83
logger .debug ("Imported previous wrappers in %s Rare: %s" , app_name , wrapper .name )
79
84
80
85
# NOTE: compatibility with Legendary
86
+ # No Rare settings wrappers, but legendary config wrappers, for backwards compatibility
81
87
if not wrappers and (command := core .lgd .config .get (app_name , "wrapper" , fallback = "" )):
82
88
logger .info ("Importing wrappers from legendary's config" )
83
- # no qt wrapper, but legendary wrapper, to have backward compatibility
84
- # pattern = re.compile(r'''((?:[^ "']|"[^"]*"|'[^']*')+)''')
85
- # wrappers = pattern.split(command)[1::2]
86
89
wrapper = Wrapper (
87
90
command = shlex .split (command ),
88
91
name = "Imported from Legendary" ,
89
92
wtype = WrapperType .LEGENDARY_IMPORT
90
93
)
91
94
wrappers = [wrapper ]
92
- self .set_game_wrapper_list (app_name , wrappers )
95
+ self .set_wrappers (app_name , wrappers )
93
96
logger .debug ("Imported existing wrappers in %s legendary: %s" , app_name , wrapper .name )
94
97
95
98
@property
96
99
def user_wrappers (self ) -> Iterable [Wrapper ]:
97
- return filter (lambda w : w .is_editable , self .__wrappers .values ())
100
+ return filter (lambda w : w .is_editable , self ._wrappers .values ())
98
101
# for wrap in self.__wrappers.values():
99
102
# if wrap.is_user_defined:
100
103
# yield wrap
101
104
102
- def get_game_wrapper_string (self , app_name : str ) -> str :
103
- commands = [wrapper .as_str for wrapper in self .get_game_wrapper_list (app_name ) if wrapper .is_enabled ]
105
+ def wrapper_command (self , app_name : str ) -> str :
106
+ commands = [wrapper .as_str for wrapper in self .get_wrappers (app_name ) if wrapper .is_enabled ]
104
107
return " " .join (commands )
105
108
106
- def get_game_wrapper_list (self , app_name : str ) -> List [Wrapper ]:
109
+ def get_checksums (self , app_name : str ) -> Set [str ]:
110
+ return {entry .checksum for entry in self ._applists .get (app_name , [])}
111
+
112
+ def get_wrappers (self , app_name : str ) -> List [Wrapper ]:
107
113
wrappers = []
108
- for entry in self .__applists .get (app_name , []):
109
- if wrap := self .__wrappers .get (entry .checksum , None ):
114
+ for entry in self ._applists .get (app_name , []):
115
+ if wrap := self ._wrappers .get (entry .checksum , None ):
110
116
wrap .is_enabled = entry .enabled
111
117
wrappers .append (wrap )
112
118
return wrappers
113
119
114
- def get_game_csum_list (self , app_name : str ) -> Set [str ]:
115
- return {entry .checksum for entry in self .__applists .get (app_name , [])}
116
-
117
- def set_game_wrapper_list (self , app_name : str , wrappers : List [Wrapper ]) -> None :
120
+ def set_wrappers (self , app_name : str , wrappers : List [Wrapper ]) -> None :
118
121
_wrappers = sorted (wrappers , key = lambda w : w .is_compat_tool )
119
122
for w in _wrappers :
120
- if (md5sum := w .checksum ) in self .__wrappers .keys ():
121
- if w != self .__wrappers [md5sum ]:
122
- logger .error ("Equal csum for unequal wrappers %s, %s" , w .name , self .__wrappers [md5sum ].name )
123
+ if (md5sum := w .checksum ) in self ._wrappers .keys ():
124
+ if w != self ._wrappers [md5sum ]:
125
+ logger .error ("Equal csum for unequal wrappers %s, %s" , w .name , self ._wrappers [md5sum ].name )
123
126
if w .is_compat_tool :
124
- self .__wrappers .update ({md5sum : w })
127
+ self ._wrappers .update ({md5sum : w })
125
128
else :
126
- self .__wrappers .update ({md5sum : w })
127
- self .__applists [app_name ] = [WrapperEntry (w .checksum , w .is_enabled ) for w in _wrappers ]
129
+ self ._wrappers .update ({md5sum : w })
130
+ self ._applists [app_name ] = [WrapperEntry (w .checksum , w .is_enabled ) for w in _wrappers ]
128
131
self .__save_config (app_name )
129
132
self .__save_wrappers ()
130
133
131
134
def __save_config (self , app_name : str ):
132
- command_string = self .get_game_wrapper_string (app_name )
133
- config .save_option (app_name , "wrapper" , command_string )
135
+ command = self .wrapper_command (app_name )
136
+ config .save_option (app_name , "wrapper" , command )
134
137
135
138
def __save_wrappers (self ):
136
- existing = {csum for csum in self .__wrappers .keys ()}
137
- in_use = {entry .checksum for wrappers in self .__applists .values () for entry in wrappers }
139
+ existing = {csum for csum in self ._wrappers .keys ()}
140
+ in_use = {entry .checksum for wrappers in self ._applists .values () for entry in wrappers }
138
141
139
142
for redudant in existing .difference (in_use ):
140
- del self .__wrappers [redudant ]
143
+ del self ._wrappers [redudant ]
141
144
142
- self .__wrappers_dict ["wrappers" ] = self .__wrappers
143
- self .__wrappers_dict ["applists" ] = self .__applists
145
+ self ._wrappers_dict ["version" ] = self ._version
146
+ self ._wrappers_dict ["wrappers" ] = self ._wrappers
147
+ self ._wrappers_dict ["applists" ] = self ._applists
144
148
145
- with open (os .path .join (self .__file ), "w+" , encoding = "utf-8" ) as f :
146
- json .dump (self .__wrappers_dict , f , default = lambda o : vars (o ), indent = 2 )
149
+ with open (os .path .join (self ._file ), "w+" , encoding = "utf-8" ) as f :
150
+ json .dump (self ._wrappers_dict , f , default = lambda o : vars (o ), indent = 2 )
147
151
148
152
149
153
if __name__ == "__main__" :
@@ -167,30 +171,30 @@ def __save_wrappers(self):
167
171
w2 = Wrapper (command = ["/usr/bin/w2" ], wtype = WrapperType .COMPAT_TOOL )
168
172
w3 = Wrapper (command = ["/usr/bin/w3" ], wtype = WrapperType .USER_DEFINED , enabled = False )
169
173
w4 = Wrapper (command = ["/usr/bin/w4" ], wtype = WrapperType .USER_DEFINED )
170
- wr .set_game_wrapper_list ("testgame" , [w1 , w2 , w3 , w4 ])
174
+ wr .set_wrappers ("testgame" , [w1 , w2 , w3 , w4 ])
171
175
172
176
w5 = Wrapper (command = ["/usr/bin/w5" ], wtype = WrapperType .COMPAT_TOOL )
173
- wr .set_game_wrapper_list ("testgame2" , [w2 , w1 , w5 ])
177
+ wr .set_wrappers ("testgame2" , [w2 , w1 , w5 ])
174
178
175
179
w6 = Wrapper (command = ["/usr/bin/w 6" , "-w" , "-t" ], wtype = WrapperType .USER_DEFINED )
176
- wr .set_game_wrapper_list ("testgame" , [w1 , w2 , w3 , w6 ])
180
+ wr .set_wrappers ("testgame" , [w1 , w2 , w3 , w6 ])
177
181
178
182
w7 = Wrapper (command = ["/usr/bin/w2" ], wtype = WrapperType .COMPAT_TOOL )
179
- app_wrappers = wr .get_game_wrapper_list ("testgame" )
183
+ app_wrappers = wr .get_wrappers ("testgame" )
180
184
pprint ([w .as_str for w in app_wrappers ])
181
185
# item = next(item for item in app_wrappers if item.checksum == w3.checksum)
182
186
app_wrappers .remove (w3 )
183
- wr .set_game_wrapper_list ("testgame" , app_wrappers )
187
+ wr .set_wrappers ("testgame" , app_wrappers )
184
188
185
- game_wrappers = wr .get_game_wrapper_list ("testgame" )
189
+ game_wrappers = wr .get_wrappers ("testgame" )
186
190
pprint ([w .as_str for w in game_wrappers ])
187
- game_wrappers = wr .get_game_wrapper_list ("testgame2" )
191
+ game_wrappers = wr .get_wrappers ("testgame2" )
188
192
pprint ([w .as_str for w in game_wrappers ])
189
193
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)
194
+ for i , tool in enumerate (steam .find_tools ()):
195
+ wt = Wrapper (command = tool .command (), name = tool .name , wtype = WrapperType .COMPAT_TOOL )
196
+ wr .set_wrappers (f"compat_game_{ i } " , [wt ])
197
+ print (wt .as_str )
194
198
195
199
for wrp in wr .user_wrappers :
196
200
pprint (wrp .as_str )
0 commit comments