Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Deploy бота на Heroku  [new]
hsadik
Member

Откуда:
Сообщений: 7
Здравствуйте, опишу по порядку, что я сделал:

1. Создал новый Maven проект в Intelij IDEA (отдельно Maven я не скачивал и никаких переменных соответственно для него вручную не устанавливал).
2. Написал простого телеграм-бота (отвечает пользователю тем же сообщением, что он отправил боту).
3. Открыл git bash, сделал git init, далее git add и commit соответственно. Сделал удаленную репу на гитхабе и связал её со своим проектом, сделал push, проект готов.
4. Попробовал загрузить бота на heroku (подключив в аккаунте git и указав нужную репу), и загрузка прошла без ошибок. Но бот молчит, хотя должен отвечать, очевидно что что-то пошло не так :)

Я просто первый раз пробую сделать деплой и не совсем понимаю какая нужна конфигурация для heroku.
Вот мой pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>heroku</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>appassembler-maven-plugin</artifactId>
                <version>1.1.1</version>
                <configuration>
                    <assembleDirectory>target</assembleDirectory>
                    <programs>
                        <program>
                            <mainClass>bot.Bot</mainClass>
                            <name>workerBot</name>
                        </program>
                    </programs>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>assemble</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>

        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>4.6</version>
        </dependency>
    </dependencies>

</project>

Собственно, главный класс выбран (точка входа): <mainClass>bot.Bot</mainClass>.
Далее я читал, что нужен файл Procfile:
worker: sh target/bin/workerBot

На что он влияет, я так и не понял, и как он должен выглядеть у меня - тоже.

Собственно, после этого я хочу получить jar своего проекта.
Делаю File -> Project Structure -> Artifacts и добавляю там новый .jar с зависимостями (указываю main class). Получаю jar.
И вот эта вся куча файлов лежит в репе.

В приложенном файле структура проекта.
Насколько я в итоге понял, у меня должна быть папка target/bin/workerBot, но её нет. В общем, не осилил я heroku и deploy.

К сообщению приложен файл. Размер - 10Kb
6 апр 20, 22:02    [22112065]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
fixxer
Member

Откуда:
Сообщений: 791
hsadik, запусти mvn package и все будет

автор
Собственно, после этого я хочу получить jar своего проекта.
Делаю File -> Project Structure -> Artifacts и добавляю там новый .jar с зависимостями (указываю main class). Получаю jar.
И вот эта вся куча файлов лежит в репе.


а вот эту ересь убери


Другое дело, что Heroku сам при пуше должен запустить mvn package и потом Procfile. Точно правильная ветка в origin heroku запушена?

Сообщение было отредактировано: 6 апр 20, 23:11
6 апр 20, 23:07    [22112096]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
Valentin Kolesnikov
Member

Откуда:
Сообщений: 3283
hsadik,

Возможно Procfile нужен другой.

worker: java -jar target/path-to-jar


Хорошего вам дня!
7 апр 20, 03:52    [22112150]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
hsadik
Member

Откуда:
Сообщений: 7
fixxer

Другое дело, что Heroku сам при пуше должен запустить mvn package и потом Procfile. Точно правильная ветка в origin heroku запушена?

А я в heroku не пушил. Я пушил в гитхаб, а оттуда "присоединял" к heroku через их интерфейс (CLI я не устанавливал). Ветка там одна единственная - master.
Попробовал удалить этот jar, проект не собирал, а так и запушил - результатов (положительных) нет.
fixxer
hsadik, запусти mvn package и все будет

Сделал (в IDEA Lifecycle - Package). Проект собрался, в target появился джарник и другие файлы, в том числе папка bin (могу выложить её содержимое со скриптом, если это поможет решит проблему). Сделал новый деплой, собирается хорошо, но бот по-прежнему молчит.
Лог для mvn package:
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ heroku ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!



[INFO] Compiling 2 source files to C:\Users\Miroha\IdeaProjects\heroku\target\classes
Valentin Kolesnikov
hsadik,

Возможно Procfile нужен другой.

worker: java -jar target/path-to-jar


Хорошего вам дня!

Заменил на путь к jar, который у меня получился в результате package:
worker: java -jar target/heroku-1.0-SNAPSHOT.jar

