CampFireID/backend/models/User.ts
2025-03-16 11:25:09 +03:00

82 lines
2.1 KiB
TypeScript

import mongoose, { Schema, Document } from 'mongoose';
export interface IAchievement {
id: string;
name: string;
description: string;
dateUnlocked: Date;
}
export interface IInventoryItem {
itemId: string;
name: string;
description: string;
quantity: number;
imageUrl?: string;
}
export interface IUser extends Document {
telegramId: string;
username: string;
level: number;
experience: number;
balance: number;
achievements: IAchievement[];
inventory: IInventoryItem[];
createdAt: Date;
updatedAt: Date;
}
const UserSchema: Schema = new Schema({
telegramId: { type: String, required: true, unique: true },
username: { type: String, required: true },
level: { type: Number, default: 1 },
experience: { type: Number, default: 0 },
balance: { type: Number, default: 0 },
achievements: [{
id: String,
name: String,
description: String,
dateUnlocked: { type: Date, default: Date.now }
}],
inventory: [{
itemId: String,
name: String,
description: String,
quantity: Number,
imageUrl: String
}]
}, {
timestamps: true
});
// Метод для добавления опыта и повышения уровня
UserSchema.methods.addExperience = async function(amount: number) {
this.experience += amount;
// Простая формула для определения необходимого опыта для следующего уровня
const expNeeded = this.level * 100;
while (this.experience >= expNeeded) {
this.experience -= expNeeded;
this.level += 1;
// Бонус за новый уровень
this.balance += this.level * 10;
}
await this.save();
};
// Метод для добавления достижения
UserSchema.methods.addAchievement = async function(achievement: IAchievement) {
if (!this.achievements.some(a => a.id === achievement.id)) {
this.achievements.push(achievement);
// Награда за достижение
this.balance += 50;
await this.save();
return true;
}
return false;
};
export default mongoose.model<IUser>('User', UserSchema);