projects-jenz/ArtificialAutism/src/main/java/PresentationLayer/DiscordHandler.java

191 lines
8.1 KiB
Java

package PresentationLayer;
import DataLayer.settings;
import FunctionLayer.Datahandler;
import FunctionLayer.PipelineJMWESingleton;
import edu.stanford.nlp.pipeline.StanfordCoreNLP;
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.entities.Activity;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.MessageChannel;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.requests.GatewayIntent;
import javax.security.auth.login.LoginException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.*;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author install1
*/
public class DiscordHandler extends ListenerAdapter {
private static void receiveAndSendPacket(DatagramSocket serverSocket, InetAddress ipAddress, int port,
Datahandler datahandler, StanfordCoreNLP stanfordCoreNLP, StanfordCoreNLP stanfordCoreNLPSentiment) throws IOException {
byte[] receiveData = new byte[4096];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
try {
serverSocket.receive(receivePacket);
} catch (IOException e) {
e.printStackTrace();
}
String sentence = new String(receivePacket.getData(), 0,
receivePacket.getLength());
sentence = sentence.replace("clientmessage:", "");
String ResponseMsg = datahandler.getResponseMsg(sentence, "", stanfordCoreNLP, stanfordCoreNLPSentiment,
true);
byte[] sendData = ResponseMsg.getBytes("UTF-8");
int deliver_port = 0;
switch (port) {
case 48475:
deliver_port = 48470;
break;
case 48476:
deliver_port = 48471;
break;
case 48477:
deliver_port = 48472;
break;
case 48478:
deliver_port = 48473;
break;
}
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, ipAddress, deliver_port);
serverSocket.send(sendPacket);
}
public static void handleUDPTraffic(int port, Datahandler datahandler,
StanfordCoreNLP stanfordCoreNLP, StanfordCoreNLP stanfordCoreNLPSentiment) {
try (DatagramSocket serverSocket = new DatagramSocket(port)) {
String hostIP = "195.154.53.196";
if (port == 48477 || port == 48478) {
hostIP = "51.158.20.245";
}
InetAddress ipAddress = InetAddress.getByName(hostIP);//used ip'
while (true) {
receiveAndSendPacket(serverSocket, ipAddress, port, datahandler, stanfordCoreNLP, stanfordCoreNLPSentiment);
}
} catch (SocketException | UnknownHostException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static StanfordCoreNLP stanfordCoreNLP;
private static Datahandler datahandler;
private static StanfordCoreNLP stanfordCoreNLPSentiment;
private static ExecutorService executorService = Executors.newFixedThreadPool(1);
private static ExecutorService executorServiceIngame = Executors.newFixedThreadPool(2);
//TODO add python program that edits the java code. python program just adds test if statements on
//variables until the tests pass
public static void main(String[] args) throws LoginException {
datahandler = new Datahandler();
PipelineJMWESingleton.getINSTANCE();
stanfordCoreNLP = datahandler.pipeLineSetUp();
stanfordCoreNLPSentiment = datahandler.shiftReduceParserInitiate();
System.out.println("FINISHED ALL ANNOTATIONS");
System.out.println("updatedstring cache");
String strF = datahandler.trimString("abcdef");
datahandler.getResponseFutures(strF, stanfordCoreNLP, stanfordCoreNLPSentiment);
String token = new settings().getDiscordToken();
JDABuilder.createLight(token, GatewayIntent.GUILD_MESSAGES, GatewayIntent.DIRECT_MESSAGES)
.addEventListeners(new DiscordHandler())
.setActivity(Activity.playing("Being the autism bot"))
.build();
int autismbotCount = 4;
//make sure not to use ports that are already occupied.
for (int i = 0; i < autismbotCount; i++) {
final int j = i;
executorServiceIngame.execute(new Runnable() {
@Override
public void run() {
ArrayList<Integer> ports = new ArrayList<Integer>();
ports.add(48475);
ports.add(48476);
ports.add(48477);
ports.add(48478);
handleUDPTraffic(ports.get(j), datahandler, stanfordCoreNLP, stanfordCoreNLPSentiment);
}
});
}
}
@Override
public void onMessageReceived(MessageReceivedEvent event) {
String content = event.getMessage().getContentRaw();
String username = event.getMessage().getAuthor().getName();
List<Member> mentionedMembers = event.getMessage().getMentionedMembers();
if (mentionedMembers != null) {
for (Member member : mentionedMembers) {
content = content.replace(member.getId(), "");
}
}
if (username != null && !event.getAuthor().isBot() && !content.isEmpty()
&& event.getMessage().getCategory() != null) {
String channelName = event.getMessage().getChannel().getName().toLowerCase();
boolean channelpermissionsDenied = false;
if (channelName.contains("suggestion-box")) {
channelpermissionsDenied = true;
}
String categoryName = event.getMessage().getCategory().getName().toLowerCase();
switch (categoryName) {
case "public area":
case "information area": {
break;
}
default: {
channelpermissionsDenied = true;
break;
}
}
if (!channelpermissionsDenied) {
boolean mentionedBot = false;
if (mentionedMembers != null) {
for (Member member : mentionedMembers) {
if (member.getEffectiveName().equals(event.getJDA().getSelfUser().getName())) {
mentionedBot = true;
break;
}
}
}
if (mentionedBot || channelName.contains("general-autism")) {
final String contentF = content;
String ResponseStr = datahandler.getResponseMsg(contentF, username, stanfordCoreNLP, stanfordCoreNLPSentiment,
false);
if (!ResponseStr.isEmpty()) {
System.out.print("\nResponseStr3: " + ResponseStr + "\n");
event.getMessage().getChannel().sendMessage(ResponseStr).queue();
}
} else {
final String contentF = content;
executorService.execute(new Runnable() {
@Override
public void run() {
String strF = datahandler.trimString(contentF);
datahandler.getResponseFutures(strF, stanfordCoreNLP, stanfordCoreNLPSentiment);
}
});
}
}
}
}
}