tox 0.0.2 → 0.0.3
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 +5 -5
- data/.gitignore +5 -0
- data/.gitmodules +2 -2
- data/.rubocop.yml +6 -0
- data/.travis.yml +4 -9
- data/README.md +9 -0
- data/Rakefile +112 -3
- data/bin/childprocess +44 -0
- data/examples/echo_bot.rb +11 -7
- data/ext/tox/client.c +579 -285
- data/ext/tox/extconf.rb +187 -133
- data/ext/tox/friend.c +95 -105
- data/ext/tox/options.c +358 -39
- data/ext/tox/tox.c +41 -37
- data/ext/tox/tox.h +201 -21
- data/ext/tox/version.c +0 -18
- data/lib/tox.rb +11 -28
- data/lib/tox/address.rb +12 -16
- data/lib/tox/address_checksum.rb +12 -0
- data/lib/tox/binary.rb +26 -29
- data/lib/tox/client.rb +7 -64
- data/lib/tox/connection_status.rb +23 -0
- data/lib/tox/friend.rb +9 -20
- data/lib/tox/node.rb +1 -17
- data/lib/tox/nospam.rb +9 -16
- data/lib/tox/options.rb +54 -16
- data/lib/tox/out_friend_message.rb +40 -0
- data/lib/tox/out_message.rb +6 -16
- data/lib/tox/proxies/base.rb +54 -0
- data/lib/tox/proxies/http.rb +14 -0
- data/lib/tox/proxies/socks5.rb +14 -0
- data/lib/tox/proxy_type.rb +17 -0
- data/lib/tox/public_key.rb +0 -16
- data/lib/tox/status.rb +0 -16
- data/lib/tox/user_status.rb +0 -16
- data/lib/tox/version.rb +1 -17
- data/tox.gemspec +9 -2
- metadata +29 -7
- data/bin/build/libsodium +0 -11
- data/bin/build/libtoxcore +0 -11
- data/lib/tox/friend/out_message.rb +0 -58
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 9367ed9e38a09dccb4ff7e1f75ca32f92905923787c30b7024d4d34c178f6a0a
|
4
|
+
data.tar.gz: eefe7bec29169dd32706f5bea1a4f38898fa3f2a4b3de8e43e177c2f862420bd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7fc56ef3915fa04ed359e8acd1a48091477163c0886ef9098b3e1c421f927a68afb03c29d4b05def5c8be0702355d8f740d9646d7b3b86d1aef4e733f34f41ab
|
7
|
+
data.tar.gz: d5b7f0da8e46e010ebabd8108722368958b2e193d0dfeb3a594877b79589057760c769ddfbc035c8df0dabd00c36e9a19cfd7c5b81eac2dbabc19572e556948d
|
data/.gitignore
CHANGED
data/.gitmodules
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
[submodule "vendor/libtoxcore"]
|
2
|
-
path = vendor/libtoxcore
|
2
|
+
path = vendor/src/libtoxcore
|
3
3
|
url = https://github.com/TokTok/c-toxcore.git
|
4
4
|
[submodule "vendor/libsodium"]
|
5
|
-
path = vendor/libsodium
|
5
|
+
path = vendor/src/libsodium
|
6
6
|
url = https://github.com/jedisct1/libsodium.git
|
data/.rubocop.yml
CHANGED
@@ -17,6 +17,7 @@ Lint/InheritException:
|
|
17
17
|
|
18
18
|
Metrics/BlockLength:
|
19
19
|
Exclude:
|
20
|
+
- 'Rakefile'
|
20
21
|
- '**/*.gemspec'
|
21
22
|
- 'spec/**/*'
|
22
23
|
|
@@ -29,6 +30,11 @@ Style/DoubleNegation:
|
|
29
30
|
Style/GlobalVars:
|
30
31
|
Exclude:
|
31
32
|
- 'ext/**/*'
|
33
|
+
- 'spec/network_helper.rb'
|
34
|
+
|
35
|
+
Style/PredicateName:
|
36
|
+
Exclude:
|
37
|
+
- 'ext/tox/extconf.rb'
|
32
38
|
|
33
39
|
Style/TrailingCommaInArguments:
|
34
40
|
EnforcedStyleForMultiline: comma
|
data/.travis.yml
CHANGED
@@ -3,17 +3,12 @@ language: ruby
|
|
3
3
|
rvm:
|
4
4
|
- 2.3
|
5
5
|
- 2.4
|
6
|
+
- 2.5
|
7
|
+
- 2.6
|
6
8
|
|
7
9
|
before_install:
|
8
10
|
- sudo apt-get update
|
9
|
-
- sudo apt-get install -y
|
10
|
-
|
11
|
-
- sudo ./bin/build/libsodium
|
12
|
-
- sudo ./bin/build/libtoxcore
|
13
|
-
|
14
|
-
- sudo mkdir -p '/etc/ld.so.conf.d/'
|
15
|
-
- echo '/usr/local/lib/' | sudo tee -a '/etc/ld.so.conf.d/locallib.conf'
|
16
|
-
- sudo ldconfig
|
11
|
+
- sudo apt-get install -y yasm libconfig-dev
|
17
12
|
|
18
13
|
before_script:
|
19
|
-
- rake
|
14
|
+
- rake ext
|
data/README.md
CHANGED
@@ -4,8 +4,17 @@
|
|
4
4
|
[](http://badge.fury.io/rb/tox)
|
5
5
|
[](https://travis-ci.org/toxon/tox.rb)
|
6
6
|
[](https://coveralls.io/github/toxon/tox.rb)
|
7
|
+
[](http://inch-ci.org/github/toxon/tox.rb)
|
7
8
|
|
8
9
|
Ruby interface for [libtoxcore](https://github.com/TokTok/c-toxcore).
|
9
10
|
It can be used to create [Tox chat](https://tox.chat) client or bot.
|
10
11
|
The interface is object-oriented instead of C-style (raises exceptions
|
11
12
|
instead of returning error codes, uses classes to represent primitives, etc.)
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
Table of contents
|
17
|
+
-----------------
|
18
|
+
|
19
|
+
* [Overview](#tox)
|
20
|
+
* [Table of contents](#table-of-contents)
|
data/Rakefile
CHANGED
@@ -2,17 +2,31 @@
|
|
2
2
|
|
3
3
|
require 'bundler/gem_tasks'
|
4
4
|
|
5
|
-
|
5
|
+
VENDOR_PREFIX = File.expand_path('vendor', __dir__).freeze
|
6
6
|
|
7
|
-
|
7
|
+
VENDOR_PKG_CONFIG_PATH = File.join(VENDOR_PREFIX, 'lib', 'pkgconfig').freeze
|
8
8
|
|
9
|
+
desc 'Run all checks (test, lint...)'
|
10
|
+
task default: %i[test lint]
|
11
|
+
|
12
|
+
desc 'Run all tests (specs, benchmarks...)'
|
13
|
+
task test: :spec
|
14
|
+
|
15
|
+
desc 'Run all code analysis tools (RuboCop...)'
|
9
16
|
task lint: :rubocop
|
10
17
|
|
18
|
+
desc 'Fix code style (rubocop --auto-correct)'
|
11
19
|
task fix: 'rubocop:auto_correct'
|
12
20
|
|
21
|
+
desc 'Compile all extensions (and their dependencies)'
|
22
|
+
task ext: %i[ext:tox]
|
23
|
+
|
24
|
+
require 'pry'
|
25
|
+
|
13
26
|
begin
|
14
27
|
require 'rspec/core/rake_task'
|
15
28
|
RSpec::Core::RakeTask.new
|
29
|
+
Rake::Task[:spec].enhance %i[ext]
|
16
30
|
rescue LoadError
|
17
31
|
nil
|
18
32
|
end
|
@@ -34,9 +48,104 @@ end
|
|
34
48
|
begin
|
35
49
|
require 'rake/extensiontask'
|
36
50
|
|
37
|
-
Rake::ExtensionTask.new 'tox'
|
51
|
+
Rake::ExtensionTask.new 'tox' do |ext|
|
38
52
|
ext.lib_dir = 'lib/tox'
|
53
|
+
ext.config_options << "--with-opt-dir=#{VENDOR_PREFIX.shellescape}"
|
39
54
|
end
|
55
|
+
|
56
|
+
Rake::Task[:compile].clear_comments
|
57
|
+
Rake::Task['compile:tox'].clear_comments
|
40
58
|
rescue LoadError
|
41
59
|
nil
|
42
60
|
end
|
61
|
+
|
62
|
+
namespace :ext do
|
63
|
+
desc 'Compile "tox" extension (and it\'s dependencies)'
|
64
|
+
task tox: %i[
|
65
|
+
vendor/lib/pkgconfig/libtoxcore.pc
|
66
|
+
compile:tox
|
67
|
+
]
|
68
|
+
end
|
69
|
+
|
70
|
+
namespace :vendor do
|
71
|
+
desc 'Install vendored dependencies into "./vendor/{bin,include,lib}/"'
|
72
|
+
task install: %i[install:libsodium install:libtoxcore]
|
73
|
+
|
74
|
+
desc 'Uninstall vendored dependencies from "./vendor/{bin,include,lib}/"'
|
75
|
+
task :uninstall do
|
76
|
+
rm_rf File.join VENDOR_PREFIX, 'bin'
|
77
|
+
rm_rf File.join VENDOR_PREFIX, 'include'
|
78
|
+
rm_rf File.join VENDOR_PREFIX, 'lib'
|
79
|
+
end
|
80
|
+
|
81
|
+
desc 'Delete compiled vendored dependencies from "./vendor/"'
|
82
|
+
task clean: %i[uninstall clean:libsodium clean:libtoxcore]
|
83
|
+
|
84
|
+
namespace :install do
|
85
|
+
task libsodium: 'vendor/lib/pkgconfig/libsodium.pc'
|
86
|
+
task libtoxcore: 'vendor/lib/pkgconfig/libtoxcore.pc'
|
87
|
+
end
|
88
|
+
|
89
|
+
namespace :clean do
|
90
|
+
task :libsodium do
|
91
|
+
chdir 'vendor/src/libsodium' do
|
92
|
+
sh 'make clean'
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
task :libtoxcore do
|
97
|
+
chdir 'vendor/src/libtoxcore' do
|
98
|
+
sh 'make clean'
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
file 'vendor/lib/pkgconfig/libsodium.pc': 'vendor/src/libsodium/Makefile' do
|
105
|
+
chdir 'vendor/src/libsodium' do
|
106
|
+
sh 'make install'
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
file 'vendor/lib/pkgconfig/libtoxcore.pc': 'vendor/src/libtoxcore/Makefile' do
|
111
|
+
chdir 'vendor/src/libtoxcore' do
|
112
|
+
sh 'make install'
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
file 'vendor/src/libsodium/Makefile': 'vendor/src/libsodium/configure' do |t|
|
117
|
+
chdir File.dirname t.name do
|
118
|
+
sh(
|
119
|
+
{ 'PKG_CONFIG_PATH' => VENDOR_PKG_CONFIG_PATH },
|
120
|
+
'./configure',
|
121
|
+
'--prefix',
|
122
|
+
VENDOR_PREFIX,
|
123
|
+
)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
file 'vendor/src/libtoxcore/Makefile':
|
128
|
+
%i[vendor/src/libtoxcore/configure
|
129
|
+
vendor/lib/pkgconfig/libsodium.pc] do |t|
|
130
|
+
chdir File.dirname t.name do
|
131
|
+
sh(
|
132
|
+
{ 'PKG_CONFIG_PATH' => VENDOR_PKG_CONFIG_PATH },
|
133
|
+
'./configure',
|
134
|
+
'--prefix',
|
135
|
+
VENDOR_PREFIX,
|
136
|
+
'--enable-daemon',
|
137
|
+
)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
file 'vendor/src/libsodium/configure' do |t|
|
142
|
+
chdir File.dirname t.name do
|
143
|
+
sh './autogen.sh'
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
file 'vendor/src/libtoxcore/configure' do |t|
|
148
|
+
chdir File.dirname t.name do
|
149
|
+
sh './autogen.sh'
|
150
|
+
end
|
151
|
+
end
|
data/bin/childprocess
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# This wrapper ensures than child process is terminated/killed
|
5
|
+
# if parent process does not exist anymore.
|
6
|
+
|
7
|
+
require 'English'
|
8
|
+
|
9
|
+
TRAPS = %i[HUP INT QUIT TRAP ABRT TERM USR1 USR2].freeze
|
10
|
+
|
11
|
+
pid = spawn(*ARGV, in: :in, out: :out, err: :err)
|
12
|
+
|
13
|
+
signal = lambda do |signo|
|
14
|
+
begin
|
15
|
+
Process.kill signo, pid
|
16
|
+
rescue
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
TRAPS.each do |signame|
|
22
|
+
trap signame, &signal
|
23
|
+
end
|
24
|
+
|
25
|
+
Thread.start pid do |pid| # rubocop:disable Lint/ShadowingOuterLocalVariable
|
26
|
+
loop do
|
27
|
+
begin
|
28
|
+
sleep 1
|
29
|
+
Process.kill 0, Process.ppid
|
30
|
+
rescue
|
31
|
+
begin
|
32
|
+
Process.kill :SIGTERM, pid
|
33
|
+
sleep 2
|
34
|
+
Process.kill :SIGKILL, pid
|
35
|
+
rescue
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
Process.wait pid
|
43
|
+
|
44
|
+
exit $CHILD_STATUS.exitstatus || 1
|
data/examples/echo_bot.rb
CHANGED
@@ -31,7 +31,7 @@ tox_client.status = Tox::UserStatus::NONE
|
|
31
31
|
tox_client.status_message = STATUS_MESSAGE
|
32
32
|
|
33
33
|
puts
|
34
|
-
puts "Address: #{tox_client.address
|
34
|
+
puts "Address: #{tox_client.address}"
|
35
35
|
puts "Name: #{tox_client.name}"
|
36
36
|
puts "Status: #{tox_client.status}"
|
37
37
|
puts "Status message: #{tox_client.status_message}"
|
@@ -40,9 +40,10 @@ puts
|
|
40
40
|
puts 'Connecting to the nodes from official list...'
|
41
41
|
tox_client.bootstrap_official
|
42
42
|
|
43
|
-
tox_client.on_friend_request do |public_key|
|
44
|
-
puts
|
45
|
-
|
43
|
+
tox_client.on_friend_request do |public_key, text|
|
44
|
+
puts 'Friend request. Adding to contacts...'
|
45
|
+
puts "Public key: #{public_key}"
|
46
|
+
puts "Text: #{text.inspect}"
|
46
47
|
puts
|
47
48
|
|
48
49
|
tox_client.friend_add_norequest public_key
|
@@ -52,10 +53,10 @@ tox_client.on_friend_message do |friend, text|
|
|
52
53
|
puts 'Message from friend'
|
53
54
|
puts "Number: #{friend.number}"
|
54
55
|
puts "Name: #{friend.name}"
|
55
|
-
puts "Public key: #{friend.public_key
|
56
|
+
puts "Public key: #{friend.public_key}"
|
56
57
|
puts "Status: #{friend.status}"
|
57
58
|
puts "Status message: #{friend.status_message}"
|
58
|
-
puts text.inspect
|
59
|
+
puts "Text: #{text.inspect}"
|
59
60
|
puts
|
60
61
|
|
61
62
|
friend.send_message text
|
@@ -66,7 +67,10 @@ puts 'Running. Send me friend request, I\'ll accept it immediately. ' \
|
|
66
67
|
|
67
68
|
begin
|
68
69
|
puts
|
69
|
-
|
70
|
+
loop do
|
71
|
+
sleep tox_client.iteration_interval
|
72
|
+
tox_client.iterate
|
73
|
+
end
|
70
74
|
puts
|
71
75
|
rescue SignalException
|
72
76
|
puts
|
data/ext/tox/client.c
CHANGED
@@ -1,21 +1,3 @@
|
|
1
|
-
/*
|
2
|
-
* tox.rb - Ruby interface for libtoxcore
|
3
|
-
* Copyright (C) 2015-2017 Braiden Vasco
|
4
|
-
*
|
5
|
-
* This program is free software: you can redistribute it and/or modify
|
6
|
-
* it under the terms of the GNU General Public License as published by
|
7
|
-
* the Free Software Foundation, either version 3 of the License, or
|
8
|
-
* (at your option) any later version.
|
9
|
-
*
|
10
|
-
* This program is distributed in the hope that it will be useful,
|
11
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
-
* GNU General Public License for more details.
|
14
|
-
*
|
15
|
-
* You should have received a copy of the GNU General Public License
|
16
|
-
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
-
*/
|
18
|
-
|
19
1
|
#include "tox.h"
|
20
2
|
|
21
3
|
#include <time.h>
|
@@ -26,29 +8,38 @@ static void mTox_cClient_free(mTox_cClient_CDATA *free_cdata);
|
|
26
8
|
|
27
9
|
// Public methods
|
28
10
|
|
11
|
+
static VALUE mTox_cClient_iteration_interval(VALUE self);
|
12
|
+
static VALUE mTox_cClient_iterate(VALUE self);
|
13
|
+
|
14
|
+
static VALUE mTox_cClient_connection_status(VALUE self);
|
29
15
|
static VALUE mTox_cClient_public_key(VALUE self);
|
30
16
|
static VALUE mTox_cClient_address(VALUE self);
|
17
|
+
static VALUE mTox_cClient_nospam(VALUE self);
|
18
|
+
static VALUE mTox_cClient_nospam_ASSIGN(VALUE self, VALUE nospam);
|
31
19
|
static VALUE mTox_cClient_savedata(VALUE self);
|
20
|
+
static VALUE mTox_cClient_udp_port(VALUE self);
|
21
|
+
static VALUE mTox_cClient_tcp_port(VALUE self);
|
32
22
|
|
33
|
-
static VALUE mTox_cClient_bootstrap(VALUE self, VALUE
|
23
|
+
static VALUE mTox_cClient_bootstrap(VALUE self, VALUE address, VALUE port, VALUE public_key);
|
24
|
+
static VALUE mTox_cClient_add_tcp_relay(VALUE self, VALUE address, VALUE port, VALUE public_key);
|
34
25
|
|
35
26
|
static VALUE mTox_cClient_name(VALUE self);
|
36
|
-
static VALUE
|
27
|
+
static VALUE mTox_cClient_name_ASSIGN(VALUE self, VALUE name);
|
37
28
|
|
38
29
|
static VALUE mTox_cClient_status(VALUE self);
|
39
|
-
static VALUE
|
30
|
+
static VALUE mTox_cClient_status_ASSIGN(VALUE self, VALUE status);
|
40
31
|
|
41
32
|
static VALUE mTox_cClient_status_message(VALUE self);
|
42
|
-
static VALUE
|
33
|
+
static VALUE mTox_cClient_status_message_ASSIGN(VALUE self, VALUE status_message);
|
43
34
|
|
44
35
|
static VALUE mTox_cClient_friend_numbers(VALUE self);
|
45
36
|
|
46
37
|
static VALUE mTox_cClient_friend_add_norequest(VALUE self, VALUE public_key);
|
38
|
+
static VALUE mTox_cClient_friend_add(VALUE self, VALUE address, VALUE text);
|
47
39
|
|
48
40
|
// Private methods
|
49
41
|
|
50
42
|
static VALUE mTox_cClient_initialize_with(VALUE self, VALUE options);
|
51
|
-
static VALUE mTox_cClient_run_loop(VALUE self);
|
52
43
|
|
53
44
|
// Callbacks
|
54
45
|
|
@@ -103,29 +94,38 @@ void mTox_cClient_INIT()
|
|
103
94
|
|
104
95
|
// Public methods
|
105
96
|
|
106
|
-
rb_define_method(mTox_cClient, "
|
107
|
-
rb_define_method(mTox_cClient, "
|
108
|
-
|
97
|
+
rb_define_method(mTox_cClient, "iteration_interval", mTox_cClient_iteration_interval, 0);
|
98
|
+
rb_define_method(mTox_cClient, "iterate", mTox_cClient_iterate, 0);
|
99
|
+
|
100
|
+
rb_define_method(mTox_cClient, "connection_status", mTox_cClient_connection_status, 0);
|
101
|
+
rb_define_method(mTox_cClient, "public_key", mTox_cClient_public_key, 0);
|
102
|
+
rb_define_method(mTox_cClient, "address", mTox_cClient_address, 0);
|
103
|
+
rb_define_method(mTox_cClient, "nospam", mTox_cClient_nospam, 0);
|
104
|
+
rb_define_method(mTox_cClient, "nospam=", mTox_cClient_nospam_ASSIGN, 1);
|
105
|
+
rb_define_method(mTox_cClient, "savedata", mTox_cClient_savedata, 0);
|
106
|
+
rb_define_method(mTox_cClient, "udp_port", mTox_cClient_udp_port, 0);
|
107
|
+
rb_define_method(mTox_cClient, "tcp_port", mTox_cClient_tcp_port, 0);
|
109
108
|
|
110
|
-
rb_define_method(mTox_cClient, "bootstrap",
|
109
|
+
rb_define_method(mTox_cClient, "bootstrap", mTox_cClient_bootstrap, 3);
|
110
|
+
rb_define_method(mTox_cClient, "add_tcp_relay", mTox_cClient_add_tcp_relay, 3);
|
111
111
|
|
112
112
|
rb_define_method(mTox_cClient, "name", mTox_cClient_name, 0);
|
113
|
-
rb_define_method(mTox_cClient, "name=",
|
113
|
+
rb_define_method(mTox_cClient, "name=", mTox_cClient_name_ASSIGN, 1);
|
114
114
|
|
115
115
|
rb_define_method(mTox_cClient, "status", mTox_cClient_status, 0);
|
116
|
-
rb_define_method(mTox_cClient, "status=",
|
116
|
+
rb_define_method(mTox_cClient, "status=", mTox_cClient_status_ASSIGN, 1);
|
117
117
|
|
118
118
|
rb_define_method(mTox_cClient, "status_message", mTox_cClient_status_message, 0);
|
119
|
-
rb_define_method(mTox_cClient, "status_message=",
|
119
|
+
rb_define_method(mTox_cClient, "status_message=", mTox_cClient_status_message_ASSIGN, 1);
|
120
120
|
|
121
121
|
rb_define_method(mTox_cClient, "friend_numbers", mTox_cClient_friend_numbers, 0);
|
122
122
|
|
123
123
|
rb_define_method(mTox_cClient, "friend_add_norequest", mTox_cClient_friend_add_norequest, 1);
|
124
|
+
rb_define_method(mTox_cClient, "friend_add", mTox_cClient_friend_add, 2);
|
124
125
|
|
125
126
|
// Private methods
|
126
127
|
|
127
128
|
rb_define_private_method(mTox_cClient, "initialize_with", mTox_cClient_initialize_with, 1);
|
128
|
-
rb_define_private_method(mTox_cClient, "run_loop", mTox_cClient_run_loop, 0);
|
129
129
|
}
|
130
130
|
|
131
131
|
/*************************************************************
|
@@ -154,84 +154,257 @@ void mTox_cClient_free(mTox_cClient_CDATA *const free_cdata)
|
|
154
154
|
* Public methods
|
155
155
|
*************************************************************/
|
156
156
|
|
157
|
+
// Tox::Client#iteration_interval
|
158
|
+
VALUE mTox_cClient_iteration_interval(const VALUE self)
|
159
|
+
{
|
160
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
161
|
+
|
162
|
+
uint32_t iteration_interval_msec_data =
|
163
|
+
tox_iteration_interval(self_cdata->tox);
|
164
|
+
|
165
|
+
const double iteration_interval_sec_data =
|
166
|
+
((double)iteration_interval_msec_data) * 0.001;
|
167
|
+
|
168
|
+
const VALUE iteration_interval_sec = DBL2NUM(iteration_interval_sec_data);
|
169
|
+
|
170
|
+
return iteration_interval_sec;
|
171
|
+
}
|
172
|
+
|
173
|
+
// Tox::Client#iterate
|
174
|
+
VALUE mTox_cClient_iterate(const VALUE self)
|
175
|
+
{
|
176
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
177
|
+
|
178
|
+
tox_iterate(self_cdata->tox, self);
|
179
|
+
|
180
|
+
return Qnil;
|
181
|
+
}
|
182
|
+
|
183
|
+
// Tox::Client#connection_status
|
184
|
+
VALUE mTox_cClient_connection_status(const VALUE self)
|
185
|
+
{
|
186
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
187
|
+
|
188
|
+
TOX_CONNECTION connection_status_data =
|
189
|
+
tox_self_get_connection_status(self_cdata->tox);
|
190
|
+
|
191
|
+
const VALUE connection_status =
|
192
|
+
mTox_mConnectionStatus_FROM_DATA(connection_status_data);
|
193
|
+
|
194
|
+
return connection_status;
|
195
|
+
}
|
196
|
+
|
157
197
|
// Tox::Client#public_key
|
158
198
|
VALUE mTox_cClient_public_key(const VALUE self)
|
159
199
|
{
|
160
|
-
mTox_cClient_CDATA
|
200
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
161
201
|
|
162
|
-
|
202
|
+
char public_key_data[TOX_PUBLIC_KEY_SIZE];
|
163
203
|
|
164
|
-
|
204
|
+
tox_self_get_public_key(self_cdata->tox, public_key_data);
|
165
205
|
|
166
|
-
|
206
|
+
const VALUE public_key_value =
|
207
|
+
rb_str_new(public_key_data, TOX_PUBLIC_KEY_SIZE);
|
167
208
|
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
rb_str_new(public_key, TOX_PUBLIC_KEY_SIZE)
|
173
|
-
);
|
209
|
+
const VALUE public_key = rb_funcall(mTox_cPublicKey, rb_intern("new"), 1,
|
210
|
+
public_key_value);
|
211
|
+
|
212
|
+
return public_key;
|
174
213
|
}
|
175
214
|
|
176
215
|
// Tox::Client#address
|
177
216
|
VALUE mTox_cClient_address(const VALUE self)
|
178
217
|
{
|
179
|
-
mTox_cClient_CDATA
|
218
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
219
|
+
|
220
|
+
char address_data[TOX_ADDRESS_SIZE];
|
221
|
+
|
222
|
+
tox_self_get_address(self_cdata->tox, address_data);
|
223
|
+
|
224
|
+
const VALUE address_value = rb_str_new(address_data, TOX_ADDRESS_SIZE);
|
225
|
+
|
226
|
+
const VALUE address = rb_funcall(mTox_cAddress, rb_intern("new"), 1,
|
227
|
+
address_value);
|
228
|
+
|
229
|
+
return address;
|
230
|
+
}
|
231
|
+
|
232
|
+
// Tox::Client#nospam
|
233
|
+
VALUE mTox_cClient_nospam(const VALUE self)
|
234
|
+
{
|
235
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
236
|
+
|
237
|
+
uint32_t nospam_data = tox_self_get_nospam(self_cdata->tox);
|
238
|
+
|
239
|
+
const VALUE nospam_as_integer = LONG2FIX(nospam_data);
|
240
|
+
|
241
|
+
const VALUE nospam = rb_funcall(mTox_cNospam, rb_intern("new"), 1,
|
242
|
+
nospam_as_integer);
|
243
|
+
|
244
|
+
return nospam;
|
245
|
+
}
|
180
246
|
|
181
|
-
|
247
|
+
// Tox::Client#nospam
|
248
|
+
VALUE mTox_cClient_nospam_ASSIGN(const VALUE self, const VALUE nospam)
|
249
|
+
{
|
250
|
+
if (!rb_funcall(nospam, rb_intern("is_a?"), 1, mTox_cNospam)) {
|
251
|
+
RAISE_TYPECHECK("Tox::Client#nospam=", "nospam", "Tox::Nospam");
|
252
|
+
}
|
182
253
|
|
183
|
-
|
254
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
184
255
|
|
185
|
-
|
256
|
+
const VALUE nospam_as_integer = rb_funcall(nospam, rb_intern("to_i"), 0);
|
186
257
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
1,
|
191
|
-
rb_str_new(address, TOX_ADDRESS_SIZE)
|
258
|
+
tox_self_set_nospam(
|
259
|
+
self_cdata->tox,
|
260
|
+
FIX2LONG(nospam_as_integer)
|
192
261
|
);
|
262
|
+
|
263
|
+
return Qnil;
|
193
264
|
}
|
194
265
|
|
195
266
|
// Tox::Client#savedata
|
196
267
|
VALUE mTox_cClient_savedata(const VALUE self)
|
197
268
|
{
|
198
|
-
mTox_cClient_CDATA
|
269
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
270
|
+
|
271
|
+
size_t data_size = tox_get_savedata_size(self_cdata->tox);
|
272
|
+
char *data = ALLOC_N(char, data_size);
|
273
|
+
|
274
|
+
tox_get_savedata(self_cdata->tox, data);
|
275
|
+
|
276
|
+
const VALUE savedata = rb_str_new(data, data_size);
|
277
|
+
|
278
|
+
return savedata;
|
279
|
+
}
|
280
|
+
|
281
|
+
// Tox::Client#udp_port
|
282
|
+
VALUE mTox_cClient_udp_port(const VALUE self)
|
283
|
+
{
|
284
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
285
|
+
|
286
|
+
TOX_ERR_GET_PORT error;
|
287
|
+
|
288
|
+
const uint16_t udp_port_data = tox_self_get_udp_port(self_cdata->tox, &error);
|
289
|
+
|
290
|
+
switch (error) {
|
291
|
+
case TOX_ERR_GET_PORT_OK:
|
292
|
+
break;
|
293
|
+
case TOX_ERR_GET_PORT_NOT_BOUND:
|
294
|
+
return Qnil;
|
295
|
+
default:
|
296
|
+
return Qnil;
|
297
|
+
}
|
298
|
+
|
299
|
+
const VALUE udp_port = LONG2FIX(udp_port_data);
|
300
|
+
|
301
|
+
return udp_port;
|
302
|
+
}
|
303
|
+
|
304
|
+
// Tox::Client#tcp_port
|
305
|
+
VALUE mTox_cClient_tcp_port(const VALUE self)
|
306
|
+
{
|
307
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
199
308
|
|
200
|
-
|
201
|
-
char *data;
|
309
|
+
TOX_ERR_GET_PORT error;
|
202
310
|
|
203
|
-
|
311
|
+
const uint16_t tcp_port_data = tox_self_get_tcp_port(self_cdata->tox, &error);
|
204
312
|
|
205
|
-
|
206
|
-
|
313
|
+
switch (error) {
|
314
|
+
case TOX_ERR_GET_PORT_OK:
|
315
|
+
break;
|
316
|
+
case TOX_ERR_GET_PORT_NOT_BOUND:
|
317
|
+
return Qnil;
|
318
|
+
default:
|
319
|
+
return Qnil;
|
320
|
+
}
|
207
321
|
|
208
|
-
|
322
|
+
const VALUE tcp_port = LONG2FIX(tcp_port_data);
|
209
323
|
|
210
|
-
return
|
324
|
+
return tcp_port;
|
211
325
|
}
|
212
326
|
|
213
327
|
// Tox::Client#bootstrap
|
214
|
-
VALUE mTox_cClient_bootstrap(const VALUE self, const VALUE
|
328
|
+
VALUE mTox_cClient_bootstrap(const VALUE self, const VALUE address, const VALUE port, const VALUE public_key)
|
329
|
+
{
|
330
|
+
Check_Type(address, T_STRING);
|
331
|
+
|
332
|
+
if (!rb_funcall(public_key, rb_intern("is_a?"), 1, mTox_cPublicKey)) {
|
333
|
+
RAISE_TYPECHECK("Tox::Client#bootstrap", "public_key", "Tox::PublicKey");
|
334
|
+
}
|
335
|
+
|
336
|
+
StringValueCStr(address);
|
337
|
+
|
338
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
339
|
+
|
340
|
+
const VALUE public_key_value = rb_funcall(public_key, rb_intern("value"), 0);
|
341
|
+
|
342
|
+
const char *address_data = RSTRING_PTR(address);
|
343
|
+
const uint16_t port_data = NUM2USHORT(port);
|
344
|
+
const char *public_key_data = RSTRING_PTR(public_key_value);
|
345
|
+
|
346
|
+
TOX_ERR_BOOTSTRAP error;
|
347
|
+
|
348
|
+
const bool result = tox_bootstrap(
|
349
|
+
self_cdata->tox,
|
350
|
+
address_data,
|
351
|
+
port_data,
|
352
|
+
public_key_data,
|
353
|
+
&error
|
354
|
+
);
|
355
|
+
|
356
|
+
switch (error) {
|
357
|
+
case TOX_ERR_BOOTSTRAP_OK:
|
358
|
+
break;
|
359
|
+
case TOX_ERR_BOOTSTRAP_NULL:
|
360
|
+
return Qfalse;
|
361
|
+
case TOX_ERR_BOOTSTRAP_BAD_HOST:
|
362
|
+
return Qfalse;
|
363
|
+
case TOX_ERR_BOOTSTRAP_BAD_PORT:
|
364
|
+
return Qfalse;
|
365
|
+
default:
|
366
|
+
return Qfalse;
|
367
|
+
}
|
368
|
+
|
369
|
+
if (!result) {
|
370
|
+
return Qfalse;
|
371
|
+
}
|
372
|
+
|
373
|
+
return Qtrue;
|
374
|
+
}
|
375
|
+
|
376
|
+
// Tox::Client#add_tcp_relay
|
377
|
+
VALUE mTox_cClient_add_tcp_relay(const VALUE self, const VALUE address, const VALUE port, const VALUE public_key)
|
215
378
|
{
|
216
|
-
|
217
|
-
|
379
|
+
Check_Type(address, T_STRING);
|
380
|
+
|
381
|
+
if (!rb_funcall(public_key, rb_intern("is_a?"), 1, mTox_cPublicKey)) {
|
382
|
+
RAISE_TYPECHECK("Tox::Client#bootstrap", "public_key", "Tox::PublicKey");
|
218
383
|
}
|
219
384
|
|
220
|
-
|
385
|
+
StringValueCStr(address);
|
221
386
|
|
222
|
-
|
387
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
388
|
+
|
389
|
+
const VALUE public_key_value = rb_funcall(public_key, rb_intern("value"), 0);
|
390
|
+
|
391
|
+
const char *address_data = RSTRING_PTR(address);
|
392
|
+
const uint16_t port_data = NUM2USHORT(port);
|
393
|
+
const char *public_key_data = RSTRING_PTR(public_key_value);
|
223
394
|
|
224
395
|
TOX_ERR_BOOTSTRAP error;
|
225
396
|
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
397
|
+
const bool result = tox_add_tcp_relay(
|
398
|
+
self_cdata->tox,
|
399
|
+
address_data,
|
400
|
+
port_data,
|
401
|
+
public_key_data,
|
402
|
+
&error
|
403
|
+
);
|
231
404
|
|
232
405
|
switch (error) {
|
233
406
|
case TOX_ERR_BOOTSTRAP_OK:
|
234
|
-
|
407
|
+
break;
|
235
408
|
case TOX_ERR_BOOTSTRAP_NULL:
|
236
409
|
return Qfalse;
|
237
410
|
case TOX_ERR_BOOTSTRAP_BAD_HOST:
|
@@ -241,40 +414,44 @@ VALUE mTox_cClient_bootstrap(const VALUE self, const VALUE node)
|
|
241
414
|
default:
|
242
415
|
return Qfalse;
|
243
416
|
}
|
417
|
+
|
418
|
+
if (!result) {
|
419
|
+
return Qfalse;
|
420
|
+
}
|
421
|
+
|
422
|
+
return Qtrue;
|
244
423
|
}
|
245
424
|
|
246
425
|
// Tox::Client#name
|
247
426
|
VALUE mTox_cClient_name(const VALUE self)
|
248
427
|
{
|
249
|
-
mTox_cClient_CDATA
|
250
|
-
|
251
|
-
Data_Get_Struct(self, mTox_cClient_CDATA, self_cdata);
|
428
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
252
429
|
|
253
|
-
const size_t
|
430
|
+
const size_t name_size_data = tox_self_get_name_size(self_cdata->tox);
|
254
431
|
|
255
|
-
char
|
432
|
+
char name_data[name_size_data];
|
256
433
|
|
257
|
-
if (
|
258
|
-
tox_self_get_name(self_cdata->tox,
|
434
|
+
if (name_size_data > 0) {
|
435
|
+
tox_self_get_name(self_cdata->tox, name_data);
|
259
436
|
}
|
260
437
|
|
261
|
-
|
438
|
+
const VALUE name = rb_str_new(name_data, name_size_data);
|
439
|
+
|
440
|
+
return name;
|
262
441
|
}
|
263
442
|
|
264
443
|
// Tox::Client#name=
|
265
|
-
VALUE
|
444
|
+
VALUE mTox_cClient_name_ASSIGN(const VALUE self, const VALUE name)
|
266
445
|
{
|
267
446
|
Check_Type(name, T_STRING);
|
268
447
|
|
269
|
-
mTox_cClient_CDATA
|
270
|
-
|
271
|
-
Data_Get_Struct(self, mTox_cClient_CDATA, self_cdata);
|
448
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
272
449
|
|
273
450
|
TOX_ERR_SET_INFO error;
|
274
451
|
|
275
452
|
const bool result = tox_self_set_name(
|
276
453
|
self_cdata->tox,
|
277
|
-
|
454
|
+
RSTRING_PTR(name),
|
278
455
|
RSTRING_LEN(name),
|
279
456
|
&error
|
280
457
|
);
|
@@ -283,15 +460,23 @@ VALUE mTox_cClient_name_EQUALS(const VALUE self, const VALUE name)
|
|
283
460
|
case TOX_ERR_SET_INFO_OK:
|
284
461
|
break;
|
285
462
|
case TOX_ERR_SET_INFO_NULL:
|
286
|
-
|
463
|
+
RAISE_FUNC_ERROR(
|
464
|
+
"tox_self_set_name",
|
465
|
+
mTox_eNullError,
|
466
|
+
"TOX_ERR_SET_INFO_NULL"
|
467
|
+
);
|
287
468
|
case TOX_ERR_SET_INFO_TOO_LONG:
|
288
|
-
|
469
|
+
RAISE_FUNC_ERROR(
|
470
|
+
"tox_self_set_name",
|
471
|
+
rb_eRuntimeError,
|
472
|
+
"TOX_ERR_SET_INFO_TOO_LONG"
|
473
|
+
);
|
289
474
|
default:
|
290
|
-
|
475
|
+
RAISE_FUNC_ERROR_DEFAULT("tox_self_set_name");
|
291
476
|
}
|
292
477
|
|
293
478
|
if (!result) {
|
294
|
-
|
479
|
+
RAISE_FUNC_RESULT("tox_self_set_name");
|
295
480
|
}
|
296
481
|
|
297
482
|
return name;
|
@@ -300,43 +485,23 @@ VALUE mTox_cClient_name_EQUALS(const VALUE self, const VALUE name)
|
|
300
485
|
// Tox::Client#status
|
301
486
|
VALUE mTox_cClient_status(const VALUE self)
|
302
487
|
{
|
303
|
-
mTox_cClient_CDATA
|
488
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
304
489
|
|
305
|
-
|
490
|
+
const TOX_USER_STATUS status_data = tox_self_get_status(self_cdata->tox);
|
306
491
|
|
307
|
-
const
|
492
|
+
const VALUE status = mTox_mUserStatus_FROM_DATA(status_data);
|
308
493
|
|
309
|
-
|
310
|
-
case TOX_USER_STATUS_NONE:
|
311
|
-
return mTox_mUserStatus_NONE;
|
312
|
-
case TOX_USER_STATUS_AWAY:
|
313
|
-
return mTox_mUserStatus_AWAY;
|
314
|
-
case TOX_USER_STATUS_BUSY:
|
315
|
-
return mTox_mUserStatus_BUSY;
|
316
|
-
default:
|
317
|
-
rb_raise(rb_eNotImpError, "Tox::Client#status has unknown value");
|
318
|
-
}
|
494
|
+
return status;
|
319
495
|
}
|
320
496
|
|
321
497
|
// Tox::Client#status=
|
322
|
-
VALUE
|
498
|
+
VALUE mTox_cClient_status_ASSIGN(const VALUE self, const VALUE status)
|
323
499
|
{
|
324
|
-
mTox_cClient_CDATA
|
500
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
325
501
|
|
326
|
-
|
502
|
+
const TOX_USER_STATUS status_data = mTox_mUserStatus_TO_DATA(status);
|
327
503
|
|
328
|
-
|
329
|
-
tox_self_set_status(self_cdata->tox, TOX_USER_STATUS_NONE);
|
330
|
-
}
|
331
|
-
else if (rb_funcall(mTox_mUserStatus_AWAY, rb_intern("=="), 1, status)) {
|
332
|
-
tox_self_set_status(self_cdata->tox, TOX_USER_STATUS_AWAY);
|
333
|
-
}
|
334
|
-
else if (rb_funcall(mTox_mUserStatus_BUSY, rb_intern("=="), 1, status)) {
|
335
|
-
tox_self_set_status(self_cdata->tox, TOX_USER_STATUS_BUSY);
|
336
|
-
}
|
337
|
-
else {
|
338
|
-
rb_raise(rb_eArgError, "invalid value for Tox::Client#status=");
|
339
|
-
}
|
504
|
+
tox_self_set_status(self_cdata->tox, status_data);
|
340
505
|
|
341
506
|
return status;
|
342
507
|
}
|
@@ -344,35 +509,35 @@ VALUE mTox_cClient_status_EQUALS(const VALUE self, const VALUE status)
|
|
344
509
|
// Tox::Client#status_message
|
345
510
|
VALUE mTox_cClient_status_message(const VALUE self)
|
346
511
|
{
|
347
|
-
mTox_cClient_CDATA
|
512
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
348
513
|
|
349
|
-
|
514
|
+
const size_t status_message_size_data =
|
515
|
+
tox_self_get_status_message_size(self_cdata->tox);
|
350
516
|
|
351
|
-
|
517
|
+
char status_message_data[status_message_size_data];
|
352
518
|
|
353
|
-
|
354
|
-
|
355
|
-
if (status_message_size > 0) {
|
356
|
-
tox_self_get_status_message(self_cdata->tox, (uint8_t*)status_message);
|
519
|
+
if (status_message_size_data > 0) {
|
520
|
+
tox_self_get_status_message(self_cdata->tox, status_message_data);
|
357
521
|
}
|
358
522
|
|
359
|
-
|
523
|
+
const VALUE status_message =
|
524
|
+
rb_str_new(status_message_data, status_message_size_data);
|
525
|
+
|
526
|
+
return status_message;
|
360
527
|
}
|
361
528
|
|
362
529
|
// Tox::Client#status_message=
|
363
|
-
VALUE
|
530
|
+
VALUE mTox_cClient_status_message_ASSIGN(const VALUE self, const VALUE status_message)
|
364
531
|
{
|
365
532
|
Check_Type(status_message, T_STRING);
|
366
533
|
|
367
|
-
mTox_cClient_CDATA
|
368
|
-
|
369
|
-
Data_Get_Struct(self, mTox_cClient_CDATA, self_cdata);
|
534
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
370
535
|
|
371
536
|
TOX_ERR_SET_INFO error;
|
372
537
|
|
373
538
|
const bool result = tox_self_set_status_message(
|
374
539
|
self_cdata->tox,
|
375
|
-
|
540
|
+
RSTRING_PTR(status_message),
|
376
541
|
RSTRING_LEN(status_message),
|
377
542
|
&error
|
378
543
|
);
|
@@ -381,15 +546,23 @@ VALUE mTox_cClient_status_message_EQUALS(const VALUE self, const VALUE status_me
|
|
381
546
|
case TOX_ERR_SET_INFO_OK:
|
382
547
|
break;
|
383
548
|
case TOX_ERR_SET_INFO_NULL:
|
384
|
-
|
549
|
+
RAISE_FUNC_ERROR(
|
550
|
+
"tox_self_set_status_message",
|
551
|
+
mTox_eNullError,
|
552
|
+
"TOX_ERR_SET_INFO_NULL"
|
553
|
+
);
|
385
554
|
case TOX_ERR_SET_INFO_TOO_LONG:
|
386
|
-
|
555
|
+
RAISE_FUNC_ERROR(
|
556
|
+
"tox_self_set_status_message",
|
557
|
+
rb_eRuntimeError,
|
558
|
+
"TOX_ERR_SET_INFO_TOO_LONG"
|
559
|
+
);
|
387
560
|
default:
|
388
|
-
|
561
|
+
RAISE_FUNC_ERROR_DEFAULT("tox_self_set_status_message");
|
389
562
|
}
|
390
563
|
|
391
564
|
if (!result) {
|
392
|
-
|
565
|
+
RAISE_FUNC_RESULT("tox_self_set_status_message");
|
393
566
|
}
|
394
567
|
|
395
568
|
return status_message;
|
@@ -398,14 +571,13 @@ VALUE mTox_cClient_status_message_EQUALS(const VALUE self, const VALUE status_me
|
|
398
571
|
// Tox::Client#friend_numbers
|
399
572
|
VALUE mTox_cClient_friend_numbers(const VALUE self)
|
400
573
|
{
|
401
|
-
mTox_cClient_CDATA
|
402
|
-
|
403
|
-
Data_Get_Struct(self, mTox_cClient_CDATA, self_cdata);
|
574
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
404
575
|
|
405
576
|
const size_t friend_numbers_size = tox_self_get_friend_list_size(self_cdata->tox);
|
406
577
|
|
407
578
|
if (friend_numbers_size == 0) {
|
408
|
-
|
579
|
+
const VALUE friends = rb_ary_new();
|
580
|
+
return friends;
|
409
581
|
}
|
410
582
|
|
411
583
|
uint32_t friend_numbers[friend_numbers_size];
|
@@ -418,30 +590,159 @@ VALUE mTox_cClient_friend_numbers(const VALUE self)
|
|
418
590
|
friend_number_values[i] = LONG2NUM(friend_numbers[i]);
|
419
591
|
}
|
420
592
|
|
421
|
-
|
593
|
+
const VALUE friends = rb_ary_new4(friend_numbers_size, friend_number_values);
|
594
|
+
|
595
|
+
return friends;
|
422
596
|
}
|
423
597
|
|
424
598
|
// Tox::Client#friend_add_norequest
|
425
599
|
VALUE mTox_cClient_friend_add_norequest(const VALUE self, const VALUE public_key)
|
426
600
|
{
|
427
|
-
|
601
|
+
if (!rb_funcall(public_key, rb_intern("is_a?"), 1, mTox_cPublicKey)) {
|
602
|
+
RAISE_TYPECHECK("Tox::Client#friend_add_norequest", "public_key", "Tox::PublicKey");
|
603
|
+
}
|
604
|
+
|
605
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
428
606
|
|
429
|
-
|
607
|
+
const VALUE public_key_value = rb_funcall(public_key, rb_intern("value"), 0);
|
430
608
|
|
431
|
-
|
609
|
+
TOX_ERR_FRIEND_ADD error;
|
432
610
|
|
433
611
|
const VALUE friend_number = LONG2FIX(tox_friend_add_norequest(
|
434
612
|
self_cdata->tox,
|
435
|
-
|
436
|
-
|
613
|
+
RSTRING_PTR(public_key_value),
|
614
|
+
&error
|
437
615
|
));
|
438
616
|
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
617
|
+
switch (error) {
|
618
|
+
case TOX_ERR_FRIEND_ADD_OK:
|
619
|
+
break;
|
620
|
+
case TOX_ERR_FRIEND_ADD_NULL:
|
621
|
+
RAISE_FUNC_ERROR(
|
622
|
+
"tox_friend_add_norequest",
|
623
|
+
mTox_eNullError,
|
624
|
+
"TOX_ERR_FRIEND_ADD_NULL"
|
625
|
+
);
|
626
|
+
case TOX_ERR_FRIEND_ADD_OWN_KEY:
|
627
|
+
RAISE_FUNC_ERROR(
|
628
|
+
"tox_friend_add_norequest",
|
629
|
+
rb_eRuntimeError,
|
630
|
+
"TOX_ERR_FRIEND_ADD_OWN_KEY"
|
631
|
+
);
|
632
|
+
case TOX_ERR_FRIEND_ADD_ALREADY_SENT:
|
633
|
+
RAISE_FUNC_ERROR(
|
634
|
+
"tox_friend_add_norequest",
|
635
|
+
rb_eRuntimeError,
|
636
|
+
"TOX_ERR_FRIEND_ADD_ALREADY_SENT"
|
637
|
+
);
|
638
|
+
case TOX_ERR_FRIEND_ADD_BAD_CHECKSUM:
|
639
|
+
RAISE_FUNC_ERROR(
|
640
|
+
"tox_friend_add_norequest",
|
641
|
+
rb_eRuntimeError,
|
642
|
+
"TOX_ERR_FRIEND_ADD_BAD_CHECKSUM"
|
643
|
+
);
|
644
|
+
case TOX_ERR_FRIEND_ADD_SET_NEW_NOSPAM:
|
645
|
+
RAISE_FUNC_ERROR(
|
646
|
+
"tox_friend_add_norequest",
|
647
|
+
rb_eRuntimeError,
|
648
|
+
"TOX_ERR_FRIEND_ADD_SET_NEW_NOSPAM"
|
649
|
+
);
|
650
|
+
case TOX_ERR_FRIEND_ADD_MALLOC:
|
651
|
+
RAISE_FUNC_ERROR(
|
652
|
+
"tox_friend_add_norequest",
|
653
|
+
rb_eNoMemError,
|
654
|
+
"TOX_ERR_FRIEND_ADD_MALLOC"
|
655
|
+
);
|
656
|
+
default:
|
657
|
+
RAISE_FUNC_ERROR_DEFAULT("tox_friend_add_norequest");
|
658
|
+
}
|
659
|
+
|
660
|
+
const VALUE friend = rb_funcall(self, rb_intern("friend"), 1,
|
661
|
+
friend_number);
|
662
|
+
|
663
|
+
return friend;
|
664
|
+
}
|
665
|
+
|
666
|
+
// Tox::Client#friend_add
|
667
|
+
VALUE mTox_cClient_friend_add(const VALUE self, const VALUE address, const VALUE text)
|
668
|
+
{
|
669
|
+
if (!rb_funcall(address, rb_intern("is_a?"), 1, mTox_cAddress)) {
|
670
|
+
RAISE_TYPECHECK("Tox::Client#friend_add", "address", "Tox::Address");
|
671
|
+
}
|
672
|
+
|
673
|
+
Check_Type(text, T_STRING);
|
674
|
+
|
675
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
676
|
+
|
677
|
+
TOX_ERR_FRIEND_ADD error;
|
678
|
+
|
679
|
+
const VALUE address_value = rb_funcall(address, rb_intern("value"), 0);
|
680
|
+
|
681
|
+
const VALUE friend_number = LONG2FIX(tox_friend_add(
|
682
|
+
self_cdata->tox,
|
683
|
+
RSTRING_PTR(address_value),
|
684
|
+
RSTRING_PTR(text),
|
685
|
+
RSTRING_LEN(text),
|
686
|
+
&error
|
687
|
+
));
|
688
|
+
|
689
|
+
switch (error) {
|
690
|
+
case TOX_ERR_FRIEND_ADD_OK:
|
691
|
+
break;
|
692
|
+
case TOX_ERR_FRIEND_ADD_NULL:
|
693
|
+
RAISE_FUNC_ERROR(
|
694
|
+
"tox_friend_add",
|
695
|
+
mTox_eNullError,
|
696
|
+
"TOX_ERR_FRIEND_ADD_NULL"
|
697
|
+
);
|
698
|
+
case TOX_ERR_FRIEND_ADD_NO_MESSAGE:
|
699
|
+
RAISE_FUNC_ERROR(
|
700
|
+
"tox_friend_add",
|
701
|
+
mTox_eNullError,
|
702
|
+
"TOX_ERR_FRIEND_ADD_NO_MESSAGE"
|
703
|
+
);
|
704
|
+
case TOX_ERR_FRIEND_ADD_TOO_LONG:
|
705
|
+
RAISE_FUNC_ERROR(
|
706
|
+
"tox_friend_add",
|
707
|
+
mTox_eNullError,
|
708
|
+
"TOX_ERR_FRIEND_ADD_TOO_LONG"
|
709
|
+
);
|
710
|
+
case TOX_ERR_FRIEND_ADD_OWN_KEY:
|
711
|
+
RAISE_FUNC_ERROR(
|
712
|
+
"tox_friend_add",
|
713
|
+
rb_eRuntimeError,
|
714
|
+
"TOX_ERR_FRIEND_ADD_OWN_KEY"
|
715
|
+
);
|
716
|
+
case TOX_ERR_FRIEND_ADD_ALREADY_SENT:
|
717
|
+
RAISE_FUNC_ERROR(
|
718
|
+
"tox_friend_add",
|
719
|
+
rb_eRuntimeError,
|
720
|
+
"TOX_ERR_FRIEND_ADD_ALREADY_SENT"
|
721
|
+
);
|
722
|
+
case TOX_ERR_FRIEND_ADD_BAD_CHECKSUM:
|
723
|
+
RAISE_FUNC_ERROR(
|
724
|
+
"tox_friend_add",
|
725
|
+
rb_eRuntimeError,
|
726
|
+
"TOX_ERR_FRIEND_ADD_BAD_CHECKSUM"
|
727
|
+
);
|
728
|
+
case TOX_ERR_FRIEND_ADD_SET_NEW_NOSPAM:
|
729
|
+
RAISE_FUNC_ERROR(
|
730
|
+
"tox_friend_add",
|
731
|
+
rb_eRuntimeError,
|
732
|
+
"TOX_ERR_FRIEND_ADD_SET_NEW_NOSPAM"
|
733
|
+
);
|
734
|
+
case TOX_ERR_FRIEND_ADD_MALLOC:
|
735
|
+
RAISE_FUNC_ERROR(
|
736
|
+
"tox_friend_add",
|
737
|
+
rb_eNoMemError,
|
738
|
+
"TOX_ERR_FRIEND_ADD_MALLOC"
|
739
|
+
);
|
740
|
+
}
|
741
|
+
|
742
|
+
const VALUE friend = rb_funcall(self, rb_intern("friend"), 1,
|
743
|
+
friend_number);
|
744
|
+
|
745
|
+
return friend;
|
445
746
|
}
|
446
747
|
|
447
748
|
/*************************************************************
|
@@ -451,43 +752,80 @@ VALUE mTox_cClient_friend_add_norequest(const VALUE self, const VALUE public_key
|
|
451
752
|
// Tox::Client#initialize_with
|
452
753
|
VALUE mTox_cClient_initialize_with(const VALUE self, const VALUE options)
|
453
754
|
{
|
454
|
-
mTox_cClient_CDATA *self_cdata;
|
455
|
-
mTox_cOptions_CDATA *options_cdata;
|
456
|
-
|
457
755
|
if (!rb_funcall(options, rb_intern("is_a?"), 1, mTox_cOptions)) {
|
458
|
-
|
756
|
+
RAISE_TYPECHECK("Tox::Client#initialize_with", "options", "Tox::Options");
|
459
757
|
}
|
460
758
|
|
461
|
-
|
462
|
-
|
759
|
+
CDATA(self, mTox_cClient_CDATA, self_cdata);
|
760
|
+
CDATA(options, mTox_cOptions_CDATA, options_cdata);
|
463
761
|
|
464
762
|
TOX_ERR_NEW error;
|
465
763
|
|
466
|
-
self_cdata->tox = tox_new(options_cdata, &error);
|
764
|
+
self_cdata->tox = tox_new(options_cdata->tox_options, &error);
|
467
765
|
|
468
766
|
switch (error) {
|
469
767
|
case TOX_ERR_NEW_OK:
|
470
768
|
break;
|
471
769
|
case TOX_ERR_NEW_NULL:
|
472
|
-
|
770
|
+
RAISE_FUNC_ERROR(
|
771
|
+
"tox_new",
|
772
|
+
mTox_eNullError,
|
773
|
+
"TOX_ERR_NEW_NULL"
|
774
|
+
);
|
473
775
|
case TOX_ERR_NEW_MALLOC:
|
474
|
-
|
776
|
+
RAISE_FUNC_ERROR(
|
777
|
+
"tox_new",
|
778
|
+
rb_eNoMemError,
|
779
|
+
"TOX_ERR_NEW_MALLOC"
|
780
|
+
);
|
475
781
|
case TOX_ERR_NEW_PORT_ALLOC:
|
476
|
-
|
782
|
+
RAISE_FUNC_ERROR(
|
783
|
+
"tox_new",
|
784
|
+
rb_eRuntimeError,
|
785
|
+
"TOX_ERR_NEW_PORT_ALLOC"
|
786
|
+
);
|
477
787
|
case TOX_ERR_NEW_PROXY_BAD_TYPE:
|
478
|
-
|
788
|
+
RAISE_FUNC_ERROR(
|
789
|
+
"tox_new",
|
790
|
+
rb_eRuntimeError,
|
791
|
+
"TOX_ERR_NEW_PROXY_BAD_TYPE"
|
792
|
+
);
|
479
793
|
case TOX_ERR_NEW_PROXY_BAD_HOST:
|
480
|
-
|
794
|
+
RAISE_FUNC_ERROR(
|
795
|
+
"tox_new",
|
796
|
+
rb_eRuntimeError,
|
797
|
+
"TOX_ERR_NEW_PROXY_BAD_HOST"
|
798
|
+
);
|
481
799
|
case TOX_ERR_NEW_PROXY_BAD_PORT:
|
482
|
-
|
800
|
+
RAISE_FUNC_ERROR(
|
801
|
+
"tox_new",
|
802
|
+
rb_eRuntimeError,
|
803
|
+
"TOX_ERR_NEW_PROXY_BAD_PORT"
|
804
|
+
);
|
483
805
|
case TOX_ERR_NEW_PROXY_NOT_FOUND:
|
484
|
-
|
806
|
+
RAISE_FUNC_ERROR(
|
807
|
+
"tox_new",
|
808
|
+
rb_eRuntimeError,
|
809
|
+
"TOX_ERR_NEW_PROXY_NOT_FOUND"
|
810
|
+
);
|
485
811
|
case TOX_ERR_NEW_LOAD_ENCRYPTED:
|
486
|
-
|
812
|
+
RAISE_FUNC_ERROR(
|
813
|
+
"tox_new",
|
814
|
+
rb_eRuntimeError,
|
815
|
+
"TOX_ERR_NEW_LOAD_ENCRYPTED"
|
816
|
+
);
|
487
817
|
case TOX_ERR_NEW_LOAD_BAD_FORMAT:
|
488
|
-
|
818
|
+
RAISE_FUNC_ERROR(
|
819
|
+
"tox_new",
|
820
|
+
mTox_cClient_eBadSavedataError,
|
821
|
+
"TOX_ERR_NEW_LOAD_BAD_FORMAT"
|
822
|
+
);
|
489
823
|
default:
|
490
|
-
|
824
|
+
RAISE_FUNC_ERROR_DEFAULT("tox_new");
|
825
|
+
}
|
826
|
+
|
827
|
+
if (!self_cdata->tox) {
|
828
|
+
RAISE_FUNC_RESULT("tox_new");
|
491
829
|
}
|
492
830
|
|
493
831
|
tox_callback_friend_request (self_cdata->tox, on_friend_request);
|
@@ -499,42 +837,15 @@ VALUE mTox_cClient_initialize_with(const VALUE self, const VALUE options)
|
|
499
837
|
return self;
|
500
838
|
}
|
501
839
|
|
502
|
-
// Tox::Client#run_loop
|
503
|
-
VALUE mTox_cClient_run_loop(const VALUE self)
|
504
|
-
{
|
505
|
-
mTox_cClient_CDATA *self_cdata;
|
506
|
-
|
507
|
-
Data_Get_Struct(self, mTox_cClient_CDATA, self_cdata);
|
508
|
-
|
509
|
-
struct timespec delay;
|
510
|
-
|
511
|
-
delay.tv_sec = 0;
|
512
|
-
|
513
|
-
const VALUE ivar_on_iteration = rb_iv_get(self, "@on_iteration");
|
514
|
-
|
515
|
-
while (rb_funcall(self, rb_intern("running?"), 0)) {
|
516
|
-
delay.tv_nsec = tox_iteration_interval(self_cdata->tox) * 1000000;
|
517
|
-
nanosleep(&delay, NULL);
|
518
|
-
|
519
|
-
tox_iterate(self_cdata->tox, self);
|
520
|
-
|
521
|
-
if (Qnil != ivar_on_iteration) {
|
522
|
-
rb_funcall(ivar_on_iteration, rb_intern("call"), 0);
|
523
|
-
}
|
524
|
-
}
|
525
|
-
|
526
|
-
return self;
|
527
|
-
}
|
528
|
-
|
529
840
|
/*************************************************************
|
530
841
|
* Callbacks
|
531
842
|
*************************************************************/
|
532
843
|
|
533
844
|
void on_friend_request(
|
534
845
|
Tox *const tox,
|
535
|
-
const uint8_t *const
|
536
|
-
const uint8_t *const
|
537
|
-
const size_t
|
846
|
+
const uint8_t *const public_key_data,
|
847
|
+
const uint8_t *const text_data,
|
848
|
+
const size_t text_length_data,
|
538
849
|
const VALUE self
|
539
850
|
)
|
540
851
|
{
|
@@ -544,26 +855,25 @@ void on_friend_request(
|
|
544
855
|
return;
|
545
856
|
}
|
546
857
|
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
);
|
858
|
+
const VALUE public_key_value =
|
859
|
+
rb_str_new(public_key_data, TOX_PUBLIC_KEY_SIZE);
|
860
|
+
|
861
|
+
const VALUE public_key = rb_funcall(mTox_cPublicKey, rb_intern("new"), 1,
|
862
|
+
public_key_value);
|
863
|
+
|
864
|
+
const VALUE text = rb_str_new(text_data, text_length_data);
|
865
|
+
|
866
|
+
rb_funcall(ivar_on_friend_request, rb_intern("call"), 2,
|
867
|
+
public_key,
|
868
|
+
text);
|
559
869
|
}
|
560
870
|
|
561
871
|
void on_friend_message(
|
562
872
|
Tox *const tox,
|
563
|
-
const uint32_t
|
873
|
+
const uint32_t friend_number_data,
|
564
874
|
const TOX_MESSAGE_TYPE type,
|
565
|
-
const uint8_t *const
|
566
|
-
const size_t
|
875
|
+
const uint8_t *const text_data,
|
876
|
+
const size_t text_length_data,
|
567
877
|
const VALUE self
|
568
878
|
)
|
569
879
|
{
|
@@ -573,119 +883,103 @@ void on_friend_message(
|
|
573
883
|
return;
|
574
884
|
}
|
575
885
|
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
rb_str_new((char*)text, length)
|
588
|
-
);
|
886
|
+
const VALUE friend_number = LONG2FIX(friend_number_data);
|
887
|
+
|
888
|
+
const VALUE friend = rb_funcall(mTox_cFriend, rb_intern("new"), 2,
|
889
|
+
self,
|
890
|
+
friend_number);
|
891
|
+
|
892
|
+
const VALUE text = rb_str_new(text_data, text_length_data);
|
893
|
+
|
894
|
+
rb_funcall(ivar_on_friend_message, rb_intern("call"), 2,
|
895
|
+
friend,
|
896
|
+
text);
|
589
897
|
}
|
590
898
|
|
591
899
|
void on_friend_name_change(
|
592
900
|
Tox *const tox,
|
593
|
-
const uint32_t
|
594
|
-
const uint8_t *const
|
595
|
-
const size_t
|
901
|
+
const uint32_t friend_number_data,
|
902
|
+
const uint8_t *const name_data,
|
903
|
+
const size_t name_length_data,
|
596
904
|
const VALUE self
|
597
905
|
)
|
598
906
|
{
|
599
|
-
const VALUE ivar_on_friend_name_change =
|
907
|
+
const VALUE ivar_on_friend_name_change =
|
908
|
+
rb_iv_get(self, "@on_friend_name_change");
|
600
909
|
|
601
910
|
if (Qnil == ivar_on_friend_name_change) {
|
602
911
|
return;
|
603
912
|
}
|
604
913
|
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
|
615
|
-
|
616
|
-
rb_str_new(name, length)
|
617
|
-
);
|
914
|
+
const VALUE friend_number = LONG2FIX(friend_number_data);
|
915
|
+
|
916
|
+
const VALUE friend = rb_funcall(mTox_cFriend, rb_intern("new"), 2,
|
917
|
+
self,
|
918
|
+
friend_number);
|
919
|
+
|
920
|
+
const VALUE name = rb_str_new(name_data, name_length_data);
|
921
|
+
|
922
|
+
rb_funcall(ivar_on_friend_name_change, rb_intern("call"), 2,
|
923
|
+
friend,
|
924
|
+
name);
|
618
925
|
}
|
619
926
|
|
620
927
|
void on_friend_status_message_change(
|
621
928
|
Tox *const tox,
|
622
|
-
const uint32_t
|
623
|
-
const uint8_t *const
|
624
|
-
size_t
|
929
|
+
const uint32_t friend_number_data,
|
930
|
+
const uint8_t *const status_message_data,
|
931
|
+
size_t status_message_length_data,
|
625
932
|
const VALUE self
|
626
933
|
)
|
627
934
|
{
|
628
|
-
const VALUE ivar_on_friend_status_message_change =
|
935
|
+
const VALUE ivar_on_friend_status_message_change =
|
936
|
+
rb_iv_get(self, "@on_friend_status_message_change");
|
629
937
|
|
630
938
|
if (Qnil == ivar_on_friend_status_message_change) {
|
631
939
|
return;
|
632
940
|
}
|
633
941
|
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
);
|
942
|
+
const VALUE friend_number = LONG2FIX(friend_number_data);
|
943
|
+
|
944
|
+
const VALUE friend = rb_funcall(mTox_cFriend, rb_intern("new"), 2,
|
945
|
+
self,
|
946
|
+
friend_number);
|
947
|
+
|
948
|
+
const VALUE status_message =
|
949
|
+
rb_str_new(status_message_data, status_message_length_data);
|
950
|
+
|
951
|
+
rb_funcall(ivar_on_friend_status_message_change, rb_intern("call"), 2,
|
952
|
+
friend,
|
953
|
+
status_message);
|
647
954
|
}
|
648
955
|
|
649
956
|
void on_friend_status_change(
|
650
957
|
Tox *const tox,
|
651
|
-
const uint32_t
|
652
|
-
const TOX_USER_STATUS
|
958
|
+
const uint32_t friend_number_data,
|
959
|
+
const TOX_USER_STATUS status_data,
|
653
960
|
const VALUE self
|
654
961
|
)
|
655
962
|
{
|
656
|
-
const VALUE ivar_on_friend_status_change =
|
963
|
+
const VALUE ivar_on_friend_status_change =
|
964
|
+
rb_iv_get(self, "@on_friend_status_change");
|
657
965
|
|
658
966
|
if (Qnil == ivar_on_friend_status_change) {
|
659
967
|
return;
|
660
968
|
}
|
661
969
|
|
662
|
-
VALUE
|
970
|
+
const VALUE status = mTox_mUserStatus_TRY_DATA(status_data);
|
663
971
|
|
664
|
-
|
665
|
-
|
666
|
-
status_value = mTox_mUserStatus_NONE;
|
667
|
-
break;
|
668
|
-
case TOX_USER_STATUS_AWAY:
|
669
|
-
status_value = mTox_mUserStatus_AWAY;
|
670
|
-
break;
|
671
|
-
case TOX_USER_STATUS_BUSY:
|
672
|
-
status_value = mTox_mUserStatus_BUSY;
|
673
|
-
break;
|
674
|
-
default:
|
675
|
-
return;
|
972
|
+
if (status == Qnil) {
|
973
|
+
return;
|
676
974
|
}
|
677
975
|
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
LONG2FIX(friend_number)
|
688
|
-
),
|
689
|
-
status_value
|
690
|
-
);
|
976
|
+
const VALUE friend_number = LONG2FIX(friend_number_data);
|
977
|
+
|
978
|
+
const VALUE friend = rb_funcall(mTox_cFriend, rb_intern("new"), 2,
|
979
|
+
self,
|
980
|
+
friend_number);
|
981
|
+
|
982
|
+
rb_funcall(ivar_on_friend_status_change, rb_intern("call"), 2,
|
983
|
+
friend,
|
984
|
+
status);
|
691
985
|
}
|