teamspeak3 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 047e1ed175699cf16ec1e920abb755a80716aef5
4
- data.tar.gz: 4dcb207489d5047c177b0e032ad53787d81cbdbc
3
+ metadata.gz: 5cfaad253891919553b8e8f9195e6c903a43e94f
4
+ data.tar.gz: 4b4a47e6af3efea58d63e32f004efb660eae2909
5
5
  SHA512:
6
- metadata.gz: b9453878d62e0eb4974a27c1207c1d7b4d706ad2f6a4816a26eb6916d23cdd273043619c45bda59b1a388464da7120c600540cf6c4410d0f1bde2274e3fb536d
7
- data.tar.gz: d590572ef38941d77bb302d42a4e12fae015143e54485907e9583e09d99f1cc3cdb7e2520cadd0bfb74f60f1d9ebeb7c15c3c1e12ba04396fd473b1f18e3c0ec
6
+ metadata.gz: 4f2d97920b5994b11b4deb306296e9eef01e1f3d3d55ab62ea92e47e7de5acd3d55566c49e7be9d6becaa4907b391ce46938aaa10a48646121fb7e352c060288
7
+ data.tar.gz: a4e43cb8cb9ed5eb8c940e237102d6f9b95c6fdf436d9f31b01923dcfa62727a00c2817dc130553a1ea4db578a90ee35c94f956f4090528ff04a2951e6950837
@@ -0,0 +1,97 @@
1
+ module TeamSpeak3
2
+ class Channel
3
+ attr_reader :virtual_server
4
+
5
+ attr_reader :id
6
+ attr_reader :pid
7
+ attr_reader :name
8
+ attr_reader :order
9
+ attr_reader :total_clients
10
+ attr_reader :needed_subscribe_power
11
+
12
+ attr_reader :topic
13
+
14
+ attr_reader :flags
15
+
16
+ attr_reader :codec
17
+ attr_reader :codec_quality
18
+ attr_reader :needed_talk_power
19
+
20
+ attr_reader :icon_id
21
+
22
+ attr_reader :total_clients_family
23
+ attr_reader :max_clients
24
+ attr_reader :max_family_clients
25
+
26
+ def initialize(virtual_server, params)
27
+ @virtual_server = virtual_server
28
+
29
+ @id = params[:cid].to_i
30
+ @pid = params[:pid].to_i
31
+ @name = params[:channel_name]
32
+ @order = params[:order].to_i
33
+ @total_clients = params[:total_clients].to_i
34
+ @needed_subscribe_power = params[:channel_needed_subscribe_power].to_i
35
+
36
+ # option: :topic
37
+ @topic = params[:channel_topic]
38
+
39
+ # option: :flags
40
+ @flags = []
41
+ @flags << :default if params[:channel_flag_default].to_i == 1
42
+ @flags << :password if params[:channel_flag_password].to_i == 1
43
+ @flags << :permanent if params[:channel_flag_permanent].to_i == 1
44
+ @flags << :semi_permanent if params[:channel_flag_semi_permanent].to_i == 1
45
+
46
+ # option: :voice
47
+ @codec = params[:channel_codec].to_i
48
+ @codec_quality = params[:channel_codec_quality].to_i
49
+ @needed_talk_power = params[:channel_needed_talk_power].to_i
50
+
51
+ # option: :icon
52
+ @icon_id = params[:channel_icon_id].to_i
53
+
54
+ # option: :limits
55
+ @total_clients_family = params[:total_clients_family].to_i
56
+ @max_clients = params[:channel_maxclients].to_i
57
+ @max_family_clients = params[:channel_maxfamilyclients].to_i
58
+ end
59
+
60
+ def codec_name
61
+ return "Speex Narrowband" if @codec == 0
62
+ return "Speex Wideband" if @codec == 1
63
+ return "Speex Ultra-Wideband" if @codec == 2
64
+ return "CELT Mono" if @codec == 3
65
+ return "Opus Voice" if @codec == 4
66
+ return "Opus Music" if @codec == 5
67
+ end
68
+
69
+ def permanent?
70
+ flag?(:permanent)
71
+ end
72
+
73
+ def semi_permanent?
74
+ flag?(:semi_permanent)
75
+ end
76
+
77
+ def password?
78
+ flag?(:password)
79
+ end
80
+
81
+ def default?
82
+ flag?(:default)
83
+ end
84
+
85
+ def flag?(flag)
86
+ @flags.include?(flag.to_sym)
87
+ end
88
+
89
+ def send_message(message)
90
+ virtual_server.server.send_message_to(self, message)
91
+ end
92
+
93
+ def ==(target)
94
+ @id == target
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,122 @@
1
+ module TeamSpeak3
2
+ class Client
3
+ attr_reader :virtual_server
4
+
5
+ attr_reader :client_id
6
+ attr_reader :client_database_id
7
+ attr_reader :channel_id
8
+ attr_reader :nickname
9
+ attr_reader :type_id
10
+ attr_reader :away_message
11
+ attr_reader :flags
12
+ attr_reader :talk_power
13
+ attr_reader :uid
14
+ attr_reader :version
15
+ attr_reader :platform
16
+ attr_reader :servergroups
17
+ attr_reader :channel_group_id
18
+ attr_reader :channel_group_inherited_channel_id
19
+ attr_reader :idle_time
20
+ attr_reader :created_at
21
+ attr_reader :last_connected
22
+ attr_reader :icon_id
23
+ attr_reader :country
24
+
25
+ def initialize(virtual_server, params)
26
+ @virtual_server = virtual_server
27
+
28
+ @client_id = params[:clid].to_i
29
+ @client_database_id = params[:client_database_id].to_i
30
+ @channel_id = params[:cid].to_i
31
+ @nickname = params[:client_nickname]
32
+ @type_id = params[:client_type].to_i
33
+ @away = params[:client_away].to_i == 1
34
+ @away_message = params[:client_away_message]
35
+
36
+ @flags = []
37
+ @flags << :talking if params[:client_flag_talking].to_i == 1
38
+
39
+ @input_muted = true if params[:client_input_muted].to_i == 1
40
+ @output_muted = true if params[:client_output_muted].to_i == 1
41
+
42
+ @input_hardware = true if params[:client_input_hardware].to_i == 1
43
+ @output_hardware = true if params[:client_output_hardware].to_i == 1
44
+
45
+ @talk_power = params[:client_talk_power].to_i
46
+ @talker = params[:client_is_talker].to_i == 1
47
+ @priority_speaker = params[:client_is_priority_speaker].to_i == 1
48
+ @recording = params[:client_is_recording].to_i == 1
49
+
50
+ @channel_commander = params[:client_is_channel_commander].to_i == 1
51
+
52
+ @uid = params[:client_unique_identifier]
53
+ @version = params[:client_version]
54
+ @platform = params[:client_platform]
55
+ @servergroups = params[:client_servergroups].split(',').map {|group| group.to_i}
56
+ @channel_group_id = params[:client_channel_group_id].to_i
57
+ @channel_group_inherited_channel_id = params[:client_channel_group_inherited_channel_id].to_i
58
+
59
+ @idle_time = Time.now - params[:client_idle_time].to_i
60
+ @created_at = Time.at(params[:client_created].to_i)
61
+ @last_connected = Time.at(params[:client_lastconnected].to_i)
62
+
63
+ @icon_id = params[:client_icon_id].to_i
64
+
65
+ @country = params[:client_country]
66
+ end
67
+
68
+ def away?
69
+ @away
70
+ end
71
+
72
+ def channel_commander?
73
+ @channel_commander
74
+ end
75
+
76
+ def flag?(flag)
77
+ @flags.include?(flag)
78
+ end
79
+
80
+ def input_hardware?
81
+ @input_hardware
82
+ end
83
+
84
+ def input_muted?
85
+ @input_muted
86
+ end
87
+
88
+ def kick_from_server!(reason = nil)
89
+ virtual_server.server.kick_client!(client_id, :server, reason)
90
+ true
91
+ end
92
+
93
+ def kick_from_channel!(reason = nil)
94
+ virtual_server.server.kick_client!(client_id, :channel, reason)
95
+ true
96
+ end
97
+
98
+ def output_hardware?
99
+ @output_hardware
100
+ end
101
+
102
+ def output_muted?
103
+ @output_muted
104
+ end
105
+
106
+ def priority_speaker?
107
+ @priority_speaker
108
+ end
109
+
110
+ def recording?
111
+ @recording
112
+ end
113
+
114
+ def talker?
115
+ @talker
116
+ end
117
+
118
+ def talking?
119
+ flag?(:talking)
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,37 @@
1
+ module TeamSpeak3
2
+ module CommandParameter
3
+ def self.encode(value)
4
+ return unless value
5
+
6
+ value.gsub!("\\", "\\\\")
7
+ value.gsub!("/", "\/")
8
+ value.gsub!(" ", "\\s")
9
+ value.gsub!("|", "\\p")
10
+ value.gsub!("\a", "\\a")
11
+ value.gsub!("\b", "\\b")
12
+ value.gsub!("\f", "\\f")
13
+ value.gsub!("\n", "\\n")
14
+ value.gsub!("\r", "\\r")
15
+ value.gsub!("\t", "\\t")
16
+ value.gsub!("\v", "\\v")
17
+ value
18
+ end
19
+
20
+ def self.decode(value)
21
+ return unless value
22
+
23
+ value.gsub!("\\\\", "\\")
24
+ value.gsub!("\/", "/")
25
+ value.gsub!("\\s", " ")
26
+ value.gsub!("\\p", "|")
27
+ value.gsub!("\\a", "\a")
28
+ value.gsub!("\\b", "\b")
29
+ value.gsub!("\\f", "\f")
30
+ value.gsub!("\\n", "\n")
31
+ value.gsub!("\\r", "\r")
32
+ value.gsub!("\\t", "\t")
33
+ value.gsub!("\\v", "\v")
34
+ value
35
+ end
36
+ end
37
+ end
@@ -3,6 +3,9 @@ require_relative 'exceptions/standard_exception.rb'
3
3
 
