57 lines
1.7 KiB
TypeScript
57 lines
1.7 KiB
TypeScript
import { MatrixClient } from "matrix-js-sdk";
|
|
import type { ICallbackStore } from "../types.js";
|
|
import { config } from "../../config.js";
|
|
import { getRank, getUserById, getUserName } from "../../helpers.js";
|
|
import { state } from "../../store/store.js";
|
|
import type { IUser } from "../../store/types.js";
|
|
let client: MatrixClient;
|
|
|
|
const registerModuleUser = (
|
|
matrixClient: MatrixClient,
|
|
callbackStore: ICallbackStore,
|
|
) => {
|
|
client = matrixClient;
|
|
|
|
callbackStore.messageCallbacks.push({
|
|
startCondition: `${config.app.triggerPrefix}rank`,
|
|
callbackFunc: onRank,
|
|
});
|
|
callbackStore.messageCallbacks.push({
|
|
startCondition: `${config.app.triggerPrefix}leaderboard`,
|
|
callbackFunc: onLeaderboard,
|
|
});
|
|
};
|
|
|
|
const onRank = (_text: string, roomId: string, sender: string) => {
|
|
const rank = getRank(getUserById(sender).experience);
|
|
|
|
client.sendHtmlMessage(
|
|
roomId,
|
|
"",
|
|
`<h3>Your Rank: ${rank.rank}</h3>
|
|
<i>Next rank progress: ${rank.experienceInRank}/${rank.expToNextRank}exp</i>`,
|
|
);
|
|
};
|
|
|
|
const onLeaderboard = (_text: string, roomId: string) => {
|
|
const mapUsersToLeaderboard = (user: IUser): string => {
|
|
const rank = getRank(user.experience);
|
|
|
|
return `<li>${getUserName(user)}: rank ${rank.rank} (${rank.experienceInRank}/${rank.expToNextRank}exp)</li>`;
|
|
};
|
|
|
|
const users = state.users.sort(
|
|
(userA, userB) => userB.experience - userA.experience,
|
|
);
|
|
|
|
client.sendHtmlMessage(
|
|
roomId,
|
|
"",
|
|
`<h3>Leaderboard</h3>
|
|
<ul>
|
|
${users.map(mapUsersToLeaderboard).join("")}
|
|
</ul>`,
|
|
);
|
|
};
|
|
|
|
export { registerModuleUser };
|