nakama/backend/scripts/fixAllReferrals.mongosh.js

140 lines
5.0 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Команда для исправления ВСЕХ незасчитанных рефералов
// Выполните в mongosh: load('backend/scripts/fixAllReferrals.mongosh.js')
print("🔍 Поиск всех пользователей с referredBy...\n");
var fixed = 0;
var needMoreDays = 0;
var alreadyCounted = 0;
var noReferrer = 0;
var errors = 0;
// Функция для получения начала дня по московскому времени
function getMoscowStartOfDay(date) {
if (!date) date = new Date();
var d = new Date(date);
// Получаем UTC timestamp
var utcTimestamp = d.getTime();
// Добавляем московское смещение (UTC+3)
var moscowOffset = 3 * 60 * 60 * 1000;
var moscowTime = new Date(utcTimestamp + moscowOffset);
// Устанавливаем начало дня
var year = moscowTime.getUTCFullYear();
var month = moscowTime.getUTCMonth();
var day = moscowTime.getUTCDate();
var moscowStartOfDay = new Date(Date.UTC(year, month, day, 0, 0, 0, 0));
return new Date(moscowStartOfDay.getTime() - moscowOffset);
}
// Найти всех пользователей с referredBy
db.users.find({
referredBy: { $exists: true, $ne: null }
}).forEach(function(user) {
try {
// Пропускаем уже засчитанных
if (user.referralCounted === true) {
alreadyCounted++;
return;
}
// Получить реферера
var referrer = db.users.findOne({ _id: user.referredBy });
if (!referrer) {
print("⚠️ " + (user.username || user._id) + " -> реферер не найден (ID: " + user.referredBy + ")\n");
noReferrer++;
return;
}
// Получить уникальные даты
var uniqueDates = new Set();
if (user.loginDates && Array.isArray(user.loginDates)) {
user.loginDates.forEach(function(date) {
if (!date) return;
try {
var normalizedDate = getMoscowStartOfDay(new Date(date));
uniqueDates.add(normalizedDate.getTime());
} catch (e) {
// Игнорируем ошибки парсинга дат
}
});
}
var uniqueCount = uniqueDates.size;
// Если есть 2+ уникальные даты, засчитать
if (uniqueCount >= 2) {
var currentCount = referrer.referralsCount || 0;
var newCount = currentCount + 1;
// Увеличить счетчик рефералов
db.users.updateOne(
{ _id: referrer._id },
{ $set: { referralsCount: newCount } }
);
// Пометить как засчитанного
db.users.updateOne(
{ _id: user._id },
{
$set: {
referralCounted: true,
loginDates: []
}
}
);
print("✅ ЗАСЧИТАН: " + (user.username || user._id) + " -> " + (referrer.username || referrer._id) + " (счетчик: " + currentCount + " -> " + newCount + ")\n");
fixed++;
} else if (uniqueCount > 0) {
print("⏳ " + (user.username || user._id) + " -> нужно еще " + (2 - uniqueCount) + " дат (сейчас: " + uniqueCount + ")\n");
needMoreDays++;
} else {
// Если нет дат входа, но пользователь существует более суток - засчитать как исключение
var userAge = new Date() - new Date(user.createdAt || user._id.getTimestamp());
var oneDay = 24 * 60 * 60 * 1000;
if (userAge > oneDay) {
// Пользователь существует более суток, засчитываем
var currentCount = referrer.referralsCount || 0;
var newCount = currentCount + 1;
db.users.updateOne(
{ _id: referrer._id },
{ $set: { referralsCount: newCount } }
);
db.users.updateOne(
{ _id: user._id },
{
$set: {
referralCounted: true,
loginDates: []
}
}
);
print("✅ ЗАСЧИТАН (по возрасту >24ч): " + (user.username || user._id) + " -> " + (referrer.username || referrer._id) + " (счетчик: " + currentCount + " -> " + newCount + ")\n");
fixed++;
} else {
print("📅 " + (user.username || user._id) + " -> нет дат входа, возраст: " + Math.round(userAge / (60 * 60 * 1000)) + " часов\n");
needMoreDays++;
}
}
} catch (error) {
print("❌ Ошибка для " + (user.username || user._id) + ": " + error.message + "\n");
errors++;
}
});
print("\n📊 ИТОГО:");
print(" ✅ Засчитано: " + fixed);
print(" ✅ Уже были засчитаны: " + alreadyCounted);
print(" ⏳ Требуется больше дней: " + needMoreDays);
print(" ⚠️ Реферер не найден: " + noReferrer);
print(" ❌ Ошибок: " + errors);
print("\n✅ Готово!");