|
|
@@ -16,7 +16,6 @@ use Mojo::JSON qw/j/;
|
|
|
use NetAddr::IP;
|
|
|
use HTML::Restrict;
|
|
|
use Redis;
|
|
|
-use Mojo::Promise;
|
|
|
use Time::timegm qw/timegm/;
|
|
|
use POSIX::strptime;
|
|
|
|
|
|
@@ -46,6 +45,7 @@ plugin yaml_config => {
|
|
|
};
|
|
|
|
|
|
our $config = app->config;
|
|
|
+our $commands;
|
|
|
|
|
|
app->secrets(["Marsz, Marsz, Dabrowski"]);
|
|
|
|
|
|
@@ -104,15 +104,15 @@ my $ua = new Mojo::UserAgent;
|
|
|
$ua->max_redirects(5);
|
|
|
|
|
|
our $fsa;
|
|
|
-our $commands;
|
|
|
|
|
|
my $locale_dir = "$Bin/locale";
|
|
|
my $locales = localization::available_locales($locale_dir);
|
|
|
my $locale_handles = localization->add_mo($locale_dir, $locales);
|
|
|
|
|
|
-our $kb_menu = [[
|
|
|
- map { _($_->{name}) } grep {!$_->{hide_in_kb}} @$commands,
|
|
|
-]];
|
|
|
+my @list = ();
|
|
|
+my @commlist = map { {text=>"$_->{icon}\x{2003}$_->{name}"} } grep {$_->{main}} @$commands;
|
|
|
+push @list, [ splice @commlist, 0, 2 ] while @commlist;
|
|
|
+our $button_menu = \@list;
|
|
|
|
|
|
##########################
|
|
|
|
|
|
@@ -305,7 +305,7 @@ sub request
|
|
|
my $action = shift;
|
|
|
my $params = shift;
|
|
|
|
|
|
- $ua->post_p("https://api.telegram.org/bot$config->{token}/$action" => json => $params)
|
|
|
+ $ua->post_p("https://api.telegram.org/bot$config->{token}/$action" => json => $params)
|
|
|
->then(sub
|
|
|
{
|
|
|
my $tx = shift;
|
|
|
@@ -352,11 +352,18 @@ sub notify($info, $message, $args={})
|
|
|
$params->{parse_mode} ||= "HTML";
|
|
|
$params->{reply_to} = $args->{reply_to} if $args->{reply_to};
|
|
|
$params->{disable_notification} = 1 if $args->{silent};
|
|
|
+ $params->{reply_to} = $args->{msgid};
|
|
|
|
|
|
if ($args->{menu})
|
|
|
{
|
|
|
$params->{reply_markup} = { keyboard => $args->{menu} };
|
|
|
$params->{resize_keyboard} = Mojo::JSON->true;
|
|
|
+ $params->{is_persistent} = Mojo::JSON->true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($args->{remove_menu})
|
|
|
+ {
|
|
|
+ $params->{reply_markup} = {remove_keyboard => Mojo::JSON->true };
|
|
|
}
|
|
|
|
|
|
if ($args->{inline_menu})
|
|
|
@@ -385,12 +392,24 @@ sub notify($info, $message, $args={})
|
|
|
|
|
|
sub reply($info, @lines)
|
|
|
{
|
|
|
- return notify($info, join("\n", @lines), {reply_to=>$info->{msgid}});
|
|
|
+ return notify($info, join("\n", @lines), {});
|
|
|
}
|
|
|
|
|
|
sub reply_with($info, $params, @lines)
|
|
|
{
|
|
|
- $params->{reply_to} = $info->{msgid};
|
|
|
+ if (exists $params->{button_menu})
|
|
|
+ {
|
|
|
+ if (delete $params->{button_menu})
|
|
|
+ {
|
|
|
+ $params->{menu} = $button_menu;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ delete $params->{menu};
|
|
|
+ $params->{remove_menu} = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
return notify($info, join("\n", @lines), $params);
|
|
|
}
|
|
|
|
|
|
@@ -400,26 +419,40 @@ async sub do_command
|
|
|
{
|
|
|
my ($fsa, $cmd, $info) = @_;
|
|
|
|
|
|
- if ($info->{id}<0)
|
|
|
- {
|
|
|
- return reply($info, _("Этот бот не работает в чатах"));
|
|
|
- }
|
|
|
-
|
|
|
- my ($c,@args) = split(/\s+/,$cmd);
|
|
|
- $c =~ s/\@MolAbonbotBot$//;
|
|
|
+ return reply($info, _("Этот бот не работает в чатах")) if $info->{id} < 0;
|
|
|
+
|
|
|
+ my ($sub, $args) = find_command($cmd);
|
|
|
+ return reply($info, _("Неизвестная команда")) unless $sub;
|
|
|
|
|
|
- my $prefix = substr($c, 0, 1) eq "\x00" ? "callback" : "command";
|
|
|
- $c =~ s|^\x00||;
|
|
|
- $c =~ s|^/||;
|
|
|
+ await $sub->($fsa, $info, @$args);
|
|
|
+}
|
|
|
|
|
|
- my $sub = refpath("${prefix}_$c");
|
|
|
+sub find_command
|
|
|
+{
|
|
|
+ my $cmd = shift;
|
|
|
+ my ($c, @args) = split(/\x20+/,$cmd);
|
|
|
+ $c =~ s/\@MolAbonbotBot$//;
|
|
|
+
|
|
|
+ my $prefix = "command";
|
|
|
|
|
|
- unless ($sub)
|
|
|
+ if (substr($c, 0, 1) eq "/")
|
|
|
{
|
|
|
- return reply($info, _("Неизвестная команда"));
|
|
|
+ }
|
|
|
+ elsif (substr($c, 0, 1) eq "\x00")
|
|
|
+ {
|
|
|
+ $prefix = "callback";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ my @found = grep { $_->{main} && index($cmd, "$_->{icon}\x{2003}$_->{name}")==0 } @$commands;
|
|
|
+ return undef unless @found;
|
|
|
+ $c = $found[0]->{command};
|
|
|
}
|
|
|
|
|
|
- await $sub->($fsa, $info, @args);
|
|
|
+ $c =~ s|^\x00||;
|
|
|
+ $c =~ s|^/||;
|
|
|
+
|
|
|
+ return refpath("${prefix}_$c"), \@args;
|
|
|
}
|
|
|
|
|
|
sub refpath
|