* Detect chat in more conventional way, so we can handle channels too (no one cares about it, since no plans to release this bot as product) * Catch even those events tat have no 'text' fields, so we can cat join and leave events * Cosmetic fixes
141 lines
3.9 KiB
Perl
141 lines
3.9 KiB
Perl
package telegrambot;
|
|
|
|
use strict;
|
|
use warnings "all";
|
|
use vars qw/$VERSION/;
|
|
use v5.10.0;
|
|
use Hailo;
|
|
use Encode;
|
|
use Data::Dumper;
|
|
use Mojo::Base 'Telegram::Bot::Brain';
|
|
|
|
use conf;
|
|
|
|
use Exporter qw(import);
|
|
our @EXPORT = qw(run_telegrambot);
|
|
|
|
$VERSION = "1.0";
|
|
|
|
my $c = loadConf();
|
|
my $hailo;
|
|
|
|
has token => $c->{telegrambot}->{token};
|
|
|
|
sub __on_msg {
|
|
my ($self, $msg) = @_;
|
|
# is this a 1-on-1 ?
|
|
if ($msg->chat->type eq 'private') {
|
|
$msg->reply("Общайтесь в чате \@slackware_ru");
|
|
|
|
# group chat
|
|
} elsif (($msg->chat->type eq 'supergroup') or ($msg->chat->type eq 'group')) {
|
|
my $reply;
|
|
|
|
if ($msg->chat->can('new_chat_members')) {
|
|
warn sprintf("New member in chat. %s", Dumper($msg->chat)),
|
|
my $usernick = '';
|
|
|
|
if (defined($msg->chat->new_chat_members->first_name) and ($msg->chat->new_chat_members->first_name ne '')) {
|
|
$usernick .= $msg->chat->new_chat_members->first_name;
|
|
}
|
|
|
|
if (defined($msg->chat->new_chat_members->last_name) and ($msg->chat->new_chat_members->last_name ne '')) {
|
|
if ($usernick ne '') {
|
|
$usernick .= ' ' . $msg->chat->new_chat_members->first_name;
|
|
} else {
|
|
$usernick .= $msg->chat->new_chat_members->first_name;
|
|
}
|
|
}
|
|
|
|
$usernick = $msg->chat->new_chat_members->username if ($usernick =~ /^\s+$/);
|
|
|
|
$reply = sprintf("Добрый вечер, %s, располагайтесь, наслаждайтесь. Мы вас внимательно алё.", $usernick);
|
|
} elsif ($msg->chat->can('left_chat_member')) {
|
|
warn sprintf("Member left chat. %s", Dumper($msg->chat));
|
|
my $usernick = '';
|
|
|
|
if (defined($msg->chat->left_chat_member->first_name) and ($msg->chat->left_chat_member->first_name ne '')) {
|
|
$usernick .= $msg->chat->left_chat_member->first_name;
|
|
}
|
|
|
|
if (defined($msg->chat->left_chat_member->last_name) and ($msg->chat->left_chat_member->last_name ne '')) {
|
|
if ($usernick ne '') {
|
|
$usernick .= ' ' . $msg->chat->left_chat_member->first_name;
|
|
} else {
|
|
$usernick .= $msg->chat->left_chat_member->first_name;
|
|
}
|
|
}
|
|
|
|
$usernick = $msg->chat->left_chat_member->username if ($usernick =~ /^\s+$/);
|
|
|
|
$reply = sprintf("До свидания, уважаемый %s. Возвращайтесь ещё. Мы будем рады вас опять...", $usernick);
|
|
} else {
|
|
return unless(defined($msg->text));
|
|
my $text = encode('utf-8', $msg->text);
|
|
# sometimes shit happens?
|
|
return unless(defined($text));
|
|
|
|
my $qname = quotemeta($c->{telegrambot}->{name});
|
|
my $qtname = quotemeta($c->{telegrambot}->{tname});
|
|
my $csign = quotemeta($c->{telegrambot}->{csign});
|
|
|
|
# simple commands
|
|
if ($text eq "${csign}ping") {
|
|
$msg->reply("pong.");
|
|
return;
|
|
} elsif (
|
|
($text eq $qname) or
|
|
($text eq sprintf("%s", $qtname)) or
|
|
($text eq sprintf("@%s_bot", $qname)) or # :(
|
|
($text eq sprintf("%s ", $qtname))
|
|
) {
|
|
$msg->reply("Чего?");
|
|
return;
|
|
}
|
|
|
|
# phrase directed to bot
|
|
if ((lc($text) =~ /^${qname}[\,|\:]? (.+)/) or (lc($text) =~ /^${qtname}[\,|\:]? (.+)/)){
|
|
$reply = $hailo->learn_reply(decode('utf-8', $1));
|
|
# bot mention by name
|
|
} elsif ((lc($text) =~ /.+ ${qname}[\,|\!|\?|\.| ]/) or (lc($text) =~ / $qname$/)) {
|
|
$reply = $hailo->reply(decode('utf-8', $text));
|
|
# bot mention by teleram name
|
|
} elsif ((lc($text) =~ /.+ ${qtname}[\,|\!|\?|\.| ]/) or (lc($text) =~ / $qtname$/)) {
|
|
$reply = $hailo->reply(decode('utf-8', $text));
|
|
# just message in chat
|
|
} else {
|
|
$hailo->learn(decode('utf-8', $text));
|
|
}
|
|
}
|
|
|
|
if (defined($reply) && $reply ne '') {
|
|
$msg->reply($reply);
|
|
}
|
|
# should be channel, so we can't talk
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
|
|
# setup our bot
|
|
sub init {
|
|
$hailo = Hailo->new(
|
|
brain => $c->{telegrambot}->{brain},
|
|
order => 3
|
|
);
|
|
my $self = shift;
|
|
$self->add_listener(\&__on_msg);
|
|
}
|
|
|
|
sub run_telegrambot {
|
|
while (sleep 3) {
|
|
eval {
|
|
telegrambot->new->think;
|
|
}
|
|
}
|
|
}
|
|
|
|
1;
|
|
|
|
# vim: ft=perl noet ai ts=4 sw=4 sts=4:
|