mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-01-26 22:02:40 +00:00
[AB-xxx] displaying more information on the external leaderboard
This commit is contained in:
@@ -8,6 +8,7 @@ import dev.sheldan.abstracto.core.service.management.ServerManagementService;
|
|||||||
import dev.sheldan.abstracto.experience.model.api.UserExperienceDisplay;
|
import dev.sheldan.abstracto.experience.model.api.UserExperienceDisplay;
|
||||||
import dev.sheldan.abstracto.experience.model.database.AExperienceRole;
|
import dev.sheldan.abstracto.experience.model.database.AExperienceRole;
|
||||||
import dev.sheldan.abstracto.experience.model.database.AUserExperience;
|
import dev.sheldan.abstracto.experience.model.database.AUserExperience;
|
||||||
|
import dev.sheldan.abstracto.experience.service.ExperienceLevelService;
|
||||||
import dev.sheldan.abstracto.experience.service.management.UserExperienceManagementService;
|
import dev.sheldan.abstracto.experience.service.management.UserExperienceManagementService;
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
import net.dv8tion.jda.api.entities.Guild;
|
||||||
import net.dv8tion.jda.api.entities.Member;
|
import net.dv8tion.jda.api.entities.Member;
|
||||||
@@ -37,6 +38,9 @@ public class LeaderboardController {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private GuildService guildService;
|
private GuildService guildService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ExperienceLevelService experienceLevelService;
|
||||||
|
|
||||||
@GetMapping(value = "/leaderboards/{serverId}", produces = "application/json")
|
@GetMapping(value = "/leaderboards/{serverId}", produces = "application/json")
|
||||||
public Page<UserExperienceDisplay> getLeaderboard(@PathVariable("serverId") Long serverId,
|
public Page<UserExperienceDisplay> getLeaderboard(@PathVariable("serverId") Long serverId,
|
||||||
@PageableDefault(value = 25, page = 0)
|
@PageableDefault(value = 25, page = 0)
|
||||||
@@ -55,6 +59,8 @@ public class LeaderboardController {
|
|||||||
AExperienceRole experienceRole = aUserExperience.getCurrentExperienceRole();
|
AExperienceRole experienceRole = aUserExperience.getCurrentExperienceRole();
|
||||||
UserDisplay userDisplay = null;
|
UserDisplay userDisplay = null;
|
||||||
RoleDisplay roleDisplay = null;
|
RoleDisplay roleDisplay = null;
|
||||||
|
Long experienceNeededToNextLevel = experienceLevelService.calculateExperienceToNextLevel(aUserExperience.getCurrentLevel().getLevel(), aUserExperience.getExperience());
|
||||||
|
Long nextLevelExperience = experienceLevelService.calculateNextLevel(aUserExperience.getCurrentLevel().getLevel()).getExperienceNeeded();
|
||||||
if(experienceRole != null) {
|
if(experienceRole != null) {
|
||||||
Role role = guild.getRoleById(experienceRole.getRole().getId());
|
Role role = guild.getRoleById(experienceRole.getRole().getId());
|
||||||
if(role != null) {
|
if(role != null) {
|
||||||
@@ -66,6 +72,9 @@ public class LeaderboardController {
|
|||||||
if(member != null) {
|
if(member != null) {
|
||||||
userDisplay = UserDisplay.fromMember(member);
|
userDisplay = UserDisplay.fromMember(member);
|
||||||
}
|
}
|
||||||
|
Long currentExpNeeded = aUserExperience.getCurrentLevel().getExperienceNeeded();
|
||||||
|
Long experienceWithinLevel = aUserExperience.getExperience() - currentExpNeeded;
|
||||||
|
Long experienceNeededForCurrentLevel = nextLevelExperience - currentExpNeeded;
|
||||||
return UserExperienceDisplay
|
return UserExperienceDisplay
|
||||||
.builder()
|
.builder()
|
||||||
.id(String.valueOf(userId))
|
.id(String.valueOf(userId))
|
||||||
@@ -73,6 +82,11 @@ public class LeaderboardController {
|
|||||||
.level(aUserExperience.getLevelOrDefault())
|
.level(aUserExperience.getLevelOrDefault())
|
||||||
.rank((int) pageable.getOffset() + page.getContent().indexOf(aUserExperience) + 1)
|
.rank((int) pageable.getOffset() + page.getContent().indexOf(aUserExperience) + 1)
|
||||||
.experience(aUserExperience.getExperience())
|
.experience(aUserExperience.getExperience())
|
||||||
|
.experienceToNextLevel(experienceNeededToNextLevel)
|
||||||
|
.currentLevelExperienceNeeded(experienceNeededForCurrentLevel)
|
||||||
|
.experienceOnCurrentLevel(experienceWithinLevel)
|
||||||
|
.percentage(((float) experienceWithinLevel / experienceNeededForCurrentLevel) * 100)
|
||||||
|
.nextLevelExperienceNeeded(nextLevelExperience)
|
||||||
.role(roleDisplay)
|
.role(roleDisplay)
|
||||||
.member(userDisplay)
|
.member(userDisplay)
|
||||||
.build();
|
.build();
|
||||||
|
|||||||
@@ -107,13 +107,13 @@ public class Rank extends AbstractConditionableCommand {
|
|||||||
Long currentExpNeeded = experienceObj.getCurrentLevel().getExperienceNeeded();
|
Long currentExpNeeded = experienceObj.getCurrentLevel().getExperienceNeeded();
|
||||||
Long experienceNeededToNextLevel = experienceLevelService.calculateExperienceToNextLevel(experienceObj.getCurrentLevel().getLevel(), experienceObj.getExperience());
|
Long experienceNeededToNextLevel = experienceLevelService.calculateExperienceToNextLevel(experienceObj.getCurrentLevel().getLevel(), experienceObj.getExperience());
|
||||||
Long nextLevelExperience = experienceLevelService.calculateNextLevel(experienceObj.getCurrentLevel().getLevel()).getExperienceNeeded();
|
Long nextLevelExperience = experienceLevelService.calculateNextLevel(experienceObj.getCurrentLevel().getLevel()).getExperienceNeeded();
|
||||||
Long levelExperience = nextLevelExperience - currentExpNeeded;
|
Long experienceNeededForCurrentLevel = nextLevelExperience - currentExpNeeded;
|
||||||
Long inLevelExperience = experienceObj.getExperience() - currentExpNeeded;
|
Long experienceWithinLevel = experienceObj.getExperience() - currentExpNeeded;
|
||||||
rankModel.setExperienceForCurrentLevel(currentExpNeeded);
|
rankModel.setExperienceForCurrentLevel(currentExpNeeded);
|
||||||
rankModel.setCurrentLevelPercentage(((float) inLevelExperience / levelExperience) * 100);
|
rankModel.setCurrentLevelPercentage(((float) experienceWithinLevel / experienceNeededForCurrentLevel) * 100);
|
||||||
rankModel.setLevelExperience(levelExperience);
|
rankModel.setLevelExperience(experienceNeededForCurrentLevel);
|
||||||
rankModel.setExperienceToNextLevel(experienceNeededToNextLevel);
|
rankModel.setExperienceToNextLevel(experienceNeededToNextLevel);
|
||||||
rankModel.setInLevelExperience(inLevelExperience);
|
rankModel.setInLevelExperience(experienceWithinLevel);
|
||||||
rankModel.setNextLevelExperience(nextLevelExperience);
|
rankModel.setNextLevelExperience(nextLevelExperience);
|
||||||
return templateService.renderEmbedTemplate(RANK_POST_EMBED_TEMPLATE, rankModel, toRender.getGuild().getIdLong());
|
return templateService.renderEmbedTemplate(RANK_POST_EMBED_TEMPLATE, rankModel, toRender.getGuild().getIdLong());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,4 +16,9 @@ public class UserExperienceDisplay {
|
|||||||
private Long experience;
|
private Long experience;
|
||||||
private Long messages;
|
private Long messages;
|
||||||
private RoleDisplay role;
|
private RoleDisplay role;
|
||||||
|
private Long experienceToNextLevel;
|
||||||
|
private Long experienceOnCurrentLevel;
|
||||||
|
private Long currentLevelExperienceNeeded;
|
||||||
|
private Float percentage;
|
||||||
|
private Long nextLevelExperienceNeeded;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,9 +13,32 @@ export const LeaderboardEntry = ({member, index}: { member: ExperienceMember, in
|
|||||||
<span className="inline-flex items-center h-16">
|
<span className="inline-flex items-center h-16">
|
||||||
{member.id.toString()}
|
{member.id.toString()}
|
||||||
</span>;
|
</span>;
|
||||||
|
|
||||||
|
function getDisplayPercentage() {
|
||||||
|
let increased = member.percentage * 100;
|
||||||
|
if(increased % 100 == 0) {
|
||||||
|
return Math.trunc(increased / 100)
|
||||||
|
} else {
|
||||||
|
return Math.trunc(increased) / 100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPercentageDisplay() {
|
||||||
|
return `${member.experienceOnCurrentLevel.toLocaleString()}/${member.currentLevelExperienceNeeded.toLocaleString()} (${getDisplayPercentage()}%)`
|
||||||
|
}
|
||||||
|
|
||||||
|
let memberDetail = <tr>
|
||||||
|
<td colSpan={5}>
|
||||||
|
<div className={`bg-slate-700`}>
|
||||||
|
<div className={`${index % 2 === 0 ? "bg-gray-600" : "bg-gray-800"} text-center`} style={{width: getDisplayPercentage() + '%'}}>
|
||||||
|
<span style={{color: nameColor, whiteSpace: "nowrap"}}>{getPercentageDisplay()}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>;
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<tr className={`${index % 2 === 0 ? "bg-gray-600" : "bg-gray-800"} h-full`} style={{ minHeight: 64}}>
|
<tr className={`${index % 2 === 0 ? "bg-gray-600" : "bg-gray-800"} h-full`} style={{minHeight: 64}}>
|
||||||
<td
|
<td
|
||||||
className="text-center">
|
className="text-center">
|
||||||
{member.rank}
|
{member.rank}
|
||||||
@@ -23,16 +46,17 @@ export const LeaderboardEntry = ({member, index}: { member: ExperienceMember, in
|
|||||||
<td className="px-2 py-3 font-medium whitespace-nowrap text-white flex items-center gap-2">
|
<td className="px-2 py-3 font-medium whitespace-nowrap text-white flex items-center gap-2">
|
||||||
{memberDisplay}
|
{memberDisplay}
|
||||||
</td>
|
</td>
|
||||||
<td className="px-1 py-3 text-center">
|
<td className="px-1 py-3 text-center" style={{color: nameColor}}>
|
||||||
{member.experience.toLocaleString()}
|
{member.experience.toLocaleString()}
|
||||||
</td>
|
</td>
|
||||||
<td className="px-1 py-3 text-center">
|
<td className="px-1 py-3 text-center" style={{color: nameColor}}>
|
||||||
{member.messages.toLocaleString()}
|
{member.messages.toLocaleString()}
|
||||||
</td>
|
</td>
|
||||||
<td className="px-2 py-3 text-center">
|
<td className="px-2 py-3 text-center" style={{color: nameColor}}>
|
||||||
{member.level.toString()}
|
{member.level.toString()}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
{memberDetail}
|
||||||
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -6,6 +6,11 @@ export interface ExperienceMember {
|
|||||||
messages: bigint;
|
messages: bigint;
|
||||||
member: Member | null;
|
member: Member | null;
|
||||||
role: Role | null;
|
role: Role | null;
|
||||||
|
experienceToNextLevel: number;
|
||||||
|
experienceOnCurrentLevel: number;
|
||||||
|
percentage: number;
|
||||||
|
nextLevelExperienceNeeded: number;
|
||||||
|
currentLevelExperienceNeeded: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Member {
|
export interface Member {
|
||||||
|
|||||||
Reference in New Issue
Block a user