AnyEvent-Discord
view release on metacpan or search on metacpan
1234567891011121314151617Revision history
for
perl module AnyEvent::Discord
0.7 2021-10-25
- Update to AnyEvent::WebSocket::Client 0.54
- Change initial delay
for
reconnect to 1 second from 4 seconds
- Fire an AnyEvent->condvar->
send
on timer end
- Add timestamp to debug messages
when
debug is true
- Randomize heartbeat interval to Discord spec
0.4 2021-01-28
- Back to Moops
0.2 2021-01-28
- Fix indexing
for
Zydeco
doc/AnyEvent-Discord.md view on Meta::CPAN
108109110111112113114115116117118119120121122123124125126127128129
identify itself, begin a heartbeat, and once complete, Discord will fire a
'ready'
event to the handler.
-
send
(
$channel
\_id,
$content
)
Send a message to the provided channel.
- typing(
$channel
\_id)
Starts the
"typing..."
indicator in the provided channel. This method issues the
typing request, and starts a timer on the
caller
's behalf to keep the indicator
active. Returns an instance of that timer to allow the
caller
to
undef
it
when
the typing indicator should be stopped.
my
$instance
=
$client
->typing(
$channel
);
# ... perform some actions
$instance
=
undef
;
# typing indicator disappears
-
close
()
Close the connection to the server.
lib/AnyEvent/Discord.pm view on Meta::CPAN
262728293031323334353637383940414243444546has
users
=> (
is
=>
'ro'
,
isa
=> HashRef,
default
=>
sub
{ {} } );
# UserAgent
has
_ua
=> (
is
=>
'rw'
,
default
=>
sub
{ LWP::UserAgent->new() } );
# Caller-defined event handlers
has
_events
=> (
is
=>
'ro'
,
isa
=> HashRef,
default
=>
sub
{ {} } );
# Internal-defined event handlers
has
_internal_events
=> (
is
=>
'ro'
,
isa
=> HashRef,
builder
=>
'_build_internal_events'
);
# WebSocket
has
_socket
=> (
is
=>
'rw'
);
# Heartbeat timer
has
_heartbeat
=> (
is
=>
'rw'
);
# Last Sequence
has
_sequence
=> (
is
=>
'rw'
,
isa
=> Num,
default
=> 0 );
# True if caller manually disconnected, to avoid reconnection
has
_force_disconnect
=> (
is
=>
'rw'
,
isa
=> Bool,
default
=> 0 );
# Host the backoff algorithm for reconnection
has
_backoff
=> (
is
=>
'ro'
,
default
=>
sub
{ Algorithm::Backoff::Exponential->new(
initial_delay
=> 1 ) } );
method _build_internal_events() {
return
{
lib/AnyEvent/Discord.pm view on Meta::CPAN
110111112113114115116117118119120121122123124125126127128129# Handle reconnection
$socket
->on(
'finish'
,
sub
{
my
(
$c
) =
@_
;
$self
->_debug(
'Received disconnect'
);
$self
->_handle_internal_event(
'disconnected'
);
unless
(
$self
->_force_disconnect()) {
my
$seconds
=
$self
->_backoff->failure();
$self
->_debug(
'Reconnecting in '
.
$seconds
);
my
$reconnect
;
$reconnect
= AnyEvent->timer(
after
=>
$seconds
,
cb
=>
sub
{
$self
->
connect
();
$reconnect
=
undef
;
AnyEvent->condvar->
send
();
}
);
}
});
lib/AnyEvent/Discord.pm view on Meta::CPAN
161162163164165166167168169170171172173174175176177178179180181
$self
->_backoff->success();
AnyEvent->condvar->
send
();
});
}
method
send
(
$channel_id
,
$content
) {
return
$self
->_discord_api(
'POST'
,
'channels/'
.
$channel_id
.
'/messages'
, encode_json({
content
=>
$content
}));
}
method typing(
$channel_id
) {
return
AnyEvent->timer(
after
=> 0,
interval
=> 5,
cb
=>
sub
{
$self
->_discord_api(
'POST'
,
'channels/'
.
$channel_id
.
'/typing'
);
AnyEvent->condvar->
send
();
},
);
}
method
close
() {
lib/AnyEvent/Discord.pm view on Meta::CPAN
286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318# Send trace messages to console if verbose is 2
method _trace(Str
$message
) {
say
time
.
' '
.
$message
if
(
$self
->verbose and
$self
->verbose == 2);
}
# Called when Discord provides the 'hello' event
method _event_hello(AnyEvent::Discord::Payload
$payload
) {
$self
->_debug(
'Received hello event'
);
my
$interval
=
$payload
->d->{
'heartbeat_interval'
};
my
$timer
= AnyEvent->timer(
after
=>
$interval
*
rand
() / 1000,
interval
=>
$interval
/ 1000,
cb
=>
sub
{
$self
->_debug(
'Heartbeat'
);
$self
->_ws_send_payload(AnyEvent::Discord::Payload->from_hashref({
op
=> 1,
d
=>
$self
->_sequence()
}));
AnyEvent->condvar->
send
();
}
);
$self
->_heartbeat(
$timer
);
}
# GUILD_CREATE event
method _event_guild_create(
$client
, HashRef
$data
, Num
$opcode
?) {
$self
->guilds->{
$data
->{
'id'
}} =
$data
->{
'name'
};
# We get channel and user information along with the guild, populate those
# at the same time
foreach
my
$channel
(@{
$data
->{
'channels'
}}) {
if
(
$channel
->{
'type'
} == 0) {
lib/AnyEvent/Discord.pm view on Meta::CPAN
488489490491492493494495496497498499500501502503504505506507508509identify itself, begin a heartbeat, and once complete, Discord will fire a
'ready'
event to the handler.
=item send($channel_id, $content)
Send a message to the provided channel.
=item typing($channel_id)
Starts the "typing..." indicator in the provided channel. This method issues the
typing request, and starts a timer on the caller's behalf to keep the indicator
active. Returns an instance of that timer to allow the caller to undef it when
the typing indicator should be stopped.
my $instance = $client->typing($channel);
# ... perform some actions
$instance = undef;
# typing indicator disappears
=item close()
Close the connection to the server.
( run in 0.242 second using v1.01-cache-2.11-cpan-cba739cd03b )