GitPedia

DisCal Discord Bot

DisCal is a Discord Bot that links up to a Google Calendar to create, delete, edit, and announce events and more!

From DreamExposureยทUpdated January 5, 2026ยทView on GitHubยท

A calendar bot made for communities, DisCal integrates directly with calendar services to bring you superior support and features. Custom calendars, events, automated reminders and more, ready for you, and ready for your community. The project is written primarily in Kotlin, distributed under the GNU General Public License v3.0 license, first published in 2017. Key topics include: calendar, calendar-component, calendar-service, discord, discord-bot.

Latest release: 4.2.9โ€” v4.2.9
August 21, 2025View Changelog โ†’

DisCal

Discord
GitHub Workflow Status
Website

A calendar bot made for communities,
DisCal integrates directly with calendar services to bring you superior support and features.
Custom calendars, events, automated reminders and more, ready for you, and ready for your community.

๐Ÿ”— Quick Links

๐Ÿ’Ž Core Features

  • Custom Calendars
    • Create a fully custom calendar to suit your community's needs, without feeling out of place.
    • Powerful in-server integration of Google Calendar (plus more in the future)
  • Unlimited Events
    • Have a busy community? DisCal can make sure all your community events are scheduled, no matter the amount.
  • Automated Reminders
    • DisCal can automatically remind your community of upcoming events, so no one misses out.
  • Integrated RSVP
    • Need to know who is planning to attend? Community members can let you know whether they are attending.

๐ŸŽ‰ Patron features

Patrons and supporters on the $5/month plans (or more) get access to work in progress and exclusive features.
These features aren't required for core functionality and help support the development and hosting of this bot.

  • Web Dashboard (Early WIP)
  • Multiple calendars
  • Server branding
    • Hide the DisCal name in favor of using your server's name on announcements and embeds.
  • Announcement Publishing
    • Announcements posted in news channels can be (optionally) automatically "published" so servers following the news channel receive them as well!
  • Gif support for event images
  • Automatically assign roles to users when RSVPing to an event.

โŒจ๏ธ Commands

<details> <summary>How permissions are handled</summary>

DisCal uses a simple-to-understand permission scheme for handling access to commands.

  • Elevated
    • Requires ADMINISTRATOR or MANAGE_SERVER permission nodes, or being the guild owner
  • Privileged
    • Requires DisCal control role (default control role is @everyone)
  • Everyone
    • Everyone will always be able to access (unless commands are disabled for the channel)
  • Patron-Only
    • Requires guild to be a patron-guild at the early access tier or higher
  • Dev-Only
    • Only DisCal Developers are able to use these commands
