AnyEvent-Discord
view release on metacpan or search on metacpan
lib/AnyEvent/Discord.pm view on Meta::CPAN
$self->_sequence(0 + $payload->s) if ($payload->s and $payload->s > 0);
if ($payload->op == 10) {
$self->_event_hello($payload);
} elsif ($payload->d) {
if ($payload->d->{'author'}) {
my $user = $payload->d->{'author'};
$self->users->{$user->{'id'}} = $user->{'username'};
}
$self->_handle_event($payload);
}
});
$self->_discord_identify();
$self->_debug('Completed connection sequence');
$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() {
$self->_force_disconnect(1);
$self->{'_heartbeat'} = undef;
$self->{'_sequence'} = undef;
$self->_socket->close();
}
# Make an HTTP request to the Discord API
method _discord_api(Str $method, Str $path, $payload?) {
my $headers = HTTP::Headers->new(
Authorization => 'Bot ' . $self->token,
User_Agent => $self->user_agent,
Content_Type => 'application/json',
);
my $request = HTTP::Request->new(
uc($method),
join('/', $self->base_uri, $path),
$headers,
$payload,
);
$self->_trace('api req: ' . $request->as_string());
my $res = $self->_ua->request($request);
$self->_trace('api res: ' . $res->as_string());
if ($res->is_success()) {
if ($res->header('Content-Type') eq 'application/json') {
return decode_json($res->decoded_content());
} else {
return $res->decoded_content();
}
}
return;
}
# Send the 'identify' event to the Discord websocket
method _discord_identify() {
$self->_debug('Sending identify');
$self->_ws_send_payload(AnyEvent::Discord::Payload->from_hashref({
op => 2,
d => {
token => $self->token,
compress => JSON::false,
large_threshold => 250,
shard => [0, 1],
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
( run in 0.669 second using v1.01-cache-2.11-cpan-7fcb06a456a )