matthewtodd-settlers 0.1.2 → 0.2.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/Rakefile CHANGED
@@ -2,12 +2,15 @@ require 'rubygems'
2
2
 
3
3
  spec = Gem::Specification.new do |s|
4
4
  s.name = 'settlers'
5
- s.version = '0.1.2'
5
+ s.version = '0.2.0'
6
6
  s.summary = "Provides a simple command-line executable for playing Robb Thomas' JSettlers game."
7
7
  s.files = FileList['[A-Z]*', 'bin/*', 'lib/**/*.rb', 'resources/**/*']
8
8
  s.executables = ['settlers']
9
9
  s.author = 'Matthew Todd'
10
10
  s.email = 'matthew.todd@gmail.com'
11
+
12
+ s.add_dependency 'dnssd'
13
+ s.add_dependency 'highline'
11
14
  end
12
15
 
13
16
  desc 'Generate a gemspec file'
data/bin/settlers CHANGED
@@ -3,4 +3,4 @@
3
3
  $:.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
4
4
  require 'settlers'
5
5
 
6
- Settlers::Game.new(*ARGV).play
6
+ Settlers::Application.new(*ARGV).run
data/lib/settlers.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  require 'settlers/java_command'
2
2
  require 'settlers/jar'
3
- require 'settlers/game'
3
+ require 'settlers/application'
@@ -0,0 +1,129 @@
1
+ require 'optparse'
2
+ require 'set'
3
+ require 'shellwords'
4
+
5
+ require 'rubygems'
6
+ require 'dnssd'
7
+ require 'highline/import'
8
+
9
+ module Settlers
10
+ class Application
11
+ attr_accessor :server, :client, :style
12
+
13
+ def initialize(*args)
14
+ self.server = Server.new
15
+ self.client = Client.new
16
+ self.style = StandaloneGame
17
+ parse_options(args)
18
+ end
19
+
20
+ def run
21
+ style.new(self).run
22
+ end
23
+
24
+ def start_server
25
+ server.start
26
+ end
27
+
28
+ def start_client(server)
29
+ client.start(server)
30
+ end
31
+
32
+ def find_server
33
+ choose(*available_servers)
34
+ end
35
+
36
+ private
37
+
38
+ def parse_options(args)
39
+ # TODO it would be nice to provide a quick tabtab definition here.
40
+ OptionParser.new do |opts|
41
+ opts.on('-c', '--client') { self.style = BonjourClientGame }
42
+ opts.parse!(args)
43
+ end
44
+ end
45
+
46
+ class StandaloneGame < Struct.new(:app)
47
+ def run
48
+ app.start_server
49
+ app.start_client(app.server)
50
+ end
51
+ end
52
+
53
+ class BonjourClientGame < Struct.new(:app)
54
+ def run
55
+ app.start_client(app.find_server)
56
+ end
57
+ end
58
+
59
+ def available_servers(timeout = 3)
60
+ servers = Set.new
61
+
62
+ dns = DNSSD.browse('_settlers._tcp') do |reply|
63
+ DNSSD.resolve(reply.name, reply.type, reply.domain) do |resolve_reply|
64
+ servers << RemoteServer.new(reply.name, resolve_reply.target, resolve_reply.port)
65
+ end
66
+ end
67
+
68
+ puts 'Looking for settlers servers nearby...'
69
+ sleep timeout
70
+ dns.stop
71
+
72
+ return servers
73
+ end
74
+
75
+ class Server
76
+ # Maybe we can change these to attr_writer as we'd like to make them command-line configurable.
77
+ attr_reader :name, :host, :port, :startup_delay, :maximum_connections, :username, :password, :robot_names
78
+
79
+ def initialize
80
+ @name = "#{`hostname -s`.chomp}-#{`whoami`.chomp}"
81
+ @host = 'localhost'
82
+ @port = 8880
83
+ @startup_delay = 4
84
+ @maximum_connections = 12
85
+ @username = 'root'
86
+ @password = ''
87
+ @robot_names = %w(Leonardo Humperdink Elwood)
88
+ end
89
+
90
+ def start
91
+ announce
92
+ serve
93
+ sleep(startup_delay)
94
+ start_robots
95
+ end
96
+
97
+ private
98
+
99
+ def announce
100
+ # Maybe it would be nice to include a TextRecord here providing something of a description?
101
+ DNSSD.register(name, '_settlers._tcp', 'local', port) do |rr|
102
+ puts "Announcing settlers server available on port #{port}."
103
+ end
104
+ end
105
+
106
+ def serve
107
+ Jar.new('JSettlersServer.jar').running('soc.server.SOCServer').start(port, maximum_connections, username, Shellwords.escape(password))
108
+ end
109
+
110
+ def start_robots
111
+ robot_names.each do |name|
112
+ Jar.new('JSettlersServer.jar').running('soc.robot.SOCRobotClient').start(host, port, name, Shellwords.escape(password))
113
+ end
114
+ end
115
+ end
116
+
117
+ class RemoteServer < Struct.new(:name, :host, :port)
118
+ def to_s
119
+ "#{name} (#{host}:#{port})"
120
+ end
121
+ end
122
+
123
+ class Client
124
+ def start(server)
125
+ Jar.new('JSettlers.jar').running('soc.client.SOCPlayerClient').run(server.host, server.port)
126
+ end
127
+ end
128
+ end
129
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: matthewtodd-settlers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Todd
@@ -9,10 +9,29 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-10-12 00:00:00 -07:00
12
+ date: 2009-05-02 00:00:00 -07:00
13
13
  default_executable: settlers