4
4
  # alphabetical order of exceptions
5
5
  require_relative 'exceptions/command_execution_failed.rb'
6
+ require_relative 'exceptions/invalid_kick_action.rb'
7
+ require_relative 'exceptions/invalid_target.rb'
8
+ require_relative 'exceptions/invalid_target_type.rb'
6
9
  require_relative 'exceptions/not_connected.rb'
7
10
  require_relative 'exceptions/query_login_failed.rb'
8
11
  require_relative 'exceptions/server_connection_failed.rb'
@@ -0,0 +1,12 @@
1
+ module TeamSpeak3
2
+ module Exceptions
3
+ class InvalidKickAction < TeamSpeak3::Exceptions::StandardException
4
+ attr_reader :action
5
+
6
+ def initialize(action)
7
+ @action = action
8
+ @message = "Invalid kick action '#{action}'."
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module TeamSpeak3
2
+ module Exceptions
3
+ class InvalidTarget < TeamSpeak3::Exceptions::StandardException
4
+ attr_reader :target
5
+
6
+ def initialize(target)
7
+ @target = target
8
+ @message = "Invalid target '#{target}'."
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module TeamSpeak3
2
+ module Exceptions
3
+ class InvalidTargetType < TeamSpeak3::Exceptions::StandardException
4
+ attr_reader :target_type
5
+
6
+ def initialize(target_type)
7
+ @target_type = target_type
8
+ @message = "Invalid target type '#{target_type}'."
9
+ end
10
+ end
11
+ end
12
+ end
@@ -1,6 +1,9 @@
1
1
  module TeamSpeak3
