nakama/backend/scripts/fixUserReferrals.mongosh.js

119 lines
4.4 KiB
JavaScript
Raw Normal View History

2025-12-08 14:57:15 +00:00
// Команды для исправления рефералов конкретного пользователя
// Замените USER_ID на ID пользователя, у которого должны быть рефералы
// ============================================
// 1. НАЙТИ ПОЛЬЗОВАТЕЛЯ ПО USERNAME ИЛИ ID
// ============================================
// var userId = db.users.findOne({ username: "USERNAME" })._id;
// или
// var userId = ObjectId("USER_ID");
// ============================================
// 2. НАЙТИ ВСЕХ РЕФЕРАЛОВ ЭТОГО ПОЛЬЗОВАТЕЛЯ
// ============================================
// db.users.find({ referredBy: userId }).forEach(function(ref) {
// print("Реферал: " + (ref.username || ref._id));
// print(" Засчитан: " + (ref.referralCounted || false));
// print(" Дат входа: " + (ref.loginDates ? ref.loginDates.length : 0));
// if (ref.loginDates && ref.loginDates.length > 0) {
// print(" Даты: " + ref.loginDates.map(function(d) { return new Date(d).toLocaleDateString('ru-RU'); }).join(', '));
// }
// print("---");
// });
// ============================================
// 3. ЗАСЧИТАТЬ ВСЕХ РЕФЕРАЛОВ КОНКРЕТНОГО ПОЛЬЗОВАТЕЛЯ
// (замените USER_ID на ID пользователя)
// ============================================
var userId = ObjectId("ЗАМЕНИТЕ_НА_ID_ПОЛЬЗОВАТЕЛЯ");
// Найти пользователя
var user = db.users.findOne({ _id: userId });
if (!user) {
print("❌ Пользователь не найден!");
} else {
print("👤 Пользователь: " + (user.username || user._id));
print(" Текущий счетчик рефералов: " + (user.referralsCount || 0));
print("\n🔍 Поиск рефералов...\n");
var fixed = 0;
var needMoreDays = 0;
var alreadyCounted = 0;
db.users.find({ referredBy: userId }).forEach(function(ref) {
print("Реферал: " + (ref.username || ref._id));
// Если уже засчитан, пропускаем
if (ref.referralCounted === true) {
print(" ✅ Уже засчитан");
alreadyCounted++;
print("---\n");
return;
}
// Получить уникальные даты
var uniqueDates = new Set();
if (ref.loginDates && Array.isArray(ref.loginDates)) {
ref.loginDates.forEach(function(date) {
if (!date) return;
var d = new Date(date);
d.setHours(0, 0, 0, 0);
uniqueDates.add(d.getTime());
});
}
print(" Уникальных дат: " + uniqueDates.size);
if (uniqueDates.size > 0) {
var datesArray = Array.from(uniqueDates).map(function(t) {
return new Date(t).toLocaleDateString('ru-RU');
});
print(" Даты: " + datesArray.join(', '));
}
// Если есть 2+ уникальные даты, засчитать
if (uniqueDates.size >= 2) {
var newCount = (user.referralsCount || 0) + 1;
// Увеличить счетчик рефералов
db.users.updateOne(
{ _id: userId },
{ $set: { referralsCount: newCount } }
);
// Пометить реферала как засчитанного
db.users.updateOne(
{ _id: ref._id },
{
$set: {
referralCounted: true,
loginDates: []
}
}
);
user.referralsCount = newCount; // Обновить локальную переменную
print(" ✅ ЗАСЧИТАН! Новый счетчик: " + newCount);
fixed++;
} else if (uniqueDates.size > 0) {
print(" ⏳ Нужно еще " + (2 - uniqueDates.size) + " уникальных дат");
needMoreDays++;
} else {
print(" 📅 Нет дат входа");
needMoreDays++;
}
print("---\n");
});
print("\n📊 Итого:");
print(" ✅ Засчитано новых: " + fixed);
print(" ✅ Уже были засчитаны: " + alreadyCounted);
print(" ⏳ Требуется больше дней: " + needMoreDays);
// Обновить счетчик пользователя
var finalUser = db.users.findOne({ _id: userId });
print("\n 📈 Финальный счетчик рефералов: " + (finalUser.referralsCount || 0));
}