[AB-53] adding economy related commands

adding runtime exception to root command handling
adding simple custom command module
disabling slash command for show emote the utility is not given (the bot cannot show any emotes from servers its not in)
fixing post target setup not allowing threads
fixing post targets not supporting threads
fixing interactions not considering the actual amount of embeds
fixing some cases for events which are not in a guild
This commit is contained in:
Sheldan
2022-07-21 00:43:04 +02:00
parent 68cae74819
commit 9954515db0
81 changed files with 3717 additions and 108 deletions

View File

@@ -0,0 +1,26 @@
package dev.sheldan.abstracto.entertainment.config;
import dev.sheldan.abstracto.core.config.FeatureConfig;
import dev.sheldan.abstracto.core.config.FeatureDefinition;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Component
public class EconomyFeatureConfig implements FeatureConfig {
public static final String PAYDAY_CREDITS_CONFIG_KEY = "paydayCredits";
public static final String PAYDAY_COOLDOWN_CONFIG_KEY = "paydayCooldown";
public static final String SLOTS_COOLDOWN_CONFIG_KEY = "slotsCooldown";
@Override
public FeatureDefinition getFeature() {
return EntertainmentFeatureDefinition.ECONOMY;
}
@Override
public List<String> getRequiredSystemConfigKeys() {
return Arrays.asList(PAYDAY_CREDITS_CONFIG_KEY, PAYDAY_COOLDOWN_CONFIG_KEY, SLOTS_COOLDOWN_CONFIG_KEY);
}
}

View File

