newuserevnet, userblockedbotevent

This commit is contained in:
MrBesen 2021-01-19 21:19:53 +01:00 committed by mrbesen
parent 1fe7bc64d3
commit 97b72385a3
Signed by: MrBesen
GPG Key ID: 596B2350DCD67504
9 changed files with 97 additions and 60 deletions

View File

@ -1,11 +1,11 @@
package de.mrbesen.telegram; package de.mrbesen.telegram;
import org.json.JSONObject;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import org.json.JSONObject;
public class AsyncHandler implements Runnable { public class AsyncHandler implements Runnable {
private List<Task> tasks = new LinkedList<>(); private List<Task> tasks = new LinkedList<>();
@ -44,8 +44,8 @@ public class AsyncHandler implements Runnable {
ensureThreads(tasks.size()); ensureThreads(tasks.size());
} }
public void enque(String request, String parameters) { public void enque(String request, String parameters, long userid) {
enque(new Task(request, parameters)); enque(new Task(request, parameters, userid));
} }
//makes sure, that at least count Threads are running //makes sure, that at least count Threads are running
@ -84,7 +84,7 @@ public class AsyncHandler implements Runnable {
//run task //run task
try { try {
try { try {
Object obj = api.request(current.apimethod, current.parameters); Object obj = api.request(current.apimethod, current.parameters, current.userid);
Callback<?, ?> callb = current.callback; Callback<?, ?> callb = current.callback;
while(callb != null) { while(callb != null) {
obj = (Object) callb.callObj(obj); obj = (Object) callb.callObj(obj);
@ -125,15 +125,18 @@ public class AsyncHandler implements Runnable {
String parameters; String parameters;
Callback<JSONObject, ?> callback = null; Callback<JSONObject, ?> callback = null;
Callback<Throwable, ?> exceptionhandl = null; Callback<Throwable, ?> exceptionhandl = null;
final long userid;
public Task(String apimethod, String parameters) { public Task(String apimethod, String parameters, long userid) {
this.apimethod = apimethod; this.apimethod = apimethod;
this.parameters = parameters; this.parameters = parameters;
this.userid = userid;
} }
public Task(String apimethod, String parameters, Callback<JSONObject, ?> callback) { public Task(String apimethod, String parameters, long userid, Callback<JSONObject, ?> callback) {
this.apimethod = apimethod; this.apimethod = apimethod;
this.parameters = parameters; this.parameters = parameters;
this.userid = userid;
this.callback = callback; this.callback = callback;
} }

View File

@ -1,12 +1,14 @@
package de.mrbesen.telegram; package de.mrbesen.telegram;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import de.mrbesen.telegram.AsyncHandler.Callback; import de.mrbesen.telegram.AsyncHandler.Callback;
import de.mrbesen.telegram.objects.TMessage; import de.mrbesen.telegram.objects.TMessage;
import de.mrbesen.telegram.objects.TReplyMarkup; import de.mrbesen.telegram.objects.TReplyMarkup;
import de.mrbesen.telegram.objects.TUser; import de.mrbesen.telegram.objects.TUser;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class MessageBuilder { public class MessageBuilder {
@ -213,11 +215,11 @@ public class MessageBuilder {
String q = "chat_id=" + reciver_id + text + optionals + attachment; String q = "chat_id=" + reciver_id + text + optionals + attachment;
if(async) { if(async) {
AsyncSendable tmp = new AsyncSendable(cmd, q, callback, excpt); AsyncSendable tmp = new AsyncSendable(cmd, q, reciver_id, callback, excpt);
tmp.prio = asyncprio; tmp.prio = asyncprio;
return tmp; return tmp;
} }
return new SendableMessage(cmd, q); return new SendableMessage(cmd, q, reciver_id);
} }
/** /**
@ -227,21 +229,13 @@ public class MessageBuilder {
public TMessage send() { public TMessage send() {
return api.sendMessage(build()); return api.sendMessage(build());
} }
@Getter
@AllArgsConstructor
class SendableMessage { class SendableMessage {
private String q; private final String q;
private String command; private final String command;
private final long userid;
public SendableMessage(String cmd, String q) {
this.q = q;
command = cmd;
}
String getQ() {
return q;
}
String getCommand() {
return command;
}
} }
class AsyncSendable extends SendableMessage { class AsyncSendable extends SendableMessage {
@ -250,8 +244,8 @@ public class MessageBuilder {
Callback<Throwable, Void> excpt = null; Callback<Throwable, Void> excpt = null;
boolean prio = false; boolean prio = false;
public AsyncSendable(String cmd, String q, Callback<TMessage, ?> clb, Callback<Throwable, Void> excpt) { public AsyncSendable(String cmd, String q, long userid, Callback<TMessage, ?> clb, Callback<Throwable, Void> excpt) {
super(cmd, q); super(cmd, q, userid);
callback = clb; callback = clb;
this.excpt = excpt; this.excpt = excpt;
} }

View File

@ -12,8 +12,11 @@ import de.mrbesen.telegram.event.events.*;
import de.mrbesen.telegram.log.Log; import de.mrbesen.telegram.log.Log;
import de.mrbesen.telegram.log.Log4JLog; import de.mrbesen.telegram.log.Log4JLog;
import de.mrbesen.telegram.log.SimpleLog; import de.mrbesen.telegram.log.SimpleLog;
import de.mrbesen.telegram.objects.*;
import de.mrbesen.telegram.objects.JSONBased.Member; import de.mrbesen.telegram.objects.JSONBased.Member;
import de.mrbesen.telegram.objects.TFile;
import de.mrbesen.telegram.objects.TMessage;
import de.mrbesen.telegram.objects.TReplyMarkup;
import de.mrbesen.telegram.objects.TUser;
import de.mrbesen.telegram.objects.TUser.Status; import de.mrbesen.telegram.objects.TUser.Status;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@ -136,15 +139,15 @@ public class TelegramAPI implements Runnable {
async.enque(task); async.enque(task);
} }
public void requestAsync(String request, String parameter) { public void requestAsync(String request, String parameter, long userid) {
this.async.enque(request, parameter); this.async.enque(request, parameter, userid);
} }
public JSONObject request(String request, String parameter) throws IOException { public JSONObject request(String request, String parameter, long userid) throws IOException {
return request(request, parameter, true); return request(request, parameter, userid,true);
} }
public JSONObject request(String request, String parameter, boolean logging) throws IOException { public JSONObject request(String request, String parameter, long userid, boolean logging) throws IOException {
//do https stuff //do https stuff
boolean toomany = true; //für retry after 429 error boolean toomany = true; //für retry after 429 error
int trycount = 0; int trycount = 0;
@ -198,6 +201,11 @@ public class TelegramAPI implements Runnable {
} catch(InterruptedException e) {} } catch(InterruptedException e) {}
if(trycount < 10) continue; if(trycount < 10) continue;
} else if(response == 403) {
if(errdesc.equals("Forbidden: bot was blocked by the user")) {
if(userid != 0)
evntmgr.callEvent(new UserBlockedBotEvent(getUser(userid)));
}
} }
throw new APIError(parameter, request, con.getResponseCode(), null, errdesc); throw new APIError(parameter, request, con.getResponseCode(), null, errdesc);
@ -235,11 +243,11 @@ public class TelegramAPI implements Runnable {
AsyncSendable asyncm = (AsyncSendable) msg; AsyncSendable asyncm = (AsyncSendable) msg;
Callback<JSONObject, TMessage> adapter = getCallbackAdapter(this); Callback<JSONObject, TMessage> adapter = getCallbackAdapter(this);
adapter.next = asyncm.callback; adapter.next = asyncm.callback;
Task t = new Task(msg.getCommand(), msg.getQ(), adapter); Task t = new Task(msg.getCommand(), msg.getQ(), msg.getUserid(), adapter);
t.setExceptionhandl(asyncm.excpt == null ? IOE400supressor : asyncm.excpt); t.setExceptionhandl(asyncm.excpt == null ? IOE400supressor : asyncm.excpt);
async.enque(t); async.enque(t);
} else { } else {
JSONObject o = request(msg.getCommand(), msg.getQ(), true); JSONObject o = request(msg.getCommand(), msg.getQ(), msg.getUserid(), true);
return new TMessage(o.getJSONObject("result"), this); return new TMessage(o.getJSONObject("result"), this);
} }
} catch(IOException e) { } catch(IOException e) {
@ -285,7 +293,7 @@ public class TelegramAPI implements Runnable {
}); });
//commit //commit
Task t = new Task("setMyCommands", "commands=" + arr.toString(), null); Task t = new Task("setMyCommands", "commands=" + arr.toString(), 0, null);
async.enque(t); async.enque(t);
} }
@ -295,7 +303,7 @@ public class TelegramAPI implements Runnable {
} }
public TFile getFile(final String fileid) throws IOException { public TFile getFile(final String fileid) throws IOException {
JSONObject jfile = request("getFile", "file_id=" + fileid); JSONObject jfile = request("getFile", "file_id=" + fileid, 0);
return new TFile(jfile.getJSONObject("result")); return new TFile(jfile.getJSONObject("result"));
} }
@ -319,10 +327,10 @@ public class TelegramAPI implements Runnable {
return; return;
if(async) { if(async) {
requestAsync("answerCallbackQuery", "callback_query_id=" + callbackid + "&text=" + text); requestAsync("answerCallbackQuery", "callback_query_id=" + callbackid + "&text=" + text, 0);
} else { } else {
try { try {
request("answerCallbackQuery", "callback_query_id=" + callbackid + "&text=" + text); request("answerCallbackQuery", "callback_query_id=" + callbackid + "&text=" + text, 0);
} catch(IOException e) { } catch(IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -345,7 +353,7 @@ public class TelegramAPI implements Runnable {
rply = "&reply_markup=" + URLEncoder.encode(rm.toJSONString(), "UTF-8"); rply = "&reply_markup=" + URLEncoder.encode(rm.toJSONString(), "UTF-8");
String q = "chat_id=" + chatid + "&message_id=" + msg_id + "&caption=" + URLEncoder.encode(newCaption, "UTF-8") + rply; String q = "chat_id=" + chatid + "&message_id=" + msg_id + "&caption=" + URLEncoder.encode(newCaption, "UTF-8") + rply;
if(async) { if(async) {
Task t = new Task("editMessageCaption", q); Task t = new Task("editMessageCaption", q, chatid);
t.setExceptionhandl(new Callback<Throwable, Void>() { t.setExceptionhandl(new Callback<Throwable, Void>() {
@Override @Override
public Void call(Throwable j) throws Throwable { public Void call(Throwable j) throws Throwable {
@ -361,7 +369,7 @@ public class TelegramAPI implements Runnable {
}); });
this.async.enque(t); this.async.enque(t);
} else { } else {
request("editMessageCaption", q); request("editMessageCaption", q, chatid);
} }
} catch(IOException e) { } catch(IOException e) {
log.log("", e); log.log("", e);
@ -375,9 +383,9 @@ public class TelegramAPI implements Runnable {
String q = "chat_id=" + chatid + "&message_id=" + msg_id + "&reply_markup=" + URLEncoder.encode(rm.toJSONString(), "UTF-8"); String q = "chat_id=" + chatid + "&message_id=" + msg_id + "&reply_markup=" + URLEncoder.encode(rm.toJSONString(), "UTF-8");
if(async) { if(async) {
this.async.enque("editMessageReplyMarkup", q); this.async.enque("editMessageReplyMarkup", q, chatid);
} else { } else {
request("editMessageReplyMarkup", q); request("editMessageReplyMarkup", q, chatid);
} }
} catch(IOException e) { } catch(IOException e) {
log.log("", e); log.log("", e);
@ -422,7 +430,7 @@ public class TelegramAPI implements Runnable {
private void fetchUpdates() { private void fetchUpdates() {
try { try {
processUpdates(request("getUpdates", "offset=" + msg_offset + "&timeout=" + (longpolling ? updateInterval : 1), false)); processUpdates(request("getUpdates", "offset=" + msg_offset + "&timeout=" + (longpolling ? updateInterval : 1), 0,false));
} catch (IOException e) { } catch (IOException e) {
log.log("error getting updates.", e); log.log("error getting updates.", e);
@ -456,6 +464,7 @@ public class TelegramAPI implements Runnable {
if(u != null || !createIfNotExitsts) if(u != null || !createIfNotExitsts)
return u; return u;
u = new TUser(id, this); u = new TUser(id, this);
evntmgr.callEvent(new NewUserEvent(u));
users.put(id, u); users.put(id, u);
return u; return u;
} }

View File

@ -1,16 +1,15 @@
package de.mrbesen.telegram; package de.mrbesen.telegram;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import org.json.JSONObject;
import java.io.IOException; import java.io.IOException;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.Random; import java.util.Random;
import org.json.JSONObject;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
//for https server: https://stackoverflow.com/questions/2308479/simple-java-https-server //for https server: https://stackoverflow.com/questions/2308479/simple-java-https-server
//for jks store: https://stackoverflow.com/questions/2138940/import-pem-into-java-key-store //for jks store: https://stackoverflow.com/questions/2138940/import-pem-into-java-key-store
public class WebhookTelegramAPI extends TelegramAPI implements HttpHandler { public class WebhookTelegramAPI extends TelegramAPI implements HttpHandler {
@ -47,7 +46,7 @@ public class WebhookTelegramAPI extends TelegramAPI implements HttpHandler {
if(externaladdr.endsWith("/")) if(externaladdr.endsWith("/"))
externaladdr = externaladdr.substring(0, externaladdr.length()-1); externaladdr = externaladdr.substring(0, externaladdr.length()-1);
request("setWebhook", "url=" + externaladdr + "/" + pw + "&allowed_updates=" + allowedupd); request("setWebhook", "url=" + externaladdr + "/" + pw + "&allowed_updates=" + allowedupd, 0);
} }
public WebhookTelegramAPI(String apikey, String externaladdr) throws IOException { public WebhookTelegramAPI(String apikey, String externaladdr) throws IOException {

View File

@ -0,0 +1,12 @@
package de.mrbesen.telegram.event.events;
import de.mrbesen.telegram.objects.TUser;
/**
* its not given that the user has never seen this bot, its just the first time since the last restart
*/
public class NewUserEvent extends UserEvent {
public NewUserEvent(TUser user) {
super(user);
}
}

View File

@ -0,0 +1,9 @@
package de.mrbesen.telegram.event.events;
import de.mrbesen.telegram.objects.TUser;
public class UserBlockedBotEvent extends UserEvent {
public UserBlockedBotEvent(TUser user) {
super(user);
}
}

View File

@ -0,0 +1,12 @@
package de.mrbesen.telegram.event.events;
import de.mrbesen.telegram.event.Event;
import de.mrbesen.telegram.objects.TUser;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class UserEvent implements Event {
@Getter
private final TUser user;
}

View File

@ -46,7 +46,7 @@ public class TMessage extends JSONBased {
public static TMessage forward(TelegramAPI api, long userid, TMessage tmsg) { public static TMessage forward(TelegramAPI api, long userid, TMessage tmsg) {
try { try {
String fro = String.valueOf(tmsg.forward_from == null ? tmsg.from.getID() : tmsg.forward_from.getID()); String fro = String.valueOf(tmsg.forward_from == null ? tmsg.from.getID() : tmsg.forward_from.getID());
return new TMessage(api.request("forwardMessage", "chat_id=" + userid + "&from_chat_id=" + fro + "&message_id=" + tmsg.message_id).getJSONObject("result"), api); return new TMessage(api.request("forwardMessage", "chat_id=" + userid + "&from_chat_id=" + fro + "&message_id=" + tmsg.message_id, userid).getJSONObject("result"), api);
} catch (IOException | NullPointerException e) { } catch (IOException | NullPointerException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -55,7 +55,7 @@ public class TMessage extends JSONBased {
public static void forwardAsync(TelegramAPI api, long userid, TMessage tmsg) { public static void forwardAsync(TelegramAPI api, long userid, TMessage tmsg) {
String fro = String.valueOf(tmsg.forward_from == null ? tmsg.from.getID() : tmsg.forward_from.getID()); String fro = String.valueOf(tmsg.forward_from == null ? tmsg.from.getID() : tmsg.forward_from.getID());
api.request(new Task("forwardMessage", "chat_id=" + userid + "&from_chat_id=" + fro + "&message_id=" + tmsg.message_id)); api.request(new Task("forwardMessage", "chat_id=" + userid + "&from_chat_id=" + fro + "&message_id=" + tmsg.message_id, userid));
} }
public TMessage(JSONObject json, TelegramAPI api) { public TMessage(JSONObject json, TelegramAPI api) {
@ -150,10 +150,10 @@ public class TMessage extends JSONBased {
public static void delete(TelegramAPI api, long chatid, int msgid, boolean async) { public static void delete(TelegramAPI api, long chatid, int msgid, boolean async) {
String q = "chat_id=" + chatid + "&message_id=" + msgid; String q = "chat_id=" + chatid + "&message_id=" + msgid;
if(async) { if(async) {
api.requestAsync("deleteMessage", q); api.requestAsync("deleteMessage", q, chatid);
} else { } else {
try { try {
api.request("deleteMessage", q); api.request("deleteMessage", q, chatid);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -1,12 +1,11 @@
package de.mrbesen.telegram.objects; package de.mrbesen.telegram.objects;
import lombok.Getter;
import org.json.JSONObject;
import de.mrbesen.telegram.AsyncHandler.Callback; import de.mrbesen.telegram.AsyncHandler.Callback;
import de.mrbesen.telegram.MessageBuilder; import de.mrbesen.telegram.MessageBuilder;
import de.mrbesen.telegram.MessageBuilder.Attachment; import de.mrbesen.telegram.MessageBuilder.Attachment;
import de.mrbesen.telegram.TelegramAPI; import de.mrbesen.telegram.TelegramAPI;
import lombok.Getter;
import org.json.JSONObject;
public class TUser { public class TUser {
@ -93,7 +92,7 @@ public class TUser {
public void sendStatus(Status status) { public void sendStatus(Status status) {
try { try {
api.request("sendChatAction", "chat_id="+ ID +"&action=" + status.getAPIName()); api.request("sendChatAction", "chat_id="+ ID +"&action=" + status.getAPIName(), ID);
} catch (Exception e) { } catch (Exception e) {
System.err.println("Failed to send status."); System.err.println("Failed to send status.");
} }