Обработка нескольких пользователей одновременно с TelegramLongPollingBot и потоком - PullRequest
1 голос
/ 15 апреля 2019

Я создаю свой первый бот-телеграмму.Он отправляет одно сообщение каждые 5 секунд пользователю.

Хотя он отправляет его одному пользователю, он не может получать обновления из другого чата.

public void foo(msg, Update update){
    msg.setChatId(update.getMessage().getChatId());
    for (int i = 1; i < links.size(); i++){
        msg.setText(links.get(i));
        execute(msg);
    }
    Thread.sleep(wait * 1000);
}

Как использовать поток?Я попытался создать несколько потоков здесь

public static void bot(){

    ApiContextInitializer.init();
    TelegramBotsApi  telegramBotsApi = new TelegramBotsApi();
    try {
        telegramBotsApi.registerBot(new myBot());
    } catch (TelegramApiException e) {
        e.printStackTrace();
    }

Но он пытается создать несколько ботов и терпит неудачу.То же самое, если это запускаемая функция:

Как я могу это сделать?Я застрял.Я не могу создать эту функцию в другом потоке

public void onUpdateReceived(Update update) {

    leggi(new SendMessage(), update.getMessage().getText(),  update);

    //.setChatId(update.getMessage().getChatId())


public void  leggi(SendMessage msg, String command, Update update){ 
    if(command.equals("test") {
        foo( msg, update);
    }

Вот полный код ... https://github.com/siamoInPochi/Ilsottomarinobot/tree/prova/src/main/java/Ilsottomarinobot

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Вы можете сделать это с этой библиотекой https://github.com/pengrad/java-telegram-bot-api

<dependency>
  <groupId>com.github.pengrad</groupId>
  <artifactId>java-telegram-bot-api</artifactId>
  <version>4.2.0</version>
</dependency>
  1. Подписаться на новые обновления через bot.setUpdatesListener
  2. Отправка сообщений через bot.execute(new SendMessage(chatId, link), callback)

Полный рабочий пример:

static String[] links = {"1", "2", "3"};

static Callback emptyCallback = new Callback() {
    @Override
    public void onResponse(BaseRequest request, BaseResponse response) {
    }

    @Override
    public void onFailure(BaseRequest request, IOException e) {
        e.printStackTrace();
    }
};

static void foo(TelegramBot bot, Update update) {
    Message message = update.message();
    if (message == null) return;

    Long chatId = message.chat().id();
    for (String link : links) {
        bot.execute(new SendMessage(chatId, link), emptyCallback);
    }
}

public static void main(String[] args) {
    TelegramBot bot = new TelegramBot(TOKEN);

    bot.setUpdatesListener(updates -> {
        for (Update update : updates) {
            foo(bot, update);
        }
        return UpdatesListener.CONFIRMED_UPDATES_ALL;
    });
}
0 голосов
/ 24 апреля 2019

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

На мой взгляд, более естественный подход заключается в следующем:

  • Найти библиотеку с HTTP-сервером.
  • Переключение с GetUpdates на webhooks.
  • Планирование send-message-to-user-every-5-seconds задач для цикла событий сервера.
  • Отправлять сообщения каждые 5 секунд асинхронно.
...