Билдится, деплоится, бот молчит. :(

Собственно, делюсь ссылкой на гитхаб проекта, может так будет нагляднее!
https://github.com/miroha/heroku-tg

Я на этом простом боте репетирую деплой, так как загружать потом буду другой, как доделаю его.

Сообщение было отредактировано: 7 апр 20, 10:06
7 апр 20, 09:59    [22112208]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
Valentin Kolesnikov
Member

Откуда:
Сообщений: 3283
hsadik
fixxer

Другое дело, что Heroku сам при пуше должен запустить mvn package и потом Procfile. Точно правильная ветка в origin heroku запушена?

А я в heroku не пушил. Я пушил в гитхаб, а оттуда "присоединял" к heroku через их интерфейс (CLI я не устанавливал). Ветка там одна единственная - master.
Попробовал удалить этот jar, проект не собирал, а так и запушил - результатов (положительных) нет.
fixxer
hsadik, запусти mvn package и все будет

Сделал (в IDEA Lifecycle - Package). Проект собрался, в target появился джарник и другие файлы, в том числе папка bin (могу выложить её содержимое со скриптом, если это поможет решит проблему). Сделал новый деплой, собирается хорошо, но бот по-прежнему молчит.
Лог для mvn package:
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ heroku ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!



[INFO] Compiling 2 source files to C:\Users\Miroha\IdeaProjects\heroku\target\classes
Valentin Kolesnikov
hsadik,

Возможно Procfile нужен другой.

worker: java -jar target/path-to-jar


Хорошего вам дня!

Заменил на путь к jar, который у меня получился в результате package:
worker: java -jar target/heroku-1.0-SNAPSHOT.jar

Билдится, деплоится, бот молчит. :(

Собственно, делюсь ссылкой на гитхаб проекта, может так будет нагляднее!
https://github.com/miroha/heroku-tg

Я на этом простом боте репетирую деплой, так как загружать потом буду другой, как доделаю его.


Нужно настройку поменять для приложения. Воркеры только для платных приложений доступны.

Хорошего вам дня!
7 апр 20, 14:25    [22112346]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
Zzz79
Member

Откуда:
Сообщений: 178
автор,чтобы что то деплоить на хероку ничего делать не надо - там ребята постарались так,что любой твой комит в соотвествующей ветке актуализируется автоматом и на проде не нужны никакие файлы и конфиги
но нужно закачать heroku cli
после этого в терминале делаешь обычные гит команды и твое приложение будет рабоать на хероку

если не осилишь пиши за хороший вискарь я тебе помогу)

Сообщение было отредактировано: 8 апр 20, 19:56
8 апр 20, 19:52    [22113063]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
mayton
Member

Откуда: loopback
Сообщений: 46599
Zzz79,

Wow-wow! Тормозни на поворотах. В скруле просто помогают. А ты решил взлететь на бедных студентах?
8 апр 20, 21:29    [22113148]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
Zzz79
Member

Откуда:
Сообщений: 178
mayton
Zzz79,

Wow-wow! Тормозни на поворотах. В скруле просто помогают. А ты решил взлететь на бедных студентах?

у меня кризис)денег ноль а жрать охота) а на зп джуна 32 рубля не прожить))
8 апр 20, 21:32    [22113151]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
mayton
Member

Откуда: loopback
Сообщений: 46599
Щас во всем мире будет кризис. Всем будет плохо.

У меня даже есть мысль что больше синьоры-помидоры пострадают. Их будут урезать по оплате.
А мидлы как-раз останутся. На сопровождении программных продуктов их - достаточно.
А развития во время кризиса не предвитится.
8 апр 20, 21:56    [22113166]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
Zzz79
Member

Откуда:
Сообщений: 178
mayton
Щас во всем мире будет кризис. Всем будет плохо.

У меня даже есть мысль что больше синьоры-помидоры пострадают. Их будут урезать по оплате.
А мидлы как-раз останутся. На сопровождении программных продуктов их - достаточно.
А развития во время кризиса не предвитится.

зп прогера у меня на месте,а вот бизнес сдыхает) учитывая что жену после декрета никуда не бекрут,а сейчас тем более -я хватаюсь за любую it халтуру)
8 апр 20, 22:01    [22113169]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
mayton
Member

