mirror of
				https://github.com/HabitRPG/habitica.git
				synced 2025-10-31 05:05:07 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			154 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* eslint-disable no-console */
 | ||
| import { model as User } from '../../website/server/models/user';
 | ||
| 
 | ||
| const MIGRATION_NAME = '20240731_naming_day';
 | ||
| const progressCount = 1000;
 | ||
| let count = 0;
 | ||
| 
 | ||
| async function updateUser (user) {
 | ||
|   count += 1;
 | ||
| 
 | ||
|   let set;
 | ||
|   let push;
 | ||
|   const inc = {
 | ||
|     'items.food.Cake_Base': 1,
 | ||
|     'items.food.Cake_CottonCandyBlue': 1,
 | ||
|     'items.food.Cake_CottonCandyPink': 1,
 | ||
|     'items.food.Cake_Desert': 1,
 | ||
|     'items.food.Cake_Golden': 1,
 | ||
|     'items.food.Cake_Red': 1,
 | ||
|     'items.food.Cake_Shade': 1,
 | ||
|     'items.food.Cake_Skeleton': 1,
 | ||
|     'items.food.Cake_White': 1,
 | ||
|     'items.food.Cake_Zombie': 1,
 | ||
|     'achievements.habiticaDays': 1,
 | ||
|   };
 | ||
| 
 | ||
|   if (user && user.items && user.items.gear && user.items.gear.owned && typeof user.items.gear.owned.back_special_namingDay2020 !== 'undefined') {
 | ||
|     set = { migration: MIGRATION_NAME };
 | ||
|     push = {
 | ||
|       notifications: {
 | ||
|         type: 'ITEM_RECEIVED',
 | ||
|         data: {
 | ||
|           icon: 'notif_namingDay_cake',
 | ||
|           title: 'Happy Naming Day!',
 | ||
|           text: 'To celebrate the day we became Habitica, we’ve awarded you some cake!',
 | ||
|           destination: '/inventory/items',
 | ||
|         },
 | ||
|         seen: false,
 | ||
|       },
 | ||
|     };
 | ||
|   } else if (user && user.items && user.items.gear && user.items.gear.owned && typeof user.items.gear.owned.body_special_namingDay2018 !== 'undefined') {
 | ||
|     set = { migration: MIGRATION_NAME, 'items.gear.owned.back_special_namingDay2020': true };
 | ||
|     push = {
 | ||
|       notifications: {
 | ||
|         type: 'ITEM_RECEIVED',
 | ||
|         data: {
 | ||
|           icon: 'notif_namingDay_back',
 | ||
|           title: 'Happy Naming Day!',
 | ||
|           text: 'To celebrate the day we became Habitica, we’ve awarded you a Royal Purple Gryphon Tail and cake!',
 | ||
|           destination: '/inventory/equipment',
 | ||
|         },
 | ||
|         seen: false,
 | ||
|       },
 | ||
|     };
 | ||
|   } else if (user && user.items && user.items.gear && user.items.gear.owned && typeof user.items.gear.owned.head_special_namingDay2017 !== 'undefined') {
 | ||
|     set = { migration: MIGRATION_NAME, 'items.gear.owned.body_special_namingDay2018': true };
 | ||
|     push = {
 | ||
|       notifications: {
 | ||
|         type: 'ITEM_RECEIVED',
 | ||
|         data: {
 | ||
|           icon: 'notif_namingDay_body',
 | ||
|           title: 'Happy Naming Day!',
 | ||
|           text: 'To celebrate the day we became Habitica, we’ve awarded you a Royal Purple Gryphon Cloak and cake!',
 | ||
|           destination: '/inventory/equipment',
 | ||
|         },
 | ||
|         seen: false,
 | ||
|       },
 | ||
|     };
 | ||
|   } else if (user && user.items && user.items.pets && typeof user.items.pets['Gryphon-RoyalPurple'] !== 'undefined') {
 | ||
|     set = { migration: MIGRATION_NAME, 'items.gear.owned.head_special_namingDay2017': true };
 | ||
|     push = {
 | ||
|       notifications: {
 | ||
|         type: 'ITEM_RECEIVED',
 | ||
|         data: {
 | ||
|           icon: 'notif_namingDay_head',
 | ||
|           title: 'Happy Naming Day!',
 | ||
|           text: 'To celebrate the day we became Habitica, we’ve awarded you a Royal Purple Gryphon Helm and cake!',
 | ||
|           destination: '/inventory/equipment',
 | ||
|         },
 | ||
|         seen: false,
 | ||
|       },
 | ||
|     };
 | ||
|   } else if (user && user.items && user.items.mounts && typeof user.items.mounts['Gryphon-RoyalPurple'] !== 'undefined') {
 | ||
|     set = { migration: MIGRATION_NAME, 'items.pets.Gryphon-RoyalPurple': 5 };
 | ||
|     push = {
 | ||
|       notifications: {
 | ||
|         type: 'ITEM_RECEIVED',
 | ||
|         data: {
 | ||
|           icon: 'notif_namingDay_pet',
 | ||
|           title: 'Happy Naming Day!',
 | ||
|           text: 'To celebrate the day we became Habitica, we’ve awarded you a Royal Purple Gryphon Pet and cake!',
 | ||
|           destination: '/inventory/stable',
 | ||
|         },
 | ||
|         seen: false,
 | ||
|       },
 | ||
|     };
 | ||
|   } else {
 | ||
|     set = { migration: MIGRATION_NAME, 'items.mounts.Gryphon-RoyalPurple': true };
 | ||
|     push = {
 | ||
|       notifications: {
 | ||
|         type: 'ITEM_RECEIVED',
 | ||
|         data: {
 | ||
|           icon: 'notif_namingDay_mount',
 | ||
|           title: 'Happy Naming Day!',
 | ||
|           text: 'To celebrate the day we became Habitica, we’ve awarded you a Royal Purple Gryphon Mount and cake!',
 | ||
|           destination: '/inventory/stable',
 | ||
|         },
 | ||
|         seen: false,
 | ||
|       },
 | ||
|     };
 | ||
|   }
 | ||
| 
 | ||
|   if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
 | ||
| 
 | ||
|   if (push) {
 | ||
|     return user.updateOne({ $set: set, $inc: inc, $push: push }).exec();
 | ||
|   }
 | ||
| 
 | ||
|   return user.updateOne({ $set: set, $inc: inc }).exec();
 | ||
| }
 | ||
| 
 | ||
| export default async function processUsers () {
 | ||
|   const query = {
 | ||
|     migration: { $ne: MIGRATION_NAME },
 | ||
|     'auth.timestamps.loggedin': { $gt: new Date('2024-07-01') },
 | ||
|   };
 | ||
| 
 | ||
|   const fields = {
 | ||
|     _id: 1,
 | ||
|     items: 1,
 | ||
|   };
 | ||
| 
 | ||
|   while (true) { // eslint-disable-line no-constant-condition
 | ||
|     const users = await User // eslint-disable-line no-await-in-loop
 | ||
|       .find(query)
 | ||
|       .limit(250)
 | ||
|       .sort({ _id: 1 })
 | ||
|       .select(fields)
 | ||
|       .exec();
 | ||
| 
 | ||
|     if (users.length === 0) {
 | ||
|       console.warn('All appropriate users found and modified.');
 | ||
|       console.warn(`\n${count} users processed\n`);
 | ||
|       break;
 | ||
|     } else {
 | ||
|       query._id = {
 | ||
|         $gt: users[users.length - 1]._id,
 | ||
|       };
 | ||
|     }
 | ||
| 
 | ||
|     await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop
 | ||
|   }
 | ||
| }
 |