| const mongoose = require('mongoose'); |
| const { User, Village } = require('./models'); |
| require('dotenv').config(); |
|
|
| const MONGODB_URI = process.env.MONGODB_URI || 'mongodb://localhost:27017/aurudu_krida'; |
|
|
| if (!process.env.MONGODB_URI) { |
| console.warn('โ ๏ธ WARNING: MONGODB_URI is not set. Defaulting to local instance.'); |
| } |
|
|
| mongoose.connect(MONGODB_URI, { |
| serverSelectionTimeoutMS: 5000, |
| socketTimeoutMS: 45000, |
| }) |
| .then(async () => { |
| console.log('Connected to MongoDB ๐ฟ'); |
| |
| try { |
| await User.collection.dropIndex('tgId_1'); |
| console.log('Dropped old User tgId index'); |
| } catch (e) { } |
| try { |
| await Village.collection.dropIndex('villageId_1'); |
| console.log('Dropped old Village villageId index'); |
| } catch (e) { } |
| }) |
| .catch(err => { |
| console.error('โ MongoDB connection error:', err.message); |
| }); |
|
|
| async function recordWin(gameType, winnerTgId, villageId, winnerName, villageName, isVillageBattle = false) { |
| if (!winnerTgId) return; |
|
|
| try { |
| |
| let user = await User.findById(winnerTgId); |
| if (!user) { |
| user = new User({ _id: winnerTgId, name: winnerName }); |
| } |
|
|
| user.name = winnerName; |
| user.totalWins += 1; |
| if (user.gameStats[gameType] !== undefined) { |
| user.gameStats[gameType] += 1; |
| } |
| user.lastVillageId = villageId; |
| user.lastVillageName = villageName; |
| user.lastSeen = new Date(); |
| await user.save(); |
|
|
| |
| if (villageId && villageId !== 'Global') { |
| let village = await Village.findById(villageId); |
| if (!village) { |
| village = new Village({ _id: villageId, name: villageName }); |
| } |
| village.points += isVillageBattle ? 20 : 10; |
| village.lastActive = new Date(); |
| await village.save(); |
| } |
|
|
| console.log(`๐ Recorded win for ${winnerName} in ${gameType} (${villageName})`); |
| } catch (error) { |
| console.error('Error recording win:', error); |
| } |
| } |
|
|
| async function getVillageLeaderboard() { |
| return await Village.find().sort({ points: -1 }).limit(10); |
| } |
|
|
| async function getGameLeaderboard(gameType, villageId = null) { |
| const query = {}; |
| if (villageId && villageId !== 'Global' && villageId !== 'Global Village') { |
| query.lastVillageId = villageId; |
| } |
|
|
| if (gameType && gameType !== 'global') { |
| query[`gameStats.${gameType}`] = { $gt: 0 }; |
| return await User.find(query) |
| .sort({ [`gameStats.${gameType}`]: -1 }) |
| .limit(10); |
| } |
| return await User.find(query).sort({ totalWins: -1 }).limit(10); |
| } |
|
|
| async function getUserProfile(tgId) { |
| if (!tgId) return null; |
| return await User.findById(tgId); |
| } |
|
|
| async function getVillagePlayers(villageId) { |
| if (!villageId || villageId === 'Global' || villageId === 'Global Village') return []; |
| return await User.find({ lastVillageId: villageId }).sort({ totalWins: -1 }).limit(10); |
| } |
|
|
| module.exports = { |
| recordWin, |
| getVillageLeaderboard, |
| getGameLeaderboard, |
| getVillagePlayers, |
| getUserProfile |
| }; |
|
|