14
- dependencies: []
15
-
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: dnssd
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: highline
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
16
35
  description:
17
36
  email: matthew.todd@gmail.com
18
37
  executables:
@@ -24,7 +43,7 @@ extra_rdoc_files: []
24
43
  files:
25
44
  - Rakefile
26
45
  - bin/settlers
27
- - lib/settlers/game.rb
46
+ - lib/settlers/application.rb
28
47
  - lib/settlers/jar.rb
29
48
  - lib/settlers/java_command.rb
30
49
  - lib/settlers.rb
@@ -58,7 +77,7 @@ requirements: []
58
77
  rubyforge_project:
59
78
  rubygems_version: 1.2.0
60
79
  signing_key:
61
- specification_version: 2
80
+ specification_version: 3
62
81
  summary: Provides a simple command-line executable for playing Robb Thomas' JSettlers game.
63
82
  test_files: []
64
83
 
data/lib/settlers/game.rb DELETED
@@ -1,34 +0,0 @@
1
- module Settlers
2
- class Game
3
- DEFAULT_PORT = 8880
4
- MAXIMUM_SERVER_CONNECTIONS = 4
5
- SERVER_STARTUP_DELAY = 2
6
- NO_PASSWORD = "''"
7
-
8
- def initialize(port=DEFAULT_PORT)
9
- @host, @port = 'localhost', port
10
- end
11
-
12
- def play
13
- server.start(@port, MAXIMUM_SERVER_CONNECTIONS, 'root', NO_PASSWORD); sleep SERVER_STARTUP_DELAY
14
- robot.start(@host, @port, 'Leonardo', NO_PASSWORD)
15
- robot.start(@host, @port, 'Humperdink', NO_PASSWORD)
16
- robot.start(@host, @port, 'Elwood', NO_PASSWORD)
17
- human.run(@host, @port)
18
- end
19
-
20
- private
21
-
22
- def server
23
- Jar.new('JSettlersServer.jar').running('soc.server.SOCServer')
24
- end
25
-
26
- def robot
27
- Jar.new('JSettlersServer.jar').running('soc.robot.SOCRobotClient')
28
- end
29
-
30
- def human
31
- Jar.new('JSettlers.jar').running('soc.client.SOCPlayerClient')
32
- end
33
- end
34
- end