Implements PostTextOrStampAsync: validates membership (NotInGuild),
validates stamp id against UsableStampList (PermissionDenied), rejects
type other than 0 or 1, allocates next per-guild message_id, appends row.
Wires /guild_chat/post controller action mapping failures to result_code=2.
Response is GuildChatPostResponse (empty body per spec). 7 integration tests.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add ChatUserProfile record and IViewerRepository.LoadChatProfilesAsync (AsNoTracking,
projects Name/EmblemId/CountryCode/Rank/DegreeId from Viewer+Info nav refs).
GuildChatController.Messages now injects IViewerRepository instead of SVSimDbContext;
calls LoadChatProfilesAsync to populate users[] (removes direct db access from controller).
GuildChatMessageRepository direction=2 (NEW): change >= start to > start (exclusive).
GuildChatPollTests updated to assert the start message is NOT returned by direction=NEW.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- GuildChatService.EmitSystemEventAsync: replaces no-op stub with real
chat-row insertion via _msgs.AppendAsync (per-guild monotonic id).
- GuildChatService.GetWindowAsync: real implementation — verifies caller
membership, delegates to IGuildChatMessageRepository.GetWindowAsync
(direction 1=OLD/2=NEW/3=BOTH, limit 50), returns adaptive wait interval
(ChatPollActiveSeconds when messages returned, ChatPollIdleSeconds otherwise).
- Drop unused repo injections from GuildChatService (guilds, invites, joinRequests).
- GuildChatController.Messages: wires the full response — chat_message[],
users[] (deduplicated author profiles with Emblem+Degree nav includes),
maintenance_card_list (empty until maintenance service lands), wait_interval.
- GuildChatPollTests (7 integration tests): fresh-guild CreateGuild event,
sequenced Create+Join ordering, direction=NEW filter, direction=BOTH window,
users[] deduplication, empty result for viewer-not-in-guild, active vs idle
interval comparison. All 7 pass; full suite 1515/1515.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>