aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGuillermo Ramos2019-09-02 00:33:28 +0200
committerGuillermo Ramos2019-09-02 00:33:28 +0200
commit51ffaecc06021d40908eec179b4395953a912cdb (patch)
tree9fe70161a2b11b352feee9f400ad50cc3be0cb45 /lib
parent4ab6e09e1197f1a0e9fce9a3a3a5ce821c0d6194 (diff)
downloadtgutils-51ffaecc06021d40908eec179b4395953a912cdb.tar.gz
tgserver: receive images + send documents
Diffstat (limited to 'lib')
-rw-r--r--lib/TgLib/Api.pm57
1 files changed, 56 insertions, 1 deletions
diff --git a/lib/TgLib/Api.pm b/lib/TgLib/Api.pm
index 66c808f..73aee4b 100644
--- a/lib/TgLib/Api.pm
+++ b/lib/TgLib/Api.pm
@@ -5,6 +5,7 @@ use warnings;
use JSON qw<encode_json decode_json>;
use HTTP::Request;
+use HTTP::Request::Common qw<POST>;
use LWP::UserAgent;
use Data::Dumper;
@@ -14,6 +15,7 @@ our @EXPORT = qw<new>;
sub new {
my ($class, $token, $logger) = @_;
return bless { uri => "https://api.telegram.org/bot$token",
+ file_uri => "https://api.telegram.org/file/bot$token",
ua => LWP::UserAgent->new,
logger => $logger }, $class;
}
@@ -35,7 +37,7 @@ sub get_updates {
} else {
my $updates = decode_json($resp->content)->{'result'};
# TODO why does `decode_json` not do this work?
- map { utf8::encode($_->{'message'}{'text'}) } @$updates;
+ map { utf8::encode($_->{'message'}{'text'}) if exists $_->{'message'}{'text'} } @$updates;
$logger->info(sprintf "Received %d updates from chats %s\n",
scalar(@$updates),
join(", ", map { $_->{'message'}{'chat'}{'id'} } @$updates));
@@ -61,4 +63,57 @@ sub send_message {
}
}
+sub send_document {
+ my ($self, $chat_id, $photo) = @_;
+ my $logger = $self->{'logger'};
+ my $uri = "$self->{'uri'}/sendDocument";
+ my $content = {'chat_id' => $chat_id,
+ 'caption' => 'Tenga, ayúdese',
+ 'document' => [undef, 'cosa.png', Content => $photo]};
+
+ my $req = POST $uri, 'Content-Type' => "multipart/form-data", 'Content' => $content;
+ $logger->info("Sending photo to $chat_id\n");
+ $logger->debug(sprintf "Request:\n%s\n", Dumper($req)); # DEBUG
+
+ my $resp = $self->{'ua'}->request($req);
+ $logger->debug(sprintf "Response:\n%s\n", Dumper($resp));
+ if ($resp->is_error()) {
+ print decode_json($resp->content)->{'description'};
+ die $resp->message;
+ }
+}
+
+sub get_file {
+ my ($self, $file_id) = @_;
+ my $logger = $self->{'logger'};
+ my $uri = "$self->{'uri'}/getFile";
+ my $content = encode_json {'file_id' => $file_id};
+
+ my $req = HTTP::Request->new("POST", $uri,
+ ["Content-Type", "application/json"], $content);
+ $logger->debug(sprintf "Request:\n%s\n", Dumper($req));
+
+ my $resp = $self->{'ua'}->request($req);
+ $logger->debug(sprintf "Response:\n%s\n", Dumper($resp));
+ if ($resp->is_error()) {
+ die $resp->message;
+ } else {
+ my $file_path = decode_json($resp->content)->{'result'}{'file_path'};
+ $logger->info("Getting file $file_id (file_path: $file_path)...\n");
+
+ my $uri = "$self->{'file_uri'}/$file_path";
+ my $req = HTTP::Request->new("GET", $uri);
+ $logger->debug(sprintf "Request:\n%s\n", Dumper($req));
+
+ my $resp = $self->{'ua'}->request($req);
+ $logger->debug(sprintf "Response:\n%s\n", Dumper($resp));
+
+ if ($resp->is_error()) {
+ die $resp->content;
+ } else {
+ return $resp->content;
+ }
+ }
+}
+
1;