wonko_the_sane 0.1.2 → 0.1.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.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/bin/wonko_the_sane +12 -28
  3. data/data/sources.json +0 -5
  4. data/lib/wonko_the_sane.rb +6 -26
  5. data/lib/wonko_the_sane/input/base_input.rb +5 -10
  6. data/lib/wonko_the_sane/input/forge_installer_profile_input.rb +29 -47
  7. data/lib/wonko_the_sane/input/forgefiles_mods_input.rb +4 -7
  8. data/lib/wonko_the_sane/input/jenkins_input.rb +11 -15
  9. data/lib/wonko_the_sane/input/mojang_input.rb +52 -61
  10. data/lib/wonko_the_sane/{reader_writer.rb → new_format.rb} +31 -35
  11. data/lib/wonko_the_sane/old_format.rb +123 -0
  12. data/lib/wonko_the_sane/registry.rb +38 -23
  13. data/lib/wonko_the_sane/rules.rb +6 -6
  14. data/lib/wonko_the_sane/timestamps.rb +4 -4
  15. data/lib/wonko_the_sane/tools/update_nem.rb +20 -18
  16. data/lib/wonko_the_sane/util/configuration.rb +54 -2
  17. data/lib/wonko_the_sane/util/deep_storage_cache.rb +10 -8
  18. data/lib/wonko_the_sane/util/extraction_cache.rb +5 -4
  19. data/lib/wonko_the_sane/util/file_hash_cache.rb +6 -6
  20. data/lib/wonko_the_sane/util/http_cache.rb +50 -105
  21. data/lib/wonko_the_sane/util/maven_identifier.rb +8 -14
  22. data/lib/wonko_the_sane/util/task_stack.rb +7 -6
  23. data/lib/wonko_the_sane/{version_parser.rb → util/version_parser.rb} +10 -14
  24. data/lib/wonko_the_sane/version.rb +1 -1
  25. data/lib/wonko_the_sane/versionlists/base_version_list.rb +22 -15
  26. data/lib/wonko_the_sane/versionlists/curse_version_list.rb +15 -16
  27. data/lib/wonko_the_sane/versionlists/forge_version_list.rb +34 -37
  28. data/lib/wonko_the_sane/versionlists/forgefiles_mods_list.rb +3 -7
  29. data/lib/wonko_the_sane/versionlists/jenkins_version_list.rb +6 -15
  30. data/lib/wonko_the_sane/versionlists/liteloader_version_list.rb +18 -28
  31. data/lib/wonko_the_sane/versionlists/vanilla_legacy_version_list.rb +6 -6
  32. data/lib/wonko_the_sane/versionlists/vanilla_version_list.rb +6 -8
  33. data/lib/wonko_the_sane/wonko_version.rb +32 -12
  34. metadata +71 -15
  35. data/lib/wonko_the_sane/wonkoweb_uploader.rb +0 -162
@@ -1,36 +1,32 @@
1
- require 'hashie'
2
-
3
1
  module Reader
4
2
  def read_version_index(data)
5
- json = Hashie::Mash.new data
6
-
7
- index = VersionIndex.new json.uid
8
- index.name = json.name
9
- json.versions.each do |ver|
3
+ data = data.with_indifferent_access
4
+ index = VersionIndex.new data[:uid]
5
+ index.name = data[:name]
6
+ data[:versions].each do |ver|
10
7
  v = WonkoVersion.new
11
8
  v.is_complete = false
12
- v.uid = json.uid
9
+ v.uid = data[:uid]
13
10
  v.version = ver[:version]
14
11
  v.type = ver[:type]
15
12
  v.time = ver[:time]
16
13
  index.versions << v
17
14
  end
18
15
 
19
- return index
16
+ index
20
17
  end
21
18
 
22
19
  def read_download(data, key)
23
20
  if data[key.to_sym]
24
- data[key.to_sym].map do |dl|
25
- Download.from_json key, dl
26
- end
21
+ data[key.to_sym].map { |dl| Download.from_json key, dl }
27
22
  else
28
23
  []
29
24
  end
30
25
  end
31
26
 
32
- def read_resource(data, res)
33
- return if not data or not data.is_a? Object
27
+ def read_resource(data)
28
+ return if !data || !data.is_a?(Object)
29
+ res = WonkoVersion::Resources.new
34
30
  res.traits = data[:'general.traits'] if data[:'general.traits']
