import { DatePipe, DecimalPipe } from '@angular/common'; import { Title } from '@angular/platform-browser'; import { trigger, state, style, animate, transition } from '@angular/animations'; import { Component, DestroyRef, inject, OnInit } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { MatCardModule } from '@angular/material/card'; import { MatButtonModule } from '@angular/material/button'; import { MatDividerModule } from '@angular/material/divider'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; import { MatTabsModule } from '@angular/material/tabs'; import { ListErrorsComponent, GuildwarAttackComponent, GuildwarDefenceComponent } from 'src/app/components/shared'; import { Errors, HWActivityStat, HWGuildClan, HWMember, HWMemberStat, HWWeekStat } from 'src/app/core/models'; import { UtilitiesService } from 'src/app/core/services'; import guildData from 'src/files-data/hw-guild-data.json'; // page Membres import guildStatistics from 'src/files-data/hw-guild-statistics.json'; // page Overview -> Statistics @Component({ selector: 'app-herowars-guildwar', standalone: true, imports: [ DatePipe, DecimalPipe, FormsModule, ListErrorsComponent, MatButtonModule, MatCardModule, MatDividerModule, MatFormFieldModule, MatIconModule, MatInputModule, MatTabsModule, GuildwarAttackComponent, GuildwarDefenceComponent ], templateUrl: './herowars-guildwar.component.html', styleUrl: './herowars-guildwar.component.scss', animations: [ trigger('flyInOut', [ state('in', style({ transform: 'translateY(0)' })), transition('void => *', [ style({ transform: 'translateY(-100%)' }), animate(200) ]), transition('* => void', [ style({ transform: 'translateY(100%)' }), animate(200) ]) ]) ] }) export class HerowarsGuildwarComponent implements OnInit { public title = 'Guild War'; public subtitle = 'Log'; public description = 'Tools in working progress.'; public errors: Errors = { errors: {} }; public destroyRef = inject(DestroyRef); public now = new Date(); public daysToWarn = 1; public clanLoaded = false; public membersLoaded = false; private _guildClan: HWGuildClan = {} as HWGuildClan; private _guildMembers: HWMember[] = []; private _guildInfo: HWActivityStat = {} as HWActivityStat; constructor( private _titleService: Title, private _utilitiesService: UtilitiesService ) { } ngOnInit() { this._titleService.setTitle(this.title); } private _resetActivity(): HWActivityStat { const activity: HWActivityStat = { activity: 0, prestige: 0, titanite: 0, war: 0, adventure: 0, gifts: 0, score: 0, scoreGifts: 0, warGifts: 0, rewards: 0 }; return activity; } private _importMembers() { try { const oneDayInSec = (24 * 60 * 60); const daysToKick = parseInt(guildData.clan.daysToKick); this.daysToWarn = (parseInt(guildData.clan.daysToKick) / 2); for (const data of Object.entries(guildData.clan.members)) { const member: HWMember = {} as HWMember; Object.assign(member, data[1]); if (guildData.clan.warriors.indexOf(parseInt(member.id)) !== -1) { member.champion = true; } else { member.champion = false; } member.heroes = { power: 0, teams: []}; member.titans = { power: 0, teams: []}; this._guildMembers.push(member); } this._guildMembers.map((data) => { const last = new Date((parseInt(data.lastLoginTime) * 1000)); const exp = new Date(last.getTime() + ((daysToKick * oneDayInSec) * 1000)); const diff = Math.floor(((exp.getTime() - this.now.getTime()) / 1000)); const daysLeft = Math.floor((diff / oneDayInSec)); let timeLeft = diff; if (daysLeft >= 1) { timeLeft = (diff - (daysLeft * oneDayInSec)); } data.inactivity = { daysLeft: daysLeft, timeLeft: timeLeft, dropDelay: `${daysLeft}d, ${this._utilitiesService.secondsToDuration(timeLeft)}`, dropDate: Math.floor((exp.getTime() / 1000)) }; data.raids = []; data.raidsInfo = { variationAvg: 0, variationSum: 0 }; data.stat = {} as HWMemberStat; let index = guildData.membersStat.findIndex(stat => stat.userId === data.id); if (index !== -1) { delete (guildData.membersStat[index] as {userId?: string}).userId; Object.assign(data.stat, guildData.membersStat[index]); //data.stat = guildData.membersStat[index]; } index = guildStatistics.stat.findIndex(stat => stat.id === data.id); if (index !== -1) { delete (guildStatistics.stat[index] as {id?: string}).id; const stat: HWWeekStat = {} as HWWeekStat; Object.assign(stat, guildStatistics.stat[index]); data.weekStat = stat; data.adventureSum = guildStatistics.stat[index].adventureStat.reduce((accumulator, currentValue) => accumulator + currentValue, 0); data.clanGiftsSum = guildStatistics.stat[index].clanGifts.reduce((accumulator, currentValue) => accumulator + currentValue, 0); data.clanWarSum = guildStatistics.stat[index].clanWarStat.reduce((accumulator, currentValue) => accumulator + currentValue, 0); this._guildClan.sumTotal.adventure += data.adventureSum; this._guildClan.sumTotal.gifts += data.clanGiftsSum; this._guildClan.sumTotal.war += data.clanWarSum; } data.score = (data.stat.dungeonActivitySum + data.stat.activitySum + data.stat.prestigeSum); data.warGifts = (((this._guildClan.giftsCount / 2) * ((data.clanWarSum * 10) / 100)) / 20); this._guildClan.todayTotal.activity += data.stat.todayActivity; this._guildClan.todayTotal.prestige += data.stat.todayPrestige; this._guildClan.todayTotal.titanite += data.stat.todayDungeonActivity; this._guildClan.todayTotal.score += (data.stat.todayDungeonActivity + data.stat.todayActivity + data.stat.todayPrestige); this._guildClan.sumTotal.activity += data.stat.activitySum; this._guildClan.sumTotal.prestige += data.stat.prestigeSum; this._guildClan.sumTotal.titanite += data.stat.dungeonActivitySum; this._guildClan.sumTotal.score += data.score; this._guildClan.sumTotal.warGifts += data.warGifts; data.scoreGifts = 0; data.rewards = 0; return data; }); this._guildClan.sumTotal.scoreGifts = (this._guildClan.giftsCount - Math.floor(this._guildClan.sumTotal.warGifts)); this._guildClan.todayAverages.activity = (this._guildClan.todayTotal.activity / this._guildMembers.length); this._guildClan.todayAverages.prestige = (this._guildClan.todayTotal.prestige / this._guildMembers.length); this._guildClan.todayAverages.titanite = (this._guildClan.todayTotal.titanite / this._guildMembers.length); this._guildClan.todayAverages.score = (this._guildClan.todayTotal.score / this._guildMembers.length); this._guildClan.sumAverages.activity = (this._guildClan.sumTotal.activity / this._guildMembers.length); this._guildClan.sumAverages.prestige = (this._guildClan.sumTotal.prestige / this._guildMembers.length); this._guildClan.sumAverages.titanite = (this._guildClan.sumTotal.titanite / this._guildMembers.length); this._guildClan.sumAverages.war = (this._guildClan.sumTotal.war / 20); this._guildClan.sumAverages.adventure = (this._guildClan.sumTotal.adventure / this._guildMembers.length); this._guildClan.sumAverages.gifts = (this._guildClan.sumTotal.gifts / this._guildMembers.length); this._guildClan.sumAverages.score = (this._guildClan.sumTotal.score / this._guildMembers.length); this._guildMembers.map((data) => { data.scoreGifts = ((data.score / this._guildClan.sumTotal.score) * this._guildClan.sumTotal.scoreGifts); data.rewards = Math.floor((data.scoreGifts + data.warGifts)); this._guildClan.sumTotal.rewards += data.rewards; return data; }); this._guildClan.sumAverages.rewards = (this._guildClan.sumTotal.rewards / this._guildMembers.length); console.log(this._guildClan); console.log(this._guildMembers); } catch (error) { console.error(error); } } getClan(): HWGuildClan { return this._guildClan; } loadClan(): void { Object.assign(this._guildClan, guildData.clan); this._guildClan.sumAverages = this._resetActivity(); this._guildClan.sumTotal = this._resetActivity(); this._guildClan.todayAverages = this._resetActivity(); this._guildClan.todayTotal = this._resetActivity(); this.clanLoaded = true; } loadMembers(): void { this._importMembers(); this.membersLoaded = true; } getMembers(): HWMember[] { return this._guildMembers; } syncClan(): void { console.log(this._guildClan); } syncMembers(): void { console.log(this._guildMembers); } }