teamspeak3 0.0.1 → 0.0.2

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 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