minecraft 0.2.1 → 0.3.0
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/CHANGES.md +15 -0
- data/README.md +12 -0
- data/bin/minecraft +1 -0
- data/lib/minecraft/commands.rb +440 -107
- data/lib/minecraft/data.rb +7 -1
- data/lib/minecraft/extensions.rb +163 -55
- data/lib/minecraft/server.rb +2 -0
- data/lib/minecraft/tools.rb +9 -0
- data/lib/minecraft/version.rb +1 -1
- data/test/commands_test.rb +253 -12
- data/test/extensions_test.rb +48 -0
- data/test/helper.rb +4 -1
- metadata +2 -2
data/lib/minecraft/data.rb
CHANGED
@@ -9,7 +9,13 @@ module Minecraft
|
|
9
9
|
:ranged => [261, [262, 320]],
|
10
10
|
:nether => [261, [262, 320], [89, 128], 278, 276],
|
11
11
|
:portal => [[49, 14], 259],
|
12
|
-
:redstone => [[331, 256], [356, 64], [69,
|
12
|
+
:redstone => [[331, 256], [356, 64], [69, 6], [77, 6], [70, 6], [76, 64], [29, 24], [4, 64]],
|
13
|
+
:circuits => [[331, 256], [356, 64], [76, 64], [4, 64]],
|
14
|
+
:cannon => [[356, 5], [331, 18], [76, 2], [4, 64], [46, 14], 77, [8, 2]],
|
15
|
+
:blacksmith => [61, [263, 16], [264, 3], [265, 32], [266, 16]],
|
16
|
+
:miner => [278, [50, 64], 277, [65, 64]],
|
17
|
+
:farmer => [293, [295, 128], 277],
|
18
|
+
:chef => [[297, 3], [296, 192], [320, 3], 357, [353, 64], 354, [350, 2]]
|
13
19
|
}
|
14
20
|
|
15
21
|
# Values for time, 0 to 24000. 0 is dawn, 12000 is dusk.
|
data/lib/minecraft/extensions.rb
CHANGED
@@ -3,6 +3,7 @@ module Minecraft
|
|
3
3
|
# manage custom functionality additional to default Notchian Minecraft
|
4
4
|
# behaviour.
|
5
5
|
class Extensions
|
6
|
+
attr_accessor :welcome_message
|
6
7
|
include Commands
|
7
8
|
|
8
9
|
# New Extensions instance.
|
@@ -17,6 +18,9 @@ module Minecraft
|
|
17
18
|
get_json :shortcuts
|
18
19
|
get_json :userlog
|
19
20
|
get_json :userpoints
|
21
|
+
get_json :userdnd, []
|
22
|
+
get_json :memos
|
23
|
+
get_json :todo_items, []
|
20
24
|
@users = []
|
21
25
|
@counter = 0
|
22
26
|
@logon_time = {}
|
@@ -30,40 +34,58 @@ module Minecraft
|
|
30
34
|
@vote_threshold ||= 5
|
31
35
|
@rules ||= "No rules specified."
|
32
36
|
|
33
|
-
#
|
37
|
+
# Initialize the set of commands.
|
34
38
|
@commands = {}
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
39
|
+
commands = Minecraft::Commands.public_instance_methods
|
40
|
+
@command_info = File.read(method(commands.first).source_location.first).split("\n")
|
41
|
+
@enums = [ :ops ]
|
42
|
+
commands.each do |sym|
|
43
|
+
next if sym.to_s.end_with? "all"
|
44
|
+
meth = method(sym)
|
45
|
+
src_b, src_e = get_comment_range(meth.source_location.last)
|
46
|
+
|
47
|
+
@commands[sym] = {
|
48
|
+
:help => "",
|
49
|
+
:ops => :none,
|
50
|
+
:params => meth.parameters
|
51
|
+
}
|
52
|
+
parse_comments(src_b, src_e, sym)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Parses the comments for a given command method between the two given line
|
57
|
+
# numbers. Places the results in the commands instance hash.
|
58
|
+
#
|
59
|
+
# @param [Integer] src_b Beginning comment line.
|
60
|
+
# @param [Integer] src_e Ending comment line.
|
61
|
+
# @param [Symbol] sym Method symbol.
|
62
|
+
# @example
|
63
|
+
# parse_comments(6, 13, :disco)
|
64
|
+
def parse_comments(src_b, src_e, sym)
|
65
|
+
help_done = false
|
66
|
+
(src_b..src_e).each do |n|
|
67
|
+
line = @command_info[n].strip[2..-1]
|
68
|
+
if line.nil?
|
69
|
+
help_done = true
|
70
|
+
next
|
71
|
+
elsif !help_done
|
72
|
+
@commands[sym][:help] += " " unless @commands[sym][:help].empty?
|
73
|
+
@commands[sym][:help] += line
|
74
|
+
end
|
75
|
+
|
76
|
+
if line.index("@note") == 0
|
77
|
+
key, value = line[6..-1].split(": ")
|
78
|
+
@commands[sym][key.to_sym] = @enums.include?(key.to_sym) ? value.to_sym : value
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# Gets the line number bounds for the comments corresponding with a method
|
84
|
+
# on a given line number.
|
85
|
+
def get_comment_range(line_number)
|
86
|
+
src_e = line_number - 2
|
87
|
+
src_b = (0..src_e - 1).to_a.reverse.detect(src_e - 1) { |n| not @command_info[n] =~ /^\s+#/ } + 1
|
88
|
+
[src_b, src_e]
|
67
89
|
end
|
68
90
|
|
69
91
|
# Sets an instance variable with it's corresponding data file or a blank hash.
|
@@ -77,12 +99,15 @@ module Minecraft
|
|
77
99
|
instance_variable_set("@#{var}", t)
|
78
100
|
end
|
79
101
|
|
80
|
-
# Save
|
102
|
+
# Save instance variables to their respective JSON files.
|
81
103
|
def save
|
82
104
|
save_file :timers
|
83
105
|
save_file :shortcuts
|
84
106
|
save_file :hops
|
85
107
|
save_file :userpoints
|
108
|
+
save_file :userdnd
|
109
|
+
save_file :memos
|
110
|
+
save_file :todo_items
|
86
111
|
end
|
87
112
|
|
88
113
|
# Save an instance hash to it's associated data file.
|
@@ -127,39 +152,77 @@ module Minecraft
|
|
127
152
|
end
|
128
153
|
|
129
154
|
is_all = @commands[root][:all] if is_all
|
155
|
+
rest_param = @commands[root][:params].count { |a| a.first == :rest }
|
156
|
+
reg_params = @commands[root][:params].count { |a| a.last != :user }
|
157
|
+
|
158
|
+
# Remove excess parameters.
|
159
|
+
args = args[0...reg_params] if args.length > reg_params and rest_param == 0
|
160
|
+
|
161
|
+
args = [user] + args unless @commands[root][:params].length == 0
|
130
162
|
if is_all
|
131
|
-
@server.puts "say #{user} #{@commands[root][:
|
163
|
+
@server.puts "say #{user} #{@commands[root][:all]}"
|
132
164
|
if respond_to? command
|
133
|
-
send(command,
|
165
|
+
send(command, *args)
|
134
166
|
else
|
135
|
-
@users.each { |u| send(root, u, *args) }
|
167
|
+
@users.each { |u| send(root, u, *args[1..-1]) unless @userdnd.include? u.downcase }
|
136
168
|
end
|
137
169
|
else
|
138
|
-
send(root,
|
170
|
+
send(root, *args)
|
139
171
|
end
|
172
|
+
rescue Exception => e
|
173
|
+
validate_command_entry(rest_param, reg_params, user, command, *args)
|
174
|
+
$stderr.puts "An error has occurred during a call command operation.\n#{e}"
|
175
|
+
$stderr.puts e.backtrace
|
140
176
|
end
|
141
177
|
|
142
|
-
#
|
178
|
+
# After an exception is caught this method should be called to find and
|
179
|
+
# print errors with the arguments specified to the command.
|
143
180
|
#
|
144
|
-
# @param [
|
145
|
-
# @
|
146
|
-
#
|
147
|
-
# @
|
148
|
-
#
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
181
|
+
# @param [String] user The requesting user.
|
182
|
+
# @param [String] command The requested command.
|
183
|
+
# @param args Arguments for the command.
|
184
|
+
# @example
|
185
|
+
# call_command("basicxman", "give")
|
186
|
+
def validate_command_entry(rest_param, reg_params, user, command, *args)
|
187
|
+
args.slice! 0 if args.first == user
|
188
|
+
params = @commands[command.to_sym][:params][1..-1].map { |a| [a[0], a[1].to_s.gsub("_", " ")] }
|
189
|
+
return unless args.length < reg_params
|
190
|
+
|
191
|
+
return @server.puts "say Expected at least one argument." if rest_param == 1
|
192
|
+
req_params = params.count { |a| a.first == :req }
|
193
|
+
if args.length < req_params
|
194
|
+
args.length.times { params.slice! 0 }
|
195
|
+
if params.length == 1
|
196
|
+
return @server.puts "say Expected the argument '#{params[0][1]}'"
|
197
|
+
else
|
198
|
+
temp = params.map { |a| "'#{a[1]}'" }
|
199
|
+
return @server.pust "say Expected additional arguments, #{temp.join(", ")}"
|
200
|
+
end
|
201
|
+
end
|
153
202
|
end
|
154
203
|
|
155
204
|
# Processes a line from the console.
|
156
205
|
def process(line)
|
157
|
-
puts line
|
206
|
+
puts colour(line.dup)
|
158
207
|
return info_command(line) if line.index "INFO"
|
159
208
|
rescue Exception => e
|
160
|
-
puts "An error has occurred
|
161
|
-
puts e
|
162
|
-
|
209
|
+
$stderr.puts "An error has occurred during line processing.\n#{e}"
|
210
|
+
$stderr.puts e.backtrace
|
211
|
+
end
|
212
|
+
|
213
|
+
# Colours a server side line
|
214
|
+
def colour(line)
|
215
|
+
return line if @no_colour
|
216
|
+
line.gsub!(/^([0-9\-]{10}\s[0-9:]{8})/) { |m| "\033[0;37m#{$1}\033[0m" }
|
217
|
+
if line.index "lost connection" or line.index "logged in"
|
218
|
+
line.gsub!(/(\[INFO\]\s)(.*)/) { |m| "#{$1}\033[1;30m#{$2}\033[0m" }
|
219
|
+
elsif line.index "[INFO] CONSOLE:"
|
220
|
+
line.gsub!("CONSOLE:", "\033[1;36mCONSOLE:\033[0m")
|
221
|
+
else
|
222
|
+
line.gsub!(/(\[INFO\]\s+\<)(.*?)(\>)/) { |m| "#{$1}\033[1;34m#{$2}\033[0m#{$3}" }
|
223
|
+
line.gsub!(/(\>\s+)(!.*?)$/) { |m| "#{$1}\033[1;33m#{$2}\033[0m" }
|
224
|
+
end
|
225
|
+
return line
|
163
226
|
end
|
164
227
|
|
165
228
|
# Checks if the server needs to be saved and prints the save-all command if
|
@@ -183,7 +246,21 @@ module Minecraft
|
|
183
246
|
def periodic
|
184
247
|
@counter += 1
|
185
248
|
check_save
|
186
|
-
|
249
|
+
if @disco
|
250
|
+
if @counter % 2 == 0
|
251
|
+
@server.puts "time set 0"
|
252
|
+
else
|
253
|
+
@server.puts "time set 16000"
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
if @counter % 10 == 0
|
258
|
+
expire_kickvotes
|
259
|
+
if @time_change and @time_change != 0
|
260
|
+
@server.puts "time add #{@time_change}"
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
187
264
|
@users.each do |user|
|
188
265
|
next unless @timers.has_key? user
|
189
266
|
@timers[user].each do |item, duration|
|
@@ -193,6 +270,20 @@ module Minecraft
|
|
193
270
|
end
|
194
271
|
end
|
195
272
|
|
273
|
+
# Checks the available memos for a uesr who has just logged in, prints any
|
274
|
+
# that are found.
|
275
|
+
#
|
276
|
+
# @param [String] user The user to check.
|
277
|
+
# @example
|
278
|
+
# check_memos("mike_n_7")
|
279
|
+
def check_memos(user)
|
280
|
+
user = user.downcase
|
281
|
+
return unless @memos.has_key? user
|
282
|
+
|
283
|
+
@memos[user].each { |m| say("Message from: #{m.first} - #{m.last}") }
|
284
|
+
@memos[user] = []
|
285
|
+
end
|
286
|
+
|
196
287
|
# Removes the meta data (timestamp, INFO) from the line and then executes a
|
197
288
|
# series of checks on the line. Grabs the user and command from the line
|
198
289
|
# and then calls the call_command method.
|
@@ -201,6 +292,10 @@ module Minecraft
|
|
201
292
|
def info_command(line)
|
202
293
|
line.gsub! /^.*?\[INFO\]\s+/, ''
|
203
294
|
return if meta_check(line)
|
295
|
+
|
296
|
+
# :foo should use the shortcut 'foo'.
|
297
|
+
line.gsub!(/^(\<.*?\>\s+):/) { |m| "#{$1}!s " }
|
298
|
+
|
204
299
|
match_data = line.match /^\<(.*?)\>\s+!(.*?)$/
|
205
300
|
return if match_data.nil?
|
206
301
|
|
@@ -259,6 +354,7 @@ module Minecraft
|
|
259
354
|
elsif line.index "logged in"
|
260
355
|
@users << user
|
261
356
|
display_welcome_message(user)
|
357
|
+
check_memos(user)
|
262
358
|
@logon_time[user] = Time.now
|
263
359
|
return true
|
264
360
|
end
|
@@ -267,7 +363,6 @@ module Minecraft
|
|
267
363
|
# If a command method is called and is not specified, take in the arguments
|
268
364
|
# here and attempt to !give the player the item. Otherwise print an error.
|
269
365
|
def method_missing(sym, *args)
|
270
|
-
return if change_time(sym)
|
271
366
|
item, quantity = items_arg(1, [sym.to_s.downcase, args.last])
|
272
367
|
item = resolve_item(item)
|
273
368
|
if item and is_op? args.first
|
@@ -303,6 +398,19 @@ module Minecraft
|
|
303
398
|
Time.now - (@logon_time[user] || 0)
|
304
399
|
end
|
305
400
|
|
401
|
+
# Executes the say command with proper formatting (i.e. wrapping at sixty
|
402
|
+
# characters).
|
403
|
+
#
|
404
|
+
# @param [String] message The message to print properly.
|
405
|
+
# @example
|
406
|
+
# say("The quick brown fox jumped over the lazy dog.")
|
407
|
+
def say(message)
|
408
|
+
(message.length / 50.0).ceil.times do |n|
|
409
|
+
temp = message[(50 * n), 50]
|
410
|
+
@server.puts "say #{temp}"
|
411
|
+
end
|
412
|
+
end
|
413
|
+
|
306
414
|
# Check if a user has op privileges.
|
307
415
|
#
|
308
416
|
# @param [String] user The specified user.
|
@@ -356,7 +464,7 @@ module Minecraft
|
|
356
464
|
|
357
465
|
# Display a welcome message to a recently connected user.
|
358
466
|
def display_welcome_message(user)
|
359
|
-
|
467
|
+
say("#{@welcome_message.gsub('%', user)}") unless @welcome_message.nil?
|
360
468
|
end
|
361
469
|
end
|
362
470
|
end
|
data/lib/minecraft/server.rb
CHANGED
@@ -36,6 +36,8 @@ module Minecraft
|
|
36
36
|
# Server is stopped gracefully.
|
37
37
|
def minecraft_exit
|
38
38
|
puts "[+] Restoring previous mob state to #{Minecraft::Tools.toggle_mobs}." if @opts[:tempmobs]
|
39
|
+
puts "[~] The current welcome message is:"
|
40
|
+
puts @extensions.welcome_message
|
39
41
|
puts "\n[+] Saving..."
|
40
42
|
@extensions.save
|
41
43
|
@threads.each(&:kill)
|
data/lib/minecraft/tools.rb
CHANGED
@@ -40,6 +40,9 @@ module Minecraft
|
|
40
40
|
return new_state
|
41
41
|
end
|
42
42
|
|
43
|
+
# Grabs the extension configuration file and parses it.
|
44
|
+
#
|
45
|
+
# @return [Hash] Configuration hash.
|
43
46
|
def self.get_configuration_file
|
44
47
|
return {} unless File.exists? "minecraft.properties"
|
45
48
|
File.readlines("minecraft.properties").map { |l| l.split(" ") }.inject({}) do |hash, (key, *value)|
|
@@ -47,6 +50,12 @@ module Minecraft
|
|
47
50
|
end
|
48
51
|
end
|
49
52
|
|
53
|
+
# Parses a value (or set of) from a configuration file.
|
54
|
+
#
|
55
|
+
# @param [String] An array of values.
|
56
|
+
# @return [String] The string value joined together.
|
57
|
+
# @return [Boolean] Will return a boolean true if the value is blank (meant
|
58
|
+
# to be a boolean configuration flag).
|
50
59
|
def self.config_value(value)
|
51
60
|
return true if value.nil? or value.length == 0
|
52
61
|
return value.join(" ")
|
data/lib/minecraft/version.rb
CHANGED
data/test/commands_test.rb
CHANGED
@@ -88,11 +88,11 @@ eof
|
|
88
88
|
@ext.ops = ["basicxman"]
|
89
89
|
@ext.hops = ["mike_n_7"]
|
90
90
|
@ext.call_command("basicxman", "points", "Ian_zers", "1001")
|
91
|
-
assert_equal 1000, @ext.userpoints["
|
91
|
+
assert_equal 1000, @ext.userpoints["ian_zers"]
|
92
92
|
@ext.call_command("mike_n_7", "points", "Ian_zers", "501")
|
93
|
-
assert_equal 1500, @ext.userpoints["
|
93
|
+
assert_equal 1500, @ext.userpoints["ian_zers"]
|
94
94
|
@ext.call_command("blizzard4U", "points", "Ian_zers", "2")
|
95
|
-
assert_equal 1501, @ext.userpoints["
|
95
|
+
assert_equal 1501, @ext.userpoints["ian_zers"]
|
96
96
|
end
|
97
97
|
|
98
98
|
sandbox_test "should not a let a user give herself points" do
|
@@ -175,6 +175,28 @@ eof
|
|
175
175
|
assert_match "kick Ian_zers", @ext.server.string
|
176
176
|
end
|
177
177
|
|
178
|
+
# Timer test.
|
179
|
+
sandbox_test "should not add a timer if the item does not exist" do
|
180
|
+
@ext = Minecraft::Extensions.new(StringIO.new, {})
|
181
|
+
@ext.hops = ["basicxman"]
|
182
|
+
@ext.call_command("basicxman", "addtimer", "foo")
|
183
|
+
assert_nil @ext.timers["basicxman"]
|
184
|
+
assert_match "not added", @ext.server.string
|
185
|
+
end
|
186
|
+
|
187
|
+
# Stop timer test.
|
188
|
+
sandbox_test "should stop all timers" do
|
189
|
+
@ext = Minecraft::Extensions.new(StringIO.new, {})
|
190
|
+
@ext.users = ["basicxman"]
|
191
|
+
@ext.hops = ["basicxman"]
|
192
|
+
@ext.call_command("basicxman", "addtimer", "cobblestone")
|
193
|
+
@ext.call_command("basicxman", "addtimer", "arrow")
|
194
|
+
@ext.server.string = ""
|
195
|
+
@ext.call_command("basicxman", "stop")
|
196
|
+
assert_nil @ext.timers["basicxman"]
|
197
|
+
assert_match "stopped", @ext.server.string
|
198
|
+
end
|
199
|
+
|
178
200
|
# Time commands.
|
179
201
|
sandbox_test "should change time with time commands" do
|
180
202
|
@ext = Minecraft::Extensions.new(StringIO.new, {})
|
@@ -203,9 +225,10 @@ eof
|
|
203
225
|
@ext = Minecraft::Extensions.new(StringIO.new, {})
|
204
226
|
@ext.users = ["blizzard4U"]
|
205
227
|
@ext.call_command("blizzard4U", "help")
|
206
|
-
|
207
|
-
assert_match "
|
208
|
-
|
228
|
+
t = @ext.server.string.gsub("\n", "").gsub("say", "").gsub(" ", "")
|
229
|
+
assert_match "rules", t
|
230
|
+
assert_match "list", t
|
231
|
+
refute_match "give", t
|
209
232
|
end
|
210
233
|
|
211
234
|
sandbox_test "should display help contents for half ops" do
|
@@ -213,9 +236,10 @@ eof
|
|
213
236
|
@ext.users = ["mike_n_7"]
|
214
237
|
@ext.hops = ["mike_n_7"]
|
215
238
|
@ext.call_command("mike_n_7", "help")
|
216
|
-
|
217
|
-
assert_match "
|
218
|
-
|
239
|
+
t = @ext.server.string.gsub("\n", "").gsub("say", "").gsub(" ", "")
|
240
|
+
assert_match "rules", t
|
241
|
+
assert_match "give", t
|
242
|
+
refute_match "morning", t
|
219
243
|
end
|
220
244
|
|
221
245
|
sandbox_test "should display help contents for ops" do
|
@@ -223,8 +247,225 @@ eof
|
|
223
247
|
@ext.users = ["basicxman"]
|
224
248
|
@ext.ops = ["basicxman"]
|
225
249
|
@ext.call_command("basicxman", "help")
|
226
|
-
|
227
|
-
assert_match "
|
228
|
-
assert_match "
|
250
|
+
t = @ext.server.string.gsub("\n", "").gsub("say", "").gsub(" ", "")
|
251
|
+
assert_match "rules", t
|
252
|
+
assert_match "give", t
|
253
|
+
assert_match "morning", t
|
254
|
+
end
|
255
|
+
|
256
|
+
sandbox_test "should display help contents for a specific command" do
|
257
|
+
@ext = Minecraft::Extensions.new(StringIO.new, {})
|
258
|
+
@ext.users = ["basicxman"]
|
259
|
+
@ext.call_command("basicxman", "help", "hop")
|
260
|
+
assert_match "privileges to the target user", @ext.server.string.gsub("\n", "")
|
261
|
+
end
|
262
|
+
|
263
|
+
sandbox_test "should display command syntaxes" do
|
264
|
+
@ext = Minecraft::Extensions.new(StringIO.new, {})
|
265
|
+
@ext.ops = ["basicxman"]
|
266
|
+
|
267
|
+
# None
|
268
|
+
@ext.call_command("basicxman", "help", "day")
|
269
|
+
t = @ext.server.string.split("\n")
|
270
|
+
assert_equal "say !day", t[0]
|
271
|
+
|
272
|
+
# opt
|
273
|
+
@ext.server.string = ""
|
274
|
+
@ext.call_command("basicxman", "help", "warptime")
|
275
|
+
t = @ext.server.string.split("\n")
|
276
|
+
assert_equal "say !warptime", t[0]
|
277
|
+
assert_equal "say !warptime 'time change'", t[1]
|
278
|
+
|
279
|
+
# rest
|
280
|
+
@ext.server.string = ""
|
281
|
+
@ext.call_command("basicxman", "help", "welcome")
|
282
|
+
t = @ext.server.string.split("\n")
|
283
|
+
assert_equal "say !welcome 'arguments', '...'", t[0]
|
284
|
+
|
285
|
+
# req, rest
|
286
|
+
@ext.server.string = ""
|
287
|
+
@ext.call_command("basicxman", "help", "memo")
|
288
|
+
t = @ext.server.string.split("\n")
|
289
|
+
assert_equal "say !memo 'target user', 'arguments', '...'", t[0]
|
290
|
+
|
291
|
+
# req
|
292
|
+
@ext.server.string = ""
|
293
|
+
@ext.call_command("basicxman", "help", "disturb")
|
294
|
+
t = @ext.server.string.split("\n")
|
295
|
+
assert_equal "say !disturb 'target user'", t[0]
|
296
|
+
|
297
|
+
# req, opt
|
298
|
+
@ext.server.string = ""
|
299
|
+
@ext.call_command("basicxman", "help", "points")
|
300
|
+
t = @ext.server.string.split("\n")
|
301
|
+
assert_equal "say !points 'target user'", t[0]
|
302
|
+
assert_equal "say !points 'target user', 'num points'", t[1]
|
303
|
+
end
|
304
|
+
|
305
|
+
# Do not disturb testing.
|
306
|
+
sandbox_test "should not allow users in dnd to be teleported to" do
|
307
|
+
@ext = Minecraft::Extensions.new(StringIO.new, {})
|
308
|
+
@ext.users = ["basicxman", "mike_n_7"]
|
309
|
+
@ext.hops = ["mike_n_7"]
|
310
|
+
@ext.call_command("basicxman", "dnd")
|
311
|
+
assert_equal ["basicxman"], @ext.userdnd
|
312
|
+
@ext.server.string = ""
|
313
|
+
@ext.call_command("mike_n_7", "tp", "basicxman")
|
314
|
+
assert_match "disturbed", @ext.server.string
|
315
|
+
@ext.call_command("basicxman", "dnd")
|
316
|
+
assert_equal [], @ext.userdnd
|
317
|
+
end
|
318
|
+
|
319
|
+
sandbox_test "should allow ops to use the disturb command against users" do
|
320
|
+
@ext = Minecraft::Extensions.new(StringIO.new, {})
|
321
|
+
@ext.users = ["basicxman", "mike_n_7"]
|
322
|
+
@ext.ops = ["basicxman"]
|
323
|
+
@ext.call_command("mike_n_7", "dnd")
|
324
|
+
assert_equal ["mike_n_7"], @ext.userdnd
|
325
|
+
@ext.call_command("basicxman", "disturb", "mike_n_7")
|
326
|
+
assert_equal [], @ext.userdnd
|
327
|
+
end
|
328
|
+
|
329
|
+
# Disco.
|
330
|
+
sandbox_test "should start the disco" do
|
331
|
+
@ext = Minecraft::Extensions.new(StringIO.new, {})
|
332
|
+
@ext.users = ["basicxman"]
|
333
|
+
@ext.ops = ["basicxman"]
|
334
|
+
@ext.call_command("basicxman", "disco")
|
335
|
+
assert_match "disco", @ext.server.string
|
336
|
+
@ext.server.string = ""
|
337
|
+
12.times { @ext.periodic }
|
338
|
+
assert_match "time set 0", @ext.server.string
|
339
|
+
assert_match "time set 16000", @ext.server.string
|
340
|
+
end
|
341
|
+
|
342
|
+
# Teleport all.
|
343
|
+
sandbox_test "should teleport all users to an op" do
|
344
|
+
@ext = Minecraft::Extensions.new(StringIO.new, {})
|
345
|
+
@ext.users = ["basicxman", "mike_n_7", "blizzard4U", "Ian_zers"]
|
346
|
+
@ext.ops = ["basicxman"]
|
347
|
+
@ext.call_command("basicxman", "tpall")
|
348
|
+
assert_match "mike_n_7", @ext.server.string
|
349
|
+
assert_match "blizzard4U", @ext.server.string
|
350
|
+
assert_match "Ian_zers", @ext.server.string
|
351
|
+
end
|
352
|
+
|
353
|
+
# Welcome message runtime change test.
|
354
|
+
sandbox_test "should change welcome message during runtime" do
|
355
|
+
@ext = Minecraft::Extensions.new(StringIO.new, {})
|
356
|
+
@ext.ops = ["basicxman"]
|
357
|
+
@ext.call_command("basicxman", "welcome", "Foo bar.")
|
358
|
+
assert_equal "Foo bar.", @ext.welcome_message
|
359
|
+
|
360
|
+
@ext.call_command("basicxman", "welcome", "+", "%")
|
361
|
+
assert_equal "Foo bar. %", @ext.welcome_message
|
362
|
+
assert_match "basicxman", @ext.server.string
|
363
|
+
end
|
364
|
+
|
365
|
+
# Memos.
|
366
|
+
sandbox_test "should allow users to set memos" do
|
367
|
+
@ext = Minecraft::Extensions.new(StringIO.new, {})
|
368
|
+
@ext.users = ["basicxman"]
|
369
|
+
@ext.call_command("basicxman", "memo", "mike_n_7", "Hi")
|
370
|
+
assert_equal ["basicxman", "Hi"], @ext.memos["mike_n_7"][0]
|
371
|
+
|
372
|
+
#@ext.check_memos("mike_n_7")
|
373
|
+
#assert_match "Hi", @ext.server.string
|
374
|
+
#assert_equal 0, @ext.memos["mike_n_7"].length
|
375
|
+
end
|
376
|
+
|
377
|
+
sandbox_test "should add and print multiple memos" do
|
378
|
+
@ext = Minecraft::Extensions.new(StringIO.new, {})
|
379
|
+
@ext.users = ["basicxman"]
|
380
|
+
3.times { @ext.call_command("basicxman", "memo", "mike_n_7", "Hi") }
|
381
|
+
assert_equal 3, @ext.memos["mike_n_7"].length
|
382
|
+
|
383
|
+
@ext.check_memos("mike_n_7")
|
384
|
+
assert_equal 0, @ext.memos["mike_n_7"].length
|
385
|
+
end
|
386
|
+
|
387
|
+
sandbox_test "should only allow five memos per user" do
|
388
|
+
@ext = Minecraft::Extensions.new(StringIO.new, {})
|
389
|
+
@ext.users = ["basicxman"]
|
390
|
+
10.times { @ext.call_command("basicxman", "memo", "mike_n_7", "Hi") }
|
391
|
+
assert_equal 5, @ext.memos["mike_n_7"].length
|
392
|
+
end
|
393
|
+
|
394
|
+
# Warping time.
|
395
|
+
sandbox_test "should warp time" do
|
396
|
+
@ext = Minecraft::Extensions.new(StringIO.new, {})
|
397
|
+
@ext.ops = ["basicxman"]
|
398
|
+
@ext.call_command("basicxman", "warptime", "100")
|
399
|
+
40.times { @ext.periodic }
|
400
|
+
assert_match "time add 100", @ext.server.string.gsub("\n", " ")
|
401
|
+
end
|
402
|
+
|
403
|
+
# Todo command tests.
|
404
|
+
sandbox_test "should add, list and remove global todo items" do
|
405
|
+
@ext = Minecraft::Extensions.new(StringIO.new, {})
|
406
|
+
@ext.call_command("basicxman", "todo", "foo", "bar")
|
407
|
+
@ext.call_command("basicxman", "todo", "bar")
|
408
|
+
assert_match "Added", @ext.server.string
|
409
|
+
assert_equal "foo bar", @ext.todo_items[0]
|
410
|
+
|
411
|
+
@ext.call_command("basicxman", "todo")
|
412
|
+
assert_match "1. foo bar", @ext.server.string.split("\n")[-2]
|
413
|
+
assert_match "2. bar", @ext.server.string.split("\n")[-1]
|
414
|
+
|
415
|
+
@ext.call_command("basicxman", "finished", "foo", "bar")
|
416
|
+
@ext.call_command("basicxman", "finished", "1")
|
417
|
+
assert_match "Hurray!", @ext.server.string
|
418
|
+
assert_equal 0, @ext.todo_items.length
|
419
|
+
|
420
|
+
@ext.server.string = ""
|
421
|
+
@ext.call_command("basicxman", "finished", "2")
|
422
|
+
assert_match "not exist", @ext.server.string
|
423
|
+
@ext.server.string = ""
|
424
|
+
@ext.call_command("basicxman", "finished", "lolcats")
|
425
|
+
assert_match "not exist", @ext.server.string
|
426
|
+
end
|
427
|
+
|
428
|
+
# Remaining commands testing (should test to ensure no errors are thrown in
|
429
|
+
# the command execution).
|
430
|
+
sandbox_test "should run commands without failure" do
|
431
|
+
@ext = Minecraft::Extensions.new(StringIO.new, {})
|
432
|
+
@ext.users = ["basicxman", "mike_n_7", "blizzard4U", "Ian_zers"]
|
433
|
+
@ext.ops = ["basicxman"]
|
434
|
+
@ext.hops = ["mike_n_7"]
|
435
|
+
@ext.call_command("basicxman", "dawn")
|
436
|
+
@ext.call_command("basicxman", "dusk")
|
437
|
+
@ext.call_command("basicxman", "day")
|
438
|
+
@ext.call_command("basicxman", "night")
|
439
|
+
@ext.call_command("basicxman", "morning")
|
440
|
+
@ext.call_command("basicxman", "evening")
|
441
|
+
@ext.call_command("basicxman", "disco")
|
442
|
+
@ext.call_command("mike_n_7", "dnd")
|
443
|
+
@ext.call_command("basicxman", "printdnd")
|
444
|
+
@ext.call_command("basicxman", "disturb", "mike_n_7")
|
445
|
+
@ext.call_command("basicxman", "roulette")
|
446
|
+
@ext.call_command("basicxman", "hop", "Ian_zers")
|
447
|
+
@ext.call_command("basicxman", "dehop", "Ian_zers")
|
448
|
+
@ext.call_command("basicxman", "kit", "diamond")
|
449
|
+
@ext.call_command("basicxman", "tp", "Ian_zers")
|
450
|
+
@ext.call_command("basicxman", "tpall")
|
451
|
+
@ext.call_command("basicxman", "nom")
|
452
|
+
@ext.call_command("basicxman", "om", "nom", "nom")
|
453
|
+
@ext.call_command("basicxman", "property", "spawn-monsters")
|
454
|
+
@ext.call_command("basicxman", "property")
|
455
|
+
@ext.call_command("basicxman", "uptime")
|
456
|
+
@ext.call_command("basicxman", "uptime", "mike_n_7")
|
457
|
+
@ext.call_command("basicxman", "rules")
|
458
|
+
@ext.call_command("basicxman", "list")
|
459
|
+
@ext.call_command("basicxman", "addtimer", "cobblestone")
|
460
|
+
@ext.call_command("basicxman", "addtimer", "4", "60")
|
461
|
+
@ext.call_command("basicxman", "deltimer", "4")
|
462
|
+
@ext.call_command("basicxman", "printtimer")
|
463
|
+
@ext.call_command("basicxman", "printtime")
|
464
|
+
@ext.call_command("basicxman", "s", "foo", "give", "cobblestone")
|
465
|
+
@ext.call_command("basicxman", "s", "foo")
|
466
|
+
@ext.call_command("basicxman", "shortcuts")
|
467
|
+
@ext.call_command("basicxman", "help")
|
468
|
+
@ext.call_command("basicxman", "help", "give")
|
469
|
+
@ext.call_command("basicxman", "kitlist")
|
229
470
|
end
|
230
471
|
end
|