+
+
What is a Customer Support Ticket ?
+
+
+ Wargaming's Customer Support (aka CS or Player Support) helps players with any issue related to the game.
+ Submitting a ticket to CS is the best way to get help with your issue, may it be a bug, a technical problem, or a report.
+
+
+
+
+
How is this related to WOWS Karma ?
+
+
+ WOWS Karma is a community-based platform that is separate from the Customer Support system.
+ While endorsed, we are not affiliated to Wargaming. This means that our posts aren't systematically sent to WG for reporting.
+
+
+
+ While CS does occasionally receive some of our posts through tickets,
+ insight from Wargaming shows that this is only a minuscule percentage of the posts currently on our platform.
+
+
+
+
+
Why should I submit a ticket to Customer Support ?
+
+
+ WOWS Karma has no power whatsoever on negative events, and our staff is unable to take action on players.
+ The only party able to effectively take action on players is Wargaming's Customer Support.
+
+
+
+ If you encounter a player that is acting negatively, submitting a ticket to CS is the best way to get them sanctioned.
+ This is why, if you feel that the player you're posting on has broken the rules, we strongly encourage you to submit a ticket right away.
+
+
+
+
+
How do I submit a ticket to Customer Support ?
+
+ To submit a ticket to WG's {{ region() }} Customer Support, you can follow these links depending on your issue :
+
+
+
+
+
+ Once reported, then come back here with your Ticket ID.
+ This will help us, Wargaming, and others know that the affected user has already been reported for a given issue.
+
+
+
diff --git a/wowskarma.app/src/app/shared/modals/cs-ticket-id-help/cs-ticket-id-help.component.ts b/wowskarma.app/src/app/shared/modals/cs-ticket-id-help/cs-ticket-id-help.component.ts
new file mode 100644
index 00000000..79cb23ef
--- /dev/null
+++ b/wowskarma.app/src/app/shared/modals/cs-ticket-id-help/cs-ticket-id-help.component.ts
@@ -0,0 +1,56 @@
+import { ChangeDetectionStrategy, Component, computed, inject, Input } from '@angular/core';
+import { NgbModal, NgbModalRef } from "@ng-bootstrap/ng-bootstrap";
+import { AuthService } from "../../../services/api/services/auth.service";
+import { AppConfigService } from "../../../services/app-config.service";
+
+@Component({
+ selector: 'app-cs-ticket-id',
+ standalone: true,
+ imports: [],
+ templateUrl: './cs-ticket-id-help.component.html',
+ changeDetection: ChangeDetectionStrategy.OnPush
+})
+export class CsTicketIdHelpComponent {
+ @Input() modal!: NgbModalRef;
+
+ appConfig = inject(AppConfigService);
+
+ region = computed(() => this.appConfig.currentRegion);
+
+ csLinks = computed<[string, string]>(() => {
+ /*
+ * In order:
+ * - Gameplay / Collusions
+ * - Chat Issues
+ *
+ * See: https://github.com/SakuraIsayeki/WOWS-Karma/issues/165
+ */
+
+ if (this.region() === 'EU') {
+ return [
+ 'https://eu.wargaming.net/support/en/products/wows/help/29948/29949/29955/29957/',
+ 'https://eu.wargaming.net/support/en/products/wows/help/29948/29949/29951/29952/'
+ ];
+ } else if (this.region() === 'NA') {
+ return [
+ 'https://na.wargaming.net/support/en/products/wows/help/31336/31337/31338/31339/',
+ 'https://na.wargaming.net/support/en/products/wows/help/31336/31337/31345/'
+ ];
+ } else if (this.region() === 'SEA') {
+ return [
+ "https://asia.wargaming.net/support/en/products/wows/help/28687/28688/28689/",
+ "https://asia.wargaming.net/support/en/products/wows/help/28687/28688/28694/"
+ ];
+ }
+
+ return ['', ''];
+ })
+
+ constructor() {
+ }
+
+ static OpenModal(modalService: NgbModal) {
+ const modalRef = modalService.open(CsTicketIdHelpComponent, { size: "lg" });
+ modalRef.componentInstance.modal = modalRef;
+ }
+}
diff --git a/wowskarma.app/src/app/shared/modals/post-editor/post-editor.component.html b/wowskarma.app/src/app/shared/modals/post-editor/post-editor.component.html
index dc658a7b..54bcc245 100644
--- a/wowskarma.app/src/app/shared/modals/post-editor/post-editor.component.html
+++ b/wowskarma.app/src/app/shared/modals/post-editor/post-editor.component.html
@@ -69,20 +69,41 @@
diff --git a/wowskarma.app/src/app/shared/modals/post-editor/post-editor.component.ts b/wowskarma.app/src/app/shared/modals/post-editor/post-editor.component.ts
index 29a33063..ea7067a9 100644
--- a/wowskarma.app/src/app/shared/modals/post-editor/post-editor.component.ts
+++ b/wowskarma.app/src/app/shared/modals/post-editor/post-editor.component.ts
@@ -1,4 +1,4 @@
-import { ChangeDetectionStrategy, Component, HostListener, Input } from "@angular/core";
+import { ChangeDetectionStrategy, Component, HostListener, inject, Input } from "@angular/core";
import { FormBuilder, FormControl, FormGroup, Validators } from "@angular/forms";
import { NgbModal, NgbModalRef } from "@ng-bootstrap/ng-bootstrap";
import { AccountClanListingDto } from "src/app/services/api/models/account-clan-listing-dto";
@@ -9,6 +9,7 @@ import { PostService } from "src/app/services/api/services/post.service";
import { markTouchedDirtyAndValidate, TypedFormControls, TypedFormGroup } from "src/app/services/helpers";
import { parseFlairsEnum, toEnum } from "src/app/services/metricsHelpers";
import * as ReplayValidators from "../../validation/replay-validators";
+import { CsTicketIdHelpComponent } from "../cs-ticket-id-help/cs-ticket-id-help.component";
@Component({
selector: "post-editor",
@@ -19,6 +20,8 @@ export class PostEditorComponent {
@Input() post!: PlayerPostEditorDto;
@Input() modal!: NgbModalRef;
+ modalService = inject(NgbModal);
+
form = new FormBuilder().nonNullable.group({
id: "",
title: ["", [Validators.required, Validators.minLength(5), Validators.maxLength(60)]],
@@ -30,7 +33,11 @@ export class PostEditorComponent {
}),
replayFile: [null as File | null, [ReplayValidators.requireReplay]],
guidelinesAccepted: [false, Validators.requiredTrue],
- modReason: ""
+ modReason: "",
+ supportTicketStatus: new FormBuilder().group({
+ hasTicket: [false],
+ ticketId: [null as number | null, Validators.maxLength(9)],
+ })
})
protected readonly flairsOptions = [
@@ -99,6 +106,9 @@ export class PostEditorComponent {
this.post.replayFile = this.form.controls.replayFile.value;
}
+ const ticketId = this.form.controls.supportTicketStatus.controls.ticketId.value;
+ this.post.supportTicketStatus = { hasTicket: !!ticketId, ticketId };
+
if (create) {
// Create the body as a form data
@@ -130,6 +140,10 @@ export class PostEditorComponent {
console.debug("Submitting post", this.post);
}
+
+ openCsTicketHelp() {
+ CsTicketIdHelpComponent.OpenModal(this.modalService);
+ }
}
export class PlayerPostEditorDto implements PlayerPostDto {
@@ -149,6 +163,7 @@ export class PlayerPostEditorDto implements PlayerPostDto {
replayFile: File | null = null;
guidelinesAccepted: boolean = false;
+ supportTicketStatus: { hasTicket: boolean, ticketId: number | null } = { hasTicket: false, ticketId: null };
static fromDto(dto: PlayerPostDto): PlayerPostEditorDto {
let p = dto as PlayerPostEditorDto;
diff --git a/wowskarma.app/src/app/shared/modals/seed-token-change/seed-token-change.component.scss b/wowskarma.app/src/app/shared/modals/seed-token-change/seed-token-change.component.scss
deleted file mode 100644
index e69de29b..00000000
diff --git a/wowskarma.app/src/app/shared/modals/seed-token-change/seed-token-change.component.ts b/wowskarma.app/src/app/shared/modals/seed-token-change/seed-token-change.component.ts
index 16ee7650..082637bb 100644
--- a/wowskarma.app/src/app/shared/modals/seed-token-change/seed-token-change.component.ts
+++ b/wowskarma.app/src/app/shared/modals/seed-token-change/seed-token-change.component.ts
@@ -7,7 +7,6 @@ import { AppConfigService } from "../../../services/app-config.service";
@Component({
selector: "modal-seed-token-change",
templateUrl: "./seed-token-change.component.html",
- styleUrls: ["./seed-token-change.component.scss"],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class SeedTokenChangeComponent {
diff --git a/wowskarma.app/src/app/shared/post/post.component.html b/wowskarma.app/src/app/shared/post/post.component.html
index 0d2502c5..f1d5cebb 100644
--- a/wowskarma.app/src/app/shared/post/post.component.html
+++ b/wowskarma.app/src/app/shared/post/post.component.html
@@ -1,78 +1,84 @@
-
-
- >
-
-
+
+
+ >
+
+
-
-
-
-
-
-
+
+
-
-
-
-
-
+
+
+
-
-
-
+
+
+
+
+
- @switch (p.replayState) {
- @case (2) {
-
-
-
- }
+
+
+
- @case (1) {
-
-
-
- }
+ @switch (p.replayState) {
+ @case (2) {
+
+
+
+ }
+ @case (1) {
+
+
+
+ }
+ @case (0) {
+
+ }
+ }
- @case (0) {
-
- }
- }
+ @if (p.supportTicketStatus?.hasTicket) {
+ @if (p.supportTicketStatus?.ticketId && isOwnerOrPrivileged()) {
+
+ } @else {
+
+ }
+ }
-
-
-
-
-
+
+
+
+
+
-
diff --git a/wowskarma.app/src/app/shared/post/post.component.ts b/wowskarma.app/src/app/shared/post/post.component.ts
index 7674e79a..8a9cd040 100644
--- a/wowskarma.app/src/app/shared/post/post.component.ts
+++ b/wowskarma.app/src/app/shared/post/post.component.ts
@@ -1,4 +1,4 @@
-import { ChangeDetectionStrategy, Component, input } from "@angular/core";
+import { ChangeDetectionStrategy, Component, computed, input } from "@angular/core";
import { NgbModal } from "@ng-bootstrap/ng-bootstrap";
import { PostModEditorComponent } from 'src/app/shared/modals/post-mod-edit/post-mod-editor.component';
import { PlayerPostDto } from "../../services/api/models/player-post-dto";
@@ -16,6 +16,12 @@ import { PostModDeleteComponent } from "../modals/post-mod-delete/post-mod-delet
export class PostComponent {
public post = input
();
public postDisplayType = input.required<"neutral" | "received" | "sent">();
+ public isOwnerOrPrivileged = computed(() =>
+ this.authService.userInfo$.value?.id === this.post()?.author?.id
+ || this.authService.userInfo$.value?.roles?.includes("mod")
+ || this.authService.userInfo$.value?.roles?.includes("admin")
+ || this.authService.userInfo$.value?.roles?.includes("wg")
+ );
constructor(public authService: AuthService, private modalService: NgbModal) {
}