diff --git a/.github/workflows/event-validation.yml b/.github/workflows/event-validation.yml new file mode 100644 index 00000000..06d6e5ad --- /dev/null +++ b/.github/workflows/event-validation.yml @@ -0,0 +1,28 @@ +name: Event Validation + +on: + push: + branches: + - main + pull_request: + +jobs: + validate-events: + + name: Validate Events + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: 3.8 + + - name: Install dependencies + run: python -m pip install -r events/requirements.txt + + - name: Run event validation script + run: python events/validation.py diff --git a/.gitignore b/.gitignore index e43b0f98..aaf9a05b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,8 @@ +# Apple things .DS_Store + +# JetBrains stuff +.idea/ + +# Contributors may want to generate a local Pipfile for event validation +Pipfile* diff --git a/README.md b/README.md index cd5c3147..9812a67d 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ If you'd like to link to us, one possible description you could use is below: The lemoji emotes found in `emotes/lemoji` are adapted from various emoji in [Twitter's Twemoji pack](https://twemoji.twitter.com/). We're using their lemon emoji as the base, and many of the features are taken and adapted from other emojis. These are all licensed under the same license as Twemoji, which is [Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/). -A part of Diwali assets found in `seasonal/diwali` is made by `visnezh` from [freepik](https://www.freepik.com/free-vector/colorful-mandala-with-floral-shapes_974305.htm). +A part of Diwali assets found in `events/diwali` is made by `visnezh` from [freepik](https://www.freepik.com/free-vector/colorful-mandala-with-floral-shapes_974305.htm). Our logos are derivatives of the official Python logo. More information on how their assets are licensed can be found on [their trademarks page](https://www.python.org/psf/trademarks/). diff --git a/events/README.md b/events/README.md new file mode 100644 index 00000000..4fe3c439 --- /dev/null +++ b/events/README.md @@ -0,0 +1,93 @@ +# Events + +This directory contains branding for events celebrated by Python Discord. Events are automatically discovered by the [Python](https://github.com/python-discord/bot/) bot and have their assets applied to the Discord guild when active. As such, event directories must follow a specific structure. + +## Event directory structure + +For an event directory to be valid, it has to contain the following assets. + +### `meta.md` + +Meta files consist of two sections: a [YAML frontmatter](https://assemble.io/docs/YAML-front-matter.html) with the event's metadata, and a Markdown description. + +In the frontmatter of each such file, each event must either be registered as the fallback: + +```yaml +fallback: true +``` + +Or have a specified period: + +```yaml +start_date: July 10 +end_date: July 20 +``` + +There must be exactly 1 fallback event, and 0 or more non-fallback events. Events cannot collide in time, and the end date must either be equal to the start date (1 day event) or chronologically subsequent. Both bounds are inclusive, and the format shown in the example above must be followed. + +The markdown section of the meta file then contains the event's description. Descriptions are made available directly in the Discord guild as embeds sent by the Python bot. For formatting, use Discord's watered down Markdown ~ keep in mind that e.g. the `#` symbol does not create a heading. + +A description is required to exist, and must be at most 2048 characters in length to fit into a Discord embed. + +### `banner.png` + +Singular image asset to be used as the guild banner while the event is active. + +If you're wondering about the desired dimensions, take a look at existing assets for reference. + +### `server_icons` + +Directory with 1 or more icon assets. The bot will automatically rotate icons from this directory at a configured frequency. Subdirectories in `server_icons` are simply ignored ~ only icons present directly in `server_icons` are considered. + +If an event fails to satisfy these conditions, it will be ignored by Python. + +## Reference event + +Below is an example of a well configured event: + +``` +├── events/ +│ ├── christmas/ +│ │ ├── misc_assets/ +│ │ │ ├── festive.svg +│ │ ├── server_icons/ +│ │ │ ├── snowing.gif +│ │ │ ├── festive.png +│ │ ├── banner.png +│ │ ├── meta.md +│ │ ├── reindeer.mp4 +``` +``` +--- +start_date: December 1 +end_date: December 25 +--- +**Christmas!** + +I wonder what I'm getting this year! +``` + +In this case, on the 1st of December, the bot will: +* Apply `banner.png` +* Begin rotating `snowing.gif` and `festive.png` +* Send a `#changelog` notification with the event description + +On the 26th, the transition into the next event takes place. + +Files such as `festive.svg` and `reindeer.mp4` are simply ignored. The bot doesn't use them, but doesn't mind them being there. + +## Automatic validation + +Fortunately, it is not necessary to manually verify that all events are configured properly w.r.t. the requirements explained above. The `validation.py` script contains logic to ascertain correct setup, and will automatically run in CI on pull requests to prevent a broken configuration from reaching the production branch. + +Validation happens in two stages. First, all events are checked individually, to ensure that they contain all necessary assets and have a correctly structured `meta.md` file. If all events pass, the second stage verifies that there is exactly 1 fallback event, and that no events collide. In the case of collision, the exact dates and culprit events are printed. + +We depend on a minimal set of non-stdlib packages to parse meta files: [python-frontmatter](https://pypi.org/project/python-frontmatter/) wrapping around [pyyaml](https://pypi.org/project/PyYAML/). The exact version pins are provided in `requirements.txt` with the recommended Python version to use. + +If you'd prefer to create a virtual environment with Pipenv, it is possible with the following command: + +``` +pipenv install -r events/requirements.txt +``` + +This will spawn a lockfile that you can sync from. Please make sure that you do not accidentally commit the Pipenv-generated files. diff --git a/events/black_history_month/black_history_month_banner.svg b/events/black_history_month/assets/banner.svg similarity index 100% rename from events/black_history_month/black_history_month_banner.svg rename to events/black_history_month/assets/banner.svg diff --git a/events/black_history_month/black_history_month.svg b/events/black_history_month/assets/icon.svg similarity index 100% rename from events/black_history_month/black_history_month.svg rename to events/black_history_month/assets/icon.svg diff --git a/events/black_history_month/black_history_month_cornerless.png b/events/black_history_month/assets/icon_cornerless.png similarity index 100% rename from events/black_history_month/black_history_month_cornerless.png rename to events/black_history_month/assets/icon_cornerless.png diff --git a/events/black_history_month/black_history_month_banner.png b/events/black_history_month/banner.png similarity index 100% rename from events/black_history_month/black_history_month_banner.png rename to events/black_history_month/banner.png diff --git a/events/black_history_month/meta.md b/events/black_history_month/meta.md new file mode 100644 index 00000000..8dbf5732 --- /dev/null +++ b/events/black_history_month/meta.md @@ -0,0 +1,7 @@ +--- +start_date: February 16 +end_date: February 29 +--- +**Black History Month** + +[Black History Month](https://en.wikipedia.org/wiki/Black_History_Month) is an annual celebration of the people and historical events of the African diaspora. Historically, its significance lied in an encouragement of teaching the history of Black Americans in public schools. However, the event's importance and popularity have grown over the years, and BHM is now officially recognised and celebrated world-wide. diff --git a/events/black_history_month/black_history_month.png b/events/black_history_month/server_icons/icon.png similarity index 100% rename from events/black_history_month/black_history_month.png rename to events/black_history_month/server_icons/icon.png diff --git a/seasonal/christmas/2018/festive.min.svg b/events/christmas/2018/festive.min.svg similarity index 100% rename from seasonal/christmas/2018/festive.min.svg rename to events/christmas/2018/festive.min.svg diff --git a/seasonal/christmas/2018/festive.png b/events/christmas/2018/festive.png similarity index 100% rename from seasonal/christmas/2018/festive.png rename to events/christmas/2018/festive.png diff --git a/seasonal/christmas/2018/festive.svg b/events/christmas/2018/festive.svg similarity index 100% rename from seasonal/christmas/2018/festive.svg rename to events/christmas/2018/festive.svg diff --git a/seasonal/christmas/2018/festive_256.png b/events/christmas/2018/festive_256.png similarity index 100% rename from seasonal/christmas/2018/festive_256.png rename to events/christmas/2018/festive_256.png diff --git a/seasonal/christmas/2018/festive_512.png b/events/christmas/2018/festive_512.png similarity index 100% rename from seasonal/christmas/2018/festive_512.png rename to events/christmas/2018/festive_512.png diff --git a/seasonal/christmas/2018/festive_64.png b/events/christmas/2018/festive_64.png similarity index 100% rename from seasonal/christmas/2018/festive_64.png rename to events/christmas/2018/festive_64.png diff --git a/seasonal/christmas/2018/festive_large.png b/events/christmas/2018/festive_large.png similarity index 100% rename from seasonal/christmas/2018/festive_large.png rename to events/christmas/2018/festive_large.png diff --git a/seasonal/christmas/2018/festive_transparent.png b/events/christmas/2018/festive_transparent.png similarity index 100% rename from seasonal/christmas/2018/festive_transparent.png rename to events/christmas/2018/festive_transparent.png diff --git a/seasonal/christmas/2019/banner.png b/events/christmas/2019/banner.png similarity index 100% rename from seasonal/christmas/2019/banner.png rename to events/christmas/2019/banner.png diff --git a/seasonal/christmas/2019/festive_256.gif b/events/christmas/2019/festive_256.gif similarity index 100% rename from seasonal/christmas/2019/festive_256.gif rename to events/christmas/2019/festive_256.gif diff --git a/seasonal/christmas/2019/festive_64.gif b/events/christmas/2019/festive_64.gif similarity index 100% rename from seasonal/christmas/2019/festive_64.gif rename to events/christmas/2019/festive_64.gif diff --git a/seasonal/christmas/2019/sticker.png b/events/christmas/2019/sticker.png similarity index 100% rename from seasonal/christmas/2019/sticker.png rename to events/christmas/2019/sticker.png diff --git a/seasonal/christmas/2019/tshirt_template.png b/events/christmas/2019/tshirt_template.png similarity index 100% rename from seasonal/christmas/2019/tshirt_template.png rename to events/christmas/2019/tshirt_template.png diff --git a/seasonal/christmas/2020/tshirt_template.png b/events/christmas/2020/tshirt_template.png similarity index 100% rename from seasonal/christmas/2020/tshirt_template.png rename to events/christmas/2020/tshirt_template.png diff --git a/seasonal/christmas/banner.png b/events/christmas/banner.png similarity index 100% rename from seasonal/christmas/banner.png rename to events/christmas/banner.png diff --git a/events/christmas/meta.md b/events/christmas/meta.md new file mode 100644 index 00000000..9aed17ff --- /dev/null +++ b/events/christmas/meta.md @@ -0,0 +1,7 @@ +--- +start_date: December 1 +end_date: December 25 +--- +**Christmas** + +[Christmas](https://en.wikipedia.org/wiki/Christmas) in an annual festival that occurs on December 25, and commemorates the birth of Jesus Christ. It is a very widespread religious and cultural celebration. In the western world, one of the most notable Christmas traditions is the exchange of gifts between family members on the night of the 24th. Another common tradition is decorating a Christmas tree with bells, candles and ornaments. diff --git a/seasonal/christmas/server_icons/festive_256.gif b/events/christmas/server_icons/festive_256.gif similarity index 100% rename from seasonal/christmas/server_icons/festive_256.gif rename to events/christmas/server_icons/festive_256.gif diff --git a/seasonal/diwali/assets/diwali.min.svg b/events/diwali/assets/diwali.min.svg similarity index 100% rename from seasonal/diwali/assets/diwali.min.svg rename to events/diwali/assets/diwali.min.svg diff --git a/seasonal/diwali/assets/diwali.png b/events/diwali/assets/diwali.png similarity index 100% rename from seasonal/diwali/assets/diwali.png rename to events/diwali/assets/diwali.png diff --git a/seasonal/diwali/assets/diwali.svg b/events/diwali/assets/diwali.svg similarity index 100% rename from seasonal/diwali/assets/diwali.svg rename to events/diwali/assets/diwali.svg diff --git a/seasonal/diwali/assets/diwali_256.png b/events/diwali/assets/diwali_256.png similarity index 100% rename from seasonal/diwali/assets/diwali_256.png rename to events/diwali/assets/diwali_256.png diff --git a/seasonal/diwali/assets/diwali_512.png b/events/diwali/assets/diwali_512.png similarity index 100% rename from seasonal/diwali/assets/diwali_512.png rename to events/diwali/assets/diwali_512.png diff --git a/seasonal/diwali/assets/diwali_64.png b/events/diwali/assets/diwali_64.png similarity index 100% rename from seasonal/diwali/assets/diwali_64.png rename to events/diwali/assets/diwali_64.png diff --git a/seasonal/diwali/assets/diwali_large.png b/events/diwali/assets/diwali_large.png similarity index 100% rename from seasonal/diwali/assets/diwali_large.png rename to events/diwali/assets/diwali_large.png diff --git a/seasonal/diwali/assets/diwali_transparent.png b/events/diwali/assets/diwali_transparent.png similarity index 100% rename from seasonal/diwali/assets/diwali_transparent.png rename to events/diwali/assets/diwali_transparent.png diff --git a/seasonal/diwali/banner.png b/events/diwali/banner.png similarity index 100% rename from seasonal/diwali/banner.png rename to events/diwali/banner.png diff --git a/events/diwali/meta.md b/events/diwali/meta.md new file mode 100644 index 00000000..cffb7d7f --- /dev/null +++ b/events/diwali/meta.md @@ -0,0 +1,7 @@ +--- +start_date: November 1 +end_date: November 7 +--- +**Diwali** + +[Diwali](https://en.wikipedia.org/wiki/Diwali) is an annual festival of lights and one of the major festivals celebrated by Hindus, Jains and Sikhs. It usually lasts five days and falls between mid-October and mid-November. diff --git a/seasonal/diwali/server_icons/diwali_256.png b/events/diwali/server_icons/diwali_256.png similarity index 100% rename from seasonal/diwali/server_icons/diwali_256.png rename to events/diwali/server_icons/diwali_256.png diff --git a/events/easter/assets/banner.svg b/events/easter/assets/banner.svg new file mode 100644 index 00000000..20366bc2 --- /dev/null +++ b/events/easter/assets/banner.svg @@ -0,0 +1,99 @@ + diff --git a/seasonal/easter/assets/easter.min.svg b/events/easter/assets/easter.min.svg similarity index 100% rename from seasonal/easter/assets/easter.min.svg rename to events/easter/assets/easter.min.svg diff --git a/seasonal/easter/assets/easter.png b/events/easter/assets/easter.png similarity index 100% rename from seasonal/easter/assets/easter.png rename to events/easter/assets/easter.png diff --git a/seasonal/easter/assets/easter.svg b/events/easter/assets/easter.svg similarity index 100% rename from seasonal/easter/assets/easter.svg rename to events/easter/assets/easter.svg diff --git a/seasonal/easter/assets/easter_256.png b/events/easter/assets/easter_256.png similarity index 100% rename from seasonal/easter/assets/easter_256.png rename to events/easter/assets/easter_256.png diff --git a/seasonal/easter/assets/easter_512.png b/events/easter/assets/easter_512.png similarity index 100% rename from seasonal/easter/assets/easter_512.png rename to events/easter/assets/easter_512.png diff --git a/seasonal/easter/assets/easter_64.png b/events/easter/assets/easter_64.png similarity index 100% rename from seasonal/easter/assets/easter_64.png rename to events/easter/assets/easter_64.png diff --git a/seasonal/easter/assets/easter_large.png b/events/easter/assets/easter_large.png similarity index 100% rename from seasonal/easter/assets/easter_large.png rename to events/easter/assets/easter_large.png diff --git a/seasonal/easter/assets/easter_transparent.png b/events/easter/assets/easter_transparent.png similarity index 100% rename from seasonal/easter/assets/easter_transparent.png rename to events/easter/assets/easter_transparent.png diff --git a/events/easter/banner.png b/events/easter/banner.png new file mode 100644 index 00000000..32b64694 Binary files /dev/null and b/events/easter/banner.png differ diff --git a/events/easter/meta.md b/events/easter/meta.md new file mode 100644 index 00000000..867e085e --- /dev/null +++ b/events/easter/meta.md @@ -0,0 +1,7 @@ +--- +start_date: April 1 +end_date: April 30 +--- +**Easter** + +[Easter](https://en.wikipedia.org/wiki/Easter) is a Christian festival and holiday commemorating the resurrection of Jesus from the dead. It is celebrated on the first Sunday following the full moon that occurs on or just after the spring equinox. A common motive appearing in Easter customs are colourful eggs, associated with the themes of new life and birth. diff --git a/seasonal/easter/server_icons/easter_256.png b/events/easter/server_icons/easter_256.png similarity index 100% rename from seasonal/easter/server_icons/easter_256.png rename to events/easter/server_icons/easter_256.png diff --git a/seasonal/evergreen/animated_logos/apple/apple.gif b/events/evergreen/animated_logos/apple/apple.gif similarity index 100% rename from seasonal/evergreen/animated_logos/apple/apple.gif rename to events/evergreen/animated_logos/apple/apple.gif diff --git a/seasonal/evergreen/animated_logos/apple/apple_256.gif b/events/evergreen/animated_logos/apple/apple_256.gif similarity index 100% rename from seasonal/evergreen/animated_logos/apple/apple_256.gif rename to events/evergreen/animated_logos/apple/apple_256.gif diff --git a/seasonal/evergreen/animated_logos/apple/apple_512.gif b/events/evergreen/animated_logos/apple/apple_512.gif similarity index 100% rename from seasonal/evergreen/animated_logos/apple/apple_512.gif rename to events/evergreen/animated_logos/apple/apple_512.gif diff --git a/seasonal/evergreen/animated_logos/apple/apple_64.gif b/events/evergreen/animated_logos/apple/apple_64.gif similarity index 100% rename from seasonal/evergreen/animated_logos/apple/apple_64.gif rename to events/evergreen/animated_logos/apple/apple_64.gif diff --git a/seasonal/evergreen/animated_logos/blinky/blinky.gif b/events/evergreen/animated_logos/blinky/blinky.gif similarity index 100% rename from seasonal/evergreen/animated_logos/blinky/blinky.gif rename to events/evergreen/animated_logos/blinky/blinky.gif diff --git a/seasonal/evergreen/animated_logos/blinky/blinky_256.gif b/events/evergreen/animated_logos/blinky/blinky_256.gif similarity index 100% rename from seasonal/evergreen/animated_logos/blinky/blinky_256.gif rename to events/evergreen/animated_logos/blinky/blinky_256.gif diff --git a/seasonal/evergreen/animated_logos/blinky/blinky_512.gif b/events/evergreen/animated_logos/blinky/blinky_512.gif similarity index 100% rename from seasonal/evergreen/animated_logos/blinky/blinky_512.gif rename to events/evergreen/animated_logos/blinky/blinky_512.gif diff --git a/seasonal/evergreen/animated_logos/blinky/blinky_64.gif b/events/evergreen/animated_logos/blinky/blinky_64.gif similarity index 100% rename from seasonal/evergreen/animated_logos/blinky/blinky_64.gif rename to events/evergreen/animated_logos/blinky/blinky_64.gif diff --git a/seasonal/evergreen/animated_logos/heartbeat/heartbeat.gif b/events/evergreen/animated_logos/heartbeat/heartbeat.gif similarity index 100% rename from seasonal/evergreen/animated_logos/heartbeat/heartbeat.gif rename to events/evergreen/animated_logos/heartbeat/heartbeat.gif diff --git a/seasonal/evergreen/animated_logos/heartbeat/heartbeat_256.gif b/events/evergreen/animated_logos/heartbeat/heartbeat_256.gif similarity index 100% rename from seasonal/evergreen/animated_logos/heartbeat/heartbeat_256.gif rename to events/evergreen/animated_logos/heartbeat/heartbeat_256.gif diff --git a/seasonal/evergreen/animated_logos/heartbeat/heartbeat_512.gif b/events/evergreen/animated_logos/heartbeat/heartbeat_512.gif similarity index 100% rename from seasonal/evergreen/animated_logos/heartbeat/heartbeat_512.gif rename to events/evergreen/animated_logos/heartbeat/heartbeat_512.gif diff --git a/seasonal/evergreen/animated_logos/heartbeat/heartbeat_64.gif b/events/evergreen/animated_logos/heartbeat/heartbeat_64.gif similarity index 100% rename from seasonal/evergreen/animated_logos/heartbeat/heartbeat_64.gif rename to events/evergreen/animated_logos/heartbeat/heartbeat_64.gif diff --git a/seasonal/evergreen/animated_logos/jumper/jumper.gif b/events/evergreen/animated_logos/jumper/jumper.gif similarity index 100% rename from seasonal/evergreen/animated_logos/jumper/jumper.gif rename to events/evergreen/animated_logos/jumper/jumper.gif diff --git a/seasonal/evergreen/animated_logos/jumper/jumper_256.gif b/events/evergreen/animated_logos/jumper/jumper_256.gif similarity index 100% rename from seasonal/evergreen/animated_logos/jumper/jumper_256.gif rename to events/evergreen/animated_logos/jumper/jumper_256.gif diff --git a/seasonal/evergreen/animated_logos/jumper/jumper_512.gif b/events/evergreen/animated_logos/jumper/jumper_512.gif similarity index 100% rename from seasonal/evergreen/animated_logos/jumper/jumper_512.gif rename to events/evergreen/animated_logos/jumper/jumper_512.gif diff --git a/seasonal/evergreen/animated_logos/jumper/jumper_64.gif b/events/evergreen/animated_logos/jumper/jumper_64.gif similarity index 100% rename from seasonal/evergreen/animated_logos/jumper/jumper_64.gif rename to events/evergreen/animated_logos/jumper/jumper_64.gif diff --git a/seasonal/evergreen/animated_logos/runner/runner.gif b/events/evergreen/animated_logos/runner/runner.gif similarity index 100% rename from seasonal/evergreen/animated_logos/runner/runner.gif rename to events/evergreen/animated_logos/runner/runner.gif diff --git a/seasonal/evergreen/animated_logos/runner/runner_256.gif b/events/evergreen/animated_logos/runner/runner_256.gif similarity index 100% rename from seasonal/evergreen/animated_logos/runner/runner_256.gif rename to events/evergreen/animated_logos/runner/runner_256.gif diff --git a/seasonal/evergreen/animated_logos/runner/runner_512.gif b/events/evergreen/animated_logos/runner/runner_512.gif similarity index 100% rename from seasonal/evergreen/animated_logos/runner/runner_512.gif rename to events/evergreen/animated_logos/runner/runner_512.gif diff --git a/seasonal/evergreen/animated_logos/runner/runner_64.gif b/events/evergreen/animated_logos/runner/runner_64.gif similarity index 100% rename from seasonal/evergreen/animated_logos/runner/runner_64.gif rename to events/evergreen/animated_logos/runner/runner_64.gif diff --git a/seasonal/evergreen/animated_logos/spinner/spinner.gif b/events/evergreen/animated_logos/spinner/spinner.gif similarity index 100% rename from seasonal/evergreen/animated_logos/spinner/spinner.gif rename to events/evergreen/animated_logos/spinner/spinner.gif diff --git a/seasonal/evergreen/animated_logos/spinner/spinner_256.gif b/events/evergreen/animated_logos/spinner/spinner_256.gif similarity index 100% rename from seasonal/evergreen/animated_logos/spinner/spinner_256.gif rename to events/evergreen/animated_logos/spinner/spinner_256.gif diff --git a/seasonal/evergreen/animated_logos/spinner/spinner_512.gif b/events/evergreen/animated_logos/spinner/spinner_512.gif similarity index 100% rename from seasonal/evergreen/animated_logos/spinner/spinner_512.gif rename to events/evergreen/animated_logos/spinner/spinner_512.gif diff --git a/seasonal/evergreen/animated_logos/spinner/spinner_64.gif b/events/evergreen/animated_logos/spinner/spinner_64.gif similarity index 100% rename from seasonal/evergreen/animated_logos/spinner/spinner_64.gif rename to events/evergreen/animated_logos/spinner/spinner_64.gif diff --git a/seasonal/evergreen/animated_logos/swoopy/swoopy.gif b/events/evergreen/animated_logos/swoopy/swoopy.gif similarity index 100% rename from seasonal/evergreen/animated_logos/swoopy/swoopy.gif rename to events/evergreen/animated_logos/swoopy/swoopy.gif diff --git a/seasonal/evergreen/animated_logos/tongues/tongues.gif b/events/evergreen/animated_logos/tongues/tongues.gif similarity index 100% rename from seasonal/evergreen/animated_logos/tongues/tongues.gif rename to events/evergreen/animated_logos/tongues/tongues.gif diff --git a/seasonal/evergreen/animated_logos/tongues/tongues_256.gif b/events/evergreen/animated_logos/tongues/tongues_256.gif similarity index 100% rename from seasonal/evergreen/animated_logos/tongues/tongues_256.gif rename to events/evergreen/animated_logos/tongues/tongues_256.gif diff --git a/seasonal/evergreen/animated_logos/tongues/tongues_512.gif b/events/evergreen/animated_logos/tongues/tongues_512.gif similarity index 100% rename from seasonal/evergreen/animated_logos/tongues/tongues_512.gif rename to events/evergreen/animated_logos/tongues/tongues_512.gif diff --git a/seasonal/evergreen/animated_logos/tongues/tongues_64.gif b/events/evergreen/animated_logos/tongues/tongues_64.gif similarity index 100% rename from seasonal/evergreen/animated_logos/tongues/tongues_64.gif rename to events/evergreen/animated_logos/tongues/tongues_64.gif diff --git a/seasonal/evergreen/animated_logos/winky/winky.gif b/events/evergreen/animated_logos/winky/winky.gif similarity index 100% rename from seasonal/evergreen/animated_logos/winky/winky.gif rename to events/evergreen/animated_logos/winky/winky.gif diff --git a/seasonal/evergreen/animated_logos/winky/winky_256.gif b/events/evergreen/animated_logos/winky/winky_256.gif similarity index 100% rename from seasonal/evergreen/animated_logos/winky/winky_256.gif rename to events/evergreen/animated_logos/winky/winky_256.gif diff --git a/seasonal/evergreen/animated_logos/winky/winky_512.gif b/events/evergreen/animated_logos/winky/winky_512.gif similarity index 100% rename from seasonal/evergreen/animated_logos/winky/winky_512.gif rename to events/evergreen/animated_logos/winky/winky_512.gif diff --git a/seasonal/evergreen/animated_logos/winky/winky_64.gif b/events/evergreen/animated_logos/winky/winky_64.gif similarity index 100% rename from seasonal/evergreen/animated_logos/winky/winky_64.gif rename to events/evergreen/animated_logos/winky/winky_64.gif diff --git a/seasonal/evergreen/banner.png b/events/evergreen/banner.png similarity index 100% rename from seasonal/evergreen/banner.png rename to events/evergreen/banner.png diff --git a/seasonal/evergreen/green_logos/logo_evergreen.png b/events/evergreen/green_logos/logo_evergreen.png similarity index 100% rename from seasonal/evergreen/green_logos/logo_evergreen.png rename to events/evergreen/green_logos/logo_evergreen.png diff --git a/seasonal/evergreen/green_logos/logo_evergreen.svg b/events/evergreen/green_logos/logo_evergreen.svg similarity index 100% rename from seasonal/evergreen/green_logos/logo_evergreen.svg rename to events/evergreen/green_logos/logo_evergreen.svg diff --git a/seasonal/evergreen/green_logos/logo_evergreen_256.png b/events/evergreen/green_logos/logo_evergreen_256.png similarity index 100% rename from seasonal/evergreen/green_logos/logo_evergreen_256.png rename to events/evergreen/green_logos/logo_evergreen_256.png diff --git a/seasonal/evergreen/green_logos/logo_evergreen_512.png b/events/evergreen/green_logos/logo_evergreen_512.png similarity index 100% rename from seasonal/evergreen/green_logos/logo_evergreen_512.png rename to events/evergreen/green_logos/logo_evergreen_512.png diff --git a/seasonal/evergreen/green_logos/logo_evergreen_64.png b/events/evergreen/green_logos/logo_evergreen_64.png similarity index 100% rename from seasonal/evergreen/green_logos/logo_evergreen_64.png rename to events/evergreen/green_logos/logo_evergreen_64.png diff --git a/seasonal/evergreen/green_logos/logo_evergreen_large.png b/events/evergreen/green_logos/logo_evergreen_large.png similarity index 100% rename from seasonal/evergreen/green_logos/logo_evergreen_large.png rename to events/evergreen/green_logos/logo_evergreen_large.png diff --git a/seasonal/evergreen/green_logos/logo_evergreen_transparent.png b/events/evergreen/green_logos/logo_evergreen_transparent.png similarity index 100% rename from seasonal/evergreen/green_logos/logo_evergreen_transparent.png rename to events/evergreen/green_logos/logo_evergreen_transparent.png diff --git a/events/evergreen/meta.md b/events/evergreen/meta.md new file mode 100644 index 00000000..9010a1e5 --- /dev/null +++ b/events/evergreen/meta.md @@ -0,0 +1,6 @@ +--- +fallback: true +--- +**Evergreen** + +When no event is active, [Python Discord](https://pythondiscord.com/) is branded with its official logo. diff --git a/seasonal/evergreen/other_assets/avatar_blue.png b/events/evergreen/other_assets/avatar_blue.png similarity index 100% rename from seasonal/evergreen/other_assets/avatar_blue.png rename to events/evergreen/other_assets/avatar_blue.png diff --git a/seasonal/evergreen/other_assets/banner.svg b/events/evergreen/other_assets/banner.svg similarity index 100% rename from seasonal/evergreen/other_assets/banner.svg rename to events/evergreen/other_assets/banner.svg diff --git a/seasonal/evergreen/other_assets/logo_evergreen.min.svg b/events/evergreen/other_assets/logo_evergreen.min.svg similarity index 100% rename from seasonal/evergreen/other_assets/logo_evergreen.min.svg rename to events/evergreen/other_assets/logo_evergreen.min.svg diff --git a/seasonal/evergreen/server_icons/apple_256.gif b/events/evergreen/server_icons/apple_256.gif similarity index 100% rename from seasonal/evergreen/server_icons/apple_256.gif rename to events/evergreen/server_icons/apple_256.gif diff --git a/seasonal/evergreen/server_icons/blinky_256.gif b/events/evergreen/server_icons/blinky_256.gif similarity index 100% rename from seasonal/evergreen/server_icons/blinky_256.gif rename to events/evergreen/server_icons/blinky_256.gif diff --git a/seasonal/evergreen/server_icons/heartbeat_256.gif b/events/evergreen/server_icons/heartbeat_256.gif similarity index 100% rename from seasonal/evergreen/server_icons/heartbeat_256.gif rename to events/evergreen/server_icons/heartbeat_256.gif diff --git a/seasonal/evergreen/server_icons/jumper_256.gif b/events/evergreen/server_icons/jumper_256.gif similarity index 100% rename from seasonal/evergreen/server_icons/jumper_256.gif rename to events/evergreen/server_icons/jumper_256.gif diff --git a/seasonal/evergreen/server_icons/runner_256.gif b/events/evergreen/server_icons/runner_256.gif similarity index 100% rename from seasonal/evergreen/server_icons/runner_256.gif rename to events/evergreen/server_icons/runner_256.gif diff --git a/seasonal/evergreen/server_icons/spinner_256.gif b/events/evergreen/server_icons/spinner_256.gif similarity index 100% rename from seasonal/evergreen/server_icons/spinner_256.gif rename to events/evergreen/server_icons/spinner_256.gif diff --git a/seasonal/evergreen/server_icons/tongues_256.gif b/events/evergreen/server_icons/tongues_256.gif similarity index 100% rename from seasonal/evergreen/server_icons/tongues_256.gif rename to events/evergreen/server_icons/tongues_256.gif diff --git a/seasonal/evergreen/server_icons/winky_256.gif b/events/evergreen/server_icons/winky_256.gif similarity index 100% rename from seasonal/evergreen/server_icons/winky_256.gif rename to events/evergreen/server_icons/winky_256.gif diff --git a/seasonal/halloween/hacktoberfest/2020/banner.png b/events/hacktoberfest/banner.png similarity index 100% rename from seasonal/halloween/hacktoberfest/2020/banner.png rename to events/hacktoberfest/banner.png diff --git a/seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/base_icon.svg b/events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/base_icon.svg similarity index 100% rename from seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/base_icon.svg rename to events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/base_icon.svg diff --git a/seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/blue_60.png b/events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/blue_60.png similarity index 100% rename from seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/blue_60.png rename to events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/blue_60.png diff --git a/seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/blue_off.png b/events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/blue_off.png similarity index 100% rename from seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/blue_off.png rename to events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/blue_off.png diff --git a/seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/both_30.png b/events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/both_30.png similarity index 100% rename from seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/both_30.png rename to events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/both_30.png diff --git a/seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/both_35.png b/events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/both_35.png similarity index 100% rename from seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/both_35.png rename to events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/both_35.png diff --git a/seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/both_40.png b/events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/both_40.png similarity index 100% rename from seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/both_40.png rename to events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/both_40.png diff --git a/seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/both_45.png b/events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/both_45.png similarity index 100% rename from seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/both_45.png rename to events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/both_45.png diff --git a/seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/both_50.png b/events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/both_50.png similarity index 100% rename from seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/both_50.png rename to events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/both_50.png diff --git a/seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/both_55.png b/events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/both_55.png similarity index 100% rename from seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/both_55.png rename to events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/both_55.png diff --git a/seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/both_60.png b/events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/both_60.png similarity index 100% rename from seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/both_60.png rename to events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/both_60.png diff --git a/seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/both_65.png b/events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/both_65.png similarity index 100% rename from seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/both_65.png rename to events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/both_65.png diff --git a/seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/both_70.png b/events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/both_70.png similarity index 100% rename from seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/both_70.png rename to events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/both_70.png diff --git a/seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/both_off.png b/events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/both_off.png similarity index 100% rename from seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/both_off.png rename to events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/both_off.png diff --git a/seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/imagemagick_creation_command.txt b/events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/imagemagick_creation_command.txt similarity index 100% rename from seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/imagemagick_creation_command.txt rename to events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/imagemagick_creation_command.txt diff --git a/seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/pink_60.png b/events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/pink_60.png similarity index 100% rename from seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/pink_60.png rename to events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/pink_60.png diff --git a/seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/pink_off.png b/events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/pink_off.png similarity index 100% rename from seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/frames/pink_off.png rename to events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/frames/pink_off.png diff --git a/seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/icon_neon_flicker_256x256.gif b/events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/icon_neon_flicker_256x256.gif similarity index 100% rename from seasonal/halloween/hacktoberfest/2019/animated_neon_flicker/icon_neon_flicker_256x256.gif rename to events/hacktoberfest/hacktoberfest/2019/animated_neon_flicker/icon_neon_flicker_256x256.gif diff --git a/seasonal/halloween/hacktoberfest/2019/banner.png b/events/hacktoberfest/hacktoberfest/2019/banner.png similarity index 100% rename from seasonal/halloween/hacktoberfest/2019/banner.png rename to events/hacktoberfest/hacktoberfest/2019/banner.png diff --git a/seasonal/halloween/hacktoberfest/2019/hacktober_transparent.png b/events/hacktoberfest/hacktoberfest/2019/hacktober_transparent.png similarity index 100% rename from seasonal/halloween/hacktoberfest/2019/hacktober_transparent.png rename to events/hacktoberfest/hacktoberfest/2019/hacktober_transparent.png diff --git a/seasonal/halloween/hacktoberfest/2019/hacktoberfest.png b/events/hacktoberfest/hacktoberfest/2019/hacktoberfest.png similarity index 100% rename from seasonal/halloween/hacktoberfest/2019/hacktoberfest.png rename to events/hacktoberfest/hacktoberfest/2019/hacktoberfest.png diff --git a/seasonal/halloween/hacktoberfest/2019/hacktoberfest_animated.gif b/events/hacktoberfest/hacktoberfest/2019/hacktoberfest_animated.gif similarity index 100% rename from seasonal/halloween/hacktoberfest/2019/hacktoberfest_animated.gif rename to events/hacktoberfest/hacktoberfest/2019/hacktoberfest_animated.gif diff --git a/seasonal/halloween/hacktoberfest/2020/banner.svg b/events/hacktoberfest/hacktoberfest/2020/banner.svg similarity index 100% rename from seasonal/halloween/hacktoberfest/2020/banner.svg rename to events/hacktoberfest/hacktoberfest/2020/banner.svg diff --git a/seasonal/halloween/hacktoberfest/2020/logo.png b/events/hacktoberfest/hacktoberfest/2020/logo.png similarity index 100% rename from seasonal/halloween/hacktoberfest/2020/logo.png rename to events/hacktoberfest/hacktoberfest/2020/logo.png diff --git a/seasonal/halloween/hacktoberfest/2020/logo.svg b/events/hacktoberfest/hacktoberfest/2020/logo.svg similarity index 100% rename from seasonal/halloween/hacktoberfest/2020/logo.svg rename to events/hacktoberfest/hacktoberfest/2020/logo.svg diff --git a/seasonal/halloween/halloween/spooky.min.svg b/events/hacktoberfest/halloween/spooky.min.svg similarity index 100% rename from seasonal/halloween/halloween/spooky.min.svg rename to events/hacktoberfest/halloween/spooky.min.svg diff --git a/seasonal/halloween/halloween/spooky.png b/events/hacktoberfest/halloween/spooky.png similarity index 100% rename from seasonal/halloween/halloween/spooky.png rename to events/hacktoberfest/halloween/spooky.png diff --git a/seasonal/halloween/halloween/spooky.svg b/events/hacktoberfest/halloween/spooky.svg similarity index 100% rename from seasonal/halloween/halloween/spooky.svg rename to events/hacktoberfest/halloween/spooky.svg diff --git a/seasonal/halloween/halloween/spooky_256.png b/events/hacktoberfest/halloween/spooky_256.png similarity index 100% rename from seasonal/halloween/halloween/spooky_256.png rename to events/hacktoberfest/halloween/spooky_256.png diff --git a/seasonal/halloween/halloween/spooky_512.png b/events/hacktoberfest/halloween/spooky_512.png similarity index 100% rename from seasonal/halloween/halloween/spooky_512.png rename to events/hacktoberfest/halloween/spooky_512.png diff --git a/seasonal/halloween/halloween/spooky_64.png b/events/hacktoberfest/halloween/spooky_64.png similarity index 100% rename from seasonal/halloween/halloween/spooky_64.png rename to events/hacktoberfest/halloween/spooky_64.png diff --git a/seasonal/halloween/halloween/spooky_large.png b/events/hacktoberfest/halloween/spooky_large.png similarity index 100% rename from seasonal/halloween/halloween/spooky_large.png rename to events/hacktoberfest/halloween/spooky_large.png diff --git a/seasonal/halloween/halloween/spooky_transparent.png b/events/hacktoberfest/halloween/spooky_transparent.png similarity index 100% rename from seasonal/halloween/halloween/spooky_transparent.png rename to events/hacktoberfest/halloween/spooky_transparent.png diff --git a/events/hacktoberfest/meta.md b/events/hacktoberfest/meta.md new file mode 100644 index 00000000..fee6865d --- /dev/null +++ b/events/hacktoberfest/meta.md @@ -0,0 +1,7 @@ +--- +start_date: October 1 +end_date: October 31 +--- +**Hacktoberfest** + +[Hacktoberfest](https://hacktoberfest.digitalocean.com/) is an annual celebration of open source culture. The event encourages contributions to open source projects, and rewards participants with various unique prizes alongside an excellent opportunity to gain experience with collaborative software development. diff --git a/seasonal/halloween/hacktoberfest/2020/animated_server_icon.gif b/events/hacktoberfest/server_icons/animated_server_icon.gif similarity index 100% rename from seasonal/halloween/hacktoberfest/2020/animated_server_icon.gif rename to events/hacktoberfest/server_icons/animated_server_icon.gif diff --git a/events/new_year/annual.min.svg b/events/new_year/assets/annual.min.svg similarity index 100% rename from events/new_year/annual.min.svg rename to events/new_year/assets/annual.min.svg diff --git a/events/new_year/annual.png b/events/new_year/assets/annual.png similarity index 100% rename from events/new_year/annual.png rename to events/new_year/assets/annual.png diff --git a/events/new_year/annual.svg b/events/new_year/assets/annual.svg similarity index 100% rename from events/new_year/annual.svg rename to events/new_year/assets/annual.svg diff --git a/events/new_year/annual_512.png b/events/new_year/assets/annual_512.png similarity index 100% rename from events/new_year/annual_512.png rename to events/new_year/assets/annual_512.png diff --git a/events/new_year/annual_64.png b/events/new_year/assets/annual_64.png similarity index 100% rename from events/new_year/annual_64.png rename to events/new_year/assets/annual_64.png diff --git a/events/new_year/annual_large.png b/events/new_year/assets/annual_large.png similarity index 100% rename from events/new_year/annual_large.png rename to events/new_year/assets/annual_large.png diff --git a/events/new_year/annual_transparent.png b/events/new_year/assets/annual_transparent.png similarity index 100% rename from events/new_year/annual_transparent.png rename to events/new_year/assets/annual_transparent.png diff --git a/events/new_year/banner.svg b/events/new_year/assets/banner.svg similarity index 100% rename from events/new_year/banner.svg rename to events/new_year/assets/banner.svg diff --git a/events/new_year/meta.md b/events/new_year/meta.md new file mode 100644 index 00000000..2cb552a1 --- /dev/null +++ b/events/new_year/meta.md @@ -0,0 +1,7 @@ +--- +start_date: December 26 +end_date: December 31 +--- +**New Year** + +[New Year](https://en.wikipedia.org/wiki/New_Year) celebrations occur around the end of the calendar year, and the beginning of the next one. The event is associated with a rich variety of traditional and religious customs, often including fireworks, bright lights, and joyous atmosphere. New Year resolutions are a traditional promise of encouraging positive development and working towards personal goals in the upcoming year. diff --git a/events/new_year/annual_256.png b/events/new_year/server_icons/annual_256.png similarity index 100% rename from events/new_year/annual_256.png rename to events/new_year/server_icons/annual_256.png diff --git a/seasonal/pride/animated/logo_agender/logo_agender.png b/events/pride/animated/logo_agender/logo_agender.png similarity index 100% rename from seasonal/pride/animated/logo_agender/logo_agender.png rename to events/pride/animated/logo_agender/logo_agender.png diff --git a/seasonal/pride/animated/logo_agender/logo_agender.svg b/events/pride/animated/logo_agender/logo_agender.svg similarity index 100% rename from seasonal/pride/animated/logo_agender/logo_agender.svg rename to events/pride/animated/logo_agender/logo_agender.svg diff --git a/seasonal/pride/animated/logo_agender/logo_agender_256.png b/events/pride/animated/logo_agender/logo_agender_256.png similarity index 100% rename from seasonal/pride/animated/logo_agender/logo_agender_256.png rename to events/pride/animated/logo_agender/logo_agender_256.png diff --git a/seasonal/pride/animated/logo_agender/logo_agender_512.png b/events/pride/animated/logo_agender/logo_agender_512.png similarity index 100% rename from seasonal/pride/animated/logo_agender/logo_agender_512.png rename to events/pride/animated/logo_agender/logo_agender_512.png diff --git a/seasonal/pride/animated/logo_agender/logo_agender_64.png b/events/pride/animated/logo_agender/logo_agender_64.png similarity index 100% rename from seasonal/pride/animated/logo_agender/logo_agender_64.png rename to events/pride/animated/logo_agender/logo_agender_64.png diff --git a/seasonal/pride/animated/logo_agender/logo_agender_large.png b/events/pride/animated/logo_agender/logo_agender_large.png similarity index 100% rename from seasonal/pride/animated/logo_agender/logo_agender_large.png rename to events/pride/animated/logo_agender/logo_agender_large.png diff --git a/seasonal/pride/animated/logo_androgyne/logo_androgyne.png b/events/pride/animated/logo_androgyne/logo_androgyne.png similarity index 100% rename from seasonal/pride/animated/logo_androgyne/logo_androgyne.png rename to events/pride/animated/logo_androgyne/logo_androgyne.png diff --git a/seasonal/pride/animated/logo_androgyne/logo_androgyne.svg b/events/pride/animated/logo_androgyne/logo_androgyne.svg similarity index 100% rename from seasonal/pride/animated/logo_androgyne/logo_androgyne.svg rename to events/pride/animated/logo_androgyne/logo_androgyne.svg diff --git a/seasonal/pride/animated/logo_androgyne/logo_androgyne_256.png b/events/pride/animated/logo_androgyne/logo_androgyne_256.png similarity index 100% rename from seasonal/pride/animated/logo_androgyne/logo_androgyne_256.png rename to events/pride/animated/logo_androgyne/logo_androgyne_256.png diff --git a/seasonal/pride/animated/logo_androgyne/logo_androgyne_512.png b/events/pride/animated/logo_androgyne/logo_androgyne_512.png similarity index 100% rename from seasonal/pride/animated/logo_androgyne/logo_androgyne_512.png rename to events/pride/animated/logo_androgyne/logo_androgyne_512.png diff --git a/seasonal/pride/animated/logo_androgyne/logo_androgyne_64.png b/events/pride/animated/logo_androgyne/logo_androgyne_64.png similarity index 100% rename from seasonal/pride/animated/logo_androgyne/logo_androgyne_64.png rename to events/pride/animated/logo_androgyne/logo_androgyne_64.png diff --git a/seasonal/pride/animated/logo_androgyne/logo_androgyne_large.png b/events/pride/animated/logo_androgyne/logo_androgyne_large.png similarity index 100% rename from seasonal/pride/animated/logo_androgyne/logo_androgyne_large.png rename to events/pride/animated/logo_androgyne/logo_androgyne_large.png diff --git a/seasonal/pride/animated/logo_aromantic/logo_aromantic.png b/events/pride/animated/logo_aromantic/logo_aromantic.png similarity index 100% rename from seasonal/pride/animated/logo_aromantic/logo_aromantic.png rename to events/pride/animated/logo_aromantic/logo_aromantic.png diff --git a/seasonal/pride/animated/logo_aromantic/logo_aromantic.svg b/events/pride/animated/logo_aromantic/logo_aromantic.svg similarity index 100% rename from seasonal/pride/animated/logo_aromantic/logo_aromantic.svg rename to events/pride/animated/logo_aromantic/logo_aromantic.svg diff --git a/seasonal/pride/animated/logo_aromantic/logo_aromantic_256.png b/events/pride/animated/logo_aromantic/logo_aromantic_256.png similarity index 100% rename from seasonal/pride/animated/logo_aromantic/logo_aromantic_256.png rename to events/pride/animated/logo_aromantic/logo_aromantic_256.png diff --git a/seasonal/pride/animated/logo_aromantic/logo_aromantic_512.png b/events/pride/animated/logo_aromantic/logo_aromantic_512.png similarity index 100% rename from seasonal/pride/animated/logo_aromantic/logo_aromantic_512.png rename to events/pride/animated/logo_aromantic/logo_aromantic_512.png diff --git a/seasonal/pride/animated/logo_aromantic/logo_aromantic_64.png b/events/pride/animated/logo_aromantic/logo_aromantic_64.png similarity index 100% rename from seasonal/pride/animated/logo_aromantic/logo_aromantic_64.png rename to events/pride/animated/logo_aromantic/logo_aromantic_64.png diff --git a/seasonal/pride/animated/logo_aromantic/logo_aromantic_large.png b/events/pride/animated/logo_aromantic/logo_aromantic_large.png similarity index 100% rename from seasonal/pride/animated/logo_aromantic/logo_aromantic_large.png rename to events/pride/animated/logo_aromantic/logo_aromantic_large.png diff --git a/seasonal/pride/animated/logo_asexual/logo_asexual.png b/events/pride/animated/logo_asexual/logo_asexual.png similarity index 100% rename from seasonal/pride/animated/logo_asexual/logo_asexual.png rename to events/pride/animated/logo_asexual/logo_asexual.png diff --git a/seasonal/pride/animated/logo_asexual/logo_asexual.svg b/events/pride/animated/logo_asexual/logo_asexual.svg similarity index 100% rename from seasonal/pride/animated/logo_asexual/logo_asexual.svg rename to events/pride/animated/logo_asexual/logo_asexual.svg diff --git a/seasonal/pride/animated/logo_asexual/logo_asexual_256.png b/events/pride/animated/logo_asexual/logo_asexual_256.png similarity index 100% rename from seasonal/pride/animated/logo_asexual/logo_asexual_256.png rename to events/pride/animated/logo_asexual/logo_asexual_256.png diff --git a/seasonal/pride/animated/logo_asexual/logo_asexual_512.png b/events/pride/animated/logo_asexual/logo_asexual_512.png similarity index 100% rename from seasonal/pride/animated/logo_asexual/logo_asexual_512.png rename to events/pride/animated/logo_asexual/logo_asexual_512.png diff --git a/seasonal/pride/animated/logo_asexual/logo_asexual_64.png b/events/pride/animated/logo_asexual/logo_asexual_64.png similarity index 100% rename from seasonal/pride/animated/logo_asexual/logo_asexual_64.png rename to events/pride/animated/logo_asexual/logo_asexual_64.png diff --git a/seasonal/pride/animated/logo_asexual/logo_asexual_large.png b/events/pride/animated/logo_asexual/logo_asexual_large.png similarity index 100% rename from seasonal/pride/animated/logo_asexual/logo_asexual_large.png rename to events/pride/animated/logo_asexual/logo_asexual_large.png diff --git a/seasonal/pride/animated/logo_bigender/logo_bigender.png b/events/pride/animated/logo_bigender/logo_bigender.png similarity index 100% rename from seasonal/pride/animated/logo_bigender/logo_bigender.png rename to events/pride/animated/logo_bigender/logo_bigender.png diff --git a/seasonal/pride/animated/logo_bigender/logo_bigender.svg b/events/pride/animated/logo_bigender/logo_bigender.svg similarity index 100% rename from seasonal/pride/animated/logo_bigender/logo_bigender.svg rename to events/pride/animated/logo_bigender/logo_bigender.svg diff --git a/seasonal/pride/animated/logo_bigender/logo_bigender_256.png b/events/pride/animated/logo_bigender/logo_bigender_256.png similarity index 100% rename from seasonal/pride/animated/logo_bigender/logo_bigender_256.png rename to events/pride/animated/logo_bigender/logo_bigender_256.png diff --git a/seasonal/pride/animated/logo_bigender/logo_bigender_512.png b/events/pride/animated/logo_bigender/logo_bigender_512.png similarity index 100% rename from seasonal/pride/animated/logo_bigender/logo_bigender_512.png rename to events/pride/animated/logo_bigender/logo_bigender_512.png diff --git a/seasonal/pride/animated/logo_bigender/logo_bigender_64.png b/events/pride/animated/logo_bigender/logo_bigender_64.png similarity index 100% rename from seasonal/pride/animated/logo_bigender/logo_bigender_64.png rename to events/pride/animated/logo_bigender/logo_bigender_64.png diff --git a/seasonal/pride/animated/logo_bigender/logo_bigender_large.png b/events/pride/animated/logo_bigender/logo_bigender_large.png similarity index 100% rename from seasonal/pride/animated/logo_bigender/logo_bigender_large.png rename to events/pride/animated/logo_bigender/logo_bigender_large.png diff --git a/seasonal/pride/animated/logo_bisexual/logo_bisexual.png b/events/pride/animated/logo_bisexual/logo_bisexual.png similarity index 100% rename from seasonal/pride/animated/logo_bisexual/logo_bisexual.png rename to events/pride/animated/logo_bisexual/logo_bisexual.png diff --git a/seasonal/pride/animated/logo_bisexual/logo_bisexual.svg b/events/pride/animated/logo_bisexual/logo_bisexual.svg similarity index 100% rename from seasonal/pride/animated/logo_bisexual/logo_bisexual.svg rename to events/pride/animated/logo_bisexual/logo_bisexual.svg diff --git a/seasonal/pride/animated/logo_bisexual/logo_bisexual_256.png b/events/pride/animated/logo_bisexual/logo_bisexual_256.png similarity index 100% rename from seasonal/pride/animated/logo_bisexual/logo_bisexual_256.png rename to events/pride/animated/logo_bisexual/logo_bisexual_256.png diff --git a/seasonal/pride/animated/logo_bisexual/logo_bisexual_512.png b/events/pride/animated/logo_bisexual/logo_bisexual_512.png similarity index 100% rename from seasonal/pride/animated/logo_bisexual/logo_bisexual_512.png rename to events/pride/animated/logo_bisexual/logo_bisexual_512.png diff --git a/seasonal/pride/animated/logo_bisexual/logo_bisexual_64.png b/events/pride/animated/logo_bisexual/logo_bisexual_64.png similarity index 100% rename from seasonal/pride/animated/logo_bisexual/logo_bisexual_64.png rename to events/pride/animated/logo_bisexual/logo_bisexual_64.png diff --git a/seasonal/pride/animated/logo_bisexual/logo_bisexual_large.png b/events/pride/animated/logo_bisexual/logo_bisexual_large.png similarity index 100% rename from seasonal/pride/animated/logo_bisexual/logo_bisexual_large.png rename to events/pride/animated/logo_bisexual/logo_bisexual_large.png diff --git a/seasonal/pride/animated/logo_demiboy/logo_demiboy.png b/events/pride/animated/logo_demiboy/logo_demiboy.png similarity index 100% rename from seasonal/pride/animated/logo_demiboy/logo_demiboy.png rename to events/pride/animated/logo_demiboy/logo_demiboy.png diff --git a/seasonal/pride/animated/logo_demiboy/logo_demiboy.svg b/events/pride/animated/logo_demiboy/logo_demiboy.svg similarity index 100% rename from seasonal/pride/animated/logo_demiboy/logo_demiboy.svg rename to events/pride/animated/logo_demiboy/logo_demiboy.svg diff --git a/seasonal/pride/animated/logo_demiboy/logo_demiboy_256.png b/events/pride/animated/logo_demiboy/logo_demiboy_256.png similarity index 100% rename from seasonal/pride/animated/logo_demiboy/logo_demiboy_256.png rename to events/pride/animated/logo_demiboy/logo_demiboy_256.png diff --git a/seasonal/pride/animated/logo_demiboy/logo_demiboy_512.png b/events/pride/animated/logo_demiboy/logo_demiboy_512.png similarity index 100% rename from seasonal/pride/animated/logo_demiboy/logo_demiboy_512.png rename to events/pride/animated/logo_demiboy/logo_demiboy_512.png diff --git a/seasonal/pride/animated/logo_demiboy/logo_demiboy_64.png b/events/pride/animated/logo_demiboy/logo_demiboy_64.png similarity index 100% rename from seasonal/pride/animated/logo_demiboy/logo_demiboy_64.png rename to events/pride/animated/logo_demiboy/logo_demiboy_64.png diff --git a/seasonal/pride/animated/logo_demiboy/logo_demiboy_large.png b/events/pride/animated/logo_demiboy/logo_demiboy_large.png similarity index 100% rename from seasonal/pride/animated/logo_demiboy/logo_demiboy_large.png rename to events/pride/animated/logo_demiboy/logo_demiboy_large.png diff --git a/seasonal/pride/animated/logo_demigirl/logo_demigirl.png b/events/pride/animated/logo_demigirl/logo_demigirl.png similarity index 100% rename from seasonal/pride/animated/logo_demigirl/logo_demigirl.png rename to events/pride/animated/logo_demigirl/logo_demigirl.png diff --git a/seasonal/pride/animated/logo_demigirl/logo_demigirl.svg b/events/pride/animated/logo_demigirl/logo_demigirl.svg similarity index 100% rename from seasonal/pride/animated/logo_demigirl/logo_demigirl.svg rename to events/pride/animated/logo_demigirl/logo_demigirl.svg diff --git a/seasonal/pride/animated/logo_demigirl/logo_demigirl_256.png b/events/pride/animated/logo_demigirl/logo_demigirl_256.png similarity index 100% rename from seasonal/pride/animated/logo_demigirl/logo_demigirl_256.png rename to events/pride/animated/logo_demigirl/logo_demigirl_256.png diff --git a/seasonal/pride/animated/logo_demigirl/logo_demigirl_512.png b/events/pride/animated/logo_demigirl/logo_demigirl_512.png similarity index 100% rename from seasonal/pride/animated/logo_demigirl/logo_demigirl_512.png rename to events/pride/animated/logo_demigirl/logo_demigirl_512.png diff --git a/seasonal/pride/animated/logo_demigirl/logo_demigirl_64.png b/events/pride/animated/logo_demigirl/logo_demigirl_64.png similarity index 100% rename from seasonal/pride/animated/logo_demigirl/logo_demigirl_64.png rename to events/pride/animated/logo_demigirl/logo_demigirl_64.png diff --git a/seasonal/pride/animated/logo_demigirl/logo_demigirl_large.png b/events/pride/animated/logo_demigirl/logo_demigirl_large.png similarity index 100% rename from seasonal/pride/animated/logo_demigirl/logo_demigirl_large.png rename to events/pride/animated/logo_demigirl/logo_demigirl_large.png diff --git a/seasonal/pride/animated/logo_demisexual/logo_demisexual.png b/events/pride/animated/logo_demisexual/logo_demisexual.png similarity index 100% rename from seasonal/pride/animated/logo_demisexual/logo_demisexual.png rename to events/pride/animated/logo_demisexual/logo_demisexual.png diff --git a/seasonal/pride/animated/logo_demisexual/logo_demisexual.svg b/events/pride/animated/logo_demisexual/logo_demisexual.svg similarity index 100% rename from seasonal/pride/animated/logo_demisexual/logo_demisexual.svg rename to events/pride/animated/logo_demisexual/logo_demisexual.svg diff --git a/seasonal/pride/animated/logo_demisexual/logo_demisexual_256.png b/events/pride/animated/logo_demisexual/logo_demisexual_256.png similarity index 100% rename from seasonal/pride/animated/logo_demisexual/logo_demisexual_256.png rename to events/pride/animated/logo_demisexual/logo_demisexual_256.png diff --git a/seasonal/pride/animated/logo_demisexual/logo_demisexual_512.png b/events/pride/animated/logo_demisexual/logo_demisexual_512.png similarity index 100% rename from seasonal/pride/animated/logo_demisexual/logo_demisexual_512.png rename to events/pride/animated/logo_demisexual/logo_demisexual_512.png diff --git a/seasonal/pride/animated/logo_demisexual/logo_demisexual_64.png b/events/pride/animated/logo_demisexual/logo_demisexual_64.png similarity index 100% rename from seasonal/pride/animated/logo_demisexual/logo_demisexual_64.png rename to events/pride/animated/logo_demisexual/logo_demisexual_64.png diff --git a/seasonal/pride/animated/logo_demisexual/logo_demisexual_large.png b/events/pride/animated/logo_demisexual/logo_demisexual_large.png similarity index 100% rename from seasonal/pride/animated/logo_demisexual/logo_demisexual_large.png rename to events/pride/animated/logo_demisexual/logo_demisexual_large.png diff --git a/seasonal/pride/animated/logo_genderfluid/logo_genderfluid.png b/events/pride/animated/logo_genderfluid/logo_genderfluid.png similarity index 100% rename from seasonal/pride/animated/logo_genderfluid/logo_genderfluid.png rename to events/pride/animated/logo_genderfluid/logo_genderfluid.png diff --git a/seasonal/pride/animated/logo_genderfluid/logo_genderfluid.svg b/events/pride/animated/logo_genderfluid/logo_genderfluid.svg similarity index 100% rename from seasonal/pride/animated/logo_genderfluid/logo_genderfluid.svg rename to events/pride/animated/logo_genderfluid/logo_genderfluid.svg diff --git a/seasonal/pride/animated/logo_genderfluid/logo_genderfluid_256.png b/events/pride/animated/logo_genderfluid/logo_genderfluid_256.png similarity index 100% rename from seasonal/pride/animated/logo_genderfluid/logo_genderfluid_256.png rename to events/pride/animated/logo_genderfluid/logo_genderfluid_256.png diff --git a/seasonal/pride/animated/logo_genderfluid/logo_genderfluid_512.png b/events/pride/animated/logo_genderfluid/logo_genderfluid_512.png similarity index 100% rename from seasonal/pride/animated/logo_genderfluid/logo_genderfluid_512.png rename to events/pride/animated/logo_genderfluid/logo_genderfluid_512.png diff --git a/seasonal/pride/animated/logo_genderfluid/logo_genderfluid_64.png b/events/pride/animated/logo_genderfluid/logo_genderfluid_64.png similarity index 100% rename from seasonal/pride/animated/logo_genderfluid/logo_genderfluid_64.png rename to events/pride/animated/logo_genderfluid/logo_genderfluid_64.png diff --git a/seasonal/pride/animated/logo_genderfluid/logo_genderfluid_large.png b/events/pride/animated/logo_genderfluid/logo_genderfluid_large.png similarity index 100% rename from seasonal/pride/animated/logo_genderfluid/logo_genderfluid_large.png rename to events/pride/animated/logo_genderfluid/logo_genderfluid_large.png diff --git a/seasonal/pride/animated/logo_genderqueer/logo_genderqueer.png b/events/pride/animated/logo_genderqueer/logo_genderqueer.png similarity index 100% rename from seasonal/pride/animated/logo_genderqueer/logo_genderqueer.png rename to events/pride/animated/logo_genderqueer/logo_genderqueer.png diff --git a/seasonal/pride/animated/logo_genderqueer/logo_genderqueer.svg b/events/pride/animated/logo_genderqueer/logo_genderqueer.svg similarity index 100% rename from seasonal/pride/animated/logo_genderqueer/logo_genderqueer.svg rename to events/pride/animated/logo_genderqueer/logo_genderqueer.svg diff --git a/seasonal/pride/animated/logo_genderqueer/logo_genderqueer_256.png b/events/pride/animated/logo_genderqueer/logo_genderqueer_256.png similarity index 100% rename from seasonal/pride/animated/logo_genderqueer/logo_genderqueer_256.png rename to events/pride/animated/logo_genderqueer/logo_genderqueer_256.png diff --git a/seasonal/pride/animated/logo_genderqueer/logo_genderqueer_512.png b/events/pride/animated/logo_genderqueer/logo_genderqueer_512.png similarity index 100% rename from seasonal/pride/animated/logo_genderqueer/logo_genderqueer_512.png rename to events/pride/animated/logo_genderqueer/logo_genderqueer_512.png diff --git a/seasonal/pride/animated/logo_genderqueer/logo_genderqueer_64.png b/events/pride/animated/logo_genderqueer/logo_genderqueer_64.png similarity index 100% rename from seasonal/pride/animated/logo_genderqueer/logo_genderqueer_64.png rename to events/pride/animated/logo_genderqueer/logo_genderqueer_64.png diff --git a/seasonal/pride/animated/logo_genderqueer/logo_genderqueer_large.png b/events/pride/animated/logo_genderqueer/logo_genderqueer_large.png similarity index 100% rename from seasonal/pride/animated/logo_genderqueer/logo_genderqueer_large.png rename to events/pride/animated/logo_genderqueer/logo_genderqueer_large.png diff --git a/seasonal/pride/animated/logo_intersex/logo_intersex.png b/events/pride/animated/logo_intersex/logo_intersex.png similarity index 100% rename from seasonal/pride/animated/logo_intersex/logo_intersex.png rename to events/pride/animated/logo_intersex/logo_intersex.png diff --git a/seasonal/pride/animated/logo_intersex/logo_intersex.svg b/events/pride/animated/logo_intersex/logo_intersex.svg similarity index 100% rename from seasonal/pride/animated/logo_intersex/logo_intersex.svg rename to events/pride/animated/logo_intersex/logo_intersex.svg diff --git a/seasonal/pride/animated/logo_intersex/logo_intersex_256.png b/events/pride/animated/logo_intersex/logo_intersex_256.png similarity index 100% rename from seasonal/pride/animated/logo_intersex/logo_intersex_256.png rename to events/pride/animated/logo_intersex/logo_intersex_256.png diff --git a/seasonal/pride/animated/logo_intersex/logo_intersex_512.png b/events/pride/animated/logo_intersex/logo_intersex_512.png similarity index 100% rename from seasonal/pride/animated/logo_intersex/logo_intersex_512.png rename to events/pride/animated/logo_intersex/logo_intersex_512.png diff --git a/seasonal/pride/animated/logo_intersex/logo_intersex_64.png b/events/pride/animated/logo_intersex/logo_intersex_64.png similarity index 100% rename from seasonal/pride/animated/logo_intersex/logo_intersex_64.png rename to events/pride/animated/logo_intersex/logo_intersex_64.png diff --git a/seasonal/pride/animated/logo_intersex/logo_intersex_large.png b/events/pride/animated/logo_intersex/logo_intersex_large.png similarity index 100% rename from seasonal/pride/animated/logo_intersex/logo_intersex_large.png rename to events/pride/animated/logo_intersex/logo_intersex_large.png diff --git a/seasonal/pride/animated/logo_lesbian/logo_lesbian.png b/events/pride/animated/logo_lesbian/logo_lesbian.png similarity index 100% rename from seasonal/pride/animated/logo_lesbian/logo_lesbian.png rename to events/pride/animated/logo_lesbian/logo_lesbian.png diff --git a/seasonal/pride/animated/logo_lesbian/logo_lesbian.svg b/events/pride/animated/logo_lesbian/logo_lesbian.svg similarity index 100% rename from seasonal/pride/animated/logo_lesbian/logo_lesbian.svg rename to events/pride/animated/logo_lesbian/logo_lesbian.svg diff --git a/seasonal/pride/animated/logo_lesbian/logo_lesbian_256.png b/events/pride/animated/logo_lesbian/logo_lesbian_256.png similarity index 100% rename from seasonal/pride/animated/logo_lesbian/logo_lesbian_256.png rename to events/pride/animated/logo_lesbian/logo_lesbian_256.png diff --git a/seasonal/pride/animated/logo_lesbian/logo_lesbian_512.png b/events/pride/animated/logo_lesbian/logo_lesbian_512.png similarity index 100% rename from seasonal/pride/animated/logo_lesbian/logo_lesbian_512.png rename to events/pride/animated/logo_lesbian/logo_lesbian_512.png diff --git a/seasonal/pride/animated/logo_lesbian/logo_lesbian_64.png b/events/pride/animated/logo_lesbian/logo_lesbian_64.png similarity index 100% rename from seasonal/pride/animated/logo_lesbian/logo_lesbian_64.png rename to events/pride/animated/logo_lesbian/logo_lesbian_64.png diff --git a/seasonal/pride/animated/logo_lesbian/logo_lesbian_large.png b/events/pride/animated/logo_lesbian/logo_lesbian_large.png similarity index 100% rename from seasonal/pride/animated/logo_lesbian/logo_lesbian_large.png rename to events/pride/animated/logo_lesbian/logo_lesbian_large.png diff --git a/seasonal/pride/animated/logo_nonbinary/logo_nonbinary.png b/events/pride/animated/logo_nonbinary/logo_nonbinary.png similarity index 100% rename from seasonal/pride/animated/logo_nonbinary/logo_nonbinary.png rename to events/pride/animated/logo_nonbinary/logo_nonbinary.png diff --git a/seasonal/pride/animated/logo_nonbinary/logo_nonbinary.svg b/events/pride/animated/logo_nonbinary/logo_nonbinary.svg similarity index 100% rename from seasonal/pride/animated/logo_nonbinary/logo_nonbinary.svg rename to events/pride/animated/logo_nonbinary/logo_nonbinary.svg diff --git a/seasonal/pride/animated/logo_nonbinary/logo_nonbinary_256.png b/events/pride/animated/logo_nonbinary/logo_nonbinary_256.png similarity index 100% rename from seasonal/pride/animated/logo_nonbinary/logo_nonbinary_256.png rename to events/pride/animated/logo_nonbinary/logo_nonbinary_256.png diff --git a/seasonal/pride/animated/logo_nonbinary/logo_nonbinary_512.png b/events/pride/animated/logo_nonbinary/logo_nonbinary_512.png similarity index 100% rename from seasonal/pride/animated/logo_nonbinary/logo_nonbinary_512.png rename to events/pride/animated/logo_nonbinary/logo_nonbinary_512.png diff --git a/seasonal/pride/animated/logo_nonbinary/logo_nonbinary_64.png b/events/pride/animated/logo_nonbinary/logo_nonbinary_64.png similarity index 100% rename from seasonal/pride/animated/logo_nonbinary/logo_nonbinary_64.png rename to events/pride/animated/logo_nonbinary/logo_nonbinary_64.png diff --git a/seasonal/pride/animated/logo_nonbinary/logo_nonbinary_large.png b/events/pride/animated/logo_nonbinary/logo_nonbinary_large.png similarity index 100% rename from seasonal/pride/animated/logo_nonbinary/logo_nonbinary_large.png rename to events/pride/animated/logo_nonbinary/logo_nonbinary_large.png diff --git a/seasonal/pride/animated/logo_omnisexual/logo_omnisexual.png b/events/pride/animated/logo_omnisexual/logo_omnisexual.png similarity index 100% rename from seasonal/pride/animated/logo_omnisexual/logo_omnisexual.png rename to events/pride/animated/logo_omnisexual/logo_omnisexual.png diff --git a/seasonal/pride/animated/logo_omnisexual/logo_omnisexual.svg b/events/pride/animated/logo_omnisexual/logo_omnisexual.svg similarity index 100% rename from seasonal/pride/animated/logo_omnisexual/logo_omnisexual.svg rename to events/pride/animated/logo_omnisexual/logo_omnisexual.svg diff --git a/seasonal/pride/animated/logo_omnisexual/logo_omnisexual_256.png b/events/pride/animated/logo_omnisexual/logo_omnisexual_256.png similarity index 100% rename from seasonal/pride/animated/logo_omnisexual/logo_omnisexual_256.png rename to events/pride/animated/logo_omnisexual/logo_omnisexual_256.png diff --git a/seasonal/pride/animated/logo_omnisexual/logo_omnisexual_512.png b/events/pride/animated/logo_omnisexual/logo_omnisexual_512.png similarity index 100% rename from seasonal/pride/animated/logo_omnisexual/logo_omnisexual_512.png rename to events/pride/animated/logo_omnisexual/logo_omnisexual_512.png diff --git a/seasonal/pride/animated/logo_omnisexual/logo_omnisexual_64.png b/events/pride/animated/logo_omnisexual/logo_omnisexual_64.png similarity index 100% rename from seasonal/pride/animated/logo_omnisexual/logo_omnisexual_64.png rename to events/pride/animated/logo_omnisexual/logo_omnisexual_64.png diff --git a/seasonal/pride/animated/logo_omnisexual/logo_omnisexual_large.png b/events/pride/animated/logo_omnisexual/logo_omnisexual_large.png similarity index 100% rename from seasonal/pride/animated/logo_omnisexual/logo_omnisexual_large.png rename to events/pride/animated/logo_omnisexual/logo_omnisexual_large.png diff --git a/seasonal/pride/animated/logo_pangender/logo_pandgender.png b/events/pride/animated/logo_pangender/logo_pandgender.png similarity index 100% rename from seasonal/pride/animated/logo_pangender/logo_pandgender.png rename to events/pride/animated/logo_pangender/logo_pandgender.png diff --git a/seasonal/pride/animated/logo_pangender/logo_pandgender.svg b/events/pride/animated/logo_pangender/logo_pandgender.svg similarity index 100% rename from seasonal/pride/animated/logo_pangender/logo_pandgender.svg rename to events/pride/animated/logo_pangender/logo_pandgender.svg diff --git a/seasonal/pride/animated/logo_pangender/logo_pandgender_256.png b/events/pride/animated/logo_pangender/logo_pandgender_256.png similarity index 100% rename from seasonal/pride/animated/logo_pangender/logo_pandgender_256.png rename to events/pride/animated/logo_pangender/logo_pandgender_256.png diff --git a/seasonal/pride/animated/logo_pangender/logo_pandgender_512.png b/events/pride/animated/logo_pangender/logo_pandgender_512.png similarity index 100% rename from seasonal/pride/animated/logo_pangender/logo_pandgender_512.png rename to events/pride/animated/logo_pangender/logo_pandgender_512.png diff --git a/seasonal/pride/animated/logo_pangender/logo_pandgender_64.png b/events/pride/animated/logo_pangender/logo_pandgender_64.png similarity index 100% rename from seasonal/pride/animated/logo_pangender/logo_pandgender_64.png rename to events/pride/animated/logo_pangender/logo_pandgender_64.png diff --git a/seasonal/pride/animated/logo_pangender/logo_pandgender_large.png b/events/pride/animated/logo_pangender/logo_pandgender_large.png similarity index 100% rename from seasonal/pride/animated/logo_pangender/logo_pandgender_large.png rename to events/pride/animated/logo_pangender/logo_pandgender_large.png diff --git a/seasonal/pride/animated/logo_pansexual/logo_pansexual.png b/events/pride/animated/logo_pansexual/logo_pansexual.png similarity index 100% rename from seasonal/pride/animated/logo_pansexual/logo_pansexual.png rename to events/pride/animated/logo_pansexual/logo_pansexual.png diff --git a/seasonal/pride/animated/logo_pansexual/logo_pansexual.svg b/events/pride/animated/logo_pansexual/logo_pansexual.svg similarity index 100% rename from seasonal/pride/animated/logo_pansexual/logo_pansexual.svg rename to events/pride/animated/logo_pansexual/logo_pansexual.svg diff --git a/seasonal/pride/animated/logo_pansexual/logo_pansexual_256.png b/events/pride/animated/logo_pansexual/logo_pansexual_256.png similarity index 100% rename from seasonal/pride/animated/logo_pansexual/logo_pansexual_256.png rename to events/pride/animated/logo_pansexual/logo_pansexual_256.png diff --git a/seasonal/pride/animated/logo_pansexual/logo_pansexual_512.png b/events/pride/animated/logo_pansexual/logo_pansexual_512.png similarity index 100% rename from seasonal/pride/animated/logo_pansexual/logo_pansexual_512.png rename to events/pride/animated/logo_pansexual/logo_pansexual_512.png diff --git a/seasonal/pride/animated/logo_pansexual/logo_pansexual_64.png b/events/pride/animated/logo_pansexual/logo_pansexual_64.png similarity index 100% rename from seasonal/pride/animated/logo_pansexual/logo_pansexual_64.png rename to events/pride/animated/logo_pansexual/logo_pansexual_64.png diff --git a/seasonal/pride/animated/logo_pansexual/logo_pansexual_large.png b/events/pride/animated/logo_pansexual/logo_pansexual_large.png similarity index 100% rename from seasonal/pride/animated/logo_pansexual/logo_pansexual_large.png rename to events/pride/animated/logo_pansexual/logo_pansexual_large.png diff --git a/seasonal/pride/animated/logo_polysexual/logo_polysexual.png b/events/pride/animated/logo_polysexual/logo_polysexual.png similarity index 100% rename from seasonal/pride/animated/logo_polysexual/logo_polysexual.png rename to events/pride/animated/logo_polysexual/logo_polysexual.png diff --git a/seasonal/pride/animated/logo_polysexual/logo_polysexual.svg b/events/pride/animated/logo_polysexual/logo_polysexual.svg similarity index 100% rename from seasonal/pride/animated/logo_polysexual/logo_polysexual.svg rename to events/pride/animated/logo_polysexual/logo_polysexual.svg diff --git a/seasonal/pride/animated/logo_polysexual/logo_polysexual_256.png b/events/pride/animated/logo_polysexual/logo_polysexual_256.png similarity index 100% rename from seasonal/pride/animated/logo_polysexual/logo_polysexual_256.png rename to events/pride/animated/logo_polysexual/logo_polysexual_256.png diff --git a/seasonal/pride/animated/logo_polysexual/logo_polysexual_512.png b/events/pride/animated/logo_polysexual/logo_polysexual_512.png similarity index 100% rename from seasonal/pride/animated/logo_polysexual/logo_polysexual_512.png rename to events/pride/animated/logo_polysexual/logo_polysexual_512.png diff --git a/seasonal/pride/animated/logo_polysexual/logo_polysexual_64.png b/events/pride/animated/logo_polysexual/logo_polysexual_64.png similarity index 100% rename from seasonal/pride/animated/logo_polysexual/logo_polysexual_64.png rename to events/pride/animated/logo_polysexual/logo_polysexual_64.png diff --git a/seasonal/pride/animated/logo_polysexual/logo_polysexual_large.png b/events/pride/animated/logo_polysexual/logo_polysexual_large.png similarity index 100% rename from seasonal/pride/animated/logo_polysexual/logo_polysexual_large.png rename to events/pride/animated/logo_polysexual/logo_polysexual_large.png diff --git a/seasonal/pride/animated/logo_pride.gif b/events/pride/animated/logo_pride.gif similarity index 100% rename from seasonal/pride/animated/logo_pride.gif rename to events/pride/animated/logo_pride.gif diff --git a/seasonal/pride/animated/logo_transgender/logo_transgender.png b/events/pride/animated/logo_transgender/logo_transgender.png similarity index 100% rename from seasonal/pride/animated/logo_transgender/logo_transgender.png rename to events/pride/animated/logo_transgender/logo_transgender.png diff --git a/seasonal/pride/animated/logo_transgender/logo_transgender.svg b/events/pride/animated/logo_transgender/logo_transgender.svg similarity index 100% rename from seasonal/pride/animated/logo_transgender/logo_transgender.svg rename to events/pride/animated/logo_transgender/logo_transgender.svg diff --git a/seasonal/pride/animated/logo_transgender/logo_transgender_256.png b/events/pride/animated/logo_transgender/logo_transgender_256.png similarity index 100% rename from seasonal/pride/animated/logo_transgender/logo_transgender_256.png rename to events/pride/animated/logo_transgender/logo_transgender_256.png diff --git a/seasonal/pride/animated/logo_transgender/logo_transgender_512.png b/events/pride/animated/logo_transgender/logo_transgender_512.png similarity index 100% rename from seasonal/pride/animated/logo_transgender/logo_transgender_512.png rename to events/pride/animated/logo_transgender/logo_transgender_512.png diff --git a/seasonal/pride/animated/logo_transgender/logo_transgender_64.png b/events/pride/animated/logo_transgender/logo_transgender_64.png similarity index 100% rename from seasonal/pride/animated/logo_transgender/logo_transgender_64.png rename to events/pride/animated/logo_transgender/logo_transgender_64.png diff --git a/seasonal/pride/animated/logo_transgender/logo_transgender_large.png b/events/pride/animated/logo_transgender/logo_transgender_large.png similarity index 100% rename from seasonal/pride/animated/logo_transgender/logo_transgender_large.png rename to events/pride/animated/logo_transgender/logo_transgender_large.png diff --git a/seasonal/pride/animated/logo_trigender/logo_trigender.png b/events/pride/animated/logo_trigender/logo_trigender.png similarity index 100% rename from seasonal/pride/animated/logo_trigender/logo_trigender.png rename to events/pride/animated/logo_trigender/logo_trigender.png diff --git a/seasonal/pride/animated/logo_trigender/logo_trigender.svg b/events/pride/animated/logo_trigender/logo_trigender.svg similarity index 100% rename from seasonal/pride/animated/logo_trigender/logo_trigender.svg rename to events/pride/animated/logo_trigender/logo_trigender.svg diff --git a/seasonal/pride/animated/logo_trigender/logo_trigender_256.png b/events/pride/animated/logo_trigender/logo_trigender_256.png similarity index 100% rename from seasonal/pride/animated/logo_trigender/logo_trigender_256.png rename to events/pride/animated/logo_trigender/logo_trigender_256.png diff --git a/seasonal/pride/animated/logo_trigender/logo_trigender_512.png b/events/pride/animated/logo_trigender/logo_trigender_512.png similarity index 100% rename from seasonal/pride/animated/logo_trigender/logo_trigender_512.png rename to events/pride/animated/logo_trigender/logo_trigender_512.png diff --git a/seasonal/pride/animated/logo_trigender/logo_trigender_64.png b/events/pride/animated/logo_trigender/logo_trigender_64.png similarity index 100% rename from seasonal/pride/animated/logo_trigender/logo_trigender_64.png rename to events/pride/animated/logo_trigender/logo_trigender_64.png diff --git a/seasonal/pride/animated/logo_trigender/logo_trigender_large.png b/events/pride/animated/logo_trigender/logo_trigender_large.png similarity index 100% rename from seasonal/pride/animated/logo_trigender/logo_trigender_large.png rename to events/pride/animated/logo_trigender/logo_trigender_large.png diff --git a/seasonal/pride/banner.png b/events/pride/banner.png similarity index 100% rename from seasonal/pride/banner.png rename to events/pride/banner.png diff --git a/seasonal/pride/black/banner.png b/events/pride/black/banner.png similarity index 100% rename from seasonal/pride/black/banner.png rename to events/pride/black/banner.png diff --git a/seasonal/pride/black/logo.png b/events/pride/black/logo.png similarity index 100% rename from seasonal/pride/black/logo.png rename to events/pride/black/logo.png diff --git a/seasonal/pride/black/logo.svg b/events/pride/black/logo.svg similarity index 100% rename from seasonal/pride/black/logo.svg rename to events/pride/black/logo.svg diff --git a/seasonal/pride/black/logo_256.png b/events/pride/black/logo_256.png similarity index 100% rename from seasonal/pride/black/logo_256.png rename to events/pride/black/logo_256.png diff --git a/seasonal/pride/black/logo_512.png b/events/pride/black/logo_512.png similarity index 100% rename from seasonal/pride/black/logo_512.png rename to events/pride/black/logo_512.png diff --git a/seasonal/pride/black/logo_64.png b/events/pride/black/logo_64.png similarity index 100% rename from seasonal/pride/black/logo_64.png rename to events/pride/black/logo_64.png diff --git a/seasonal/pride/black/logo_large.png b/events/pride/black/logo_large.png similarity index 100% rename from seasonal/pride/black/logo_large.png rename to events/pride/black/logo_large.png diff --git a/events/pride/meta.md b/events/pride/meta.md new file mode 100644 index 00000000..6b465a6f --- /dev/null +++ b/events/pride/meta.md @@ -0,0 +1,7 @@ +--- +start_date: June 1 +end_date: June 30 +--- +**Pride** + +[LGBTQ+ pride](https://en.wikipedia.org/wiki/Gay_pride) is the promotion of the self-affirmation, dignity, equality, visibility, and rights of members of the LGBTQ+ community as a social group. It’s the predominant outlook that fuels a number of rights movements. In the United States, the event serves as a reminder of the [Stonewall riots](https://en.wikipedia.org/wiki/Stonewall_riots) of 1969. diff --git a/seasonal/pride/server_icons/logo_pride.gif b/events/pride/server_icons/logo_pride.gif similarity index 100% rename from seasonal/pride/server_icons/logo_pride.gif rename to events/pride/server_icons/logo_pride.gif diff --git a/seasonal/pride/static/logo_pride.png b/events/pride/static/logo_pride.png similarity index 100% rename from seasonal/pride/static/logo_pride.png rename to events/pride/static/logo_pride.png diff --git a/seasonal/pride/static/logo_pride.svg b/events/pride/static/logo_pride.svg similarity index 100% rename from seasonal/pride/static/logo_pride.svg rename to events/pride/static/logo_pride.svg diff --git a/seasonal/pride/static/logo_pride_256.png b/events/pride/static/logo_pride_256.png similarity index 100% rename from seasonal/pride/static/logo_pride_256.png rename to events/pride/static/logo_pride_256.png diff --git a/seasonal/pride/static/logo_pride_512.png b/events/pride/static/logo_pride_512.png similarity index 100% rename from seasonal/pride/static/logo_pride_512.png rename to events/pride/static/logo_pride_512.png diff --git a/seasonal/pride/static/logo_pride_64.png b/events/pride/static/logo_pride_64.png similarity index 100% rename from seasonal/pride/static/logo_pride_64.png rename to events/pride/static/logo_pride_64.png diff --git a/seasonal/pride/static/logo_pride_large.png b/events/pride/static/logo_pride_large.png similarity index 100% rename from seasonal/pride/static/logo_pride_large.png rename to events/pride/static/logo_pride_large.png diff --git a/events/requirements.txt b/events/requirements.txt new file mode 100644 index 00000000..1d3b3596 --- /dev/null +++ b/events/requirements.txt @@ -0,0 +1,3 @@ +# Python: 3.8 +python-frontmatter==1.0.0 +pyyaml==5.4.1 diff --git a/events/st_patricks_day/st_patricks_banner.svg b/events/st_patricks_day/assets/banner.svg similarity index 100% rename from events/st_patricks_day/st_patricks_banner.svg rename to events/st_patricks_day/assets/banner.svg diff --git a/events/st_patricks_day/st_patricks_day_server_icon.svg b/events/st_patricks_day/assets/server_icon.svg similarity index 100% rename from events/st_patricks_day/st_patricks_day_server_icon.svg rename to events/st_patricks_day/assets/server_icon.svg diff --git a/events/st_patricks_day/st_patricks_banner.png b/events/st_patricks_day/banner.png similarity index 100% rename from events/st_patricks_day/st_patricks_banner.png rename to events/st_patricks_day/banner.png diff --git a/events/st_patricks_day/meta.md b/events/st_patricks_day/meta.md new file mode 100644 index 00000000..f161719f --- /dev/null +++ b/events/st_patricks_day/meta.md @@ -0,0 +1,7 @@ +--- +start_date: March 10 +end_date: March 18 +--- +**Saint Patrick's Day** + +[Saint Patrick's Day](https://en.wikipedia.org/wiki/Saint_Patrick%27s_Day) is an annual event celebrating the culture and heritage of the Irish. On the 17th of March, the members of the Irish diaspora commemorate the death of [Saint Patrick](https://en.wikipedia.org/wiki/Saint_Patrick), the primary patron saint of Ireland. Celebrations commonly include public parades, festivals and traditional music. Parade members often dress in green attire decorated with the shamrock symbol. diff --git a/events/st_patricks_day/st_patricks_server_icon.png b/events/st_patricks_day/server_icons/server_icon.png similarity index 100% rename from events/st_patricks_day/st_patricks_server_icon.png rename to events/st_patricks_day/server_icons/server_icon.png diff --git a/seasonal/valentines/animated/loved_up_256.gif b/events/valentines/animated/loved_up_256.gif similarity index 100% rename from seasonal/valentines/animated/loved_up_256.gif rename to events/valentines/animated/loved_up_256.gif diff --git a/seasonal/valentines/animated/loved_up_512.gif b/events/valentines/animated/loved_up_512.gif similarity index 100% rename from seasonal/valentines/animated/loved_up_512.gif rename to events/valentines/animated/loved_up_512.gif diff --git a/seasonal/valentines/animated/loved_up_64.gif b/events/valentines/animated/loved_up_64.gif similarity index 100% rename from seasonal/valentines/animated/loved_up_64.gif rename to events/valentines/animated/loved_up_64.gif diff --git a/seasonal/valentines/banner.png b/events/valentines/banner.png similarity index 100% rename from seasonal/valentines/banner.png rename to events/valentines/banner.png diff --git a/events/valentines/meta.md b/events/valentines/meta.md new file mode 100644 index 00000000..31a0488f --- /dev/null +++ b/events/valentines/meta.md @@ -0,0 +1,7 @@ +--- +start_date: February 1 +end_date: February 15 +--- +**Valentine's Day** + +[Valentine's Day](https://en.wikipedia.org/wiki/Valentine%27s_Day) is an international celebration centered around romantic love. It is traditionally associated with red hearts, romance, flowers, candy or other sweet things, and the exchange of cards or messages, called *valentines*, that express love. It occurs annually on February 14th. diff --git a/seasonal/valentines/server_icons/loved_up_256.gif b/events/valentines/server_icons/loved_up_256.gif similarity index 100% rename from seasonal/valentines/server_icons/loved_up_256.gif rename to events/valentines/server_icons/loved_up_256.gif diff --git a/seasonal/valentines/static/loved_up.min.svg b/events/valentines/static/loved_up.min.svg similarity index 100% rename from seasonal/valentines/static/loved_up.min.svg rename to events/valentines/static/loved_up.min.svg diff --git a/seasonal/valentines/static/loved_up.png b/events/valentines/static/loved_up.png similarity index 100% rename from seasonal/valentines/static/loved_up.png rename to events/valentines/static/loved_up.png diff --git a/seasonal/valentines/static/loved_up.svg b/events/valentines/static/loved_up.svg similarity index 100% rename from seasonal/valentines/static/loved_up.svg rename to events/valentines/static/loved_up.svg diff --git a/seasonal/valentines/static/loved_up_256.png b/events/valentines/static/loved_up_256.png similarity index 100% rename from seasonal/valentines/static/loved_up_256.png rename to events/valentines/static/loved_up_256.png diff --git a/seasonal/valentines/static/loved_up_512.png b/events/valentines/static/loved_up_512.png similarity index 100% rename from seasonal/valentines/static/loved_up_512.png rename to events/valentines/static/loved_up_512.png diff --git a/seasonal/valentines/static/loved_up_64.png b/events/valentines/static/loved_up_64.png similarity index 100% rename from seasonal/valentines/static/loved_up_64.png rename to events/valentines/static/loved_up_64.png diff --git a/seasonal/valentines/static/loved_up_large.png b/events/valentines/static/loved_up_large.png similarity index 100% rename from seasonal/valentines/static/loved_up_large.png rename to events/valentines/static/loved_up_large.png diff --git a/seasonal/valentines/static/loved_up_transparent.png b/events/valentines/static/loved_up_transparent.png similarity index 100% rename from seasonal/valentines/static/loved_up_transparent.png rename to events/valentines/static/loved_up_transparent.png diff --git a/events/validation.py b/events/validation.py new file mode 100644 index 00000000..ff192f0b --- /dev/null +++ b/events/validation.py @@ -0,0 +1,239 @@ +""" +Event validation. + +This module contains the logic used to validate event definitions. It runs in CI to validate pull requests, +but can and should also be ran locally. + +In order to run, install dependencies from 'events/requirements.txt'. + +We check that each event directory satisfies the following: +* Contains 'banner.png', 'meta.md' and 'server_icons' with at least 1 file inside +* The 'meta.md' file either registers the event as fallback, or specifies the start and end dates +* The end date must either be the same as the start date, or chronologically subsequent +* The 'meta.md' file contains an event description between 1 and 2048 characters in length + +If all events are set up correctly, we also validate that: +* There is exactly 1 fallback event +* Non-fallback events do not collide in time + +If a problem in event configuration is detected, the program will print information to stdout and stop with an +exit code of 1. Otherwise, exit code 0 indicates that events are set up correctly. +""" + +import sys +import typing as t +from collections import defaultdict +from datetime import date, datetime, timedelta +from pathlib import Path + +try: + import frontmatter +except ImportError: + print("Please install the dependencies specified in 'events/requirements.txt'") + sys.exit(1) + +# Arbitrary year in which we do date checks (note: intentionally leap to allow Feb 29) +ARBITRARY_YEAR = 2020 + + +class Misconfiguration(Exception): + """Indication of event misconfiguration.""" + + pass + + +class Event(t.NamedTuple): + """Runtime representation of a correctly defined event.""" + + name: str + fallback: bool + start_date: t.Optional[date] + end_date: t.Optional[date] + description: str + + +def make_event(name: str, from_dir: Path) -> Event: + """ + Construct an `Event` instance from `from_dir`. + + This function performs all necessary validation to ensure that the event is configured properly. If an problem + is encountered, `Misconfiguration` will be raised with an explanation. + + An `Event` instance is returned only if the event is entirely valid. + """ + server_icons = Path(from_dir, "server_icons") + banner = Path(from_dir, "banner.png") + meta = Path(from_dir, "meta.md") + + asset_requirements = [ + ("server_icons", server_icons.is_dir()), + ("banner.png", banner.is_file()), + ("meta.md", meta.is_file()), + ] + missing_assets = ", ".join(name for name, exists in asset_requirements if not exists) + + if missing_assets: + raise Misconfiguration(f"Missing assets: {missing_assets}") + + icons = [icon for icon in server_icons.iterdir() if icon.is_file()] + + if not icons: + raise Misconfiguration("No files in 'server_icons'") + + try: + meta_bytes = meta.read_bytes() + attrs, description = frontmatter.parse(meta_bytes, encoding="UTF-8") + except Exception as parse_exc: + raise Misconfiguration(f"Failed to parse 'meta.md': {parse_exc}") + + if not description: + raise Misconfiguration("No description in 'meta.md'") + + if not len(description) <= 2048: + raise Misconfiguration(f"Description too long ({len(description)} characters), must be <= 2048") + + fallback = attrs.get("fallback", False) + + if not isinstance(fallback, bool): + raise Misconfiguration(f"Value under 'fallback' key must be a boolean") + + if fallback: + return Event(name=name, fallback=True, start_date=None, end_date=None, description=description) + + missing_dates = {"start_date", "end_date"} - attrs.keys() + + if missing_dates: + as_string = ", ".join(missing_dates) + raise Misconfiguration(f"Non-fallback event must have attributes: {as_string}") + + date_fmt = "%B %d %Y" # Ex: July 10 2020 + + start_date = attrs["start_date"] + try: + start_date = datetime.strptime(f"{start_date} {ARBITRARY_YEAR}", date_fmt).date() + except Exception as exc: + raise Misconfiguration(f"Attribute 'start_date' with value '{start_date}' failed to parse: {exc}") + + end_date = attrs["end_date"] + try: + end_date = datetime.strptime(f"{end_date} {ARBITRARY_YEAR}", date_fmt).date() + except Exception as exc: + raise Misconfiguration(f"Attribute 'end_date' with value '{end_date}' failed to parse: {exc}") + + if not start_date <= end_date: + raise Misconfiguration("End date must be equal or subsequent to start date") + + return Event(name=name, fallback=False, start_date=start_date, end_date=end_date, description=description) + + +def active_days(event: Event) -> t.Iterator[date]: + """ + Generate all days in which `event` is active. + + This can only be called for non-fallback events. The fallback event does not have start and end dates. + """ + if None in (event.start_date, event.end_date): + raise RuntimeError("Cannot generate days: event does not have start and date!") + + if not event.start_date <= event.end_date: + raise RuntimeError("Cannot generate days: start date does not precede end date!") + + state = event.start_date + while True: + yield state + if state == event.end_date: + break + state += timedelta(days=1) + + +def find_collisions(events: t.List[Event]) -> t.Dict[date, t.List[Event]]: + """ + Find the mapping of dates to colliding events, if any. + + The `events` arg cannot contain the fallback event. + """ + schedule = defaultdict(list) + + for event in events: + for day in active_days(event): + schedule[day].append(event) + + return {day: events for day, events in schedule.items() if len(events) > 1} + + +def check_date_configuration(events: t.List[Event]) -> None: + """ + Ensure that start and end dates of `events` do not collide. + + Additionally, this also verifies that there is exactly 1 fallback event. + + Raise `Misconfiguration` with a listing of colliding events, if any are found. + """ + fallback_events = [event for event in events if event.fallback] + + if not fallback_events: + raise Misconfiguration(f"There is no fallback event") + + if len(fallback_events) > 1: + as_string = ", ".join(event.name for event in fallback_events) + raise Misconfiguration(f"There are multiple fallback events: {as_string} (must be exactly 1)") + + non_fallback_events = [event for event in events if not event.fallback] + collisions = find_collisions(non_fallback_events) + + if not collisions: + return + + report_lines = [] + + for day, collision in collisions.items(): + date_string = day.strftime("%B %d") # Ex: January 24 + event_string = ", ".join(event.name for event in collision) + + report_lines.append(f"{date_string}: {event_string}") + + collision_report = "\n".join(report_lines) + raise Misconfiguration(f"Event collision detected:\n{collision_report}") + + +def main() -> None: + """ + Discover and validate all events. + + We first validate individual events and load them into `Event` instances. + + If all events are configured properly, we proceed with cross-event validation, checking for the existence + of the fallback event and finding any conflicts between non-fallback events. + + If any issues are encountered, stop the program with a return code of 1, and otherwise 0. + """ + parent = Path(__file__).parent + event_directories = [directory for directory in parent.iterdir() if directory.is_dir()] + + events: t.List[Event] = [] + + for directory in event_directories: + event_name = directory.name + try: + event = make_event(event_name, directory) + except Misconfiguration as misconfiguration: + print(f"[FAIL] [{event_name}] {misconfiguration}") + else: + print(f"[PASS] [{event_name}]") + events.append(event) + + if len(events) != len(event_directories): + print("Dates will not be verified until all events pass validation!") + sys.exit(1) + + try: + check_date_configuration(events) + except Misconfiguration as misconfiguration: + print(f"[FAIL] {misconfiguration}") + sys.exit(1) + + print(f"[PASS] All {len(events)} events passed validation") + + +if __name__ == "__main__": + main() diff --git a/events/game_jam_2020/game jam 2020 - announcement header.png b/jams/game_jam_2020/game jam 2020 - announcement header.png similarity index 100% rename from events/game_jam_2020/game jam 2020 - announcement header.png rename to jams/game_jam_2020/game jam 2020 - announcement header.png diff --git a/events/game_jam_2020/game jam 2020 - discord banner.png b/jams/game_jam_2020/game jam 2020 - discord banner.png similarity index 100% rename from events/game_jam_2020/game jam 2020 - discord banner.png rename to jams/game_jam_2020/game jam 2020 - discord banner.png diff --git a/events/game_jam_2020/game jam 2020 - website banner.png b/jams/game_jam_2020/game jam 2020 - website banner.png similarity index 100% rename from events/game_jam_2020/game jam 2020 - website banner.png rename to jams/game_jam_2020/game jam 2020 - website banner.png diff --git a/events/game_jam_2020/gamejam 2020 - icon (full).png b/jams/game_jam_2020/gamejam 2020 - icon (full).png similarity index 100% rename from events/game_jam_2020/gamejam 2020 - icon (full).png rename to jams/game_jam_2020/gamejam 2020 - icon (full).png diff --git a/events/game_jam_2020/gamejam 2020 - icon.png b/jams/game_jam_2020/gamejam 2020 - icon.png similarity index 100% rename from events/game_jam_2020/gamejam 2020 - icon.png rename to jams/game_jam_2020/gamejam 2020 - icon.png diff --git a/events/game_jam_2020/gamejam 2020 - icon.svg b/jams/game_jam_2020/gamejam 2020 - icon.svg similarity index 100% rename from events/game_jam_2020/gamejam 2020 - icon.svg rename to jams/game_jam_2020/gamejam 2020 - icon.svg diff --git a/events/pyweek/pyweek_30/pyweek_30 discord banner.png b/jams/pyweek_30/banner.png similarity index 100% rename from events/pyweek/pyweek_30/pyweek_30 discord banner.png rename to jams/pyweek_30/banner.png diff --git a/events/pyweek/pyweek_30/PyWeek 30 icon.gif b/jams/pyweek_30/server_icons/icon_1.gif similarity index 100% rename from events/pyweek/pyweek_30/PyWeek 30 icon.gif rename to jams/pyweek_30/server_icons/icon_1.gif diff --git a/events/pyweek/pyweek_30/PyWeek 30 icon2.gif b/jams/pyweek_30/server_icons/icon_2.gif similarity index 100% rename from events/pyweek/pyweek_30/PyWeek 30 icon2.gif rename to jams/pyweek_30/server_icons/icon_2.gif diff --git a/events/pyweek/pyweek_30/PyWeek 30 Icon 3.gif b/jams/pyweek_30/server_icons/icon_3.gif similarity index 100% rename from events/pyweek/pyweek_30/PyWeek 30 Icon 3.gif rename to jams/pyweek_30/server_icons/icon_3.gif diff --git a/events/pyweek/pyweek_30/PyWeek 30 icon4.gif b/jams/pyweek_30/server_icons/icon_4.gif similarity index 100% rename from events/pyweek/pyweek_30/PyWeek 30 icon4.gif rename to jams/pyweek_30/server_icons/icon_4.gif diff --git a/events/pyweek/pyweek_30/PyWeek 30 Icon 5.gif b/jams/pyweek_30/server_icons/icon_5.gif similarity index 100% rename from events/pyweek/pyweek_30/PyWeek 30 Icon 5.gif rename to jams/pyweek_30/server_icons/icon_5.gif diff --git a/events/retro_gaming/retro_gaming_animated/logo_spin_plain_126.gif b/jams/retro_gaming/assets_animated/logo_spin_plain_126.gif similarity index 100% rename from events/retro_gaming/retro_gaming_animated/logo_spin_plain_126.gif rename to jams/retro_gaming/assets_animated/logo_spin_plain_126.gif diff --git a/events/retro_gaming/retro_gaming_animated/logo_spin_plain_504.gif b/jams/retro_gaming/assets_animated/logo_spin_plain_504.gif similarity index 100% rename from events/retro_gaming/retro_gaming_animated/logo_spin_plain_504.gif rename to jams/retro_gaming/assets_animated/logo_spin_plain_504.gif diff --git a/events/retro_gaming/retro_gaming_animated/logo_spin_plain_63.gif b/jams/retro_gaming/assets_animated/logo_spin_plain_63.gif similarity index 100% rename from events/retro_gaming/retro_gaming_animated/logo_spin_plain_63.gif rename to jams/retro_gaming/assets_animated/logo_spin_plain_63.gif diff --git a/events/retro_gaming/banner.psd b/jams/retro_gaming/assets_static/banner.psd similarity index 100% rename from events/retro_gaming/banner.psd rename to jams/retro_gaming/assets_static/banner.psd diff --git a/events/retro_gaming/retro_gaming/logo_8bit_indexed_24.png b/jams/retro_gaming/assets_static/logo_8bit_indexed_24.png similarity index 100% rename from events/retro_gaming/retro_gaming/logo_8bit_indexed_24.png rename to jams/retro_gaming/assets_static/logo_8bit_indexed_24.png diff --git a/events/retro_gaming/retro_gaming/logo_8bit_indexed_504.png b/jams/retro_gaming/assets_static/logo_8bit_indexed_504.png similarity index 100% rename from events/retro_gaming/retro_gaming/logo_8bit_indexed_504.png rename to jams/retro_gaming/assets_static/logo_8bit_indexed_504.png diff --git a/events/retro_gaming/retro_gaming/logo_8bit_rgb_24.png b/jams/retro_gaming/assets_static/logo_8bit_rgb_24.png similarity index 100% rename from events/retro_gaming/retro_gaming/logo_8bit_rgb_24.png rename to jams/retro_gaming/assets_static/logo_8bit_rgb_24.png diff --git a/events/retro_gaming/retro_gaming/logo_8bit_rgb_504.png b/jams/retro_gaming/assets_static/logo_8bit_rgb_504.png similarity index 100% rename from events/retro_gaming/retro_gaming/logo_8bit_rgb_504.png rename to jams/retro_gaming/assets_static/logo_8bit_rgb_504.png diff --git a/events/retro_gaming/banner.png b/jams/retro_gaming/banner.png similarity index 100% rename from events/retro_gaming/banner.png rename to jams/retro_gaming/banner.png diff --git a/events/retro_gaming/retro_gaming_animated/logo_spin_plain_252.gif b/jams/retro_gaming/server_icons/logo_spin_plain_252.gif similarity index 100% rename from events/retro_gaming/retro_gaming_animated/logo_spin_plain_252.gif rename to jams/retro_gaming/server_icons/logo_spin_plain_252.gif diff --git a/events/summer_code_jam_2020/early internet icon smaller.png b/jams/summer_code_jam_2020/early internet icon smaller.png similarity index 100% rename from events/summer_code_jam_2020/early internet icon smaller.png rename to jams/summer_code_jam_2020/early internet icon smaller.png diff --git a/events/summer_code_jam_2020/early internet icon.png b/jams/summer_code_jam_2020/early internet icon.png similarity index 100% rename from events/summer_code_jam_2020/early internet icon.png rename to jams/summer_code_jam_2020/early internet icon.png diff --git a/events/summer_code_jam_2020/stream assets/aeros camframe.png b/jams/summer_code_jam_2020/stream assets/aeros camframe.png similarity index 100% rename from events/summer_code_jam_2020/stream assets/aeros camframe.png rename to jams/summer_code_jam_2020/stream assets/aeros camframe.png diff --git a/events/summer_code_jam_2020/stream assets/cue card empty.png b/jams/summer_code_jam_2020/stream assets/cue card empty.png similarity index 100% rename from events/summer_code_jam_2020/stream assets/cue card empty.png rename to jams/summer_code_jam_2020/stream assets/cue card empty.png diff --git a/events/summer_code_jam_2020/stream assets/joe camframe.png b/jams/summer_code_jam_2020/stream assets/joe camframe.png similarity index 100% rename from events/summer_code_jam_2020/stream assets/joe camframe.png rename to jams/summer_code_jam_2020/stream assets/joe camframe.png diff --git a/events/summer_code_jam_2020/stream assets/lemonframe.png b/jams/summer_code_jam_2020/stream assets/lemonframe.png similarity index 100% rename from events/summer_code_jam_2020/stream assets/lemonframe.png rename to jams/summer_code_jam_2020/stream assets/lemonframe.png diff --git a/events/summer_code_jam_2020/stream assets/python background.png b/jams/summer_code_jam_2020/stream assets/python background.png similarity index 100% rename from events/summer_code_jam_2020/stream assets/python background.png rename to jams/summer_code_jam_2020/stream assets/python background.png diff --git a/events/summer_code_jam_2020/stream assets/ves camframe.png b/jams/summer_code_jam_2020/stream assets/ves camframe.png similarity index 100% rename from events/summer_code_jam_2020/stream assets/ves camframe.png rename to jams/summer_code_jam_2020/stream assets/ves camframe.png diff --git a/events/summer_code_jam_2020/summer cj 2020 discord banner.png b/jams/summer_code_jam_2020/summer cj 2020 discord banner.png similarity index 100% rename from events/summer_code_jam_2020/summer cj 2020 discord banner.png rename to jams/summer_code_jam_2020/summer cj 2020 discord banner.png diff --git a/events/summer_code_jam_2020/summer code jam - early internet banner 2.png b/jams/summer_code_jam_2020/summer code jam - early internet banner 2.png similarity index 100% rename from events/summer_code_jam_2020/summer code jam - early internet banner 2.png rename to jams/summer_code_jam_2020/summer code jam - early internet banner 2.png diff --git a/events/summer_code_jam_2020/summer code jam - early internet banner 3.png b/jams/summer_code_jam_2020/summer code jam - early internet banner 3.png similarity index 100% rename from events/summer_code_jam_2020/summer code jam - early internet banner 3.png rename to jams/summer_code_jam_2020/summer code jam - early internet banner 3.png diff --git a/events/summer_code_jam_2020/summer code jam - early internet banner 4.png b/jams/summer_code_jam_2020/summer code jam - early internet banner 4.png similarity index 100% rename from events/summer_code_jam_2020/summer code jam - early internet banner 4.png rename to jams/summer_code_jam_2020/summer code jam - early internet banner 4.png diff --git a/events/summer_code_jam_2020/summer code jam - early internet banner 5.png b/jams/summer_code_jam_2020/summer code jam - early internet banner 5.png similarity index 100% rename from events/summer_code_jam_2020/summer code jam - early internet banner 5.png rename to jams/summer_code_jam_2020/summer code jam - early internet banner 5.png diff --git a/events/summer_code_jam_2020/summer code jam - early internet banner 6.png b/jams/summer_code_jam_2020/summer code jam - early internet banner 6.png similarity index 100% rename from events/summer_code_jam_2020/summer code jam - early internet banner 6.png rename to jams/summer_code_jam_2020/summer code jam - early internet banner 6.png diff --git a/events/summer_code_jam_2020/summer code jam - early internet banner.png b/jams/summer_code_jam_2020/summer code jam - early internet banner.png similarity index 100% rename from events/summer_code_jam_2020/summer code jam - early internet banner.png rename to jams/summer_code_jam_2020/summer code jam - early internet banner.png diff --git a/events/summer_code_jam_2020/summer code jam 2020 - website banner.png b/jams/summer_code_jam_2020/summer code jam 2020 - website banner.png similarity index 100% rename from events/summer_code_jam_2020/summer code jam 2020 - website banner.png rename to jams/summer_code_jam_2020/summer code jam 2020 - website banner.png diff --git a/events/summer_code_jam_2020/summer code jam logo.png b/jams/summer_code_jam_2020/summer code jam logo.png similarity index 100% rename from events/summer_code_jam_2020/summer code jam logo.png rename to jams/summer_code_jam_2020/summer code jam logo.png diff --git a/events/winer_code_jam_2020/code jam 6 - announcement banner.png b/jams/winer_code_jam_2020/code jam 6 - announcement banner.png similarity index 100% rename from events/winer_code_jam_2020/code jam 6 - announcement banner.png rename to jams/winer_code_jam_2020/code jam 6 - announcement banner.png diff --git a/events/winer_code_jam_2020/code jam 6 - website banner.png b/jams/winer_code_jam_2020/code jam 6 - website banner.png similarity index 100% rename from events/winer_code_jam_2020/code jam 6 - website banner.png rename to jams/winer_code_jam_2020/code jam 6 - website banner.png diff --git a/events/winer_code_jam_2020/code jam 6.png b/jams/winer_code_jam_2020/code jam 6.png similarity index 100% rename from events/winer_code_jam_2020/code jam 6.png rename to jams/winer_code_jam_2020/code jam 6.png diff --git a/seasonal/README.md b/seasonal/README.md deleted file mode 100644 index 72f72977..00000000 --- a/seasonal/README.md +++ /dev/null @@ -1,64 +0,0 @@ -### Seasonal branding - -Each folder in this directory contains branding inspired by a specific season. Such assets are temporarily applied to the server to celebrate holidays, promote on-going events, or to show support for various world-wide movements. - -While the primary function is to organize the various assets we have, they are also used by **[Seasonalbot](https://github.com/python-discord/seasonalbot)'s branding manager**. The bot will automatically apply seasonal assets pulled directly from this repository to the server. In order for Seasonalbot to properly detect and apply assets, certain conventions must be followed. - -#### Automatically managed assets - -There are 3 types of seasonal assets: **server icons**, **server banners**, and **bot avatars**. While a season always has **at most 1** banner and bot avatar, there may be **multiple** server icons. In such a case, Seasonalbot will periodically cycle available icons at a configurable interval (once every *n* days). - -In order for banners and avatars to be discovered, they shall be placed directly in a seasonal directory, named `seasonal//banner.png` and `.../avatar.png` respectively. Note that these assets are expected to *always* carry the **png** extension. Server icons shall always (regardless of whether the is only 1, or many) be placed in a nested directory, as follows: `.../server_icons/festive_256.gif`. Server icons are name and extension agnostic - they are registered simply by being present in the `server_icons/` directory. - -If a non-evergreen season does not provide all assets, the bot will search for the missing ones in the evergreen directory. We will illustrate this behaviour with the following example: - -``` -├── seasonal/ -│ -│ ├── easter/ -│ │ ├── avatar.png -│ │ ├── banner.png -│ -│ ├── christmas/ -│ │ ├── server_icons/ -│ │ │ ├── snowing.gif -│ │ ├── avatar.png -│ -│ ├── evergreen/ -│ │ ├── server_icons/ -│ │ │ ├── winky.gif -│ │ │ ├── spinner.png -│ │ ├── avatar.png -│ │ ├── banner.png -``` - -While the **easter** season is active, the bot will apply its `avatar.png` and `banner.png` assets. However as the season does not provide any server icons, the bot will continue to cycle the evergreen ones - `winky.gif` and `spinner.png`. - -Once we enter the **christmas** season, the bot will apply the `snowing.gif` server icon - it will not cycle, as there is only one icon. Additionally, the christmas `avatar.png` will be used. However, the bot will fall back to the evergreen `banner.png`. - -While no specific season is active, the bot simply uses the evergreen one. - -This means that there will **always** be available assets, as long as they are present in the evergreen directory. Should an asset become missing in this directory, the bot will simply ignore it. - -Failure to comply with this schema will not break Seasonalbot, but it will prevent its branding manager from functioning properly. Please refer to its `BrandingManager` cog for further documentation and implementation details. - -#### Other assets - -Any files or sub-directories *not* listed above will be entirely ignored by Seasonalbot. A seasonal directory may be arbitrarily structured, as long as it doesn't interfere with the above-described conventions. This includes the `server_icons/` directory, which can have an arbitrary amount of sub-directories that the bot will ignore. Seasonalbot will *only* cycle **files** *directly* in `server_icons/`. - -For example: - -``` -│ ├── some_season/ -│ │ ├── server_icons/ -│ │ │ ├── alt_size/ -│ │ │ │ ├── a_large.gif -│ │ │ │ ├── b_large.png -│ │ │ ├── a.gif -│ │ │ ├── b.png -│ │ ├── avatar.png -│ │ ├── banner.png -│ │ ├── random_cat_pic.png -``` - -In such a case, the bot will cycle `a.gif` and `b.png` server icons, and use the provided `avatar.png` and `banner.png`. All other files are ignored. diff --git a/seasonal/christmas/avatar.png b/seasonal/christmas/avatar.png deleted file mode 100644 index ca46f2a6..00000000 Binary files a/seasonal/christmas/avatar.png and /dev/null differ diff --git a/seasonal/diwali/avatar.png b/seasonal/diwali/avatar.png deleted file mode 100644 index 3fe640db..00000000 Binary files a/seasonal/diwali/avatar.png and /dev/null differ diff --git a/seasonal/easter/avatar.png b/seasonal/easter/avatar.png deleted file mode 100644 index 38c9faa3..00000000 Binary files a/seasonal/easter/avatar.png and /dev/null differ diff --git a/seasonal/evergreen/avatar.png b/seasonal/evergreen/avatar.png deleted file mode 100644 index d3a54e0c..00000000 Binary files a/seasonal/evergreen/avatar.png and /dev/null differ diff --git a/seasonal/halloween/avatar.png b/seasonal/halloween/avatar.png deleted file mode 100644 index fecdfe5e..00000000 Binary files a/seasonal/halloween/avatar.png and /dev/null differ diff --git a/seasonal/pride/avatar.png b/seasonal/pride/avatar.png deleted file mode 100644 index 6490c113..00000000 Binary files a/seasonal/pride/avatar.png and /dev/null differ diff --git a/seasonal/valentines/avatar.png b/seasonal/valentines/avatar.png deleted file mode 100644 index dfe11f9b..00000000 Binary files a/seasonal/valentines/avatar.png and /dev/null differ