You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
标题与标签使用真实粗体:新增 bundled-bold.otf(Noto Sans CJK SC Bold),不再用描边伪粗体。
Added
Notification banners: when you are @mentioned, quoted or sent a private message while the AtomChat panel is open (or within the next 4 seconds), a banner drops in at the top of the panel (sender avatar + type + name + content preview). Clicking it jumps to that message and highlights it briefly; up to three stack at once and each fades out after 4 seconds. With the panel closed no HUD is drawn — only the sound plays and the @N unread badge accumulates.
Notification sounds: the three events above share one bundled pop cue; it also fires while the panel is closed (2s de-duplication keeps spam quiet).
Notification settings: Settings → Chat → Notifications, with four switches (mention banner/sound, whisper banner/sound), a notification volume slider, and a Test sound card.
Fixed
Custom avatars failed to sync in some sessions: if an avatar request went unanswered for 3 seconds — exactly what happens when the other player joins and the integrated server is busiest — the client latched "server has no companion" for the whole session and never synced again. The host side was the most exposed, since conversation cards fire the first request the moment the other player appears. On top of that, the first avatar upload of a session was silently dropped unless a response had already come back. Timeouts now simply retry after a 5s cooldown instead of latching; only the real channel negotiation can mark the server companion-less; uploads pass as soon as negotiation allows; and a debug-gated [avatar] log line was added for each step.
Sender names rendered pure white: the angle-bracket slice branch synthesised a plain literal label, dropping the line's own run colours — every other player's name displayed in the fallback interface text colour. The branch now slices around the brackets run-wise (styles kept), and when a sender carries no colour at all the scoreboard team colour is applied as a fallback (debug builds log a [sender] line).
Panel background colour could not be changed: with blur enabled the panel tint was hardcoded (0xFF16191F), so panelBgColor had no effect at all. Both the blurred and unblurred paths now tint with the configured background colour, and a "Panel background color" row was added to the appearance settings.
Decorated names leaked the angle brackets on public bubbles: when the server wraps the whole decorated name in angle brackets (FTB Teams titles, <[称号]E33EPUS> 453), the e33chat-derived parser only stripped the < before the name, so other players saw <[称号]E33EPUS with the server's underline/click styling still attached. The cleanNameArea whole-wrap branch that was dropped in the port is restored: both the string label and the rich-text slice drop the wrapping pair while keeping the inner title colours.
Own bubbles showed a bare name: the local echo only used the real profile name, so your own title/team prefix never showed. Ported e33chat's ownDisplayName(): tab-list name → decorated name cached from own chat echoes → team prefix/colour/suffix → bare name, applied to both public and private own bubbles; the cache clears on join/disconnect.
Avatar changes never reached the other side mid-session: the avatar cache lives for one session and uploads triggered no notification, so a client that had already cached the old image (or negative-cached "no avatar") kept it until the next join. A successful upload now broadcasts avatar_changed to all clients, which drop that uuid's cache and re-request on the next frame; the channel is optional, so older clients simply ignore it.
The notification settings group could not be folded: the 0.2.5 "Notifications" group was missing from the foldable-group whitelist, so unlike every other settings group it stayed permanently expanded.
0.2.4 banners flung the whole UI off screen (the rolled-back feature, rebuilt): drawBanner pushed a saveLayer without a matching restore, leaking one canvas transform per frame; combined with the per-frame density scale the transform compounded exponentially until the panel flew off screen, which also surfaced as "cannot reopen the panel" and unresponsive keys. Fixed with paired restores, and the HUD draw path is gone — banners render on the panel canvas only.
Changed
Notification cue replaced with an original synthesized pop: the banner sound is now a synthesized bubble pop (sine glide + noise transient) original to this repository, replacing an asset of restricted provenance — releases carry no copyright baggage.
Chat history auto-clean defaults to 7 days: historyRetentionDays changed from 0 (forever) to 7. The "Keep chat history" switch itself stays off by default; when enabled, expired history is pruned weekly instead of growing unbounded.
Skia canvas guard rail: every frame now rewinds to the canvas stack baseline it entered with. A future unbalanced save/restore can corrupt at most one frame instead of compounding into a runaway transform.
Online-only conversation cards: offline private-chat cards no longer stay in the list (no per-rebuild skin resolve/sort for players you cannot message); while they are offline the conversation cannot be opened from the list, the card returns when they join, and the on-disk history is untouched.
Other players' profiles no longer show the session timer: the local session timer is only meaningful for yourself, so it is hidden on other profiles.
Real bold headings and labels: added bundled-bold.otf (Noto Sans CJK SC Bold) instead of stroke-smeared faux bold.