mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-03-17 03:14:19 +00:00
added commands to create/delete/list usernotes
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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>"
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<#include "note_not_found_exception_message">
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
Shows all user notes/user notes from a user
|
||||
@@ -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.
|
||||
@@ -0,0 +1 @@
|
||||
The user to retrieve the user notes for.
|
||||
@@ -0,0 +1 @@
|
||||
listNotes [user]
|
||||
@@ -0,0 +1 @@
|
||||
User notes on this server
|
||||
@@ -0,0 +1 @@
|
||||
User notes for user ${user}
|
||||
@@ -0,0 +1 @@
|
||||
No notes.
|
||||
@@ -0,0 +1 @@
|
||||
${user} has note ${noteId} with text ${noteText} on ${date}
|
||||
@@ -0,0 +1 @@
|
||||
User notes
|
||||
@@ -0,0 +1 @@
|
||||
Note not found.
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user