Откуда: loopback
Сообщений: 46599
Жена шить умеет? Вот купи вату. Марлю. И пусть сидит дома шьет маски. Это щас актуально.

Сообщение было отредактировано: 8 апр 20, 22:05
8 апр 20, 22:06    [22113172]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
Valentin Kolesnikov
Member

Откуда:
Сообщений: 3283
mayton
Жена шить умеет? Вот купи вату. Марлю. И пусть сидит дома шьет маски. Это щас актуально.


Конкуренция большая. Я фабричные, тканевые за 20 грн покупал.

Хорошего вам дня!
8 апр 20, 22:08    [22113174]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
hsadik
Member

Откуда:
Сообщений: 7
Работяги, бота задеплоил, но теперь возник другой вопрос.

Есть обработчик сообщений, который разбит на два отдельных обработчика. Один обрабатывает обычные сообщения, а другой callback. Callback это то, что отсылается серверу при нажатии на кнопку Inline клавиатуры, примерно так:

Картинка с другого сайта.
В начале я обрабатываю обычное сообщение: условно /weather London, пользователю вылетает такая клавиатура с параметрами (температура, скорость ветра и т.д.). При нажатии на кнопку срабатывает второй обработчик (callbackquery), который по кнопке отправляет соответствующие результаты.
Если пользователь напишет следующий запрос /weather Paris, он получит информацию о другом городе, всё верно. Но, если он при этом пролистает чат наверх и нажмет условно кнопку с влажностью для Лондона, то он получит ответ для Парижа. Т.е. последнее сообщение перекрывает старое.

Я сделал очередь для сообщений куда сохраняю каждое сообщение пользователя, если оно начинается с /weather и обработчик для сообщений:
public static Deque<String> queue = new LinkedList<>();
...
public void handleTextMessage(Update update){
        long chat_id = update.getMessage().getChatId();
        String message = update.getMessage().getText();
        queue.add(message);

Т.е. сделав два запроса у меня там лежит /weather London и /weather Paris.

Вот для callback:
 public void handleCallBackQuery(Update update) {
        String call_data = update.getCallbackQuery().getData();
        long message_id = update.getCallbackQuery().getMessage().getMessageId();
        long chat_id = update.getCallbackQuery().getMessage().getChatId();
        String city = queue.getLast().substring(WEATHER.length()).trim();

Я из этой очереди всегда достаю последний элемент, в этом и проблема, но не могу сообразить как мне соединить запросы так, чтобы они коррелировались как нужно. Надо запоминать id сообщения, которое начинает с /weather. Надо наверное завести пару ключ значение, где ключом будет id сообщения, а значением как раз /weather London и т.д.

Но я не могу заполнить хеш-мапу в первом обработчике, так как мне нужен id сообщения, который соответствует клавиатуре Т.е. id не сообщения "/weather London" (1000), а id клавиатуры выпадающей (точнее её callback) - условно 1111.

И в итоге хрен его не знает, как всё это скомпоновать. Я же не могу в handleMessage занести только значение в виде /weather London без ключа, который я получаю в handleCallBack.

Кажется, что решение на ладони, но я его в упор не вижу.
10 апр 20, 22:07    [22114437]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
Zzz79
Member

Откуда:
Сообщений: 178
hsadik,
ты напиши нормально что тебе надо )
я раза три прочитал ничего не понял - какие то очереди и прочие прелести,что то не коллерирется

вопрос надо сформулировать,иначе как ты хочешь чтобы тебе кто то помог?
11 апр 20, 18:21    [22114686]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4841
Zzz79,
+1
11 апр 20, 21:07    [22114771]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
dakeiras
Member

Откуда:
Сообщений: 447
Zzz79
hsadik,
ты напиши нормально что тебе надо )
я раза три прочитал ничего не понял - какие то очереди и прочие прелести,что то не коллерирется

вопрос надо сформулировать,иначе как ты хочешь чтобы тебе кто то помог?


Он не правильно Query перевёл как "очередь" просто.
29 апр 20, 13:58    [22124892]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
dakeiras
Member

Откуда:
Сообщений: 447
Автор,

.setCallbackData("/weather " + cityName)


А в обработчике просто split(" ") делай.
29 апр 20, 14:01    [22124896]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
Oloir
Member

