[AB-268] adding button feature mode to suggestions which allows for hidden suggestion votes

moving gateway metric to separate service in case JDA is not ready yet
This commit is contained in:
Sheldan
2021-09-06 01:39:27 +02:00
parent 448332f24f
commit 8ac3b327e4
37 changed files with 761 additions and 120 deletions

View File

@@ -13,6 +13,9 @@ import java.util.List;
@Component
public class SuggestionFeatureConfig implements FeatureConfig {
public static final String SUGGESTION_AGREE_EMOTE = "suggestionYes";
public static final String SUGGESTION_DISAGREE_EMOTE = "suggestionNo";
@Override
public FeatureDefinition getFeature() {
return SuggestionFeatureDefinition.SUGGEST;
@@ -25,12 +28,12 @@ public class SuggestionFeatureConfig implements FeatureConfig {
@Override
public List<String> getRequiredEmotes() {
return Arrays.asList("suggestionYes", "suggestionNo");
return Arrays.asList(SUGGESTION_AGREE_EMOTE, SUGGESTION_DISAGREE_EMOTE);
}
@Override
public List<FeatureMode> getAvailableModes() {
return Arrays.asList(SuggestionFeatureMode.SUGGESTION_REMINDER);
return Arrays.asList(SuggestionFeatureMode.SUGGESTION_REMINDER, SuggestionFeatureMode.SUGGESTION_BUTTONS);
}
@Override

View File

@@ -5,7 +5,7 @@ import lombok.Getter;
@Getter
public enum SuggestionFeatureMode implements FeatureMode {
SUGGESTION_REMINDER("suggestionReminder");
SUGGESTION_REMINDER("suggestionReminder"), SUGGESTION_BUTTONS("suggestionButton");
private final String key;

View File

@@ -0,0 +1,5 @@
package dev.sheldan.abstracto.suggestion.model.database;
public enum SuggestionDecision {
AGREE, DISAGREE, REMOVE_VOTE
}

View File

@@ -0,0 +1,46 @@
package dev.sheldan.abstracto.suggestion.model.database;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.suggestion.model.database.embed.SuggestionVoterId;
import lombok.*;
import javax.persistence.*;
import java.time.Instant;
@Entity
@Table(name="suggestion_vote")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@EqualsAndHashCode
public class SuggestionVote {
@Id
@EmbeddedId
private SuggestionVoterId suggestionVoteId;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)
@MapsId("voterId")
@JoinColumn(name = "voter_user_in_server_id", nullable = false)
private AUserInAServer voter;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns(
{
@JoinColumn(updatable = false, insertable = false, name = "suggestion_id", referencedColumnName = "id"),
@JoinColumn(updatable = false, insertable = false, name = "server_id", referencedColumnName = "server_id")
})
private Suggestion suggestion;
@Enumerated(EnumType.STRING)
@Column(name = "decision", nullable = false)
private SuggestionDecision decision;
@Column(name = "created", nullable = false, insertable = false, updatable = false)
private Instant created;
@Column(name = "updated", insertable = false, updatable = false)
private Instant updated;
}

View File

@@ -0,0 +1,25 @@
package dev.sheldan.abstracto.suggestion.model.database.embed;
import lombok.*;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import java.io.Serializable;
@Embeddable
@Getter
@Setter
@Builder
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class SuggestionVoterId implements Serializable {
@Column(name = "voter_user_in_server_id")
private Long voterId;
@Column(name = "suggestion_id")
private Long suggestionId;
@Column(name = "server_id")
private Long serverId;
}

View File

@@ -0,0 +1,16 @@
package dev.sheldan.abstracto.suggestion.model.template;
import dev.sheldan.abstracto.core.models.template.button.ButtonPayload;
import dev.sheldan.abstracto.suggestion.model.database.SuggestionDecision;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class SuggestionButtonPayload implements ButtonPayload {
private Long suggestionId;
private Long serverId;
private SuggestionDecision decision;
}

View File

@@ -0,0 +1,13 @@
package dev.sheldan.abstracto.suggestion.model.template;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class SuggestionInfoModel {
private Long agreements;
private Long disagreements;
}

View File

@@ -1,6 +1,7 @@
package dev.sheldan.abstracto.suggestion.model.template;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.models.template.button.ButtonConfigModel;
import dev.sheldan.abstracto.core.utils.MessageUtils;
import dev.sheldan.abstracto.suggestion.model.database.SuggestionState;
import lombok.Getter;
@@ -25,6 +26,10 @@ public class SuggestionLog {
private Long serverId;
private Long originalChannelId;
private Long originalMessageId;
private Boolean useButtons;
private ButtonConfigModel agreeButtonModel;
private ButtonConfigModel disAgreeButtonModel;
private ButtonConfigModel removeVoteButtonModel;
public String getOriginalMessageUrl() {
return MessageUtils.buildMessageUrl(serverId, originalChannelId , originalMessageId);

View File

@@ -0,0 +1,32 @@
package dev.sheldan.abstracto.suggestion.model.template;
import dev.sheldan.abstracto.core.utils.MessageUtils;
import dev.sheldan.abstracto.suggestion.model.database.SuggestionState;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.User;
@Getter
@Setter
@SuperBuilder
public class SuggestionUpdateModel {
private Long suggestionId;
private SuggestionState state;
private User suggester;
private Member member;
private String text;
private Message message;
private String reason;
private Long serverId;
private Long originalChannelId;
private Long originalMessageId;
private Long agreeVotes;
private Long disAgreeVotes;
public String getOriginalMessageUrl() {
return MessageUtils.buildMessageUrl(serverId, originalChannelId , originalMessageId);
}
}

View File

@@ -2,6 +2,7 @@ package dev.sheldan.abstracto.suggestion.service;
import dev.sheldan.abstracto.core.models.ServerSpecificId;
import dev.sheldan.abstracto.suggestion.model.database.Suggestion;
import dev.sheldan.abstracto.suggestion.model.template.SuggestionInfoModel;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
@@ -17,4 +18,5 @@ public interface SuggestionService {
void cleanUpSuggestions();
CompletableFuture<Void> remindAboutSuggestion(ServerSpecificId suggestionId);
void cancelSuggestionReminder(Suggestion suggestion);
SuggestionInfoModel getSuggestionInfo(Long serverId, Long suggestionId);
}

View File

@@ -0,0 +1,13 @@
package dev.sheldan.abstracto.suggestion.service;
import dev.sheldan.abstracto.suggestion.model.database.Suggestion;
import dev.sheldan.abstracto.suggestion.model.database.SuggestionDecision;
import dev.sheldan.abstracto.suggestion.model.database.SuggestionVote;
import net.dv8tion.jda.api.entities.Member;
public interface SuggestionVoteService {
SuggestionVote upsertSuggestionVote(Member votingMember, SuggestionDecision decision, Long suggestionId);
SuggestionVote upsertSuggestionVote(Member votingMember, SuggestionDecision decision, Suggestion suggestion);
void deleteSuggestionVote(Member votingMember, Long suggestionId);
void deleteSuggestionVote(Member votingMember, Suggestion suggestion);
}

View File

@@ -20,4 +20,5 @@ public interface SuggestionManagementService {
void deleteSuggestion(List<Suggestion> suggestions);
void deleteSuggestion(Suggestion suggestion);
List<Suggestion> getSuggestionsUpdatedBeforeNotNew(Instant date);
Optional<Suggestion> findSuggestionByMessageId(Long messageId);
}

View File

@@ -0,0 +1,16 @@
package dev.sheldan.abstracto.suggestion.service.management;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.suggestion.model.database.Suggestion;
import dev.sheldan.abstracto.suggestion.model.database.SuggestionDecision;
import dev.sheldan.abstracto.suggestion.model.database.SuggestionVote;
import java.util.Optional;
public interface SuggestionVoteManagementService {
Optional<SuggestionVote> getSuggestionVote(AUserInAServer aUserInAServer, Suggestion suggestion);
void deleteSuggestionVote(AUserInAServer aUserInAServer, Suggestion suggestion);
SuggestionVote createSuggestionVote(AUserInAServer aUserInAServer, Suggestion suggestion, SuggestionDecision decision);
Long getDecisionsForSuggestion(Suggestion suggestion, SuggestionDecision decision);
void deleteSuggestionVotes(Suggestion suggestion);
}