Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Deploy бота на Heroku / 19 сообщений из 19, страница 1 из 1
06.04.2020, 22:02
    #39944405
hsadik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Deploy бота на Heroku
Здравствуйте, опишу по порядку, что я сделал:

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

Я просто первый раз пробую сделать деплой и не совсем понимаю какая нужна конфигурация для heroku.
Вот мой pom.xml:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
<?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:
Код: java
1.
worker: sh target/bin/workerBot


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

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

В приложенном файле структура проекта.
Насколько я в итоге понял, у меня должна быть папка target/bin/workerBot, но её нет. В общем, не осилил я heroku и deploy.
...
Рейтинг: 0 / 0
06.04.2020, 23:07
    #39944429
fixxer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Deploy бота на Heroku
hsadik, запусти mvn package и все будет

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

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


Другое дело, что Heroku сам при пуше должен запустить mvn package и потом Procfile. Точно правильная ветка в origin heroku запушена?
...
Рейтинг: 0 / 0
07.04.2020, 03:52
    #39944455
Valentin Kolesnikov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Deploy бота на Heroku
hsadik,

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

Код: powershell
1.
worker: java -jar target/path-to-jar



Хорошего вам дня!
...
Рейтинг: 0 / 0
07.04.2020, 09:59
    #39944485
hsadik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Deploy бота на Heroku
fixxer

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

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

