minecraftctl 1.0.0 → 1.1.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/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
|