111 lines
3.9 KiB
Java
111 lines
3.9 KiB
Java
package de.mrbesen.telegram.commands;
|
|
|
|
import com.sun.istack.internal.Nullable;
|
|
import de.mrbesen.telegram.AsyncHandler;
|
|
import de.mrbesen.telegram.MessageBuilder;
|
|
import de.mrbesen.telegram.TelegramAPI;
|
|
import de.mrbesen.telegram.event.events.UserCallbackEvent;
|
|
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 java.util.*;
|
|
|
|
public class FeedbackCommand implements JSONCommandHandler {
|
|
|
|
protected final TInlineKeyboardMarkup cancel = new TInlineKeyboardMarkup(1);
|
|
protected final Map<Long, TMessage> awaitingFeedback = new TreeMap<>(); //maps users chat id -> message that said "please send feedback" TODO: make persistent?
|
|
protected final TelegramAPI api;
|
|
protected final Collection<Long> admins;
|
|
protected final static String CANCELFEEDBACK = "cancelfeedback", REPLYFEEDBACK = "replyFeedback ";
|
|
|
|
|
|
public FeedbackCommand(TelegramAPI api, Collection<Long> admins) {
|
|
this.api = api;
|
|
this.admins = admins;
|
|
//build markup
|
|
cancel.addCallbackButton("❌ cancel", CANCELFEEDBACK, 0);
|
|
api.getEventManager().registerEvent(UserSendMessageEvent.class, this::onMsg);
|
|
api.getEventManager().registerEvent(UserCallbackEvent.class, this::onCallback);
|
|
}
|
|
|
|
@Override
|
|
public boolean onCommand(TUser sender, String cmd, String[] args, TMessage json) {
|
|
if(cmd.equalsIgnoreCase("feedback")) {
|
|
removeMsg(sender.getID(), null);
|
|
awaitingFeedback.put(sender.getID(), null);
|
|
MessageBuilder mb = new MessageBuilder();
|
|
mb.setAsync().setMarkup(cancel).setText("Your next Message will be forwarded to the admins.")
|
|
.setCallback(new AsyncHandler.Callback<TMessage, Object>() {
|
|
@Override
|
|
public Object call(TMessage msg) throws Throwable {
|
|
awaitingFeedback.put(sender.getID(), msg);
|
|
return null;
|
|
}
|
|
});
|
|
api.sendMessage(mb.build());
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public void onMsg(Object event) {
|
|
UserSendMessageEvent e = (UserSendMessageEvent) event;
|
|
TUser user = e.getUser();
|
|
TMessage msg = e.getMessage();
|
|
if(isFeedback(msg.getText())) {
|
|
if (awaitingFeedback.containsKey(user.getID())) {
|
|
removeMsg(user.getID(), e.getMessage());
|
|
|
|
//fwd to admins
|
|
admins.forEach(a -> TMessage.forwardAsync(api, a, msg));
|
|
|
|
StringBuilder info = new StringBuilder("Feedbackinfo:\n");
|
|
info.append("userid: ").append(user.getID());
|
|
info.append("\nusername: ").append(user.getName());
|
|
info.append("\nfullname: ").append(user.getFirstName()).append(' ').append(user.getLastName());
|
|
TInlineKeyboardMarkup markup = new TInlineKeyboardMarkup(1);
|
|
markup.addUrlButton("chat with user", "tg://" + user.getName(), 1);
|
|
markup.addCallbackButton("reply ↩", REPLYFEEDBACK + user.getID() + " " + msg.getMessageID(), 1);
|
|
admins.forEach(a -> api.sendAsync(a, info.toString()));
|
|
}
|
|
}
|
|
}
|
|
|
|
public void onCallback(Object event) {
|
|
UserCallbackEvent e = (UserCallbackEvent) event;
|
|
if(e.getData().equals(CANCELFEEDBACK)) {
|
|
removeMsg(e.getUser().getID(), e.getMsg());
|
|
api.answerCallbackQuery(e.getID(), "Cancelled", true);
|
|
} else if(e.getData().startsWith(REPLYFEEDBACK)) {
|
|
String rest = e.getData().substring(REPLYFEEDBACK.length());
|
|
//TODO
|
|
}
|
|
}
|
|
|
|
/**
|
|
* looks up msg from awaiting feedback map, if not present try to use fallback_msg
|
|
* is Async
|
|
* removes user from awaitingFeedback
|
|
* @param chat
|
|
* @param fallback_msg
|
|
*/
|
|
protected void removeMsg(long chat, @Nullable TMessage fallback_msg) {
|
|
TMessage msg = awaitingFeedback.remove(chat);
|
|
if(msg == null) msg = fallback_msg;
|
|
|
|
if(msg != null) TMessage.delete(api, msg.getChatID(), msg.getMessageID(), true);
|
|
}
|
|
|
|
/**
|
|
* check if a message is allowed as feedback
|
|
* @param msg
|
|
* @return
|
|
*/
|
|
protected boolean isFeedback(String msg) {
|
|
msg = msg.trim();
|
|
return !msg.startsWith("/") && msg.length() > 5 && !msg.startsWith("http");
|
|
}
|
|
}
|