2
2
  module Exceptions
3
3
  class ServerConnectionFailed < TeamSpeak3::Exceptions::StandardException
4
+ attr_reader :ip_address
5
+ attr_reader :query_port
6
+
4
7
  def initialize(ip_address, query_port, message)
5
8
  @ip_address = ip_address
6
9
  @query_port = query_port
@@ -3,6 +3,7 @@ module TeamSpeak3
3
3
  attr_reader :ip_address
4
4
  attr_reader :query_port
5
5
  attr_reader :socket
6
+ attr_reader :active_server
6
7
 
7
8
  def initialize(ip_address, query_port, opts = {})
8
9
  @ip_address = ip_address
@@ -43,10 +44,73 @@ module TeamSpeak3
43
44
  true
44
45
  end
45
46
 
46
- private
47
+ def select_server(virtual_server_id)
48
+ execute "use sid=#{virtual_server_id}"
49
+ @active_server = virtual_server_id
50
+ end
47
51
 
48
- def verify_connection
49
- raise TeamSpeak3::Exceptions::NotConnected, 'Not connected to a TeamSpeak 3 server.' unless @socket
52
+ def virtual_servers
53
+ server_list = []
54
+
55
+ servers = execute "serverlist -uid -all"
56
+ servers[:data].each do |server|
57
+ server_list << TeamSpeak3::VirtualServer.new(self, server)
58
+ end
59
+
60
+ server_list
61
+ end
62
+
63
+ def kick_client!(client_id, action, reason = nil)
64
+ # set correct kick action
65
+ action_id = nil
66
+ action_id = 4 if action == :channel
67
+ action_id = 5 if action == :server
68
+
69
+ raise TeamSpeak3::Exceptions::InvalidKickAction.new(action) unless action_id
70
+
71
+ # handle multiple client ids
72
+ client_ids = ""
73
+ if client_id.is_a?(Integer)
74
+ client_ids = "clid=#{client_id}"
75
+ elsif client_id.is_a?(Array)
76
+ client_id.each { |id| client_ids += "clid=#{id}|" }
77
+ client_ids = client_ids[0..-2]
78
+ end
79
+
80
+ # execute command
81
+ command = "clientkick #{client_ids} reasonid=#{action_id}"
82
+ command += " reasonmsg=#{TeamSpeak3::CommandParameter.encode(reason)}" if reason
83
+ execute command
84
+ end
85
+
86
+ def send_message_to(target, message, target_type = :auto)
87
+ if target_type == :auto
88
+ if target.is_a?(TeamSpeak3::VirtualServer)
89
+ target_id = target.id
90
+ target_type_id = 3
91
+
92
+ select_server target.id
93
+ elsif target.is_a?(TeamSpeak3::Channel)
94
+ target_id = target.id
95
+ target_type_id = 2
96
+
97
+ select_server target.virtual_server.id
98
+ else
99
+ raise TeamSpeak3::Exceptions::InvalidTarget.new(target)
100
+ end
101
+ else
102
+ target_id = target
103
+
104
+ target_type_id = 3 if target_type.to_sym == :server
105
+ target_type_id = 2 if target_type.to_sym == :channel
106
+ target_type_id = 1 if target_type.to_sym == :client
107
+
108
+ raise TeamSpeak3::Exceptions::InvalidTargetType.new(target_type) unless target_type_id
109
+ end
110
+
111
+ execute "sendtextmessage target=#{target_id} targetmode=#{target_type_id} " \
112
+ "msg=#{TeamSpeak3::CommandParameter.encode(message)}"
113
+ true
50
114
  end
