dalexhd/SteamSpeak

View on GitHub
packages/server/src/utils/steam/components/friends.ts

Summary

Maintainability
C
1 day
Test Coverage
import { steamUser } from '@core/Steam';
import lang from '@locales/index';
import SteamUser from 'steam-user';
import SteamID from 'steamid';

/**
 * Check if the bot is friend of steamId
 *
 * @param {(SteamID | string)} steamId- Either a SteamID object of the user to check, or a string which can parse into one.
 * @returns {boolean} true or false
 */
SteamUser.prototype.isFriendOf = function (steamId: SteamID | string): boolean {
    if (typeof steamId == 'string') {
        return steamUser.myFriends.hasOwnProperty(steamId); // Looks like it's already a SteamID
    }
    return steamUser.myFriends.hasOwnProperty(steamId.getSteamID64());
};

/**
 * Get user rich presence string
 *
 * @param {SteamUser.PersonaData} steamData The user steam data
 * @param {number} groupNumber The number assigned to the user
 * @returns {(Promise<string | undefined>)} The rich presence string or undefined
 */
SteamUser.prototype.getPresenceString = async function (
    steamData: SteamUser.PersonaData,
    groupNumber: number
): Promise<string | undefined> {
    if (steamData.rich_presence.length > 0) {
        const rpTokens: any = {};
        steamData.rich_presence.forEach((token) => {
            rpTokens[token.key] = token.value;
        });
        if (!rpTokens.steam_display) {
            const customName = lang.steam.games[steamData.gameid];
            return `${lang.steam.status.Playing} ${lang.message.to} ${customName}`;
        }

        let localizationTokens;
        if (
            steamUser._richPresenceLocalization[steamData.gameid] &&
            lang.steam.tokens[`_${steamData.game_played_app_id}`] &&
            steamUser._richPresenceLocalization[steamData.gameid].timestamp >
                Date.now() - 1000 * 60 * 60 * 24
        ) {
            // We already have localization
            localizationTokens = lang.steam.tokens[`_${steamData.game_played_app_id}`];
        } else {
            try {
                localizationTokens = (
                    await steamUser.getAppRichPresenceLocalization(
                        steamData.gameid,
                        steamUser.options.language || 'english'
                    )
                ).tokens;
            } catch (ex) {
                // Oh well
                delete steamData.rich_presence_string;
                return undefined;
            }
        }
        for (const i in rpTokens) {
            if (rpTokens.hasOwnProperty(i) && localizationTokens[rpTokens[i]]) {
                rpTokens[i] = localizationTokens[rpTokens[i]];
            }
        }
        let rpString: string = rpTokens.steam_display;
        while (true) {
            let newRpString = rpString;
            for (const i in rpTokens) {
                if (rpTokens.hasOwnProperty(i)) {
                    newRpString = newRpString.replace(new RegExp(`%${i}%`, 'gi'), rpTokens[i]);
                }
            }

            (newRpString.match(/{#[^}]+}/g) || []).forEach((token) => {
                const _token = token.substring(1, token.length - 1);
                if (localizationTokens[_token]) {
                    newRpString = newRpString.replace(
                        new RegExp(`{${_token}}`, 'gi'),
                        localizationTokens[_token]
                    );
                }
            });

            if (newRpString === rpString) {
                break;
            } else {
                rpString = newRpString;
            }
        }
        return rpString;
    } else if (steamData.game_played_app_id) {
        const customName = lang.steam.games[steamData.gameid];
        if (customName) {
            return `${lang.steam.status.Playing} ${lang.message.to} ${customName}`;
        } else {
            const productsInfo = await steamUser.getProductInfo([steamData.game_played_app_id], []);
            const app = productsInfo.apps[steamData.game_played_app_id];
            if (
                `#${groupNumber} ${lang.steam.status.Playing} ${lang.message.to} ${app.appinfo.common.name}`
                    .length <= 30
            ) {
                return `${lang.steam.status.Playing} ${lang.message.to} ${app.appinfo.common.name}`;
            } else if (
                steamData.game_name !== '' &&
                `#${groupNumber} ${lang.steam.status.Playing} ${lang.message.to} ${steamData.game_name}`
                    .length <= 30
            ) {
                return `${lang.steam.status.Playing} ${lang.message.to} ${steamData.game_name}`;
            } else {
                return lang.steam.status.Playing;
            }
        }
    }
    return undefined;
};