diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index c4faa19..62218ac 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -10,6 +10,8 @@ import {VipPageComponent} from "./pages/vip-page/vip-page.component"; import {DowngamePageComponent} from "./pages/downgame-page/downgame-page.component"; import {StatisticPageComponent} from "./pages/statistic-page/statistic-page.component"; import {AboutPageComponent} from "./pages/about-page/about-page.component"; +import {KillfeedPageComponent} from "./pages/killfeed-page/killfeed-page.component"; +import {ReportsPageComponent} from "./pages/reports-page/reports-page.component"; const routes: Routes = [ { path: "", component: MainPageComponent}, @@ -20,8 +22,9 @@ const routes: Routes = [ { path: "messages", component: MessagesPageComponent }, { path: "vip", component: VipPageComponent }, { path: "putisRun", component: DowngamePageComponent }, - { path: "statistic", component: StatisticPageComponent }, - { path: "about", component: AboutPageComponent } + { path: "reports", component: ReportsPageComponent }, + { path: "about", component: AboutPageComponent }, + { path: "killfeed", component: KillfeedPageComponent } ]; @NgModule({ diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 54f971f..0b68dea 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -70,6 +70,11 @@ import { DowngamePageComponent } from './pages/downgame-page/downgame-page.compo import { StatisticPageComponent } from './pages/statistic-page/statistic-page.component'; import {DonateSearchTable} from "./pages/internal-components/DonateSearchTable"; import { AboutPageComponent } from './pages/about-page/about-page.component'; +import { KillfeedPageComponent } from './pages/killfeed-page/killfeed-page.component'; +import {KillFeedSearchTable} from "./pages/killfeed-page/KillFeedSearchTable"; +import {FilterMatChipKillFeed} from "./pages/internal-components/search-filters/FilterMatChipKillFeed"; +import { ReportsPageComponent } from './pages/reports-page/reports-page.component'; +import {ReportSearchTable} from "./pages/reports-page/ReportSearchTable"; registerLocaleData(localeRu, "ru") @@ -91,6 +96,8 @@ registerLocaleData(localeRu, "ru") BanlistSearchTable, AnnoncesListCarules, DonateSearchTable, + KillFeedSearchTable, + ReportSearchTable, //search filters FilterMatChipAccount, FilterMatChipMessage, @@ -100,6 +107,7 @@ registerLocaleData(localeRu, "ru") FilterMatChipBanId, FilterMatChipActiveBan, FilterMatChipAdmins, + FilterMatChipKillFeed, //dialogs BanViewDialog, NewsViewDialog, @@ -109,7 +117,9 @@ registerLocaleData(localeRu, "ru") VipPromocodeDialog, DowngamePageComponent, StatisticPageComponent, - AboutPageComponent + AboutPageComponent, + KillfeedPageComponent, + ReportsPageComponent ], imports: [ BrowserModule, diff --git a/src/app/entities/KillFeed.ts b/src/app/entities/KillFeed.ts new file mode 100644 index 0000000..ad48d42 --- /dev/null +++ b/src/app/entities/KillFeed.ts @@ -0,0 +1,14 @@ +export class KillFeed { + id!:number; + attacker_id!:number; + attacker_name!:string; + victim_id!:number; + victim_name!:string; + assister_id!:number; + assister_name!:number; + utime!:number; + weapon_name!:string; + weapon_classname!:string; + server_id!: string; + serverName!: string; +} diff --git a/src/app/entities/Report.ts b/src/app/entities/Report.ts new file mode 100644 index 0000000..83f80b5 --- /dev/null +++ b/src/app/entities/Report.ts @@ -0,0 +1,26 @@ +import {SteamIDs} from "./profile/SteamIDs"; + +export class Report { + id!:number; + a_nickname!:string; + a_permition!:string; + a_kills!:number; + a_deads!:number; + a_seconds!:number; + // + r_nickname!:string; + r_permition!:string; + r_kills!:number; + r_deads!:number; + r_seconds!:number; + // + reasons!: string; + utime!:number; + srv!:string; + online!:number; + type!:string; + actions:string[] = [] + a_steam!:SteamIDs; + r_steam!:SteamIDs; + serverName!:string; +} diff --git a/src/app/entities/search/KillFeedSearchFilter.ts b/src/app/entities/search/KillFeedSearchFilter.ts new file mode 100644 index 0000000..473f4cc --- /dev/null +++ b/src/app/entities/search/KillFeedSearchFilter.ts @@ -0,0 +1,30 @@ +import {SearchFilter} from "./SearchFilter"; +import {MatPaginator} from "@angular/material/paginator"; +import {ParamMap} from "@angular/router"; + +export class KillFeedSearchFilter extends SearchFilter { + mode:string = 'kills'; + + override createQuery(paginator:MatPaginator|undefined): { [p: string]: any } { + let q:{[param: string]: any} = super.createQuery(paginator); + q["mode"] = this.mode; + return q; + } + + + override fromQuery(param: ParamMap,paginator:MatPaginator|undefined) { + try {if (param.get("mode")) { // @ts-ignore + this.mode = param.get("mode");}}catch (e) {} + super.fromQuery(param, paginator); + } + + addModeToSearch(mode:string) { + this.mode = mode; + this.updated = true; + } + + removeModeFromSearch() { + this.mode = 'kills'; + this.updated = true; + } +} diff --git a/src/app/pages/banlist-page/banlist-search-table.ts b/src/app/pages/banlist-page/banlist-search-table.ts index dd9b4b7..bcde246 100644 --- a/src/app/pages/banlist-page/banlist-search-table.ts +++ b/src/app/pages/banlist-page/banlist-search-table.ts @@ -152,6 +152,7 @@ export class BanlistSearchTable extends AbstractSearchTable implements A @Input("use_query") use_query: boolean = true; + @Input("lazy") + lazy: boolean = false; + protected constructor(public authService: AuthService, protected serverService: ServerService, protected playerService: PlayerService, diff --git a/src/app/pages/internal-components/search-filters/FilterMatChipKillFeed.ts b/src/app/pages/internal-components/search-filters/FilterMatChipKillFeed.ts new file mode 100644 index 0000000..1b6eaed --- /dev/null +++ b/src/app/pages/internal-components/search-filters/FilterMatChipKillFeed.ts @@ -0,0 +1,29 @@ +import {Component, Input} from "@angular/core"; +import {KillFeedSearchFilter} from "../../../entities/search/KillFeedSearchFilter"; + +@Component({ + selector: "app-filter-mat-chip-killfeed", + template: ` + Искать: {{getFancy(filter.mode)}} + + + + + ` +}) +export class FilterMatChipKillFeed { + @Input("filter") + filter: KillFeedSearchFilter|undefined; + types:string[] = ['kills','deads','assists']; + + getFancy(text:string):string { + switch (text) { + case "kills": return 'по убийствам'; + case "assists": return 'по помощи'; + case "deads": return 'по смертям'; + default: return ''; + } + } +} diff --git a/src/app/pages/killfeed-page/KillFeedSearchTable.ts b/src/app/pages/killfeed-page/KillFeedSearchTable.ts new file mode 100644 index 0000000..a65aa63 --- /dev/null +++ b/src/app/pages/killfeed-page/KillFeedSearchTable.ts @@ -0,0 +1,166 @@ +import {AbstractSearchTable} from "../internal-components/abstract-search-table.component"; +import {SearchFilter} from "../../entities/search/SearchFilter"; +import {AuthService} from "../../services/auth.service"; +import {ServerService} from "../../services/server.service"; +import {PlayerService} from "../../services/player.service"; +import {ActivatedRoute, Router} from "@angular/router"; +import {VipService} from "../../services/vip.service"; +import {HttpClient} from "@angular/common/http"; +import {map} from "rxjs"; +import {PagingAndSortingPaginator} from "../../entities/PagingAndSortingPaginator"; +import {KillFeedSearchFilter} from "../../entities/search/KillFeedSearchFilter"; +import {KillFeed} from "../../entities/KillFeed"; +import {MatTableDataSource} from "@angular/material/table"; +import {Component} from "@angular/core"; + +@Component({ + selector: 'app-killfeed-search-table', + template: ` +
+ + Искать по... + + + + + + + + + + Обновить + + + + + + + + +
+
+
+ +
+ Слишком много запросов или сервер не отвечает, обнови страницу. +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
Убийца {{row.attacker_name}} + + + + + Помог {{row.assister_name}} + + + + + Умер {{row.victim_name}} + + + + + Время {{row.utime * 1000 | date:"HH:mm dd/MM/yyyy"}} + + + + Оружие {{row.weapon_name}} Сервер {{row.serverName}} + + + +
А вот и такое бывает...
+ + +
+ ` +}) +export class KillFeedSearchTable extends AbstractSearchTable { + displayedColumns: string[] = ['attacker_name', 'assister_name', 'victim_name', 'date', 'weapon', 'server']; + + constructor(authService: AuthService, + serverService: ServerService, + playerService: PlayerService, + router: Router, + route: ActivatedRoute, + private http: HttpClient) { + super(authService, serverService, playerService, route, router); + super.filter = new KillFeedSearchFilter(); + } + + private getStat() { + this.filter.updated = false; + this.loading = true; + this.http.post(`api/profile/killfeed`, this.filter, + {params: + {size: this.paginator?this.paginator.pageSize:20, + page: this.paginator?this.paginator.pageIndex:0, + mode: this.filter.mode } + }).pipe((map((res) => PagingAndSortingPaginator.newObj().fromData(res).updatePaginator(this.paginator)))) + .subscribe((res) => { + this.dataSource = new MatTableDataSource(res.data); + this.err = false; + }, (e) => this.err = true, () => this.loading = false + ) + } + + override updateData() { + if (this.lazy) return; + super.updateData(); + this.getStat(); + } + + lazyInit() { + if (this.lazy) { + this.lazy = false; + this.updateData(); + } + } +} diff --git a/src/app/pages/killfeed-page/killfeed-page.component.scss b/src/app/pages/killfeed-page/killfeed-page.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/killfeed-page/killfeed-page.component.ts b/src/app/pages/killfeed-page/killfeed-page.component.ts new file mode 100644 index 0000000..77cca64 --- /dev/null +++ b/src/app/pages/killfeed-page/killfeed-page.component.ts @@ -0,0 +1,28 @@ +import { Component, OnInit } from '@angular/core'; +import {AuthService} from "../../services/auth.service"; + +@Component({ + selector: 'app-killfeed-page', + styleUrls: ['./killfeed-page.component.scss'], + template: ` +
+

История убийств

+

Всегда приятно узнать сколько тебя раз попустил мгебраток

+
+ +
+
+ + +
+
+ ` +}) +export class KillfeedPageComponent implements OnInit { + + constructor(public authService: AuthService) { } + + ngOnInit(): void { + } + +} diff --git a/src/app/pages/main-page/main-page.component.html b/src/app/pages/main-page/main-page.component.html index 2440d08..98762ce 100644 --- a/src/app/pages/main-page/main-page.component.html +++ b/src/app/pages/main-page/main-page.component.html @@ -75,3 +75,5 @@ + + diff --git a/src/app/pages/main-page/main-page.component.ts b/src/app/pages/main-page/main-page.component.ts index 71262ad..c29820e 100644 --- a/src/app/pages/main-page/main-page.component.ts +++ b/src/app/pages/main-page/main-page.component.ts @@ -16,10 +16,10 @@ export class MainPageComponent implements OnInit { go2urls: {ico: string, name: string, url: string}[] = [ {ico: 'business', name: 'Серверы', url: 'servers'}, {ico: 'border_color', name: 'Правила', url: 'rules'}, - {ico: 'remove_circle', name: 'Банлист', url: 'banlist'}, + {ico: 'remove_circle', name: 'Баны', url: 'banlist'}, {ico: 'stars', name: 'VIP', url: 'vip'}, - {ico: 'rowing', name: 'Статистика', url: 'statistic'}, - {ico: 'message', name: 'Сообщения', url: 'messages'}, + {ico: 'rowing', name: 'Жалобы', url: 'reports'}, + {ico: 'message', name: 'Чат', url: 'messages'}, {ico: 'list_alt', name: 'Киллфид', url: 'killfeed'}, {ico: 'live_help', name: 'О нас', url: 'about'} ] diff --git a/src/app/pages/messages-page/message-search-table.ts b/src/app/pages/messages-page/message-search-table.ts index 634eb93..1854e33 100644 --- a/src/app/pages/messages-page/message-search-table.ts +++ b/src/app/pages/messages-page/message-search-table.ts @@ -141,7 +141,15 @@ export class MessageSearchTable extends AbstractSearchTable - + История банов - + - + История получения VIP - + @@ -141,35 +141,25 @@

Табличку с репортом

- + Сообщения пользователя - + - - - - Убийства на сервере - - -
-

табличку с убийствами

-
-
- + - Смерти на сервере + Убийства/Помощь/Смерти на сервере
-

huy

+
- + Время загрузки данных с сервера (не для пельменя) diff --git a/src/app/pages/reports-page/ReportSearchTable.ts b/src/app/pages/reports-page/ReportSearchTable.ts new file mode 100644 index 0000000..e7c2d90 --- /dev/null +++ b/src/app/pages/reports-page/ReportSearchTable.ts @@ -0,0 +1,168 @@ +import {AbstractSearchTable} from "../internal-components/abstract-search-table.component"; +import {AuthService} from "../../services/auth.service"; +import {ServerService} from "../../services/server.service"; +import {PlayerService} from "../../services/player.service"; +import {ActivatedRoute, Router} from "@angular/router"; +import {HttpClient} from "@angular/common/http"; +import {KillFeedSearchFilter} from "../../entities/search/KillFeedSearchFilter"; +import {SearchFilter} from "../../entities/search/SearchFilter"; +import {map} from "rxjs"; +import {PagingAndSortingPaginator} from "../../entities/PagingAndSortingPaginator"; +import {MatTableDataSource} from "@angular/material/table"; +import {Component} from "@angular/core"; +import {Report} from "../../entities/Report"; + +@Component({ + selector: 'app-report-search-table', + template: ` +
+ + Искать по... + + + + + + + + + Обновить + + + + + + + +
+
+
+ +
+ Слишком много запросов или сервер не отвечает, обнови страницу. +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
Кто пожаловался {{row.a_nickname}} + + + + + К/Д {{row.a_kills}}/{{row.a_deads}} На кого {{row.r_nickname}} + + + + + К/Д {{row.r_kills}}/{{row.r_deads}} Время {{row.utime * 1000 | date:"HH:mm dd/MM/yyyy"}} + + + + Причина {{row.reasons}}Решение {{row.actions.length==0?'не было':row.actions}} Сервер {{row.serverName}} + + + + Игроков {{row.online}}
А вот и такое бывает...
+ + +
+ ` +}) +export class ReportSearchTable extends AbstractSearchTable{ + displayedColumns: string[] = [ + 'author', 'author_kd', + 'reported', 'reported_kd', + 'reasons', 'date','actions','server', 'online']; + + constructor(authService: AuthService, + serverService: ServerService, + playerService: PlayerService, + router: Router, + route: ActivatedRoute, + private http: HttpClient) { + super(authService, serverService, playerService, route, router); + super.filter = new SearchFilter();//todo replace + } + + private getStat() { + this.filter.updated = false; + this.loading = true; + this.http.post(`api/web/reports`, this.filter, {params: + {size: this.paginator?this.paginator.pageSize:20, + page: this.paginator?this.paginator.pageIndex:0} + }).pipe(map((res) => PagingAndSortingPaginator.newObj().fromData(res).updatePaginator(this.paginator))) + .subscribe((res) => { + this.dataSource = new MatTableDataSource(res.data); + this.err = false; + }, (e) => this.err = true, () => this.loading = false + ); + } + + override updateData() { + if (this.lazy) return; + super.updateData(); + this.getStat(); + } + + lazyInit() { + if (this.lazy) { + this.lazy = false; + this.updateData(); + } + } +} diff --git a/src/app/pages/reports-page/reports-page.component.scss b/src/app/pages/reports-page/reports-page.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/reports-page/reports-page.component.ts b/src/app/pages/reports-page/reports-page.component.ts new file mode 100644 index 0000000..3bf630e --- /dev/null +++ b/src/app/pages/reports-page/reports-page.component.ts @@ -0,0 +1,28 @@ +import { Component, OnInit } from '@angular/core'; +import {AuthService} from "../../services/auth.service"; + +@Component({ + selector: 'app-reports-page', + styleUrls: ['./reports-page.component.scss'], + template: ` +
+

Жалобы на игроков

+

Ты можешь отправить жалобу из игры через команду !report

+
+ +
+
+ + +
+
+ ` +}) +export class ReportsPageComponent implements OnInit { + + constructor(public authService: AuthService) { } + + ngOnInit(): void { + } + +} diff --git a/src/app/pages/statistic-page/statistic-page.component.html b/src/app/pages/statistic-page/statistic-page.component.html index f0c544a..a1be241 100644 --- a/src/app/pages/statistic-page/statistic-page.component.html +++ b/src/app/pages/statistic-page/statistic-page.component.html @@ -1,9 +1,26 @@ -
-

Статистика

-

Разнообразная статистика с наших серверов

-
-
+
+

Уникальные игроки

+

За "уникальность" берется игрок который зашел за данный период первый раз и поиграл более 5 минут

+
+ + {{uniq.day}} + игроков за день + + + {{uniq.month}} + игроков за месяц + + + {{uniq.year}} + игроков за год + + + {{uniq.total}} + игроков за всё время + +
+

График онлайна

@@ -49,33 +66,4 @@
-
-

Уникальные игроки

-

За "уникальность" берется игрок который зашел за данный период первый раз и поиграл более 5 минут

-
- - {{uniq.day}} - игроков за день - - - {{uniq.month}} - игроков за месяц - - - {{uniq.year}} - игроков за год - - - {{uniq.total}} - игроков за всё время - -
-
-
-

Последние выданые випки

-
- - -
-
diff --git a/src/app/pages/statistic-page/statistic-page.component.ts b/src/app/pages/statistic-page/statistic-page.component.ts index c59c36a..670dd14 100644 --- a/src/app/pages/statistic-page/statistic-page.component.ts +++ b/src/app/pages/statistic-page/statistic-page.component.ts @@ -46,7 +46,8 @@ export class StatisticPageComponent implements OnInit { constructor(private graphService: GraphService, private actionService: ActionService, private serverService: ServerService, - public authService: AuthService) { } + public authService: AuthService) { + } ngOnInit(): void { this.getServers(); @@ -62,10 +63,12 @@ export class StatisticPageComponent implements OnInit { getServers() { this.serverService.servers.subscribe( (res) => { + console.log(res); const keys = Object.keys(res.data); for (const key of keys) { this.serverList.push({name: res.data[key].name, server_id: key}); } + console.log(this.serverList) } ) } diff --git a/src/app/pages/vip-page/vip-page.component.html b/src/app/pages/vip-page/vip-page.component.html index 7b916e7..e8e9820 100644 --- a/src/app/pages/vip-page/vip-page.component.html +++ b/src/app/pages/vip-page/vip-page.component.html @@ -62,5 +62,13 @@ + +
+

Последние выданые випки

+
+ + +
+
diff --git a/src/app/pages/vip-page/vip-page.component.ts b/src/app/pages/vip-page/vip-page.component.ts index 9566e39..2a6cf56 100644 --- a/src/app/pages/vip-page/vip-page.component.ts +++ b/src/app/pages/vip-page/vip-page.component.ts @@ -5,6 +5,7 @@ import {MatDialog, MatDialogConfig, MatDialogRef} from "@angular/material/dialog import {VipBuyDialog} from "./VipBuyDialog"; import {VipFreeDialog} from "./VipFreeDialog"; import {VipPromocodeDialog} from "./VipPromocodeDialog"; +import {AuthService} from "../../services/auth.service"; @Component({ selector: 'app-vip-page', @@ -35,7 +36,8 @@ export class VipPageComponent implements OnInit { ]; constructor(private vipService: VipService, - private dialog: MatDialog) { } + private dialog: MatDialog, + public authService: AuthService) { } ngOnInit(): void { this.getVips(); diff --git a/src/app/services/server.service.ts b/src/app/services/server.service.ts index a7695d1..35d9721 100644 --- a/src/app/services/server.service.ts +++ b/src/app/services/server.service.ts @@ -7,18 +7,23 @@ import {StatExporter} from "../entities/servers/StatExporter"; providedIn: 'root' }) export class ServerService { + public servers: Observable> = of(); constructor(private http: HttpClient) { - this.http.get(`api/stats?filter=servers`).pipe( + this.getServers().subscribe((res) => { + this.servers = of(res); + console.log(res); + }) + } + + getServers():Observable> { + return this.http.get(`api/stats?filter=servers`).pipe( map((res) => { const d = new StatExporter(); d.fromData(res, 'servers'); return d; - })).subscribe((res) => { - this.servers = of(res); - }) + })) } - servers: Observable> = of(); getStats(filter: string): Observable> { return this.http.get(`api/stats?filter=${filter}`).pipe(