51
115
 
52
116
  def execute(command)
@@ -66,5 +130,11 @@ module TeamSpeak3
66
130
 
67
131
  response
68
132
  end
133
+
134
+ private
135
+
136
+ def verify_connection
137
+ raise TeamSpeak3::Exceptions::NotConnected, 'Not connected to a TeamSpeak 3 server.' unless @socket
138
+ end
69
139
  end
70
140
  end
@@ -37,7 +37,7 @@ module TeamSpeak3
37
37
  value = nil
38
38
  end
39
39
 
40
- result[key.to_sym] = parse_value(value)
40
+ result[key.to_sym] = TeamSpeak3::CommandParameter.decode(value)
41
41
  end
42
42
 
43
43
  return result if opts[:ignore_array_result]
@@ -47,23 +47,6 @@ module TeamSpeak3
47
47
  result_list
48
48
  end
49
49
 
50
- def parse_value(value)
51
- return unless value
52
-
53
- value.gsub!("\\\\", "\\")
54
- value.gsub!("\/", "/")
55
- value.gsub!("\\s", " ")
56
- value.gsub!("\\p", "|")
57
- value.gsub!("\\a", "\a")
58
- value.gsub!("\\b", "\b")
59
- value.gsub!("\\f", "\f")
60
- value.gsub!("\\n", "\n")
61
- value.gsub!("\\r", "\r")
62
- value.gsub!("\\t", "\t")
63
- value.gsub!("\\v", "\v")
64
- value
65
- end
66
-
67
50
  def split_data_from_errors(response)