35
31
  res.folders = data[:'general.folders'] if data[:'general.folders']
36
32
  res.launchMethod = data[:'general.launcher'] if data[:'general.launcher']
@@ -38,6 +34,7 @@ module Reader
38
34
  res.downloads << read_download(data, 'general.downloads')
39
35
  res.downloads << read_download(data, 'java.libraries')
40
36
  res.downloads << read_download(data, 'java.natives')
37
+ res.downloads << read_download(data, 'mc.jarmods')
41
38
  res.downloads.flatten!
42
39
 
43
40
  res.mainClass = data[:'java.mainClass']
@@ -46,32 +43,31 @@ module Reader
46
43
  res.minecraftArguments = data[:'mc.arguments']
47
44
  res.tweakers = data[:'mc.tweakers']
48
45
  res.jarModTarget = data[:'mc.jarModTarget'] if data[:'mc.jarModTarget']
46
+ res
49
47
  end
50
48
 
51
49
  def read_version(data)
52
- json = Hashie::Mash.new data
50
+ data = data.with_indifferent_access
53
51
 
54
52
  file = WonkoVersion.new
55
53
  file.is_complete = true
56
54
 
57
- file.uid = json.uid
58
- file.version = json.version
59
- file.time = json.time
60
- file.type = json.type
61
- file.requires = json.requires.map do |req|
62
- Referenced.new(req[:uid], req[:version])
63
- end if json.requires
64
-
65
- json[:data].each do |data|
66
- rules = data[:rules] ? data[:rules] : [ImplicitRule.new(:allow)]
67
- if Rule.allowed_on_side rules, :client
68
- read_resource data, file.client
55
+ file.uid = data[:uid]
56
+ file.version = data[:version]
57
+ file.time = data[:time]
58
+ file.type = data[:type]
59
+ file.requires = data[:requires].map { |req| Referenced.new(req[:uid], req[:version]) } if data[:requires]
60
+
61
+ data[:data].each do |group|
62
+ rules = group[:rules] ? group[:rules] : [ImplicitRule.new(:allow)]
63
+ if Rule.allowed_on_side(rules, :client) && Rule.allowed_on_side(rules, :server)
64
+ file.common = read_resource group
69
65
  elsif Rule.allowed_on_side rules, :server
70
- read_resource data, file.server
66
+ file.server = read_resource group
71
67
  else
72
- read_resource data, file.common
68
+ file.client = read_resource group
73
69
  end
74
- end if json[:data]
70
+ end if data[:data]
75
71
 
76
72
  file
77
73
  end
@@ -84,7 +80,7 @@ end
84
80
  module Writer
85
81
  def write_version_index(index)
