packages/server/src/core/Steam/games/csgo.ts
import { steamUser } from '@core/Steam';
import GlobalOffensive from 'globaloffensive';
import { TeamSpeakClient } from '@core/TeamSpeak';
import log from '@utils/log';
import BetterQueue from 'better-queue';
import SteamUser from 'steam-user';
let csgo: any;
export const main = async function (
data: SteamUser.PersonaData,
client: TeamSpeakClient | undefined,
user: VerifiedClientDocument
): Promise<void> {
if (
data.diff?.game_played_app_id?.to === info.appId ||
(data.diff?.rich_presence?.from.find((e) => e.key === 'game:state')?.value === 'game' &&
data.diff?.rich_presence?.to.find((e) => e.key === 'game:state')?.value === 'lobby' &&
data.diff?.rich_presence?.from.find((e) => e.key === 'game:mode')?.value === 'competitive' &&
data.diff?.rich_presence?.to.find((e) => e.key === 'game:mode') === undefined)
) {
const { steamId } = user;
const queue = new BetterQueue(function (data) {
log.info(`Processing ${data.steamId}'s rank...`, { type: 'csgo' });
// eslint-disable-next-line @typescript-eslint/no-this-alias
const self = this;
csgo.requestPlayersProfile(data.steamId, (response) => {
data.response = response;
self.finishBatch(data);
});
});
queue.push({
steamId
});
queue.on('task_finish', function (taskId, result) {
const rankId = result.response.ranking.rank_id;
const nextRankGroupId = info.config.data.ranks[rankId].toString();
const delGroups = client?.servergroups?.filter(
(serverGroup) =>
info.config.data.ranks.map(String).includes(serverGroup) &&
serverGroup !== nextRankGroupId
);
if (delGroups && delGroups.length > 0) {
client?.delGroups(delGroups);
log.info(`Removed ${delGroups.join(', ')} groups to ${client?.nickname}`, { type: 'csgo' });
}
if (!client?.servergroups?.includes(nextRankGroupId)) {
client?.addGroups(nextRankGroupId);
log.info(`Added ${nextRankGroupId} group to ${client?.nickname}`, { type: 'csgo' });
}
log.success(
`${client?.nickname}'s rank has been fetched and it's value is: ${rankId}`,
'csgo'
);
});
}
};
export const load = async function (): Promise<void> {
csgo = new GlobalOffensive(steamUser);
const listener = function (): void {
log.success('Connected to GC', { type: 'csgo' });
csgo.removeListener('connectedToGC', listener);
};
csgo.on('connectedToGC', listener);
steamUser.gamesPlayed(info.appId);
};
export const unload = function (): void {
steamUser.gamesPlayed([]);
};
export const info = {
appId: 730,
name: 'Counter-Strike: Global Offensive',
config: {
enabled: false,
data: {
ranks: [
285, // Unranked
267, // Silver I
268, // Silver II
268, // Silver III
270, // Silver IV
271, // Silver Elite
272, // Silver Elite Master
273, // Gold Nova I
274, // Gold Nova II
275, // Gold Nova III
276, // Gold Nova Master
277, // Master Guardian I
278, // Master Guardian II
279, // Master Guardian Elite
280, // Distinguished Master Guardian
281, // Legendary Eagle
282, // Legendary Eagle Master
283, // Supreme Master First Class
284 // The Global Elite
]
}
}
};