| const fs = require("fs"); | |
| const path = require("path"); | |
| const CLAN_FILE = path.join(__dirname, "clans.json"); | |
| const readClans = () => { | |
| if (!fs.existsSync(CLAN_FILE)) { | |
| return {}; | |
| } | |
| const data = fs.readFileSync(CLAN_FILE, "utf-8"); | |
| return JSON.parse(data); | |
| }; | |
| const writeClans = (clanData) => { | |
| fs.writeFileSync(CLAN_FILE, JSON.stringify(clanData, null, 2)); | |
| }; | |
| const playerOnClan = (sender, chat, clanData) => { | |
| const userClan = Object.values(clanData).find( | |
| (c) => c.members && c.members.some((m) => m.id === sender), | |
| ); | |
| return !!userClan; | |
| }; | |
| const setMissions = (clan) => { | |
| const currentDate = new Date().toISOString().slice(0, 10); | |
| const currentWeek = new Date().toISOString().slice(0, 7); | |
| if (!clan.missions) { | |
| clan.missions = { | |
| daily: { | |
| description: "", | |
| progress: 0, | |
| target: 0, | |
| reward: 0, | |
| }, | |
| weekly: { | |
| description: "", | |
| progress: 0, | |
| target: 0, | |
| reward: 0, | |
| }, | |
| }; | |
| } | |
| if (!clan.lastDailyMissionDate || clan.lastDailyMissionDate !== currentDate) { | |
| clan.missions.daily = { | |
| description: "Complete 3 battles", | |
| progress: 0, | |
| target: 3, | |
| reward: 50, | |
| }; | |
| clan.lastDailyMissionDate = currentDate; | |
| } | |
| if ( | |
| !clan.lastWeeklyMissionDate || | |
| clan.lastWeeklyMissionDate !== currentWeek | |
| ) { | |
| clan.missions.weekly = { | |
| description: "Recruit 5 new members", | |
| progress: 0, | |
| target: 5, | |
| reward: 200, | |
| }; | |
| clan.lastWeeklyMissionDate = currentWeek; | |
| } | |
| }; | |
| const updateMissionProgress = (clan, missionType, progress) => { | |
| if (clan.missions[missionType]) { | |
| clan.missions[missionType].progress += progress; | |
| if ( | |
| clan.missions[missionType].progress >= clan.missions[missionType].target | |
| ) { | |
| clan.points = (clan.points || 0) + clan.missions[missionType].reward; | |
| if (missionType === "daily") { | |
| clan.missions.daily.progress = 0; | |
| } else if (missionType === "weekly") { | |
| clan.missions.weekly.progress = 0; | |
| } | |
| return `Mission ${missionType} completed! You earned ${clan.missions[missionType].reward} points.`; | |
| } | |
| } | |
| return `Mission ${missionType} progress has been updated.`; | |
| }; | |
| const updateClanTaskProgress = (clan, progress) => { | |
| if (!clan.clanTasks) { | |
| clan.clanTasks = { | |
| description: "", | |
| progress: 0, | |
| target: 0, | |
| reward: 0, | |
| }; | |
| } | |
| if (clan.clanTasks) { | |
| clan.clanTasks.progress += progress; | |
| if (clan.clanTasks.progress >= clan.clanTasks.target) { | |
| clan.points = (clan.points || 0) + clan.clanTasks.reward; | |
| clan.clanTasks.progress = 0; | |
| return `Clan task completed! The clan earned ${clan.clanTasks.reward} points.`; | |
| } | |
| } | |
| return `Clan task progress has been updated.`; | |
| }; | |
| const upgradeClanLevel = (clan, user) => { | |
| const levelCosts = { | |
| 2: 100, | |
| 3: 200, | |
| 4: 400, | |
| 5: 800, | |
| }; | |
| let nextLevel = clan.level + 1; | |
| let cost = levelCosts[nextLevel]; | |
| if (!cost) return "Maximum level already reached."; | |
| if (user.balance < cost) | |
| return `Insufficient balance. You need ${cost} to upgrade to level ${nextLevel}.`; | |
| user.balance -= cost; | |
| clan.level = nextLevel; | |
| return `Clan successfully upgraded to level ${nextLevel}. Your remaining balance: ${user.balance}.`; | |
| }; | |
| function simulateWinner(clan1, clan2) { | |
| let clan1Power = clan1.power * clan1.members.length; | |
| let clan2Power = clan2.power * clan2.members.length; | |
| if (clan1Power > clan2Power) { | |
| return clan1.clan; | |
| } else if (clan2Power > clan1Power) { | |
| return clan2.clan; | |
| } else { | |
| return "Draw"; | |
| } | |
| } | |
| async function getClanData(clanName) { | |
| let clans = readClans(); | |
| return clans[clanName] || null; | |
| } | |
| function saveClanData(clanName, data) { | |
| let clans = readClans(); | |
| clans[clanName] = data; | |
| writeClans(clans); | |
| } | |
| function saveTournamentData(tournament) { | |
| let clans = readClans(); | |
| clans.tournaments[tournament.name] = tournament; | |
| writeClans(clans); | |
| } | |
| module.exports = { | |
| playerOnClan, | |
| readClans, | |
| writeClans, | |
| setMissions, | |
| updateMissionProgress, | |
| updateClanTaskProgress, | |
| upgradeClanLevel, | |
| simulateWinner, | |
| getClanData, | |
| saveClanData, | |
| saveTournamentData, | |
| }; |