Откуда:
Сообщений: 1
hsadik, привет! У меня абсолютно аналогичная проблема с деплоем на heroku. Пожалуйста, напиши, как именно ты смог ее решить, спасибо!
29 апр 20, 19:09    [22125263]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
hsadik
Member

Откуда:
Сообщений: 7
Oloir,
Если еще актуально.
Procfile:
worker: sh target/bin/workerBot

pom.xml:
<build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>appassembler-maven-plugin</artifactId>
                <version>1.1.1</version>
                <configuration>
                    <assembleDirectory>target</assembleDirectory>
                    <programs>
                        <program>
                            <mainClass>bot.BotApplication</mainClass>
                            <name>workerBot</name>
                        </program>
                    </programs>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>assemble</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

gitignore:
.idea
*.iml
target
test

По итогу: никаких дополнительных команд в maven не делал, jar не собирал, просто голый код без сборки, heroku сам собирает. В общем, там в самих настройках на heroku у бота есть переключатель, который по умолчанию у меня был выключен. Точно сейчас уже не скажу, ну в общем в настройках своего проекта на heroku должна быть опция worker с переключателем, вот его надо включить. У меня проблема была в этом. Покопаться надо именно на сайте heroku.
9 май 20, 20:42    [22129954]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
hsadik
Member

Откуда:
Сообщений: 7
Zzz79,
PetroNotC Sharp,
dakeiras,


Да, тяжело это объяснить, сейчас попробую еще раз. Пришлось вернуться к этому небольшому проекту, а проблема так и не решена.

Вкратце про своего бота: встроил простой предварительно написанный парсер Google Play в бота - он умеет получать информацию по ссылке, а после этого добавлять полученную информацию во внутреннюю библиотеку (пишется в файл). Так вот, если игра есть в библиотеке бота, то информацию о ней можно получить по команде /library Название_игры. В таком случае пользователю отправляется inline клавиатура с вариантами выбора, и каждый callback обрабатывается соответствующим образом.
Выглядит это так:
Картинка с другого сайта.

Итак, я получаю сообщение пользователя (объект Update),
if (update.hasMessage() && update.getMessage().hasText()){
         new TextMessageHandler(update, replyGenerator).handleTextMessage();
    }
else if (update.hasCallbackQuery()) {
         new CallbackQueryHandler(update, replyGenerator).handleCallBackQuery();
    }

Соответственно пользовательское сообщение обрабатывается TextMessageHandler, и если оно содержит в себе упоминание /library, то вызывается соответствующий handler для этой команды - LibraryMessageHandler.

Кусок из LibraryHandler:
public class LibraryMessageHandler implements MessageHandler {

    public static Map<Long, String> queries = new HashMap<>();

    private Update update;

    public LibraryMessageHandler(Update update) {
        this.update = update;
    }
    ....
    public void handleLibraryMessage(String message, long chat_id, ReplyMessageGenerator replyGenerator){
            String title = message.replace(ChatCommands.LIBRARY.getDescription(), "").trim();
            if (LibraryService.getLibrary().containsKey(title)){
                addQuery(update, title);
                title = LibraryService.getLibrary().get(title).getTitle();
                replyGenerator.sendInlineKeyboardMessage(chat_id, title);
            }
            else {
                replyGenerator.sendTextMessage(chat_id, "Такой игры в библиотеке нет!");
                log.info("[Игра {} не найдена в библиотеке]", title);
            }
        
    }

    private void addQuery(Update update, String title) {
        //id сообщения с клавиатурой, к которому привязан callback
        //message_id общий для всех пользователей!
        //при одновременной отправке метод не сработает
        long message_id = (update.getMessage().getMessageId()) + 1;
        queries.put(message_id, title);
    }
}

В начале я достаю название игры (обрезаю /library). С этим названием запрос летит во внутреннюю библиотеку и проверяется соответствие: если такая игра есть, то выплевывается та самая inline клавиатура.

