powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Не получается поднять бота на Spring Boot
25 сообщений из 233, страница 8 из 10
Не получается поднять бота на Spring Boot
    #39971034
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собирай артифакт jar. И запускай его так как делает хероку.
Только в таких условиях ты сможешь протестировать все нюансы.

Компромиссов нет.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971037
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras
бот это presentation layer. В нём не должно быть никакой своей бизнес логики.
Бизнес логика в REST API.
Безопасность в IAM.

Иначе получается каша.
а какая логика?
открывается страница - на ней только число xxxxx
юзверь вводит это число в бот
бот отсылает это число к тебе на сервер
по id юзверя в боте проверяешь его наличие телефона в своей базе
если он есть - ищешь по этому числу сессию
привязываешь этого юзверя к этой сессии
и шлёшь по этой сессии новую страницу с инфой только для этого юзверя
какая бизнес логика ?
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971043
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras
вадя
пропущено...
это почему?


бот это presentation layer. В нём не должно быть никакой своей бизнес логики.
Бизнес логика в REST API.
Безопасность в IAM.

Иначе получается каша.

Стоп-стоп. Вы щас улетите на луну с такими абстракциями. Под ботом вы подразумеваете что?
Имплементацию TelegramLongPollingBot ?
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971049
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
dakeiras
пропущено...


бот это presentation layer. В нём не должно быть никакой своей бизнес логики.
Бизнес логика в REST API.
Безопасность в IAM.

Иначе получается каша.

Стоп-стоп. Вы щас улетите на луну с такими абстракциями. Под ботом вы подразумеваете что?
Имплементацию TelegramLongPollingBot ?


При чём здесь абстракции. Это "архитектура" (ненавижу это слово).

автора какая логика?
открывается страница - на ней только число xxxxx
юзверь вводит это число в бот
бот отсылает это число к тебе на сервер
по id юзверя в боте проверяешь его наличие телефона в своей базе
если он есть - ищешь по этому числу сессию
привязываешь этого юзверя к этой сессии
и шлёшь по этой сессии новую страницу с инфой только для этого юзверя
какая бизнес логика ?

я ничего не понял. Можете понятнее описать? Вы имеете в виду что бот шлёт какое-то OTP?
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971053
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras, ты решил к боту подойти как к ентерпрайзу?

Это обосновано?
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971057
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras
я ничего не понял. Можете понятнее описать? Вы имеете в виду что бот шлёт какое-то OTP?
бот выступает в роли смс только в обратном направлении
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971091
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
dakeiras, ты решил к боту подойти как к ентерпрайзу?

Это обосновано?

имхо в современных реалиях - экономически это стало целесообразно.
Изза облак, опенсорса и пр. Т.е. то что раньше стоило дорого, сейчас стало доступно - предоставляя преимущества.

Но это имхо.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971095
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras,

Я прекрасно знаю как работают облака. Но твое предложение пе декомпозиции бота на слои в данном примере - безсмысленно. Оно ничего не даёт автору.

Но оно может обрести смысл если ты поможешь ему сэкономить на хостинге или обеспечить скейлинг.

Только автор пока ни о чем таком не просит.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971099
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребят, помогите "архитектуру" поправить, чтобы избежать циклических зависимостей. Spring выносит мне мозг.

В общем, бот работает по примерно такой схеме:
Получает Update в главном классе, который наследуется от LongPolling, потом я сразу отправляю этот апдейт в UpdateReceiver, откуда в зависимости от типа Update еще дальше отправляю его "гулять" по обработчикам. В классе бота написаны методы для отправки сообщения юзеру, поэтому этот "бот" нужен во всех обработчиках. Но этот бот зависит от UpdateReceiver, которому так же нужен этот "бот". В итоге циклическая зависимость:

Чёрным цветом - классы (почти все помечены как @Component), красным - инжектнутые зависимости.
Сделал конфигурацию для класса бота:
Код: 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.
@Component
@ConfigurationProperties(prefix = "bot")
@Getter
@Setter
@FieldDefaults(level = AccessLevel.PRIVATE)
public class BotConfig {
    String userName;
    String botToken;
}


@Configuration
public class AppConfig {
    private BotConfig botConfig;

    public AppConfig(BotConfig botConfig) {
        this.botConfig = botConfig;
    }

    @Bean
    public GooglePlayGamesAssistantBot googlePlayGamesAssistantBot(UpdateReceiver updateReceiver) {
        GooglePlayGamesAssistantBot bot = new GooglePlayGamesAssistantBot(updateReceiver);
        bot.setBotToken(botConfig.getBotToken());
        bot.setBotUsername(botConfig.getUserName());
        return bot;
    }
}


