https://github.com/kmnhan/kafeteria
Asynchronously fetch today's menu for cafeterias in KAIST
https://github.com/kmnhan/kafeteria
cafeteria kaist
Last synced: 6 months ago
JSON representation
Asynchronously fetch today's menu for cafeterias in KAIST
- Host: GitHub
- URL: https://github.com/kmnhan/kafeteria
- Owner: kmnhan
- License: mit
- Created: 2024-12-31T02:25:36.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2026-01-07T07:27:50.000Z (7 months ago)
- Last Synced: 2026-01-09T04:34:19.793Z (7 months ago)
- Topics: cafeteria, kaist
- Language: Python
- Homepage:
- Size: 279 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# Kafeteria
[](https://pypi.org/project/kafeteria/)
[](https://pypi.org/project/kafeteria/)
[](https://github.com/kmnhan/kafeteria/actions/workflows/ci.yml)
Kafeteria is a Python package to asynchronously access the menu of the cafeterias at KAIST.
KAIST 학식 메뉴를 asyncio를 사용하여 불러올 수 있는 Python 패키지입니다.
## Installation
Install the package using pip:
```bash
pip install kafeteria
```
If you want optional Slack integration, install with the `slack` extra:
```bash
pip install kafeteria[slack]
```
## Usage
Use the `get_menu` function to get the menu for a specific cafeteria, or the `get_menus` function to get the menus for multiple cafeterias at once.
Valid cafeteria codes are:
- `fclt` : 카이마루
- `west` : 서측식당
- `east1` : 동측 학생식당
- `east2` : 동측 교직원식당
- `emp` : 교수회관
- `icc` : 문지캠퍼스
- `hawam` : 화암 기숙사식당
- `seoul` : 서울캠퍼스 구내식당
Here's an example:
```python
import asyncio
import datetime
import kafeteria
async def main():
# Get the menu for a specific cafeteria
menu = await kafeteria.get_menu("fclt")
print(menu)
# Get the menu for a specific date
menu = await kafeteria.get_menu("fclt", datetime.date(2025, 1, 3))
print(menu)
# Get the menus for multiple cafeterias at once
menus = await kafeteria.get_menus(["fclt", "east1", "east2"])
print(menus)
asyncio.run(main())
```
## Slack Integration
You can also publish today's menu to a Slack channel using the `kafeteria.slack.publish` function.
First, you need to [set up a Slack app](https://api.slack.com/quickstart#creating) with the `chat:write` permission. Once you have a bot set up with the necessary permissions, set the following environment variables:
- `KAFETERIA_SLACK_BOT_TOKEN` (required): The bot token for the Slack app.
- `KAFETERIA_SLACK_CHANNEL` (required): The channel ID to post the message to.
This can be found by right-clicking on the channel in the Slack app and selecting "Copy link". The channel ID is the last part of the URL.
For more information, see the [slack api documentation](https://api.slack.com/messaging/sending>).
- `KAFETERIA_MENU_TIME` (optional): The menu to send.
This can be one of 0, 1, 2, or 3. The behavior is as follows:
- 1: breakfast
- 2: lunch
- 3: dinner
- 0: default, automatically selects the menu based on the current time:
- breakfast: 19:30 - 09:00
- lunch: 09:00 - 14:00
- dinner: 14:00 - 19:30
- `KAFETERIA_LIST` (optional): The list of cafeterias to send the menu for.
This should be a comma-separated list of cafeteria codes. By default, `fclt,west,east1,east2` is used.
- `KAFETERIA_IGNORE_PROFONLY` (optional): Whether to ignore the "professor only" menu.
This flag is used to filter out the "professor only" (교수전용) menu from the list of menus. If enabled, all lines below a line that contains `교수전용` will be stripped from the menu. This can be set to `0` or `1`. By default, it is set to `1` (enabled).
Then, you can publish the menu to a channel using `kafeteria.slack.publish()`:
```python
import asyncio
import kafeteria.slack
asyncio.run(kafeteria.slack.publish())
```
A shortcut function `kafeteria.slack.run_publish()` is provided for running in non-async environments.
`kafeteria.slack.publish()` and `kafeteria.slack.run_publish()` takes an optional keyword-only parameter, `skip_holiday`, which, if set to `True`, skips publishing the menu when the current day is a holiday in Korea.
### Automation
Slack integration can be automated to publish the menu at a specific time every weekday using a scheduler. An example using [apscheduler](https://apscheduler.readthedocs.io/) is provided in the `kafeteria.scheduler` module, which can be started by running the following command:
```bash
python -m kafeteria.scheduler
```
If you want to handle the automation in CI/CD, here is an example GitHub Actions workflow. Note that scheduled workflows may be delayed depending on the GitHub Actions server load.
```yaml
name: Publish Menu
on:
schedule:
# Every weekday at 11:30 AM GMT+9 (2:30 AM UTC)
- cron: "30 2 * * 1-5"
env:
KAFETERIA_SLACK_BOT_TOKEN: ${{ secrets.KAFETERIA_SLACK_BOT_TOKEN }} # Set in repository secrets
KAFETERIA_SLACK_CHANNEL: "C0123456789" # Replace with your channel ID
KAFETERIA_MENU_TIME: "0" # Automatically select the menu based on workflow run time
KAFETERIA_LIST: "fclt,west,east1,east2"
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.13"
- name: Install dependencies
run: pip install kafeteria[slack]
- name: Publish menu
run: python -c 'import kafeteria.slack; kafeteria.slack.run_publish(skip_holiday=True)'
```