147 lines
6.1 KiB
Java
147 lines
6.1 KiB
Java
package org.telegram.telegrambots;
|
|
|
|
import org.telegram.telegrambots.exceptions.TelegramApiRequestException;
|
|
import org.telegram.telegrambots.generics.BotSession;
|
|
import org.telegram.telegrambots.generics.LongPollingBot;
|
|
import org.telegram.telegrambots.generics.Webhook;
|
|
import org.telegram.telegrambots.generics.WebhookBot;
|
|
|
|
import java.text.MessageFormat;
|
|
|
|
/**
|
|
* @author Ruben Bermudez
|
|
* @version 1.0
|
|
* @brief Bots manager
|
|
* @date 14 of January of 2016
|
|
*/
|
|
public class TelegramBotsApi {
|
|
private static final String webhookUrlFormat = "{0}callback/";
|
|
private boolean useWebhook; ///< True to enable webhook usage
|
|
private Webhook webhook; ///< Webhook instance
|
|
private String extrenalUrl; ///< External url of the bots
|
|
private String pathToCertificate; ///< Path to public key certificate
|
|
|
|
/**
|
|
*
|
|
*/
|
|
public TelegramBotsApi() {
|
|
}
|
|
|
|
/**
|
|
* Creates an HTTP server to receive webhook request
|
|
* @param externalUrl External base url for the webhook
|
|
* @param internalUrl Internal base url for the webhook
|
|
*
|
|
* @implSpec This option requires externally handled HTTPS support (i.e. via proxy)
|
|
*/
|
|
public TelegramBotsApi(String externalUrl, String internalUrl) throws TelegramApiRequestException {
|
|
if (externalUrl == null || externalUrl.isEmpty()) {
|
|
throw new TelegramApiRequestException("Parameter externalUrl can not be null or empty");
|
|
}
|
|
if (internalUrl == null || internalUrl.isEmpty()) {
|
|
throw new TelegramApiRequestException("Parameter internalUrl can not be null or empty");
|
|
}
|
|
|
|
this.useWebhook = true;
|
|
this.extrenalUrl = fixExternalUrl(externalUrl);
|
|
webhook = ApiContext.getInstance(Webhook.class);
|
|
webhook.setInternalUrl(internalUrl);
|
|
webhook.startServer();
|
|
}
|
|
|
|
/**
|
|
* Creates an HTTPS server to receive webhook request
|
|
* @param keyStore KeyStore for the server
|
|
* @param keyStorePassword Key store password for the server
|
|
* @param externalUrl External base url for the webhook
|
|
* @param internalUrl Internal base url for the webhook
|
|
*/
|
|
public TelegramBotsApi(String keyStore, String keyStorePassword, String externalUrl, String internalUrl) throws TelegramApiRequestException {
|
|
if (externalUrl == null || externalUrl.isEmpty()) {
|
|
throw new TelegramApiRequestException("Parameter externalUrl can not be null or empty");
|
|
}
|
|
if (internalUrl == null || internalUrl.isEmpty()) {
|
|
throw new TelegramApiRequestException("Parameter internalUrl can not be null or empty");
|
|
}
|
|
if (keyStore == null || keyStore.isEmpty()) {
|
|
throw new TelegramApiRequestException("Parameter keyStore can not be null or empty");
|
|
}
|
|
if (keyStorePassword == null || keyStorePassword.isEmpty()) {
|
|
throw new TelegramApiRequestException("Parameter keyStorePassword can not be null or empty");
|
|
}
|
|
|
|
this.useWebhook = true;
|
|
this.extrenalUrl = fixExternalUrl(externalUrl);
|
|
webhook = ApiContext.getInstance(Webhook.class);
|
|
webhook.setInternalUrl(internalUrl);
|
|
webhook.setKeyStore(keyStore, keyStorePassword);
|
|
webhook.startServer();
|
|
}
|
|
|
|
/**
|
|
* Creates an HTTPS server with self-signed certificate to receive webhook request
|
|
* @param keyStore KeyStore for the server
|
|
* @param keyStorePassword Key store password for the server
|
|
* @param externalUrl External base url for the webhook
|
|
* @param internalUrl Internal base url for the webhook
|
|
* @param pathToCertificate Full path until .pem public certificate keys
|
|
*/
|
|
public TelegramBotsApi(String keyStore, String keyStorePassword, String externalUrl, String internalUrl, String pathToCertificate) throws TelegramApiRequestException {
|
|
if (externalUrl == null || externalUrl.isEmpty()) {
|
|
throw new TelegramApiRequestException("Parameter externalUrl can not be null or empty");
|
|
}
|
|
if (internalUrl == null || internalUrl.isEmpty()) {
|
|
throw new TelegramApiRequestException("Parameter internalUrl can not be null or empty");
|
|
}
|
|
if (keyStore == null || keyStore.isEmpty()) {
|
|
throw new TelegramApiRequestException("Parameter keyStore can not be null or empty");
|
|
}
|
|
if (keyStorePassword == null || keyStorePassword.isEmpty()) {
|
|
throw new TelegramApiRequestException("Parameter keyStorePassword can not be null or empty");
|
|
}
|
|
if (pathToCertificate == null || pathToCertificate.isEmpty()) {
|
|
throw new TelegramApiRequestException("Parameter pathToCertificate can not be null or empty");
|
|
}
|
|
|
|
this.useWebhook = true;
|
|
this.extrenalUrl = fixExternalUrl(externalUrl);
|
|
this.pathToCertificate = pathToCertificate;
|
|
webhook = ApiContext.getInstance(Webhook.class);
|
|
webhook.setInternalUrl(internalUrl);
|
|
webhook.setKeyStore(keyStore, keyStorePassword);
|
|
webhook.startServer();
|
|
}
|
|
|
|
/**
|
|
* Register a bot. The Bot Session is started immediately, and may be disconnected by calling close.
|
|
* @param bot the bot to register
|
|
*/
|
|
public BotSession registerBot(LongPollingBot bot) throws TelegramApiRequestException {
|
|
bot.clearWebhook();
|
|
BotSession session = ApiContext.getInstance(BotSession.class);
|
|
session.setToken(bot.getBotToken());
|
|
session.setOptions(bot.getOptions());
|
|
session.setCallback(bot);
|
|
session.start();
|
|
return session;
|
|
}
|
|
|
|
/**
|
|
* Register a bot in the api that will receive updates using webhook method
|
|
* @param bot Bot to register
|
|
*/
|
|
public void registerBot(WebhookBot bot) throws TelegramApiRequestException {
|
|
if (useWebhook) {
|
|
webhook.registerWebhook(bot);
|
|
bot.setWebhook(extrenalUrl + bot.getBotPath(), pathToCertificate);
|
|
}
|
|
}
|
|
|
|
private static String fixExternalUrl(String externalUrl) {
|
|
if (externalUrl != null && !externalUrl.endsWith("/")) {
|
|
externalUrl = externalUrl + "/";
|
|
}
|
|
return MessageFormat.format(webhookUrlFormat, externalUrl);
|
|
}
|
|
}
|