murmur 0.0.1
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/.gitignore +4 -0
- data/Gemfile +3 -0
- data/README.md +62 -0
- data/Rakefile +1 -0
- data/lib/murmur.rb +22 -0
- data/lib/murmur/channel.rb +87 -0
- data/lib/murmur/ice_interface.rb +94 -0
- data/lib/murmur/server.rb +111 -0
- data/lib/murmur/user.rb +119 -0
- data/lib/murmur/version.rb +3 -0
- data/murmur.gemspec +21 -0
- data/vendor/ice/Murmur.ice +836 -0
- data/vendor/ice/Murmur.rb +1808 -0
- metadata +84 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cf54fdf3d0238dca3cc88e4ffd0663fc464c7e5c
|
4
|
+
data.tar.gz: 153bd7feb7f55fa3f32b4ab1da9539156b97dc53
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d9b2c535c51452eac44fa62e3d4ed26158b39ca68d1b558163fac66c282ae362755c62f8c6c7fdbd21174494611adebe69c5b789691ffecaf3c81164d6b0bc58
|
7
|
+
data.tar.gz: f47502072b62d787fc8664f8132e2636c5c0e171423f06197353d3994d49f2ed1418e4897c15060de451e144026ee2b2267af4c73a35bb805356db107fb4484b
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
# Murmur
|
2
|
+
|
3
|
+
A ruby client for controlling and querying the Mumble server (Murmur)
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Install it from RubyGems:
|
8
|
+
|
9
|
+
```
|
10
|
+
gem install murmur
|
11
|
+
```
|
12
|
+
|
13
|
+
Or add it to a Gemfile:
|
14
|
+
|
15
|
+
```
|
16
|
+
gem 'murmur'
|
17
|
+
```
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
Configuration:
|
22
|
+
|
23
|
+
```
|
24
|
+
require 'murmur'
|
25
|
+
|
26
|
+
Murmur.client(
|
27
|
+
:host => '127.0.0.1', # The host of the Murmur server.
|
28
|
+
:port => '6502', # The port of the Murmur server.
|
29
|
+
:glacier_user => '', # The user (if using Glacier2)
|
30
|
+
:glacier_pass => '', # The password (if using Glacier2)
|
31
|
+
:ice_secret => '') # The Ice secret.
|
32
|
+
```
|
33
|
+
|
34
|
+
Examples:
|
35
|
+
|
36
|
+
```
|
37
|
+
# Get a server
|
38
|
+
Murmur.server 1
|
39
|
+
|
40
|
+
# Create a new server
|
41
|
+
Murmur.new_server(:registername => "Server name")
|
42
|
+
|
43
|
+
# Get the channels of a server
|
44
|
+
server = Murmur.server 1
|
45
|
+
server.channels
|
46
|
+
|
47
|
+
# Get a specific channel of a server
|
48
|
+
server = Murmur.server 1
|
49
|
+
server.channel 1
|
50
|
+
|
51
|
+
# Change the name of a channel
|
52
|
+
server = Murmur.server 1
|
53
|
+
channel = server.channel 1
|
54
|
+
channel.name = "New name!"
|
55
|
+
|
56
|
+
# Get the clients of a server
|
57
|
+
server = Murmur.server 1
|
58
|
+
users = server.users
|
59
|
+
```
|
60
|
+
|
61
|
+
The #raw function on Murmur::API objects will return the raw Murmur object, allowing calling of unimplemented functions.
|
62
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/lib/murmur.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'murmur/version'
|
2
|
+
require 'murmur/ice_interface'
|
3
|
+
require 'murmur/server'
|
4
|
+
require 'murmur/channel'
|
5
|
+
require 'murmur/user'
|
6
|
+
|
7
|
+
module Murmur
|
8
|
+
|
9
|
+
def self.client(options={})
|
10
|
+
@client = Murmur::API::Meta.new(options)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.method_missing(method, *args, &block)
|
14
|
+
return super unless @client.respond_to?(method)
|
15
|
+
@client.send(method, *args, &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.respond_to?(method)
|
19
|
+
return @client.respond_to?(method) || super
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module Murmur
|
2
|
+
module API
|
3
|
+
class Channel
|
4
|
+
|
5
|
+
def initialize(host, meta, server, channel)
|
6
|
+
@host = host
|
7
|
+
@meta = meta
|
8
|
+
@server = server
|
9
|
+
@channel = channel
|
10
|
+
end
|
11
|
+
|
12
|
+
def id
|
13
|
+
@channel.id
|
14
|
+
end
|
15
|
+
|
16
|
+
def name
|
17
|
+
@channel.name
|
18
|
+
end
|
19
|
+
|
20
|
+
def name=(name)
|
21
|
+
@channel.name = name
|
22
|
+
update
|
23
|
+
end
|
24
|
+
|
25
|
+
def server
|
26
|
+
@server
|
27
|
+
end
|
28
|
+
|
29
|
+
def parent
|
30
|
+
@server.channel(@channel.parent)
|
31
|
+
end
|
32
|
+
|
33
|
+
def parent=(id)
|
34
|
+
@channel.parent = id
|
35
|
+
update
|
36
|
+
end
|
37
|
+
|
38
|
+
def links
|
39
|
+
@channel.links
|
40
|
+
end
|
41
|
+
|
42
|
+
def temporary?
|
43
|
+
@channel.temporary
|
44
|
+
end
|
45
|
+
alias :temporary :temporary?
|
46
|
+
|
47
|
+
def temporary=(temp)
|
48
|
+
@channel.temporary = temp
|
49
|
+
update
|
50
|
+
end
|
51
|
+
|
52
|
+
def description
|
53
|
+
@channel.description
|
54
|
+
end
|
55
|
+
|
56
|
+
def description=(description)
|
57
|
+
@channel.description = description
|
58
|
+
update
|
59
|
+
end
|
60
|
+
|
61
|
+
def position
|
62
|
+
@channel.position
|
63
|
+
end
|
64
|
+
|
65
|
+
def position=(id)
|
66
|
+
@channel.position = id
|
67
|
+
update
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def update
|
73
|
+
channel_state = @server.getChannelState(id)
|
74
|
+
|
75
|
+
["name", "description", "temporary", "position"].each do |func|
|
76
|
+
channel_state.send("#{func}=", send(func))
|
77
|
+
end
|
78
|
+
|
79
|
+
# Set 'parent' normally.
|
80
|
+
channel_state.parent = parent.id
|
81
|
+
|
82
|
+
@server.setChannelState(channel_state)
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'Glacier2'
|
2
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), "../../vendor/ice/Murmur.rb")
|
3
|
+
require 'murmur/server'
|
4
|
+
|
5
|
+
module Murmur
|
6
|
+
module API
|
7
|
+
class Meta
|
8
|
+
|
9
|
+
def initialize(options = {})
|
10
|
+
# Default options
|
11
|
+
options = {:host => '127.0.0.1', :port => 6502}.merge(options)
|
12
|
+
|
13
|
+
if options[:ice_secret]
|
14
|
+
props = ::Ice::createProperties
|
15
|
+
props.setProperty "Ice.ImplicitContext", "Shared"
|
16
|
+
props.setProperty "Ice.Default.EncodingVersion", "1.0"
|
17
|
+
|
18
|
+
ice_init_data = ::Ice::InitializationData.new
|
19
|
+
ice_init_data.properties = props
|
20
|
+
|
21
|
+
ice_context = ::Ice::initialize ice_init_data
|
22
|
+
ice_context.getImplicitContext.put("secret", options[:ice_secret])
|
23
|
+
else
|
24
|
+
props = ::Ice::createProperties
|
25
|
+
props.setProperty "Ice.Default.EncodingVersion", "1.0"
|
26
|
+
|
27
|
+
ice_init_data = ::Ice::InitializationData.new
|
28
|
+
ice_init_data.properties = props
|
29
|
+
|
30
|
+
ice_context = ::Ice::initialize ice_init_data
|
31
|
+
end
|
32
|
+
|
33
|
+
if options[:glacier_host]
|
34
|
+
prx = ice_context.stringToProxy("Glacier2/router:tcp -h #{options[:glacier_host]} -p #{options[:glacier_port]}")
|
35
|
+
@router = ::Glacier2::RouterPrx::uncheckedCast(prx).ice_router(nil)
|
36
|
+
@session = @router.createSession(options[:glacier_user], options[:glacier_pass])
|
37
|
+
end
|
38
|
+
|
39
|
+
conn = "tcp -h #{options[:host]} -p #{options[:port]}"
|
40
|
+
proxy = ice_context.stringToProxy("Meta:#{conn}")
|
41
|
+
@meta = add_proxy_router(Murmur::MetaPrx::checkedCast(proxy))
|
42
|
+
raise "Invalid proxy" unless @meta
|
43
|
+
|
44
|
+
@servers = {}
|
45
|
+
end
|
46
|
+
|
47
|
+
def destroy
|
48
|
+
begin
|
49
|
+
@router.destroySession @session unless @router.nil?
|
50
|
+
rescue ::Ice::ConnectionLostException
|
51
|
+
end
|
52
|
+
|
53
|
+
nil
|
54
|
+
end
|
55
|
+
|
56
|
+
def add_proxy_router(prx)
|
57
|
+
@router ? prx.ice_router(@router) : prx
|
58
|
+
end
|
59
|
+
|
60
|
+
def server(id)
|
61
|
+
@servers[id] ||= Server.new(self, @meta, {:id => id})
|
62
|
+
end
|
63
|
+
|
64
|
+
def uncache_server(id)
|
65
|
+
@servers[id] = nil
|
66
|
+
end
|
67
|
+
|
68
|
+
def servers
|
69
|
+
@meta.send(:getAllServers).collect do |server|
|
70
|
+
server = add_proxy_router server
|
71
|
+
@servers[server.id] ||= Server.new(self, @meta, {:interface => server})
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def new_server_interface
|
76
|
+
server = @meta.newServer
|
77
|
+
end
|
78
|
+
|
79
|
+
def new_server(options = {})
|
80
|
+
Server.new(self, @meta, options)
|
81
|
+
end
|
82
|
+
|
83
|
+
def validate
|
84
|
+
@meta.getVersion
|
85
|
+
true
|
86
|
+
end
|
87
|
+
|
88
|
+
def meta
|
89
|
+
@meta
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'murmur/channel'
|
2
|
+
require 'murmur/user'
|
3
|
+
|
4
|
+
module Murmur
|
5
|
+
module API
|
6
|
+
class Server
|
7
|
+
|
8
|
+
def initialize(host, meta, options)
|
9
|
+
@host = host
|
10
|
+
@meta = meta
|
11
|
+
|
12
|
+
if !options[:id] and !options[:interface]
|
13
|
+
options.delete :id
|
14
|
+
options.delete :interface
|
15
|
+
|
16
|
+
server = @host.new_server_interface
|
17
|
+
|
18
|
+
@interface = host.add_proxy_router(server)
|
19
|
+
|
20
|
+
options.each do |key, value|
|
21
|
+
setConf(key, value)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
@interface = @interface || options[:interface] || begin
|
26
|
+
server = @meta.getServer(options[:id])
|
27
|
+
raise ::Murmur::Ice::InvalidServerException if server.nil?
|
28
|
+
host.add_proxy_router(server)
|
29
|
+
end
|
30
|
+
|
31
|
+
@channels = {}
|
32
|
+
@users = {}
|
33
|
+
end
|
34
|
+
|
35
|
+
def id
|
36
|
+
@interface.id
|
37
|
+
end
|
38
|
+
|
39
|
+
def running?
|
40
|
+
@interface.isRunning
|
41
|
+
end
|
42
|
+
|
43
|
+
def channel(id)
|
44
|
+
channels
|
45
|
+
|
46
|
+
@channels[id]
|
47
|
+
end
|
48
|
+
|
49
|
+
def channels
|
50
|
+
@channels = {}
|
51
|
+
@interface.getChannels.each do |_, channel|
|
52
|
+
@channels[channel.id] = Channel.new(@host, @meta, self, channel)
|
53
|
+
end
|
54
|
+
@channels
|
55
|
+
end
|
56
|
+
|
57
|
+
def users
|
58
|
+
@users = {}
|
59
|
+
@interface.getUsers.each do |_, user|
|
60
|
+
@users[user.session] = User.new(@host, @meta, self, user)
|
61
|
+
end
|
62
|
+
@users
|
63
|
+
end
|
64
|
+
|
65
|
+
def user(session)
|
66
|
+
users
|
67
|
+
|
68
|
+
@users[:session]
|
69
|
+
end
|
70
|
+
|
71
|
+
def config
|
72
|
+
@config = @meta.getDefaultConf.merge(@interface.getAllConf)
|
73
|
+
end
|
74
|
+
|
75
|
+
def destroy!
|
76
|
+
@interface.stop if running?
|
77
|
+
@host.uncache_server id
|
78
|
+
@interface.delete
|
79
|
+
end
|
80
|
+
alias :delete :destroy!
|
81
|
+
|
82
|
+
def restart!
|
83
|
+
@interface.stop if running?
|
84
|
+
@interface.start
|
85
|
+
end
|
86
|
+
|
87
|
+
def [](key)
|
88
|
+
key = key.to_s
|
89
|
+
config[key]
|
90
|
+
end
|
91
|
+
|
92
|
+
def []=(key, val)
|
93
|
+
key - key.to_s
|
94
|
+
@interface.setConf(key, val.to_s)
|
95
|
+
@config = nil
|
96
|
+
end
|
97
|
+
|
98
|
+
def setConf(key, val)
|
99
|
+
key = key.to_s
|
100
|
+
self[key] = val
|
101
|
+
end
|
102
|
+
|
103
|
+
def method_missing(method, *args)
|
104
|
+
method = method.to_s
|
105
|
+
method.gsub!(/_([a-z])/) { $1.upcase }
|
106
|
+
ret = @interface.send method, *args
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
data/lib/murmur/user.rb
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
module Murmur
|
2
|
+
module API
|
3
|
+
class User
|
4
|
+
|
5
|
+
def initialize(host, meta, server, user)
|
6
|
+
@host = host
|
7
|
+
@meta = meta
|
8
|
+
@server = server
|
9
|
+
@user = user
|
10
|
+
end
|
11
|
+
|
12
|
+
def session
|
13
|
+
@user.session
|
14
|
+
end
|
15
|
+
alias :id :session
|
16
|
+
|
17
|
+
def userid
|
18
|
+
@user.userid
|
19
|
+
end
|
20
|
+
|
21
|
+
def muted?
|
22
|
+
@user.mute
|
23
|
+
end
|
24
|
+
|
25
|
+
def deafened?
|
26
|
+
@user.deaf
|
27
|
+
end
|
28
|
+
|
29
|
+
def suppressed?
|
30
|
+
@user.suppress
|
31
|
+
end
|
32
|
+
|
33
|
+
def priorityspeaker?
|
34
|
+
@user.prioritySpeaker
|
35
|
+
end
|
36
|
+
|
37
|
+
def clientmuted?
|
38
|
+
@user.selfMute
|
39
|
+
end
|
40
|
+
|
41
|
+
def clientdeafened?
|
42
|
+
@user.selfDeaf
|
43
|
+
end
|
44
|
+
|
45
|
+
def recording?
|
46
|
+
@user.recording
|
47
|
+
end
|
48
|
+
|
49
|
+
def channel
|
50
|
+
@server.channel @user.channel
|
51
|
+
end
|
52
|
+
|
53
|
+
def server
|
54
|
+
@server
|
55
|
+
end
|
56
|
+
|
57
|
+
def name
|
58
|
+
@user.name
|
59
|
+
end
|
60
|
+
|
61
|
+
def seconds_connected
|
62
|
+
@user.onlinesecs
|
63
|
+
end
|
64
|
+
|
65
|
+
def seconds_idle
|
66
|
+
@user.idlesecs
|
67
|
+
end
|
68
|
+
|
69
|
+
def bytes_per_sec
|
70
|
+
@user.bytespersec
|
71
|
+
end
|
72
|
+
|
73
|
+
def version
|
74
|
+
@user.version
|
75
|
+
end
|
76
|
+
|
77
|
+
def release
|
78
|
+
@user.release
|
79
|
+
end
|
80
|
+
|
81
|
+
def os
|
82
|
+
@user.os
|
83
|
+
end
|
84
|
+
|
85
|
+
def os_version
|
86
|
+
@user.osversion
|
87
|
+
end
|
88
|
+
|
89
|
+
def identity
|
90
|
+
@user.identity
|
91
|
+
end
|
92
|
+
|
93
|
+
def context
|
94
|
+
@user.context
|
95
|
+
end
|
96
|
+
|
97
|
+
def comment
|
98
|
+
@user.comment
|
99
|
+
end
|
100
|
+
|
101
|
+
def tcponly?
|
102
|
+
@user.tcponly
|
103
|
+
end
|
104
|
+
|
105
|
+
def ping
|
106
|
+
{:udp => @user.udpPing, :tcp => @user.tcpPing}
|
107
|
+
end
|
108
|
+
|
109
|
+
def udpPing
|
110
|
+
ping[:udp]
|
111
|
+
end
|
112
|
+
|
113
|
+
def tcpPing
|
114
|
+
ping[:tcp]
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|