Overview
Backend adapters allow Guccho to support different osu! server implementations (bancho.py, ppy.sb, etc.) while presenting a unified API. The adapter system uses inheritance and abstract classes to define contracts that all implementations must fulfill.Adapter Hierarchy
Available Adapters
$base: Abstract base provider definitionsbancho.py: Implementation for bancho.py (gulag) servers[email protected]: Extended implementation with ppy.sb-specific features
$base: Abstract Providers
The$base directory (src/server/backend/$base/) defines abstract provider classes that establish the contract for all backend functionality.
Provider Structure
Each provider in$base/server/ is an abstract class:
Key Base Providers
Location:src/server/backend/$base/server/
| Provider | Purpose | Key Methods |
|---|---|---|
UserProvider | User management | getCompact, getFull, getBests, register |
ScoreProvider | Score queries | getScoreById, getLeaderboard |
MapProvider | Beatmap data | getById, search, getLeaderboard |
SessionProvider | Session storage | create, get, refresh, destroy |
RankProvider | Rankings | getLeaderboard, getRankings |
ArticleProvider | News articles | list, get, create, update |
MailProvider | Email delivery | send |
MailTokenProvider | Email verification | getOrCreate, get, deleteAll |
Extendable Features
Certain providers are meant to be extended with custom implementations:bancho.py Implementation
Thebancho.py adapter (src/server/backend/bancho.py/) provides concrete implementations for bancho.py servers.
Index File
Provider Implementation Example
Data Sources
bancho.py adapter uses multiple data sources:Transform Functions
Thetransforms/ directory contains conversion utilities:
[email protected] Extension
The[email protected] adapter extends bancho.py with ppy.sb-specific functionality.
Extension Pattern
Extended Database Schema
Creating a Custom Adapter
To create a new backend adapter:1. Create Adapter Directory
2. Define Types
3. Implement Providers
4. Export Providers
5. Configure Backend
ID Type Abstraction
Adapters can use different ID types:Provider Guidelines
Best Practices
- Always implement all abstract methods - TypeScript will enforce this
- Use transform functions - Keep database schema separate from API types
- Handle errors consistently - Use
GucchoErrorenum for error codes - Log important operations - Use the logger from
$base/logger - Cache when appropriate - Use Redis or memory for frequently accessed data
Error Handling
Logging
Next Steps
Architecture
Understand the overall system architecture
TRPC Integration
Learn how providers connect to TRPC routers