mumble-ruby 0.0.3 → 1.0.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.
- 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
|