added commands to create/delete/list usernotes

This commit is contained in:
Sheldan
2020-05-17 23:13:01 +02:00
parent 0260862e8e
commit 20f8e422a2
27 changed files with 463 additions and 1 deletions

View File

@@ -0,0 +1,62 @@
package dev.sheldan.abstracto.moderation.commands;
import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand;
import dev.sheldan.abstracto.core.command.config.CommandConfiguration;
import dev.sheldan.abstracto.core.command.config.HelpInfo;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.config.FeatureEnum;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
import dev.sheldan.abstracto.moderation.config.ModerationModule;
import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures;
import dev.sheldan.abstracto.moderation.service.management.UserNoteManagementService;
import dev.sheldan.abstracto.templating.service.TemplateService;
import net.dv8tion.jda.api.entities.Member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
public class DeleteNote extends AbstractConditionableCommand {
@Autowired
private UserNoteManagementService userNoteManagementService;
@Autowired
private TemplateService templateService;
@Override
public CommandResult execute(CommandContext commandContext) {
Long id = (Long) commandContext.getParameters().getParameters().get(0);
if(userNoteManagementService.noteExists(id)) {
userNoteManagementService.deleteNote(id);
} else {
return CommandResult.fromError(templateService.renderSimpleTemplate("note_not_found_exception"));
}
return CommandResult.fromSuccess();
}
@Override
public CommandConfiguration getConfiguration() {
List<Parameter> parameters = new ArrayList<>();
parameters.add(Parameter.builder().name("id").type(Long.class).templated(true).build());
HelpInfo helpInfo = HelpInfo.builder().templated(true).build();
return CommandConfiguration.builder()
.name("deleteNote")
.module(ModerationModule.MODERATION)
.templated(true)
.causesReaction(true)
.parameters(parameters)
.help(helpInfo)
.build();
}
@Override
public FeatureEnum getFeature() {
return ModerationFeatures.USER_NOTES;
}
}

View File

@@ -0,0 +1,61 @@
package dev.sheldan.abstracto.moderation.commands;
import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand;
import dev.sheldan.abstracto.core.command.config.CommandConfiguration;
import dev.sheldan.abstracto.core.command.config.HelpInfo;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.config.FeatureEnum;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
import dev.sheldan.abstracto.moderation.config.ModerationModule;
import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures;
import dev.sheldan.abstracto.moderation.service.management.UserNoteManagementService;
import net.dv8tion.jda.api.entities.Member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
public class UserNoteCommand extends AbstractConditionableCommand {
@Autowired
private UserNoteManagementService userNoteManagementService;
@Autowired
private UserInServerManagementService userInServerManagementService;
@Override
public CommandResult execute(CommandContext commandContext) {
List<Object> parameters = commandContext.getParameters().getParameters();
Member member = (Member) parameters.get(0);
String text = (String) parameters.get(1);
AUserInAServer userInAServer = userInServerManagementService.loadUser(member);
userNoteManagementService.createUserNote(userInAServer, text);
return CommandResult.fromSuccess();
}
@Override
public CommandConfiguration getConfiguration() {
List<Parameter> parameters = new ArrayList<>();
parameters.add(Parameter.builder().name("user").type(Member.class).templated(true).build());
parameters.add(Parameter.builder().name("text").type(String.class).templated(true).remainder(true).build());
HelpInfo helpInfo = HelpInfo.builder().templated(true).build();
return CommandConfiguration.builder()
.name("userNote")
.module(ModerationModule.MODERATION)
.templated(true)
.causesReaction(true)
.parameters(parameters)
.help(helpInfo)
.build();
}
@Override
public FeatureEnum getFeature() {
return ModerationFeatures.USER_NOTES;
}
}

View File

