Parcourir la source

+ меню из кнопок

Yuriy Zhilovets il y a 5 mois
Parent
commit
f33bc2cff3
3 fichiers modifiés avec 65 ajouts et 32 suppressions
  1. 55 22
      abonbot.pl
  2. 6 6
      modules/commands.pm
  3. 4 4
      modules/rules.pm

+ 55 - 22
abonbot.pl

@@ -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

+ 6 - 6
modules/commands.pm

@@ -17,16 +17,16 @@ sub __
 ##############################################
 
 our $commands = [
-  {command=>"help", name=>__("Помощь"), description=>__("Список доступных команд"), hide_in_kb=>1},
+  {command=>"help", name=>__("Помощь"), description=>__("Список доступных команд")},
   {command=>"info", name=>__("Информация"), description=>__("Информация о пользователе")},
-  {command=>"balance", name=>__("Баланс"), description=>__("Проверка баланса")},
+  {command=>"balance", name=>__("Баланс"), description=>__("Проверка баланса"), main=>1, icon=>"\x{1FA99}"},
   {command=>"service", name=>__("Сервисы"), description=>__("Подключенные сервисы")},
-  {command=>"credit", name=>__("Кредит"), description=>__("Установка кредита")},
-  {command=>"card", name=>__("Карта пополнения"), description=>__("Оплата карточкой пополнения")},
-  {command=>"payberry", name=>__("Payberry"), description=>__("Оплата через Payberry")},
+  {command=>"credit", name=>__("Кредит"), description=>__("Установка кредита"), main=>1, icon=>"\x{1FAF0}"},
+  {command=>"card", name=>__("Карта пополнения"), description=>__("Оплата карточкой пополнения"), main=>1, icon=>"\x{1F4B3}"},
+  {command=>"payberry", name=>__("Payberry"), description=>__("Оплата через Payberry"), main=>1, icon=>"\x{1F17F}\x{FE0F}"},
   {command=>"transfer", name=>__("Перевод"), description=>__("Перевод денег")},
   {command=>"new_task", name=>__("Новая заявка"), description=>__("Новая заявка")},
-  {command=>"tasks", name=>__("Заявки"), description=>__("Открытые заявки")},
+  {command=>"tasks", name=>__("Заявки"), description=>__("Открытые заявки"), main=>1, icon=>"\x{2764}\x{FE0F}\x{200D}\x{1FA79}"},
   {command=>"support", name=>__("Техподдержка"), description=>__("Связь с техподдержкой")},
   {command=>"logout", name=>__("Выход"), description=>__("Выход")},
 ];

+ 4 - 4
modules/rules.pm

@@ -12,7 +12,6 @@ our $redis;
 our $config;
 our $client;
 our $commands;
-our $kb_menu;
 our $abon_client;
 
 use constant FAIL_ASK_SERIAL => 3;
@@ -36,7 +35,7 @@ my $rules = {
      # У нас есть uid в автомате? Это значит, что мы прочитали состояние из внешней базы
      if ($fsa->note("uid"))
      {
-       reply($info, _("Для получения списка доступных команд введите /help"));
+       reply_with($info, { button_menu => 1 }, _("Для получения списка доступных команд введите /help"));
        return "command";
      }
      
@@ -59,7 +58,7 @@ my $rules = {
        }
      }
 
-     reply($info, greet($res->{fio}), _("Для получения списка доступных команд введите /help"));
+     reply_with($info, { button_menu => 1 },  greet($res->{fio}), _("Для получения списка доступных команд введите /help"));
      $fsa->note(uid => $res->{uid});
      return "command";
    },
@@ -85,7 +84,8 @@ my $rules = {
         die $@;
       }
 
-      reply($info, greet($res->{fio}), _("Для получения списка доступных команд введите /help"));         
+      reply_with($info, { button_menu => 1 },  greet($res->{fio}), _("Для получения списка доступных команд введите /help"));
+
       $fsa->note(uid => $res->{uid});
       $fsa->delete_note("login");