Skip to content

Commit

Permalink
Added more Discord events and arguments to the command
Browse files Browse the repository at this point in the history
Additional things:
- Formatted events and listeners
- Messages received in private can now be determined using <context.is_private>
  • Loading branch information
Mwthorn committed Dec 13, 2018
1 parent 601e6c5 commit cbf0235
Show file tree
Hide file tree
Showing 12 changed files with 670 additions and 17 deletions.
198 changes: 185 additions & 13 deletions src/main/java/com/denizenscript/ddiscordbot/DiscordCommand.java
@@ -1,7 +1,10 @@
package com.denizenscript.ddiscordbot;

import com.denizenscript.ddiscordbot.listeners.DiscordDeleteMessage;
import com.denizenscript.ddiscordbot.listeners.DiscordLeaveUser;
import com.denizenscript.ddiscordbot.listeners.DiscordModifiedMessage;
import com.denizenscript.ddiscordbot.listeners.DiscordNewUser;
import net.aufdemrand.denizen.utilities.debugging.dB;
import net.aufdemrand.denizencore.exceptions.CommandExecutionException;
import net.aufdemrand.denizencore.exceptions.InvalidArgumentsException;
import net.aufdemrand.denizencore.objects.Element;
import net.aufdemrand.denizencore.objects.aH;
Expand All @@ -12,6 +15,13 @@
import org.bukkit.Bukkit;
import sx.blah.discord.api.ClientBuilder;
import sx.blah.discord.api.IDiscordClient;
import sx.blah.discord.handle.obj.ActivityType;
import sx.blah.discord.handle.obj.IGuild;
import sx.blah.discord.handle.obj.StatusType;
import sx.blah.discord.util.RequestBuffer;

import static sx.blah.discord.handle.obj.ActivityType.PLAYING;
import static sx.blah.discord.handle.obj.StatusType.ONLINE;

