aboutsummaryrefslogtreecommitdiff
path: root/tgserver
diff options
context:
space:
mode:
Diffstat (limited to 'tgserver')
-rwxr-xr-xtgserver92
1 files changed, 75 insertions, 17 deletions
diff --git a/tgserver b/tgserver
index e624ae2..589054b 100755
--- a/tgserver
+++ b/tgserver
@@ -5,11 +5,18 @@
# Run `tgserver -h` for quick help, or `tgserver -h -v` for full manual.
################################################################################
+use strict;
+use warnings;
+
+use Try::Tiny;
+
$main::VERSION = "0.1.1";
use Getopt::Long qw(:config auto_version);
use Pod::Usage qw<pod2usage>;
use Data::Dumper;
+use MIME::Base64 qw<decode_base64>;
+use JSON qw<decode_json>;
use FindBin;
use lib "$FindBin::Bin/lib";
@@ -44,28 +51,75 @@ while (1) {
$cache->offset($update->{'update_id'}+1);
$logger->debug(sprintf "Update %s", Dumper($update));
- my $text = $update->{'message'}{'text'};
- my $chat_id = $update->{'message'}{'chat'}{'id'};
- $logger->info("Received from chat $chat_id: '$text'\n");
-
- use IPC::Open2 qw<open2>;
- my $pid = open2(my $progr, my $progw, "@ARGV");
- print $progw $text;
- close($progw);
- my $response = join "", <$progr>;
- chomp $response;
- $logger->debug("'$text' -> @ARGV -> '$response'\n");
- close($progr);
-
- if ($response) {
- my $api = TgLib::Api->new($TOKEN, $logger);
- $api->send_message($chat_id, $response);
+ my $msg = $update->{'message'};
+ if (exists $msg->{'photo'}) {
+ handle_photo($msg);
} else {
- $logger->warn("Empty response, skipping\n");
+ handle_text($msg);
}
}
}
+sub handle_photo {
+ my $msg = shift;
+ my $photos = $msg->{'photo'};
+ my $chat_id = $msg->{'chat'}{'id'};
+ my $photo = (sort { $b->{'width'} <=> $a->{'width'} } @$photos)[0];
+ $logger->info(sprintf "Received photo %s (size=%d)\n", $photo->{'file_id'}, $photo->{'file_size'});
+
+ my $file = $api->get_file($photo->{'file_id'});
+
+ $ENV{'TGUTILS_TYPE'} = 'IMAGE';
+ my $response = pipe_send($file, @ARGV);
+ my $type = ref $response eq 'HASH' ? $response->{'type'} : undef;
+ if ($type eq 'DOCUMENT') {
+ $api->send_document($chat_id, decode_base64 $response->{'content'});
+ } else {
+ $api->send_message($chat_id, $response);
+ }
+}
+
+sub handle_text {
+ my $msg = shift;
+ my $text = $msg->{'text'};
+ my $chat_id = $msg->{'chat'}{'id'};
+ $logger->info("Received from chat $chat_id: '$text'\n");
+
+ $ENV{'TGUTILS_TYPE'} = 'TEXT';
+ my $response = pipe_send($text, @ARGV);
+ if ($response) {
+ $api->send_message($chat_id, $response);
+ } else {
+ $logger->warn("Empty response, skipping\n");
+ }
+}
+
+sub pipe_send {
+ my ($content, @cmd) = @_;
+
+ use IPC::Open2 qw<open2>;
+ my $pid = open2(my $progr, my $progw, @cmd);
+
+ print $progw $content;
+ close($progw);
+
+ # Don't read a single line
+ my $oldsep = $/;
+ $/ = undef;
+
+ binmode($progr);
+ my $response = <$progr>;
+ close($progr);
+
+ $/ = $oldsep;
+
+ waitpid $pid, 0; # collect the child process
+ chomp $response;
+ # $logger->debug("'$content' -> @ARGV -> '$response'\n");
+
+ return try { decode_json $response } catch { $response };
+}
+
__END__
@@ -83,6 +137,10 @@ B<tgserver> [I<options>] -- I<prog>
=over
+=item B<--on-image>=I<cmd>
+
+Command to launch whenever an image is received
+
=item B<--token>=I<token>, B<-t> I<token>
Bot token (see B<AUTHENTICATION>)