Calendar-based wipe and restart scheduler for Rust servers using Google Calendar.
WipeCal is a Carbon plugin that automatically monitors a Google Calendar ICS feed for upcoming "wipe" and "restart" events. Built with SOLID principles and architecture, it provides reliable server automation with dynamic event monitoring, multi-timezone support, and comprehensive player notifications.
DISCLAIMER: In theory, you should be able to point the url to any remote .ics file, but we've only tested with Google Calendar.
- π Google Calendar Integration - Seamless ICS feed support (public or private URLs)
- π Advanced Recurring Events - Full support for daily, weekly, monthly, and yearly schedules
- π Week-of-Month Rules - Handles complex patterns like "1st Thursday" or "last Friday" of each month
- π Multi-Timezone Display - Shows event times across multiple timezones with intelligent date-change detection
- β‘ Dynamic Monitoring - Smart interval adjustment based on event proximity (5min β 1sec as event approaches)
β οΈ Progressive Warnings - Alerts at 10min, 5min, 2min, 1min, 30s, 15s, 10s, then countdown 9-1 seconds- πΎ Auto-Save Protection - Automatically saves server 10 seconds before any event
- π Auto Calendar Refresh - Periodically re-downloads calendar to detect schedule changes
- π‘οΈ Thread-Safe Operations - Async/await patterns with semaphore protection for data integrity
- π Event Change Detection - Notifies players when scheduled events are modified
- π¬ Smart Chat Monitoring - Auto-responds when players ask about wipes (60s cooldown)
- π¨ Customizable Colors - Full control over message appearance
- π Localization Ready - Built-in message key system for multi-language support
- π± Informative Commands - View next single event or list of upcoming events
- Download
WipeCal.csand place it in yourcarbon/pluginsfolder - Restart server or run
c.reload WipeCal - Edit the generated config at
carbon/configs/WipeCal.json - Configure your Google Calendar URL (see below)
- Reload the plugin:
c.reload WipeCal
{
"Calendar URL": "https://calendar.google.com/calendar/ical/YOUR_CALENDAR_ID/basic.ics",
"Chat ID": 0,
"Chat Prefix": "",
"Message Color": "#e1e5c8",
"Number Color": "#cd5909",
"Calendar Refresh Interval (seconds)": 30.0,
"Timezones": [
{ "Id": "America/Los_Angeles", "Abbreviation": "PST" },
{ "Id": "America/New_York", "Abbreviation": "EST" }
]
}| Option | Description | Default |
|---|---|---|
| Calendar URL | Your Google Calendar ICS feed URL | "" |
| Chat ID | Steam64 ID for chat messages (0 = server) | 0 |
| Chat Prefix | Prefix for all plugin messages | "" |
| Message Color | Hex color for message text | #e1e5c8 |
| Number Color | Hex color for numbers/highlights | #cd5909 |
| Calendar Refresh Interval | Seconds between calendar updates | 30 |
| Timezones | Array of timezone objects for display | See below |
Each timezone entry has two properties:
Id: IANA timezone identifier (e.g.,America/Los_Angeles)Abbreviation: Display name (e.g.,PST,EST)
Common Timezone IDs:
- πΊπΈ US Pacific:
America/Los_Angeles - πΊπΈ US Mountain:
America/Denver - πΊπΈ US Central:
America/Chicago - πΊπΈ US Eastern:
America/New_York - π¬π§ UK:
Europe/London - πͺπΊ Central Europe:
Europe/Paris - π¦πΊ Australia Eastern:
Australia/Sydney - π―π΅ Japan:
Asia/Tokyo
- Open Google Calendar
- Create a new event or use an existing calendar
- Set the title to exactly
wipeorrestart(case-insensitive) - Set the date and time for your event
Google Calendar supports various recurrence patterns that WipeCal fully understands:
- Daily: Every day at the specified time
- Weekly: Every [day of week] (e.g., "Every Thursday")
- Monthly:
- Same date each month (e.g., "15th of every month")
- Week-based (e.g., "1st Thursday of every month")
- Yearly: Anniversary-style events
Example: For a wipe every first Thursday at 3:00 PM PST:
- Create event titled "wipe"
- Set time to 3:00 PM
- Set recurrence to "Monthly on the first Thursday"
- Go to Calendar Settings (βοΈ)
- Select your calendar from the left sidebar
- Scroll to "Integrate calendar"
- Copy either:
- Secret address in iCal format (recommended - private)
- Public address in iCal format (if calendar is public)
- Paste the URL into your
WipeCal.jsonconfig - Reload the plugin:
c.reload WipeCal
WipeCal uses a modern service-oriented architecture with three main components:
-
π₯ Calendar Service (
IcsCalendarService)- Downloads ICS files via HTTP with timeout protection
- Parses VEVENT entries and RRULE recurrence patterns
- Handles multiple datetime formats and timezone conversions
-
π Event Scheduler (
EventScheduler)- Processes calendar events and calculates future occurrences
- Handles complex recurrence rules (daily/weekly/monthly/yearly)
- Supports week-of-month patterns (e.g., "1st Thursday", "last Friday")
- Caches next 3 upcoming events of each type
-
π’ Notification Service (
PlayerNotificationService)- Formats messages with customizable colors
- Handles multi-timezone display
- Manages player notifications and server-wide announcements
Server Startup
β
Download Calendar β Parse Events β Calculate Occurrences
β
Cache Next 3 Wipes/Restarts
β
Start Background Monitoring
β
βββ Event Monitor (dynamic interval)
β ββ >1 hour away: check every 5 minutes
β ββ 30min-1hr: check every minute
β ββ 10-30min: check every 30 seconds
β ββ 1-10min: check every 5 seconds
β ββ <1 minute: check every second
β
βββ Calendar Refresh (configurable interval)
ββ Re-download β Detect changes β Update cache
When an event approaches:
- 10 minutes: First warning
- 5 minutes: Second warning
- 2 minutes: Third warning
- 1 minute: Fourth warning
- 30 seconds: Fifth warning
- 15 seconds: Sixth warning
- 10 seconds: Save server + warning
- 9-1 seconds: Final countdown
- 0 seconds: Announce event β Kick all players β Quit server
WipeCal supports the full iCalendar RRULE specification:
| Frequency | Example | Result |
|---|---|---|
FREQ=DAILY |
Every day at 3pm | Daily wipes |
FREQ=WEEKLY;BYDAY=TH |
Every Thursday | Weekly on Thursday |
FREQ=MONTHLY |
15th of every month | Same date monthly |
FREQ=MONTHLY;BYDAY=1TH |
1st Thursday | First Thursday monthly |
FREQ=MONTHLY;BYDAY=-1FR |
Last Friday | Last Friday monthly |
FREQ=YEARLY |
Nov 15th annually | Yearly anniversary |
When displaying times across multiple timezones, WipeCal:
- Shows the full date only when it changes between timezones
- Compacts same-date times for readability
- Uses ordinal suffixes (1st, 2nd, 3rd, 4th, etc.)
Example with date change:
Dec 31st 11:00pm PST
Jan 1st 2:00am EST β Date changed
Example without date change:
Dec 15th 3:00pm PST
6:00pm EST β Same date, compact format
WipeCal monitors global chat for the word "wipe" and automatically responds with the next wipe time. This feature:
- Has a 60-second cooldown to prevent spam
- Only triggers on exact word match (case-insensitive)
- Works in global chat only
- Displays time remaining and date information
If calendar events change (time moved, event added/removed):
- Plugin automatically detects the change on next refresh
- Resets all warnings for the new event time
- Announces to all players: "Next wipe time has been changed"
- Restarts the event monitoring coroutine
- β Carbon Mod installed and running
- β Google Calendar with ICS feed access
β Yes! Just create "restart" events instead of "wipe" events. The plugin treats them separately.
β Automatic! The calendar refreshes every 30 seconds (configurable). Players will be notified of the change.
β Yes! Create as many events as needed. WipeCal will calculate all occurrences and show the next 3 of each type.
β Yes! Use the "Secret address in iCal format" from your Google Calendar settings.
quit at event time. Use future test dates or the /refreshcal command to update.
This plugin was designed with extensibility in mind. The service-based architecture makes it easy to:
- Add new notification channels (Discord, webhooks, etc.)
- Implement custom recurrence rules
- Extend timezone formatting
- Add new chat commands
Made with β€οΈ by mainloot | Join our Discord