Сделал (в IDEA Lifecycle - Package). Проект собрался, в target появился джарник и другие файлы, в том числе папка bin (могу выложить её содержимое со скриптом, если это поможет решит проблему). Сделал новый деплой, собирается хорошо, но бот по-прежнему молчит.
Лог для mvn package:
Код: powershell
1.
2.
3.
4.
5.
[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 нужен другой.

Код: powershell
1.
worker: java -jar target/path-to-jar



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

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


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

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

Я на этом простом боте репетирую деплой, так как загружать потом буду другой, как доделаю его.
...
Рейтинг: 0 / 0
07.04.2020, 14:25
    #39944561
Valentin Kolesnikov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Deploy бота на Heroku
hsadik
fixxer

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

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

Сделал (в IDEA Lifecycle - Package). Проект собрался, в target появился джарник и другие файлы, в том числе папка bin (могу выложить её содержимое со скриптом, если это поможет решит проблему). Сделал новый деплой, собирается хорошо, но бот по-прежнему молчит.
Лог для mvn package:
Код: powershell
1.
2.
3.
4.
5.
[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 нужен другой.

Код: powershell
1.
worker: java -jar target/path-to-jar



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

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


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

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

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


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

Хорошего вам дня!
...
Рейтинг: 0 / 0
08.04.2020, 21:29
    #39945077
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Deploy бота на Heroku
Zzz79,

Wow-wow! Тормозни на поворотах. В скруле просто помогают. А ты решил взлететь на бедных студентах?
...
Рейтинг: 0 / 0
08.04.2020, 21:56
    #39945091
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Deploy бота на Heroku
Щас во всем мире будет кризис. Всем будет плохо.

У меня даже есть мысль что больше синьоры-помидоры пострадают. Их будут урезать по оплате.
А мидлы как-раз останутся. На сопровождении программных продуктов их - достаточно.
А развития во время кризиса не предвитится.
...
Рейтинг: 0 / 0
08.04.2020, 22:06
    #39945095
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Deploy бота на Heroku
Жена шить умеет? Вот купи вату. Марлю. И пусть сидит дома шьет маски. Это щас актуально.
...
Рейтинг: 0 / 0
08.04.2020, 22:08
    #39945097
Valentin Kolesnikov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Deploy бота на Heroku
mayton
Жена шить умеет? Вот купи вату. Марлю. И пусть сидит дома шьет маски. Это щас актуально.


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

Хорошего вам дня!
...
Рейтинг: 0 / 0
10.04.2020, 22:07
    #39946079
hsadik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Deploy бота на Heroku
Работяги, бота задеплоил, но теперь возник другой вопрос.

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


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

Я сделал очередь для сообщений куда сохраняю каждое сообщение пользователя, если оно начинается с /weather и обработчик для сообщений:
Код: java
1.
2.
3.
4.
5.
6.
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:
Код: java
1.
2.
3.
4.
5.
 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.

Кажется, что решение на ладони, но я его в упор не вижу.
...
Рейтинг: 0 / 0
11.04.2020, 21:07
    #39946245
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Deploy бота на Heroku
Zzz79,
+1
...
Рейтинг: 0 / 0
29.04.2020, 13:58
    #39952847
dakeiras
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Deploy бота на Heroku
Zzz79
hsadik,
ты напиши нормально что тебе надо )
я раза три прочитал ничего не понял - какие то очереди и прочие прелести,что то не коллерирется

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


Он не правильно Query перевёл как "очередь" просто.
...
Рейтинг: 0 / 0
29.04.2020, 14:01
    #39952848
dakeiras
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Deploy бота на Heroku
Автор,

Код: java
1.
.setCallbackData("/weather " + cityName)



А в обработчике просто split(" ") делай.
...
Рейтинг: 0 / 0
29.04.2020, 19:09
    #39953019
Oloir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Deploy бота на Heroku
hsadik, привет! У меня абсолютно аналогичная проблема с деплоем на heroku. Пожалуйста, напиши, как именно ты смог ее решить, спасибо!
...
Рейтинг: 0 / 0
09.05.2020, 20:42
    #39955591
hsadik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Deploy бота на Heroku
Oloir,
Если еще актуально.
Procfile:
Код: java
1.
worker: sh target/bin/workerBot


pom.xml:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
<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:
Код: java
1.
2.
3.
4.
.idea
*.iml
target
test


По итогу: никаких дополнительных команд в maven не делал, jar не собирал, просто голый код без сборки, heroku сам собирает. В общем, там в самих настройках на heroku у бота есть переключатель, который по умолчанию у меня был выключен. Точно сейчас уже не скажу, ну в общем в настройках своего проекта на heroku должна быть опция worker с переключателем, вот его надо включить. У меня проблема была в этом. Покопаться надо именно на сайте heroku.
...
Рейтинг: 0 / 0
11.05.2020, 18:45
    #39955980
hsadik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Deploy бота на Heroku
Zzz79,
PetroNotC Sharp,
dakeiras,


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

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


Итак, я получаю сообщение пользователя (объект Update),
Код: java
1.
2.
3.
4.
5.
6.
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:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
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:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
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, не боясь за то, что улетит неверная информация.

Вот ещё метод для отправки этой самой клавиатуры:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
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, его сообщения и т.д. Но тут уже похоже нужно будет использовать БД, чтобы хранить каждого пользователя. Но сама идея моего бота этого не предусматривает, это просто "информационный справочник". Но вот правильно обработать описанные мною запросы у меня не получается.
...
Рейтинг: 0 / 0
11.05.2020, 21:22
    #39956024
dakeiras
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Deploy бота на Heroku
hsadik,

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

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

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
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());
        }
    }



И как видишь я добавил ещё "/" чтобы можно было различать спам юзера и реальное нажатие кнопки. Это хорошая практика.
...
Рейтинг: 0 / 0
11.05.2020, 22:57
    #39956035
hsadik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Deploy бота на Heroku
dakeiras,

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


А handler примерной такой или можно покрасивее?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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;
...
...
Рейтинг: 0 / 0
11.05.2020, 23:07
    #39956036
hsadik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Deploy бота на Heroku
hsadik
dakeiras,

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


А handler примерной такой или можно покрасивее?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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 на:
Код: java
1.
call_data.substring(call_data.indexOf(" ") + 1);
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Deploy бота на Heroku / 19 сообщений из 19, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]