lita-tox 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +15 -13
- data/ext/tox/extconf.rb +6 -0
- data/ext/tox/tox.c +136 -0
- data/lib/lita/adapters/tox.rb +42 -2
- data/lib/tox.rb +8 -0
- data/lita-tox.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7594dc6e702a18b828fe46e1b8b64d9ad508690b
|
4
|
+
data.tar.gz: 53a3a8abf586220ae055867fbbb7608fe432072b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 89053fb6c2db27721f1e51d8a5cccea01f5cdc2604b89ad499ea00b6b733bd16690aee497f9ab24d98994656baeec7a1ffd2b963cfff5333ebd960c7425c82d9
|
7
|
+
data.tar.gz: 45f399f7696d54b47c19815da80716cdc9140ce4b4c030f16ff412d821c31fbf1799d979d2267d9626cf45a04208cf0ab13446a55d059768e6f6579ee32d44af
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## [v0.2.0](https://github.com/braiden-vasco/lita-tox/tree/v0.2.0) (2015-09-14)
|
4
|
+
[Full Changelog](https://github.com/braiden-vasco/lita-tox/compare/v0.1.0...v0.2.0)
|
5
|
+
|
6
|
+
**Merged pull requests:**
|
7
|
+
|
8
|
+
- Implement group chats [\#20](https://github.com/braiden-vasco/lita-tox/pull/20) ([braiden-vasco](https://github.com/braiden-vasco))
|
9
|
+
- Save Tox state [\#19](https://github.com/braiden-vasco/lita-tox/pull/19) ([braiden-vasco](https://github.com/braiden-vasco))
|
10
|
+
|
3
11
|
## [v0.1.0](https://github.com/braiden-vasco/lita-tox/tree/v0.1.0) (2015-09-13)
|
4
12
|
**Merged pull requests:**
|
5
13
|
|
data/README.md
CHANGED
@@ -18,18 +18,16 @@ TODO
|
|
18
18
|
Current development version have some limitations
|
19
19
|
which should be fixed in first release:
|
20
20
|
|
21
|
-
*
|
22
|
-
|
23
|
-
|
21
|
+
* [\[issue #16\]](https://github.com/braiden-vasco/lita-tox/issues/16)
|
22
|
+
**libtoxcore** is not included in the gem. It should be compiled manually
|
23
|
+
to build the gem native extension successfully. Follow the instructions in
|
24
|
+
[that file](https://github.com/irungentoo/toxcore/blob/2ab3b14731061cc04d3ccc50a35093c11d018298/INSTALL.md)
|
24
25
|
|
25
|
-
*
|
26
|
+
* [\[issue #17\]](https://github.com/braiden-vasco/lita-tox/issues/17)
|
27
|
+
JRuby is not supported. Only C extension for Tox is implemented
|
26
28
|
|
27
|
-
*
|
28
|
-
|
29
|
-
|
30
|
-
* JRuby is not supported. Only C extension for Tox is implemented
|
31
|
-
|
32
|
-
* Message length is limited to value of `TOX_MAX_MESSAGE_LENGTH`
|
29
|
+
* [\[issue #18\]](https://github.com/braiden-vasco/lita-tox/issues/18)
|
30
|
+
Message length is limited to value of `TOX_MAX_MESSAGE_LENGTH`
|
33
31
|
(see [source code of **libtoxcore**](https://github.com/irungentoo/toxcore/blob/2ab3b14731061cc04d3ccc50a35093c11d018298/toxcore/tox.h#L252-L255))
|
34
32
|
|
35
33
|
* Adapter has incomplete API for Lita. Only basic methods are implemented
|
@@ -43,19 +41,21 @@ At first, see the documentation for Lita: http://docs.lita.io/
|
|
43
41
|
### Installation
|
44
42
|
|
45
43
|
**libtoxcore** should be compiled manually at your computer or server.
|
46
|
-
Follow the instructions
|
44
|
+
Follow the instructions in
|
47
45
|
[that file](https://github.com/irungentoo/toxcore/blob/2ab3b14731061cc04d3ccc50a35093c11d018298/INSTALL.md)
|
48
46
|
|
49
47
|
When **libtoxcore** is installed, add **lita-tox**
|
50
48
|
to your Lita instance's Gemfile:
|
51
49
|
|
52
50
|
```ruby
|
53
|
-
gem 'lita-tox', '~> 0.
|
51
|
+
gem 'lita-tox', '~> 0.2.0'
|
54
52
|
```
|
55
53
|
|
56
54
|
### Configuration
|
57
55
|
|
58
|
-
|
56
|
+
#### Optional attributes
|
57
|
+
|
58
|
+
- `savedata_filename` (String) - Path to file where Tox state will be stored (if provided)
|
59
59
|
|
60
60
|
#### Example
|
61
61
|
|
@@ -67,5 +67,7 @@ Lita.configure do |config|
|
|
67
67
|
config.robot.mention_name = 'lita'
|
68
68
|
|
69
69
|
config.robot.adapter = :tox
|
70
|
+
|
71
|
+
config.savedata_filename = 'savedata'
|
70
72
|
end
|
71
73
|
```
|
data/ext/tox/extconf.rb
CHANGED
@@ -8,6 +8,7 @@ LIBTOXCORE = 'toxcore'
|
|
8
8
|
|
9
9
|
have_header 'time.h' and
|
10
10
|
have_header 'tox/tox.h' and
|
11
|
+
have_header 'tox/tox_old.h' and
|
11
12
|
|
12
13
|
have_func 'sprintf' and
|
13
14
|
have_func 'sscanf' and
|
@@ -27,5 +28,10 @@ have_library LIBTOXCORE, 'tox_friend_add_norequest' and
|
|
27
28
|
have_library LIBTOXCORE, 'tox_friend_send_message' and
|
28
29
|
have_library LIBTOXCORE, 'tox_callback_friend_request' and
|
29
30
|
have_library LIBTOXCORE, 'tox_callback_friend_message' and
|
31
|
+
have_library LIBTOXCORE, 'tox_join_groupchat' and
|
32
|
+
have_library LIBTOXCORE, 'tox_group_message_send' and
|
33
|
+
have_library LIBTOXCORE, 'tox_callback_group_invite' and
|
34
|
+
have_library LIBTOXCORE, 'tox_callback_group_message' and
|
35
|
+
have_library LIBTOXCORE, 'tox_group_peernumber_is_ours' and
|
30
36
|
|
31
37
|
create_makefile "#{NAME}/#{NAME}" or exit(1)
|
data/ext/tox/tox.c
CHANGED
@@ -40,6 +40,9 @@ static VALUE cTox_kill(VALUE self);
|
|
40
40
|
static VALUE cTox_loop(VALUE self);
|
41
41
|
static VALUE cTox_friend_add_norequest(VALUE self, VALUE key);
|
42
42
|
static VALUE cTox_friend_send_message(VALUE self, VALUE friend_number, VALUE text);
|
43
|
+
static VALUE cTox_join_groupchat(VALUE self, VALUE friend_number, VALUE data);
|
44
|
+
static VALUE cTox_group_message_send(VALUE self, VALUE group_number, VALUE text);
|
45
|
+
static VALUE cTox_group_peernumber_is_ours(VALUE self, VALUE group_number, VALUE peer_number);
|
43
46
|
|
44
47
|
static void on_friend_request(
|
45
48
|
Tox *tox,
|
@@ -56,6 +59,24 @@ static void on_friend_message(
|
|
56
59
|
size_t length,
|
57
60
|
VALUE self);
|
58
61
|
|
62
|
+
static void on_group_invite(
|
63
|
+
Tox *tox,
|
64
|
+
int32_t friend_number,
|
65
|
+
uint8_t type,
|
66
|
+
const uint8_t *data,
|
67
|
+
uint16_t length,
|
68
|
+
VALUE self
|
69
|
+
);
|
70
|
+
|
71
|
+
static void on_group_message(
|
72
|
+
Tox *tox,
|
73
|
+
int group_number,
|
74
|
+
int peer_number,
|
75
|
+
const uint8_t *text,
|
76
|
+
uint16_t length,
|
77
|
+
VALUE self
|
78
|
+
);
|
79
|
+
|
59
80
|
typedef struct Tox_Options cTox_cOptions_;
|
60
81
|
|
61
82
|
static VALUE cTox_cOptions;
|
@@ -80,6 +101,9 @@ void Init_tox()
|
|
80
101
|
rb_define_method(cTox, "loop", cTox_loop, 0);
|
81
102
|
rb_define_method(cTox, "friend_add_norequest", cTox_friend_add_norequest, 1);
|
82
103
|
rb_define_method(cTox, "friend_send_message", cTox_friend_send_message, 2);
|
104
|
+
rb_define_method(cTox, "join_groupchat", cTox_join_groupchat, 2);
|
105
|
+
rb_define_method(cTox, "group_message_send", cTox_group_message_send, 2);
|
106
|
+
rb_define_method(cTox, "group_peernumber_is_ours", cTox_group_peernumber_is_ours, 2);
|
83
107
|
|
84
108
|
cTox_cOptions = rb_define_class_under(cTox, "Options", rb_cObject);
|
85
109
|
rb_define_alloc_func(cTox_cOptions, cTox_cOptions_alloc);
|
@@ -138,6 +162,14 @@ VALUE cTox_initialize_with(const VALUE self, const VALUE options)
|
|
138
162
|
|
139
163
|
tox_callback_friend_request(tox->tox, (tox_friend_request_cb*)on_friend_request, (void*)self);
|
140
164
|
tox_callback_friend_message(tox->tox, (tox_friend_message_cb*)on_friend_message, (void*)self);
|
165
|
+
tox_callback_group_invite(
|
166
|
+
tox->tox,
|
167
|
+
(void (*)(struct Tox *, int32_t, uint8_t, const uint8_t *, uint16_t, void *))on_group_invite,
|
168
|
+
(void*)self);
|
169
|
+
tox_callback_group_message(
|
170
|
+
tox->tox,
|
171
|
+
(void (*)(struct Tox *, int, int, const uint8_t *, uint16_t, void *))on_group_message,
|
172
|
+
(void*)self);
|
141
173
|
|
142
174
|
return self;
|
143
175
|
}
|
@@ -281,6 +313,65 @@ VALUE cTox_friend_send_message(const VALUE self, const VALUE friend_number, cons
|
|
281
313
|
));
|
282
314
|
}
|
283
315
|
|
316
|
+
VALUE cTox_join_groupchat(const VALUE self, const VALUE friend_number, const VALUE data)
|
317
|
+
{
|
318
|
+
cTox_ *tox;
|
319
|
+
|
320
|
+
// Don't know yet how to check for integers
|
321
|
+
// Check_Type(friend_number, T_INTEGER);
|
322
|
+
Check_Type(data, T_STRING);
|
323
|
+
|
324
|
+
Data_Get_Struct(self, cTox_, tox);
|
325
|
+
|
326
|
+
return INT2FIX(tox_join_groupchat(
|
327
|
+
tox->tox,
|
328
|
+
NUM2LONG(friend_number),
|
329
|
+
(uint8_t*)RSTRING_PTR(data),
|
330
|
+
RSTRING_LEN(data)
|
331
|
+
));
|
332
|
+
}
|
333
|
+
|
334
|
+
VALUE cTox_group_message_send(const VALUE self, const VALUE group_number, const VALUE text)
|
335
|
+
{
|
336
|
+
cTox_ *tox;
|
337
|
+
|
338
|
+
// Don't know yet how to check for integers
|
339
|
+
// Check_Type(group_number, T_INTEGER);
|
340
|
+
Check_Type(text, T_STRING);
|
341
|
+
|
342
|
+
Data_Get_Struct(self, cTox_, tox);
|
343
|
+
|
344
|
+
return INT2FIX(tox_group_message_send(
|
345
|
+
tox->tox,
|
346
|
+
NUM2LONG(group_number),
|
347
|
+
(uint8_t*)RSTRING_PTR(text),
|
348
|
+
RSTRING_LEN(text)
|
349
|
+
));
|
350
|
+
}
|
351
|
+
|
352
|
+
VALUE cTox_group_peernumber_is_ours(
|
353
|
+
const VALUE self,
|
354
|
+
const VALUE group_number,
|
355
|
+
const VALUE peer_number)
|
356
|
+
{
|
357
|
+
cTox_ *tox;
|
358
|
+
|
359
|
+
// Don't know yet how to check for integers
|
360
|
+
// Check_Type(group_number, T_INTEGER);
|
361
|
+
// Check_Type(peer_number, T_INTEGER);
|
362
|
+
|
363
|
+
Data_Get_Struct(self, cTox_, tox);
|
364
|
+
|
365
|
+
if (tox_group_peernumber_is_ours(
|
366
|
+
tox->tox,
|
367
|
+
NUM2INT(group_number),
|
368
|
+
NUM2INT(peer_number))
|
369
|
+
)
|
370
|
+
return Qtrue;
|
371
|
+
else
|
372
|
+
return Qfalse;
|
373
|
+
}
|
374
|
+
|
284
375
|
void on_friend_request(
|
285
376
|
Tox *const tox,
|
286
377
|
const uint8_t *const key,
|
@@ -327,6 +418,51 @@ void on_friend_message(
|
|
327
418
|
);
|
328
419
|
}
|
329
420
|
|
421
|
+
static void on_group_invite(
|
422
|
+
Tox *const tox,
|
423
|
+
const int32_t friend_number,
|
424
|
+
const uint8_t type,
|
425
|
+
const uint8_t *const data,
|
426
|
+
const uint16_t length,
|
427
|
+
const VALUE self)
|
428
|
+
{
|
429
|
+
VALUE rb_on_group_invite;
|
430
|
+
|
431
|
+
rb_on_group_invite = rb_iv_get(self, "@on_group_invite");
|
432
|
+
|
433
|
+
if (Qnil != rb_on_group_invite)
|
434
|
+
rb_funcall(
|
435
|
+
rb_on_group_invite,
|
436
|
+
rb_intern("call"),
|
437
|
+
2,
|
438
|
+
LONG2FIX(friend_number),
|
439
|
+
rb_str_new((char*)data, length)
|
440
|
+
);
|
441
|
+
}
|
442
|
+
|
443
|
+
static void on_group_message(
|
444
|
+
Tox *const tox,
|
445
|
+
const int group_number,
|
446
|
+
const int peer_number,
|
447
|
+
const uint8_t *const text,
|
448
|
+
const uint16_t length,
|
449
|
+
const VALUE self)
|
450
|
+
{
|
451
|
+
VALUE rb_on_group_message;
|
452
|
+
|
453
|
+
rb_on_group_message = rb_iv_get(self, "@on_group_message");
|
454
|
+
|
455
|
+
if (Qnil != rb_on_group_message)
|
456
|
+
rb_funcall(
|
457
|
+
rb_on_group_message,
|
458
|
+
rb_intern("call"),
|
459
|
+
3,
|
460
|
+
LONG2FIX(group_number),
|
461
|
+
LONG2FIX(peer_number),
|
462
|
+
rb_str_new((char*)text, length)
|
463
|
+
);
|
464
|
+
}
|
465
|
+
|
330
466
|
/******************************************************************************
|
331
467
|
* Tox::Options
|
332
468
|
******************************************************************************/
|
data/lib/lita/adapters/tox.rb
CHANGED
@@ -12,8 +12,20 @@ module Lita
|
|
12
12
|
# Tox adapter for the Lita chat bot.
|
13
13
|
#
|
14
14
|
class Tox < Adapter
|
15
|
+
config :savedata_filename, type: String
|
16
|
+
|
15
17
|
def initialize(robot)
|
16
|
-
|
18
|
+
super
|
19
|
+
|
20
|
+
options = ::Tox::Options.new
|
21
|
+
|
22
|
+
if config.savedata_filename && File.exist?(config.savedata_filename)
|
23
|
+
savedata_file = open(config.savedata_filename)
|
24
|
+
options.data = savedata_file.read
|
25
|
+
savedata_file.close
|
26
|
+
end
|
27
|
+
|
28
|
+
@tox = ::Tox.new(options)
|
17
29
|
|
18
30
|
log.info("ID: #{@tox.id}")
|
19
31
|
|
@@ -29,15 +41,43 @@ module Lita
|
|
29
41
|
message.command!
|
30
42
|
robot.receive(message)
|
31
43
|
end
|
44
|
+
|
45
|
+
@tox.on_group_invite do |friend_number, data|
|
46
|
+
@tox.join_groupchat(friend_number, data)
|
47
|
+
end
|
48
|
+
|
49
|
+
@tox.on_group_message do |group_number, peer_number, text|
|
50
|
+
unless @tox.group_peernumber_is_ours(group_number, peer_number)
|
51
|
+
user = User.new(-1 - peer_number) # TODO
|
52
|
+
source = Source.new(user: user, room: group_number)
|
53
|
+
message = Message.new(robot, text, source)
|
54
|
+
|
55
|
+
robot.receive(message)
|
56
|
+
end
|
57
|
+
end
|
32
58
|
end
|
33
59
|
|
34
60
|
def run
|
35
61
|
@tox.loop
|
36
62
|
end
|
37
63
|
|
64
|
+
def shut_down
|
65
|
+
if config.savedata_filename
|
66
|
+
savedata_file = open(config.savedata_filename, 'w')
|
67
|
+
savedata_file.write(@tox.savedata)
|
68
|
+
savedata_file.close
|
69
|
+
end
|
70
|
+
|
71
|
+
@tox.kill
|
72
|
+
end
|
73
|
+
|
38
74
|
def send_messages(target, messages)
|
39
75
|
messages.reject(&:empty?).each do |message|
|
40
|
-
|
76
|
+
if target.user.id.to_i >= 0
|
77
|
+
@tox.friend_send_message(target.user.id.to_i, message)
|
78
|
+
else
|
79
|
+
@tox.group_message_send(target.room.to_i, message)
|
80
|
+
end
|
41
81
|
end
|
42
82
|
end
|
43
83
|
end
|
data/lib/tox.rb
CHANGED
data/lita-tox.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lita-tox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Braiden Vasco
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
11
|
+
date: 2015-09-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|