AnyEvent-Discord
view release on metacpan or search on metacpan
lib/AnyEvent/Discord.pm view on Meta::CPAN
properties => {
'$os' => 'linux',
'$browser' => $self->user_agent(),
'$device' => $self->user_agent(),
}
}
}));
}
# Send a payload to the Discord websocket
method _ws_send_payload(AnyEvent::Discord::Payload $payload) {
unless ($self->_socket) {
$self->_debug('Attempted to send payload to disconnected socket');
return;
}
my $msg = $payload->as_json;
$self->_trace('ws out: ' . $msg);
$self->_socket->send($msg);
}
# Look up the gateway endpoint using the Discord API
method _lookup_gateway() {
my $payload = $self->_discord_api('GET', 'gateway');
die 'Invalid gateway returned by API' unless ($payload and $payload->{url} and $payload->{url} =~ /^wss/);
# Add the requested version and encoding to the provided URL
my $gateway = $payload->{url};
$gateway .= '/' unless ($gateway =~/\/$/);
$gateway .= '?v=6&encoding=json';
return $gateway;
}
# Dispatch an internal event type
method _handle_internal_event(Str $type) {
foreach my $event_source (qw(_internal_events _events)) {
if ($self->{$event_source}->{$type}) {
map {
$self->_debug('Sending ' . ( $event_source =~ /internal/ ? 'internal' : 'caller' ) . ' event ' . $type);
$_->($self);
} @{ $self->{$event_source}->{$type} };
}
}
}
# Dispatch a Discord event type
method _handle_event(AnyEvent::Discord::Payload $payload) {
my $type = lc($payload->t);
$self->_debug('Got event ' . $type);
foreach my $event_source (qw(_internal_events _events)) {
if ($self->{$event_source}->{$type}) {
map {
$self->_debug('Sending ' . ( $event_source =~ /internal/ ? 'internal' : 'caller' ) . ' event ' . $type);
$_->($self, $payload->d, $payload->op);
} @{ $self->{$event_source}->{$type} };
}
}
}
# Send debug messages to console if verbose is >=1
method _debug(Str $message) {
say time . ' ' . $message if ($self->verbose);
}
# 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) {
$self->channels->{$channel->{'id'}} = $channel->{'name'};
}
}
foreach my $user (@{$data->{'members'}}) {
$self->users->{$user->{'user'}->{'id'}} = $user->{'user'}->{'username'};
}
}
# GUILD_DELETE event
method _event_guild_delete($client, HashRef $data, Num $opcode?) {
delete($self->guilds->{$data->{'id'}});
}
# CHANNEL_CREATE event
method _event_channel_create($client, HashRef $data, Num $opcode?) {
$self->channels->{$data->{'id'}} = $data->{'name'};
}
# CHANNEL_DELETE event
method _event_channel_delete($client, HashRef $data, Num $opcode?) {
delete($self->channels->{$data->{'id'}});
}
# GUILD_MEMBER_CREATE event
method _event_guild_member_create($client, HashRef $data, Num $opcode?) {
$self->users->{$data->{'id'}} = $data->{'username'};
}
# GUILD_MEMBER_REMOVE event
method _event_guild_member_remove($client, HashRef $data, Num $opcode?) {
delete($self->users->{$data->{'id'}});
( run in 0.655 second using v1.01-cache-2.11-cpan-d7a12ab2c7f )