Make channels default to 0, profile URL config
Fix URL not-escaping Made the plugin only attempt to access channels that are not set to 0 #110
This commit is contained in:
parent
02f60c2162
commit
19463963e3
8 changed files with 40 additions and 18 deletions
|
@ -18,9 +18,7 @@ import javax.annotation.Nullable;
|
|||
import java.util.Comparator;
|
||||
import java.util.Optional;
|
||||
import java.util.TreeSet;
|
||||
import java.util.function.Function;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.regex.MatchResult;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public final class DPUtils {
|
||||
|
@ -65,11 +63,19 @@ public final class DPUtils {
|
|||
while (matcher.find())
|
||||
ts.add(new int[]{matcher.start(), matcher.end()});
|
||||
matcher = FORMAT_PATTERN.matcher(message);
|
||||
Function<MatchResult, String> aFunctionalInterface = result ->
|
||||
/*Function<MatchResult, String> aFunctionalInterface = result ->
|
||||
Optional.ofNullable(ts.floor(new int[]{result.start(), 0})).map(a -> a[1]).orElse(0) < result.start()
|
||||
? "\\\\" + result.group() : result.group();
|
||||
return matcher.replaceAll(aFunctionalInterface); //Find nearest URL match and if it's not reaching to the char then escape
|
||||
} //TODO: Java 11 method overload, not present in Java 8
|
||||
return matcher.replaceAll(aFunctionalInterface); //Find nearest URL match and if it's not reaching to the char then escape*/
|
||||
StringBuffer sb = new StringBuffer();
|
||||
while (matcher.find()) {
|
||||
matcher.appendReplacement(sb, Optional.ofNullable(ts.floor(new int[]{matcher.start(), 0})) //Find a URL start <= our start
|
||||
.map(a -> a[1]).orElse(-1) < matcher.start() //Check if URL end < our start
|
||||
? "\\\\" + matcher.group() : matcher.group());
|
||||
}
|
||||
matcher.appendTail(sb);
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public static Logger getLogger() {
|
||||
if (DiscordPlugin.plugin == null || DiscordPlugin.plugin.getLogger() == null)
|
||||
|
@ -77,8 +83,8 @@ public final class DPUtils {
|
|||
return DiscordPlugin.plugin.getLogger();
|
||||
}
|
||||
|
||||
public static ReadOnlyConfigData<Mono<MessageChannel>> channelData(IHaveConfig config, String key, long defID) {
|
||||
return config.getReadOnlyDataPrimDef(key, defID, id -> getMessageChannel(key, Snowflake.of((Long) id)), ch -> defID); //We can afford to search for the channel in the cache once (instead of using mainServer)
|
||||
public static ReadOnlyConfigData<Mono<MessageChannel>> channelData(IHaveConfig config, String key) {
|
||||
return config.getReadOnlyDataPrimDef(key, 0L, id -> getMessageChannel(key, Snowflake.of((Long) id)), ch -> 0L); //We can afford to search for the channel in the cache once (instead of using mainServer)
|
||||
}
|
||||
|
||||
public static ReadOnlyConfigData<Mono<Role>> roleData(IHaveConfig config, String key, String defName) {
|
||||
|
@ -169,7 +175,15 @@ public final class DPUtils {
|
|||
return "<#" + channelId.asString() + ">";
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a message channel for a config. Returns empty for ID 0.
|
||||
*
|
||||
* @param key The config key
|
||||
* @param id The channel ID
|
||||
* @return A message channel
|
||||
*/
|
||||
public static Mono<MessageChannel> getMessageChannel(String key, Snowflake id) {
|
||||
if (id.asLong() == 0L) return Mono.empty();
|
||||
return DiscordPlugin.dc.getChannelById(id).onErrorResume(e -> {
|
||||
getLogger().warning("Failed to get channel data for " + key + "=" + id + " - " + e.getMessage());
|
||||
return Mono.empty();
|
||||
|
|
|
@ -201,7 +201,7 @@ public class DiscordPlugin extends ButtonPlugin {
|
|||
"Won't load because we're in testing mode and not using a separate account.",
|
||||
new Exception(
|
||||
"The plugin refuses to load until you change the token to a testing account. (The account needs to have \"test\" in its name.)"
|
||||
+ "\nYou can disable test mode in ThorpeCore config."));
|
||||
+ "\nYou can disable test mode in ChromaCore config."));
|
||||
Bukkit.getPluginManager().disablePlugin(this);
|
||||
}
|
||||
TBMCCoreAPI.SendUnsentExceptions();
|
||||
|
|
|
@ -26,14 +26,14 @@ public class AnnouncerModule extends Component<DiscordPlugin> {
|
|||
* Channel to post new posts.
|
||||
*/
|
||||
public ReadOnlyConfigData<Mono<MessageChannel>> channel() {
|
||||
return DPUtils.channelData(getConfig(), "channel", 239519012529111040L);
|
||||
return DPUtils.channelData(getConfig(), "channel");
|
||||
}
|
||||
|
||||
/**
|
||||
* Channel where distinguished (moderator) posts go.
|
||||
*/
|
||||
public ReadOnlyConfigData<Mono<MessageChannel>> modChannel() {
|
||||
return DPUtils.channelData(getConfig(), "modChannel", 239519012529111040L);
|
||||
return DPUtils.channelData(getConfig(), "modChannel");
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -85,7 +85,7 @@ public class ExceptionListenerModule extends Component<DiscordPlugin> implements
|
|||
}
|
||||
|
||||
private ReadOnlyConfigData<Mono<MessageChannel>> channel() {
|
||||
return DPUtils.channelData(getConfig(), "channel", 239519012529111040L);
|
||||
return DPUtils.channelData(getConfig(), "channel");
|
||||
}
|
||||
|
||||
private ConfigData<Mono<Role>> pingRole(Mono<Guild> guild) {
|
||||
|
|
|
@ -125,7 +125,7 @@ public class FunModule extends Component<DiscordPlugin> implements Listener {
|
|||
|
||||
|
||||
private ReadOnlyConfigData<Mono<MessageChannel>> fullHouseChannel() {
|
||||
return DPUtils.channelData(getConfig(), "fullHouseChannel", 219626707458457603L);
|
||||
return DPUtils.channelData(getConfig(), "fullHouseChannel");
|
||||
}
|
||||
|
||||
private static long lasttime = 0;
|
||||
|
|
|
@ -84,13 +84,14 @@ public class MCChatListener implements Listener {
|
|||
final Consumer<EmbedCreateSpec> embed = ecs -> {
|
||||
ecs.setDescription(e.getMessage()).setColor(new Color(color.getRed(),
|
||||
color.getGreen(), color.getBlue()));
|
||||
String url = module.profileURL().get();
|
||||
if (e.getSender() instanceof Player)
|
||||
DPUtils.embedWithHead(ecs, authorPlayer, e.getSender().getName(),
|
||||
"https://tbmcplugins.github.io/profile.html?type=minecraft&id="
|
||||
+ ((Player) e.getSender()).getUniqueId());
|
||||
url.length() > 0 ? url + "?type=minecraft&id="
|
||||
+ ((Player) e.getSender()).getUniqueId() : null);
|
||||
else if (e.getSender() instanceof DiscordSenderBase)
|
||||
ecs.setAuthor(authorPlayer, "https://tbmcplugins.github.io/profile.html?type=discord&id=" // TODO: Constant/method to get URLs like this
|
||||
+ ((DiscordSenderBase) e.getSender()).getUser().getId().asString(),
|
||||
ecs.setAuthor(authorPlayer, url.length() > 0 ? url + "?type=discord&id="
|
||||
+ ((DiscordSenderBase) e.getSender()).getUser().getId().asString() : null,
|
||||
((DiscordSenderBase) e.getSender()).getUser().getAvatarUrl());
|
||||
else
|
||||
DPUtils.embedWithHead(ecs, authorPlayer, e.getSender().getName(), null);
|
||||
|
|
|
@ -58,7 +58,7 @@ public class MinecraftChatModule extends Component<DiscordPlugin> {
|
|||
* The channel where the plugin can log when it mutes a player on Discord because of a Minecraft mute
|
||||
*/
|
||||
public ReadOnlyConfigData<Mono<MessageChannel>> modlogChannel() {
|
||||
return DPUtils.channelData(getConfig(), "modlogChannel", 283840717275791360L);
|
||||
return DPUtils.channelData(getConfig(), "modlogChannel");
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -104,6 +104,13 @@ public class MinecraftChatModule extends Component<DiscordPlugin> {
|
|||
return getConfig().getData("allowPrivateChat", true);
|
||||
}
|
||||
|
||||
/**
|
||||
* If set, message authors appearing on Discord will link to this URL. A 'type' and 'id' parameter will be added with the user's platform (Discord, Minecraft, ...) and ID.
|
||||
*/
|
||||
public ConfigData<String> profileURL() {
|
||||
return getConfig().getData("profileURL", "");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void enable() {
|
||||
if (DPUtils.disableIfConfigErrorRes(this, chatChannel(), chatChannelMono()))
|
||||
|
|
|
@ -36,7 +36,7 @@ public class GameRoleModule extends Component<DiscordPlugin> {
|
|||
}
|
||||
|
||||
private ReadOnlyConfigData<Mono<MessageChannel>> logChannel() {
|
||||
return DPUtils.channelData(getConfig(), "logChannel", 239519012529111040L);
|
||||
return DPUtils.channelData(getConfig(), "logChannel");
|
||||
}
|
||||
|
||||
public static void handleRoleEvent(RoleEvent roleEvent) {
|
||||
|
|
Loading…
Reference in a new issue