commands.pm 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. use Modern::Perl;
  2. use utf8;
  3. use Mojo::Base -strict, -async_await, -signatures;
  4. use Data::Dumper;
  5. our $client;
  6. our $abon_client;
  7. our $config;
  8. sub __
  9. {
  10. @_;
  11. }
  12. ##############################################
  13. our $commands = [
  14. {command=>"help", name=>__("Помощь"), description=>__("Список доступных команд"), hide_in_kb=>1},
  15. {command=>"info", name=>__("Информация"), description=>__("Информация о пользователе")},
  16. {command=>"balance", name=>__("Баланс"), description=>__("Проверка баланса")},
  17. {command=>"service", name=>__("Сервисы"), description=>__("Подключенные сервисы")},
  18. {command=>"credit", name=>__("Кредит"), description=>__("Установка кредита")},
  19. {command=>"transfer", name=>__("Перевод"), description=>__("Перевод денег")},
  20. {command=>"logout", name=>__("Выход"), description=>__("Выход")},
  21. ];
  22. ##############################################
  23. sub command_help($fsa, $info)
  24. {
  25. my @list = map { "<b>/$_->{command}</b> " . _($_->{description}) } @$commands;
  26. reply($info, join("\n", @list));
  27. }
  28. async sub command_logout
  29. {
  30. my ($fsa, $info) = @_;
  31. my $uid = $fsa->note("uid");
  32. await $client->delete_p("client", "/client/$uid/telegram");
  33. reply($info, _("Благодарим за использование нашего бота"));
  34. $fsa->delete_note("uid");
  35. $fsa->state("logged_out");
  36. }
  37. async sub command_balance
  38. {
  39. my ($fsa, $info) = @_;
  40. my $uid = $fsa->note("uid");
  41. my $money = await $abon_client->get_p($info, "client", "/client/$uid/money?human=1");
  42. my $cur = $money->{human};
  43. my @lines = (
  44. sprintf("<u>%s:</u> <b>%.2f $cur</b> (%s %.2f $cur + %s %.2f $cur) ",
  45. _("Ваш баланс"), $money->{balance}, ("депозит"), $money->{deposit}, _("кредит"), $money->{credit}),
  46. );
  47. push @lines, sprintf("<u>%s:</u> %s", _("Оплачено до"), format_date($money->{last_day})) if $money->{last_day} ne "-";
  48. push @lines, sprintf("<u>%s:</u> %d%%", _("Скидка"), $money->{reduction}) if $money->{reduction};
  49. push @lines, sprintf("<u>%s:</u> <b>%.2f $cur</b> %s (%s)",
  50. _("Последнее снятие"), $money->{last_withdrawal}->{sum}, format_time($money->{last_withdrawal}->{date}), $money->{last_withdrawal}->{comment})
  51. if $money->{last_withdrawal}->{sum};
  52. push @lines, sprintf("<u>%s:</u> <b>%.2f $cur</b> %s", _("Последний платеж"), $money->{last_payment}->{sum}, format_time($money->{last_payment}->{date}))
  53. if $money->{last_payment}->{sum};
  54. for (keys %{ $money->{accounts} })
  55. {
  56. push @lines, sprintf("<u>%s:</u> <b>%.2f $cur</b>", $_, $money->{accounts}->{$_});
  57. }
  58. reply($info, @lines);
  59. }
  60. async sub command_info
  61. {
  62. my ($fsa, $info) = @_;
  63. my $uid = $fsa->note("uid");
  64. my $client = await $abon_client->get_p($info, "client", "/client/$uid");
  65. say Dumper $client;
  66. reply($info,
  67. sprintf("<u>%s</u>: %d", _("Лицевой счет"), $client->{uid}),
  68. sprintf("<u>%s</u>: %s", _("Логин"), $client->{login}),
  69. sprintf("<u>%s</u>: %s", _("ФИО"), $client->{fio}),
  70. sprintf("<u>%s</u>: %s", _("Адрес"), $client->{address}),
  71. sprintf("<u>%s</u>: %s", _("Телефон"), $client->{phone}),
  72. );
  73. }
  74. async sub command_credit
  75. {
  76. my ($fsa, $info) = @_;
  77. my $uid = $fsa->note("uid");
  78. my $money = await $abon_client->get_p($info, "client", "/client/$uid/money?human=1");
  79. if ($money->{credit} > 0)
  80. {
  81. return reply($info, sprintf("%s <b>%.2f %s</b>", _("У вас уже установлен кредит"), $money->{credit}, $money->{human}));
  82. }
  83. reply_with($info, {
  84. inline_menu => [[
  85. { text=>_("Я согласен с условиями"), callback_data=>"\x00/set-credit" },
  86. ]],
  87. },
  88. _("Вы можете самостоятельно установить кредит на два дня"),
  89. _("<b>Ограничения</b>: только для физических лиц, продлевать кредит повторно до оплаты нельзя. При следующей оплате кредит будет погашен"),
  90. );
  91. }
  92. async sub callback_set_credit
  93. {
  94. my ($fsa, $info) = @_;
  95. my $uid = $fsa->note("uid");
  96. my $res = await $abon_client->post_p($info, "client", "/client/$uid/credit", {human=>1});
  97. return reply($info, _("Кредит не имеет смысла для бесплатных тарифных планов")) if $res->{credit} == 0;
  98. await reply($info,
  99. sprintf("%s <b>%.2f %s</b>", _("Установлен кредит "), $res->{credit}, $res->{human}),
  100. "",
  101. );
  102. command_balance($fsa, $info);
  103. }
  104. async sub command_service
  105. {
  106. my ($fsa, $info) = @_;
  107. my $uid = $fsa->note("uid");
  108. my $res = await $abon_client->get_p($info, "client", "/client/$uid/service?human=1&as-array=1");
  109. my @list = map { sprintf("<u>%s:</u> %s (%s '%s')", $_->{name_ru}, format_wd($_->{tariff}, $_->{human}), _("тариф"), $_->{tariff}->{name_ru}) }
  110. grep { !$_->{disabled} } @$res;
  111. reply($info, @list);
  112. };
  113. async sub command_transfer
  114. {
  115. my ($fsa, $info) = @_;
  116. reply($info, "Введите лицевой счет пользователя, которому вы хотите перевести деньги со своего счета");
  117. $fsa->delete_note("xfer_to");
  118. $fsa->delete_note("xfer_amount");
  119. $fsa->state("xfer_needs_uid");
  120. }
  121. async sub callback_transfer
  122. {
  123. my ($fsa, $info) = @_;
  124. my $uid = $fsa->note("uid");
  125. my $to_uid = $fsa->note("xfer_to");
  126. my $amount = $fsa->note("xfer_amount");
  127. unless ($to_uid && $amount)
  128. {
  129. return reply($info, _("Произошла внутренняя ошибка"));
  130. }
  131. my $res = $abon_client->post_p($info, "client", "/client/$uid/money/to/$to_uid", {
  132. amount => $amount,
  133. ip => "0.0.0.0",
  134. via => "abonbot",
  135. currency => $config->{currency}->{name},
  136. });
  137. reply($info, _("Деньги успешно переведены"));
  138. command_balance($fsa, $info);
  139. }
  140. sub format_wd($rec, $cur)
  141. {
  142. return _("бесплатно") if $rec->{dayly} == 0 && $rec->{monthly} == 0;
  143. my $m = sprintf("<b>%.2f $cur</b> %s", $rec->{monthly}, _("в месяц")) if $rec->{monthly} != 0;
  144. my $d = sprintf("<b>%.2f $cur</b> %s", $rec->{dayly}, _("в месяц")) if $rec->{dayly} != 0;
  145. return ("$m + $d") if $m && $d;
  146. return $m if $m;
  147. return $d if $d;
  148. }
  149. ################################################
  150. sub parse_error
  151. {
  152. my $e = shift;
  153. return $e unless ref $e;
  154. return "$e->{code} $e->{message} $e->{body}";
  155. }
  156. 1;
  157. # перевод денег
  158. # локализация