ruby-mud 0.0.3 → 0.0.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.
- checksums.yaml +4 -4
- data/lib/abstract_controller.rb +103 -0
- data/lib/default_controller.rb +8 -0
- data/lib/mud_server.rb +37 -0
- data/lib/session.rb +24 -0
- metadata +5 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 21f775f532d3ecb4f1fe785b2bf43375a333f50d
|
4
|
+
data.tar.gz: c5adb0167b1f4c3e085a523d97b0af5265515f80
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c57d647655acb4d75b3050e8cee7398e6ba6b24b7808e45c4f0462cc04bc51880b7cb84755b935ec4ac44de8f3ddb7f568b0c7ef70c289185eb849993b1009b
|
7
|
+
data.tar.gz: 07c224d01d9d1840e7a1c1d692749a6b1ec0427b36a969b117115de9b9e5c0b350bf6a3246b3fc07b8545671d43d5c9261183dfdda8f941b554b6c216469e339
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# Transfers input/output from the Telnet world into the Ruby world while
|
2
|
+
# abstracting away all the rough spots.
|
3
|
+
# All controllers should inherit from here
|
4
|
+
class MudServer::AbstractController
|
5
|
+
|
6
|
+
attr_accessor :session, :params
|
7
|
+
|
8
|
+
# Instantiates a new controller instance. It is highly recomended that derived
|
9
|
+
# controller classes either not modify this method, call super, or proxy via a
|
10
|
+
# helper method (such as create() or buil(), etc).
|
11
|
+
#
|
12
|
+
# * +session+ - (Session) The connection session that the controller will
|
13
|
+
# communicate with.
|
14
|
+
def initialize(session)
|
15
|
+
@session = session
|
16
|
+
on_start
|
17
|
+
true
|
18
|
+
end
|
19
|
+
|
20
|
+
# User definable callback called after instantiation.
|
21
|
+
def on_start
|
22
|
+
end
|
23
|
+
|
24
|
+
# Sends a string to remote client over the TCP socket connection.
|
25
|
+
def send_text(command)
|
26
|
+
@session.connection.puts(command)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Void paramaterless controller action that closes TCP socket to client.
|
30
|
+
# You must whitelist this command in allowed_methods() in order for it to be
|
31
|
+
# usable by players.
|
32
|
+
def quit
|
33
|
+
session.connection.close
|
34
|
+
end
|
35
|
+
|
36
|
+
# Parses arbitrary user input into a format usable by the interpreter. Strips
|
37
|
+
# all input after initial command and stores it in `params`.
|
38
|
+
#
|
39
|
+
# * +command+ - (String) A string of space seperated commands and arguments
|
40
|
+
#
|
41
|
+
# parse_command('login user_x password123')
|
42
|
+
# # => True
|
43
|
+
# params() # Note: side effects
|
44
|
+
# # => 'user_x password123'
|
45
|
+
def get_text(command)
|
46
|
+
command = command.split(' ')
|
47
|
+
head = command.shift
|
48
|
+
@params = command.join(' ')
|
49
|
+
interpret_command head.to_s.downcase
|
50
|
+
end
|
51
|
+
|
52
|
+
# Interprets a controller command (first argument of user input)
|
53
|
+
#
|
54
|
+
# * +head+ - (String) The command to execute. Will only execute the command if
|
55
|
+
# it is within the 'allowed_methods' dynamic array.
|
56
|
+
#
|
57
|
+
# interpret_command('add') # Assumes the current controller has
|
58
|
+
# # an add() method defined and within
|
59
|
+
# # => 10 # the allowed_methods Array.
|
60
|
+
def interpret_command(head)
|
61
|
+
if allowed_methods.include? head
|
62
|
+
self.send(head)
|
63
|
+
else
|
64
|
+
send_error
|
65
|
+
end
|
66
|
+
rescue => error
|
67
|
+
send_text 'You just broke something. Please tell the admins about this.'
|
68
|
+
send_text error.message
|
69
|
+
end
|
70
|
+
|
71
|
+
# A whimsical way of telling the user they input an unknown /
|
72
|
+
# unauthorized command. Override this if you want a '404 page' on
|
73
|
+
# your controller
|
74
|
+
def send_error
|
75
|
+
send_text funny_responses.sample
|
76
|
+
end
|
77
|
+
|
78
|
+
# Parameterless method used for generating quirky messages when the
|
79
|
+
# user attempts to use a non-existant / forbidden controller action.
|
80
|
+
# Returns String.
|
81
|
+
def funny_responses
|
82
|
+
[
|
83
|
+
'Huh?',
|
84
|
+
"What's that you say?",
|
85
|
+
'come again?',
|
86
|
+
"Sorry, I don't know that command."
|
87
|
+
]
|
88
|
+
end
|
89
|
+
|
90
|
+
# Dynamically generated list of user accesible controller methods. By default
|
91
|
+
# (and when used in conjugation with +super+ in derived classes), will return
|
92
|
+
# ['quit'] as its only accessible method. Returns Array of Strings.
|
93
|
+
def allowed_methods
|
94
|
+
['quit']
|
95
|
+
end
|
96
|
+
|
97
|
+
# Transfers control from on controller to another. Eg: Move from login
|
98
|
+
# controler to main game.
|
99
|
+
def transfer_to(controller_name)
|
100
|
+
@session.controller = controller_name.new(@session)
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# This is a default implementation and entry point for all Mud activity.
|
2
|
+
# Override this controller in Your implementation. See AbstractController for
|
3
|
+
# better documentation.
|
4
|
+
class MudServer::DefaultController < MudServer::AbstractController
|
5
|
+
def on_start
|
6
|
+
send_text 'It works! Type `quit` to end'
|
7
|
+
end
|
8
|
+
end
|
data/lib/mud_server.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
#The server class creates a single instance of a mud server.
|
2
|
+
class MudServer
|
3
|
+
|
4
|
+
attr_accessor :connection_pool, :tcp_socket,
|
5
|
+
:connection_acceptor, :port, :ip, :environment
|
6
|
+
|
7
|
+
def initialize(ip = "0.0.0.0", port = 4000, environment = 'development')
|
8
|
+
bootstrap_settings(ip, port, environment)
|
9
|
+
end
|
10
|
+
|
11
|
+
def bootstrap_settings(ip, port, environment)
|
12
|
+
@port = port
|
13
|
+
@ip = ip
|
14
|
+
@environment = environment
|
15
|
+
@connection_pool = [] # This is where we keep reference to all game
|
16
|
+
# connections
|
17
|
+
end
|
18
|
+
|
19
|
+
def start
|
20
|
+
@tcp_socket = TCPServer.new @ip , @port
|
21
|
+
@connection_acceptor = Thread.new do
|
22
|
+
while connection = @tcp_socket.accept
|
23
|
+
@connection_pool << MudServer::Session.new(connection)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
return true
|
27
|
+
end
|
28
|
+
|
29
|
+
# You probably won't need this one in production, but it's a must for testing.
|
30
|
+
def stop
|
31
|
+
@tcp_socket.close
|
32
|
+
@connection_acceptor.kill
|
33
|
+
@connection_acceptor = nil
|
34
|
+
return true
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
data/lib/session.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
class MudServer::Session
|
2
|
+
|
3
|
+
attr_accessor :connection, :ip_addr, :input_thread, :controller
|
4
|
+
|
5
|
+
def initialize(connection, controller = MudServer::DefaultController)
|
6
|
+
bootstrap_settings(connection, controller)
|
7
|
+
start
|
8
|
+
end
|
9
|
+
|
10
|
+
def bootstrap_settings(connection, controller)
|
11
|
+
@connection = connection
|
12
|
+
@ip_addr = @connection.peeraddr[-1]
|
13
|
+
@controller = controller.new(self)
|
14
|
+
end
|
15
|
+
|
16
|
+
def start
|
17
|
+
@input_thread = Thread.new(@connection) do |client|
|
18
|
+
while (client_input = client.gets.chomp)
|
19
|
+
@controller.get_text client_input
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-mud
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rick Carlino
|
@@ -59,6 +59,10 @@ extensions: []
|
|
59
59
|
extra_rdoc_files: []
|
60
60
|
files:
|
61
61
|
- lib/ruby_mud.rb
|
62
|
+
- lib/mud_server.rb
|
63
|
+
- lib/default_controller.rb
|
64
|
+
- lib/abstract_controller.rb
|
65
|
+
- lib/session.rb
|
62
66
|
homepage: https://github.com/rickcarlino/mud
|
63
67
|
licenses:
|
64
68
|
- MIT
|