minecraftctl 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +3 -0
- data/Gemfile.lock +12 -0
- data/README.rdoc +9 -0
- data/VERSION +1 -1
- data/bin/minecraftctl +13 -4
- data/bin/minecraftctlserver +89 -195
- data/lib/message_collector.rb +21 -0
- data/lib/minecraft.rb +281 -0
- data/lib/spawn.rb +78 -0
- data/minecraftctl.gemspec +16 -5
- data/spec/message_collector_spec.rb +61 -0
- data/spec/minecraft_spec.rb +80 -0
- data/spec/minecraftctlserver_spec.rb +92 -0
- data/spec/spec_helper.rb +0 -1
- data/spec/stub_server/minecraft +100 -0
- metadata +43 -6
- data/lib/minecraftctl.rb +0 -0
- data/spec/minecraftctl_spec.rb +0 -7
@@ -0,0 +1,80 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
require 'minecraft'
|
3
|
+
|
4
|
+
describe Minecraft do
|
5
|
+
it "should raise Minecraft::StartupFailedError when server command is not executable" do
|
6
|
+
@m = Minecraft.new(File.dirname(__FILE__) + '/stub_minecraftxx')
|
7
|
+
lambda {
|
8
|
+
@m.start
|
9
|
+
}.should raise_error Minecraft::StartupFailedError
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should raise Minecraft::StartupFailedError when server command is not returning expected output" do
|
13
|
+
@m = Minecraft.new('echo hello world')
|
14
|
+
lambda {
|
15
|
+
@m.start
|
16
|
+
}.should raise_error Minecraft::StartupFailedError
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should start up" do
|
20
|
+
@m = Minecraft.new(File.dirname(__FILE__) + '/stub_server/minecraft')
|
21
|
+
@m.start
|
22
|
+
|
23
|
+
msgs = @m.history.map{|m| m.msg}
|
24
|
+
|
25
|
+
msgs.should include "Starting minecraft server version Beta 1.7.3"
|
26
|
+
msgs.should include "Done (5887241893ns)! For help, type \"help\" or \"?\""
|
27
|
+
msgs.last.should =~ /Server start finished/
|
28
|
+
end
|
29
|
+
|
30
|
+
describe 'while running' do
|
31
|
+
before :all do
|
32
|
+
@m = Minecraft.new(File.dirname(__FILE__) + '/stub_server/minecraft')
|
33
|
+
@m.start
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should provide message history' do
|
37
|
+
h = @m.history
|
38
|
+
h.first.should be_kind_of Minecraft::MessageQueue::Message::Internal
|
39
|
+
h.should have(23).items
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'responds to list command' do
|
43
|
+
@m.list
|
44
|
+
msgs = @m.history.map{|m| m.msg}
|
45
|
+
msgs.last.should == 'Connected players: kazuya'
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'responds to say command' do
|
49
|
+
@m.say('hello', 'world')
|
50
|
+
msgs = @m.history.map{|m| m.msg}
|
51
|
+
msgs.should include '[CONSOLE] hello world'
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'responds to save_all command' do
|
55
|
+
@m.save_all
|
56
|
+
msgs = @m.history.map{|m| m.msg}
|
57
|
+
msgs.should include 'CONSOLE: Save complete.'
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should stop and start' do
|
61
|
+
@m.stop
|
62
|
+
msgs = @m.history.map{|m| m.msg}
|
63
|
+
msgs.should include 'Stopping server'
|
64
|
+
@m.running?.should == false
|
65
|
+
|
66
|
+
@m.start
|
67
|
+
msgs = @m.history.map{|m| m.msg}
|
68
|
+
msgs[-5, 5].should include 'Done (5887241893ns)! For help, type "help" or "?"'
|
69
|
+
@m.running?.should == true
|
70
|
+
|
71
|
+
@m.list
|
72
|
+
msgs = @m.history.map{|m| m.msg}
|
73
|
+
msgs.last.should == 'Connected players: kazuya'
|
74
|
+
end
|
75
|
+
|
76
|
+
after :all do
|
77
|
+
@m.stop
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
require 'httpclient'
|
3
|
+
require 'open4'
|
4
|
+
require 'timeout'
|
5
|
+
|
6
|
+
|
7
|
+
$url = 'http://localhost:25560/'
|
8
|
+
|
9
|
+
def start_stub(wait = true)
|
10
|
+
pid, stdin, stdout, stderr = Open4::popen4(File.dirname(__FILE__) + '/../bin/minecraftctlserver -c ./minecraft ' + File.dirname(__FILE__) + '/stub_server')
|
11
|
+
|
12
|
+
if wait
|
13
|
+
c = HTTPClient.new
|
14
|
+
Timeout.timeout(10) do
|
15
|
+
begin
|
16
|
+
c.get_content($url + "status")
|
17
|
+
rescue Errno::ECONNREFUSED
|
18
|
+
sleep 0.4
|
19
|
+
retry
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def stop_stub
|
26
|
+
HTTPClient.new.post_content($url + "shutdown", '')
|
27
|
+
|
28
|
+
Timeout.timeout(10) do
|
29
|
+
begin
|
30
|
+
loop do
|
31
|
+
HTTPClient.new.get_content($url + "status")
|
32
|
+
sleep 0.4
|
33
|
+
end
|
34
|
+
rescue Errno::ECONNREFUSED
|
35
|
+
rescue => e
|
36
|
+
puts "got different error: #{e}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
sleep 0.2
|
40
|
+
end
|
41
|
+
|
42
|
+
describe 'minecraftctlserver' do
|
43
|
+
describe 'text mode HTTP' do
|
44
|
+
describe 'server startup' do
|
45
|
+
before :all do
|
46
|
+
start_stub(false)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should start the minecraft server and respond to status command when ready' do
|
50
|
+
Timeout.timeout(10) do
|
51
|
+
out = nil
|
52
|
+
begin
|
53
|
+
out = HTTPClient.new.get_content($url + "status")
|
54
|
+
rescue Errno::ECONNREFUSED
|
55
|
+
sleep 0.4
|
56
|
+
retry
|
57
|
+
end
|
58
|
+
|
59
|
+
out.should =~ /Minecraft server is running with pid:/
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
after :all do
|
64
|
+
stop_stub
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe 'while server ready' do
|
69
|
+
before :all do
|
70
|
+
start_stub
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should respond to GET /list' do
|
74
|
+
HTTPClient.new.get_content($url + "list").should == "Connected players: kazuya\n"
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should stop and start with POST /stop and POST /start' do
|
78
|
+
HTTPClient.new.post_content($url + "stop", '').should include "Server stopped\n"
|
79
|
+
HTTPClient.new.post_content($url + "start", '').should include 'Done (5887241893ns)! For help, type "help" or "?"'
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'should respond to GET /help' do
|
83
|
+
HTTPClient.new.get_content($url + "help").should include "show server status\n"
|
84
|
+
end
|
85
|
+
|
86
|
+
after :all do
|
87
|
+
stop_stub
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,100 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
def out(line)
|
4
|
+
STDOUT << line + "\n"
|
5
|
+
STDOUT.flush
|
6
|
+
end
|
7
|
+
|
8
|
+
def err(line)
|
9
|
+
STDERR << line + "\n"
|
10
|
+
STDERR.flush
|
11
|
+
end
|
12
|
+
|
13
|
+
$expects = {}
|
14
|
+
|
15
|
+
def expect(command, &response)
|
16
|
+
$expects[command] = response
|
17
|
+
end
|
18
|
+
|
19
|
+
out '151 recipes'
|
20
|
+
out '16 achievements'
|
21
|
+
err '2011-09-10 12:58:55 [INFO] Starting minecraft server version Beta 1.7.3'
|
22
|
+
err '2011-09-10 12:58:55 [WARNING] **** NOT ENOUGH RAM!'
|
23
|
+
err '2011-09-10 12:58:55 [WARNING] To start the server with more ram, launch it as "java -Xmx1024M -Xms1024M -jar minecraft_server.jar"'
|
24
|
+
err '2011-09-10 12:58:55 [INFO] Loading properties'
|
25
|
+
err '2011-09-10 12:58:55 [INFO] Starting Minecraft server on *:25565'
|
26
|
+
err '2011-09-10 12:58:55 [WARNING] **** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!'
|
27
|
+
err '2011-09-10 12:58:55 [WARNING] The server will make no attempt to authenticate usernames. Beware.'
|
28
|
+
err '2011-09-10 12:58:55 [WARNING] While this makes the game possible to play without internet access, it also opens up the ability for hackers to connect with any username they choose.'
|
29
|
+
err '2011-09-10 12:58:55 [WARNING] To change this, set "online-mode" to "true" in the server.settings file.'
|
30
|
+
err '2011-09-10 12:58:55 [INFO] Preparing level "world"'
|
31
|
+
err '2011-09-10 12:58:55 [INFO] Preparing start region for level 0'
|
32
|
+
err '2011-09-10 12:58:56 [INFO] Preparing spawn area: 32%'
|
33
|
+
err '2011-09-10 12:58:57 [INFO] Preparing spawn area: 77%'
|
34
|
+
err '2011-09-10 12:58:58 [INFO] Preparing start region for level 1'
|
35
|
+
err '2011-09-10 12:58:59 [INFO] Preparing spawn area: 4%'
|
36
|
+
err '2011-09-10 12:59:00 [INFO] Preparing spawn area: 52%'
|
37
|
+
err '2011-09-10 12:59:01 [INFO] Preparing spawn area: 97%'
|
38
|
+
err '2011-09-10 12:59:01 [INFO] Done (5887241893ns)! For help, type "help" or "?"'
|
39
|
+
|
40
|
+
expect 'list' do
|
41
|
+
err '2011-09-20 14:42:04 [INFO] Connected players: kazuya'
|
42
|
+
end
|
43
|
+
|
44
|
+
expect 'stop' do
|
45
|
+
err '2011-09-19 22:12:00 [INFO] Stopping server'
|
46
|
+
err '2011-09-19 22:12:00 [INFO] Saving chunks'
|
47
|
+
err '2011-09-19 22:12:00 [INFO] Saving chunks'
|
48
|
+
exit
|
49
|
+
end
|
50
|
+
|
51
|
+
expect 'help' do
|
52
|
+
err '2011-09-21 13:33:46 [INFO] To run the server without a gui, start it like this:'
|
53
|
+
err '2011-09-21 13:33:46 [INFO] java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui'
|
54
|
+
err '2011-09-21 13:33:46 [INFO] Console commands:'
|
55
|
+
err '2011-09-21 13:33:46 [INFO] help or ? shows this message'
|
56
|
+
err '2011-09-21 13:33:46 [INFO] kick <player> removes a player from the server'
|
57
|
+
err '2011-09-21 13:33:46 [INFO] ban <player> bans a player from the server'
|
58
|
+
err '2011-09-21 13:33:46 [INFO] pardon <player> pardons a banned player so that they can connect again'
|
59
|
+
err '2011-09-21 13:33:46 [INFO] ban-ip <ip> bans an IP address from the server'
|
60
|
+
err '2011-09-21 13:33:46 [INFO] pardon-ip <ip> pardons a banned IP address so that they can connect again'
|
61
|
+
err '2011-09-21 13:33:46 [INFO] op <player> turns a player into an op'
|
62
|
+
err '2011-09-21 13:33:46 [INFO] deop <player> removes op status from a player'
|
63
|
+
err '2011-09-21 13:33:46 [INFO] tp <player1> <player2> moves one player to the same location as another player'
|
64
|
+
err '2011-09-21 13:33:46 [INFO] give <player> <id> [num] gives a player a resource'
|
65
|
+
err '2011-09-21 13:33:46 [INFO] tell <player> <message> sends a private message to a player'
|
66
|
+
err '2011-09-21 13:33:46 [INFO] stop gracefully stops the server'
|
67
|
+
err '2011-09-21 13:33:46 [INFO] save-all forces a server-wide level save'
|
68
|
+
err '2011-09-21 13:33:46 [INFO] save-off disables terrain saving (useful for backup scripts)'
|
69
|
+
err '2011-09-21 13:33:46 [INFO] save-on re-enables terrain saving'
|
70
|
+
err '2011-09-21 13:33:46 [INFO] list lists all currently connected players'
|
71
|
+
err '2011-09-21 13:33:46 [INFO] say <message> broadcasts a message to all players'
|
72
|
+
err '2011-09-21 13:33:46 [INFO] time <add|set> <amount> adds to or sets the world time (0-24000)'
|
73
|
+
err '2011-09-21 13:33:46 [INFO] gamemode <player> <mode> sets player\'s game mode (0 or 1)'
|
74
|
+
end
|
75
|
+
|
76
|
+
expect 'say' do |*args|
|
77
|
+
err "2011-09-21 14:01:18 [INFO] [CONSOLE] #{args.join(' ')}"
|
78
|
+
end
|
79
|
+
|
80
|
+
expect 'save-all' do
|
81
|
+
err '2011-09-21 14:02:22 [INFO] CONSOLE: Forcing save..'
|
82
|
+
err '2011-09-21 14:02:22 [INFO] CONSOLE: Save complete.'
|
83
|
+
end
|
84
|
+
|
85
|
+
expect 'stream' do
|
86
|
+
10.times do |n|
|
87
|
+
err "2011-09-21 14:02:#{n} [INFO] #{n}"
|
88
|
+
sleep 1
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
loop do
|
93
|
+
cmd, *args = gets.split(' ')
|
94
|
+
if $expects.member? cmd
|
95
|
+
$expects[cmd].call(*args)
|
96
|
+
else
|
97
|
+
err '2011-09-20 14:42:52 [INFO] Unknown console command. Type "help" for help.'
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: minecraftctl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 1.0.0
|
10
|
+
version: 1.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jakub Pastuszek
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-09-
|
18
|
+
date: 2011-09-22 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
requirement: &id001 !ruby/object:Gem::Requirement
|
@@ -175,6 +175,38 @@ dependencies:
|
|
175
175
|
name: httpclient
|
176
176
|
prerelease: false
|
177
177
|
type: :development
|
178
|
+
- !ruby/object:Gem::Dependency
|
179
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
180
|
+
none: false
|
181
|
+
requirements:
|
182
|
+
- - ">="
|
183
|
+
- !ruby/object:Gem::Version
|
184
|
+
hash: 19
|
185
|
+
segments:
|
186
|
+
- 1
|
187
|
+
- 1
|
188
|
+
- 0
|
189
|
+
version: 1.1.0
|
190
|
+
version_requirements: *id011
|
191
|
+
name: open4
|
192
|
+
prerelease: false
|
193
|
+
type: :development
|
194
|
+
- !ruby/object:Gem::Dependency
|
195
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
196
|
+
none: false
|
197
|
+
requirements:
|
198
|
+
- - ">="
|
199
|
+
- !ruby/object:Gem::Version
|
200
|
+
hash: 25
|
201
|
+
segments:
|
202
|
+
- 1
|
203
|
+
- 1
|
204
|
+
- 5
|
205
|
+
version: 1.1.5
|
206
|
+
version_requirements: *id012
|
207
|
+
name: mongrel
|
208
|
+
prerelease: false
|
209
|
+
type: :development
|
178
210
|
description: Allows to send messages, start and stop Minecraft server
|
179
211
|
email: jpastuszek@gmail.com
|
180
212
|
executables:
|
@@ -196,10 +228,15 @@ files:
|
|
196
228
|
- VERSION
|
197
229
|
- bin/minecraftctl
|
198
230
|
- bin/minecraftctlserver
|
199
|
-
- lib/
|
231
|
+
- lib/message_collector.rb
|
232
|
+
- lib/minecraft.rb
|
233
|
+
- lib/spawn.rb
|
200
234
|
- minecraftctl.gemspec
|
201
|
-
- spec/
|
235
|
+
- spec/message_collector_spec.rb
|
236
|
+
- spec/minecraft_spec.rb
|
237
|
+
- spec/minecraftctlserver_spec.rb
|
202
238
|
- spec/spec_helper.rb
|
239
|
+
- spec/stub_server/minecraft
|
203
240
|
homepage: http://github.com/jpastuszek/minecraftctl
|
204
241
|
licenses:
|
205
242
|
- MIT
|
data/lib/minecraftctl.rb
DELETED
File without changes
|