Клавиатура отправлена, пользователь может нажимать кнопочки. Тут уже нужен CallbackQueryHandler, который обрабатывает каждое нажатие этой клавиатуры. Тут возникает вопрос: а для какой игры и вообще сообщения собственно обрабатывать запросы? Нужно же знать на какой callback отвечать (отдельный message_id). Их может быть сколько угодно, и каждый нужно обработать. Для этого я пока придумал хешмапу (и метод addQuery), которая хранит message_id (ключ) + игру (значение), которая привязана к запросу. Т.е. идет запрос от пользователя, в котором есть упоминание названия игры (я запоминаю id этого сообщения), следом пользователю прилетит сообщение с клавиатурой (уже следующий message_id), а значит нужный мне message_id с клавиатурой будет +1 от запроса пользователя, но это лишь при идеальном сценарии.

Если два пользователя одновременно отправят запрос (а это не такой уж и редкий сценарий), то message_id уже будет не тот: я получу message_id сообщения второго пользователя, а не нужной мне клавиатуры, т.к. message_id один общий для всех чатов и пользователей. В общем, конфликты не избежны.
Сам Callback:
public class CallbackQueryHandler {

    private Update update;
    private ReplyMessageGenerator replyGenerator;

    public CallbackQueryHandler(Update update, ReplyMessageGenerator replyGenerator){
        this.update = update;
        this.replyGenerator = replyGenerator;
    }

    public void handleCallBackQuery() {
        String call_data = update.getCallbackQuery().getData();
        long message_id = update.getCallbackQuery().getMessage().getMessageId();
        long chat_id = update.getCallbackQuery().getMessage().getChatId();
        String title = LibraryMessageHandler.queries.get(message_id);
        GooglePlayGame game = LibraryService.getLibrary().get(title);
        switch (call_data){
            case "price":
                replyGenerator.sendTextMessage(chat_id, game.getPrice());
                break;
            case "updated":
                replyGenerator.sendTextMessage(chat_id, game.getLastUpdated());
                break;
            case "version":
                replyGenerator.sendTextMessage(chat_id, game.getCurrentVersion());
                break;
            case "requirements":
                replyGenerator.sendTextMessage(chat_id, game.getRequiresAndroid());
                break;
            case "iap":
                replyGenerator.sendTextMessage(chat_id, game.getIap());
                break;
            case "size":
                replyGenerator.sendTextMessage(chat_id, game.getSize());
                break;
            case "all":
                replyGenerator.sendTextMessage(chat_id, LibraryService.getLibrary().get(title).toString());
                break;
            case "close":
                replyGenerator.sendEditedTextMessage(chat_id, message_id);
                break;
        }
    }
}


По итогу: мне нужно знать id этой самой выпадающей клавиатуры (иначе как её отследить?), так как к этой клавиатуре привязан конкретный запрос. И далее связать этот id клавиатуры с названием игры, которое посылается пользователем, после которого эта самая клавиатура и появляется. Клавиатура не сможет отработать без этого названия (по названию осуществляется поиск в библиотеке). Получив связь "название игры - клавиатура" я уже могу отвечать на те самые callback, не боясь за то, что улетит неверная информация.

Вот ещё метод для отправки этой самой клавиатуры:
public synchronized void sendInlineKeyboardMessage(long chat_id, String message) {
        SendMessage keyboard = InlineKeyboardBuilder.create(chat_id)
                .setText("Вы может узнать следующую информацию об игре " + message)
                .row()
                .button("Стоимость " + "\uD83D\uDCB0", "price")
                .button("Обновлено " + "\uD83D\uDDD3", "updated")
                .button("Версия " + "\uD83D\uDEE0", "version")
                .endRow()
                .row()
                .button("Требования " + "\uD83D\uDCF5", "requirements")
                .button("Покупки " + "\uD83D\uDED2", "iap")
                .button("Размер " + "\uD83D\uDD0E", "size")
                .endRow()
                .row()
                .button("Получить всю информацию об игре" + "\uD83D\uDD79", "all")
                .endRow()
                .row()
                .button("Скрыть клавиатуру", "close")
                .endRow()
                .build();
        try {
            execute(keyboard);
        } catch (TelegramApiException e) {
            log.error("[Не удалось отправить сообщение]: {}", e.getMessage());
        }
    }


