Reformatted code.
This commit is contained in:
@@ -23,55 +23,55 @@ import redis.clients.jedis.JedisPoolConfig;
|
|||||||
import java.util.concurrent.*;
|
import java.util.concurrent.*;
|
||||||
|
|
||||||
public final class Crabstero {
|
public final class Crabstero {
|
||||||
public static final int maximumMessagesPerChannel = 50000;
|
public static final int maximumMessagesPerChannel = 50000;
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(Crabstero.class);
|
private static final Logger logger = LoggerFactory.getLogger(Crabstero.class);
|
||||||
|
|
||||||
private static final String token = System.getenv("TOKEN");
|
private static final String token = System.getenv("TOKEN");
|
||||||
private static final JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), System.getenv("REDIS_HOST"));
|
private static final JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), System.getenv("REDIS_HOST"));
|
||||||
|
|
||||||
private static final ScheduledExecutorService workerPool = Executors.newScheduledThreadPool(4, new CrabsteroThreadFactory());
|
private static final ScheduledExecutorService workerPool = Executors.newScheduledThreadPool(4, new CrabsteroThreadFactory());
|
||||||
|
|
||||||
private Crabstero(){
|
private Crabstero() {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(final String[] arguments){
|
public static void main(final String[] arguments) {
|
||||||
logger.info(Javacord.USER_AGENT);
|
logger.info(Javacord.USER_AGENT);
|
||||||
|
|
||||||
final DiscordApiBuilder builder = new DiscordApiBuilder();
|
final DiscordApiBuilder builder = new DiscordApiBuilder();
|
||||||
|
|
||||||
builder.setAccountType(AccountType.BOT);
|
builder.setAccountType(AccountType.BOT);
|
||||||
builder.setToken(token);
|
builder.setToken(token);
|
||||||
builder.setTrustAllCertificates(false);
|
builder.setTrustAllCertificates(false);
|
||||||
|
|
||||||
builder.setWaitForServersOnStartup(false);
|
builder.setWaitForServersOnStartup(false);
|
||||||
builder.setWaitForUsersOnStartup(false);
|
builder.setWaitForUsersOnStartup(false);
|
||||||
|
|
||||||
builder.setIntents(Intent.GUILDS, Intent.GUILD_MESSAGES);
|
builder.setIntents(Intent.GUILDS, Intent.GUILD_MESSAGES);
|
||||||
|
|
||||||
builder.addListener(new MessageCreate());
|
builder.addListener(new MessageCreate());
|
||||||
builder.addListener(new RoleChangePermissions());
|
builder.addListener(new RoleChangePermissions());
|
||||||
builder.addListener(new ServerBecomesAvailable());
|
builder.addListener(new ServerBecomesAvailable());
|
||||||
builder.addListener(new ServerChannelChangeOverwrittenPermissions());
|
builder.addListener(new ServerChannelChangeOverwrittenPermissions());
|
||||||
builder.addListener(new ServerJoin());
|
builder.addListener(new ServerJoin());
|
||||||
builder.addListener(new UserRoleAdd());
|
builder.addListener(new UserRoleAdd());
|
||||||
|
|
||||||
builder.setRecommendedTotalShards();
|
builder.setRecommendedTotalShards();
|
||||||
|
|
||||||
final DiscordApi api = builder.login().join();
|
final DiscordApi api = builder.login().join();
|
||||||
api.setMessageCacheSize(0, 1);
|
api.setMessageCacheSize(0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Future<?> submitTask(final Runnable task){
|
public static Future<?> submitTask(final Runnable task) {
|
||||||
return workerPool.submit(task);
|
return workerPool.submit(task);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ScheduledFuture<?> scheduleTask(final Runnable task, final long delay, final TimeUnit unit){
|
public static ScheduledFuture<?> scheduleTask(final Runnable task, final long delay, final TimeUnit unit) {
|
||||||
return workerPool.schedule(task, delay, unit);
|
return workerPool.schedule(task, delay, unit);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Jedis getJedis(){
|
public static Jedis getJedis() {
|
||||||
return jedisPool.getResource();
|
return jedisPool.getResource();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -11,14 +11,14 @@ package dev.logal.crabstero;
|
|||||||
import java.util.concurrent.ThreadFactory;
|
import java.util.concurrent.ThreadFactory;
|
||||||
|
|
||||||
public final class CrabsteroThreadFactory implements ThreadFactory {
|
public final class CrabsteroThreadFactory implements ThreadFactory {
|
||||||
private static int threadNumber = 1;
|
private static int threadNumber = 1;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Thread newThread(final Runnable runnable){
|
public Thread newThread(final Runnable runnable) {
|
||||||
final Thread thread = new Thread(runnable);
|
final Thread thread = new Thread(runnable);
|
||||||
|
|
||||||
thread.setName("Crabstero Worker Thread - " + threadNumber++);
|
thread.setName("Crabstero Worker Thread - " + threadNumber++);
|
||||||
|
|
||||||
return thread;
|
return thread;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -19,22 +19,22 @@ import org.javacord.api.listener.message.MessageCreateListener;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
public final class MessageCreate implements MessageCreateListener {
|
public final class MessageCreate implements MessageCreateListener {
|
||||||
@Override
|
@Override
|
||||||
public void onMessageCreate(final MessageCreateEvent event){
|
public void onMessageCreate(final MessageCreateEvent event) {
|
||||||
final MessageAuthor author = event.getMessageAuthor();
|
final MessageAuthor author = event.getMessageAuthor();
|
||||||
final Optional<ServerTextChannel> serverTextChannel = event.getChannel().asServerTextChannel();
|
final Optional<ServerTextChannel> serverTextChannel = event.getChannel().asServerTextChannel();
|
||||||
if (!serverTextChannel.isPresent() || author.isBotUser() || author.isWebhook() || author.isYourself()){
|
if (!serverTextChannel.isPresent() || author.isBotUser() || author.isWebhook() || author.isYourself()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Message message = event.getMessage();
|
final Message message = event.getMessage();
|
||||||
if (message.getMentionedUsers().contains(event.getApi().getYourself())){
|
if (message.getMentionedUsers().contains(event.getApi().getYourself())) {
|
||||||
MarkovChainMessages.replyToMessage(message);
|
MarkovChainMessages.replyToMessage(message);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (message.getType() == MessageType.NORMAL){
|
if (message.getType() == MessageType.NORMAL) {
|
||||||
MarkovChainMessages.ingestMessage(message);
|
MarkovChainMessages.ingestMessage(message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -14,12 +14,12 @@ import org.javacord.api.event.server.role.RoleChangePermissionsEvent;
|
|||||||
import org.javacord.api.listener.server.role.RoleChangePermissionsListener;
|
import org.javacord.api.listener.server.role.RoleChangePermissionsListener;
|
||||||
|
|
||||||
public final class RoleChangePermissions implements RoleChangePermissionsListener {
|
public final class RoleChangePermissions implements RoleChangePermissionsListener {
|
||||||
@Override
|
@Override
|
||||||
public void onRoleChangePermissions(final RoleChangePermissionsEvent event){
|
public void onRoleChangePermissions(final RoleChangePermissionsEvent event) {
|
||||||
if (event.getRole().hasUser(event.getApi().getYourself())){
|
if (event.getRole().hasUser(event.getApi().getYourself())) {
|
||||||
event.getServer().getTextChannels().forEach((channel) -> {
|
event.getServer().getTextChannels().forEach((channel) -> {
|
||||||
Crabstero.submitTask(new ChannelHistoryIngestionTask(channel));
|
Crabstero.submitTask(new ChannelHistoryIngestionTask(channel));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -14,10 +14,10 @@ import org.javacord.api.event.server.ServerBecomesAvailableEvent;
|
|||||||
import org.javacord.api.listener.server.ServerBecomesAvailableListener;
|
import org.javacord.api.listener.server.ServerBecomesAvailableListener;
|
||||||
|
|
||||||
public final class ServerBecomesAvailable implements ServerBecomesAvailableListener {
|
public final class ServerBecomesAvailable implements ServerBecomesAvailableListener {
|
||||||
@Override
|
@Override
|
||||||
public void onServerBecomesAvailable(final ServerBecomesAvailableEvent event){
|
public void onServerBecomesAvailable(final ServerBecomesAvailableEvent event) {
|
||||||
event.getServer().getTextChannels().forEach((channel) -> {
|
event.getServer().getTextChannels().forEach((channel) -> {
|
||||||
Crabstero.submitTask(new ChannelHistoryIngestionTask(channel));
|
Crabstero.submitTask(new ChannelHistoryIngestionTask(channel));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+6
-6
@@ -14,10 +14,10 @@ import org.javacord.api.event.channel.server.ServerChannelChangeOverwrittenPermi
|
|||||||
import org.javacord.api.listener.channel.server.ServerChannelChangeOverwrittenPermissionsListener;
|
import org.javacord.api.listener.channel.server.ServerChannelChangeOverwrittenPermissionsListener;
|
||||||
|
|
||||||
public final class ServerChannelChangeOverwrittenPermissions implements ServerChannelChangeOverwrittenPermissionsListener {
|
public final class ServerChannelChangeOverwrittenPermissions implements ServerChannelChangeOverwrittenPermissionsListener {
|
||||||
@Override
|
@Override
|
||||||
public void onServerChannelChangeOverwrittenPermissions(final ServerChannelChangeOverwrittenPermissionsEvent event){
|
public void onServerChannelChangeOverwrittenPermissions(final ServerChannelChangeOverwrittenPermissionsEvent event) {
|
||||||
event.getChannel().asServerTextChannel().ifPresent((channel) -> {
|
event.getChannel().asServerTextChannel().ifPresent((channel) -> {
|
||||||
Crabstero.submitTask(new ChannelHistoryIngestionTask(channel));
|
Crabstero.submitTask(new ChannelHistoryIngestionTask(channel));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -21,27 +21,27 @@ import org.slf4j.LoggerFactory;
|
|||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
|
|
||||||
public final class ServerJoin implements ServerJoinListener {
|
public final class ServerJoin implements ServerJoinListener {
|
||||||
private static final Logger logger = LoggerFactory.getLogger(ServerJoin.class);
|
private static final Logger logger = LoggerFactory.getLogger(ServerJoin.class);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onServerJoin(final ServerJoinEvent event){
|
public void onServerJoin(final ServerJoinEvent event) {
|
||||||
final Server server = event.getServer();
|
final Server server = event.getServer();
|
||||||
logger.info("Joined new server! (Name: \"" + server.getName() + "\" | ID: " + server.getIdAsString() + ")");
|
logger.info("Joined new server! (Name: \"" + server.getName() + "\" | ID: " + server.getIdAsString() + ")");
|
||||||
|
|
||||||
final EmbedBuilder embed = new EmbedBuilder();
|
final EmbedBuilder embed = new EmbedBuilder();
|
||||||
embed.setTitle("Joined New Server");
|
embed.setTitle("Joined New Server");
|
||||||
embed.setColor(new Color(255, 165, 0));
|
embed.setColor(new Color(255, 165, 0));
|
||||||
embed.addField(server.getName() + " (" + server.getIdAsString() + ")", server.getMemberCount() + " members");
|
embed.addField(server.getName() + " (" + server.getIdAsString() + ")", server.getMemberCount() + " members");
|
||||||
server.getIcon().ifPresent((icon) -> {
|
server.getIcon().ifPresent((icon) -> {
|
||||||
embed.setImage(icon.getUrl().toString());
|
embed.setImage(icon.getUrl().toString());
|
||||||
});
|
});
|
||||||
embed.setFooter(event.getApi().getServers().size() + " total servers");
|
embed.setFooter(event.getApi().getServers().size() + " total servers");
|
||||||
event.getApi().getOwner().thenAcceptAsync((owner) -> {
|
event.getApi().getOwner().thenAcceptAsync((owner) -> {
|
||||||
owner.sendMessage(embed).exceptionally(ExceptionLogger.get());
|
owner.sendMessage(embed).exceptionally(ExceptionLogger.get());
|
||||||
});
|
});
|
||||||
|
|
||||||
server.getTextChannels().forEach((channel) -> {
|
server.getTextChannels().forEach((channel) -> {
|
||||||
Crabstero.submitTask(new ChannelHistoryIngestionTask(channel));
|
Crabstero.submitTask(new ChannelHistoryIngestionTask(channel));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -14,12 +14,12 @@ import org.javacord.api.event.server.role.UserRoleAddEvent;
|
|||||||
import org.javacord.api.listener.server.role.UserRoleAddListener;
|
import org.javacord.api.listener.server.role.UserRoleAddListener;
|
||||||
|
|
||||||
public final class UserRoleAdd implements UserRoleAddListener {
|
public final class UserRoleAdd implements UserRoleAddListener {
|
||||||
@Override
|
@Override
|
||||||
public void onUserRoleAdd(final UserRoleAddEvent event){
|
public void onUserRoleAdd(final UserRoleAddEvent event) {
|
||||||
if (event.getUser().isYourself()){
|
if (event.getUser().isYourself()) {
|
||||||
event.getServer().getTextChannels().forEach((channel) -> {
|
event.getServer().getTextChannels().forEach((channel) -> {
|
||||||
Crabstero.submitTask(new ChannelHistoryIngestionTask(channel));
|
Crabstero.submitTask(new ChannelHistoryIngestionTask(channel));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -21,49 +21,49 @@ import java.util.Iterator;
|
|||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public final class ChannelHistoryIngestionTask implements Runnable {
|
public final class ChannelHistoryIngestionTask implements Runnable {
|
||||||
private static final String INGESTED_CHANNELS_KEY = "ingestedChannels";
|
private static final String INGESTED_CHANNELS_KEY = "ingestedChannels";
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(ChannelHistoryIngestionTask.class);
|
private static final Logger logger = LoggerFactory.getLogger(ChannelHistoryIngestionTask.class);
|
||||||
|
|
||||||
private final ServerTextChannel channel;
|
private final ServerTextChannel channel;
|
||||||
|
|
||||||
public ChannelHistoryIngestionTask(final ServerTextChannel channel){
|
public ChannelHistoryIngestionTask(final ServerTextChannel channel) {
|
||||||
this.channel = channel;
|
this.channel = channel;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run(){
|
public void run() {
|
||||||
try {
|
try {
|
||||||
if (!this.channel.canYouReadMessageHistory()){
|
if (!this.channel.canYouReadMessageHistory()) {
|
||||||
logger.warn("Unable to ingest text channel history due to lacking permissions. Ignoring. (Name: \"" + this.channel.getName() + "\" | ID: " + this.channel.getIdAsString() + " | Server ID: " + this.channel.getServer().getIdAsString() + ")");
|
logger.warn("Unable to ingest text channel history due to lacking permissions. Ignoring. (Name: \"" + this.channel.getName() + "\" | ID: " + this.channel.getIdAsString() + " | Server ID: " + this.channel.getServer().getIdAsString() + ")");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try (final Jedis jedis = Crabstero.getJedis()){
|
try (final Jedis jedis = Crabstero.getJedis()) {
|
||||||
if (jedis.lrange(INGESTED_CHANNELS_KEY, 0, -1).contains(this.channel.getIdAsString())){
|
if (jedis.lrange(INGESTED_CHANNELS_KEY, 0, -1).contains(this.channel.getIdAsString())) {
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
final Pipeline pipeline = jedis.pipelined();
|
final Pipeline pipeline = jedis.pipelined();
|
||||||
pipeline.lpush(INGESTED_CHANNELS_KEY, this.channel.getIdAsString());
|
pipeline.lpush(INGESTED_CHANNELS_KEY, this.channel.getIdAsString());
|
||||||
logger.info("Starting ingestion of text channel history. (Name: \"" + this.channel.getName() + "\" | ID: " + this.channel.getIdAsString() + " | Server ID: " + this.channel.getServer().getIdAsString() + ")");
|
logger.info("Starting ingestion of text channel history. (Name: \"" + this.channel.getName() + "\" | ID: " + this.channel.getIdAsString() + " | Server ID: " + this.channel.getServer().getIdAsString() + ")");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try (final Stream<Message> history = this.channel.getMessagesAsStream()){
|
try (final Stream<Message> history = this.channel.getMessagesAsStream()) {
|
||||||
final Iterator<Message> iterator = history.iterator();
|
final Iterator<Message> iterator = history.iterator();
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (iterator.hasNext()){
|
while (iterator.hasNext()) {
|
||||||
i++;
|
i++;
|
||||||
MarkovChainMessages.ingestMessage(iterator.next());
|
MarkovChainMessages.ingestMessage(iterator.next());
|
||||||
if (i == Crabstero.maximumMessagesPerChannel){
|
if (i == Crabstero.maximumMessagesPerChannel) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.info("Ingestion of text channel history complete. " + i + " messages ingested. (Name: \"" + this.channel.getName() + "\" | ID: " + this.channel.getIdAsString() + " | Server ID: " + this.channel.getServer().getIdAsString() + ")");
|
logger.info("Ingestion of text channel history complete. " + i + " messages ingested. (Name: \"" + this.channel.getName() + "\" | ID: " + this.channel.getIdAsString() + " | Server ID: " + this.channel.getServer().getIdAsString() + ")");
|
||||||
}
|
}
|
||||||
} catch (final Throwable exception){
|
} catch (final Throwable exception) {
|
||||||
logger.error("An error occured while ingesting text channel history! (Name: \"" + this.channel.getName() + "\" | ID: " + this.channel.getIdAsString() + " | Server ID: " + this.channel.getServer().getIdAsString() + ")", exception);
|
logger.error("An error occured while ingesting text channel history! (Name: \"" + this.channel.getName() + "\" | ID: " + this.channel.getIdAsString() + " | Server ID: " + this.channel.getServer().getIdAsString() + ")", exception);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -17,107 +17,107 @@ import java.util.List;
|
|||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
public final class MarkovChain {
|
public final class MarkovChain {
|
||||||
private static final char DEFAULT_SENTENCE_END = '§';
|
private static final char DEFAULT_SENTENCE_END = '§';
|
||||||
private static final Random rng = new SecureRandom();
|
private static final Random rng = new SecureRandom();
|
||||||
|
|
||||||
private final long id;
|
private final long id;
|
||||||
|
|
||||||
public MarkovChain(final long id){
|
public MarkovChain(final long id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final boolean isCompleteSentence(final String sentence){
|
private static final boolean isCompleteSentence(final String sentence) {
|
||||||
if (sentence.isEmpty()){
|
if (sentence.isEmpty()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
final char lastChar = sentence.charAt(sentence.length() - 1);
|
final char lastChar = sentence.charAt(sentence.length() - 1);
|
||||||
return (lastChar == DEFAULT_SENTENCE_END || lastChar == '.' || lastChar == '!' || lastChar == '?');
|
return (lastChar == DEFAULT_SENTENCE_END || lastChar == '.' || lastChar == '!' || lastChar == '?');
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ingest(String paragraph){
|
public void ingest(String paragraph) {
|
||||||
if (!isCompleteSentence(paragraph)){
|
if (!isCompleteSentence(paragraph)) {
|
||||||
paragraph += DEFAULT_SENTENCE_END;
|
paragraph += DEFAULT_SENTENCE_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
final String[] sentences = paragraph.trim().replaceAll(" +", " ").replaceAll("\n", " ").split("(?<=[.!?]) ");
|
final String[] sentences = paragraph.trim().replaceAll(" +", " ").replaceAll("\n", " ").split("(?<=[.!?]) ");
|
||||||
|
|
||||||
for (int i = 0; i < sentences.length; i++){
|
for (int i = 0; i < sentences.length; i++) {
|
||||||
this.ingestSentence(sentences[i]);
|
this.ingestSentence(sentences[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ingestSentence(String sentence){
|
private void ingestSentence(String sentence) {
|
||||||
if (!isCompleteSentence(sentence)){
|
if (!isCompleteSentence(sentence)) {
|
||||||
sentence += DEFAULT_SENTENCE_END;
|
sentence += DEFAULT_SENTENCE_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
String[] words = sentence.trim().replaceAll(" +", " ").split(" ");
|
String[] words = sentence.trim().replaceAll(" +", " ").split(" ");
|
||||||
|
|
||||||
try (final Jedis jedis = Crabstero.getJedis()){
|
try (final Jedis jedis = Crabstero.getJedis()) {
|
||||||
final Pipeline pipeline = jedis.pipelined();
|
final Pipeline pipeline = jedis.pipelined();
|
||||||
for (int i = 0; i < words.length - 1; i++){
|
for (int i = 0; i < words.length - 1; i++) {
|
||||||
if (i == 0){
|
if (i == 0) {
|
||||||
pipeline.lpush(this.id + ":start", words[i]);
|
pipeline.lpush(this.id + ":start", words[i]);
|
||||||
pipeline.lpush(this.id + "::" + words[i], words[i + 1]);
|
pipeline.lpush(this.id + "::" + words[i], words[i + 1]);
|
||||||
} else {
|
} else {
|
||||||
pipeline.lpush(this.id + "::" + words[i], words[i + 1]);
|
pipeline.lpush(this.id + "::" + words[i], words[i + 1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String generate(final int softCharacterLimit, final int hardCharacterLimit){
|
public String generate(final int softCharacterLimit, final int hardCharacterLimit) {
|
||||||
final StringBuilder newSentence = new StringBuilder();
|
final StringBuilder newSentence = new StringBuilder();
|
||||||
|
|
||||||
try (final Jedis jedis = Crabstero.getJedis()){
|
try (final Jedis jedis = Crabstero.getJedis()) {
|
||||||
if (!jedis.exists(this.id + ":start")){
|
if (!jedis.exists(this.id + ":start")) {
|
||||||
this.ingestSentence("Hello world!");
|
this.ingestSentence("Hello world!");
|
||||||
}
|
}
|
||||||
|
|
||||||
String word = "";
|
String word = "";
|
||||||
|
|
||||||
final List<String> startingWords = jedis.lrange(this.id + ":start", 0, -1);
|
final List<String> startingWords = jedis.lrange(this.id + ":start", 0, -1);
|
||||||
int index = rng.nextInt(startingWords.size());
|
int index = rng.nextInt(startingWords.size());
|
||||||
word = startingWords.get(index);
|
word = startingWords.get(index);
|
||||||
newSentence.append(word);
|
newSentence.append(word);
|
||||||
|
|
||||||
while (!isCompleteSentence(word)){
|
while (!isCompleteSentence(word)) {
|
||||||
final List<String> wordChoices = jedis.lrange(this.id + "::" + word, 0, -1);
|
final List<String> wordChoices = jedis.lrange(this.id + "::" + word, 0, -1);
|
||||||
|
|
||||||
index = -1;
|
index = -1;
|
||||||
if (newSentence.length() >= softCharacterLimit){
|
if (newSentence.length() >= softCharacterLimit) {
|
||||||
for (int i = 0; i < wordChoices.size(); i++){
|
for (int i = 0; i < wordChoices.size(); i++) {
|
||||||
final String candidate = wordChoices.get(i);
|
final String candidate = wordChoices.get(i);
|
||||||
|
|
||||||
if (isCompleteSentence(candidate)){
|
if (isCompleteSentence(candidate)) {
|
||||||
index = i;
|
index = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (index == -1){
|
if (index == -1) {
|
||||||
index = rng.nextInt(wordChoices.size());
|
index = rng.nextInt(wordChoices.size());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
index = rng.nextInt(wordChoices.size());
|
index = rng.nextInt(wordChoices.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
word = wordChoices.get(index);
|
word = wordChoices.get(index);
|
||||||
newSentence.append(" " + word);
|
newSentence.append(" " + word);
|
||||||
|
|
||||||
final int sentenceLength = newSentence.length();
|
final int sentenceLength = newSentence.length();
|
||||||
if (sentenceLength >= hardCharacterLimit){
|
if (sentenceLength >= hardCharacterLimit) {
|
||||||
newSentence.delete(hardCharacterLimit, sentenceLength);
|
newSentence.delete(hardCharacterLimit, sentenceLength);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newSentence.charAt(newSentence.length() - 1) == DEFAULT_SENTENCE_END){
|
if (newSentence.charAt(newSentence.length() - 1) == DEFAULT_SENTENCE_END) {
|
||||||
return newSentence.deleteCharAt(newSentence.length() - 1).toString();
|
return newSentence.deleteCharAt(newSentence.length() - 1).toString();
|
||||||
} else {
|
} else {
|
||||||
return newSentence.toString();
|
return newSentence.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -25,86 +25,86 @@ import java.util.List;
|
|||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
public class MarkovChainMessages {
|
public class MarkovChainMessages {
|
||||||
private static final AllowedMentions allowedMentions;
|
private static final AllowedMentions allowedMentions;
|
||||||
private static final Random rng = new SecureRandom();
|
private static final Random rng = new SecureRandom();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
final AllowedMentionsBuilder builder = new AllowedMentionsBuilder();
|
final AllowedMentionsBuilder builder = new AllowedMentionsBuilder();
|
||||||
builder.setMentionEveryoneAndHere(false);
|
builder.setMentionEveryoneAndHere(false);
|
||||||
builder.setMentionRoles(false);
|
builder.setMentionRoles(false);
|
||||||
builder.setMentionUsers(false);
|
builder.setMentionUsers(false);
|
||||||
allowedMentions = builder.build();
|
allowedMentions = builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MarkovChainMessages(){
|
private MarkovChainMessages() {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void replyToMessage(final Message message){
|
public static void replyToMessage(final Message message) {
|
||||||
final TextChannel channel = message.getChannel();
|
final TextChannel channel = message.getChannel();
|
||||||
if (!channel.canYouWrite()){
|
if (!channel.canYouWrite()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final long channelID = channel.getId();
|
final long channelID = channel.getId();
|
||||||
|
|
||||||
final MessageBuilder response = new MessageBuilder();
|
final MessageBuilder response = new MessageBuilder();
|
||||||
final MarkovChain markovChain = new MarkovChain(channelID);
|
final MarkovChain markovChain = new MarkovChain(channelID);
|
||||||
|
|
||||||
response.replyTo(message);
|
response.replyTo(message);
|
||||||
response.setContent(markovChain.generate(750, 1000));
|
response.setContent(markovChain.generate(750, 1000));
|
||||||
|
|
||||||
if (rng.nextDouble() >= 0.95 && channel.canYouEmbedLinks()){
|
if (rng.nextDouble() >= 0.95 && channel.canYouEmbedLinks()) {
|
||||||
final EmbedBuilder embed = new EmbedBuilder();
|
final EmbedBuilder embed = new EmbedBuilder();
|
||||||
embed.setTitle(markovChain.generate(200, 300));
|
embed.setTitle(markovChain.generate(200, 300));
|
||||||
embed.setDescription(markovChain.generate(300, 500));
|
embed.setDescription(markovChain.generate(300, 500));
|
||||||
try (final Jedis jedis = Crabstero.getJedis()){
|
try (final Jedis jedis = Crabstero.getJedis()) {
|
||||||
final List<String> embedImageURLs = jedis.lrange(channelID + ":images", 0, -1);
|
final List<String> embedImageURLs = jedis.lrange(channelID + ":images", 0, -1);
|
||||||
|
|
||||||
if (embedImageURLs.size() > 0){
|
if (embedImageURLs.size() > 0) {
|
||||||
embed.setImage(embedImageURLs.get(rng.nextInt(embedImageURLs.size())));
|
embed.setImage(embedImageURLs.get(rng.nextInt(embedImageURLs.size())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
embed.setFooter("Crabstero is a logal.dev project", "https://logal.dev/images/logo.png");
|
embed.setFooter("Crabstero is a logal.dev project", "https://logal.dev/images/logo.png");
|
||||||
response.setEmbed(embed);
|
response.setEmbed(embed);
|
||||||
}
|
}
|
||||||
|
|
||||||
response.setAllowedMentions(allowedMentions);
|
response.setAllowedMentions(allowedMentions);
|
||||||
response.send(channel).exceptionally(ExceptionLogger.get());
|
response.send(channel).exceptionally(ExceptionLogger.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ingestMessage(final Message message){
|
public static void ingestMessage(final Message message) {
|
||||||
final MessageAuthor author = message.getAuthor();
|
final MessageAuthor author = message.getAuthor();
|
||||||
if (author.isBotUser() || author.isWebhook() || message.getMentionedUsers().contains(message.getApi().getYourself())){
|
if (author.isBotUser() || author.isWebhook() || message.getMentionedUsers().contains(message.getApi().getYourself())) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final long channelID = message.getChannel().getId();
|
final long channelID = message.getChannel().getId();
|
||||||
final MarkovChain markovChain = new MarkovChain(channelID);
|
final MarkovChain markovChain = new MarkovChain(channelID);
|
||||||
|
|
||||||
markovChain.ingest(message.getContent());
|
markovChain.ingest(message.getContent());
|
||||||
|
|
||||||
for (final Embed embed : message.getEmbeds()){
|
for (final Embed embed : message.getEmbeds()) {
|
||||||
ingestEmbed(channelID, embed);
|
ingestEmbed(channelID, embed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ingestEmbed(final long channelID, final Embed embed){
|
public static void ingestEmbed(final long channelID, final Embed embed) {
|
||||||
final MarkovChain markovChain = new MarkovChain(channelID);
|
final MarkovChain markovChain = new MarkovChain(channelID);
|
||||||
|
|
||||||
embed.getTitle().ifPresent((title) -> {
|
embed.getTitle().ifPresent((title) -> {
|
||||||
markovChain.ingest(title);
|
markovChain.ingest(title);
|
||||||
});
|
});
|
||||||
|
|
||||||
embed.getDescription().ifPresent((description) -> {
|
embed.getDescription().ifPresent((description) -> {
|
||||||
markovChain.ingest(description);
|
markovChain.ingest(description);
|
||||||
});
|
});
|
||||||
|
|
||||||
embed.getImage().ifPresent((image) -> {
|
embed.getImage().ifPresent((image) -> {
|
||||||
try (final Jedis jedis = Crabstero.getJedis()){
|
try (final Jedis jedis = Crabstero.getJedis()) {
|
||||||
jedis.lpush(channelID + ":images", image.getUrl().toString());
|
jedis.lpush(channelID + ":images", image.getUrl().toString());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user