This commit is contained in:
Oliver 2018-07-18 22:31:05 +02:00
parent df564169ee
commit 4bdca44b67
16 changed files with 447 additions and 52 deletions

View File

@ -0,0 +1,109 @@
package de.mrbesen.telegram;
import de.mrbesen.telegram.objects.TReplyMarkup;
public class MessageBuilder {
private String text;
private Formatting format = Formatting.None;
private boolean silent = false;
private boolean no_web_view = false;
private int reciver_id = 0;
private int reply_to_message_id = 0;
private TReplyMarkup markup = null;
public MessageBuilder setReciver(int id) {
reciver_id = id;
return this;
}
public MessageBuilder setText(String txt) {
txt = txt.trim();
if(txt.isEmpty()) {
throw new IllegalArgumentException("text is not allowed to be empty");
}
text = txt;
return this;
}
public MessageBuilder setFormatting(Formatting form) {
format = form;
return this;
}
public MessageBuilder setSilent(boolean b) {
silent = b;
return this;
}
public MessageBuilder setNoWebView(boolean b) {
no_web_view = b;
return this;
}
public MessageBuilder setMarkup(TReplyMarkup markup) {
this.markup = markup;
return this;
}
public SendableMessage build() {
if(reciver_id == 0) {
throw new MissingException("Reciver");
}
if(text != null) {
if(text.trim().isEmpty()) {
throw new MissingException("Text");
}
} else {
throw new MissingException("Text");
}
String optionals = "";
if(format != Formatting.None) {
optionals += "&parse_mode=" + format.getname().toLowerCase();
}
if(reply_to_message_id != 0) {
optionals += "&reply_to_message_id=" + reply_to_message_id;
}
if(markup != null) {
optionals += "&reply_markup=" + markup.toJSONString();
}
return new SendableMessage("chat_id=" + reciver_id + "&text=" + text.trim() + optionals + "&disable_web_page_preview=" + no_web_view + "&disable_notification=" + silent);
}
class SendableMessage {
private String q;
public SendableMessage(String q) {
this.q = q;
}
String getQ() {
return q;
}
}
public enum Formatting {
None(""),
HTML("HTML"),
MD("Markdown");
private String apiname;
private Formatting(String s) {
apiname = s;
}
public String getname() {
return apiname;
}
}
public class MissingException extends RuntimeException {
private static final long serialVersionUID = 2750912631502103642L;
public MissingException(String missing_obj) {
super("The Object " + missing_obj + " is missing or invalid.");
}
}
}

View File

