six-updater-web 0.22.3 → 0.22.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +1 -1
- data/lib/six-updater-web/app/controllers/main_controller.rb +3 -9
- data/lib/six-updater-web/app/models/appsetting.rb +135 -163
- data/lib/six-updater-web/app/models/arma2_appsetting.rb +0 -5
- data/lib/six-updater-web/app/models/arma2_oa_appsetting.rb +1 -6
- data/lib/six-updater-web/app/models/arma2_oa_co_appsetting.rb +0 -5
- data/lib/six-updater-web/app/models/arma2_oa_st_appsetting.rb +1 -1
- data/lib/six-updater-web/app/models/sixconfig.rb +1 -1
- data/lib/six-updater-web/app/views/main/_right.haml +1 -2
- data/lib/six-updater-web/config/six-updater-web.rb +1 -1
- metadata +3 -3
data/Rakefile
CHANGED
@@ -229,13 +229,13 @@ class MainController < ApplicationController
|
|
229
229
|
if setting
|
230
230
|
setting.beta = @beta unless @beta.nil?
|
231
231
|
setting.server = @server_bool unless @server_bool.nil?
|
232
|
-
@msg << "Override settings profile: <a href='/appsettings/edit/#{setting.id}' title='#{setting.real_exe} #{setting.real_params} (#{setting.real_path})'>#{setting.label}</a>"
|
232
|
+
@msg << "Override settings profile: <a href='/appsettings/edit/#{setting.id}' title='#{setting.class.short}: #{setting.real_exe} #{setting.real_params} (#{setting.real_path})'>#{setting.label}</a>"
|
233
233
|
else
|
234
234
|
if preset.appsetting
|
235
235
|
setting = preset.appsetting
|
236
236
|
setting.beta = @beta unless @beta.nil?
|
237
237
|
setting.server = @server_bool unless @server_bool.nil?
|
238
|
-
@msg << "Preset settings profile: <a href='/appsettings/edit/#{setting.id}' title='#{setting.real_exe} #{setting.real_params} (#{setting.real_path})'>#{setting.label}</a>"
|
238
|
+
@msg << "Preset settings profile: <a href='/appsettings/edit/#{setting.id}' title='#{setting.class.short}: #{setting.real_exe} #{setting.real_params} (#{setting.real_path})'>#{setting.label}</a>"
|
239
239
|
end
|
240
240
|
end
|
241
241
|
|
@@ -248,13 +248,7 @@ class MainController < ApplicationController
|
|
248
248
|
end
|
249
249
|
end
|
250
250
|
|
251
|
-
|
252
|
-
if setting.type.nil? || setting.type.empty? || setting.type == "Appsetting"
|
253
|
-
setting.type = "Arma2Appsetting"
|
254
|
-
setting.save
|
255
|
-
setting = Appsetting.find(setting.id)
|
256
|
-
end
|
257
|
-
else
|
251
|
+
unless setting
|
258
252
|
setting = Arma2Appsetting.new(:beta => @beta, :server => @server_bool)
|
259
253
|
end
|
260
254
|
|
@@ -8,13 +8,6 @@ class Appsetting < ActiveRecord::Base
|
|
8
8
|
SPECIFIC = false
|
9
9
|
FRIENDLY_NAME = "ArmA 2 (Any)"
|
10
10
|
|
11
|
-
# TODO: Auto enumurate from model properties?
|
12
|
-
# folders: expansion, common, addons
|
13
|
-
# files: arma2.exe, arma2server.exe (-.exe for linux), arma2oa.exe, arma2oaserver.exe, addons/chernarus.pbo
|
14
|
-
FAMILY = Hash.new
|
15
|
-
FAMILY["Arma2"] = [["arma2.exe", "arma2server.exe"], {"Arma2St" => []}]
|
16
|
-
FAMILY["Arma2Oa"] = [["arma2oa.exe", "arma2oaserver.exe"], {"Arma2OaCo" => ["addons/"], "Arma2OaSt" => ["!addons/"]}]
|
17
|
-
|
18
11
|
DEFAULT_EXE = "arma2.exe"
|
19
12
|
DEFAULT_EXE_PATH = ""
|
20
13
|
DEFAULT_BETA_EXE = "arma2.exe"
|
@@ -27,16 +20,15 @@ class Appsetting < ActiveRecord::Base
|
|
27
20
|
DEFAULT_MODS_PARAM = "-mod=" # TODO
|
28
21
|
DEFAULT_BETA_MODS = ["beta"]
|
29
22
|
|
23
|
+
# TODO: Auto enumurate from model properties?
|
24
|
+
# folders: expansion, common, addons
|
25
|
+
# files: arma2.exe, arma2server.exe (-.exe for linux), arma2oa.exe, arma2oaserver.exe, addons/chernarus.pbo
|
26
|
+
FAMILY = Hash.new
|
27
|
+
FAMILY["Arma2"] = [[DEFAULT_EXE, DEFAULT_SERVER_EXE, "#{DEFAULT_BETA_EXE_PATH}/#{DEFAULT_BETA_EXE}"], {"Arma2St" => []}]
|
28
|
+
FAMILY["Arma2Oa"] = [[Arma2OaAppsetting::DEFAULT_EXE, Arma2OaAppsetting::DEFAULT_SERVER_EXE, "#{Arma2OaAppsetting::DEFAULT_BETA_EXE_PATH}/#{Arma2OaAppsetting::DEFAULT_BETA_EXE}"], {"Arma2OaCo" => ["addons/"], "Arma2OaSt" => ["!addons/"]}]
|
29
|
+
|
30
30
|
# TODO: Windows-only
|
31
31
|
REGKEYS = {"Arma2Oa" => ['SOFTWARE\\Bohemia Interactive Studio\\ArmA 2 OA', 'MAIN'], "Arma2" => ['SOFTWARE\\Bohemia Interactive Studio\\ArmA 2', 'MAIN']}
|
32
|
-
path = nil
|
33
|
-
|
34
|
-
self::REGKEYS.each_pair do |k, v|
|
35
|
-
path = begin; Win32::Registry.open(Win32::Registry::HKEY_LOCAL_MACHINE, v[0])[v[1]]; rescue; nil; end
|
36
|
-
break if path
|
37
|
-
end
|
38
|
-
DEFAULT_PATH = path
|
39
|
-
|
40
32
|
|
41
33
|
def to_updater_yml
|
42
34
|
hash = Hash.new
|
@@ -49,7 +41,7 @@ class Appsetting < ActiveRecord::Base
|
|
49
41
|
hash[:app_path] = self.real_path unless hash[:app_path]
|
50
42
|
hash[:app_exe] = self.real_exe unless hash[:app_exe]
|
51
43
|
if self.beta
|
52
|
-
hash[:mods] = self.
|
44
|
+
hash[:mods] = self.edition::DEFAULT_BETA_MODS.map{|e| e.gsub("/", "\\")}.join(";")
|
53
45
|
end
|
54
46
|
hash
|
55
47
|
end
|
@@ -71,170 +63,120 @@ class Appsetting < ActiveRecord::Base
|
|
71
63
|
self.to_s.sub("Appsetting", "")
|
72
64
|
end
|
73
65
|
|
74
|
-
def
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
else
|
81
|
-
edition::DEFAULT_SERVER_EXE_PATH.size == 0 ? edition::DEFAULT_SERVER_EXE : "#{edition::DEFAULT_SERVER_EXE_PATH}/#{edition::DEFAULT_SERVER_EXE}"
|
82
|
-
end
|
83
|
-
else
|
84
|
-
if self.beta
|
85
|
-
edition::DEFAULT_BETA_EXE_PATH.size == 0 ? edition::DEFAULT_BETA_EXE : "#{edition::DEFAULT_BETA_EXE_PATH}/#{edition::DEFAULT_BETA_EXE}"
|
86
|
-
else
|
87
|
-
edition::DEFAULT_EXE_PATH.size == 0 ? edition::DEFAULT_EXE : "#{edition::DEFAULT_EXE_PATH}/#{edition::DEFAULT_EXE}"
|
88
|
-
end
|
66
|
+
def self.types
|
67
|
+
return [Arma2Appsetting] if self == Appsetting
|
68
|
+
t, e = [], self
|
69
|
+
until e.nil? || [Appsetting, ActiveRecord::Base].include?(e) do
|
70
|
+
t << e
|
71
|
+
e = e.superclass
|
89
72
|
end
|
73
|
+
t
|
90
74
|
end
|
91
75
|
|
92
|
-
def
|
93
|
-
|
76
|
+
def self.default_path
|
77
|
+
return @mpath unless @mpath.nil?
|
78
|
+
@mpath = nil
|
79
|
+
self::REGKEYS.each_pair do |k, v|
|
80
|
+
@mpath = begin; Win32::Registry.open(Win32::Registry::HKEY_LOCAL_MACHINE, v[0])[v[1]]; rescue; nil; end
|
81
|
+
break if @mpath
|
82
|
+
end
|
83
|
+
@mpath
|
94
84
|
end
|
95
85
|
|
96
|
-
def
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
self.exe
|
101
|
-
end
|
86
|
+
def edition(force = true)
|
87
|
+
ed = self.detect_edition
|
88
|
+
ed = self.class if ed.nil? && force
|
89
|
+
ed
|
102
90
|
end
|
103
91
|
|
104
|
-
def
|
105
|
-
|
106
|
-
|
107
|
-
edition ? edition::DEFAULT_PARAMS : nil
|
108
|
-
else
|
109
|
-
self.params
|
110
|
-
end
|
92
|
+
def nice_edition
|
93
|
+
t = self.edition(false)
|
94
|
+
t ? t.label : "ERROR: None detected"
|
111
95
|
end
|
112
96
|
|
113
|
-
def
|
114
|
-
|
115
|
-
|
116
|
-
when /-mingw32$/, /-mswin32$/
|
117
|
-
"#{File.join(ENV['USERPROFILE'], 'appdata', 'local', 'arma 2')}"
|
118
|
-
else
|
119
|
-
nil
|
120
|
-
end
|
121
|
-
else
|
122
|
-
self.logpath
|
123
|
-
end
|
97
|
+
def found_types
|
98
|
+
t = self.edition(false)
|
99
|
+
t ? t.types : []
|
124
100
|
end
|
125
101
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
else
|
130
|
-
self.path
|
131
|
-
end
|
102
|
+
# TODO: Linux auto cut of '.exe' ?
|
103
|
+
def self.beta_server_exe()
|
104
|
+
self::DEFAULT_BETA_EXE_PATH.empty? ? self::DEFAULT_SERVER_EXE : "#{self::DEFAULT_BETA_EXE_PATH}/#{self::DEFAULT_SERVER_EXE}"
|
132
105
|
end
|
133
106
|
|
134
|
-
def
|
135
|
-
|
136
|
-
self.real_path
|
137
|
-
else
|
138
|
-
self.modpath
|
139
|
-
end
|
107
|
+
def self.server_exe()
|
108
|
+
self::DEFAULT_SERVER_EXE_PATH.empty? ? self::DEFAULT_SERVER_EXE : "#{self::DEFAULT_SERVER_EXE_PATH}/#{self::DEFAULT_SERVER_EXE}"
|
140
109
|
end
|
141
110
|
|
142
|
-
def
|
143
|
-
|
144
|
-
if self.exe[FOLDER]
|
145
|
-
$2
|
146
|
-
else
|
147
|
-
self.exe
|
148
|
-
end
|
149
|
-
else
|
150
|
-
self.get_exe
|
151
|
-
end
|
111
|
+
def self.beta_exe()
|
112
|
+
self::DEFAULT_BETA_EXE_PATH.empty? ? self::DEFAULT_BETA_EXE : "#{self::DEFAULT_BETA_EXE_PATH}/#{self::DEFAULT_BETA_EXE}"
|
152
113
|
end
|
153
114
|
|
154
|
-
def
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
found = false
|
171
|
-
sigs.each do |s|
|
172
|
-
sig = s.sub("#{p}.", "").sub(".bisign", "").downcase
|
173
|
-
if signatures.include?(sig)
|
174
|
-
found = true
|
175
|
-
allowed << inter
|
176
|
-
break
|
177
|
-
end
|
178
|
-
end
|
179
|
-
unless found
|
180
|
-
disallowed << inter
|
181
|
-
end
|
115
|
+
def self.normal_exe()
|
116
|
+
self::DEFAULT_EXE_PATH.empty? ? self::DEFAULT_EXE : "#{self::DEFAULT_EXE_PATH}/#{self::DEFAULT_EXE}"
|
117
|
+
end
|
118
|
+
|
119
|
+
def any_exe?
|
120
|
+
ed = self.class::SPECIFIC ? self.class : self.edition
|
121
|
+
(!self.exe.nil? && File.exists?(File.join(self.real_path, self.exe))) || File.exists?(File.join(self.real_path, ed.normal_exe)) || File.exists?(File.join(self.real_path, ed.server_exe)) || File.exists?(File.join(self.real_path, ed.beta_exe)) || File.exists?(File.join(self.real_path, ed.beta_server_exe))
|
122
|
+
end
|
123
|
+
|
124
|
+
def real_exe
|
125
|
+
return self.exe unless self.exe.nil?
|
126
|
+
return nil unless self.edition()
|
127
|
+
if self.server
|
128
|
+
self.beta ? self.edition.beta_server_exe : self.edition.server_exe
|
129
|
+
else
|
130
|
+
self.beta ? self.edition.beta_exe : self.edition.normal_exe
|
182
131
|
end
|
183
|
-
[allowed, disallowed, garbage]
|
184
132
|
end
|
185
133
|
|
186
|
-
def
|
187
|
-
|
134
|
+
def real_path
|
135
|
+
self.path.nil? ? self.class.default_path : self.path
|
188
136
|
end
|
189
137
|
|
190
|
-
def
|
191
|
-
|
138
|
+
def default_params
|
139
|
+
self.edition.nil? ? nil : self.edition::DEFAULT_PARAMS
|
192
140
|
end
|
193
141
|
|
194
|
-
def
|
195
|
-
|
142
|
+
def real_params
|
143
|
+
self.params.nil? ? self.default_params : self.params
|
196
144
|
end
|
197
145
|
|
198
|
-
def
|
199
|
-
|
200
|
-
"#{$1}.rpt"
|
146
|
+
def real_modpath
|
147
|
+
self.modpath.nil? ? self.real_path : self.modpath
|
201
148
|
end
|
202
149
|
|
203
|
-
def
|
204
|
-
if
|
205
|
-
|
150
|
+
def real_logpath
|
151
|
+
if self.logpath.nil?
|
152
|
+
case RUBY_PLATFORM
|
153
|
+
when /-mingw32$/, /-mswin32$/
|
154
|
+
"#{File.join(ENV['USERPROFILE'], 'appdata', 'local', 'arma 2')}"
|
155
|
+
else
|
156
|
+
nil
|
157
|
+
end
|
206
158
|
else
|
207
|
-
|
159
|
+
self.logpath
|
208
160
|
end
|
209
161
|
end
|
210
162
|
|
211
163
|
def detect_edition
|
212
164
|
# TODO: Read the appsetting.exe to figure out an edition, as a static setting by the user?
|
213
|
-
|
165
|
+
return @det_ed unless @det_ed.nil?
|
214
166
|
return nil if self.real_path.nil?
|
215
167
|
return nil unless File.directory?(self.real_path)
|
216
168
|
if self.class::SPECIFIC
|
217
|
-
|
218
|
-
return self.class
|
219
|
-
elsif File.exists?(File.join(self.real_path, self.class::DEFAULT_EXE)) || File.exists?(File.join(self.real_path, self.class::DEFAULT_SERVER_EXE))
|
220
|
-
return self.class
|
221
|
-
else
|
222
|
-
return nil
|
223
|
-
end
|
169
|
+
return self.any_exe? ? self.class : nil
|
224
170
|
end
|
225
171
|
game = nil
|
226
|
-
cond = nil
|
227
|
-
ed = nil
|
228
172
|
self.class::FAMILY.each_pair do |key, value|
|
229
173
|
found = false
|
230
174
|
# Find game
|
231
175
|
value[0].each do |e|
|
232
176
|
case e
|
233
|
-
when /\/$/
|
234
|
-
# folder
|
177
|
+
when /\/$/ # folder
|
235
178
|
found = File.directory?(File.join(self.real_path, e))
|
236
|
-
else
|
237
|
-
# file
|
179
|
+
else # file
|
238
180
|
case RUBY_PLATFORM
|
239
181
|
when /-mingw32$/, /-mswin32$/
|
240
182
|
else
|
@@ -249,26 +191,22 @@ class Appsetting < ActiveRecord::Base
|
|
249
191
|
game = key
|
250
192
|
|
251
193
|
# Find edition
|
252
|
-
found = nil
|
253
|
-
cond = true
|
254
|
-
ed = nil
|
194
|
+
ed, found, cond = nil, nil, true
|
255
195
|
value[1].each_pair do |edition, conditions|
|
256
196
|
ed = edition
|
257
197
|
conditions.each do |condition|
|
258
198
|
c = condition.clone
|
259
199
|
reverse = c.sub!(/^!/, "")
|
260
200
|
case c
|
261
|
-
when /\/$/
|
262
|
-
# folder
|
201
|
+
when /\/$/ # folder
|
263
202
|
found = File.directory?(File.join(self.real_path, c))
|
264
|
-
else
|
203
|
+
else # file
|
265
204
|
case RUBY_PLATFORM
|
266
205
|
when /-mingw32$/, /-mswin32$/
|
267
206
|
else
|
268
207
|
c = c.clone
|
269
208
|
c.sub!(/\.exe$/, "")
|
270
209
|
end
|
271
|
-
# file
|
272
210
|
found = File.exists?(File.join(self.real_path, c))
|
273
211
|
end
|
274
212
|
cond = reverse ? !found : found
|
@@ -280,34 +218,68 @@ class Appsetting < ActiveRecord::Base
|
|
280
218
|
end
|
281
219
|
|
282
220
|
return nil unless game
|
283
|
-
Object.const_get("#{game}Appsetting")
|
221
|
+
@det_ed = Object.const_get("#{game}Appsetting")
|
222
|
+
@det_ed
|
284
223
|
end
|
285
224
|
|
286
|
-
def
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
225
|
+
def allowance(signatures)
|
226
|
+
signatures = signatures.map{|e| e.downcase}
|
227
|
+
allowed, disallowed, garbage = [], [], []
|
228
|
+
path = self.real_path.gsub("\\", "/")
|
229
|
+
pbos = Dir[File.join(path, "**", "*.pbo")]
|
230
|
+
pbos.each do |p|
|
231
|
+
inter = p.sub("#{path}/", "")
|
232
|
+
unless inter =~ /\/(addons|dta)\//i || inter =~ /^common\//i || inter =~ /^(addons|dta)\//i
|
233
|
+
garbage << inter
|
234
|
+
next
|
235
|
+
end
|
236
|
+
if signatures.empty?
|
237
|
+
allowed << inter
|
238
|
+
next
|
239
|
+
end
|
240
|
+
sigs = Dir["#{p}*.bisign"]
|
241
|
+
found = false
|
242
|
+
sigs.each do |s|
|
243
|
+
sig = s.sub("#{p}.", "").sub(".bisign", "").downcase
|
244
|
+
if signatures.include?(sig)
|
245
|
+
found = true
|
246
|
+
allowed << inter
|
247
|
+
break
|
248
|
+
end
|
249
|
+
end
|
250
|
+
disallowed << inter unless found
|
251
|
+
end
|
252
|
+
[allowed, disallowed, garbage]
|
291
253
|
end
|
292
254
|
|
293
|
-
def
|
294
|
-
|
295
|
-
|
255
|
+
def process_name
|
256
|
+
ex = self.real_exe
|
257
|
+
return nil unless ex
|
258
|
+
File.basename(ex)
|
296
259
|
end
|
297
260
|
|
298
|
-
def
|
299
|
-
|
300
|
-
t ? t.label : nil
|
261
|
+
def processes
|
262
|
+
Six::Appmanager.find_process(process_name, self.real_path)
|
301
263
|
end
|
302
264
|
|
303
|
-
def
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
265
|
+
def read_logfile
|
266
|
+
Six::Appmanager.read_logfile logfile unless logfile.nil?
|
267
|
+
end
|
268
|
+
|
269
|
+
def kill!
|
270
|
+
Six::Appmanager.kill_by_name(process_name, self.real_path)
|
271
|
+
end
|
272
|
+
|
273
|
+
def rpt
|
274
|
+
process_name[/(.*)\./]
|
275
|
+
"#{$1}.rpt"
|
276
|
+
end
|
277
|
+
|
278
|
+
def logfile
|
279
|
+
if File.directory?(real_logpath)
|
280
|
+
File.join(real_logpath, rpt) if File.exists?(File.join(real_logpath, rpt))
|
281
|
+
else
|
282
|
+
nil
|
310
283
|
end
|
311
|
-
|
312
|
-
end
|
284
|
+
end
|
313
285
|
end
|
@@ -12,10 +12,5 @@ class Arma2OaAppsetting < Arma2Appsetting
|
|
12
12
|
REGKEYS = {"Arma2Oa" => ['SOFTWARE\\Bohemia Interactive Studio\\ArmA 2 OA', 'MAIN']}
|
13
13
|
|
14
14
|
FAMILY = Hash.new
|
15
|
-
FAMILY["Arma2Oa"] = [[
|
16
|
-
|
17
|
-
# def found_type
|
18
|
-
# return self.class unless self.real_path
|
19
|
-
# self.detect_edition
|
20
|
-
# end
|
15
|
+
FAMILY["Arma2Oa"] = [[DEFAULT_EXE, DEFAULT_SERVER_EXE, "#{DEFAULT_BETA_EXE_PATH}/#{DEFAULT_BETA_EXE}"], {"Arma2OaCo" => ["addons/"], "Arma2OaSt" => ["!addons/"]}]
|
21
16
|
end
|
@@ -6,9 +6,4 @@ class Arma2OaCoAppsetting < Arma2OaAppsetting
|
|
6
6
|
# Perhaps look at adding a boolean: specific, so when it is enabled, non of the inherited editions can be used?
|
7
7
|
# Since Arma2 standalone addons should work on OaCo, yet you would loose the specific 'arma2standalone only' option
|
8
8
|
|
9
|
-
=begin
|
10
|
-
def found_types
|
11
|
-
[Arma2OaCoAppsetting, Arma2OaAppsetting, Arma2StAppsetting, Arma2Appsetting]
|
12
|
-
end
|
13
|
-
=end
|
14
9
|
end
|
@@ -3,6 +3,6 @@ class Arma2OaStAppsetting < Arma2OaAppsetting
|
|
3
3
|
SPECIFIC = true
|
4
4
|
|
5
5
|
FAMILY = Hash.new
|
6
|
-
FAMILY["Arma2Oa"] = [[
|
6
|
+
FAMILY["Arma2Oa"] = [[DEFAULT_EXE, DEFAULT_SERVER_EXE, "#{DEFAULT_BETA_EXE_PATH}/#{DEFAULT_BETA_EXE}"], {"Arma2OaSt" => ["!addons/"]}]
|
7
7
|
#Code here
|
8
8
|
end
|
@@ -19,7 +19,7 @@ class Sixconfig < ActiveRecord::Base
|
|
19
19
|
m += srv.mods if srv
|
20
20
|
self.mods.each { |mod| m << mod unless m.include?(mod) }
|
21
21
|
if setting.beta
|
22
|
-
t = setting.
|
22
|
+
t = setting.edition
|
23
23
|
if t
|
24
24
|
t::DEFAULT_BETA_MODS.each do |mf|
|
25
25
|
mod = Mod.find_by_name(mf)
|
@@ -1,8 +1,7 @@
|
|
1
1
|
%table{ :border => 1, :cellpadding => "5", :width => "100%"}
|
2
2
|
%tr
|
3
3
|
%td
|
4
|
-
|
5
|
-
Edition: #{link_to t ? t : "ERROR: None detected", nil, :title => "Supports mods for: #{@current_setting.found_types.map{|e| e.label}.join(", ")}" }
|
4
|
+
Edition: #{link_to @current_setting.nice_edition, nil, :title => "Supports mods for: #{@current_setting.found_types.map{|e| e.label}.join(", ")}" }
|
6
5
|
%br
|
7
6
|
Last sync #{@system_setting.synchronized_at ? time_ago_in_words(@system_setting.synchronized_at) + " ago" : "never"}
|
8
7
|
Gamespy #{@system_setting.gamespied_at ? time_ago_in_words(@system_setting.gamespied_at) + " ago" : "never"}
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 22
|
8
|
-
-
|
9
|
-
version: 0.22.
|
8
|
+
- 4
|
9
|
+
version: 0.22.4
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Sickboy
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-07-
|
17
|
+
date: 2010-07-25 00:00:00 +02:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|