# Birthday Plugin

Standalone Lumi plugin for birthday profile settings, chat commands, Discord birthday announcements, and optional echonomy birthday gifts.

## Install

Install `updates/lumi-plugin-birthday-v0.1.0.zip` through Admin -> Plugins. The ZIP is built from the contents of this folder, so `plugin.json` is at the ZIP root.

## Commands

- `!birthday` shows help and the caller's stored birthday when available.
- `!birthday set YYYY/MM/DD` stores a full birthday.
- `!birthday set MM/DD` stores a birthday without a year.
- `!birthday unset` removes the caller's birthday.
- `!birthday <user>` looks up a Lumi user by internal username, linked display name, provider user ID, or Discord mention.
- `!birthday claim` claims the configured gift when manual gift mode is enabled.

The `bday` alias is also registered. The command supports Discord, Twitch, and YouTube command contexts.

## WebUI

- Admin/mod page: `/plugins/birthday`
- Owner profile section: rendered on `/profile` through `web.addProfileSection`
- Visitor birthday card: `/plugins/birthday/u/:username`

Lumi currently exposes an owner profile section hook, but this repository does not expose a separate public visitor profile hook for plugins. Because of that, visitor display is implemented as the plugin route above instead of being injected into a core public profile page.

## Storage

Birthdays are stored in plugin-owned tables:

- `birthday_profiles`
- `birthday_deliveries`

Plugin settings are stored in `plugin_settings` with `plugin_id = 'birthday'`.

## Notes

- Accepted date formats are `YYYY/MM/DD` and `MM/DD`.
- Dash-separated dates and `DD/MM` dates are rejected.
- Default privacy is `limited`.
- If echonomy is not loaded, birthday announcements still work and gifts are skipped.
- Automatic gifts are delivered once per birthday occurrence. Manual gifts are claimed once per birthday occurrence.
