diff --git a/src/de/mrbesen/telegram/MessageBuilder.java b/src/de/mrbesen/telegram/MessageBuilder.java new file mode 100644 index 0000000..18aba70 --- /dev/null +++ b/src/de/mrbesen/telegram/MessageBuilder.java @@ -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."); + } + } +} diff --git a/src/de/mrbesen/telegram/TelegramAPI.java b/src/de/mrbesen/telegram/TelegramAPI.java index 9f6f86d..5b1923f 100644 --- a/src/de/mrbesen/telegram/TelegramAPI.java +++ b/src/de/mrbesen/telegram/TelegramAPI.java @@ -11,15 +11,16 @@ import javax.net.ssl.HttpsURLConnection; import org.json.JSONArray; import org.json.JSONObject; +import de.mrbesen.telegram.MessageBuilder.SendableMessage; import de.mrbesen.telegram.commands.CommandManager; import de.mrbesen.telegram.event.Event; import de.mrbesen.telegram.event.EventManager; import de.mrbesen.telegram.event.events.UserSendAudioEvent; 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.TMessage; import de.mrbesen.telegram.objects.TUser; -import de.mrbesen.telegram.objects.JSONBased.Member; public class TelegramAPI implements Runnable { @@ -64,7 +65,7 @@ public class TelegramAPI implements Runnable { OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream()); wr.write(parameter); 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) { Scanner s = new Scanner(con.getInputStream()); 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() { run = false; thread.interrupt(); diff --git a/src/de/mrbesen/telegram/objects/JSONBased.java b/src/de/mrbesen/telegram/objects/JSONBased.java index 7915b16..d6ce046 100644 --- a/src/de/mrbesen/telegram/objects/JSONBased.java +++ b/src/de/mrbesen/telegram/objects/JSONBased.java @@ -4,8 +4,10 @@ import org.json.JSONObject; public class JSONBased { - private JSONObject base_json = null; + protected JSONObject base_json = null; protected Member[] allowedmembers = {}; + + public JSONBased() {} public JSONBased(JSONObject json) { base_json = json; @@ -33,6 +35,10 @@ public class JSONBased { } return false; } + + public Member[] getAllowed() { + return allowedmembers; + } public enum Member { @@ -93,7 +99,7 @@ public class JSONBased { //===== END FILE ===== } - private class UnallowedMemberException extends RuntimeException { + protected class UnallowedMemberException extends RuntimeException { private static final long serialVersionUID = -253424139568749269L; public UnallowedMemberException(Member mem, JSONBased b) { diff --git a/src/de/mrbesen/telegram/objects/TDocument.java b/src/de/mrbesen/telegram/objects/TDocument.java index 78213dc..7512dd3 100644 --- a/src/de/mrbesen/telegram/objects/TDocument.java +++ b/src/de/mrbesen/telegram/objects/TDocument.java @@ -2,18 +2,14 @@ package de.mrbesen.telegram.objects; import org.json.JSONObject; -public class TDocument extends JSONBased { +public class TDocument extends TSendable { - private String file_id; - public TDocument(JSONObject o) { super(o); - file_id = o.getString("file_id"); allowedmembers = new Member[] {Member.thumb, Member.file_name, Member.mime_type, Member.file_size}; } public String getFile_id() { return file_id; } - } diff --git a/src/de/mrbesen/telegram/objects/TInlineKeyboardMarkup.java b/src/de/mrbesen/telegram/objects/TInlineKeyboardMarkup.java index f8ebf09..3d1117b 100644 --- a/src/de/mrbesen/telegram/objects/TInlineKeyboardMarkup.java +++ b/src/de/mrbesen/telegram/objects/TInlineKeyboardMarkup.java @@ -9,6 +9,10 @@ public class TInlineKeyboardMarkup implements TReplyMarkup { ArrayList arr_btn = new ArrayList<>(); + public TInlineKeyboardMarkup() { + this(1); + } + public TInlineKeyboardMarkup(int rows) { if(rows < 1) 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++ ) { 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)); return this; } @Override public String toJSONString() { - JSONArray ja = new JSONArray(arr_btn); - JSONObject jo = new JSONObject(); - jo.put("inline_keyboard", ja); - return jo.toString(); + return new JSONObject().put("inline_keyboard", new JSONArray(arr_btn)).toString(); } - } diff --git a/src/de/mrbesen/telegram/objects/TMessage.java b/src/de/mrbesen/telegram/objects/TMessage.java index 98dda03..2d3b033 100644 --- a/src/de/mrbesen/telegram/objects/TMessage.java +++ b/src/de/mrbesen/telegram/objects/TMessage.java @@ -1,5 +1,7 @@ package de.mrbesen.telegram.objects; +import java.io.IOException; + import org.json.JSONObject; import de.mrbesen.telegram.TelegramAPI; @@ -16,6 +18,31 @@ public class TMessage extends JSONBased { public void sendTo(TUser u) { //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) { diff --git a/src/de/mrbesen/telegram/objects/TPhotoSize.java b/src/de/mrbesen/telegram/objects/TPhotoSize.java index d73cb75..0a54ae2 100644 --- a/src/de/mrbesen/telegram/objects/TPhotoSize.java +++ b/src/de/mrbesen/telegram/objects/TPhotoSize.java @@ -2,8 +2,6 @@ package de.mrbesen.telegram.objects; import org.json.JSONObject; -import de.mrbesen.telegram.objects.JSONBased.Member; - public class TPhotoSize extends TDocument { private int width, height; diff --git a/src/de/mrbesen/telegram/objects/TReplyKeyboardMarkup.java b/src/de/mrbesen/telegram/objects/TReplyKeyboardMarkup.java new file mode 100644 index 0000000..8b4a994 --- /dev/null +++ b/src/de/mrbesen/telegram/objects/TReplyKeyboardMarkup.java @@ -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 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(); + + 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; + } + +} diff --git a/src/de/mrbesen/telegram/objects/TReplyKeyboardRemove.java b/src/de/mrbesen/telegram/objects/TReplyKeyboardRemove.java new file mode 100644 index 0000000..9b1cf68 --- /dev/null +++ b/src/de/mrbesen/telegram/objects/TReplyKeyboardRemove.java @@ -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(); + } + +} diff --git a/src/de/mrbesen/telegram/objects/TSendable.java b/src/de/mrbesen/telegram/objects/TSendable.java new file mode 100644 index 0000000..f65ec69 --- /dev/null +++ b/src/de/mrbesen/telegram/objects/TSendable.java @@ -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; + } +} diff --git a/src/de/mrbesen/telegram/objects/TUser.java b/src/de/mrbesen/telegram/objects/TUser.java index 44afe29..53b4278 100644 --- a/src/de/mrbesen/telegram/objects/TUser.java +++ b/src/de/mrbesen/telegram/objects/TUser.java @@ -67,23 +67,29 @@ public class TUser { sendMessage(api.getHelpMessage()); } - public void sendMessage(String text) { - sendMessage(text, null); + public boolean sendMessage(String text) { + 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) { System.err.println("api == null!"); - return; + return false; } + String replyto = (reply_to_msg > 0 ? "&reply_to_message_id=" +reply_to_msg : ""); try { - String reply= (rm == null ? "" : "&reply_markup=" + URLEncoder.encode(rm.toJSONString(), "UTF-8")); - api.request("sendMessage", "chat_id=" + id + String replymarkup = (rm == null ? "" : "&reply_markup=" + URLEncoder.encode(rm.toJSONString(), "UTF-8")); + return api.request("sendMessage", "chat_id=" + id + "&text=" + URLEncoder.encode(text, "UTF-8") - + reply ); + + replymarkup + replyto).getBoolean("ok"); } catch (IOException e) { e.printStackTrace(); } + return false; } public void sendStatus(Status status) { diff --git a/src/de/mrbesen/test/Main.java b/src/de/mrbesen/test/Main.java index c14f14e..49ca8d1 100644 --- a/src/de/mrbesen/test/Main.java +++ b/src/de/mrbesen/test/Main.java @@ -1,36 +1,47 @@ package de.mrbesen.test; -import java.util.Random; import java.util.Scanner; +import de.mrbesen.telegram.MessageBuilder; import de.mrbesen.telegram.TelegramAPI; -import de.mrbesen.telegram.commands.CommandHandler; import de.mrbesen.telegram.event.EventHandler; import de.mrbesen.telegram.event.EventListener; import de.mrbesen.telegram.event.events.UserSendMessageEvent; -import de.mrbesen.telegram.objects.TInlineKeyboardMarkup; -import de.mrbesen.telegram.objects.TUser; +import de.mrbesen.telegram.objects.TMessage; 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; - + private int action = 0; + private TMessage oldmsg = null; + public static void main(String[] args) { new Main().run(); } public Main() { 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); } @EventHandler public void eventbla(UserSendMessageEvent e) { - e.getUser().sendMessage(e.getMessage().getText().replace(' ', '-')); - int i = new Random().nextInt(Status.values().length); - e.getUser().sendStatus(Status.values()[i]); + api.sendMessage(new MessageBuilder().setText("this is a reply").setReciver(e.getUser().getID()).setSilent(true).setNoWebView(true).build()); + if(oldmsg != null) { + oldmsg.forward(e.getUser()); + } + e.getUser().sendStatus(Status.values()[action++]); + action%=Status.values().length; + oldmsg = e.getMessage(); } @Override @@ -43,19 +54,4 @@ public class Main implements CommandHandler, Runnable, EventListener { 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; - } } diff --git a/src/de/mrbesen/test/commands/InlineKeyboardTC.java b/src/de/mrbesen/test/commands/InlineKeyboardTC.java new file mode 100644 index 0000000..97396e7 --- /dev/null +++ b/src/de/mrbesen/test/commands/InlineKeyboardTC.java @@ -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; + } + +} diff --git a/src/de/mrbesen/test/commands/ReplyKeyboardRemoveTC.java b/src/de/mrbesen/test/commands/ReplyKeyboardRemoveTC.java new file mode 100644 index 0000000..05785d8 --- /dev/null +++ b/src/de/mrbesen/test/commands/ReplyKeyboardRemoveTC.java @@ -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; + } + +} diff --git a/src/de/mrbesen/test/commands/ReplyKeyboardTestCase.java b/src/de/mrbesen/test/commands/ReplyKeyboardTestCase.java new file mode 100644 index 0000000..2395133 --- /dev/null +++ b/src/de/mrbesen/test/commands/ReplyKeyboardTestCase.java @@ -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; + } +} diff --git a/src/de/mrbesen/test/commands/SimpleTestCase.java b/src/de/mrbesen/test/commands/SimpleTestCase.java new file mode 100644 index 0000000..b85e0c3 --- /dev/null +++ b/src/de/mrbesen/test/commands/SimpleTestCase.java @@ -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; + } +}