Added Telegram Bot class and refactored REST class

This commit is contained in:
Ziver Koc 2023-03-04 00:23:07 +01:00
parent bd1bb168da
commit 55c0d739be
6 changed files with 166 additions and 34 deletions

View file

@ -99,7 +99,7 @@ public class HttpClient implements AutoCloseable {
}
/**
* If set to true the the request will contain the full URL instead of only the path to the page.
* If set to true the request will contain the full URL instead of only the path to the page.
*/
public void setAbsoluteURL(boolean absoluteURL) {
this.absoluteURL = absoluteURL;

View file

@ -0,0 +1,77 @@
package zutil.net.ws.app;
import zutil.io.IOUtil;
import zutil.log.LogUtil;
import zutil.net.http.HttpClient;
import zutil.net.http.HttpHeader;
import zutil.net.http.HttpURL;
import zutil.net.ws.rest.RESTClient;
import zutil.parser.DataNode;
import zutil.parser.json.JSONParser;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Class connects to the Telegram API endpoints to send messages.
*
* @see <a href="https://core.telegram.org/bots/api">Telegram API Documentation</a>
*/
public class TelegramBot {
private static final Logger logger = LogUtil.getLogger();
private static String TELEGRAM_API_URL = "https://api.telegram.org";
/** Token used to authenticate to the API **/
private String token;
/**
*
* @param token token used to authenticate to the API
*/
public TelegramBot(String token) {
this.token = token;
}
private String getBaseUrl() {
return TELEGRAM_API_URL + "/bot" + token;
}
/**
* Send a message to a user or group.
*
* @param chatId a chat ID number, this could be the ID of a user or a group.
* @param msg the message to send in the chat.
*/
public void sendMessage(long chatId, String msg) {
try {
HttpURL url = new HttpURL(getBaseUrl() + "/sendMessage");
url.setParameter("chat_id", String.valueOf(chatId));
url.setParameter("text", msg);
DataNode reponse = RESTClient.get(url);
} catch (MalformedURLException e) {
logger.log(Level.SEVERE, "Failed to generate API URL.", e);
} catch (IOException e) {
logger.log(Level.SEVERE, "Failed to send API request.", e);
}
}
/**
* Use this method to receive incoming updates using long polling (wiki). Returns an Array of Update objects.
*/
public void getUpdates() {
try {
HttpURL url = new HttpURL(getBaseUrl() + "/getUpdates");
DataNode reponse = RESTClient.get(url);
} catch (MalformedURLException e) {
logger.log(Level.SEVERE, "Failed to generate API URL.", e);
} catch (IOException e) {
logger.log(Level.SEVERE, "Failed to send API request.", e);
}
}
}

View file

@ -0,0 +1,75 @@
package zutil.net.ws.rest;
import zutil.io.IOUtil;
import zutil.log.LogUtil;
import zutil.net.http.HttpClient;
import zutil.net.http.HttpHeader;
import zutil.net.http.HttpURL;
import zutil.net.ws.WSInterface.RequestType;
import zutil.parser.DataNode;
import zutil.parser.json.JSONParser;
import java.io.IOException;
import java.util.logging.Logger;
/**
* A class for making basic REST request to a remote service.
*/
public class RESTClient {
private static Logger logger = LogUtil.getLogger();
/**
* See {@link #request(RequestType, HttpURL)} for details.
*/
public static DataNode get(HttpURL url) throws IOException {
return request(RequestType.GET, url);
}
/**
* See {@link #request(RequestType, HttpURL)} for details.
*/
public static DataNode post(HttpURL url) throws IOException {
return request(RequestType.POST, url);
}
/**
* See {@link #request(RequestType, HttpURL)} for details.
*/
public static DataNode put(HttpURL url) throws IOException {
return request(RequestType.POST, url);
}
/**
* See {@link #request(RequestType, HttpURL)} for details.
*/
public static DataNode patch(HttpURL url) throws IOException {
return request(RequestType.PATCH, url);
}
/**
* See {@link #request(RequestType, HttpURL)} for details.
*/
public static DataNode delete(HttpURL url) throws IOException {
return request(RequestType.DELETE, url);
}
/**
* This method will do a REST request to the specified remote endpoint.
*
* @param type is the HTTP type of the request.
* @param url is the URL to the endpoint including URL parameters.
* @return a DataNode object parsed from the JSON response from the REST endpoint.
*/
public static DataNode request(RequestType type, HttpURL url) throws IOException {
HttpClient request = new HttpClient(String.valueOf(type));
request.setURL(url);
logger.fine("Sending request for: " + url);
HttpHeader responseHeader = request.send();
logger.fine("Received response code: " + responseHeader.getResponseStatusCode());
String responseStr = IOUtil.readContentAsString(request.getResponseInputStream());
request.close();
logger.finest("Received response body:");
logger.finest(responseStr);
DataNode json = JSONParser.read(responseStr);
return json;
}
}

View file

@ -34,7 +34,7 @@ import java.net.URL;
import java.util.logging.Logger;
/**
* This is an factory that generates clients for web services
* This is a factory that generates clients for web services
*
* @author Ziver
*/

View file

@ -24,16 +24,13 @@
package zutil.net.ws.rest;
import zutil.io.IOUtil;
import zutil.log.LogUtil;
import zutil.net.http.HttpClient;
import zutil.net.http.HttpHeader;
import zutil.net.http.HttpURL;
import zutil.net.ws.WSInterface.RequestType;
import zutil.net.ws.WSMethodDef;
import zutil.net.ws.WSParameterDef;
import zutil.net.ws.WebServiceDef;
import zutil.parser.DataNode;
import zutil.parser.json.JSONParser;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
@ -72,31 +69,15 @@ public class RESTClientInvocationHandler implements InvocationHandler {
WSMethodDef methodDef = wsDef.getMethod(method.getName());
HttpURL url = generateRESTRequest(methodDef, args);
String requestType = "GET";
if (methodDef.getRequestType() != null)
requestType = methodDef.getRequestType().toString();
RequestType requestType = RequestType.GET;
if (methodDef.getRequestType() != null) {
requestType = RequestType.valueOf(methodDef.getRequestType().toString());
}
// Send request
HttpClient request = new HttpClient(HttpClient.HttpRequestType.POST);
request.setURL(url);
request.setType(requestType);
logger.fine("Sending request for: " + url);
HttpHeader response = request.send();
logger.fine("Received response(" + response.getResponseStatusCode() + ")");
// Parse response
String rspStr = IOUtil.readContentAsString(request.getResponseInputStream());
request.close();
//if (logger.isLoggable(Level.FINEST)) {
System.out.println("********** Response: " + url);
System.out.println(rspStr);
//}
Object rspObj = parseRESTResponse(methodDef, rspStr);
DataNode jsonResponse = RESTClient.request(requestType, url);
Object rspObj = parseRESTResponse(methodDef, jsonResponse);
return rspObj;
}
@ -119,13 +100,12 @@ public class RESTClientInvocationHandler implements InvocationHandler {
return url;
}
private Object parseRESTResponse(WSMethodDef methodDef, String str) {
DataNode json = JSONParser.read(str);
private Object parseRESTResponse(WSMethodDef methodDef, DataNode jsonResponse) {
List<WSParameterDef> outputs = methodDef.getOutputs();
if (outputs.size() == 1) {
if (outputs.get(0).getParamClass().isAssignableFrom(DataNode.class))
return json;
return jsonResponse;
}
throw new RuntimeException("WS JSON return type currently not supported: " + methodDef);

View file

@ -37,7 +37,7 @@ import static org.junit.Assert.assertNotNull;
*/
public class RESTClientTest {
public interface OpenWeartherMap extends WSInterface {
public interface OpenWeatherMap extends WSInterface {
@WSPath("")
int weather(@WSParamName("q") String city);
@ -46,9 +46,9 @@ public class RESTClientTest {
//@Test
public void testREST() throws MalformedURLException {
OpenWeartherMap restObj = RESTClientFactory.createClient(
OpenWeatherMap restObj = RESTClientFactory.createClient(
new URL("http://samples.openweathermap.org/data/2.5/"),
OpenWeartherMap.class);
OpenWeatherMap.class);
assertNotNull(restObj.weather("London,uk"));
}