[AB-xxx] adding ability to automate giveaways using modmail and adding storage for give away keys

ignoring message updated events for messages not within servers
This commit is contained in:
Sheldan
2024-12-25 19:54:24 +01:00
parent 8819c12b81
commit cdbdb395ac
38 changed files with 1266 additions and 87 deletions

View File

@@ -2,6 +2,7 @@ package dev.sheldan.abstracto.giveaway.config;
import dev.sheldan.abstracto.core.config.FeatureConfig;
import dev.sheldan.abstracto.core.config.FeatureDefinition;
import dev.sheldan.abstracto.core.config.FeatureMode;
import dev.sheldan.abstracto.core.config.PostTargetEnum;
import org.springframework.stereotype.Component;
@@ -11,6 +12,8 @@ import java.util.List;
@Component
public class GiveawayFeatureConfig implements FeatureConfig {
public static final String KEY_GIVEAWAYS_DURATION = "keyGiveawaysDuration";
@Override
public FeatureDefinition getFeature() {
return GiveawayFeatureDefinition.GIVEAWAY;
@@ -20,4 +23,14 @@ public class GiveawayFeatureConfig implements FeatureConfig {
public List<PostTargetEnum> getRequiredPostTargets() {
return Arrays.asList(GiveawayPostTarget.GIVEAWAYS);
}
@Override
public List<FeatureMode> getAvailableModes() {
return Arrays.asList(GiveawayMode.KEY_GIVEAWAYS, GiveawayMode.AUTO_NOTIFY_GIVEAWAY_KEY_WINNERS);
}
@Override
public List<String> getRequiredSystemConfigKeys() {
return Arrays.asList(KEY_GIVEAWAYS_DURATION);
}
}

View File

@@ -0,0 +1,17 @@
package dev.sheldan.abstracto.giveaway.config;
import dev.sheldan.abstracto.core.config.FeatureMode;
import lombok.Getter;
@Getter
public enum GiveawayMode implements FeatureMode {
KEY_GIVEAWAYS("keyGiveaways"),
AUTO_NOTIFY_GIVEAWAY_KEY_WINNERS("autoNotifyGiveawayKeyWinners");
private final String key;
GiveawayMode(String key) {
this.key = key;
}
}

View File

@@ -0,0 +1,19 @@
package dev.sheldan.abstracto.giveaway.exception;
import dev.sheldan.abstracto.core.exception.AbstractoTemplatableException;
public class GiveawayKeyNotFoundException extends AbstractoTemplatableException {
public GiveawayKeyNotFoundException() {
super("Giveaway key not found.");
}
@Override
public String getTemplateName() {
return "giveaway_key_not_found_exception";
}
@Override
public Object getTemplateModel() {
return new Object();
}
}

View File

@@ -0,0 +1,19 @@
package dev.sheldan.abstracto.giveaway.exception;
import dev.sheldan.abstracto.core.exception.AbstractoTemplatableException;
public class GiveawayNotPossibleException extends AbstractoTemplatableException {
public GiveawayNotPossibleException() {
super("Giveaway not possible.");
}
@Override
public String getTemplateName() {
return "giveaway_not_possible_exception";
}
@Override
public Object getTemplateModel() {
return new Object();
}
}

View File

@@ -3,7 +3,6 @@ package dev.sheldan.abstracto.giveaway.model;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.channel.middleman.GuildMessageChannel;
import java.time.Duration;
@@ -12,8 +11,10 @@ import java.time.Duration;
@Getter
public class GiveawayCreationRequest {
private Member creator;
private Member benefactor;
private Long creatorId;
private Long serverId;
private Long benefactorId;
private Long giveawayKeyId;
private String title;
private String description;
private Duration duration;

View File

@@ -65,6 +65,9 @@ public class Giveaway {
@Column(name = "message_id", nullable = false)
private Long messageId;
@OneToOne(mappedBy = "giveaway")
private GiveawayKey giveawayKey;
@Column(name = "created", nullable = false, insertable = false, updatable = false)
private Instant created;

View File

@@ -0,0 +1,75 @@
package dev.sheldan.abstracto.giveaway.model.database;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.giveaway.model.database.embed.GiveawayKeyId;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.EmbeddedId;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.JoinColumns;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.MapsId;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "giveaway_key")
@Getter
@Setter
@EqualsAndHashCode
public class GiveawayKey {
@Id
@EmbeddedId
private GiveawayKeyId id;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumns(
{
@JoinColumn(name = "giveaway_id", referencedColumnName = "id"),
@JoinColumn(name = "giveaway_server_id", referencedColumnName = "server_id")
})
private Giveaway giveaway;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@MapsId("serverId")
@JoinColumn(name = "server_id", referencedColumnName = "id", nullable = false)
private AServer server;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "creator_user_id", nullable = false)
private AUserInAServer creator;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "winner_user_id")
private AUserInAServer winner;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "benefactor_user_id")
private AUserInAServer benefactor;
@Column(name = "key", nullable = false)
private String key;
@Column(name = "name")
private String name;
@Column(name = "used")
private Boolean used;
@Column(name = "description")
private String description;
}