@@ -0,0 +1,90 @@
package dev.sheldan.abstracto.moderation.commands;
import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand;
import dev.sheldan.abstracto.core.command.config.CommandConfiguration;
import dev.sheldan.abstracto.core.command.config.HelpInfo;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.command.execution.ContextConverter;
import dev.sheldan.abstracto.core.config.FeatureEnum;
import dev.sheldan.abstracto.core.models.FullUser;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.service.ChannelService;
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
import dev.sheldan.abstracto.moderation.config.ModerationModule;
import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures;
import dev.sheldan.abstracto.moderation.converter.UserNotesConverter;
import dev.sheldan.abstracto.moderation.models.database.UserNote;
import dev.sheldan.abstracto.moderation.models.template.commands.ListNotesModel;
import dev.sheldan.abstracto.moderation.service.management.UserNoteManagementService;
import dev.sheldan.abstracto.templating.service.TemplateService;
import net.dv8tion.jda.api.entities.Member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
public class UserNotes extends AbstractConditionableCommand {
@Autowired
private UserNoteManagementService userNoteManagementService;
@Autowired
private TemplateService templateService;
@Autowired
private UserInServerManagementService userInServerManagementService;
@Autowired
private ChannelService channelService;
@Autowired
private UserNotesConverter userNotesConverter;
@Override
public CommandResult execute(CommandContext commandContext) {
List<Object> parameters = commandContext.getParameters().getParameters();
List<UserNote> userNotes;
ListNotesModel model = (ListNotesModel) ContextConverter.fromCommandContext(commandContext, ListNotesModel.class);
if(parameters.size() == 1) {
Member member = (Member) parameters.get(0);
AUserInAServer userInAServer = userInServerManagementService.loadUser(member);
userNotes = userNoteManagementService.loadNotesForUser(userInAServer);
FullUser specifiedUser = FullUser
.builder()
.aUserInAServer(userInAServer)
.member(member)
.build();
model.setSpecifiedUser(specifiedUser);
} else {
userNotes = userNoteManagementService.loadNotesForServer(commandContext.getUserInitiatedContext().getServer());
}
model.setUserNotes(userNotesConverter.fromNotes(userNotes));
channelService.sendTemplateInChannel("user_notes_response", model, commandContext.getChannel());
return CommandResult.fromSuccess();
}
@Override
public CommandConfiguration getConfiguration() {
List<Parameter> parameters = new ArrayList<>();
Parameter user = Parameter.builder().name("user").type(Member.class).optional(true).templated(true).build();
parameters.add(user);
HelpInfo helpInfo = HelpInfo.builder().templated(true).build();
return CommandConfiguration.builder()
.name("userNotes")
.module(ModerationModule.MODERATION)
.templated(true)
.causesReaction(true)
.parameters(parameters)
.help(helpInfo)
.build();
}
@Override
public FeatureEnum getFeature() {
return ModerationFeatures.USER_NOTES;
}
}

View File

@@ -0,0 +1,39 @@
package dev.sheldan.abstracto.moderation.converter;
import dev.sheldan.abstracto.core.models.FullUser;
import dev.sheldan.abstracto.core.service.BotService;
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
import dev.sheldan.abstracto.moderation.models.database.UserNote;
import dev.sheldan.abstracto.moderation.models.template.commands.NoteEntryModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
public class UserNotesConverter {
@Autowired
private UserInServerManagementService userInServerManagementService;
@Autowired
private BotService botService;
public List<NoteEntryModel> fromNotes(List<UserNote> userNotes){
List<NoteEntryModel> entryModels = new ArrayList<>();
userNotes.forEach(userNote -> {
FullUser fullUser = FullUser
.builder()
.member(botService.getMemberInServer(userNote.getUser()))
.aUserInAServer(userNote.getUser())
.build();
NoteEntryModel entryModel = NoteEntryModel
.builder()
.fullUser(fullUser)
.note(userNote)
.build();
entryModels.add(entryModel);
});
return entryModels;
}
}

View File

@@ -0,0 +1,16 @@
package dev.sheldan.abstracto.moderation.repository;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.moderation.models.database.UserNote;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface UserNoteRepository extends JpaRepository<UserNote, Long> {
List<UserNote> findByUser(AUserInAServer aUserInAServer);
List<UserNote> findByUser_ServerReference(AServer server);
}

View File

@@ -0,0 +1,49 @@
package dev.sheldan.abstracto.moderation.service.management;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.moderation.models.database.UserNote;
import dev.sheldan.abstracto.moderation.repository.UserNoteRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class UserNoteManagementServiceBean implements UserNoteManagementService {
@Autowired
private UserNoteRepository userNoteRepository;
@Override
public UserNote createUserNote(AUserInAServer aUserInAServer, String note) {
UserNote newNote = UserNote
.builder()
.note(note)
.user(aUserInAServer)
.build();
userNoteRepository.save(newNote);
return newNote;
}
@Override
public void deleteNote(Long id) {
userNoteRepository.deleteById(id);
}
@Override
public boolean noteExists(Long id) {
return userNoteRepository.existsById(id);
}
@Override
public List<UserNote> loadNotesForUser(AUserInAServer aUserInAServer) {
return userNoteRepository.findByUser(aUserInAServer);
}
@Override
public List<UserNote> loadNotesForServer(AServer server) {
return userNoteRepository.findByUser_ServerReference(server);
}
}

View File

@@ -4,6 +4,7 @@ abstracto.features.warnings.enabled=false
abstracto.features.warnDecay.enabled=false
abstracto.features.logging.enabled=false
abstracto.features.muting.enabled=false
abstracto.features.userNotes.enabled=false
abstracto.warnings.warnDecay.days=90
abstracto.scheduling.jobs.unMuteJob.name=unMuteJob