Немного "бота":
Код: 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.
@Getter
@Setter
@FieldDefaults(level = AccessLevel.PRIVATE)
public class GooglePlayGamesAssistantBot extends TelegramLongPollingBot {

    String botUsername;

    String botToken;

    private UpdateReceiver updateReceiver;

    public GooglePlayGamesAssistantBot(UpdateReceiver updateReceiver) {
        this.updateReceiver = updateReceiver;
    }

    @Override
    public void onUpdateReceived(Update update) {
        updateReceiver.handleUpdate(update);
    }

    public synchronized void sendTextMessage(long chatId, String message) {
        SendMessage textMessage = new SendMessage()
                .enableMarkdown(false)
                .setChatId(chatId)
                .setText(message);
        try {
            execute(textMessage);
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }


Едем в UpdateReceiver:
Код: 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.
@Service
public class UpdateReceiver {

    private TextMessageHandler textMessageHandler;
    private CallbackQueryHandler callbackQueryHandler;
    private GooglePlayGamesAssistantBot bot;


    public UpdateReceiver(TextMessageHandler textMessageHandler,
                          CallbackQueryHandler callbackQueryHandler,
                          GooglePlayGamesAssistantBot bot){
        this.textMessageHandler = textMessageHandler;
        this.callbackQueryHandler = callbackQueryHandler;
        this.bot = bot;
    }

    public void handleUpdate(Update update) {
        if (update.hasMessage() && update.getMessage().hasText()){
            textMessageHandler.handleTextMessage(update);
        }
        else if (update.hasCallbackQuery()) {
            callbackQueryHandler.handleCallbackQuery(update.getCallbackQuery());
        }
        else {
            bot.sendTextMessage(update.getMessage().getChatId(),
                    "Неверная команда");
        }
    }
}


Ну и для примера в "текстовый" обработчик далее по цепочке:
Код: 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.
@Component
public class TextMessageHandler {

    private final List<MessageHandler> messageHandlers;
    private GooglePlayGamesAssistantBot bot;

    public TextMessageHandler(List<MessageHandler> messageHandlers,
                              GooglePlayGamesAssistantBot bot) {
        this.messageHandlers = messageHandlers;
        this.bot = bot;
    }

    public void handleTextMessage(Update update){
        long chatId = update.getMessage().getChatId();
        String text = update.getMessage().getText();
        try {
            messageHandlers.stream()
                    .filter(handler -> handler.canHandle(text))
                    .findAny()
                    .orElseThrow(IllegalArgumentException::new)
                    .handle(update);
        }
        catch (IllegalArgumentException e){
            bot.sendTextMessage(chatId, "Такой команды я не знаю!");
        }

    }
}


Ну и получаю:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
The dependencies of some of the beans in the application context form a cycle:

   callbackQueryHandler defined in file [C:\Users\РОМА\IdeaProjects\assistant_tbot\target\classes\ru\miroha\bot\handler\callback\CallbackQueryHandler.class]

|  googlePlayGamesAssistantBot defined in class path resource [ru/miroha/AppConfig.class]

|  updateReceiver defined in file [C:\Users\РОМА\IdeaProjects\assistant_tbot\target\classes\ru\miroha\bot\handler\UpdateReceiver.class]

|  textMessageHandler defined in file [C:\Users\РОМА\IdeaProjects\assistant_tbot\target\classes\ru\miroha\bot\handler\message\TextMessageHandler.class]

|  helpMessageHandler defined in file [C:\Users\РОМА\IdeaProjects\assistant_tbot\target\classes\ru\miroha\bot\handler\message\HelpMessageHandler.class]



Проблему смог решить двумя путями.
1) Заменить все конструкторы на поля и повесить на них @Autowired
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@Service
public class UpdateReceiver {
    
    @Autowired
    private TextMessageHandler textMessageHandler;
    @Autowired
    private CallbackQueryHandler callbackQueryHandler;
    @Autowired
    private GooglePlayGamesAssistantBot bot


В таком случае бот работает, но постоянно плюется (почти ежесекундно) ошибками о том, что он не может получить апдейты, но он получает их и обрабатывает корректно.
2) Добавить в конструкторе @Lazy:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
@Service
public class UpdateReceiver {
    
    private TextMessageHandler textMessageHandler;
    private CallbackQueryHandler callbackQueryHandler;
    private GooglePlayGamesAssistantBot bot;