86
82
  json = {
87
- formatVersion: 0,
83
+ formatVersion: 10,
88
84
  uid: index.uid,
89
85
  name: index.name,
90
86
  versions: []
@@ -106,7 +102,7 @@ module Writer
106
102
  data[:'general.launcher'] = resource.launchMethod if resource.launchMethod
107
103
  data[:'general.folders'] = resource.folders if resource.folders and not resource.folders.empty?
108
104
  resource.downloads.each do |dl|
109
- data[dl.type] = [] if not data[dl.type]
105
+ data[dl.type] = [] unless data[dl.type]
110
106
  data[dl.type] << dl.to_json
111
107
  end
112
108
  data[:'java.mainClass'] = resource.mainClass if resource.mainClass and resource.mainClass != ''
@@ -117,8 +113,8 @@ module Writer
117
113
  data[:'mc.assets'] = resource.assets if resource.assets and resource.assets != ''
118
114
  data[:'mc.arguments'] = resource.minecraftArguments if resource.minecraftArguments and resource.minecraftArguments != ''
119
115
 
120
- if not data.empty?
121
- if side == :client or side == :server
116
+ unless data.empty?
117
+ if side == :client || side == :server
122
118
  data[:rules] = [
123
119
  ImplicitRule.new(:disallow).to_json,
124
120
  SidedRule.new(:allow, side).to_json
@@ -131,7 +127,7 @@ module Writer
131
127
  def write_version(version)
132
128
  # metadata
133
129
  json = {
134
- formatVersion: 0,
130
+ formatVersion: 10,
135
131
  uid: version.uid,
136
132
  version: version.version,
137
133
  time: version.time.to_s,
@@ -0,0 +1,123 @@
1
+ require 'time'
2
+
3
+ module OldFormatWriter
4
+ def write_version(version)
5
+ # metadata
6
+ json = {
7
+ formatVersion: 0,
8
+ uid: version.uid,
9
+ name: version.uid,
10
+ fileId: version.uid,
11
+ version: version.version,
12
+ time: Time.at(version.time).iso8601,
13
+ releaseTime: Time.at(version.time).iso8601,
14
+ type: version.type,
15
+ requires: [],
16
+ order: order_for(version.uid)
17
+ }
18
+ json[:requires] = version.requires.map do |req|
19
+ obj = { uid: req.uid }
20
+ obj[:version] = req.version if req.version
21
+ obj
22
+ end if version.requires and not version.requires.empty?
23
+ json[:id] = version.version if version.uid == 'net.minecraft'
24
+
25
+ resource = version.client
26
+
27
+ vanilla_req = version.requires.find { |r| r.uid == 'net.minecraft' }
28
+
29
+ json[:mainClass] = resource.mainClass if resource.mainClass && resource.mainClass != ''
30
+ json[:appletClass] = resource.appletClass if resource.appletClass && resource.appletClass != ''
31
+ json[:assets] = resource.assets if resource.assets && resource.assets != ''
32
+ json[:mcVersion] = vanilla_req.version if vanilla_req
33
+ json[:minecraftArguments] = resource.minecraftArguments
34
+
35
+ vanilla = Registry.instance.retrieve 'net.minecraft', json[:mcVersion] if json[:mcVersion]
36
+
37
+ json[:'+tweakers'] = resource.tweakers if resource.tweakers && !resource.tweakers.empty?
38
+
39
+ natives = {}
40
+ json[:'+libraries'] = resource.downloads
41
+ .select { |dl| dl.type == 'java.libraries' || dl.type == 'java.natives' }
42
+ .reject { |lib| lib.name.start_with? 'net.minecraft:minecraft:' }
43
+ .map do |lib|
44
+ result = { name: lib.name }
45
+ if lib.explicit_url?
46
+ result[:'MMC-absoluteUrl'] = lib.url
47
+ elsif !lib.url.nil? && lib.maven_base_url != 'https://libraries.minecraft.net/'
48
+ result[:url] = lib.url
49
+ end
50
+ result[:rules] = lib.rules.map { |r| r.to_json } unless lib.rules.nil?
51
+
52
+ if lib.name.include?('org.scala-lang') || lib.name.include?('com.typesafe')
53
+ result[:'MMC-hint'] = 'forge-pack-xz'
54
+ end
55
+
56
+ in_vanilla = if vanilla
57
+ vanilla.client.downloads
58
+ .select { |dl| dl.type == 'java.libraries' || dl.type == 'java.natives' }
59
+ .find { |dl| dl.name == lib.name }
60
+ end
61
+ if !in_vanilla.nil? && in_vanilla == lib
62
+ # it's already there, no need to add it
63
+ else
64
+ if in_vanilla.nil?
65
+ result[:insert] = 'append' unless version.uid == 'net.minecraft'
66
+ if %w(minecraftforge forge fml liteloader).include? lib.maven.artifact
67
+ result[:'MMC-depend'] = 'hard'
68
+ end
69
+ else
70
+ result[:insert] = 'replace'
71
+ end
72
+
73
+ [lib, result]
74
+ end
75
+ end.reject { |i| i.nil? }.map do |array|
76
+ lib = array[0]
77
+ result = array[1]
78
+ if lib.type == 'java.libraries'
79
+ result
80
+ else
81
+ # reconstruct insane natives
82
+ # mojang: you invented this fancy^Wweird rules system, and then you don't use it?
83
+ natives[lib.name] ||= {}
84
+ osrule = lib.rules[1]
85
+ if natives[lib.name].key? osrule.os
86
+ nil
87
+ else
88
+ natives[lib.name][osrule.os] = result
89
+ result[:url] = result[:url].sub /(32|64)/, '${arch}' if result[:url]
90
+ result[:'MMC-absoluteUrl'] = result[:'MMC-absoluteUrl'].sub /(32|64)/, '${arch}' if result[:'MMC-absoluteUrl']
91
+ result[:rules][1][:os].delete :arch
92
+ result
93
+ end
94
+ end
95
+ end.reject { |i| i.nil? }
96
+
97
+ json[:'+jarMods'] = resource.downloads.select { |dl| dl.type == 'mc.jarmods' }.map do |lib|
98
+ {}
99
+ end
100
+
101
+ json
102
+ end
103
+
104
+ def order_for(uid)
105
+ case uid
106
+ when 'net.minecraftforge'
107
+ 5
108
+ when 'com.mumfrey.liteloader'
109
+ 10
110
+ when 'net.minecraft'
111
+ -2
112
+ when 'org.lwjgl'
113
+ -1
114
+ else
115
+ 0
116
+ end
117
+ end
118
+ end
119
+
120
+ class OldFormat
121
+ include OldFormatWriter
122
+ end
123
+ $old_format = OldFormat.new
@@ -1,3 +1,5 @@
1
+ require 'fileutils'
2
+
1
3
  class Registry
2
4
  def version_index(uid)
3
5
  return VersionIndex.new uid unless File.exists? VersionIndex.local_filename uid
@@ -6,49 +8,62 @@ class Registry
6
8
 
7
9
  def store_version_index(index)
8
10
  File.write index.local_filename, JSON.pretty_generate($rw.write_version_index index)
9
- WonkoTheSane.wonkoweb_uploader.file_changed index.uid
11
+ FileUtils.copy index.local_filename, "#{Registry.out_dir}/#{index.uid}.json" unless Registry.out_dir.blank?
10
12
  end
11
13
 
12
14
  def index
13
- return { index: [] } unless File.exists? 'files/index.json'
15
+ return {index: []} unless File.exists? 'files/index.json'
14
16
  $rw.read_index JSON.parse File.read 'files/index.json'
15
17
  end
16
18
 
17
19
  def store(version)
18
20
  if version.is_a? Array
19
- version.each do |f| store(f) end
21
+ version.each do |f|
22
+ store(f)
23
+ end
20
24
  else
21
- BaseSanitizer.sanitize(version, DownloadsFixer).each do |version|
22
- Dir.mkdir 'files/' + version.uid unless Dir.exist? 'files/' + version.uid
23
- File.write version.local_filename, JSON.pretty_generate($rw.write_version version)
24
- WonkoTheSane.wonkoweb_uploader.version_changed version.uid, version.version
25
-
26
- vindex = version_index version.uid
27
- vindex.add_version version
28
- store_version_index vindex
29
-
30
- ind = index
31
- next if ind[:index].find { |i| version.uid == i[:uid] } # early exit if the uid already exists in the index
32
- ind[:formatVersion] = 0
33
- ind[:index] << { uid: version.uid }
34
- File.write 'files/index.json', JSON.pretty_generate($rw.write_index ind)
25
+ BaseSanitizer.sanitize(version, DownloadsFixer).each do |ver|
26
+ begin
27
+ Dir.mkdir 'files/' + ver.uid unless Dir.exist? 'files/' + ver.uid
28
+ File.write ver.local_filename + '.new', JSON.pretty_generate($rw.write_version ver)
29
+ File.write ver.local_filename, JSON.pretty_generate($old_format.write_version ver)
30
+ unless Registry.out_dir.blank?
31
+ FileUtils.copy ver.local_filename + '.new', "#{Registry.out_dir}/#{ver.uid}-#{ver.version}.new.json"
32
+ FileUtils.copy ver.local_filename, "#{Registry.out_dir}/#{ver.uid}-#{ver.version}.json"
33
+ end
34
+
35
+ vindex = version_index ver.uid
36
+ vindex.add_version ver
37
+ store_version_index vindex
38
+
39
+ ind = index
40
+ next if ind[:index].find { |i| ver.uid == i[:uid] } # early exit if the uid already exists in the index
41
+ ind[:formatVersion] = 0
42
+ ind[:index] << {uid: ver.uid}
43
+ File.write 'files/index.json', JSON.pretty_generate($rw.write_index ind)
44
+ rescue Exception => e
45
+ Logging.logger[ver.uid].error 'Unable to store: ' + ver.version
46
+ raise e
47
+ end
35
48
  end
36
49
  end
37
- rescue Exception => e
38
- Logging.logger[version.uid].error 'Unable to store: ' + version.version
39
- raise e
40
50
  end
41
51
 
42
52
  def retrieve(id, version)
43
53
  if File.exist? WonkoVersion.local_filename(id, version)
44
- $rw.read_version JSON.parse File.read(WonkoVersion.local_filename id, version)
54
+ $rw.read_version JSON.parse File.read(WonkoVersion.local_filename(id, version) + '.new')
45
55
  else
46
56
  nil
47
57
  end
48
58
  end
49
59
 
50
60
  def self.instance
51
- Dir.mkdir 'files' unless Dir.exist? 'files'
52
- @@instance ||= Registry.new
61
+ FileUtils.mkdir_p 'files' unless Dir.exist? 'files'
62
+ FileUtils.mkdir_p out_dir unless out_dir.blank? || Dir.exists?(out_dir)
63
+ @instance ||= Registry.new
64
+ end
65
+
66
+ def self.out_dir
67
+ WonkoTheSane.configuration.out_dir
53
68
  end
54
69
  end
@@ -11,21 +11,21 @@ class Rule
11
11
 
12
12
  def self.allowed_on_side(rules, side)
13
13
  allowed = :allow
14
- rules.each do |rule|
14
+ rules.map { |r| r.is_a?(Rule) ? r : Rule.from_json(r) }.each do |rule|
15
15
  if rule.is_a? ImplicitRule
16
16
  allowed = rule.action
17
17
  elsif rule.is_a? SidedRule
18
- allowed = rule.action if rule.side = side
18
+ allowed = rule.action if rule.side == side
19
19
  end
20
20
  end
21
- return allowed
21
+ allowed == :allow
22
22
  end
23
23
 
24
24
  def self.from_json(obj)
25
25
  if obj.key? :os
26
26
  return OsRule.new obj[:action].to_sym, obj[:os][:name], obj[:os][:version], obj[:os][:arch]
27
27
  elsif obj.key? :side
28
- return SidedRule.new obj[:action].to_sym, obj[:side]
28
+ return SidedRule.new obj[:action].to_sym, obj[:side].to_sym
29
29
  else
30
30
  return ImplicitRule.new obj[:action].to_sym
31
31
  end
@@ -50,7 +50,7 @@ class OsRule < Rule
50
50
  obj[:os] = { name: @os }
51
51
  obj[:os][:version] = @os_version if @os_version
52
52
  obj[:os][:arch] = @os_arch if @os_arch
53
- return obj
53
+ obj
54
54
  end
55
55
  end
56
56
  class SidedRule < Rule
@@ -64,6 +64,6 @@ class SidedRule < Rule
64
64
  def to_json
65
65
  obj = super
66
66
  obj[:side] = @side
67
- return obj
67
+ obj
68
68
  end
69
69
  end
@@ -4,8 +4,8 @@ class Timestamps
4
4
  end
5
5
 
6
6
  def get(uid, version, default = nil)
7
- if @json[uid.to_sym] and @json[uid.to_sym][version.to_sym.to_sym]
8
- return @json[uid.to_sym][version.to_sym]
7
+ if @json[uid.to_sym] && @json[uid.to_sym][version.to_sym]
8
+ @json[uid.to_sym][version.to_sym]
9
9
  elsif default.nil?
10
10
  raise 'No timestamp available for ' + uid + ': ' + version
11
11
  elsif default.is_a? String
@@ -24,7 +24,7 @@ class Timestamps
24
24
  end
25
25
 
26
26
  def self.get(uid, version, default = nil)
27
- @@me ||= Timestamps.new
28
- @@me.get uid, version, default
27
+ @me ||= Timestamps.new
28
+ @me.get uid, version, default
29
29
  end
30
30
  end
@@ -1,31 +1,31 @@
1
1
  def get_curse_id(name)
2
2
  data = HTTPCache.get('http://minecraft.curseforge.com/mc-mods/' + name).gsub /[\n\r]/, ''
3
3
  match = data.match /<li class="view-on?-cur?se"> *<a href="http:\/\/curse.com\/project\/(\d*)">/
4
- return match[1]
4
+ match[1]
5
5
  end
6
6
 
7
7
  def update_nem
8
- forgefilesCleaned = {
8
+ self.forgefiles_cleaned = {
9
9
  IronChests: :IronChests2
10
10
  }
11
11
 
12
12
  sources = WonkoTheSane.data_json 'sources.json'
13
- sources[:forgefiles] = {} if not sources[:forgefiles]
14
- sources[:jenkins] = [] if not sources[:jenkins]
15
- sources[:curse] = [] if not sources[:curse]
13
+ sources[:forgefiles] = {} unless sources[:forgefiles]
14
+ sources[:jenkins] = [] unless sources[:jenkins]
15
+ sources[:curse] = [] unless sources[:curse]
16
16
 
17
- nemList = JSON.parse HTTPCache.get('https://raw.githubusercontent.com/SinZ163/NotEnoughMods/master/NEMP/mods.json'), symbolize_names: true
18
- nemList.each do |key, value|
17
+ nem_list = JSON.parse HTTPCache.get('https://raw.githubusercontent.com/SinZ163/NotEnoughMods/master/NEMP/mods.json'), symbolize_names: true
18
+ nem_list.each do |key, value|
19
19
  name = (value[:name] ? value[:name] : key).to_sym
20
20
  case value[:function]
21
21
  when 'CheckMCForge2'
22
- if forgefilesCleaned[name]
23
- name = forgefilesCleaned[name]
22
+ if self.forgefiles_cleaned[name]
23
+ name = self.forgefiles_cleaned[name]
24
24
  end
25
25
  if not sources[:forgefiles].find do |artifact, urlId| urlId == name.to_s end and not [:MinecraftForge, :FML, :Cauldron].include? name
26
26
  print "Please enter an uid for the #{"forgefiles".cyan} artifact #{name.to_s.green}: "
27
27
  uid = gets.chomp
28
- if not uid.empty?
28
+ unless uid.empty?
29
29
  sources[:forgefiles][uid.to_sym] = name.to_s
30
30
  end
31
31
  end
@@ -42,14 +42,14 @@ def update_nem
42
42
  when 'CheckChickenBones'
43
43
  # TODO
44
44
  when 'CheckCurse'
45
- curseId = value[:curse][:id] ? value[:curse][:id] : get_curse_id(value[:curse][:name] ? value[:curse][:name] : name.to_s.downcase)
46
- if not sources[:curse].find do |obj| obj[:id] == curseId end
47
- print "Please enter an uid for the #{"curse".cyan} artifact #{name.to_s.green} (id: #{curseId.yellow}): "
45
+ curse_id = value[:curse][:id] ? value[:curse][:id] : get_curse_id(value[:curse][:name] ? value[:curse][:name] : name.to_s.downcase)
46
+ if sources[:curse].find { |obj| obj[:id] == curse_id }.nil?
47
+ print "Please enter an uid for the #{'curse'.cyan} artifact #{name.to_s.green} (id: #{curse_id.yellow}): "
48
48
  uid = gets.chomp
49
- if not uid.empty?
49
+ unless uid.empty?
50
50
  sources[:curse] << {
51
51
  uid: uid,
52
- id: curseId,
52
+ id: curse_id,
53
53
  fileregex: value[:curse][:regex]
54
54
  }
55
55
  end
@@ -61,11 +61,11 @@ def update_nem
61
61
  when 'CheckHTML'
62
62
  # TODO
63
63
  when 'CheckJenkins'
64
- parts = value[:jenkins][:url].match(/^(.*)\/job\/([^\/]*)\//)
65
- if not sources[:jenkins].find do |obj| obj[:url] == parts[1] and obj[:artifact] == parts[2] end
64
+ parts = value[:jenkins][:url].match /^(.*)\/job\/([^\/]*)\//
65
+ if sources[:jenkins].find { |obj| obj[:url] == parts[1] && obj[:artifact] == parts[2] }.nil?
66
66
  print "Please enter an uid for the #{"jenkins".cyan} artifact #{name.to_s.green} from #{parts[1].yellow} (#{parts[2].red}): "
67
67
  uid = gets.chomp
68
- if not uid.empty?
68
+ unless uid.empty?
69
69
  sources[:jenkins] << {
70
70
  uid: uid,
71
71
  url: parts[1],
@@ -77,6 +77,8 @@ def update_nem
77
77
  # TODO
78
78
  when 'CheckSpacechase'
79
79
  # TODO
80
+ else
81
+ print 'Unknown checker function: ' + value[:function]
80
82
  end
81
83
 
82
84
  # keep the writing in the loop so we don't lose progress in case of crashes or similar