nakama/backend/scripts/fixReferrals-commands.txt

211 lines
8.5 KiB
Plaintext
Raw 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 для исправления незасчитанных рефералов
// Выполняйте по порядку
// ============================================
// БЫСТРАЯ КОМАНДА ДЛЯ ИСПРАВЛЕНИЯ ВСЕХ РЕФЕРАЛОВ
// ============================================
// Скопируйте и выполните эту команду - она засчитает всех, у кого есть 2+ даты или возраст >24ч
//
// load('backend/scripts/fixAllReferrals.mongosh.js')
//
// ИЛИ выполните команды ниже вручную
// ============================================
// 1. НАЙТИ ВСЕХ ПОЛЬЗОВАТЕЛЕЙ С REFERREDBY (независимо от referralCounted)
// ============================================
db.users.find({
referredBy: { $exists: true, $ne: null }
}).forEach(function(user) {
print("Пользователь: " + (user.username || user._id));
print(" Реферер ID: " + user.referredBy);
print(" Засчитан: " + (user.referralCounted || false));
print(" Дат входа: " + (user.loginDates ? user.loginDates.length : 0));
if (user.loginDates && user.loginDates.length > 0) {
print(" Даты: " + user.loginDates.map(function(d) { return new Date(d).toLocaleDateString('ru-RU'); }).join(', '));
}
print("---");
});
// ============================================
// 2. НАЙТИ ВСЕХ С REFERREDBY И НЕ ЗАСЧИТАННЫХ (включая null и false)
// ============================================
db.users.find({
referredBy: { $exists: true, $ne: null },
$or: [
{ referralCounted: { $exists: false } },
{ referralCounted: null },
{ referralCounted: false }
]
}).forEach(function(user) {
print("Пользователь: " + (user.username || user._id));
print(" Реферер ID: " + user.referredBy);
print(" Дат входа: " + (user.loginDates ? user.loginDates.length : 0));
print("---");
});
// ============================================
// 3. ПРОВЕРИТЬ КОНКРЕТНОГО РЕФЕРЕРА (замените USER_ID)
// ============================================
// db.users.find({ referredBy: ObjectId("69090d0b52ac792c78253963") }).forEach(function(u) {
// print(u.username + " - засчитан: " + (u.referralCounted || false) + ", дат: " + (u.loginDates ? u.loginDates.length : 0));
// });
// ============================================
// 4. ПОСЧИТАТЬ СКОЛЬКО ВСЕГО С REFERREDBY
// ============================================
// db.users.countDocuments({ referredBy: { $exists: true, $ne: null } })
// ============================================
// 5. ПОСЧИТАТЬ СКОЛЬКО НЕ ЗАСЧИТАННЫХ
// ============================================
// db.users.countDocuments({
// referredBy: { $exists: true, $ne: null },
// $or: [
// { referralCounted: { $exists: false } },
// { referralCounted: null },
// { referralCounted: false }
// ]
// })
// ============================================
// 6. ЗАСЧИТАТЬ ВСЕХ РЕФЕРАЛОВ С 2+ УНИКАЛЬНЫМИ ДАТАМИ
// ============================================
db.users.find({
referredBy: { $exists: true, $ne: null },
$or: [
{ referralCounted: { $exists: false } },
{ referralCounted: null },
{ referralCounted: false }
],
loginDates: { $exists: true, $ne: [] }
}).forEach(function(user) {
// Получить уникальные даты
var uniqueDates = new Set();
if (user.loginDates && Array.isArray(user.loginDates)) {
user.loginDates.forEach(function(date) {
if (!date) return;
var d = new Date(date);
d.setHours(0, 0, 0, 0);
uniqueDates.add(d.getTime());
});
}
print("Проверка: " + (user.username || user._id) + " - уникальных дат: " + uniqueDates.size);
// Если есть 2+ уникальные даты, засчитать
if (uniqueDates.size >= 2) {
var referrer = db.users.findOne({ _id: user.referredBy });
if (referrer) {
// Увеличить счетчик рефералов
var newCount = (referrer.referralsCount || 0) + 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) + " (счетчик: " + newCount + ")");
}
} else if (uniqueDates.size > 0) {
print("⏳ Нужно еще дат: " + (user.username || user._id) + " (сейчас: " + uniqueDates.size + ")");
} else {
print("📅 Нет дат входа: " + (user.username || user._id));
}
});
// ============================================
// 7. ПРОВЕРИТЬ РЕЗУЛЬТАТ - СКОЛЬКО РЕФЕРАЛОВ У КОНКРЕТНОГО ПОЛЬЗОВАТЕЛЯ
// ============================================
// db.users.findOne({ _id: ObjectId("69090d0b52ac792c78253963") }, { username: 1, referralsCount: 1, referralCode: 1 })
// ============================================
// 8. НАЙТИ ВСЕХ РЕФЕРАЛОВ КОНКРЕТНОГО ПОЛЬЗОВАТЕЛЯ
// ============================================
// db.users.find({ referredBy: ObjectId("69090d0b52ac792c78253963") }, { username: 1, referralCounted: 1, loginDates: 1 }).forEach(function(u) {
// var dates = u.loginDates ? u.loginDates.length : 0;
// print(u.username + " - засчитан: " + (u.referralCounted || false) + ", дат входа: " + dates);
// });
// ============================================
// 9. ЗАСЧИТАТЬ ВСЕХ РЕФЕРАЛОВ КОНКРЕТНОГО ПОЛЬЗОВАТЕЛЯ
// (замените 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;
db.users.find({ referredBy: userId }).forEach(function(ref) {
if (ref.referralCounted === true) {
print("✅ " + (ref.username || ref._id) + " - уже засчитан");
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());
});
}
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("✅ ЗАСЧИТАН: " + (ref.username || ref._id) + " (счетчик: " + newCount + ")");
fixed++;
} else {
print("⏳ " + (ref.username || ref._id) + " - нужно еще дат (сейчас: " + uniqueDates.size + ")");
needMoreDays++;
}
});
var finalUser = db.users.findOne({ _id: userId });
print("\n📊 Засчитано новых: " + fixed);
print("📈 Финальный счетчик: " + (finalUser.referralsCount || 0));
}
// ============================================
// 10. НАЙТИ ПОЛЬЗОВАТЕЛЯ ПО USERNAME И ИСПРАВИТЬ ЕГО РЕФЕРАЛОВ
// ============================================
// var user = db.users.findOne({ username: "USERNAME" });
// if (user) {
// var userId = user._id;
// // Затем выполните команды из пункта 9, заменив userId
// }
// ============================================
// 11. УСТАНОВИТЬ referralCounted: false ДЛЯ ВСЕХ С REFERREDBY (если нужно сбросить)
// ============================================
// db.users.updateMany(
// {
// referredBy: { $exists: true, $ne: null },
// referralCounted: { $ne: true }
// },
// {
// $set: { referralCounted: false }
// }
// )