<commit_before>import User from "../datastore/User";
import World from "./World";
import Category from "./Category";
import requestRanking from "./requestRanking";
import RankingList from "./RankingList";
import logger from '../logger';

/**
 * 指定されたユーザーのキャラクターを含むランキングリストを取得してきます。
 */
async function rankingFor(user: User): Promise<RankingList> {
    return requestRanking(
        World.map.get(user.world!)!,
        Category.map.get(user.category!)!
    );
}

/**
 * ユーザーとランキングが一致してるか
 */
function suitable(ranking: RankingList, user: User): boolean {
    return ranking.categoryKey === user.category &&
        ranking.worldKey === user.world;
}

/**
 * 同じ日かどうか
 */
function sameDate(date1: Date, date2: Date): boolean {
    return date1 && date2 &&
        date1.getFullYear() === date2.getFullYear() &&
        date1.getMonth() === date2.getMonth() &&
        date1.getDate() === date2.getDate();
}

/**
 * バーっと必要な分を取得してきて情報を取得するよ。
 */
export default async function scraping(): Promise<void> {

    // とりあえず有効な全ユーザーをDatastoreから取得してくる。
    // ワールド・職業別にソートされているよ。
    const users = await User.findAll();

    // だれも登録されていないとき：おやすみ
    if (users.length === 0) { logger.warn('no user.'); return; }

    // とりあえず最初のユーザーの分のランキングを取得
    let ranking = await rankingFor(users[0]);

    // 各ユーザーに対して
    for (const user of users) {

        // このユーザーが今日分のデーターをもう取得していたらスキップするよ。
        // 新規登録したユーザーだとありうるよ。
        const last = user.expData[user.expData.length - 1];
        if (sameDate(last.date, ranking.date)) {
            logger.debug(`skip user ${user.userName}. last: ${last.date}, ranking: ${ranking.date}`);
            continue;
        }

        if (!suitable(ranking, user)) {
            // ランキングがちがったら取得しなおす
            ranking = await rankingFor(user);
        }

        // ランキングリストからそのユーザーのキャラクターを探す
        const data = ranking.characters.find(data => data.name === user.characterName);

        if (data) {
            // のっていたとき
            User.pushExpData(user, {
                date: ranking.date,
                level: data.level,
                exp: data.exp
            });
        } else {
            // のっていなかったとき
            User.pushExpData(user, {
                date: ranking.date
            });
        }

        // そのユーザーの情報を更新
        await User.update(user);
    }

}<commit_msg>change: sleep 10s before request<commit_after>import User from "../datastore/User";
import World from "./World";
import Category from "./Category";
import requestRanking from "./requestRanking";
import RankingList from "./RankingList";
import logger from '../logger';

/**
 * 指定されたユーザーのキャラクターを含むランキングリストを取得してきます。
 */
async function rankingFor(user: User): Promise<RankingList> {
    return requestRanking(
        World.map.get(user.world!)!,
        Category.map.get(user.category!)!
    );
}

/**
 * ユーザーとランキングが一致してるか
 */
function suitable(ranking: RankingList, user: User): boolean {
    return ranking.categoryKey === user.category &&
        ranking.worldKey === user.world;
}

/**
 * 同じ日かどうか
 */
function sameDate(date1: Date, date2: Date): boolean {
    return date1 && date2 &&
        date1.getFullYear() === date2.getFullYear() &&
        date1.getMonth() === date2.getMonth() &&
        date1.getDate() === date2.getDate();
}

/**
 * バーっと必要な分を取得してきて情報を取得するよ。
 */
export default async function scraping(): Promise<void> {

    // とりあえず有効な全ユーザーをDatastoreから取得してくる。
    // ワールド・職業別にソートされているよ。
    const users = await User.findAll();

    // だれも登録されていないとき：おやすみ
    if (users.length === 0) { logger.warn('no user.'); return; }

    // とりあえず最初のユーザーの分のランキングを取得
    let ranking = await rankingFor(users[0]);

    // 各ユーザーに対して
    for (const user of users) {

        // このユーザーが今日分のデーターをもう取得していたらスキップするよ。
        // 新規登録したユーザーだとありうるよ。
        const last = user.expData[user.expData.length - 1];
        if (sameDate(last.date, ranking.date)) {
            logger.debug(`skip user ${user.userName}. last: ${last.date}, ranking: ${ranking.date}`);
            continue;
        }

        if (!suitable(ranking, user)) {
            // ひとやすみ
            await sleep(10000);
            // ランキングがちがったら取得しなおす
            ranking = await rankingFor(user);
        }

        // ランキングリストからそのユーザーのキャラクターを探す
        const data = ranking.characters.find(data => data.name === user.characterName);

        if (data) {
            // のっていたとき
            User.pushExpData(user, {
                date: ranking.date,
                level: data.level,
                exp: data.exp
            });
        } else {
            // のっていなかったとき
            User.pushExpData(user, {
                date: ranking.date
            });
        }

        // そのユーザーの情報を更新
        await User.update(user);
    }

}

async function sleep(time: number): Promise<void> {
    return new Promise<void>(resolve => setTimeout(resolve, time));
}
{'fraction_non_alphanumeric': 0.13721843356065302, 'fraction_numerical': 0.006819590824550527, 'mean_word_length': 2.2461435278336688, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 12, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1753881', 'n_tokens_mistral': 1886, 'n_tokens_neox': 1839, 'n_words': 299}