AnySan-Provider-Slack
view release on metacpan or search on metacpan
lib/AnySan/Provider/Slack.pm view on Meta::CPAN
package AnySan::Provider::Slack;
use strict;
use warnings;
our $VERSION = '0.07';
use base 'AnySan::Provider';
our @EXPORT = qw(slack);
use AnySan;
use AnySan::Receive;
use HTTP::Request::Common;
use AnyEvent::HTTP;
use AnyEvent::SlackRTM;
use JSON;
use Encode;
sub slack {
my(%config) = @_;
my $self = __PACKAGE__->new(
client => undef,
config => \%config,
);
# join channels
my @channels = keys %{ $config{channels} };
for my $channel (@channels) {
$self->_call('channels.join', [
name => $channel,
], sub {});
}
$self->start;
return $self;
}
sub metadata { shift->{rtm}->metadata }
sub user {
my ($self, $id) = @_;
return $self->{_users}{$id};
}
sub bot {
my ($self, $id) = @_;
return $self->{_bots}{$id};
}
sub start {
my $self = shift;
my $client_opt = $self->{config}{timeout} ? { timeout => $self->{config}{timeout} } : undef;
my $rtm = AnyEvent::SlackRTM->new($self->{config}{token}, $client_opt);
$rtm->on('hello' => sub {
# create hash table of users
my $users = {};
for my $user (@{$self->metadata->{users}}) {
$users->{$user->{id}} ||= $user;
$users->{$user->{name}} ||= $user;
}
$self->{_users} = $users;
my $bots = {};
for my $bot (@{$self->metadata->{bots}}) {
$bots->{$bot->{id}} ||= $bot;
$bots->{$bot->{name}} ||= $bot;
}
$self->{_bots} = $bots;
});
$rtm->on('message' => sub {
( run in 1.997 second using v1.01-cache-2.11-cpan-39bf76dae61 )