68
51
  data, errors = response.split("\n")
69
52
 
@@ -1,5 +1,12 @@
1
1
  require 'net/telnet'
2
2
 
3
+ # exceptions shall be required first
3
4
  require_relative 'exceptions.rb'
5
+
6
+ # library classes ordered alphabetically
7
+ require_relative 'channel.rb'
8
+ require_relative 'client.rb'
9
+ require_relative 'command_parameter.rb'
10
+ require_relative 'virtual_server.rb'
4
11
  require_relative 'server_response.rb'
5
12
  require_relative 'server.rb'
@@ -0,0 +1,73 @@
1
+ module TeamSpeak3
2
+ class VirtualServer
3
+ attr_reader :server
4
+
5
+ attr_reader :id
6
+ attr_reader :name
7
+ attr_reader :port
8
+ attr_reader :status
9
+ attr_reader :clients_online
10
+ attr_reader :query_clients_online
11
+ attr_reader :slots
12
+ attr_reader :uptime
13
+ attr_reader :autostart
14
+ attr_reader :uid
15
+
16
+ def initialize(server, params)
17
+ @server = server
18
+
19
+ @id = params[:virtualserver_id].to_i
20
+ @name = params[:virtualserver_name]
21
+ @port = params[:virtualserver_port].to_i
22
+ @status = params[:virtualserver_status].to_sym
23
+ @clients_online = params[:virtualserver_clientsonline].to_i
24
+ @query_clients_online = params[:virtualserver_queryclientsonline].to_i
25
+ @slots = params[:virtualserver_maxclients].to_i
26
+ @uptime = Time.now - params[:virtualserver_uptime].to_i
27
+ @autostart = params[:virtualserver_uptime].to_i == 1
28
+ @uid = params[:virtualserver_unique_identifier]
29
+ end
30
+
31
+ def channels
32
+ check_active_server
33
+
34
+ channels_list = []
35
+ channels = @server.execute "channellist -topic -flags -voice -limits -icon"
36
+
37
+ channels[:data].each do |channel|
38
+ channels_list << TeamSpeak3::Channel.new(self, channel)
39
+ end
40
+
41
+ channels_list
42
+ end
43
+
44
+ def clients
45
+ check_active_server
46
+
47
+ clients_list = []
48
+ clients = @server.execute "clientlist -uid -away -voice -times -groups -info -icon -country"
49
+
50
+ clients[:data].each do |client|
51
+ clients_list << TeamSpeak3::Client.new(self, client)
52
+ end
53
+
54
+ clients_list
55
+ end
56
+
57
+ def send_message(message)
58
+ server.send_message_to(self, message)
59
+ end
60
+
61
+ def ==(target)
62
+ @id == target
63
+ end
64
+
65
+ private
66
+
67
+ def check_active_server
68
+ if @server.active_server != @id
69
+ @server.select_server(@id)
70
+ end
71
+ end
72
+ end
73
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: teamspeak3
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manuel Schnitzer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-04 00:00:00.000000000 Z
11
+ date: 2018-03-05 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: An OOP library to query and manage TeamSpeak 3 servers in Ruby.
14
14
  email: webmaster@mschnitzer.de
@@ -16,8 +16,14 @@ executables: []
16
16
  extensions: []
17
17
  extra_rdoc_files: []
18
18
  files:
19
+ - lib/channel.rb
20
+ - lib/client.rb
21
+ - lib/command_parameter.rb
19
22
  - lib/exceptions.rb
20
23
  - lib/exceptions/command_execution_failed.rb
24
+ - lib/exceptions/invalid_kick_action.rb
25
+ - lib/exceptions/invalid_target.rb
26
+ - lib/exceptions/invalid_target_type.rb
21
27
  - lib/exceptions/not_connected.rb
22
28
  - lib/exceptions/query_login_failed.rb
23
29
  - lib/exceptions/server_connection_failed.rb
@@ -25,6 +31,7 @@ files:
25
31
  - lib/server.rb
26
32
  - lib/server_response.rb
27
33
  - lib/teamspeak3.rb
34
+ - lib/virtual_server.rb
28
35
  homepage: https://github.com/mschnitzer/teamspeak3
29
36
  licenses:
30
37
  - MIT