@@ -5,7 +5,7 @@ import lombok.Getter;
@Getter
public enum EntertainmentFeatureDefinition implements FeatureDefinition {
ENTERTAINMENT("entertainment");
ENTERTAINMENT("entertainment"), ECONOMY("economy");
private String key;

View File

@@ -3,4 +3,5 @@ package dev.sheldan.abstracto.entertainment.config;
public class EntertainmentSlashCommandNames {
public static final String ENTERTAINMENT = "entertainment";
public static final String UTILITY = "utility";
public static final String ECONOMY = "economy";
}

View File

@@ -0,0 +1,18 @@
package dev.sheldan.abstracto.entertainment.dto;
import lombok.Builder;
import lombok.Getter;
import java.util.List;
@Builder
@Getter
public class CreditGambleResult {
private List<Integer> rolls;
private Integer uniqueNumbers;
private Long bid;
private Long toBank;
private Long toJackpot;
private Long currentJackpot;
private Boolean won;
}

View File

@@ -0,0 +1,11 @@
package dev.sheldan.abstracto.entertainment.dto;
import lombok.Builder;
import lombok.Getter;
@Builder
@Getter
public class PayDayResult {
private Long currentCredits;
private Long gainedCredits;
}

View File

@@ -0,0 +1,18 @@
package dev.sheldan.abstracto.entertainment.dto;
import lombok.Builder;
import lombok.Getter;
import java.util.List;
@Builder
@Getter
public class SlotsResult {
private Long bid;
private Long oldCredits;
private Long newCredits;
private Long winnings;
private Long factor;
private String outComeKey;
private List<List<String>> rows;
}

View File

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

View File

@@ -0,0 +1,28 @@
package dev.sheldan.abstracto.entertainment.exception;
import dev.sheldan.abstracto.core.exception.AbstractoTemplatableException;
import dev.sheldan.abstracto.entertainment.model.exception.PayDayCooldownExceptionModel;
import java.time.Duration;
public class PayDayCooldownException extends AbstractoTemplatableException {
private final PayDayCooldownExceptionModel model;
public PayDayCooldownException(Duration duration) {
this.model = PayDayCooldownExceptionModel
.builder()
.tryAgainDuration(duration)
.build();
}
@Override
public String getTemplateName() {
return "payday_cooldown_exception";
}
@Override
public Object getTemplateModel() {
return model;
}
}

View File

@@ -0,0 +1,29 @@
package dev.sheldan.abstracto.entertainment.exception;
import dev.sheldan.abstracto.core.exception.AbstractoTemplatableException;
import dev.sheldan.abstracto.entertainment.model.exception.PayDayCooldownExceptionModel;
import dev.sheldan.abstracto.entertainment.model.exception.SlotsCooldownExceptionModel;
import java.time.Duration;
public class SlotsCooldownException extends AbstractoTemplatableException {
private final SlotsCooldownExceptionModel model;
public SlotsCooldownException(Duration duration) {
this.model = SlotsCooldownExceptionModel
.builder()
.tryAgainDuration(duration)
.build();
}
@Override
public String getTemplateName() {
return "slots_cooldown_exception";
}
@Override
public Object getTemplateModel() {
return model;
}
}

View File

@@ -0,0 +1,32 @@
package dev.sheldan.abstracto.entertainment.model.command;
import dev.sheldan.abstracto.entertainment.dto.CreditGambleResult;
import lombok.Builder;
import lombok.Getter;
import java.util.List;
@Getter
@Builder
public class CreditGambleResultModel {
private List<Integer> rolls;
private Integer uniqueNumbers;
private Long bid;
private Long toBank;
private Long toJackpot;
private Long currentJackpot;
private Boolean won;
public static CreditGambleResultModel fromCreditGambleResult(CreditGambleResult creditGambleResult) {
return CreditGambleResultModel
.builder()
.rolls(creditGambleResult.getRolls())
.uniqueNumbers(creditGambleResult.getUniqueNumbers())
.bid(creditGambleResult.getBid())
.toBank(creditGambleResult.getToBank())
.toJackpot(creditGambleResult.getToJackpot())
.currentJackpot(creditGambleResult.getCurrentJackpot())
.won(creditGambleResult.getWon())
.build();
}
}

View File

@@ -0,0 +1,17 @@
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;
import net.dv8tion.jda.api.entities.Member;
@Getter
@Setter
@Builder
public class CreditsLeaderboardEntry {
private MemberDisplay memberDisplay;
private Member member;
private Long credits;
private Integer rank;
}

View File

@@ -0,0 +1,13 @@
package dev.sheldan.abstracto.entertainment.model.command;
import lombok.Builder;
import lombok.Getter;
import java.util.List;
@Getter
@Builder
public class CreditsLeaderboardResponseModel {
private List<CreditsLeaderboardEntry> entries;
private CreditsLeaderboardEntry ownRank;
}

View File

@@ -0,0 +1,10 @@
package dev.sheldan.abstracto.entertainment.model.command;
import lombok.Builder;
import lombok.Getter;
@Getter
@Builder
public class CreditsModel {
private CreditsLeaderboardEntry entry;
}

View File

@@ -0,0 +1,12 @@
package dev.sheldan.abstracto.entertainment.model.command;
import lombok.Builder;
import lombok.Getter;
@Getter
@Builder
public class PayDayResponseModel {
private Long currentCredits;
private Long leaderboardPosition;
private Long gainedCredits;
}

View File

@@ -0,0 +1,32 @@
package dev.sheldan.abstracto.entertainment.model.command;
import dev.sheldan.abstracto.entertainment.dto.SlotsResult;
import lombok.Builder;
import lombok.Getter;
import java.util.List;
@Builder
@Getter
public class SlotsResponseModel {
private Long bid;
private Long oldCredits;
private Long newCredits;
private Long winnings;
private Long factor;
private String outComeKey;
private List<List<String>> rows;
public static SlotsResponseModel fromSlotsResult(SlotsResult result) {
return SlotsResponseModel
.builder()
.bid(result.getBid())
.factor(result.getFactor())
.newCredits(result.getNewCredits())
.outComeKey(result.getOutComeKey())
.oldCredits(result.getOldCredits())
.rows(result.getRows())
.winnings(result.getWinnings())
.build();
}
}

View File

@@ -0,0 +1,12 @@
package dev.sheldan.abstracto.entertainment.model.database;
public interface EconomyLeaderboardResult {
Long getId();
Long getUserid();
Long getCredits();
Integer getRank();
}

View File

@@ -0,0 +1,49 @@
package dev.sheldan.abstracto.entertainment.model.database;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import lombok.*;
import javax.persistence.*;
import java.io.Serializable;
import java.time.Instant;
@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "economy_user")
@Getter
@Setter
@EqualsAndHashCode
public class EconomyUser implements Serializable {
@Id
@Column(name = "id", nullable = false)
private Long id;
@OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@PrimaryKeyJoinColumn
private AUserInAServer user;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "server_id", nullable = false)
private AServer server;
@Column(name = "credits", nullable = false)
private Long credits;
@Column(name = "last_slots", nullable = false)
private Instant lastSlots;
@Column(name = "last_pay_day", nullable = false)
private Instant lastPayDay;
@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,12 @@
package dev.sheldan.abstracto.entertainment.model.exception;
import lombok.Builder;
import lombok.Getter;
import java.time.Duration;
@Builder
@Getter
public class PayDayCooldownExceptionModel {
private Duration tryAgainDuration;
}

View File

@@ -0,0 +1,12 @@
package dev.sheldan.abstracto.entertainment.model.exception;
import lombok.Builder;
import lombok.Getter;
import java.time.Duration;
@Builder
@Getter
public class SlotsCooldownExceptionModel {
private Duration tryAgainDuration;
}

View File

@@ -0,0 +1,41 @@
package dev.sheldan.abstracto.entertainment.service;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.entertainment.dto.CreditGambleResult;
import dev.sheldan.abstracto.entertainment.dto.PayDayResult;
import dev.sheldan.abstracto.entertainment.dto.SlotsResult;
import dev.sheldan.abstracto.entertainment.model.command.CreditsLeaderboardEntry;
import dev.sheldan.abstracto.entertainment.model.database.EconomyUser;
import lombok.Builder;
import lombok.Getter;
import java.time.Duration;
import java.util.List;
public interface EconomyService {
boolean canTriggerPayDay(AUserInAServer aUserInAServer);
boolean canTriggerSlots(AUserInAServer aUserInAServer);
boolean canTriggerPayDay(EconomyUser economyUser);
boolean canTriggerSlots(EconomyUser economyUser);
Duration payDayTriggerIn(EconomyUser economyUser);
Duration slotsTriggerIn(EconomyUser economyUser);
EconomyUser addCredits(AUserInAServer aUserInAServer, Long credits);
void addCredits(EconomyUser economyUser, Long credits);
void addPayDayCredits(AUserInAServer aUserInAServer);
PayDayResult triggerPayDay(AUserInAServer aUserInAServer);
SlotsResult triggerSlots(AUserInAServer aUserInAServer, Long bid);
SlotGame playSlots();
List<CreditsLeaderboardEntry> getCreditLeaderboard(AServer server, Integer page);
CreditsLeaderboardEntry getRankOfUser(AUserInAServer aUserInAServer);
void transferCredits(AUserInAServer source, AUserInAServer target, Long amount);
CreditGambleResult triggerCreditGamble(AUserInAServer aUserInAServer);
@Builder
@Getter
class SlotGame {
private List<List<String>> rows;
private String outcome;
private Integer resultFactor;
}
}

View File

@@ -0,0 +1,16 @@
package dev.sheldan.abstracto.entertainment.service.management;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.entertainment.model.database.EconomyLeaderboardResult;
import dev.sheldan.abstracto.entertainment.model.database.EconomyUser;
import java.util.List;
import java.util.Optional;
public interface EconomyUserManagementService {
EconomyUser createUser(AUserInAServer aUserInAServer);
Optional<EconomyUser> getUser(AUserInAServer aUserInAServer);
EconomyLeaderboardResult getRankOfUserInServer(AUserInAServer aUserInAServer);
List<EconomyUser> getRanksInServer(AServer server, Integer page, Integer size);
}