Skip to main content

Kafeteria

Supported Python Versions PyPi CI

Kafeteria is a Python package to asynchronously access the menu of the cafeterias at KAIST.

KAIST 학식 메뉴를 asyncio를 사용하여 불러올 수 있는 Python 패키지입니다.

Installation

Install the package using pip:

pip install kafeteria

If you want optional Slack integration, install with the slack extra:

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:

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 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.

  • 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():

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 is provided in the kafeteria.scheduler module, which can be started by running the following command:

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.

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)'

Metadata

Release files for kafeteria 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for kafeteria 0.4.0
File Size Uploaded Provenance
kafeteria-0.4.0.tar.gz 87.5 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for kafeteria 0.4.0
File Interpreter ABI Platform
kafeteria-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 97.5 kB

Release files / kafeteria-0.4.0.tar.gz

Download URL kafeteria-0.4.0.tar.gz
Size 87.5 kB
Tags Source
SHA-256 checksum
How to use checksums
805bfbc65367c0bf4c8761acbbe57af839582d6e078be29dd598666348c0543c
BLAKE2b-256 checksum
How to use checksums
912b13f1591ebf1de37132b386c3a00f2826d6b97cf8684d6c2b560c3c77a30f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.6.13

Release files / kafeteria-0.4.0-py3-none-any.whl

Download URL kafeteria-0.4.0-py3-none-any.whl
Size 9.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d0eafda8e30df15fe2b7c8da142cea1bd384362440f01e7575026a43cec7fde0
BLAKE2b-256 checksum
How to use checksums
40976e6b63d8858781d66bb6f40ca42b2a835b9a0637a44d773cbacff0ad521d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.6.13

Security for kafeteria 0.4.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page