View File

@@ -0,0 +1,27 @@
package dev.sheldan.abstracto.giveaway.model.database.embed;
import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Embeddable
@Getter
@Setter
@Builder
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class GiveawayKeyId implements Serializable {
@Column(name = "id")
private Long keyId;
@Column(name = "server_id")
private Long serverId;
}

View File

@@ -0,0 +1,18 @@
package dev.sheldan.abstracto.giveaway.model.template;
import dev.sheldan.abstracto.core.models.template.display.MemberDisplay;
import lombok.Builder;
import lombok.Getter;
@Builder
@Getter
public class GiveawayKeyDisplayModel {
private String key;
private String name;
private Long id;
private String description;
private Boolean used;
private MemberDisplay creator;
private MemberDisplay benefactor;
private MemberDisplay winner;
}

View File

@@ -0,0 +1,11 @@
package dev.sheldan.abstracto.giveaway.model.template;
import java.util.List;
import lombok.Builder;
import lombok.Getter;
@Builder
@Getter
public class GiveawayKeysDisplayModel {
private List<GiveawayKeyDisplayModel> keys;
}

View File

@@ -0,0 +1,31 @@
package dev.sheldan.abstracto.giveaway.model.template;
import dev.sheldan.abstracto.core.models.template.display.MemberDisplay;
import dev.sheldan.abstracto.giveaway.model.database.Giveaway;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Builder
@Getter
@Setter
public class GiveawayWinnerNotificationMessageModel {
private String title;
private String description;
private String key;
private Long giveawayId;
private MemberDisplay creator;
private MemberDisplay benefactor;
public static GiveawayWinnerNotificationMessageModel fromGiveaway(Giveaway giveaway, String key) {
return GiveawayWinnerNotificationMessageModel
.builder()
.title(giveaway.getTitle())
.description(giveaway.getDescription())
.key(key)
.benefactor(giveaway.getBenefactor() != null ? MemberDisplay.fromAUserInAServer(giveaway.getBenefactor()) : null)
.creator(MemberDisplay.fromAUserInAServer(giveaway.getCreator()))
.giveawayId(giveaway.getGiveawayId().getId())
.build();
}
}

View File

@@ -8,7 +8,7 @@ import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import java.util.concurrent.CompletableFuture;
public interface GiveawayService {
CompletableFuture<Void> createGiveaway(GiveawayCreationRequest giveawayCreationRequest);
CompletableFuture<Long> createGiveaway(GiveawayCreationRequest giveawayCreationRequest);
CompletableFuture<Void> addGiveawayParticipant(Giveaway giveaway, Member member, MessageChannel messageChannel);
CompletableFuture<Void> evaluateGiveaway(Long giveawayId, Long serverId);
CompletableFuture<Void> cancelGiveaway(Long giveawayId, Long serverId);

View File

@@ -0,0 +1,14 @@
package dev.sheldan.abstracto.giveaway.service.management;
import dev.sheldan.abstracto.giveaway.model.database.GiveawayKey;
import java.util.List;
import java.util.Optional;
import net.dv8tion.jda.api.entities.Member;
public interface GiveawayKeyManagementService {
GiveawayKey createGiveawayKey(Member creator, Member benefactor, String key, String description, String name);
void deleteById(Long id, Long serverId);
Optional<GiveawayKey> getById(Long id, Long serverId);
GiveawayKey saveGiveawayKey(GiveawayKey giveawayKey);
List<GiveawayKey> getGiveawayKeys(Long serverId, Boolean ignoreUsedFlag);
}