generated from nhcarrigan/template
This commit is contained in:
@@ -288,6 +288,11 @@ export const navigation = [
|
||||
link: "/projects/umbrelle",
|
||||
badge: { text: "v1.0.0", variant: "tip" },
|
||||
},
|
||||
{
|
||||
label: "Veluna",
|
||||
link: "/projects/veluna",
|
||||
badge: { text: "v1.0.0", variant: "tip" },
|
||||
}
|
||||
].sort((a, b) => a.label.localeCompare(b.label)),
|
||||
},
|
||||
{
|
||||
|
||||
@@ -0,0 +1,229 @@
|
||||
---
|
||||
title: Veluna
|
||||
---
|
||||
|
||||
Veluna (hereinafter the "Application") is a Discord bot that allows communities to ask administrators anonymous questions and receive public answers, facilitating open communication while maintaining user privacy.
|
||||
|
||||
## 1. User Documentation
|
||||
|
||||
This section is for those interacting with a live instance of the Application.
|
||||
|
||||
### Getting Started
|
||||
|
||||
Veluna enables anonymous question-and-answer interactions within Discord servers. Community members can ask questions privately, and server administrators can respond publicly.
|
||||
|
||||
### Available Commands
|
||||
|
||||
- `/about` - Display information about Veluna and how to use it
|
||||
- `/ask` - Open a modal to submit an anonymous question (available to all users)
|
||||
- `/questions <channel>` - Set the private channel where questions will be posted (admin only)
|
||||
- `/answers <channel>` - Set the public channel where answers will be published (admin only)
|
||||
|
||||
### How It Works
|
||||
|
||||
1. **Setup**: Server administrators must configure two channels:
|
||||
- A private **questions channel** where submitted questions appear (for moderation)
|
||||
- A public **answers channel** where responses are published (for community visibility)
|
||||
|
||||
2. **Asking Questions**: Any server member can use `/ask` to submit anonymous questions up to 1000 characters
|
||||
|
||||
3. **Answering**: Administrators can respond to questions, and answers will be posted to the configured public channel
|
||||
|
||||
### Permissions
|
||||
|
||||
- **All Users**: Can ask questions using `/ask`
|
||||
- **Server Administrators**: Can configure channels and answer questions (requires "Manage Guild" permission)
|
||||
|
||||
### Bot Permissions Required
|
||||
|
||||
Veluna needs the following permissions in configured channels:
|
||||
- View Channel
|
||||
- Send Messages
|
||||
- Embed Links
|
||||
|
||||
### Support
|
||||
|
||||
If you encounter issues, reach out through:
|
||||
- [Discord Support Server](https://chat.nhcarrigan.com)
|
||||
- [Documentation Portal](https://docs.nhcarrigan.com/)
|
||||
|
||||
## 2. Technical Documentation
|
||||
|
||||
This section is for those interested in running their own instance of the Application.
|
||||
|
||||
### System Requirements
|
||||
|
||||
- Node.js with TypeScript support
|
||||
- MongoDB database
|
||||
- Discord Bot Token
|
||||
- 1Password CLI (for production secrets management)
|
||||
|
||||
### Architecture
|
||||
|
||||
Veluna is built with:
|
||||
- **Discord.js v14** - Discord API interaction
|
||||
- **Fastify** - Web server for health monitoring
|
||||
- **Prisma** - Database ORM with MongoDB
|
||||
- **TypeScript** - Type-safe development
|
||||
|
||||
### Database Schema
|
||||
|
||||
```prisma
|
||||
model Servers {
|
||||
id String @id @default(auto()) @map("_id") @db.ObjectId
|
||||
serverId String @unique
|
||||
questionChannelId String @default("")
|
||||
answerChannelId String @default("")
|
||||
blockedUsers String[] @default([])
|
||||
}
|
||||
```
|
||||
|
||||
### Project Structure
|
||||
|
||||
```
|
||||
src/
|
||||
├── components/ # Discord UI components
|
||||
│ └── about.ts # About command interface
|
||||
├── interfaces/ # TypeScript type definitions
|
||||
│ └── veluna.ts # Core application types
|
||||
├── modals/ # Discord modal forms
|
||||
│ ├── ask.ts # Question submission modal
|
||||
│ └── answer.ts # Answer submission modal
|
||||
├── modules/ # Event handlers
|
||||
│ ├── handleButton.ts # Button interaction handler
|
||||
│ ├── handleChatCommand.ts # Slash command handler
|
||||
│ └── handleModalSubmit.ts # Modal submission handler
|
||||
├── server/ # Web server
|
||||
│ └── serve.ts # Health monitoring endpoint
|
||||
├── utils/ # Utilities
|
||||
│ └── logger.ts # Logging functionality
|
||||
└── index.ts # Application entry point
|
||||
```
|
||||
|
||||
### Installation & Setup
|
||||
|
||||
1. **Dependencies**:
|
||||
```bash
|
||||
pnpm install
|
||||
```
|
||||
|
||||
2. **Database Setup**:
|
||||
- Set up MongoDB instance
|
||||
- Configure `MONGO_URI` environment variable
|
||||
|
||||
3. **Discord Bot**:
|
||||
- Create Discord application at https://discord.com/developers/applications
|
||||
- Generate bot token and set `BOT_TOKEN` environment variable
|
||||
|
||||
4. **Build**:
|
||||
```bash
|
||||
pnpm run build
|
||||
```
|
||||
|
||||
5. **Development**:
|
||||
```bash
|
||||
pnpm run lint # Code linting
|
||||
```
|
||||
|
||||
6. **Production**:
|
||||
```bash
|
||||
pnpm run start # Uses 1Password for secret management
|
||||
```
|
||||
|
||||
### Environment Variables
|
||||
|
||||
- `BOT_TOKEN` - Discord bot authentication token
|
||||
- `MONGO_URI` - MongoDB connection string
|
||||
|
||||
### Health Monitoring
|
||||
|
||||
The application includes a Fastify web server on port 6099 that serves:
|
||||
- Root endpoint `/` - Basic information page with invite link
|
||||
- Health monitoring capabilities
|
||||
|
||||
### Bot Invite URL
|
||||
|
||||
The bot can be invited with this URL:
|
||||
```
|
||||
https://discord.com/oauth2/authorize?client_id=1391505285465509978
|
||||
```
|
||||
|
||||
## 3. Legal Documentation
|
||||
|
||||
This section is for expansions to our legal policies specific to the Application.
|
||||
|
||||
### Licensing
|
||||
|
||||
- **Copyright**: NHCarrigan
|
||||
- **License**: Naomi's Public License
|
||||
- **Author**: Naomi Carrigan
|
||||
|
||||
### Data Handling
|
||||
|
||||
Veluna stores minimal data:
|
||||
- Server configurations (question/answer channel IDs)
|
||||
- Server IDs for configuration persistence
|
||||
- Blocked user lists (when implemented)
|
||||
|
||||
No message content or user personal information is stored permanently.
|
||||
|
||||
### Privacy Considerations
|
||||
|
||||
- Questions are submitted anonymously - the bot does not store or reveal question authors
|
||||
- Only server administrators can see submitted questions in the private channel
|
||||
- Answers are posted publicly in the configured channel
|
||||
|
||||
## 4. Contributing Documentation
|
||||
|
||||
This section is for documentation related to contributing to the Application's codebase.
|
||||
|
||||
### Development Standards
|
||||
|
||||
- **TypeScript**: Strict typing required
|
||||
- **ESLint**: Zero warnings policy (`pnpm run lint`)
|
||||
- **Code Style**: Follow existing patterns and conventions
|
||||
|
||||
### Code Organization
|
||||
|
||||
- Event handlers are modularized in `/modules`
|
||||
- UI components are separated in `/components` and `/modals`
|
||||
- Database interactions use Prisma ORM
|
||||
- Logging uses structured logger utility
|
||||
|
||||
### Key Functions
|
||||
|
||||
- `handleChatCommand()` - Processes slash commands in `src/modules/handleChatCommand.ts:39`
|
||||
- `handleModalSubmit()` - Processes modal form submissions
|
||||
- `handleButton()` - Processes button interactions
|
||||
- `instantiateServer()` - Starts web server in `src/server/serve.ts:54`
|
||||
|
||||
### Adding New Commands
|
||||
|
||||
1. Add command logic to `handleChatCommand()`
|
||||
2. Create any required modals in `/modals`
|
||||
3. Add UI components in `/components` if needed
|
||||
4. Update database schema if persistence is required
|
||||
|
||||
### Testing
|
||||
|
||||
Currently no automated tests are configured (`echo "Error: no test specified" && exit 0`).
|
||||
|
||||
### Building
|
||||
|
||||
The build process:
|
||||
1. Generates Prisma client
|
||||
2. Compiles TypeScript to JavaScript
|
||||
3. Outputs to `prod/` directory
|
||||
|
||||
### Git Workflow
|
||||
|
||||
- Main branch: `main`
|
||||
- Repository appears to follow standard GitHub flow
|
||||
- Commits should be descriptive and focused
|
||||
|
||||
### Code Style Guidelines
|
||||
|
||||
- Use existing ESLint configuration (`@nhcarrigan/eslint-config`)
|
||||
- Follow TypeScript best practices
|
||||
- Maintain consistent indentation and formatting
|
||||
- Document functions with JSDoc comments where appropriate
|
||||
Reference in New Issue
Block a user