top of page

Discord Bot (Ludo)

At a Glance

Project Goal​​

The primary goal of this project was to enhance discord community customization (i.e; allow creation of temporary voice channels for users, automate announcements) as well as add user functionality.

 

Overview

The Discord bot was developed for a game development discord community which facilitates the matching of people into teams for game development. Our bot allows users to:

  • search members with specific roles

  • create temporary voice channels

  • automate announcements

  • search registered teams

​

The bot writes and reads data from google sheets and supabase tables, as well as write and read JSON responses.

​

Tech Stack

  • Javascript

  • Discord.js

  • Supabase API

  • Google sheets API

​​

Acces:

COMING SOON

Project Overview

Ludo was built to support the Ludenwright Discord community, where collaboration and creativity fuel everything we do. One of our biggest challenges was helping members find each other to join their game development team.

​

Ludo bridges that gap by offering search tools for both members and teams, giving the community a simple way to find the right people for their next creative endeavor.

​

Beyond that, Ludo automates key community functions like playtest announcements and temporary voice channel management, freeing up our admins to focus on building an inviting, joyful space.

My Role

This was a solo dev project from start to finish. I designed the system architecture, figured out the data flows, and built the bot itself in JavaScript using discord.js. I also:

  • Researched and implemented integrations with both Google Sheets and Supabase.

  • Wrote user-friendly command responses for a better UX.

  • Tested with live community members and iterated based on their feedback.

 

Main Objectives

​

  • Let users query Discord roles to find potential collaborators.

  • Support multiple simultaneous searches, without blocking or lag.

  • Prioritize clarity and friendliness in both bot commands and outputs.

Key Features

  • Modular Architecture: Helper functions are kept seperate from main components and command files to help with debugging and reusability.

  • Member Search: Find other discord members by discipline, region, and game art type.

  • Team Search: Outputs a list of registered teams from our Google sheet.

  • Role Syncing (automated): Write user roles to Google Sheets, Supabase, and JSON for easy backup and external queries.

  • Playtest Automation (Admin Only): Announce playtest sessions automatically with structured, clean embeds.

  • Voice Hub Creation (Admin Only): Quickly create hubs where users can create temporary voice channels. Automatically deletes them after 3 minutes of inactivity.

Architecture & Data Flow

Ludo’s architecture is built around modular, asynchronous workflows that prioritize quick user queries and easy data syncing.

​

Our primary concern was allowing members to search for other members based on disciplines within game development (i.e; 2D Art, Programming, UX Research). This was achieved using Discord's built-in role system in which users self-assign themselves roles while going through onboarding.​

​

Key Architecture Decisions:

  • Discord.js: Chosen for its robust support of slash commands and role queries.

  • Google Sheets: Used for quick backups and admin-accessible data views.

  • Supabase: Serves as the long-term storage for when we scale up our applications (i.e; Vue dashboard).

  • JSON Files: Used for local caching and fallback data syncing in case of API downtime. Also used to enable multiple user searches simultaneously.

​

Challenges and Solutions:​

One challenge we had was the number of roles we wanted to allow users to search by. Discord.js has a hard limit on how many buttons can be populated per embed (25) and we had a total of 48 roles that we wanted users to be able to search by. 

​

To solve this problem, we grouped our discipline roles into distinct commands (e.g.: sound_roles would include sound designer, music composer, sound artist, sound effects etc). This would allow users to refine their search more, particularly when looking for very specific roles, as well as allow us to populate enough buttons per embed.​​

image.png

I created components for each type of button to be generated (artButtons, businessButtons, confirmButtons, etc). 

image.png

Each discipline component would then be imported into the appropriate command as a button generator.

image.png

This process keeps logic isolated and modular, allowing for better debugging.

image.png

Similarly, helper functions that are responsible for specific tasks are kept seperately from main components for better debugging and modularity.

image.png

User Flow

  1. User roles are extracted automatically using Discord's API, and are stored in a JSON file, in addition to a Google Sheet and supabase table. Everytime a user changes their roles, this is updated automatically. We also have a manual command that allows admins to run the update with /get_users.​​​​​

  2. When a user wants to perform a search, they will use the commands. (i.e; /sound_roles, /art_roles, /programmer_roles etc), which populates an embed with buttons for selection.

image.png

3. User selects the roles they want to add to their query and clicks "Confirm". This checks for a JSON matching their Discord ID, or creates a new one with their selections. The user can run as many /discipline_roles as they want.

​

image.png

5. When a user is ready to run the query, they use the command /search_users, which outputs a paginated list of all users with matching criteria.

image.png

6. User can then run /clear_search to delete selections from their query, so that they can begin another.

image.png

© 2035 by Sharise Love. Powered and secured by Wix

bottom of page