Remove fake/periodic notifications (spam)
CI/CD / CI - API (dotnet build + engine sim) (push) Failing after 1m41s
CI/CD / CI - Web (tsc + next build) (push) Failing after 1m19s
CI/CD / Deploy - local stack (db + server + web) (push) Has been skipped

The mock emitted random "a friend is online / event is live" notifications on a
35s timer and the live service forwarded them. Dropped both — only real
notifications now fire (friend requests, achievements, daily reward, payment,
match-ended, and server hub events).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
soroush.asadi
2026-06-05 00:38:08 +03:30
parent fd33f85e9c
commit 1ea3b2b8d2
2 changed files with 3 additions and 27 deletions
+1 -23
View File
@@ -475,34 +475,12 @@ export class MockOnlineService implements OnlineService {
/* --------------------------- notifications ------------------------- */ /* --------------------------- notifications ------------------------- */
private notifCbs = new Set<(n: AppNotification) => void>(); private notifCbs = new Set<(n: AppNotification) => void>();
private notifTimer: ReturnType<typeof setInterval> | null = null;
// Real notifications only — no periodic fake/"liveliness" spam.
onNotification(cb: (n: AppNotification) => void): Unsubscribe { onNotification(cb: (n: AppNotification) => void): Unsubscribe {
this.notifCbs.add(cb); this.notifCbs.add(cb);
if (this.notifTimer == null) {
const samples: Array<Pick<AppNotification, "kind" | "titleFa" | "titleEn" | "icon">> = [
{ kind: "system", titleFa: "یک دوست آنلاین شد", titleEn: "A friend is online", icon: "👋" },
{ kind: "system", titleFa: "مسابقه‌ی امروز شروع شد", titleEn: "Today's event is live", icon: "🏆" },
{ kind: "invite", titleFa: "یک نفر دنبال هم‌بازیه", titleEn: "Someone is looking for a partner", icon: "🎴" },
];
this.notifTimer = setInterval(() => {
if (this.notifCbs.size === 0) return;
const s = pick(samples);
const n: AppNotification = {
id: rid("ntf"),
ts: Date.now(),
read: false,
...s,
};
for (const c of this.notifCbs) c(n);
}, 35000);
}
return () => { return () => {
this.notifCbs.delete(cb); this.notifCbs.delete(cb);
if (this.notifCbs.size === 0 && this.notifTimer) {
clearInterval(this.notifTimer);
this.notifTimer = null;
}
}; };
} }
+2 -4
View File
@@ -58,7 +58,6 @@ export class SignalrService implements OnlineService {
private chatCbs = new Set<(id: string, m: ChatMessage[]) => void>(); private chatCbs = new Set<(id: string, m: ChatMessage[]) => void>();
private forfeitCbs = new Set<(r: ForfeitRequest | null) => void>(); private forfeitCbs = new Set<(r: ForfeitRequest | null) => void>();
private cachedProfile: UserProfile | null = null; private cachedProfile: UserProfile | null = null;
private mockNotifUnsub?: () => void;
constructor() { constructor() {
if (typeof window !== "undefined") { if (typeof window !== "undefined") {
@@ -385,10 +384,9 @@ export class SignalrService implements OnlineService {
onChat(cb: (id: string, m: ChatMessage[]) => void) { this.chatCbs.add(cb); return () => this.chatCbs.delete(cb); } onChat(cb: (id: string, m: ChatMessage[]) => void) { this.chatCbs.add(cb); return () => this.chatCbs.delete(cb); }
onNotification(cb: (n: AppNotification) => void): Unsubscribe { onNotification(cb: (n: AppNotification) => void): Unsubscribe {
// Real notifications only — server hub "notification" events + app-generated
// ones (friend requests, achievements, daily, payment). No fake spam.
this.notifCbs.add(cb); this.notifCbs.add(cb);
// also forward the mock's periodic notifications for liveliness
if (!this.mockNotifUnsub)
this.mockNotifUnsub = this.mock.onNotification((n) => this.notifCbs.forEach((c) => c(n)));
return () => this.notifCbs.delete(cb); return () => this.notifCbs.delete(cb);
} }