diff --git a/src/apps/drama/models.py b/src/apps/drama/models.py index 3631ea9..d50b812 100644 --- a/src/apps/drama/models.py +++ b/src/apps/drama/models.py @@ -76,7 +76,11 @@ class GameEvent(models.Model): if self.verb == self.SLOT_RELEASED: return f"releases slot {d.get('slot_number', '?')}" if self.verb == self.ROOM_CREATED: - return "opens this room" + # First scroll log on a fresh room — system-authored greeting + # (actor=None upstream). Format intentionally drops the actor + # prefix the rest of the verbs use; the room's title is what + # the welcome line celebrates. + return f"Welcome to {self.room.name}!" if self.verb == self.INVITE_SENT: return "sends an invitation" if self.verb == self.ROLE_SELECT_STARTED: diff --git a/src/apps/epic/tests/integrated/test_views.py b/src/apps/epic/tests/integrated/test_views.py index 5059ec4..5af5660 100644 --- a/src/apps/epic/tests/integrated/test_views.py +++ b/src/apps/epic/tests/integrated/test_views.py @@ -41,6 +41,29 @@ class RoomCreationViewTest(TestCase): response = self.client.get(reverse("epic:create_room")) self.assertRedirects(response, "/gameboard/") + def test_create_room_records_welcome_event_with_no_actor(self): + """First scroll log on a fresh room is a system-authored welcome — + not a user action, so actor=None. The visible greeting is the + ROOM_CREATED event's `to_prose` ("Welcome to !").""" + self.client.post( + reverse("epic:create_room"), + data={"name": "Welcoming Room"}, + ) + room = Room.objects.get(owner=self.user) + event = room.events.first() + self.assertIsNotNone(event, "no ROOM_CREATED event recorded") + self.assertEqual(event.verb, GameEvent.ROOM_CREATED) + self.assertIsNone(event.actor, "welcome line must be system-authored") + + def test_create_room_welcome_event_renders_welcome_prose(self): + self.client.post( + reverse("epic:create_room"), + data={"name": "Greenroom"}, + ) + room = Room.objects.get(owner=self.user) + event = room.events.first() + self.assertEqual(event.to_prose(), "Welcome to Greenroom!") + class MyGamesContextTest(TestCase): def setUp(self): diff --git a/src/apps/epic/views.py b/src/apps/epic/views.py index b62a1c6..652b2d4 100644 --- a/src/apps/epic/views.py +++ b/src/apps/epic/views.py @@ -390,6 +390,10 @@ def create_room(request): name = request.POST.get("name", "").strip() if name: room = Room.objects.create(name=name, owner=request.user) + # System-authored welcome (actor=None) — first scroll log + # on every room. Renders via GameEvent.to_prose as + # "Welcome to !" with no actor prefix. + record(room, GameEvent.ROOM_CREATED) return redirect("epic:gatekeeper", room_id=room.id) return redirect("/gameboard/") diff --git a/src/templates/apps/billboard/_partials/_applet-most-recent-scroll.html b/src/templates/apps/billboard/_partials/_applet-most-recent-scroll.html index dc6a719..de596cc 100644 --- a/src/templates/apps/billboard/_partials/_applet-most-recent-scroll.html +++ b/src/templates/apps/billboard/_partials/_applet-most-recent-scroll.html @@ -9,9 +9,9 @@
Load more…. {% for event in recent_events %} -
+
- {{ event.actor|display_name }} + {% if event.actor %}{{ event.actor|display_name }}{% endif %} {{ event.to_prose|safe }}