View File

@@ -0,0 +1,31 @@
{
"author": {
<#if specifiedUser??>
"name": "${specifiedUser.member.effectiveName}",
"avatar": "${specifiedUser.member.user.effectiveAvatarUrl}"
<#else>
"name": "${member.effectiveName}",
"avatar": "${member.user.effectiveAvatarUrl}"
</#if>
},
"title": {
<#if specifiedUser??>
<#assign user>${specifiedUser.member.effectiveName}</#assign>
"title": "<#include "user_notes_embed_user_title">"
<#else>
"title": "<#include "user_notes_embed_title">"
</#if>
},
"color" : {
"r": 200,
"g": 0,
"b": 255
},
"description": "<#list userNotes as note>
<#assign user>${note.fullUser.member.asMention}</#assign>
<#assign noteText>${note.note.note}</#assign>
<#assign noteId>${note.note.id}</#assign>
<#assign date>${formatInstant(note.note.created, "yyyy-MM-dd HH:mm:ss")}</#assign>
<#include "user_notes_note_entry"><#else><#include "user_notes_no_notes">
</#list>"
}

View File

@@ -5,7 +5,7 @@ import lombok.Getter;
@Getter
public enum ModerationFeatures implements FeatureEnum {
MODERATION("moderation"), WARNING("warnings"), LOGGING("logging"), MUTING("muting"), AUTOMATIC_WARN_DECAY("warnDecay");
MODERATION("moderation"), WARNING("warnings"), LOGGING("logging"), MUTING("muting"), AUTOMATIC_WARN_DECAY("warnDecay"), USER_NOTES("userNotes");
private String key;

View File

@@ -0,0 +1,13 @@
package dev.sheldan.abstracto.moderation.config.features;
import dev.sheldan.abstracto.core.config.FeatureConfig;
import dev.sheldan.abstracto.core.config.FeatureEnum;
import org.springframework.stereotype.Component;
@Component
public class UserNoteFeature implements FeatureConfig {
@Override
public FeatureEnum getFeature() {
return ModerationFeatures.USER_NOTES;
}
}

View File

@@ -0,0 +1,36 @@
package dev.sheldan.abstracto.moderation.models.database;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import lombok.*;
import javax.persistence.*;
import java.time.Instant;
@Entity
@Table(name="user_notes")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class UserNote {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "noteUser", nullable = false)
private AUserInAServer user;
@Column(length = 2000)
private String note;
@Column(name = "created")
private Instant created;
@PrePersist
private void onInsert() {
this.created = Instant.now();
}
}

View File

@@ -0,0 +1,17 @@
package dev.sheldan.abstracto.moderation.models.template.commands;
import dev.sheldan.abstracto.core.models.FullUser;
import dev.sheldan.abstracto.core.models.context.UserInitiatedServerContext;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
import java.util.List;
@SuperBuilder
@Getter
@Setter
public class ListNotesModel extends UserInitiatedServerContext {
private List<NoteEntryModel> userNotes;
private FullUser specifiedUser;
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.moderation.models.template.commands;
import dev.sheldan.abstracto.core.models.FullUser;
import dev.sheldan.abstracto.moderation.models.database.UserNote;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class NoteEntryModel {
private UserNote note;
private FullUser fullUser;
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.moderation.service.management;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.moderation.models.database.UserNote;
import java.util.List;
public interface UserNoteManagementService {
UserNote createUserNote(AUserInAServer aUserInAServer, String note);
void deleteNote(Long id);
boolean noteExists(Long id);
List<UserNote> loadNotesForUser(AUserInAServer aUserInAServer);
List<UserNote> loadNotesForServer(AServer server);
}

View File

@@ -0,0 +1 @@
Lists all the user notes or only the user notes from a singular user from this server. The output contains the text of the note, the date it was created and the id of the user note.

View File

@@ -0,0 +1 @@
${user} has note ${noteId} with text ${noteText} on ${date}

View File

@@ -169,6 +169,11 @@ public class TemplateServiceBean implements TemplateService {
}
}
@Override
public String renderSimpleTemplate(String key) {
return renderTemplate(key, new Object());
}
@Override
public String renderTemplatable(Templatable templatable) {
return renderTemplate(templatable.getTemplateName(), templatable.getTemplateModel());

View File

@@ -33,6 +33,7 @@ public interface TemplateService {
* @return The template rendered as string.
*/
String renderTemplate(String key, Object model);
String renderSimpleTemplate(String key);
String renderTemplatable(Templatable templatable);
}