    public UpdateReceiver(TextMessageHandler textMessageHandler,
                          CallbackQueryHandler callbackQueryHandler,
                          @Lazy GooglePlayGamesAssistantBot bot){
        this.textMessageHandler = textMessageHandler;
        this.callbackQueryHandler = callbackQueryHandler;
        this.bot = bot;
    }


В таком случае бот так же продолжает плеваться сообщениями типа:
Код: java
1.
2.
ERROR Telegram Bots Api:85 - BOTSESSION
2020-06-19T18:11:58.871673+00:00 app[worker.1]: org.telegram.telegrambots.meta.exceptions.TelegramApiRequestException: Error getting updates



Оба решения не совсем мне нравятся. В общем, нужен совет, что поменять и как заставить это чудо полноценно работать.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971195
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971265
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras, обычно я вместо длинной колбасы методов ввожу 1 поясняющую переменную.
Кажется называется Introduce Temporary Variable refactoring.

Тоесть вместо такого

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
if ((!update.hasMessage()) && update.hasCallbackQuery()) {
                if (update.getCallbackQuery().getData().startsWith("/")) {
                    callPlugin(update.getCallbackQuery().getData().split(" ")[0].substring(1),
                            update.getCallbackQuery().getMessage().getChat().getFirstName(),
                            silent,
                            sender,
                            update.getCallbackQuery().getMessage().getChatId(),
                            Arrays.asList(update.getCallbackQuery().getData().split(" "))
                    );
                } else {
                    receiveInput(update.getCallbackQuery().getData(), update.getCallbackQuery().getMessage().getChatId(), silent, sender);
                }



Делаю introduce data, и некий неизвестный объект message (не знаю какого он типа сам подставь нужный).

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
if ((!update.hasMessage()) && update.hasCallbackQuery()) {
                String data = update.getCallbackQuery().getData();
                if (data.startsWith("/")) {
                    Object message = update.getCallbackQuery().getMessage();
                    callPlugin(data.split(" ")[0].substring(1),
                            message.getChat().getFirstName(),
                            silent,
                            sender,
                            message.getChatId(),
                            Arrays.asList(data.split(" "))
                    );
....



После этого код получается... более git-friendly. Строки короче. И смысл более сжатый и понятный. И изменения
легче вносить т.к. они сжаты в 1 точке.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971275
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ентерпрайз не отменяет KISS.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971277
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так же делаю часто. Это более хорошая практика, делать if условие короче.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971279
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras, ну так исправляй. Что-ж ты несовершенный код выдаешь как пример. Потом джуны посмотрят
и примут за чистую монету. И еще будут рассказывать что так видели и это правильно.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971283
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не против бинов. Я просто эстетику кода оценивал. Чисто по диагонали.
Обычно видно чем сильнее разработчик тем меньше у него копи-паст и само-повторения
кода. У Бесконечно-Технологичного Дэвида - дохрена копи-паст и код его от этого... хм
слегка теряет престиж.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971317
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы о разном коде говорите.

Zzz79 говорит про адский код топик стартера. И как я понимаю троллит к тому же (я надеюсь на это).
(upd: я так и не понял где Zzz79 увидел бины и у кого).

В Дэвиде нет бинов. Даже компонентов нет. Хотя autowiring есть и всё в Спринге.
Надо будет по местному совету передалать на Boot Starter и prototype бины.

авторЯ не против бинов. Я просто эстетику кода оценивал. Чисто по диагонали.
Обычно видно чем сильнее разработчик тем меньше у него копи-паст и само-повторения
кода. У Бесконечно-Технологичного Дэвида - дохрена копи-паст и код его от этого... хм
слегка теряет престиж.
2 фактора. Сила разработчика + количество итераций рефакторинга.
Это не последняя итерация. Но там далеко не всё так плохо.

Убогий копипаст кстати вызван кривым API TelegramBots, что они тоже постепенно выправляют (хоть и не туда куда нужно).

Насчёт своей силы Java разработчика: она на уровне мидла. Я никогда не кричал и не кричу что я знаю Яву отлично (или даже хорошо).
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971318
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zzz79
mayton,
Я просто к чему- что я разгребаю и легаси и более менее современный код
но давно уже бины не видел

А что не так стало с бинами-то теперь?
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971320
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras

Убогий копипаст кстати вызван кривым API TelegramBots, что они тоже постепенно выправляют (хоть и не туда куда нужно).

Не согласен. Я не вижу здесь влияния API TelegramBots.

Я указал вам ВАШ авторский код который находится в namespace io.infinite.david.

И я говорю - этот код плох. Его надо улучшить.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971323
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mayton,

Кстати, не хотел разбивать Ваш идеализм насчёт эстетики кода.

Но просто откройте популярные опен сорс проекты. Например тот же Logback.
И просто ужаснитесь тому хтоническому ужасу который там внутри.

И так в половине проектов. И они используются и развиваются.

Тоже самое касается и проприетарщины. Там даже хуже бывает.

Есть и отличные примеры конечно. Где всё идеально сделано (и опен сорс и проприетарные). К таким надо стремиться конечно.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971325
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
dakeiras

Убогий копипаст кстати вызван кривым API TelegramBots, что они тоже постепенно выправляют (хоть и не туда куда нужно).

Не согласен. Я не вижу здесь влияния API TelegramBots.

Я указал вам ВАШ авторский код который находится в namespace io.infinite.david.

И я говорю - этот код плох. Его надо улучшить.


Даже не TelegramBots API. А сам бот АПИ телеги сделан через жопу Дуровым. Если будите с ним работать - сразу станет понятно.
Ненормализованная модель данных, неоптимизированная. Не REST не GraphQL. Не рыба ни мясо короче.

Я не спорю что мой код плох там. И улучшу в след раз когда буду что-то менять там.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971326
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras

Даже не TelegramBots API. А сам бот АПИ телеги сделан через жопу Дуровым. Если будите с ним работать - сразу станет понятно.
Ненормализованная модель данных, неоптимизированная. Не REST не GraphQL. Не рыба ни мясо короче.

Денормализация - вообще не в тему. При чем здесь это к качеству кода? Это разные векторы.
REST/GraphQL - да пофиг вообще. Тебе как прикладнику какая разница какой там над-сетевой проткол?
Ты же не браузером к боту подключаешся верно?

dakeiras

Я не спорю что мой код плох там. И улучшу в след раз когда буду что-то менять там.

Ты уж постарайся. Меня коробит когда кто-то приводит эталоном свои проекты даже
не пройдя независимые code-review.

Я по возможности буду напоминать тебе об этом несовершенстве.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971327
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras

Но просто откройте популярные опен сорс проекты. Например тот же Logback.
И просто ужаснитесь тому хтоническому ужасу который там внутри.

Этот проект?

https://github.com/qos-ch/logback

Ну ткните меня туда где ужас-ужас. Я вот хочу ужастнуться. Может сам напишу issue с пожеланием об улучшении.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971328
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторДенормализация - вообще не в тему. При чем здесь это к качеству кода? Это разные векторы.
REST/GraphQL - да пофиг вообще. Тебе как прикладнику какая разница какой там над-сетевой проткол?
Ты же не браузером к боту подключаешся верно?

Ну не знаю как это формально описать. В общем если столкнётесь с этим АПИ - увидите сами. Он... странный.
Они запихнули всё в объект Update. Поэтому приходится постоянно делать if (update.hasThis.....), if (update.hasThat...)

Код: java
1.
if ((!update.hasMessage()) && update.hasCallbackQuery())



Могли они как-то иначе сделать.

авторТы уж постарайся. Меня коробит когда кто-то приводит эталоном свои проекты даже
не пройдя независимые code-review.

Я по возможности буду напоминать тебе об этом несовершенстве.
да я только рад, спасибо. Это помогает.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971331
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras

Код: java
1.
if ((!update.hasMessage()) && update.hasCallbackQuery())



Не понимаю проблемы. Сделай себе функцию и пользуйся.
Код: java
1.
hasMessageAndCllback(update)
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39971335
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
dakeiras

Но просто откройте популярные опен сорс проекты. Например тот же Logback.
И просто ужаснитесь тому хтоническому ужасу который там внутри.

Этот проект?

https://github.com/qos-ch/logback

Ну ткните меня туда где ужас-ужас. Я вот хочу ужастнуться. Может сам напишу issue с пожеланием об улучшении.

ch.qos.logback.classic.Logger

filterAndLog_0_Or3Plus

И прочие чудеса на виражах.
Там нормального очень мало на самом деле.

Код: java
1.
2.
3.
4.
5.
6.
7.
    public void debug(Marker marker, String format, Object... argArray) {
        filterAndLog_0_Or3Plus(FQCN, marker, Level.DEBUG, format, argArray, null);
    }

    public void debug(Marker marker, String msg, Throwable t) {
        filterAndLog_0_Or3Plus(FQCN, marker, Level.DEBUG, msg, null, t);
    }



При этом ирония в том что logback и Slf4j делали одни и теже авторы.
...
Рейтинг: 0 / 0
25 сообщений из 233, страница 8 из 10
Форумы / Java [игнор отключен] [закрыт для гостей] / Не получается поднять бота на Spring Boot
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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