start
This commit is contained in:
127
pom.xml
Normal file
127
pom.xml
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
<?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>HomeBot</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<name>HomeBot</name>
|
||||||
|
<!-- FIXME change it to the project's website -->
|
||||||
|
<url>http://www.example.com</url>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<maven.compiler.source>1.8</maven.compiler.source>
|
||||||
|
<maven.compiler.target>1.8</maven.compiler.target>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>jitpack.io</id>
|
||||||
|
<url>https://jitpack.io</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.11</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.json</groupId>
|
||||||
|
<artifactId>json</artifactId>
|
||||||
|
<version>20230618</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.demidko</groupId>
|
||||||
|
<artifactId>aot</artifactId>
|
||||||
|
<version>2022.11.28</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- хз-->
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-numbers-core</artifactId>
|
||||||
|
<version>1.1</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- хз-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-math3</artifactId>
|
||||||
|
<version>3.6.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-lang3</artifactId>
|
||||||
|
<version>3.12.0</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
|
||||||
|
<plugins>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<!-- Build an executable JAR -->
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
|
<version>3.1.0</version>
|
||||||
|
<configuration>
|
||||||
|
<archive>
|
||||||
|
<manifest>
|
||||||
|
<addClasspath>true</addClasspath>
|
||||||
|
<classpathPrefix>lib/</classpathPrefix>
|
||||||
|
<mainClass>org.example.App</mainClass>
|
||||||
|
</manifest>
|
||||||
|
</archive>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-clean-plugin</artifactId>
|
||||||
|
<version>3.1.0</version>
|
||||||
|
</plugin>
|
||||||
|
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
|
<version>3.0.2</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.8.0</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>2.22.1</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
|
<version>3.0.2</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-install-plugin</artifactId>
|
||||||
|
<version>2.5.2</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-deploy-plugin</artifactId>
|
||||||
|
<version>2.8.2</version>
|
||||||
|
</plugin>
|
||||||
|
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-site-plugin</artifactId>
|
||||||
|
<version>3.7.1</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-project-info-reports-plugin</artifactId>
|
||||||
|
<version>3.0.0</version>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</pluginManagement>
|
||||||
|
</build>
|
||||||
|
</project>
|
||||||
3
src/main/java/META-INF/MANIFEST.MF
Normal file
3
src/main/java/META-INF/MANIFEST.MF
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
Main-Class: org.example.App
|
||||||
|
|
||||||
132
src/main/java/org/example/App.java
Normal file
132
src/main/java/org/example/App.java
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
package org.example;
|
||||||
|
|
||||||
|
import org.pavlik.bot.*;
|
||||||
|
import org.pavlik.helpers.CoreHelp;
|
||||||
|
import org.pavlik.helpers.Morph;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Deque;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public class App
|
||||||
|
{
|
||||||
|
protected static String tgToken;
|
||||||
|
protected static TelegramAdapter tgAdapter;
|
||||||
|
public static boolean stop_signal=false;
|
||||||
|
public static BotDialogController botDialogController = null;
|
||||||
|
public static BotCommands botCommands = null;
|
||||||
|
public static String admin_chat;
|
||||||
|
public static HashMap<String, BotDialog> Dialogs = new HashMap<>();
|
||||||
|
|
||||||
|
public static void loadConf() {
|
||||||
|
|
||||||
|
File file = new File("settings.properties");
|
||||||
|
Properties properties = new Properties();
|
||||||
|
try {
|
||||||
|
properties.load(new FileReader(file));
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.out.println("файл с настройками не грузанулся");
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
tgToken = properties.getProperty("tg.token");
|
||||||
|
admin_chat = properties.getProperty("tg.admin_id");
|
||||||
|
|
||||||
|
System.out.println("tgTokenLoaded");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void printStat() {
|
||||||
|
Runtime runtime = Runtime.getRuntime();
|
||||||
|
long totalMemory = runtime.totalMemory();
|
||||||
|
long freeMemory = runtime.freeMemory();
|
||||||
|
long usedMemory = totalMemory - freeMemory;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
System.out.println("Total memory: " + totalMemory);
|
||||||
|
System.out.println("Free memory: " + freeMemory);
|
||||||
|
System.out.println("Used memory: " + usedMemory);
|
||||||
|
|
||||||
|
//String path = System.getProperty("user.dir");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void initApp() {
|
||||||
|
loadConf();
|
||||||
|
App.botDialogController = new BotDialogController();
|
||||||
|
App.botCommands = new BotCommands();
|
||||||
|
tgAdapter = new TelegramAdapter(tgToken);
|
||||||
|
startMsg();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//сообщение о запуске админу
|
||||||
|
public static void startMsg(){
|
||||||
|
String res = null;
|
||||||
|
|
||||||
|
while (res==null) {
|
||||||
|
CoreHelp.sleep(5000);
|
||||||
|
|
||||||
|
res = tgAdapter.sendMessage(admin_chat,"Я родился!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Вытащить в асинхрон заполнение очереди и разгребание
|
||||||
|
*
|
||||||
|
* @param args
|
||||||
|
*/
|
||||||
|
public static void main( String[] args )
|
||||||
|
{
|
||||||
|
initApp();
|
||||||
|
|
||||||
|
|
||||||
|
while (!stop_signal) {
|
||||||
|
|
||||||
|
Long offset = tgAdapter.last_update + 1;
|
||||||
|
Deque<MessageObj> out = tgAdapter.getUpdates(offset.toString());
|
||||||
|
|
||||||
|
//если проблемы с соединением, то поспать 5 секунд и повторить...
|
||||||
|
if (out==null) {
|
||||||
|
System.out.println("result error");
|
||||||
|
|
||||||
|
CoreHelp.sleep(5000);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (out.size()>0) {
|
||||||
|
while(!out.isEmpty()) {
|
||||||
|
|
||||||
|
MessageObj r = out.pop();
|
||||||
|
if (r.message_id.isEmpty()) continue;
|
||||||
|
|
||||||
|
|
||||||
|
if (!Dialogs.containsKey(r.message_id)) {
|
||||||
|
Dialogs.put(r.message_id, new BotDialog(tgAdapter));
|
||||||
|
}
|
||||||
|
|
||||||
|
App.botDialogController.answer(Dialogs.get(r.message_id),r);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
88
src/main/java/org/pavlik/bot/BotCommands.java
Normal file
88
src/main/java/org/pavlik/bot/BotCommands.java
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
package org.pavlik.bot;
|
||||||
|
|
||||||
|
import org.example.App;
|
||||||
|
import org.apache.commons.lang3.math.NumberUtils;
|
||||||
|
|
||||||
|
public class BotCommands {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public String runCmd(BotDialog dialog, MessageObj r) {
|
||||||
|
|
||||||
|
String cmd1 = r.text.replaceAll("^/","");
|
||||||
|
String cmd0 = dialog.lastCmd;
|
||||||
|
|
||||||
|
String cmd = (cmd0 !=null && !cmd0.isEmpty()) ? cmd0 : cmd1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
switch (cmd) {
|
||||||
|
case ("stop"):
|
||||||
|
return this.cmdStop(dialog, cmd1);
|
||||||
|
|
||||||
|
case ("start"):
|
||||||
|
return "start";
|
||||||
|
|
||||||
|
case ("summ"):
|
||||||
|
return this.cmdSumm(dialog,cmd1);
|
||||||
|
|
||||||
|
case("no"):
|
||||||
|
return "выражайся четче, я твои команды не пойму!";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Неизвестная команда: "+cmd+" для справки введите /help";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String cmdStop(BotDialog dialog, String cmd) {
|
||||||
|
|
||||||
|
if (!dialog.is_admin) return "В доступе отказано";
|
||||||
|
|
||||||
|
if (cmd.equals("stop") && dialog.lastCmd==null) {
|
||||||
|
|
||||||
|
dialog.lastCmd=cmd;
|
||||||
|
return "Ты хочешь остановить бота, он умрет, если ты уверен, то ответь /yes или /no для отмены";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cmd.equals("yes")) {
|
||||||
|
App.stop_signal=true;
|
||||||
|
return "Аааааа, я подыхаю, всё, ты меня убил....\n Программа завершила свою работу.";
|
||||||
|
}
|
||||||
|
if (cmd.equals("no")) {
|
||||||
|
App.stop_signal=true;
|
||||||
|
dialog.lastCmd=null;
|
||||||
|
return "Ура, я жив, процесс убийства бота отменен.";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Вводи или /yes или /no других путей нет!!!";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
protected String cmdSumm(BotDialog dialog, String cmd) {
|
||||||
|
if (dialog.lastCmd==null) {
|
||||||
|
|
||||||
|
dialog.lastCmd=cmd;
|
||||||
|
return "Запущен навык сумма, вводите числа и в конце напишите /res";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (cmd.equals("res")) {
|
||||||
|
//return "Да я хз, что я Архимед????";
|
||||||
|
dialog.lastCmd=null;
|
||||||
|
return "Общая сумма:"+dialog.summ;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd = cmd.replace(",",".").trim();
|
||||||
|
if (NumberUtils.isParsable(cmd)) {
|
||||||
|
double ent = Double.parseDouble(cmd);
|
||||||
|
dialog.summ+=ent;
|
||||||
|
return "Число "+ent+" добавлено\nтекущая сумма:"+dialog.summ+"\nдля завершения рассчетов введи /res";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Я таких чисел понять не могу, можешь нормально ввести???";
|
||||||
|
}
|
||||||
|
}
|
||||||
22
src/main/java/org/pavlik/bot/BotDialog.java
Normal file
22
src/main/java/org/pavlik/bot/BotDialog.java
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
package org.pavlik.bot;
|
||||||
|
|
||||||
|
import org.example.App;
|
||||||
|
|
||||||
|
|
||||||
|
public class BotDialog {
|
||||||
|
public String lastName, firstName, userName, userId;
|
||||||
|
public boolean is_admin = false;
|
||||||
|
public String transportId;
|
||||||
|
public MessageAdapter adapter;
|
||||||
|
public boolean zdorova;
|
||||||
|
public boolean answName;
|
||||||
|
public String lastCmd;
|
||||||
|
public int cmdStage=0;
|
||||||
|
public double summ=0.0;
|
||||||
|
|
||||||
|
|
||||||
|
public BotDialog (MessageAdapter adapter) {
|
||||||
|
this.adapter = adapter;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
69
src/main/java/org/pavlik/bot/BotDialogController.java
Normal file
69
src/main/java/org/pavlik/bot/BotDialogController.java
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
package org.pavlik.bot;
|
||||||
|
|
||||||
|
import org.example.App;
|
||||||
|
|
||||||
|
|
||||||
|
public class BotDialogController {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void answer(BotDialog dialog, MessageObj r)
|
||||||
|
{
|
||||||
|
dialog.is_admin = checkAdmin(r);
|
||||||
|
String response = genResponse(r,dialog);
|
||||||
|
|
||||||
|
if (response!=null && !response.isEmpty() && !r.message_id.isEmpty()) {
|
||||||
|
dialog.adapter.sendMessage(r.message_id, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Генерация ответа на сообщение
|
||||||
|
* @param r - request, объект входящего сообщения с данными о пользователе, об объектах в сообщении
|
||||||
|
* @param dialog - контекст диалога с конкретным собеседником
|
||||||
|
* @return - текстовая строка с ответом на сообщение
|
||||||
|
*/
|
||||||
|
protected String genResponse(MessageObj r, BotDialog dialog) {
|
||||||
|
if (r.text == null) {
|
||||||
|
return "Ты шлешь мне какую-то дичь, еще раз пришлешь, не буду с тобой разговаривать.";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!r.text.isEmpty()) {
|
||||||
|
if (r.is_command || dialog.lastCmd!=null) {
|
||||||
|
//обработчик команд
|
||||||
|
return App.botCommands.runCmd(dialog,r);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return govorilka(r,dialog);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected String govorilka(MessageObj r, BotDialog dialog) {
|
||||||
|
if (!dialog.zdorova) {
|
||||||
|
dialog.zdorova = true;
|
||||||
|
return "Здарова, давай поговорим, скажи как к тебе обращаться?";
|
||||||
|
}
|
||||||
|
if (!dialog.answName) {
|
||||||
|
dialog.answName = true;
|
||||||
|
dialog.userName = r.text;
|
||||||
|
return "Хорошо, "+dialog.userName+", так и буду тебя называть!!!";
|
||||||
|
}
|
||||||
|
|
||||||
|
return dialog.userName+", на твое сообщение <"+r.text+"> я пока ответов не знаю, я маленький и глупый...";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected boolean checkAdmin(MessageObj r) {
|
||||||
|
return r.message_id.equals("1187023222") && r.user_id.equals("pavelbbb");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
9
src/main/java/org/pavlik/bot/MessageAdapter.java
Normal file
9
src/main/java/org/pavlik/bot/MessageAdapter.java
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package org.pavlik.bot;
|
||||||
|
|
||||||
|
import java.util.Deque;
|
||||||
|
|
||||||
|
public interface MessageAdapter {
|
||||||
|
String sendMessage(String chatId, String text);
|
||||||
|
|
||||||
|
Deque<MessageObj> getUpdates(String offset);
|
||||||
|
}
|
||||||
9
src/main/java/org/pavlik/bot/MessageObj.java
Normal file
9
src/main/java/org/pavlik/bot/MessageObj.java
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package org.pavlik.bot;
|
||||||
|
|
||||||
|
public class MessageObj {
|
||||||
|
public String text;
|
||||||
|
public String message_id;
|
||||||
|
public Long update_id;
|
||||||
|
public boolean is_command=false;
|
||||||
|
public String user_id;
|
||||||
|
}
|
||||||
130
src/main/java/org/pavlik/bot/TelegramAdapter.java
Normal file
130
src/main/java/org/pavlik/bot/TelegramAdapter.java
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
package org.pavlik.bot;
|
||||||
|
|
||||||
|
//import java.math.BigInteger;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.ArrayDeque;
|
||||||
|
import java.util.Deque;
|
||||||
|
|
||||||
|
import org.json.*;
|
||||||
|
import org.pavlik.helpers.RestHelper;
|
||||||
|
|
||||||
|
|
||||||
|
public class TelegramAdapter implements MessageAdapter {
|
||||||
|
String token;
|
||||||
|
RestHelper Rest;
|
||||||
|
public Long last_update = 0l;
|
||||||
|
protected String qUrl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* добавить исключение при пустом токене
|
||||||
|
* @param token
|
||||||
|
*/
|
||||||
|
public TelegramAdapter(String token) {
|
||||||
|
this.token = token;
|
||||||
|
this.Rest = new RestHelper();
|
||||||
|
qUrl = "https://api.telegram.org/bot"+token;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String sendMessage(String chatId, String text) {
|
||||||
|
|
||||||
|
|
||||||
|
String encodedMsg = null;
|
||||||
|
try {
|
||||||
|
encodedMsg = URLEncoder.encode(text, StandardCharsets.UTF_8.toString());
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
String queryUrl = qUrl+"/sendMessage?chat_id="+chatId+"&text="+encodedMsg;
|
||||||
|
String respBody = Rest.queryGetBody(queryUrl);
|
||||||
|
|
||||||
|
System.out.println("--------------------------\n send message("+chatId+"):\n"+text);
|
||||||
|
|
||||||
|
return respBody;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* добавить маскирование токена
|
||||||
|
* @param offset
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Deque<MessageObj> getUpdates(String offset) {
|
||||||
|
String queryUrl = qUrl+"/getUpdates?offset="+offset+"&limit=10&timeout=60";
|
||||||
|
|
||||||
|
String respBody = Rest.queryGetBody(queryUrl);
|
||||||
|
System.out.println("-----------------------------------------");
|
||||||
|
System.out.println(respBody);
|
||||||
|
System.out.println("-----------------------------------------");
|
||||||
|
|
||||||
|
if (respBody == null) return null;
|
||||||
|
|
||||||
|
return parseResp(respBody);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Deque parseResp(String jsonBody) {
|
||||||
|
JSONObject obj = new JSONObject(jsonBody);
|
||||||
|
|
||||||
|
Deque<MessageObj> list = new ArrayDeque<>();
|
||||||
|
|
||||||
|
if (obj.getBoolean("ok")) {
|
||||||
|
|
||||||
|
JSONArray res_obj = obj.getJSONArray("result");
|
||||||
|
for (int i = 0; i < res_obj.length(); i++) {
|
||||||
|
JSONObject curr = res_obj.getJSONObject(i);
|
||||||
|
MessageObj r = new MessageObj();
|
||||||
|
|
||||||
|
Long update_id = curr.getLong("update_id");
|
||||||
|
last_update = update_id;
|
||||||
|
|
||||||
|
if (!curr.has("message")) continue;
|
||||||
|
|
||||||
|
|
||||||
|
JSONObject message = curr.getJSONObject("message");
|
||||||
|
JSONObject from = message.getJSONObject("from");
|
||||||
|
String chat_id = from.getBigInteger("id").toString();
|
||||||
|
if (message.has("text")) {
|
||||||
|
r.text = message.getString("text");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (from.has("username"))
|
||||||
|
r.user_id = from.getString("username");
|
||||||
|
|
||||||
|
//detect command
|
||||||
|
if (message.has("entities")) {
|
||||||
|
JSONArray entities = message.getJSONArray("entities");
|
||||||
|
for (int e=0;e<entities.length();e++) {
|
||||||
|
JSONObject entities_it = entities.getJSONObject(e);
|
||||||
|
if (entities_it.has("type") && entities_it.getString("type").equals("bot_command")) {
|
||||||
|
r.is_command=true;
|
||||||
|
System.out.println("bottt!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
r.message_id = chat_id;
|
||||||
|
r.update_id = update_id;
|
||||||
|
|
||||||
|
|
||||||
|
//r.text = text;
|
||||||
|
list.add(r);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
15
src/main/java/org/pavlik/helpers/CoreHelp.java
Normal file
15
src/main/java/org/pavlik/helpers/CoreHelp.java
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package org.pavlik.helpers;
|
||||||
|
|
||||||
|
public class CoreHelp {
|
||||||
|
/**
|
||||||
|
* поспать msec 5000 = 5 sec
|
||||||
|
* @param msec - милисекунды
|
||||||
|
*/
|
||||||
|
public static void sleep(int msec) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(msec);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
4
src/main/java/org/pavlik/helpers/FileHelper.java
Normal file
4
src/main/java/org/pavlik/helpers/FileHelper.java
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
package org.pavlik.helpers;
|
||||||
|
|
||||||
|
public class FileHelper {
|
||||||
|
}
|
||||||
37
src/main/java/org/pavlik/helpers/Main.java
Normal file
37
src/main/java/org/pavlik/helpers/Main.java
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
import org.apache.http.HttpResponse;
|
||||||
|
import org.pavlik.helpers.RestHelper;
|
||||||
|
//package org.pavlik.helpers;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
public class Main {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
/*RestHelper Rest = new RestHelper(
|
||||||
|
"client-keystore3.jks",
|
||||||
|
"JKS",
|
||||||
|
"123321",
|
||||||
|
"2",
|
||||||
|
"truststore.jks",
|
||||||
|
"JKS",
|
||||||
|
"123321");*/
|
||||||
|
|
||||||
|
RestHelper Rest = new RestHelper(
|
||||||
|
"client1.p12",
|
||||||
|
"PKCS12",
|
||||||
|
"123321",
|
||||||
|
null
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
String queryUrl = "https://192.168.200.10/index.php?kokoko=1";
|
||||||
|
String queryBody = "{\"k\":\"val\"}";
|
||||||
|
HashMap<String,String> queryHeaders = new HashMap<>();
|
||||||
|
queryHeaders.put("CONTENT-TYPE","text/plain2; charset=UTF-8");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
HttpResponse resp = Rest.queryPostRaw(queryUrl,queryBody,queryHeaders);
|
||||||
|
String respBody = Rest.getRespBody(resp);
|
||||||
|
System.out.println(respBody);
|
||||||
|
}
|
||||||
|
}
|
||||||
72
src/main/java/org/pavlik/helpers/Morph.java
Normal file
72
src/main/java/org/pavlik/helpers/Morph.java
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
package org.pavlik.helpers;
|
||||||
|
import com.github.demidko.aot.WordformMeaning;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static com.github.demidko.aot.WordformMeaning.lookupForMeanings;
|
||||||
|
//import java.util.ArrayList;
|
||||||
|
//import java.util.List;
|
||||||
|
|
||||||
|
public class Morph {
|
||||||
|
public String[] message2words (String message) {
|
||||||
|
message = message.replaceAll("[^a-zA-Zа-яА-ЯёЁ]"," ");
|
||||||
|
message = message.replaceAll("\\s{2,}"," ");
|
||||||
|
|
||||||
|
return message.split(" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String morphAnalyze1(String message) {
|
||||||
|
String[] wordArr = message2words(message);
|
||||||
|
String out="";
|
||||||
|
|
||||||
|
for (int i=0;i<wordArr.length;i++) {
|
||||||
|
out+=morph1(wordArr[i])+"\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return out;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public String morph1(String word) {
|
||||||
|
List<WordformMeaning> meanings = lookupForMeanings(word);
|
||||||
|
String out = "";
|
||||||
|
if (meanings.isEmpty()) {
|
||||||
|
out = "слова <"+word+"> не слыхал";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
out = word+": "+meanings.get(0).getMorphology().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
return out;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void Morph(String word) {
|
||||||
|
List<WordformMeaning> meanings = lookupForMeanings(word);
|
||||||
|
|
||||||
|
|
||||||
|
System.out.println(meanings.size());
|
||||||
|
//out.println(meanings.size());
|
||||||
|
/* 1 */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
System.out.println(meanings.get(0).getMorphology());
|
||||||
|
|
||||||
|
//meanings.get(0).getMorphology().
|
||||||
|
|
||||||
|
//meanings.
|
||||||
|
/* [С, мр, им, мн] */
|
||||||
|
|
||||||
|
System.out.println(meanings.get(0).getLemma());
|
||||||
|
/* человек */
|
||||||
|
|
||||||
|
|
||||||
|
for (WordformMeaning t : meanings.get(0).getTransformations()) {
|
||||||
|
System.out.println(t.toString() + " " + t.getMorphology());
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
185
src/main/java/org/pavlik/helpers/RestHelper.java
Normal file
185
src/main/java/org/pavlik/helpers/RestHelper.java
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
package org.pavlik.helpers;
|
||||||
|
|
||||||
|
import org.apache.http.HttpEntity;
|
||||||
|
import org.apache.http.HttpResponse;
|
||||||
|
import org.apache.http.client.HttpClient;
|
||||||
|
import org.apache.http.client.config.CookieSpecs;
|
||||||
|
import org.apache.http.client.config.RequestConfig;
|
||||||
|
import org.apache.http.client.methods.HttpGet;
|
||||||
|
import org.apache.http.client.methods.HttpPost;
|
||||||
|
import org.apache.http.entity.StringEntity;
|
||||||
|
import org.apache.http.impl.client.HttpClients;
|
||||||
|
import org.apache.http.ssl.PrivateKeyStrategy;
|
||||||
|
import org.apache.http.ssl.SSLContexts;
|
||||||
|
import org.apache.http.util.EntityUtils;
|
||||||
|
import javax.net.ssl.SSLContext;
|
||||||
|
import java.io.*;
|
||||||
|
import java.security.*;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RestHelper by Pavel Belyaev
|
||||||
|
*/
|
||||||
|
public class RestHelper {
|
||||||
|
|
||||||
|
public String codepage="UTF-8";
|
||||||
|
protected HttpClient httpClient = null;
|
||||||
|
|
||||||
|
public RestHelper () {
|
||||||
|
this(null,"", "", "", null, "", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public RestHelper (String keypath,String keytype,String keypass, String keyAlias, String trustpath, String trusttype, String trustpass) {
|
||||||
|
boolean withTrust = false;
|
||||||
|
KeyStore truststore_material = null;
|
||||||
|
|
||||||
|
|
||||||
|
KeyStore keystore_material = (keypath !=null) ? this.readKeyStore(keypath, keytype, keypass) : null;
|
||||||
|
PrivateKeyStrategy privateKeyStrategy = keyAlias == null ? null : (aliases, socket) -> keyAlias;
|
||||||
|
|
||||||
|
|
||||||
|
if (trustpath !=null) {
|
||||||
|
truststore_material = this.readKeyStore(trustpath, trusttype, trustpass);
|
||||||
|
withTrust = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
SSLContext sslContext = (withTrust) ?
|
||||||
|
genSSLContext(privateKeyStrategy,keystore_material,truststore_material,keypass) :
|
||||||
|
genSSLContextAllTrust(privateKeyStrategy,keystore_material,keypass);
|
||||||
|
|
||||||
|
int timeout=61;
|
||||||
|
RequestConfig reqConf = RequestConfig.custom()
|
||||||
|
.setCookieSpec(CookieSpecs.STANDARD)
|
||||||
|
.setConnectTimeout(timeout * 1000)
|
||||||
|
.setConnectionRequestTimeout(timeout * 1000)
|
||||||
|
.setSocketTimeout(timeout * 1000)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
this.httpClient = HttpClients.custom().setSSLContext(sslContext).setDefaultRequestConfig(reqConf).build();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Only keystore init
|
||||||
|
* @param keypath
|
||||||
|
* @param keytype
|
||||||
|
* @param keypass
|
||||||
|
* @param keyAlias
|
||||||
|
*/
|
||||||
|
public RestHelper (String keypath,String keytype,String keypass, String keyAlias) {
|
||||||
|
this(keypath,keytype,keypass,keyAlias, null, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Подгружает файл JKS или PKCS12
|
||||||
|
* @param path - путь до jks/p12
|
||||||
|
* @param type - JKS или PKCS12
|
||||||
|
* @param pwd - пароль к хранилищу
|
||||||
|
* @return - хранилище для SSLContext
|
||||||
|
*/
|
||||||
|
protected KeyStore readKeyStore(String path, String type, String pwd) {
|
||||||
|
try {
|
||||||
|
FileInputStream KeyStoreFile = new FileInputStream(new File(path));
|
||||||
|
KeyStore keyStore = KeyStore.getInstance(type);
|
||||||
|
keyStore.load(KeyStoreFile, pwd.toCharArray());
|
||||||
|
return keyStore;
|
||||||
|
|
||||||
|
} catch (Exception e){
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mtls - взаимная аутентификация
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
SSLContext genSSLContext (PrivateKeyStrategy privateKeyStrategy,KeyStore keyStore, KeyStore trustStore, String keypass) {
|
||||||
|
try {
|
||||||
|
return SSLContexts.custom()
|
||||||
|
.loadTrustMaterial(trustStore,null)
|
||||||
|
.loadKeyMaterial(keyStore, keypass.toCharArray(),privateKeyStrategy)
|
||||||
|
.build();
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Аутентификация только клиента, серверный сертификат не проверяется
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
SSLContext genSSLContextAllTrust (PrivateKeyStrategy privateKeyStrategy,KeyStore keyStore, String keypass) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
return SSLContexts.custom()
|
||||||
|
.loadTrustMaterial(null, (x509CertChain, authType) -> true) //вариант принимающий всё
|
||||||
|
.loadKeyMaterial(keyStore, keypass.toCharArray(),privateKeyStrategy) // use null as second param if you don't have a separate key password
|
||||||
|
.build();
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void map2headers(HttpPost query,HashMap<String, String> HeaderMap) {
|
||||||
|
for (String key : HeaderMap.keySet()) {
|
||||||
|
query.setHeader(key,HeaderMap.get(key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRespBody(HttpResponse resp){
|
||||||
|
try {
|
||||||
|
HttpEntity entity = resp.getEntity();
|
||||||
|
String body = EntityUtils.toString(entity, this.codepage);
|
||||||
|
EntityUtils.consume(entity);
|
||||||
|
return body;
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Отправляет запрос "как есть" строкой
|
||||||
|
* @param queryUrl - url
|
||||||
|
* @param queryBody - тело запроса
|
||||||
|
* @param headerMap - заголовки запроса
|
||||||
|
*/
|
||||||
|
public HttpResponse queryPostRaw(String queryUrl, String queryBody, HashMap<String, String> headerMap) {
|
||||||
|
HttpPost query = new HttpPost(queryUrl);
|
||||||
|
if (headerMap != null) this.map2headers(query, headerMap);
|
||||||
|
|
||||||
|
try {
|
||||||
|
query.setEntity(new StringEntity(queryBody,this.codepage)); //тело
|
||||||
|
return this.httpClient.execute(query);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public HttpResponse queryGet(String queryUrl) {
|
||||||
|
HttpGet httpGet = new HttpGet(queryUrl);
|
||||||
|
|
||||||
|
try {
|
||||||
|
//query.setEntity(new StringEntity(queryBody,this.codepage)); //тело
|
||||||
|
return this.httpClient.execute(httpGet);
|
||||||
|
} catch (Exception e) {
|
||||||
|
//throw new RuntimeException(e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public String queryGetBody(String queryUrl) {
|
||||||
|
System.out.println("Query:"+queryUrl);
|
||||||
|
HttpResponse res = queryGet(queryUrl);
|
||||||
|
if (res==null) return null;
|
||||||
|
|
||||||
|
return getRespBody(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
3
src/main/resources/META-INF/MANIFEST.MF
Normal file
3
src/main/resources/META-INF/MANIFEST.MF
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
Main-Class: org.example.App
|
||||||
|
|
||||||
1
src/main/resources/META-INF/todo.txt
Normal file
1
src/main/resources/META-INF/todo.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
https://github.com/AKuznetsov/russianmorphology
|
||||||
20
src/test/java/org/example/AppTest.java
Normal file
20
src/test/java/org/example/AppTest.java
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
package org.example;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unit test for simple App.
|
||||||
|
*/
|
||||||
|
public class AppTest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Rigorous Test :-)
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void shouldAnswerWithTrue()
|
||||||
|
{
|
||||||
|
assertTrue( true );
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user