mumble-ruby 0.0.3 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/LICENSE.txt +22 -0
- data/README.rdoc +3 -2
- data/lib/mumble-ruby.rb +1 -1
- data/lib/mumble-ruby/audio_stream.rb +6 -10
- data/lib/mumble-ruby/client.rb +30 -24
- data/lib/mumble-ruby/connection.rb +3 -3
- data/lib/mumble-ruby/messages.rb +28 -5
- data/lib/mumble-ruby/mumble.proto +17 -2
- data/lib/mumble-ruby/version.rb +1 -1
- data/mumble-ruby.gemspec +2 -1
- metadata +48 -25
- data/.rvmrc +0 -1
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 79af7c6bca2313c1ad4cb6f2d0efd7e51c87bdbd
|
4
|
+
data.tar.gz: a0404c3814bccddf1c69a31c5f81dab76fc1d9d4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 187c1eef9e026080cec54984d8ba6c9159c31b8a28f23c31a53e391771b25b72b0dbcff29e79c2976e7918d97d6ab58cfd07c9ac167260baf9743fee51b46339
|
7
|
+
data.tar.gz: c6838e53b31f8bd390acc090a5c96bbfb32071861e1d80317ee7c013d5c140d17cfee86e671e0722c3aae798393336cf47d3bc260ec741990ed0117eb2836c44
|
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
mumble_ruby_gem
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby-2.1.0
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Matthew Perry
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
CHANGED
@@ -14,8 +14,9 @@ There is huge room for improvement in this library and I am willing to accept al
|
|
14
14
|
|
15
15
|
== REQUIREMENTS:
|
16
16
|
|
17
|
-
* Ruby >= 1.
|
18
|
-
*
|
17
|
+
* Ruby >= 2.1.0
|
18
|
+
* OPUS Audio Codec
|
19
|
+
* Murur server > 1.2.4
|
19
20
|
|
20
21
|
== BASIC USAGE:
|
21
22
|
|
data/lib/mumble-ruby.rb
CHANGED
@@ -9,8 +9,7 @@ module Mumble
|
|
9
9
|
@file = File.open(file, 'rb')
|
10
10
|
@conn = connection
|
11
11
|
@seq = 0
|
12
|
-
@
|
13
|
-
@compressed_size = [@encoder.vbr_rate / 800, 127].min
|
12
|
+
@compressed_size = 960
|
14
13
|
@pds = PacketDataStream.new
|
15
14
|
@volume = 1.0
|
16
15
|
|
@@ -47,16 +46,13 @@ module Mumble
|
|
47
46
|
@seq %= 1000000 # Keep sequence number reasonable for long runs
|
48
47
|
|
49
48
|
@pds.rewind
|
50
|
-
@seq +=
|
49
|
+
@seq += 1
|
51
50
|
@pds.put_int @seq
|
52
51
|
|
53
|
-
@
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
@pds.append len
|
58
|
-
@pds.append_block frame
|
59
|
-
end
|
52
|
+
frame = @queue.pop
|
53
|
+
len = frame.size
|
54
|
+
@pds.put_int len
|
55
|
+
@pds.append_block frame
|
60
56
|
|
61
57
|
size = @pds.size
|
62
58
|
@pds.rewind
|
data/lib/mumble-ruby/client.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
require 'thread'
|
2
|
+
require 'hashie'
|
2
3
|
|
3
4
|
module Mumble
|
4
5
|
class ChannelNotFound < StandardError; end
|
5
6
|
class UserNotFound < StandardError; end
|
6
7
|
class NoSupportedCodec < StandardError; end
|
7
8
|
|
8
|
-
CODEC_ALPHA = 0
|
9
|
-
CODEC_BETA = 3
|
10
|
-
|
11
9
|
class Client
|
12
10
|
attr_reader :host, :port, :username, :password, :users, :channels
|
13
11
|
|
14
|
-
|
12
|
+
CODEC_OPUS = 4
|
13
|
+
|
14
|
+
def initialize(host, port=64738, username="RubyClient", password="")
|
15
15
|
@host = host
|
16
16
|
@port = port
|
17
17
|
@username = username
|
@@ -41,11 +41,11 @@ module Mumble
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def me
|
44
|
-
|
44
|
+
users[@session]
|
45
45
|
end
|
46
46
|
|
47
47
|
def current_channel
|
48
|
-
|
48
|
+
channels[me.channel_id]
|
49
49
|
end
|
50
50
|
|
51
51
|
def stream_raw_audio(file)
|
@@ -97,15 +97,16 @@ module Mumble
|
|
97
97
|
end
|
98
98
|
|
99
99
|
def find_user(name)
|
100
|
-
|
100
|
+
users.values.find { |u| u.name == name }
|
101
101
|
end
|
102
102
|
|
103
103
|
def find_channel(name)
|
104
|
-
|
104
|
+
channels.values.find { |c| c.name == name }
|
105
105
|
end
|
106
106
|
|
107
107
|
private
|
108
108
|
def spawn_thread(sym)
|
109
|
+
Thread.abort_on_exception = true
|
109
110
|
Thread.new { loop { send sym } }
|
110
111
|
end
|
111
112
|
|
@@ -129,31 +130,39 @@ module Mumble
|
|
129
130
|
@session = message.session
|
130
131
|
end
|
131
132
|
on_channel_state do |message|
|
132
|
-
|
133
|
+
if channel = channels[message.channel_id]
|
134
|
+
channel.merge! message.to_hash
|
135
|
+
else
|
136
|
+
channels[message.channel_id] = Hashie::Mash.new(message.to_hash)
|
137
|
+
end
|
133
138
|
end
|
134
139
|
on_channel_remove do |message|
|
135
|
-
|
140
|
+
channels.delete(message.channel_id)
|
136
141
|
end
|
137
142
|
on_user_state do |message|
|
138
|
-
|
143
|
+
if user = users[message.session]
|
144
|
+
user.merge! message.to_hash
|
145
|
+
else
|
146
|
+
users[message.session] = Hashie::Mash.new(message.to_hash)
|
147
|
+
end
|
139
148
|
end
|
140
149
|
on_user_remove do |message|
|
141
|
-
|
150
|
+
users.delete(message.session)
|
142
151
|
end
|
143
152
|
on_codec_version do |message|
|
144
|
-
codec_negotiation(message
|
153
|
+
codec_negotiation(message)
|
145
154
|
end
|
146
155
|
end
|
147
156
|
|
148
157
|
def create_encoder
|
149
|
-
@encoder =
|
150
|
-
@encoder.
|
151
|
-
@encoder.
|
158
|
+
@encoder = Opus::Encoder.new 48000, 480, 1
|
159
|
+
@encoder.vbr_rate = 0 # CBR
|
160
|
+
@encoder.bitrate = 32000 # 32 kbit/s
|
152
161
|
end
|
153
162
|
|
154
163
|
def version_exchange
|
155
164
|
send_version({
|
156
|
-
version: encode_version(1, 2,
|
165
|
+
version: encode_version(1, 2, 5),
|
157
166
|
release: "mumble-ruby #{Mumble::VERSION}",
|
158
167
|
os: %x{uname -o}.strip,
|
159
168
|
os_version: %x{uname -v}.strip
|
@@ -164,15 +173,12 @@ module Mumble
|
|
164
173
|
send_authenticate({
|
165
174
|
username: @username,
|
166
175
|
password: @password,
|
167
|
-
|
176
|
+
opus: true
|
168
177
|
})
|
169
178
|
end
|
170
179
|
|
171
|
-
def codec_negotiation(
|
172
|
-
@codec =
|
173
|
-
when alpha then Mumble::CODEC_ALPHA
|
174
|
-
when beta then Mumble::CODEC_BETA
|
175
|
-
end
|
180
|
+
def codec_negotiation(message)
|
181
|
+
@codec = CODEC_OPUS if message.opus
|
176
182
|
end
|
177
183
|
|
178
184
|
def channel_id(channel)
|
@@ -191,7 +197,7 @@ module Mumble
|
|
191
197
|
|
192
198
|
def user_session(user)
|
193
199
|
id = case user
|
194
|
-
when Messages::
|
200
|
+
when Messages::UserState
|
195
201
|
user.session
|
196
202
|
when Fixnum
|
197
203
|
user
|
@@ -11,7 +11,7 @@ module Mumble
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def connect
|
14
|
-
context = OpenSSL::SSL::SSLContext.new
|
14
|
+
context = OpenSSL::SSL::SSLContext.new(:TLSv1)
|
15
15
|
context.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
16
16
|
tcp_sock = TCPSocket.new @host, @port
|
17
17
|
@sock = OpenSSL::SSL::SSLSocket.new tcp_sock, context
|
@@ -53,12 +53,12 @@ module Mumble
|
|
53
53
|
private
|
54
54
|
def send_data(data)
|
55
55
|
@write_lock.synchronize do
|
56
|
-
@sock.
|
56
|
+
@sock.write data
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
60
|
def read_data(len)
|
61
|
-
@sock.
|
61
|
+
@sock.read len
|
62
62
|
end
|
63
63
|
|
64
64
|
def message(obj)
|
data/lib/mumble-ruby/messages.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
### Generated by rprotoc. DO NOT EDIT!
|
2
|
-
### <proto file:
|
2
|
+
### <proto file: mumble.proto>
|
3
3
|
|
4
4
|
require 'protobuf/message/message'
|
5
5
|
require 'protobuf/message/enum'
|
@@ -8,7 +8,7 @@ require 'protobuf/message/extend'
|
|
8
8
|
|
9
9
|
module Mumble
|
10
10
|
module Messages
|
11
|
-
::Protobuf::OPTIONS[:optimize_for] = :SPEED
|
11
|
+
::Protobuf::OPTIONS[:"optimize_for"] = :SPEED
|
12
12
|
HEADER_FORMAT = "nN"
|
13
13
|
|
14
14
|
@@sym_to_type = {
|
@@ -36,7 +36,8 @@ module Mumble
|
|
36
36
|
codec_version: 21,
|
37
37
|
user_stats: 22,
|
38
38
|
request_blob: 23,
|
39
|
-
server_config: 24
|
39
|
+
server_config: 24,
|
40
|
+
suggest_config: 25
|
40
41
|
}
|
41
42
|
|
42
43
|
@@type_to_sym = @@sym_to_type.invert
|
@@ -78,6 +79,7 @@ module Mumble
|
|
78
79
|
optional :string, :password, 2
|
79
80
|
repeated :string, :tokens, 3
|
80
81
|
repeated :int32, :celt_versions, 4
|
82
|
+
optional :bool, :opus, 5, :default => false
|
81
83
|
end
|
82
84
|
class Ping < ::Protobuf::Message
|
83
85
|
defined_in __FILE__
|
@@ -123,6 +125,12 @@ module Mumble
|
|
123
125
|
optional :uint32, :max_bandwidth, 2
|
124
126
|
optional :string, :welcome_text, 3
|
125
127
|
optional :uint64, :permissions, 4
|
128
|
+
end
|
129
|
+
class SuggestConfig < ::Protobuf::Message
|
130
|
+
defined_in __FILE__
|
131
|
+
optional :uint32, :version, 1
|
132
|
+
optional :bool, :positional, 2
|
133
|
+
optional :bool, :push_to_talk, 3
|
126
134
|
end
|
127
135
|
class ChannelRemove < ::Protobuf::Message
|
128
136
|
defined_in __FILE__
|
@@ -207,6 +215,7 @@ module Mumble
|
|
207
215
|
MissingCertificate = value(:MissingCertificate, 7)
|
208
216
|
UserName = value(:UserName, 8)
|
209
217
|
ChannelFull = value(:ChannelFull, 9)
|
218
|
+
NestingLimit = value(:NestingLimit, 10)
|
210
219
|
end
|
211
220
|
optional :uint32, :permission, 1
|
212
221
|
optional :uint32, :channel_id, 2
|
@@ -254,7 +263,7 @@ module Mumble
|
|
254
263
|
optional :bytes, :client_nonce, 2
|
255
264
|
optional :bytes, :server_nonce, 3
|
256
265
|
end
|
257
|
-
class
|
266
|
+
class ContextActionModify < ::Protobuf::Message
|
258
267
|
defined_in __FILE__
|
259
268
|
class Context < ::Protobuf::Enum
|
260
269
|
defined_in __FILE__
|
@@ -262,9 +271,15 @@ module Mumble
|
|
262
271
|
Channel = value(:Channel, 2)
|
263
272
|
User = value(:User, 4)
|
264
273
|
end
|
274
|
+
class Operation < ::Protobuf::Enum
|
275
|
+
defined_in __FILE__
|
276
|
+
Add = value(:Add, 0)
|
277
|
+
Remove = value(:Remove, 1)
|
278
|
+
end
|
265
279
|
required :string, :action, 1
|
266
|
-
|
280
|
+
optional :string, :text, 2
|
267
281
|
optional :uint32, :context, 3
|
282
|
+
optional :Operation, :operation, 4
|
268
283
|
end
|
269
284
|
class ContextAction < ::Protobuf::Message
|
270
285
|
defined_in __FILE__
|
@@ -305,6 +320,7 @@ module Mumble
|
|
305
320
|
required :int32, :alpha, 1
|
306
321
|
required :int32, :beta, 2
|
307
322
|
required :bool, :prefer_alpha, 3, :default => true
|
323
|
+
optional :bool, :opus, 4, :default => false
|
308
324
|
end
|
309
325
|
class UserStats < ::Protobuf::Message
|
310
326
|
defined_in __FILE__
|
@@ -333,6 +349,13 @@ module Mumble
|
|
333
349
|
optional :uint32, :onlinesecs, 16
|
334
350
|
optional :uint32, :idlesecs, 17
|
335
351
|
optional :bool, :strong_certificate, 18, :default => false
|
352
|
+
optional :bool, :opus, 19, :default => false
|
353
|
+
end
|
354
|
+
class SuggestConfig < ::Protobuf::Message
|
355
|
+
defined_in __FILE__
|
356
|
+
optional :uint32, :version, 1
|
357
|
+
optional :bool, :positional, 2
|
358
|
+
optional :bool, :push_to_talk, 3
|
336
359
|
end
|
337
360
|
class RequestBlob < ::Protobuf::Message
|
338
361
|
defined_in __FILE__
|
@@ -18,6 +18,7 @@ message Authenticate {
|
|
18
18
|
optional string password = 2;
|
19
19
|
repeated string tokens = 3;
|
20
20
|
repeated int32 celt_versions = 4;
|
21
|
+
optional bool opus = 5 [default = false];
|
21
22
|
}
|
22
23
|
|
23
24
|
message Ping {
|
@@ -144,6 +145,7 @@ message PermissionDenied {
|
|
144
145
|
MissingCertificate = 7;
|
145
146
|
UserName = 8;
|
146
147
|
ChannelFull = 9;
|
148
|
+
NestingLimit = 10;
|
147
149
|
}
|
148
150
|
optional uint32 permission = 1;
|
149
151
|
optional uint32 channel_id = 2;
|
@@ -190,15 +192,20 @@ message CryptSetup {
|
|
190
192
|
optional bytes server_nonce = 3;
|
191
193
|
}
|
192
194
|
|
193
|
-
message
|
195
|
+
message ContextActionModify {
|
194
196
|
enum Context {
|
195
197
|
Server = 0x01;
|
196
198
|
Channel = 0x02;
|
197
199
|
User = 0x04;
|
198
200
|
}
|
201
|
+
enum Operation {
|
202
|
+
Add = 0;
|
203
|
+
Remove = 1;
|
204
|
+
}
|
199
205
|
required string action = 1;
|
200
|
-
|
206
|
+
optional string text = 2;
|
201
207
|
optional uint32 context = 3;
|
208
|
+
optional Operation operation = 4;
|
202
209
|
}
|
203
210
|
|
204
211
|
message ContextAction {
|
@@ -237,6 +244,7 @@ message CodecVersion {
|
|
237
244
|
required int32 alpha = 1;
|
238
245
|
required int32 beta = 2;
|
239
246
|
required bool prefer_alpha = 3 [default = true];
|
247
|
+
optional bool opus = 4 [default = false];
|
240
248
|
}
|
241
249
|
|
242
250
|
message UserStats {
|
@@ -267,6 +275,13 @@ message UserStats {
|
|
267
275
|
optional uint32 onlinesecs = 16;
|
268
276
|
optional uint32 idlesecs = 17;
|
269
277
|
optional bool strong_certificate = 18 [default = false];
|
278
|
+
optional bool opus = 19 [default = false];
|
279
|
+
}
|
280
|
+
|
281
|
+
message SuggestConfig {
|
282
|
+
optional uint32 version = 1;
|
283
|
+
optional bool positional = 2;
|
284
|
+
optional bool push_to_talk = 3;
|
270
285
|
}
|
271
286
|
|
272
287
|
message RequestBlob {
|
data/lib/mumble-ruby/version.rb
CHANGED
data/mumble-ruby.gemspec
CHANGED
metadata
CHANGED
@@ -1,49 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mumble-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Matthew Perry
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-02-23 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: activesupport
|
16
|
-
requirement:
|
17
|
-
none: false
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
|
-
version_requirements:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
25
27
|
- !ruby/object:Gem::Dependency
|
26
|
-
name:
|
27
|
-
requirement:
|
28
|
-
none: false
|
28
|
+
name: ruby_protobuf
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
29
30
|
requirements:
|
30
|
-
- -
|
31
|
+
- - ">="
|
31
32
|
- !ruby/object:Gem::Version
|
32
33
|
version: '0'
|
33
34
|
type: :runtime
|
34
35
|
prerelease: false
|
35
|
-
version_requirements:
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
36
41
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
38
|
-
requirement:
|
39
|
-
|
42
|
+
name: hashie
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: opus-ruby
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
40
58
|
requirements:
|
41
|
-
- -
|
59
|
+
- - ">="
|
42
60
|
- !ruby/object:Gem::Version
|
43
61
|
version: '0'
|
44
62
|
type: :runtime
|
45
63
|
prerelease: false
|
46
|
-
version_requirements:
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
47
69
|
description: Ruby API for interacting with a mumble server
|
48
70
|
email:
|
49
71
|
- perrym5@rpi.edu
|
@@ -51,9 +73,11 @@ executables: []
|
|
51
73
|
extensions: []
|
52
74
|
extra_rdoc_files: []
|
53
75
|
files:
|
54
|
-
- .gitignore
|
55
|
-
- .
|
76
|
+
- ".gitignore"
|
77
|
+
- ".ruby-gemset"
|
78
|
+
- ".ruby-version"
|
56
79
|
- Gemfile
|
80
|
+
- LICENSE.txt
|
57
81
|
- README.rdoc
|
58
82
|
- Rakefile
|
59
83
|
- lib/mumble-ruby.rb
|
@@ -67,26 +91,25 @@ files:
|
|
67
91
|
- mumble-ruby.gemspec
|
68
92
|
homepage: http://www.github.com/perrym5/mumble-ruby
|
69
93
|
licenses: []
|
94
|
+
metadata: {}
|
70
95
|
post_install_message:
|
71
96
|
rdoc_options: []
|
72
97
|
require_paths:
|
73
98
|
- lib
|
74
99
|
required_ruby_version: !ruby/object:Gem::Requirement
|
75
|
-
none: false
|
76
100
|
requirements:
|
77
|
-
- -
|
101
|
+
- - ">="
|
78
102
|
- !ruby/object:Gem::Version
|
79
103
|
version: '0'
|
80
104
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
105
|
requirements:
|
83
|
-
- -
|
106
|
+
- - ">="
|
84
107
|
- !ruby/object:Gem::Version
|
85
108
|
version: '0'
|
86
109
|
requirements: []
|
87
110
|
rubyforge_project:
|
88
|
-
rubygems_version:
|
111
|
+
rubygems_version: 2.2.2
|
89
112
|
signing_key:
|
90
|
-
specification_version:
|
113
|
+
specification_version: 4
|
91
114
|
summary: Implements the mumble VOIP protocol in ruby for more easily writing clients.
|
92
115
|
test_files: []
|
data/.rvmrc
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
rvm use --create ruby-1.9.3-p0@mumble_ruby_gem
|