Как выйти из сложившейся ситуации?
Возможно, там даже есть готовое решение в telegram bot api, но мои поиски не увенчались успехом, не хватает мне еще опыта, я только учусь.
Может вообще стоит задуматься об изменении дизайна бота, добавив например сущность в виде User, где хранить chat_id, его сообщения и т.д. Но тут уже похоже нужно будет использовать БД, чтобы хранить каждого пользователя. Но сама идея моего бота этого не предусматривает, это просто "информационный справочник". Но вот правильно обработать описанные мною запросы у меня не получается.
11 май 20, 18:45    [22130715]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
dakeiras
Member

Откуда:
Сообщений: 447
hsadik,

это всё понятно было изначально. И совет я уже дал выше.

Повторю ещё раз - добавь аргумент просто в callback:

public synchronized void sendInlineKeyboardMessage(long chat_id, String gameName) {
        SendMessage keyboard = InlineKeyboardBuilder.create(chat_id)
                .setText("Вы может узнать следующую информацию об игре " + gameName)
                .row()
                .button("Стоимость " + "\uD83D\uDCB0", "/price " + gameName)
                .button("Обновлено " + "\uD83D\uDDD3", "/updated " + gameName)
                .button("Версия " + "\uD83D\uDEE0", "/version " + gameName)
                .endRow()
                .row()
                .button("Требования " + "\uD83D\uDCF5", "/requirements " + gameName)
                .button("Покупки " + "\uD83D\uDED2", "/iap " + gameName)
                .button("Размер " + "\uD83D\uDD0E", "/size " + gameName)
                .endRow()
                .row()
                .button("Получить всю информацию об игре" + "\uD83D\uDD79", "/all " + gameName)
                .endRow()
                .row()
                .button("Скрыть клавиатуру", "close")
                .endRow()
                .build();
        try {
            execute(keyboard);
        } catch (TelegramApiException e) {
            log.error("[Не удалось отправить сообщение]: {}", e.getMessage());
        }
    }


И как видишь я добавил ещё "/" чтобы можно было различать спам юзера и реальное нажатие кнопки. Это хорошая практика.
11 май 20, 21:22    [22130787]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
hsadik
Member

Откуда:
Сообщений: 7
dakeiras,

Спасибо, вроде получилось, но нужно будет еще протестировать. Телеграм сейчас у меня "заблокирован", а через VPN порой проблемы с соединением, но по логам, которые удалось получить, вроде нормально выходит.
Добавил этот аргумент:
.button("Стоимость " + "\uD83D\uDCB0", "/price " + gameTitle)

А handler примерной такой или можно покрасивее?
String call_data = update.getCallbackQuery().getData();
long message_id = update.getCallbackQuery().getMessage().getMessageId();
long chat_id = update.getCallbackQuery().getMessage().getChatId();
String gameTitle = call_data.split(" ")[1];
GooglePlayGame game = LibraryService.getLibrary().get(gameTitle);
switch (call_data.split(" ")[0]){
    case "/price" :
        replyGenerator.sendTextMessage(chat_id, game.getPrice());
        break;
...
11 май 20, 22:57    [22130814]     Ответить | Цитировать Сообщить модератору
 Re: Deploy бота на Heroku  [new]
hsadik
Member

Откуда:
Сообщений: 7
hsadik
dakeiras,

Спасибо, вроде получилось, но нужно будет еще протестировать. Телеграм сейчас у меня "заблокирован", а через VPN порой проблемы с соединением, но по логам, которые удалось получить, вроде нормально выходит.
Добавил этот аргумент:
.button("Стоимость " + "\uD83D\uDCB0", "/price " + gameTitle)

А handler примерной такой или можно покрасивее?
String call_data = update.getCallbackQuery().getData();
long message_id = update.getCallbackQuery().getMessage().getMessageId();
long chat_id = update.getCallbackQuery().getMessage().getChatId();
String gameTitle = call_data.split(" ")[1];
GooglePlayGame game = LibraryService.getLibrary().get(gameTitle);
switch (call_data.split(" ")[0]){
    case "/price" :
        replyGenerator.sendTextMessage(chat_id, game.getPrice());
        break;
...


Ан нет, с таким сплитом, если название игры состоит из более чем одного слова, будет неправильно обработано, и бот не найдет её в библиотеке.

Переписал gameTitle на:
call_data.substring(call_data.indexOf(" ") + 1);


Сообщение было отредактировано: 11 май 20, 23:12
11 май 20, 23:07    [22130818]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить