added experience tracking and automatic role assigning at given levels

includes: set role command to set a role to a given level (it clears out previous levels)
automatic level config generation on startup
min/max/multiplier configuration
job to persist the xp of the previous minute
added delayed scheduler start, so that events have a discord context in order to function
added role listener to automatically add and mark roles when they are created/deleted
fixed user in a server not being created correctly
added role service to give users role given by id
added server reference to role
This commit is contained in:
Sheldan
2020-04-11 17:21:55 +02:00
parent 87c97d5069
commit 6a31dfde8a
72 changed files with 1165 additions and 80 deletions

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>utility</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>experience-tracking-int</artifactId>
<dependencies>
<dependency>
<groupId>dev.sheldan.abstracto.templating</groupId>
<artifactId>templating-interface</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>dev.sheldan.abstracto.scheduling</groupId>
<artifactId>scheduling-int</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,20 @@
package dev.sheldan.abstracto.experience.models.database;
import lombok.*;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "experience_level")
@Getter
@Setter
public class AExperienceLevel {
@Id
private Integer level;
private Long experienceNeeded;
}

View File

@@ -0,0 +1,45 @@
package dev.sheldan.abstracto.experience.models.database;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer;
import lombok.*;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "experience_role")
@Getter
@Setter
public class AExperienceRole {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "level_id")
private AExperienceLevel level;
@ManyToOne(fetch = FetchType.LAZY)
@Getter
@Setter
@JoinColumn(name = "server_id")
private AServer roleServer;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "role_id")
private ARole role;
@OneToMany(
fetch = FetchType.LAZY,
cascade = CascadeType.ALL,
orphanRemoval = true)
@Builder.Default
@JoinColumn(name = "experience_role_id")
private List<AUserExperience> users = new ArrayList<>();
}

View File

@@ -0,0 +1,34 @@
package dev.sheldan.abstracto.experience.models.database;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import lombok.*;
import javax.persistence.*;
@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "user_experience")
@Getter
@Setter
public class AUserExperience {
@Id
private Long id;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
private AUserInAServer user;
private Long experience;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "level_id")
private AExperienceLevel currentLevel;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "experience_role_id")
private AExperienceRole currentExperienceRole;
}

View File

@@ -0,0 +1,6 @@
package dev.sheldan.abstracto.experience.service;
public interface ExperienceLevelService {
void createExperienceLevel(Integer level, Long experienceNeeded);
Long calculateExperienceForLevel(Integer level);
}

View File

@@ -0,0 +1,9 @@
package dev.sheldan.abstracto.experience.service;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.experience.models.database.AExperienceRole;
public interface ExperienceRoleService {
void setRoleToLevel(ARole role, Integer level, AServer server);
}

View File

@@ -0,0 +1,20 @@
package dev.sheldan.abstracto.experience.service;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.experience.models.database.AExperienceLevel;
import dev.sheldan.abstracto.experience.models.database.AExperienceRole;
import dev.sheldan.abstracto.experience.models.database.AUserExperience;
import java.util.HashMap;
import java.util.List;
public interface ExperienceTrackerService {
void addExperience(AUserInAServer userInAServer);
HashMap<Long, List<AServer>> getRuntimeExperience();
Integer calculateLevel(AUserExperience userInAServer, List<AExperienceLevel> levels);
AExperienceRole calculateRole(AUserExperience userInAServer, List<AExperienceRole> roles);
void increaseExpForUser(AUserExperience userInAServer, Long experience, List<AExperienceLevel> levels);
void handleExperienceGain(List<AServer> serverExp);
void handleExperienceRoleForUser(AUserExperience userExperience, List<AExperienceRole> roles);
}

View File

@@ -0,0 +1,13 @@
package dev.sheldan.abstracto.experience.service.management;
import dev.sheldan.abstracto.experience.models.database.AExperienceLevel;
import java.util.List;
public interface ExperienceLevelManagementService {
AExperienceLevel createExperienceLevel(Integer level, Long neededExperience);
boolean levelExists(Integer level);
AExperienceLevel getLevel(Integer level);
AExperienceLevel getLevelClosestTo(Long experience);
List<AExperienceLevel> getLevelConfig();
}

View File

@@ -0,0 +1,14 @@
package dev.sheldan.abstracto.experience.service.management;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.experience.models.database.AExperienceLevel;
import dev.sheldan.abstracto.experience.models.database.AExperienceRole;
import java.util.List;
public interface ExperienceRoleManagementService {
void setLevelToRole(AExperienceLevel level, ARole role, AServer server);
void unSetLevelInServer(AExperienceLevel level, AServer server);
List<AExperienceRole> getExperienceRoleForServer(AServer server);
}

View File

@@ -0,0 +1,12 @@
package dev.sheldan.abstracto.experience.service.management;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.experience.models.database.AUserExperience;
public interface UserExperienceManagementService {
void setExperienceTo(AUserExperience aUserInAServer, Long experience);
AUserExperience findUserInServer(AUserInAServer aUserInAServer);
AUserExperience createUserInServer(AUserInAServer aUserInAServer);
void saveUser(AUserExperience userExperience);
}