141 lines
5.2 KiB
JavaScript
141 lines
5.2 KiB
JavaScript
|
|
// Скрипт для mongosh для исправления незасчитанных рефералов
|
|||
|
|
// Использование:
|
|||
|
|
// mongosh "mongodb://your-connection-string/nakama" fixReferrals.mongosh.js
|
|||
|
|
// или
|
|||
|
|
// mongosh nakama --file fixReferrals.mongosh.js
|
|||
|
|
|
|||
|
|
// Функция для получения начала дня по московскому времени (UTC+3)
|
|||
|
|
function getMoscowStartOfDay(date) {
|
|||
|
|
if (!date) {
|
|||
|
|
date = new Date();
|
|||
|
|
}
|
|||
|
|
// Создаем копию даты
|
|||
|
|
const moscowDate = new Date(date);
|
|||
|
|
// Получаем UTC время
|
|||
|
|
const utcTime = moscowDate.getTime() + (moscowDate.getTimezoneOffset() * 60 * 1000);
|
|||
|
|
// Добавляем 3 часа для московского времени
|
|||
|
|
const moscowOffset = 3 * 60 * 60 * 1000;
|
|||
|
|
const moscowTime = new Date(utcTime + moscowOffset);
|
|||
|
|
// Устанавливаем время на 00:00:00
|
|||
|
|
moscowTime.setHours(0, 0, 0, 0);
|
|||
|
|
return moscowTime;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Функция для получения уникальных дат из массива loginDates
|
|||
|
|
function getUniqueDates(loginDates) {
|
|||
|
|
const uniqueDates = new Set();
|
|||
|
|
if (!loginDates || !Array.isArray(loginDates)) {
|
|||
|
|
return uniqueDates;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
loginDates.forEach(date => {
|
|||
|
|
if (!date) return;
|
|||
|
|
const dateObj = getMoscowStartOfDay(new Date(date));
|
|||
|
|
// Используем timestamp начала дня для сравнения
|
|||
|
|
uniqueDates.add(dateObj.getTime());
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
return uniqueDates;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
print("🔍 Поиск пользователей с незасчитанными рефералами...\n");
|
|||
|
|
|
|||
|
|
// Найти всех пользователей с referredBy, но не засчитанных
|
|||
|
|
const usersWithReferrals = db.users.find({
|
|||
|
|
referredBy: { $exists: true, $ne: null },
|
|||
|
|
referralCounted: { $ne: true }
|
|||
|
|
}).toArray();
|
|||
|
|
|
|||
|
|
print(`📊 Найдено ${usersWithReferrals.length} пользователей с незасчитанными рефералами\n`);
|
|||
|
|
|
|||
|
|
let fixed = 0;
|
|||
|
|
let needMoreDays = 0;
|
|||
|
|
let errors = 0;
|
|||
|
|
let skipped = 0;
|
|||
|
|
|
|||
|
|
usersWithReferrals.forEach(user => {
|
|||
|
|
try {
|
|||
|
|
// Получить реферера
|
|||
|
|
const referrer = db.users.findOne({ _id: user.referredBy });
|
|||
|
|
|
|||
|
|
if (!referrer) {
|
|||
|
|
print(`⚠️ Пользователь ${user.username || user._id} имеет referredBy, но реферер не найден\n`);
|
|||
|
|
skipped++;
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Инициализировать loginDates если его нет
|
|||
|
|
if (!user.loginDates || user.loginDates.length === 0) {
|
|||
|
|
print(`📅 ${user.username || user._id}: нет дат входа. Пропускаем.\n`);
|
|||
|
|
needMoreDays++;
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Получить уникальные даты
|
|||
|
|
const uniqueDates = getUniqueDates(user.loginDates);
|
|||
|
|
const uniqueDatesCount = uniqueDates.size;
|
|||
|
|
|
|||
|
|
print(`👤 ${user.username || user._id}`);
|
|||
|
|
print(` Реферер: ${referrer.username || referrer._id}`);
|
|||
|
|
print(` Уникальных дат входа: ${uniqueDatesCount}`);
|
|||
|
|
|
|||
|
|
// Показать даты
|
|||
|
|
const datesArray = Array.from(uniqueDates).map(t => {
|
|||
|
|
const d = new Date(t);
|
|||
|
|
return d.toLocaleDateString('ru-RU');
|
|||
|
|
});
|
|||
|
|
if (datesArray.length > 0) {
|
|||
|
|
print(` Даты: ${datesArray.join(', ')}`);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Если есть 2 или более уникальные даты, засчитать реферала
|
|||
|
|
if (uniqueDatesCount >= 2) {
|
|||
|
|
// Увеличить счетчик рефералов у реферера
|
|||
|
|
const currentCount = referrer.referralsCount || 0;
|
|||
|
|
const newCount = currentCount + 1;
|
|||
|
|
|
|||
|
|
const updateResult = db.users.updateOne(
|
|||
|
|
{ _id: referrer._id },
|
|||
|
|
{ $set: { referralsCount: newCount } }
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
if (updateResult.modifiedCount > 0) {
|
|||
|
|
print(` ✅ РЕФЕРАЛ ЗАСЧИТАН! Новый счетчик: ${newCount}`);
|
|||
|
|
} else {
|
|||
|
|
print(` ⚠️ Не удалось обновить счетчик рефералов`);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Пометить пользователя как засчитанного и очистить loginDates
|
|||
|
|
const userUpdateResult = db.users.updateOne(
|
|||
|
|
{ _id: user._id },
|
|||
|
|
{
|
|||
|
|
$set: {
|
|||
|
|
referralCounted: true,
|
|||
|
|
loginDates: []
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
if (userUpdateResult.modifiedCount > 0) {
|
|||
|
|
print(` ✅ Пользователь помечен как засчитанный\n`);
|
|||
|
|
fixed++;
|
|||
|
|
} else {
|
|||
|
|
print(` ⚠️ Не удалось пометить пользователя как засчитанного\n`);
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
print(` ⏳ Нужно еще ${2 - uniqueDatesCount} уникальных дат входа\n`);
|
|||
|
|
needMoreDays++;
|
|||
|
|
}
|
|||
|
|
} catch (error) {
|
|||
|
|
print(` ❌ Ошибка при обработке пользователя ${user._id}: ${error.message}\n`);
|
|||
|
|
errors++;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
print(`\n📊 Итого:`);
|
|||
|
|
print(` ✅ Засчитано рефералов: ${fixed}`);
|
|||
|
|
print(` ⏳ Требуется больше дней: ${needMoreDays}`);
|
|||
|
|
print(` ⚠️ Пропущено (нет реферера): ${skipped}`);
|
|||
|
|
print(` ❌ Ошибок: ${errors}`);
|
|||
|
|
print(`\n✅ Готово!`);
|