@ -11,15 +11,16 @@ import javax.net.ssl.HttpsURLConnection;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONObject; import org.json.JSONObject;
import de.mrbesen.telegram.MessageBuilder.SendableMessage;
import de.mrbesen.telegram.commands.CommandManager; import de.mrbesen.telegram.commands.CommandManager;
import de.mrbesen.telegram.event.Event; import de.mrbesen.telegram.event.Event;
import de.mrbesen.telegram.event.EventManager; import de.mrbesen.telegram.event.EventManager;
import de.mrbesen.telegram.event.events.UserSendAudioEvent; import de.mrbesen.telegram.event.events.UserSendAudioEvent;
import de.mrbesen.telegram.event.events.UserSendMessageEvent; import de.mrbesen.telegram.event.events.UserSendMessageEvent;
import de.mrbesen.telegram.objects.JSONBased.Member;
import de.mrbesen.telegram.objects.TAudio; import de.mrbesen.telegram.objects.TAudio;
import de.mrbesen.telegram.objects.TMessage; import de.mrbesen.telegram.objects.TMessage;
import de.mrbesen.telegram.objects.TUser; import de.mrbesen.telegram.objects.TUser;
import de.mrbesen.telegram.objects.JSONBased.Member;
public class TelegramAPI implements Runnable { public class TelegramAPI implements Runnable {
@ -64,7 +65,7 @@ public class TelegramAPI implements Runnable {
OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream()); OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream());
wr.write(parameter); wr.write(parameter);
wr.flush(); wr.flush();
System.out.println( this.getClass().getSimpleName() + ": request: " + request + " -> " + con.getResponseCode() + ", " + con.getResponseMessage()); System.out.println( this.getClass().getSimpleName() + ": request: " + request + " content " + parameter + " -> " + con.getResponseCode() + ", " + con.getResponseMessage());
if(con.getResponseCode() == 200) { if(con.getResponseCode() == 200) {
Scanner s = new Scanner(con.getInputStream()); Scanner s = new Scanner(con.getInputStream());
StringBuilder sb_apianswer = new StringBuilder(); StringBuilder sb_apianswer = new StringBuilder();
@ -79,6 +80,16 @@ public class TelegramAPI implements Runnable {
} }
} }
public TMessage sendMessage(SendableMessage msg) {
try {
JSONObject o = request("sendMessage", msg.getQ());
return new TMessage(o.getJSONObject("result"), this);
} catch(IOException e) {
e.printStackTrace();
}
return null;
}
public void stop() { public void stop() {
run = false; run = false;
thread.interrupt(); thread.interrupt();

View File

@ -4,8 +4,10 @@ import org.json.JSONObject;
public class JSONBased { public class JSONBased {
private JSONObject base_json = null; protected JSONObject base_json = null;
protected Member[] allowedmembers = {}; protected Member[] allowedmembers = {};
public JSONBased() {}
public JSONBased(JSONObject json) { public JSONBased(JSONObject json) {
base_json = json; base_json = json;
@ -33,6 +35,10 @@ public class JSONBased {
} }
return false; return false;
} }
public Member[] getAllowed() {
return allowedmembers;
}
public enum Member { public enum Member {
@ -93,7 +99,7 @@ public class JSONBased {
//===== END FILE ===== //===== END FILE =====
} }
private class UnallowedMemberException extends RuntimeException { protected class UnallowedMemberException extends RuntimeException {
private static final long serialVersionUID = -253424139568749269L; private static final long serialVersionUID = -253424139568749269L;
public UnallowedMemberException(Member mem, JSONBased b) { public UnallowedMemberException(Member mem, JSONBased b) {

View File

@ -2,18 +2,14 @@ package de.mrbesen.telegram.objects;
import org.json.JSONObject; import org.json.JSONObject;
public class TDocument extends JSONBased { public class TDocument extends TSendable {
private String file_id;
public TDocument(JSONObject o) { public TDocument(JSONObject o) {
super(o); super(o);
file_id = o.getString("file_id");
allowedmembers = new Member[] {Member.thumb, Member.file_name, Member.mime_type, Member.file_size}; allowedmembers = new Member[] {Member.thumb, Member.file_name, Member.mime_type, Member.file_size};
} }
public String getFile_id() { public String getFile_id() {
return file_id; return file_id;
} }
} }

View File

@ -9,6 +9,10 @@ public class TInlineKeyboardMarkup implements TReplyMarkup {
ArrayList<JSONArray> arr_btn = new ArrayList<>(); ArrayList<JSONArray> arr_btn = new ArrayList<>();
public TInlineKeyboardMarkup() {
this(1);
}
public TInlineKeyboardMarkup(int rows) { public TInlineKeyboardMarkup(int rows) {
if(rows < 1) if(rows < 1)
throw new IllegalArgumentException("You need at least one row."); throw new IllegalArgumentException("You need at least one row.");
@ -16,21 +20,32 @@ public class TInlineKeyboardMarkup implements TReplyMarkup {
for( int row = 0; row < rows; row++ ) { for( int row = 0; row < rows; row++ ) {
arr_btn.add(new JSONArray()); arr_btn.add(new JSONArray());
} }
System.out.println("break here");
} }
/**
public TInlineKeyboardMarkup addButton(String title, String url, int row) { * Insert button in first line
* @param title
* @param url
* @return
*/
public TInlineKeyboardMarkup addUrlButton(String title, String url) {
addUrlButton(title, url, 1);
return this;
}
/**
* Insert button in nth line
* @param title
* @param url
* @param row
* @return
*/
public TInlineKeyboardMarkup addUrlButton(String title, String url, int row) {
arr_btn.get(row-1).put(new JSONObject().put("text", title).put("url", url)); arr_btn.get(row-1).put(new JSONObject().put("text", title).put("url", url));
return this; return this;
} }
@Override @Override
public String toJSONString() { public String toJSONString() {
JSONArray ja = new JSONArray(arr_btn); return new JSONObject().put("inline_keyboard", new JSONArray(arr_btn)).toString();
JSONObject jo = new JSONObject();
jo.put("inline_keyboard", ja);
return jo.toString();
} }
} }

View File

@ -1,5 +1,7 @@
package de.mrbesen.telegram.objects; package de.mrbesen.telegram.objects;
import java.io.IOException;
import org.json.JSONObject; import org.json.JSONObject;
import de.mrbesen.telegram.TelegramAPI; import de.mrbesen.telegram.TelegramAPI;
@ -16,6 +18,31 @@ public class TMessage extends JSONBased {
public void sendTo(TUser u) { public void sendTo(TUser u) {
//if this message already exists forward, if not send directly. //if this message already exists forward, if not send directly.
throw new RuntimeException("not implemented");
}
public boolean reply(String msg) {
if(from == null) {
throw new RuntimeException("no from defined!");
} else {
return from.sendMessage(msg, null, message_id);
}
// try {
// return api.request("sendMessage", "chat_id=" + from.getID() + "&text=" + msg + "&reply_to_message_id=" + message_id ).getBoolean("ok") ;
// } catch (IOException | NullPointerException e) {
// e.printStackTrace();
// return false;
// }
}
public TMessage forward(TUser us) {
try {
String fro = String.valueOf(forward_from == null ? from.getID() : forward_from.getID());
return new TMessage(api.request("forwardMessage", "chat_id=" + us.getID() + "&from_chat_id=" + fro + "&message_id=" + message_id).getJSONObject("result"), api);
} catch (IOException | NullPointerException e) {
e.printStackTrace();
}
return null;
} }
public TMessage(JSONObject json, TelegramAPI api) { public TMessage(JSONObject json, TelegramAPI api) {

View File

@ -2,8 +2,6 @@ package de.mrbesen.telegram.objects;
import org.json.JSONObject; import org.json.JSONObject;
import de.mrbesen.telegram.objects.JSONBased.Member;
public class TPhotoSize extends TDocument { public class TPhotoSize extends TDocument {
private int width, height; private int width, height;

View File

@ -0,0 +1,95 @@
package de.mrbesen.telegram.objects;
import java.util.ArrayList;
import org.json.JSONArray;
import org.json.JSONObject;
public class TReplyKeyboardMarkup implements TReplyMarkup {
boolean isOneTimeKeyboard = false;
boolean isResizeKeyboard = false;
boolean isSelective = true;
ArrayList<JSONArray> arr_btn = new ArrayList<>();
/**
* One line ReplyKeyboard
*/
public TReplyKeyboardMarkup() {
this(1);
}
/**
* multi-line ReplyKeyboard
* @param rows
*/
public TReplyKeyboardMarkup(int rows) {
if(rows < 1)
throw new IllegalArgumentException("You need at least one row.");
arr_btn = new ArrayList<JSONArray>();
for( int row = 0; row < rows; row++ ) {
arr_btn.add(new JSONArray());
}
}
@Override
public String toJSONString() {
return new JSONObject().put("keyboard", new JSONArray(arr_btn))
.put("one_time_keyboard", isOneTimeKeyboard)
.put("resize_keyboard", isResizeKeyboard)
.put("selective", isSelective)
.toString();
}
/**
* Insert button in first line
* @param title
* @param url
* @return
*/
public TReplyKeyboardMarkup addButton(String title) {
addButton(title, 1);
return this;
}
/**
* Insert button in nth line
* @param title
* @param url
* @param row
* @return
*/
public TReplyKeyboardMarkup addButton(String title, int row) {
arr_btn.get(row-1).put(title);
return this;
}
public boolean isOneTimeKeyboard() {
return isOneTimeKeyboard;
}
public TReplyKeyboardMarkup setOneTimeKeyboard(boolean isOneTimeKeyboard) {
this.isOneTimeKeyboard = isOneTimeKeyboard;
return this;
}
public boolean isResizeKeyboard() {
return isResizeKeyboard;
}
public TReplyKeyboardMarkup setResizeKeyboard(boolean isResizeKeyboard) {
this.isResizeKeyboard = isResizeKeyboard;
return this;
}
public boolean isSelective() {
return isSelective;
}
public TReplyKeyboardMarkup setSelective(boolean isSelective) {
this.isSelective = isSelective;
return this;
}
}

View File

@ -0,0 +1,24 @@
package de.mrbesen.telegram.objects;
import org.json.JSONObject;
public class TReplyKeyboardRemove implements TReplyMarkup {
boolean isSelective = true;
public boolean isSelective() {
return isSelective;
}
public TReplyKeyboardRemove setSelective(boolean isSelective) {
this.isSelective = isSelective;
return this;
}
@Override
public String toJSONString() {
return new JSONObject().put("remove_keyboard", true).put("selective", isSelective).toString();
}
}

View File

@ -0,0 +1,31 @@
package de.mrbesen.telegram.objects;
import org.json.JSONObject;
public class TSendable extends JSONBased {
protected String file_id;
public void set(Member mem, Object value ) {
if(isAllowd(mem)) {
if(value instanceof Integer)
base_json.put(mem.name(), (int) value);
else if(value instanceof Boolean)
base_json.put(mem.name(), (boolean) value);
else
base_json.put(mem.name(), value);
} else {
throw new UnallowedMemberException(mem, this);
}
}
public TSendable(JSONObject o) {
super(o);
file_id = o.getString("file_id");
}
public boolean upload() {
return false;
}
}

View File

@ -67,23 +67,29 @@ public class TUser {
sendMessage(api.getHelpMessage()); sendMessage(api.getHelpMessage());
} }
public void sendMessage(String text) { public boolean sendMessage(String text) {
sendMessage(text, null); return sendMessage(text, null);
} }
public void sendMessage(String text, TReplyMarkup rm) { public boolean sendMessage(String text, TReplyMarkup rm) {
return sendMessage(text, rm, -1);
}
public boolean sendMessage(String text, TReplyMarkup rm, int reply_to_msg) {
if(api == null) { if(api == null) {
System.err.println("api == null!"); System.err.println("api == null!");
return; return false;
} }
String replyto = (reply_to_msg > 0 ? "&reply_to_message_id=" +reply_to_msg : "");
try { try {
String reply= (rm == null ? "" : "&reply_markup=" + URLEncoder.encode(rm.toJSONString(), "UTF-8")); String replymarkup = (rm == null ? "" : "&reply_markup=" + URLEncoder.encode(rm.toJSONString(), "UTF-8"));
api.request("sendMessage", "chat_id=" + id return api.request("sendMessage", "chat_id=" + id
+ "&text=" + URLEncoder.encode(text, "UTF-8") + "&text=" + URLEncoder.encode(text, "UTF-8")
+ reply ); + replymarkup + replyto).getBoolean("ok");
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
return false;
} }
public void sendStatus(Status status) { public void sendStatus(Status status) {

View File

@ -1,36 +1,47 @@
package de.mrbesen.test; package de.mrbesen.test;
import java.util.Random;
import java.util.Scanner; import java.util.Scanner;
import de.mrbesen.telegram.MessageBuilder;
import de.mrbesen.telegram.TelegramAPI; import de.mrbesen.telegram.TelegramAPI;
import de.mrbesen.telegram.commands.CommandHandler;
import de.mrbesen.telegram.event.EventHandler; import de.mrbesen.telegram.event.EventHandler;
import de.mrbesen.telegram.event.EventListener; import de.mrbesen.telegram.event.EventListener;
import de.mrbesen.telegram.event.events.UserSendMessageEvent; import de.mrbesen.telegram.event.events.UserSendMessageEvent;
import de.mrbesen.telegram.objects.TInlineKeyboardMarkup; import de.mrbesen.telegram.objects.TMessage;
import de.mrbesen.telegram.objects.TUser;
import de.mrbesen.telegram.objects.TUser.Status; import de.mrbesen.telegram.objects.TUser.Status;
import de.mrbesen.test.commands.InlineKeyboardTC;
import de.mrbesen.test.commands.ReplyKeyboardRemoveTC;
import de.mrbesen.test.commands.ReplyKeyboardTestCase;
import de.mrbesen.test.commands.SimpleTestCase;
public class Main implements CommandHandler, Runnable, EventListener { public class Main implements Runnable, EventListener {
TelegramAPI api; TelegramAPI api;
private int action = 0;
private TMessage oldmsg = null;
public static void main(String[] args) { public static void main(String[] args) {
new Main().run(); new Main().run();
} }
public Main() { public Main() {
api = new TelegramAPI("577609137:AAGrlfMHAOQPzN6w9ceNSgFZZCbaiK4gAnw"); api = new TelegramAPI("577609137:AAGrlfMHAOQPzN6w9ceNSgFZZCbaiK4gAnw");
api.getCommandManager().registerCommand("test", this); api.getCommandManager().registerCommand("test", new SimpleTestCase());
api.getCommandManager().registerCommand("inlinekb", new InlineKeyboardTC());
api.getCommandManager().registerCommand("replykb", new ReplyKeyboardTestCase());
api.getCommandManager().registerCommand("replykbrm", new ReplyKeyboardRemoveTC());
api.getEventManager().registerEvent(this); api.getEventManager().registerEvent(this);
} }
@EventHandler @EventHandler
public void eventbla(UserSendMessageEvent e) { public void eventbla(UserSendMessageEvent e) {
e.getUser().sendMessage(e.getMessage().getText().replace(' ', '-')); api.sendMessage(new MessageBuilder().setText("this is a reply").setReciver(e.getUser().getID()).setSilent(true).setNoWebView(true).build());
int i = new Random().nextInt(Status.values().length); if(oldmsg != null) {
e.getUser().sendStatus(Status.values()[i]); oldmsg.forward(e.getUser());
}
e.getUser().sendStatus(Status.values()[action++]);
action%=Status.values().length;
oldmsg = e.getMessage();
} }
@Override @Override
@ -43,19 +54,4 @@ public class Main implements CommandHandler, Runnable, EventListener {
System.out.println("Terminated."); System.out.println("Terminated.");
} }
@Override
public boolean onCommand(TUser sender, String cmd, String[] args) {
if(cmd.equals("test")) {
// sender.sendMessage("Ja moin!");
sender.sendMessage("Links zu antippen:",
new TInlineKeyboardMarkup(2)
.addButton("gg","https://green-gaming.de", 1)
.addButton("ok", "https://oliver-kaestner.de", 1)
.addButton("mrB", "https://mrbesen.de", 2));
return true;
}
return false;
}
} }

View File

@ -0,0 +1,22 @@
package de.mrbesen.test.commands;
import de.mrbesen.telegram.commands.CommandHandler;
import de.mrbesen.telegram.objects.TInlineKeyboardMarkup;
import de.mrbesen.telegram.objects.TUser;
public class InlineKeyboardTC implements CommandHandler {
@Override
public boolean onCommand(TUser sender, String cmd, String[] args) {
if(cmd.equals("inlinekb")) {
sender.sendMessage("Links zu antippen:",
new TInlineKeyboardMarkup(2)
.addUrlButton("gg","https://green-gaming.de", 1)
.addUrlButton("ok", "https://oliver-kaestner.de", 1)
.addUrlButton("mrB", "https://mrbesen.de", 2));
return true;
}
return false;
}
}

View File

@ -0,0 +1,19 @@
package de.mrbesen.test.commands;
import de.mrbesen.telegram.commands.CommandHandler;
import de.mrbesen.telegram.objects.TReplyKeyboardRemove;
import de.mrbesen.telegram.objects.TUser;
public class ReplyKeyboardRemoveTC implements CommandHandler {
@Override
public boolean onCommand(TUser sender, String cmd, String[] args) {
if(cmd.equals("replykbrm")) {
sender.sendMessage("Entferne TReplyKeyboard",
new TReplyKeyboardRemove());
return true;
}
return false;
}
}

View File

@ -0,0 +1,24 @@
package de.mrbesen.test.commands;
import de.mrbesen.telegram.commands.CommandHandler;
import de.mrbesen.telegram.objects.TReplyKeyboardMarkup;
import de.mrbesen.telegram.objects.TUser;
public class ReplyKeyboardTestCase implements CommandHandler {
@Override
public boolean onCommand(TUser sender, String cmd, String[] args) {
if(cmd.equals("replykb")) {
sender.sendMessage("Buttons zum Antippen:",
new TReplyKeyboardMarkup(2)
.addButton("gg", 1)
.addButton("ok", 1)
.addButton("mrB", 2)
.setOneTimeKeyboard(true)
.setResizeKeyboard(true));
return true;
}
return false;
}
}

View File

@ -0,0 +1,16 @@
package de.mrbesen.test.commands;
import de.mrbesen.telegram.commands.CommandHandler;
import de.mrbesen.telegram.objects.TUser;
public class SimpleTestCase implements CommandHandler {
@Override
public boolean onCommand(TUser sender, String cmd, String[] args) {
if(cmd.equals("test")) {
sender.sendMessage("HI");
return true;
}
return false;
}
}