Merge pull request #20 from braiden-vasco/implement_group_chats
Implement group chats
This commit is contained in:
commit
c25501c2b3
|
@ -18,9 +18,6 @@ TODO
|
||||||
Current development version have some limitations
|
Current development version have some limitations
|
||||||
which should be fixed in first release:
|
which should be fixed in first release:
|
||||||
|
|
||||||
* [\[issue #15\]](https://github.com/braiden-vasco/lita-tox/issues/15)
|
|
||||||
Only private chats are supported. Adapter will not respond to group invite
|
|
||||||
|
|
||||||
* [\[issue #16\]](https://github.com/braiden-vasco/lita-tox/issues/16)
|
* [\[issue #16\]](https://github.com/braiden-vasco/lita-tox/issues/16)
|
||||||
**libtoxcore** is not included in the gem. It should be compiled manually
|
**libtoxcore** is not included in the gem. It should be compiled manually
|
||||||
to build the gem native extension successfully. Follow the instructions in
|
to build the gem native extension successfully. Follow the instructions in
|
||||||
|
|
|
@ -8,6 +8,7 @@ LIBTOXCORE = 'toxcore'
|
||||||
|
|
||||||
have_header 'time.h' and
|
have_header 'time.h' and
|
||||||
have_header 'tox/tox.h' and
|
have_header 'tox/tox.h' and
|
||||||
|
have_header 'tox/tox_old.h' and
|
||||||
|
|
||||||
have_func 'sprintf' and
|
have_func 'sprintf' and
|
||||||
have_func 'sscanf' and
|
have_func 'sscanf' and
|
||||||
|
@ -27,5 +28,10 @@ have_library LIBTOXCORE, 'tox_friend_add_norequest' and
|
||||||
have_library LIBTOXCORE, 'tox_friend_send_message' and
|
have_library LIBTOXCORE, 'tox_friend_send_message' and
|
||||||
have_library LIBTOXCORE, 'tox_callback_friend_request' and
|
have_library LIBTOXCORE, 'tox_callback_friend_request' and
|
||||||
have_library LIBTOXCORE, 'tox_callback_friend_message' and
|
have_library LIBTOXCORE, 'tox_callback_friend_message' and
|
||||||
|
have_library LIBTOXCORE, 'tox_join_groupchat' and
|
||||||
|
have_library LIBTOXCORE, 'tox_group_message_send' and
|
||||||
|
have_library LIBTOXCORE, 'tox_callback_group_invite' and
|
||||||
|
have_library LIBTOXCORE, 'tox_callback_group_message' and
|
||||||
|
have_library LIBTOXCORE, 'tox_group_peernumber_is_ours' and
|
||||||
|
|
||||||
create_makefile "#{NAME}/#{NAME}" or exit(1)
|
create_makefile "#{NAME}/#{NAME}" or exit(1)
|
||||||
|
|
136
ext/tox/tox.c
136
ext/tox/tox.c
|
@ -40,6 +40,9 @@ static VALUE cTox_kill(VALUE self);
|
||||||
static VALUE cTox_loop(VALUE self);
|
static VALUE cTox_loop(VALUE self);
|
||||||
static VALUE cTox_friend_add_norequest(VALUE self, VALUE key);
|
static VALUE cTox_friend_add_norequest(VALUE self, VALUE key);
|
||||||
static VALUE cTox_friend_send_message(VALUE self, VALUE friend_number, VALUE text);
|
static VALUE cTox_friend_send_message(VALUE self, VALUE friend_number, VALUE text);
|
||||||
|
static VALUE cTox_join_groupchat(VALUE self, VALUE friend_number, VALUE data);
|
||||||
|
static VALUE cTox_group_message_send(VALUE self, VALUE group_number, VALUE text);
|
||||||
|
static VALUE cTox_group_peernumber_is_ours(VALUE self, VALUE group_number, VALUE peer_number);
|
||||||
|
|
||||||
static void on_friend_request(
|
static void on_friend_request(
|
||||||
Tox *tox,
|
Tox *tox,
|
||||||
|
@ -56,6 +59,24 @@ static void on_friend_message(
|
||||||
size_t length,
|
size_t length,
|
||||||
VALUE self);
|
VALUE self);
|
||||||
|
|
||||||
|
static void on_group_invite(
|
||||||
|
Tox *tox,
|
||||||
|
int32_t friend_number,
|
||||||
|
uint8_t type,
|
||||||
|
const uint8_t *data,
|
||||||
|
uint16_t length,
|
||||||
|
VALUE self
|
||||||
|
);
|
||||||
|
|
||||||
|
static void on_group_message(
|
||||||
|
Tox *tox,
|
||||||
|
int group_number,
|
||||||
|
int peer_number,
|
||||||
|
const uint8_t *text,
|
||||||
|
uint16_t length,
|
||||||
|
VALUE self
|
||||||
|
);
|
||||||
|
|
||||||
typedef struct Tox_Options cTox_cOptions_;
|
typedef struct Tox_Options cTox_cOptions_;
|
||||||
|
|
||||||
static VALUE cTox_cOptions;
|
static VALUE cTox_cOptions;
|
||||||
|
@ -80,6 +101,9 @@ void Init_tox()
|
||||||
rb_define_method(cTox, "loop", cTox_loop, 0);
|
rb_define_method(cTox, "loop", cTox_loop, 0);
|
||||||
rb_define_method(cTox, "friend_add_norequest", cTox_friend_add_norequest, 1);
|
rb_define_method(cTox, "friend_add_norequest", cTox_friend_add_norequest, 1);
|
||||||
rb_define_method(cTox, "friend_send_message", cTox_friend_send_message, 2);
|
rb_define_method(cTox, "friend_send_message", cTox_friend_send_message, 2);
|
||||||
|
rb_define_method(cTox, "join_groupchat", cTox_join_groupchat, 2);
|
||||||
|
rb_define_method(cTox, "group_message_send", cTox_group_message_send, 2);
|
||||||
|
rb_define_method(cTox, "group_peernumber_is_ours", cTox_group_peernumber_is_ours, 2);
|
||||||
|
|
||||||
cTox_cOptions = rb_define_class_under(cTox, "Options", rb_cObject);
|
cTox_cOptions = rb_define_class_under(cTox, "Options", rb_cObject);
|
||||||
rb_define_alloc_func(cTox_cOptions, cTox_cOptions_alloc);
|
rb_define_alloc_func(cTox_cOptions, cTox_cOptions_alloc);
|
||||||
|
@ -138,6 +162,14 @@ VALUE cTox_initialize_with(const VALUE self, const VALUE options)
|
||||||
|
|
||||||
tox_callback_friend_request(tox->tox, (tox_friend_request_cb*)on_friend_request, (void*)self);
|
tox_callback_friend_request(tox->tox, (tox_friend_request_cb*)on_friend_request, (void*)self);
|
||||||
tox_callback_friend_message(tox->tox, (tox_friend_message_cb*)on_friend_message, (void*)self);
|
tox_callback_friend_message(tox->tox, (tox_friend_message_cb*)on_friend_message, (void*)self);
|
||||||
|
tox_callback_group_invite(
|
||||||
|
tox->tox,
|
||||||
|
(void (*)(struct Tox *, int32_t, uint8_t, const uint8_t *, uint16_t, void *))on_group_invite,
|
||||||
|
(void*)self);
|
||||||
|
tox_callback_group_message(
|
||||||
|
tox->tox,
|
||||||
|
(void (*)(struct Tox *, int, int, const uint8_t *, uint16_t, void *))on_group_message,
|
||||||
|
(void*)self);
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
@ -281,6 +313,65 @@ VALUE cTox_friend_send_message(const VALUE self, const VALUE friend_number, cons
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VALUE cTox_join_groupchat(const VALUE self, const VALUE friend_number, const VALUE data)
|
||||||
|
{
|
||||||
|
cTox_ *tox;
|
||||||
|
|
||||||
|
// Don't know yet how to check for integers
|
||||||
|
// Check_Type(friend_number, T_INTEGER);
|
||||||
|
Check_Type(data, T_STRING);
|
||||||
|
|
||||||
|
Data_Get_Struct(self, cTox_, tox);
|
||||||
|
|
||||||
|
return INT2FIX(tox_join_groupchat(
|
||||||
|
tox->tox,
|
||||||
|
NUM2LONG(friend_number),
|
||||||
|
(uint8_t*)RSTRING_PTR(data),
|
||||||
|
RSTRING_LEN(data)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
VALUE cTox_group_message_send(const VALUE self, const VALUE group_number, const VALUE text)
|
||||||
|
{
|
||||||
|
cTox_ *tox;
|
||||||
|
|
||||||
|
// Don't know yet how to check for integers
|
||||||
|
// Check_Type(group_number, T_INTEGER);
|
||||||
|
Check_Type(text, T_STRING);
|
||||||
|
|
||||||
|
Data_Get_Struct(self, cTox_, tox);
|
||||||
|
|
||||||
|
return INT2FIX(tox_group_message_send(
|
||||||
|
tox->tox,
|
||||||
|
NUM2LONG(group_number),
|
||||||
|
(uint8_t*)RSTRING_PTR(text),
|
||||||
|
RSTRING_LEN(text)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
VALUE cTox_group_peernumber_is_ours(
|
||||||
|
const VALUE self,
|
||||||
|
const VALUE group_number,
|
||||||
|
const VALUE peer_number)
|
||||||
|
{
|
||||||
|
cTox_ *tox;
|
||||||
|
|
||||||
|
// Don't know yet how to check for integers
|
||||||
|
// Check_Type(group_number, T_INTEGER);
|
||||||
|
// Check_Type(peer_number, T_INTEGER);
|
||||||
|
|
||||||
|
Data_Get_Struct(self, cTox_, tox);
|
||||||
|
|
||||||
|
if (tox_group_peernumber_is_ours(
|
||||||
|
tox->tox,
|
||||||
|
NUM2INT(group_number),
|
||||||
|
NUM2INT(peer_number))
|
||||||
|
)
|
||||||
|
return Qtrue;
|
||||||
|
else
|
||||||
|
return Qfalse;
|
||||||
|
}
|
||||||
|
|
||||||
void on_friend_request(
|
void on_friend_request(
|
||||||
Tox *const tox,
|
Tox *const tox,
|
||||||
const uint8_t *const key,
|
const uint8_t *const key,
|
||||||
|
@ -327,6 +418,51 @@ void on_friend_message(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void on_group_invite(
|
||||||
|
Tox *const tox,
|
||||||
|
const int32_t friend_number,
|
||||||
|
const uint8_t type,
|
||||||
|
const uint8_t *const data,
|
||||||
|
const uint16_t length,
|
||||||
|
const VALUE self)
|
||||||
|
{
|
||||||
|
VALUE rb_on_group_invite;
|
||||||
|
|
||||||
|
rb_on_group_invite = rb_iv_get(self, "@on_group_invite");
|
||||||
|
|
||||||
|
if (Qnil != rb_on_group_invite)
|
||||||
|
rb_funcall(
|
||||||
|
rb_on_group_invite,
|
||||||
|
rb_intern("call"),
|
||||||
|
2,
|
||||||
|
LONG2FIX(friend_number),
|
||||||
|
rb_str_new((char*)data, length)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void on_group_message(
|
||||||
|
Tox *const tox,
|
||||||
|
const int group_number,
|
||||||
|
const int peer_number,
|
||||||
|
const uint8_t *const text,
|
||||||
|
const uint16_t length,
|
||||||
|
const VALUE self)
|
||||||
|
{
|
||||||
|
VALUE rb_on_group_message;
|
||||||
|
|
||||||
|
rb_on_group_message = rb_iv_get(self, "@on_group_message");
|
||||||
|
|
||||||
|
if (Qnil != rb_on_group_message)
|
||||||
|
rb_funcall(
|
||||||
|
rb_on_group_message,
|
||||||
|
rb_intern("call"),
|
||||||
|
3,
|
||||||
|
LONG2FIX(group_number),
|
||||||
|
LONG2FIX(peer_number),
|
||||||
|
rb_str_new((char*)text, length)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* Tox::Options
|
* Tox::Options
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
|
@ -41,6 +41,20 @@ module Lita
|
||||||
message.command!
|
message.command!
|
||||||
robot.receive(message)
|
robot.receive(message)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@tox.on_group_invite do |friend_number, data|
|
||||||
|
@tox.join_groupchat(friend_number, data)
|
||||||
|
end
|
||||||
|
|
||||||
|
@tox.on_group_message do |group_number, peer_number, text|
|
||||||
|
unless @tox.group_peernumber_is_ours(group_number, peer_number)
|
||||||
|
user = User.new(-1 - peer_number) # TODO
|
||||||
|
source = Source.new(user: user, room: group_number)
|
||||||
|
message = Message.new(robot, text, source)
|
||||||
|
|
||||||
|
robot.receive(message)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def run
|
def run
|
||||||
|
@ -59,7 +73,11 @@ module Lita
|
||||||
|
|
||||||
def send_messages(target, messages)
|
def send_messages(target, messages)
|
||||||
messages.reject(&:empty?).each do |message|
|
messages.reject(&:empty?).each do |message|
|
||||||
@tox.friend_send_message(target.user.id.to_i, message)
|
if target.user.id.to_i >= 0
|
||||||
|
@tox.friend_send_message(target.user.id.to_i, message)
|
||||||
|
else
|
||||||
|
@tox.group_message_send(target.room.to_i, message)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -50,4 +50,12 @@ class Tox
|
||||||
def on_friend_message(&block)
|
def on_friend_message(&block)
|
||||||
@on_friend_message = block
|
@on_friend_message = block
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def on_group_invite(&block)
|
||||||
|
@on_group_invite = block
|
||||||
|
end
|
||||||
|
|
||||||
|
def on_group_message(&block)
|
||||||
|
@on_group_message = block
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Reference in New Issue