public class DiscordCommand extends AbstractCommand implements Holdable {

Expand Down Expand Up @@ -45,9 +55,33 @@ public class DiscordCommand extends AbstractCommand implements Holdable {
// Use to message a Discord channel.
// - discord id:mybot message channel:<discord[mybot].server[Denizen].channel[bot-spam]> "Hello world!"

// @Usage
// Use to add a role on a user in a Discord guild.
// - discord id:mybot role add user:<def[user_id]> role:324782895 guild:<def[guild_id]>

// @Usage
// Use to remove a role on a user in a Discord guild.
// - discord id:mybot role remove user:<def[user_id]> role:435345436457656 guild:<def[guild_id]>

// @Usage
// Use to set the status of the bot.
// - discord id:mybot status "Minecraft" "status:ONLINE" "activity:PLAYING"

// @Usage
// Use to clear the status of the bot.
// - discord id:mybot status clear

// @Usage
// Use to give a user a new nickname.
// - discord id:mybot rename "<def[nickname]>" user:<def[user_id]> guild:<def[guild_id]>

// @Usage
// Use to message a Discord channel.
// - discord id:mybot private user:<def[user_id]> "Hello world!"

// -->

public enum DiscordInstruction { CONNECT, DISCONNECT, MESSAGE }
public enum DiscordInstruction { CONNECT, DISCONNECT, MESSAGE, ROLE, PRIVATE, STATUS, RENAME }

@Override
public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException {
Expand All @@ -70,8 +104,28 @@ else if (!scriptEntry.hasObject("channel")
&& arg.matchesPrefix("channel")) {
scriptEntry.addObject("channel", arg.asElement());
}
else if (!scriptEntry.hasObject("user")
&& arg.matchesPrefix("user")) {
scriptEntry.addObject("user", arg.asElement());
}
else if (!scriptEntry.hasObject("guild")
&& arg.matchesPrefix("guild")) {
scriptEntry.addObject("guild", arg.asElement());
}
else if (!scriptEntry.hasObject("role")
&& arg.matchesPrefix("role")) {
scriptEntry.addObject("role", arg.asElement());
}
else if (!scriptEntry.hasObject("status")
&& arg.matchesPrefix("status")) {
scriptEntry.addObject("status", arg.asElement());
}
else if (!scriptEntry.hasObject("activity")
&& arg.matchesPrefix("activity")) {
scriptEntry.addObject("activity", arg.asElement());
}
else if (!scriptEntry.hasObject("message")) {
scriptEntry.addObject("message", new Element(arg.raw_value));
scriptEntry.addObject("message", arg.asElement());
}
else {
arg.reportUnhandled();
Expand All @@ -91,44 +145,55 @@ else if (!scriptEntry.hasObject("message")) {

public static class DiscordConnectThread extends Thread {

public String code;
String code;

public DiscordConnection conn;
DiscordConnection conn;

public Runnable ender;
Runnable ender;

@Override
public void run() {
try {
IDiscordClient idc = new ClientBuilder().withToken(code).login();
ClientBuilder cb = new ClientBuilder().withToken(code);
cb.registerListener(new DiscordNewUser());
cb.registerListener(new DiscordLeaveUser());
cb.registerListener(new DiscordModifiedMessage());
cb.registerListener(new DiscordDeleteMessage());
IDiscordClient idc = cb.login();
conn.client = idc;
idc.getDispatcher().registerListener(conn);
}
catch (Exception ex) {
Bukkit.getScheduler().runTask(dDiscordBot.instance, () -> {
dDiscordBot.instance.connections.remove(conn.botID);
});
Bukkit.getScheduler().runTask(dDiscordBot.instance, () -> dDiscordBot.instance.connections.remove(conn.botID));
dB.echoError(ex);
}
Bukkit.getScheduler().runTask(dDiscordBot.instance, ender);
}
}

@Override
public void execute(ScriptEntry scriptEntry) throws CommandExecutionException {
public void execute(ScriptEntry scriptEntry) {

// Fetch required objects
Element id = scriptEntry.getElement("id");
Element instruction = scriptEntry.getElement("instruction");
Element code = scriptEntry.getElement("code");
Element channel = scriptEntry.getElement("channel");
Element message = scriptEntry.getElement("message");
Element status = scriptEntry.getElement("status");
Element activity = scriptEntry.getElement("activity");
Element user = scriptEntry.getElement("user");
Element guild = scriptEntry.getElement("guild");
Element role = scriptEntry.getElement("role");

// Debug the execution
dB.report(scriptEntry, getName(), id.debug()
+ (channel != null ? channel.debug(): "")
+ instruction.debug()
+ (message != null ? message.debug(): ""));
+ (message != null ? message.debug(): "")
+ (user != null ? user.debug(): "")
+ (guild != null ? guild.debug(): "")
+ (role != null ? role.debug(): ""));

switch (DiscordInstruction.valueOf(instruction.asString().toUpperCase())) {
case CONNECT:
Expand Down Expand Up @@ -169,7 +234,114 @@ public void execute(ScriptEntry scriptEntry) throws CommandExecutionException {
dB.echoError(scriptEntry.getResidingQueue(), "Failed to message: unknown ID!");
return;
}
dDiscordBot.instance.connections.get(id.asString()).client.getChannelByID(channel.asLong()).sendMessage(message.asString());
RequestBuffer.request(() -> {
dDiscordBot.instance.connections.get(id.asString()).client.getChannelByID(channel.asLong()).sendMessage(message.asString());
});
break;
case PRIVATE:
if (user == null) {
dB.echoError(scriptEntry.getResidingQueue(), "Failed to role: no user given!");
return;
}
if (message == null) {
dB.echoError(scriptEntry.getResidingQueue(), "Failed to message: no message given!");
return;
}
if (!dDiscordBot.instance.connections.containsKey(id.asString())) {
dB.echoError(scriptEntry.getResidingQueue(), "Failed to message: unknown ID!");
return;
}
IDiscordClient client_d = dDiscordBot.instance.connections.get(id.asString()).client;
RequestBuffer.request(() -> {
client_d.getOrCreatePMChannel(client_d.getUserByID(user.asLong())).sendMessage(message.asString());
});
break;
case ROLE:
if (user == null) {
dB.echoError(scriptEntry.getResidingQueue(), "Failed to role: no user given!");
return;
}
if (guild == null) {
dB.echoError(scriptEntry.getResidingQueue(), "Failed to role: no guild given!");
return;
}
if (role == null) {
dB.echoError(scriptEntry.getResidingQueue(), "Failed to role: no role given!");
return;
}
if (message == null) {
dB.echoError(scriptEntry.getResidingQueue(), "Failed to role: no action given!");
return;
}
if (!dDiscordBot.instance.connections.containsKey(id.asString())) {
dB.echoError(scriptEntry.getResidingQueue(), "Failed to role: unknown ID!");
return;
}
client_d = dDiscordBot.instance.connections.get(id.asString()).client;
IGuild guild_d = client_d.getGuildByID(guild.asLong());
switch (message.toString().toLowerCase()) {
case "remove":
client_d.getUserByID(user.asLong()).removeRole(guild_d.getRoleByID(role.asLong()));
break;
case "add":
client_d.getUserByID(user.asLong()).addRole(guild_d.getRoleByID(role.asLong()));
break;
default:
dB.echoError(scriptEntry.getResidingQueue(), "Failed to role: Invalid action given - " + message.toString());
return;
}
break;
case RENAME:
if (user == null) {
dB.echoError(scriptEntry.getResidingQueue(), "Failed to rename: no user given!");
return;
}
if (guild == null) {
dB.echoError(scriptEntry.getResidingQueue(), "Failed to rename: no guild given!");
return;
}
if (!dDiscordBot.instance.connections.containsKey(id.asString())) {
dB.echoError(scriptEntry.getResidingQueue(), "Failed to rename: unknown ID!");
return;
}
if (message == null) {
dB.echoError(scriptEntry.getResidingQueue(), "Failed to rename: no name given!");
return;
}
client_d = dDiscordBot.instance.connections.get(id.asString()).client;
IGuild guild_e = client_d.getGuildByID(guild.asLong());
guild_e.setUserNickname(client_d.getUserByID(user.asLong()), message.asString());
break;
case STATUS:

if (!dDiscordBot.instance.connections.containsKey(id.asString())) {
dB.echoError(scriptEntry.getResidingQueue(), "Failed to set status: unknown ID!");
return;
}
if (message == null) {
dB.echoError(scriptEntry.getResidingQueue(), "Failed to set status: no message given!");
return;
}
StatusType st;
if (status == null) {
st = ONLINE;
}
else {
st = StatusType.valueOf(status.asString());
}
if (message.asString().equals("clear")) {
dDiscordBot.instance.connections.get(id.asString()).client.changePresence(st);
return;
}
ActivityType at;
if (activity == null) {
at = PLAYING;
}
else {
at = ActivityType.valueOf(activity.asString());
}
dDiscordBot.instance.connections.get(id.asString()).client.changePresence(st, at, message.asString());

break;
}
}
Expand Down
@@ -1,5 +1,6 @@
package com.denizenscript.ddiscordbot;

import com.denizenscript.ddiscordbot.events.DiscordMessageReceivedScriptEvent;
import org.bukkit.Bukkit;
import sx.blah.discord.api.IDiscordClient;
import sx.blah.discord.api.events.IListener;
Expand All @@ -13,9 +14,6 @@ public class DiscordConnection implements IListener<MessageReceivedEvent> {

@Override
public void handle(MessageReceivedEvent messageReceivedEvent) {
if (messageReceivedEvent.getChannel().isPrivate()) {
return;
}
Bukkit.getScheduler().runTask(dDiscordBot.instance, () -> {
DiscordMessageReceivedScriptEvent mrse = DiscordMessageReceivedScriptEvent.instance;
mrse.botID = botID;
Expand Down
@@ -1,5 +1,6 @@
package com.denizenscript.ddiscordbot;

import com.denizenscript.ddiscordbot.events.DiscordMessageReceivedScriptEvent;
import net.aufdemrand.denizen.utilities.debugging.dB;
import net.aufdemrand.denizencore.DenizenCore;
import net.aufdemrand.denizencore.events.ScriptEvent;
Expand Down
@@ -0,0 +1,86 @@
package com.denizenscript.ddiscordbot.events;

import net.aufdemrand.denizencore.events.ScriptEvent;
import net.aufdemrand.denizencore.objects.Element;
import net.aufdemrand.denizencore.objects.dObject;
import net.aufdemrand.denizencore.scripts.containers.ScriptContainer;
import net.aufdemrand.denizencore.utilities.CoreUtilities;
import sx.blah.discord.handle.impl.events.guild.member.UserLeaveEvent;

public class DiscordLeaveUserScriptEvent extends ScriptEvent {
public static DiscordLeaveUserScriptEvent instance;

// <--[event]
// @Events
// discord user leaves (by <bot>)
//
// @Regex ^on discord user leaves(by [^\s]+)?$
//
// @Triggers when a Discord user leaves a guild.
//
// @Plugin dDiscordBot
//
// @Context
// <context.bot> returns the ID of the bot.
// <context.group> returns the group ID.
// <context.group_name> returns the group name.
// <context.user_id> returns the author's internal ID.
// <context.user_name> return's the author's name.
//
// -->

@Override
public boolean couldMatch(ScriptContainer scriptContainer, String s) {
return CoreUtilities.toLowerCase(s).startsWith("discord user leaves");
}

@Override
public boolean matches(ScriptContainer scriptContainer, String s) {
String lower = CoreUtilities.toLowerCase(s);
if (lower.equals("discord user leaves")) {
return true;
}
else return CoreUtilities.xthArgEquals(4, lower, botID);
}

public String botID;

public UserLeaveEvent mre;

@Override
public dObject getContext(String name) {
if (name.equals("bot")) {
return new Element(botID);
}
else if (name.equals("group")) {
return new Element(mre.getGuild().getLongID());
}
else if (name.equals("group_name")) {
return new Element(mre.getGuild().getName());
}
else if (name.equals("user_id")) {
return new Element(mre.getUser().getLongID());
}
else if (name.equals("user_name")) {
return new Element(mre.getUser().getName());
}
return super.getContext(name);
}

@Override
public String getName() {
return "DiscordLeaveUser";
}

private boolean enab = false;

@Override
public void init() {
enab = true;
}

@Override
public void destroy() {
enab = false;
}
}

0 comments on commit cbf0235

Please sign in to comment.