</details> <details> <summary>Calendar Commands (/calendar)</summary>
CommandDescriptionPermissions
/calendar createStarts the calendar creation wizardelevated
/calendar nameSets the calendar's nameelevated
/calendar descriptionSets the calendar's descriptionelevated
/calendar timezoneSets the calendar's timezoneelevated
/calendar reviewDisplays the calendar's propertieselevated
/calendar confirmCommits the changes made in the wizardelevated
/calendar cancelCancels the wizardelevated
/calendar deleteDeletes the calendarelevated
/calendar editStarts the calendar edit wizardelevated
</details> <details> <summary>Displaycal Commands (/displaycal)</summary>
CommandDescriptionPermissions
/displaycal newCreates a new auto-updating calendar overview messageelevated
</details> <details> <summary>Event Commands (/event)</summary>
CommandDescriptionPermissions
/event viewDisplays the event's detailseveryone
/event createStarts the event creation wizardprivileged
/event nameSets the event's nameprivileged
/event descriptionSets the event's descriptionprivileged
/event startSets the event's startprivileged
/event endSets the event's endprivileged
/event colorSets the event's colorprivileged
/event locationSets the event's locationprivileged
/event imageSets the event's imageprivileged, gif support patron-only
/event recurToggles whether the event recurs, and how it recursprivileged
/event reviewDisplays the event's propertiesprivileged
/event confirmCommits the changes made in the wizardprivileged
/event cancelCancels the wizardprivileged
/event editStarts the event edit wizardprivileged
/event copyCopies an existing event's details to a new eventprivileged
/event deleteDeletes an eventprivileged
</details> <details> <summary>Events Commands (/events)</summary>
CommandDescriptionPermissions
/events upcomingLists the next X upcoming eventseveryone
/events ongoingLists the ongoing eventseveryone
/events todayLists the events occurring in the next 24 hourseveryone
/events rangeLists the events found in the date range providedeveryone
</details> <details> <summary>RSVP Commands (/rsvp)</summary>
CommandDescriptionPermissions
/rsvp ontimeRSVPs as going to the event on timeeveryone
/rsvp lateRSVPs as going to the event, but arriving lateeveryone
/rsvp notRSVPs as not going to the eventeveryone
/rsvp unsureRSVPs as unsure if you will be able to attendeveryone
/rsvp removeRemoves your RSVP status from the eventeveryone
/rsvp listLists who has RSVPed to the eventeveryone
/rsvp limitSets the max number of people allowed to attend. -1 to disable the limitprivileged
/rsvp roleSets the role assigned when RSVP'd to the event. @everyone to disable. NOTE: These roles are currently not automatically removedelevated, patron-only
</details> <details> <summary>Announcement Commands (/announcement)</summary>
CommandDescriptionPermissions
/announcement createStarts the announcement create wizardprivileged
/announcement typeSets the announcement type. Valid types: UNIVERSAL, SPECIFIC, COLOR, RECURprivileged
/announcement modifierSets the announcement modifier. Valid types: BEFORE (default), DURINGprivileged
/announcement eventSets the announcement's event. Only needed when using SPECIFIC or RECUR typesprivileged
/announcement colorSets the announcement's color. Only needed when using COLOR typeprivileged
/announcement channelSets the channel the announcement will be posted inprivileged
/announcement minutesSets the minutes before an event to announce. Added to hoursprivileged
/announcement hoursSets the hours before an event to announce. Added to minutesprivileged
/announcement infoSets the additional info to be posted along with the event. No text input to removeprivileged
/announcement calendarSets the calendar the announcement will read from. Defaults to 1 (main calendar)privileged
/announcement publishToggles if the announcement should be pushed to channel subscribersprivileged, patron-only
/announcement reviewDisplays the announcement properties in the wizardprivileged
/announcement confirmCommits the changes made in the wizardprivileged
/announcement cancelCancels the announcement wizardprivileged
/announcement editStarts the announcement edit wizardprivileged
/announcement copyCopies an existing announcement to a new oneprivileged
/announcement deleteDeletes an announcementprivileged
/announcement enableSets whether an announcement is enabledprivileged
/announcement viewDisplays an existing announcement's propertieseveryone
/announcement listLists announcements, -1 for alleveryone
/announcement subscribeSubscribes to an announcement to be pinged when it is postedeveryone
/announcement unsubscribeUnsubscribes to an announcement, to stop being pinged when it is postedeveryone
</details> <details> <summary>Settings Commands (/settings)</summary>
CommandDescriptionPermissions
/settings viewDisplays the current settings for the guildelevated
/settings roleSets the role required to use privileged commandselevated
/settings announcement-styleChanges the style announcements will be posted aselevated
/settings pause-announcementsAllows pausing and unpausing all announcements for the guild for a period of timeelevated
/settings show-rsvp-dropdownAllows showing/hiding of the "RSVP" dropdown on all announcements and event postselevated
/settings languageChanges the language the bot will use in responseselevated
/settings time-formatChanges what format to display date/time when neededelevated
/settings brandingToggles between DisCal branding or the guild's name/image where possibleelevated, patron-only
</details> <details> <summary>All Other Commands</summary>
CommandDescriptionPermissions
/discalDisplays information about the boteveryone
/linkcalProvides info and a link to view the guild's calendareveryone
/timeDisplays the current time as seen by the calendar's timezoneeveryone
[WIP] /addcalStarts the process to add a pre-existing calendarpatron-only, dev-only
helpLinks to the commands page and documentationeveryone
</details>

๐Ÿ—“๏ธ Planned & Work In Progress

This bot is a hobby project for me, please note that while these features are planned, there's no solid timeline.

  • Website rewrite (it's old and ugly)
  • Further improvements to announcements

๐Ÿงฐ Tech stack

  • Java 17
  • Discord4J
  • Spring Boot (DI, Data, Actuator, etc.)
  • Flyway for automatic database migrations (MySQL)
  • Redis cluster caching
  • Fully containerized with Docker (hosted in Kubernetes, docker-compose for local development)

โœ๏ธ Contributing

DisCal is an open source, GPL-3 project. We always welcome and appreciate contributions.

๐Ÿ’ป Development & Local Testing

For development, you need JDK 17+ and Docker installed.

  1. Fork this repository and open it in your favorite editor (IntelliJ recommended for Kotlin)
  2. Write your code and add applicable tests
  3. Compile and build the docker image with ./gradlew clean jibDockerBuild
  4. Place config in ./docker/{api/bot/cam}/application.properties
  5. Start the bot and dependencies for testing with docker compose up -d
    • You can connect to the Java debugger at port 5005
  6. Create a pull request and describe your changes! <3

๐ŸŒ Localization & Internationalization

Please only submit localizations if you speak and/or write the language you are translating to.
We want to keep these translations correct and high quality, running the strings through Google Translate or DeepL is not acceptable.
Thank you for understanding

In the early days of the bot, we had a pretty dis-organized json file system for translated strings.
This was messy and somewhat confusing. Since the 2.0 update, we now utilize properties files

  1. The base english locale file is located at /src/main/resources/locale/values.properties
  2. Files are named values_{lang-code}.properties. For example, the Spanish locale file would be values_es.properties
  3. Translate the strings and submit it back to us (either via Discord, or a pull request to this repo)

NOTE: Variables use {N} where N is the zero-indexed order it is passed through in code.

In English, these are always in order 0, 1, 2... 5.

Contributors

Showing top 6 contributors by commit count.

View all contributors on GitHub โ†’

This article is auto-generated from DreamExposure/DisCal-Discord-Bot via the GitHub API.Last fetched: 6/26/2026