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.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();

View File

@ -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) {

View File

@ -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;
}
}

View File

@ -9,6 +9,10 @@ public class TInlineKeyboardMarkup implements TReplyMarkup {
ArrayList<JSONArray> 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();
}
}

View File

@ -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) {

View File

@ -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;

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());
}
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) {

View File

@ -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;
}
}

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;
}
}