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 )