[AB-63] adding pressF command

fixing not setting the won flag for giveaway participants
This commit is contained in:
Sheldan
2023-12-11 01:26:07 +01:00
parent 4b3038078e
commit 52c805f4ea
32 changed files with 890 additions and 7 deletions

View File

@@ -12,6 +12,7 @@ public class EntertainmentFeatureConfig implements FeatureConfig {
public static final String ROULETTE_BULLETS_CONFIG_KEY = "rouletteBullets";
public static final String ROLL_DEFAULT_HIGH_KEY = "rollDefaultHigh";
public static final String PRESS_F_DEFAULT_DURATION_SECONDS = "pressFDefaultDurationSeconds";
@Override
public FeatureDefinition getFeature() {
return EntertainmentFeatureDefinition.ENTERTAINMENT;
@@ -19,6 +20,6 @@ public class EntertainmentFeatureConfig implements FeatureConfig {
@Override
public List<String> getRequiredSystemConfigKeys() {
return Arrays.asList(ROULETTE_BULLETS_CONFIG_KEY, ROLL_DEFAULT_HIGH_KEY);
return Arrays.asList(ROULETTE_BULLETS_CONFIG_KEY, ROLL_DEFAULT_HIGH_KEY, PRESS_F_DEFAULT_DURATION_SECONDS);
}
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.entertainment.exception;
import dev.sheldan.abstracto.core.exception.AbstractoTemplatableException;
public class AlreadyPressedFException extends AbstractoTemplatableException {
@Override
public String getTemplateName() {
return "already_pressed_f_exception";
}
@Override
public Object getTemplateModel() {
return new Object();
}
}

View File

@@ -0,0 +1,14 @@
package dev.sheldan.abstracto.entertainment.model.command;
import dev.sheldan.abstracto.core.models.template.display.MemberDisplay;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Builder
@Setter
@Getter
public class PressFJoinModel {
private MemberDisplay memberDisplay;
private Long messageId;
}

View File

@@ -0,0 +1,13 @@
package dev.sheldan.abstracto.entertainment.model.command;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Builder
@Setter
@Getter
public class PressFPromptModel {
private String text;
private String pressFComponentId;
}

View File

@@ -0,0 +1,14 @@
package dev.sheldan.abstracto.entertainment.model.command;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Builder
@Setter
@Getter
public class PressFResultModel {
private Long userCount;
private String text;
private Long messageId;
}

View File

@@ -0,0 +1,62 @@
package dev.sheldan.abstracto.entertainment.model.database;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import jakarta.persistence.*;
import lombok.*;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "press_f")
@Getter
@Setter
@EqualsAndHashCode
public class PressF {
@Id
@Column(name = "id", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "creator_user_id", nullable = false)
private AUserInAServer creator;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "server_id", nullable = false)
private AServer server;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "press_f_channel_id", nullable = false)
private AChannel pressFChannel;
@Column(name = "message_id", nullable = false)
private Long messageId;
@Column(name = "text")
private String text;
@Column(name = "target_date", nullable = false)
private Instant targetDate;
@Column(name = "created", nullable = false, insertable = false, updatable = false)
private Instant created;
@Column(name = "updated", insertable = false, updatable = false)
private Instant updated;
@OneToMany(
fetch = FetchType.LAZY,
orphanRemoval = true,
cascade = {CascadeType.PERSIST, CascadeType.MERGE},
mappedBy = "pressF")
@Builder.Default
private List<PressFPresser> presser = new ArrayList<>();
}

View File

@@ -0,0 +1,38 @@
package dev.sheldan.abstracto.entertainment.model.database;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.entertainment.model.database.embed.PressFPresserId;
import jakarta.persistence.*;
import lombok.*;
import java.time.Instant;
@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "press_f_presser")
@Getter
@Setter
@EqualsAndHashCode
public class PressFPresser {
@EmbeddedId
@Getter
private PressFPresserId id;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)
@MapsId("presserId")
@JoinColumn(name = "press_f_presser_user_in_server_id", nullable = false)
private AUserInAServer presser;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(updatable = false, insertable = false, name = "press_f_id", referencedColumnName = "id")
private PressF pressF;
@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,27 @@
package dev.sheldan.abstracto.entertainment.model.database.embed;
import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import lombok.*;
import java.io.Serializable;
@Embeddable
@Getter
@Setter
@Builder
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class PressFPresserId implements Serializable {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "press_f_presser_user_in_server_id")
private Long presserId;
@Column(name = "press_f_id")
private Long pressFId;
}

View File

@@ -1,9 +1,13 @@
package dev.sheldan.abstracto.entertainment.service;
import dev.sheldan.abstracto.entertainment.exception.ReactDuplicateCharacterException;
import dev.sheldan.abstracto.entertainment.model.command.PressFPromptModel;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.channel.middleman.GuildMessageChannel;
import java.time.Duration;
import java.util.List;
import java.util.concurrent.CompletableFuture;
public interface EntertainmentService {
String getEightBallValue(String text);
@@ -12,6 +16,10 @@ public interface EntertainmentService {
boolean executeRoulette(Member memberExecuting);
String takeChoice(List<String> choices, Member memberExecuting);
String createMockText(String text, Member memberExecuting, Member mockedUser);
PressFPromptModel getPressFModel(String text);
void persistPressF(String text, Duration duration, Member executingMember, String componentId, GuildMessageChannel guildMessageChannel, Long messageId);
CompletableFuture<Void> evaluatePressF(Long pressFId);
/**
* Converts the given text to unicode characters (with predefined values from a manual mapping) and returns the matched

View File

@@ -0,0 +1,13 @@
package dev.sheldan.abstracto.entertainment.service.management;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.entertainment.model.database.PressF;
import java.time.Instant;
import java.util.Optional;
public interface PressFManagementService {
PressF createPressF(String text, Instant targetDate, AUserInAServer creator, AChannel channel, Long messageId);
Optional<PressF> getPressFById(Long pressFId);
}

View File

@@ -0,0 +1,10 @@
package dev.sheldan.abstracto.entertainment.service.management;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.entertainment.model.database.PressF;
import dev.sheldan.abstracto.entertainment.model.database.PressFPresser;
public interface PressFPresserManagementService {
PressFPresser addPresser(PressF pressF, AUserInAServer presser);
boolean didUserAlreadyPress(PressF pressF, AUserInAServer aUserInAServer);
}