Refactor project branding from HexaHost to Axiom across all configurations, documentation, and code files. Update environment variables, Docker setup, and README to reflect the new brand name. Ensure consistency in naming conventions and improve clarity in setup instructions.
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
# Discord Bot
|
# Discord Bot
|
||||||
TOKEN=TOKEN_HERE
|
TOKEN=TOKEN_HERE
|
||||||
brand_name=HexaHost
|
brand_name=Axiom
|
||||||
OWNER_IDS=YOUR_DISCORD_USER_ID_HERE
|
OWNER_IDS=YOUR_DISCORD_USER_ID_HERE
|
||||||
DASHBOARD_ADMIN_IDS=YOUR_DISCORD_USER_ID_HERE
|
DASHBOARD_ADMIN_IDS=YOUR_DISCORD_USER_ID_HERE
|
||||||
|
|
||||||
@@ -30,8 +30,8 @@ DISCORD_CLIENT_SECRET=
|
|||||||
# Same Discord user IDs as owners/admins (comma-separated)
|
# Same Discord user IDs as owners/admins (comma-separated)
|
||||||
ADMIN_IDS=YOUR_DISCORD_USER_ID_HERE
|
ADMIN_IDS=YOUR_DISCORD_USER_ID_HERE
|
||||||
NEXT_PUBLIC_ADMIN_IDS=YOUR_DISCORD_USER_ID_HERE
|
NEXT_PUBLIC_ADMIN_IDS=YOUR_DISCORD_USER_ID_HERE
|
||||||
NEXT_PUBLIC_BRAND_NAME=HexaHost
|
NEXT_PUBLIC_BRAND_NAME=Axiom
|
||||||
NEXT_PUBLIC_BRAND_NAME_WORD=HH
|
NEXT_PUBLIC_BRAND_NAME_WORD=AX
|
||||||
|
|
||||||
# Discord OAuth Redirect URL in the Discord Developer Portal:
|
# Discord OAuth Redirect URL in the Discord Developer Portal:
|
||||||
# https://bot.hexahost.de/api/auth/callback/discord
|
# https://bot.hexahost.de/api/auth/callback/discord
|
||||||
|
|||||||
4
.github/workflows/ci.yml
vendored
4
.github/workflows/ci.yml
vendored
@@ -36,9 +36,9 @@ jobs:
|
|||||||
TUNNEL_ENABLED: "false"
|
TUNNEL_ENABLED: "false"
|
||||||
run: |
|
run: |
|
||||||
python - <<'PY'
|
python - <<'PY'
|
||||||
from core.hexahost import HexaHost
|
from core.axiom import Axiom
|
||||||
from api.server import create_app
|
from api.server import create_app
|
||||||
bot = HexaHost()
|
bot = Axiom()
|
||||||
create_app()
|
create_app()
|
||||||
import cogs
|
import cogs
|
||||||
print("imports ok")
|
print("imports ok")
|
||||||
|
|||||||
18
DOCKER.md
18
DOCKER.md
@@ -1,4 +1,4 @@
|
|||||||
# HexaHost — Docker-Setup (Traefik)
|
# Axiom — Docker-Setup (Hersteller: HexaHost, Traefik)
|
||||||
|
|
||||||
Dashboard: **https://bot.hexahost.de**
|
Dashboard: **https://bot.hexahost.de**
|
||||||
Bot-API: nur intern (`http://bot:8000`) — nicht öffentlich.
|
Bot-API: nur intern (`http://bot:8000`) — nicht öffentlich.
|
||||||
@@ -28,8 +28,8 @@ Falls dein Cert-Resolver anders heißt → später `TRAEFIK_CERT_RESOLVER` in `.
|
|||||||
## 1. Projekt auf den Server holen
|
## 1. Projekt auf den Server holen
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone <dein-repo-url> HexaHost
|
git clone <dein-repo-url> Axiom
|
||||||
cd HexaHost
|
cd Axiom
|
||||||
```
|
```
|
||||||
|
|
||||||
Oder Dateien per SCP/SFTP hochladen und in den Projektordner wechseln.
|
Oder Dateien per SCP/SFTP hochladen und in den Projektordner wechseln.
|
||||||
@@ -125,8 +125,8 @@ docker compose logs -f dashboard
|
|||||||
|
|
||||||
Erwartung:
|
Erwartung:
|
||||||
|
|
||||||
- `hexahost-bot` — online, Discord-Login, API auf Port 8000
|
- `axiom-bot` — online, Discord-Login, API auf Port 8000
|
||||||
- `hexahost-dashboard` — läuft, Traefik routet `bot.hexahost.de`
|
- `axiom-dashboard` — läuft, Traefik routet `bot.hexahost.de`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -164,7 +164,7 @@ Volumes **löschen** (Daten weg): `docker compose down -v` — nur bewusst nutze
|
|||||||
|
|
||||||
| Problem | Check |
|
| Problem | Check |
|
||||||
|---------|--------|
|
|---------|--------|
|
||||||
| 502 / Gateway Timeout | `docker compose ps` — läuft `hexahost-dashboard`? Traefik am richtigen Netzwerk? |
|
| 502 / Gateway Timeout | `docker compose ps` — läuft `axiom-dashboard`? Traefik am richtigen Netzwerk? |
|
||||||
| Kein HTTPS-Zertifikat | DNS auf Server? Cert-Resolver-Name (`TRAEFIK_CERT_RESOLVER`)? Entrypoints `web`/`websecure`? |
|
| Kein HTTPS-Zertifikat | DNS auf Server? Cert-Resolver-Name (`TRAEFIK_CERT_RESOLVER`)? Entrypoints `web`/`websecure`? |
|
||||||
| Login schlägt fehl | Redirect-URL exakt wie oben? `NEXTAUTH_URL` = `https://bot.hexahost.de/`? |
|
| Login schlägt fehl | Redirect-URL exakt wie oben? `NEXTAUTH_URL` = `https://bot.hexahost.de/`? |
|
||||||
| Dashboard leer / API-Fehler | Gleiches `DASHBOARD_API_KEY`? Bot-Logs: `API_ENABLED` / Startfehler? |
|
| Dashboard leer / API-Fehler | Gleiches `DASHBOARD_API_KEY`? Bot-Logs: `API_ENABLED` / Startfehler? |
|
||||||
@@ -177,7 +177,7 @@ Netzwerk-Check:
|
|||||||
docker network inspect traefik-network
|
docker network inspect traefik-network
|
||||||
```
|
```
|
||||||
|
|
||||||
Dort sollten u. a. Traefik, `hexahost-bot` und `hexahost-dashboard` erscheinen.
|
Dort sollten u. a. Traefik, `axiom-bot` und `axiom-dashboard` erscheinen.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -190,10 +190,10 @@ Internet
|
|||||||
Traefik (traefik-network)
|
Traefik (traefik-network)
|
||||||
│ Host: bot.hexahost.de
|
│ Host: bot.hexahost.de
|
||||||
▼
|
▼
|
||||||
hexahost-dashboard :3000
|
axiom-dashboard :3000
|
||||||
│ DASHBOARD_API_URL=http://bot:8000/api/v1
|
│ DASHBOARD_API_URL=http://bot:8000/api/v1
|
||||||
▼
|
▼
|
||||||
hexahost-bot :8000 (nur Docker-intern)
|
axiom-bot :8000 (nur Docker-intern)
|
||||||
│
|
│
|
||||||
└── Discord Gateway (ausgehend)
|
└── Discord Gateway (ausgehend)
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
| Field | Value |
|
| Field | Value |
|
||||||
|-------|-------|
|
|-------|-------|
|
||||||
| **Report ID** | ZYROX-SEC-2026-001 |
|
| **Report ID** | ZYROX-SEC-2026-001 |
|
||||||
| **Target** | HexaHost CV2 AIO Discord Bot with Dashboard |
|
| **Target** | Axiom CV2 AIO Discord Bot with Dashboard |
|
||||||
| **Repository** | `HexaHost-CV2-AIO-With-Dashboard-main` |
|
| **Repository** | `Axiom-CV2-AIO-With-Dashboard-main` |
|
||||||
| **Assessment Date** | 2026-07-21 |
|
| **Assessment Date** | 2026-07-21 |
|
||||||
| **Report Version** | 1.0 |
|
| **Report Version** | 1.0 |
|
||||||
| **Classification** | Internal — Distribution Restricted |
|
| **Classification** | Internal — Distribution Restricted |
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
## 1. Executive Summary
|
## 1. Executive Summary
|
||||||
|
|
||||||
A security review of the HexaHost CV2 AIO Discord bot (originally published by HexaHost) was conducted to determine whether the repository contains malicious code and to identify exploitable misconfigurations.
|
A security review of the Axiom CV2 AIO Discord bot (originally published by HexaHost) was conducted to determine whether the repository contains malicious code and to identify exploitable misconfigurations.
|
||||||
|
|
||||||
### 1.1 Malware Classification
|
### 1.1 Malware Classification
|
||||||
|
|
||||||
@@ -69,7 +69,7 @@ A security review of the HexaHost CV2 AIO Discord bot (originally published by H
|
|||||||
```
|
```
|
||||||
┌─────────────────────────────────────┐
|
┌─────────────────────────────────────┐
|
||||||
│ Trust Boundary │
|
│ Trust Boundary │
|
||||||
Discord Users ───►│ discord.py Gateway (bot/HexaHost.py) │
|
Discord Users ───►│ discord.py Gateway (bot/Axiom.py) │
|
||||||
│ │ │ │
|
│ │ │ │
|
||||||
│ ▼ ▼ │
|
│ ▼ ▼ │
|
||||||
│ SQLite (bot/db/) FastAPI :8000 │
|
│ SQLite (bot/db/) FastAPI :8000 │
|
||||||
@@ -153,7 +153,7 @@ OWNER_IDS: list[int] = _parse_ids("OWNER_IDS", [870179991462236170])
|
|||||||
| **CVSS 3.1 (est.)** | 9.8 (AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) |
|
| **CVSS 3.1 (est.)** | 9.8 (AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) |
|
||||||
| **Status at review** | Open → Remediated (#2) |
|
| **Status at review** | Open → Remediated (#2) |
|
||||||
|
|
||||||
**Affected component:** `bot/HexaHost.py` (~L345)
|
**Affected component:** `bot/Axiom.py` (~L345)
|
||||||
|
|
||||||
```python
|
```python
|
||||||
await client.load_extension("jishaku")
|
await client.load_extension("jishaku")
|
||||||
@@ -176,7 +176,7 @@ await client.load_extension("jishaku")
|
|||||||
| **CVSS 3.1 (est.)** | 7.5 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N) |
|
| **CVSS 3.1 (est.)** | 7.5 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N) |
|
||||||
| **Status at review** | Open → Remediated (#3) |
|
| **Status at review** | Open → Remediated (#3) |
|
||||||
|
|
||||||
**Affected component:** `bot/HexaHost.py` → `on_command_completion`
|
**Affected component:** `bot/Axiom.py` → `on_command_completion`
|
||||||
|
|
||||||
**Description:** Non-owner command invocations are POSTed to `CMD_WEBHOOK_URL` with command text, user ID, guild name/ID, and channel ID. Owner commands are explicitly excluded from logging.
|
**Description:** Non-owner command invocations are POSTed to `CMD_WEBHOOK_URL` with command text, user ID, guild name/ID, and channel ID. Owner commands are explicitly excluded from logging.
|
||||||
|
|
||||||
@@ -198,9 +198,9 @@ await client.load_extension("jishaku")
|
|||||||
|
|
||||||
| File | Channel ID | Function |
|
| File | Channel ID | Function |
|
||||||
|------|------------|----------|
|
|------|------------|----------|
|
||||||
| `bot/HexaHost.py` | `1396794297386532978` | Guild join notifications |
|
| `bot/Axiom.py` | `1396794297386532978` | Guild join notifications |
|
||||||
| `bot/HexaHost.py` | `1419729255977189467` | Server count display |
|
| `bot/Axiom.py` | `1419729255977189467` | Server count display |
|
||||||
| `bot/HexaHost.py` | `1419729283861184632` | Member count display |
|
| `bot/Axiom.py` | `1419729283861184632` | Member count display |
|
||||||
| `bot/cogs/events/on_guild.py` | `1396794297386532978` | Join/leave detail logs |
|
| `bot/cogs/events/on_guild.py` | `1396794297386532978` | Join/leave detail logs |
|
||||||
| `bot/cogs/commands/np.py` | `1396794297386532978` | No-prefix command audit |
|
| `bot/cogs/commands/np.py` | `1396794297386532978` | No-prefix command audit |
|
||||||
|
|
||||||
@@ -218,7 +218,7 @@ await client.load_extension("jishaku")
|
|||||||
| **CWE** | [CWE-284](https://cwe.mitre.org/data/definitions/284.html) — Improper Access Control |
|
| **CWE** | [CWE-284](https://cwe.mitre.org/data/definitions/284.html) — Improper Access Control |
|
||||||
| **Status at review** | Open → Partially remediated (#5, #10) |
|
| **Status at review** | Open → Partially remediated (#5, #10) |
|
||||||
|
|
||||||
**Affected components:** `bot/api/server.py`, `bot/utils/tunnel.py`, `bot/HexaHost.py`
|
**Affected components:** `bot/api/server.py`, `bot/utils/tunnel.py`, `bot/Axiom.py`
|
||||||
|
|
||||||
**Description:** API listens on `0.0.0.0:8000` by default. Cloudflare tunnel can expose localhost to the public internet. Authentication is a single shared bearer token without per-guild Discord authorization (pre-fix).
|
**Description:** API listens on `0.0.0.0:8000` by default. Cloudflare tunnel can expose localhost to the public internet. Authentication is a single shared bearer token without per-guild Discord authorization (pre-fix).
|
||||||
|
|
||||||
@@ -388,8 +388,8 @@ const API_KEY = process.env.NEXT_PUBLIC_DASHBOARD_API_KEY;
|
|||||||
|
|
||||||
| Component | Role |
|
| Component | Role |
|
||||||
|-----------|------|
|
|-----------|------|
|
||||||
| `HexaHost.py` | Process entry: bot, API thread, optional tunnel |
|
| `Axiom.py` | Process entry: bot, API thread, optional tunnel |
|
||||||
| `core/hexahost.py` | `AutoShardedBot` subclass, prefix resolution |
|
| `core/axiom.py` | `AutoShardedBot` subclass, prefix resolution |
|
||||||
| `utils/config.py` | Centralized environment configuration |
|
| `utils/config.py` | Centralized environment configuration |
|
||||||
| `api/` | FastAPI REST layer for dashboard |
|
| `api/` | FastAPI REST layer for dashboard |
|
||||||
| `cogs/` | Feature modules (~80+ extensions) |
|
| `cogs/` | Feature modules (~80+ extensions) |
|
||||||
@@ -454,7 +454,7 @@ All databases are local SQLite files under `bot/db/`. No encryption at rest obse
|
|||||||
## Appendix D — Startup Sequence
|
## Appendix D — Startup Sequence
|
||||||
|
|
||||||
```
|
```
|
||||||
python bot/HexaHost.py
|
python bot/Axiom.py
|
||||||
├─ load_dotenv()
|
├─ load_dotenv()
|
||||||
├─ FastAPI thread (if API_ENABLED)
|
├─ FastAPI thread (if API_ENABLED)
|
||||||
├─ Cloudflare tunnel (if TUNNEL_ENABLED)
|
├─ Cloudflare tunnel (if TUNNEL_ENABLED)
|
||||||
@@ -473,7 +473,7 @@ npm run dev (dashboard/)
|
|||||||
|
|
||||||
## 6. Conclusion
|
## 6. Conclusion
|
||||||
|
|
||||||
HexaHost CV2 AIO is a feature-rich Discord bot platform, not a self-propagating malware sample. The primary security concern is **deployment-time trust delegation**: unchanged defaults effectively assign operational control and observability to the original publisher.
|
Axiom CV2 AIO is a feature-rich Discord bot platform, not a self-propagating malware sample. The primary security concern is **deployment-time trust delegation**: unchanged defaults effectively assign operational control and observability to the original publisher.
|
||||||
|
|
||||||
Operators treating this as production software must treat initial configuration as a **security-critical step**, equivalent to key ceremony for any SaaS deployment.
|
Operators treating this as production software must treat initial configuration as a **security-critical step**, equivalent to key ceremony for any SaaS deployment.
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
## Summary
|
## Summary
|
||||||
|
|
||||||
Security audit and hardening of the HexaHost CV2 AIO Discord bot with dashboard. The analysis found **no classic malware**, but several **backdoor-like mechanisms** in the original legacy configuration (foreign owner IDs, external logging, exposed API, API key leak in the frontend).
|
Security audit and hardening of the Axiom CV2 AIO Discord bot with dashboard. The analysis found **no classic malware**, but several **backdoor-like mechanisms** in the original legacy configuration (foreign owner IDs, external logging, exposed API, API key leak in the frontend).
|
||||||
|
|
||||||
This PR addresses **10 security issues** and introduces **secure defaults**: without a proper `.env` configuration, no foreign user retains owner rights, no external logging occurs, and the API is not publicly exposed.
|
This PR addresses **10 security issues** and introduces **secure defaults**: without a proper `.env` configuration, no foreign user retains owner rights, no external logging occurs, and the API is not publicly exposed.
|
||||||
|
|
||||||
|
|||||||
29
README.md
29
README.md
@@ -1,9 +1,10 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
```
|
```
|
||||||
+-+-+-+-+-+-+-+-+
|
+-+-+-+-+-+
|
||||||
|H|e|x|a|H|o|s|t|
|
|A|x|i|o|m|
|
||||||
+-+-+-+-+-+-+-+-+
|
+-+-+-+-+-+
|
||||||
|
by HexaHost
|
||||||
```
|
```
|
||||||
|
|
||||||
<h3>A feature-rich Discord bot paired with a sleek Next.js dashboard</h3>
|
<h3>A feature-rich Discord bot paired with a sleek Next.js dashboard</h3>
|
||||||
@@ -26,10 +27,10 @@
|
|||||||
|
|
||||||
## ✦ Overview
|
## ✦ Overview
|
||||||
|
|
||||||
HexaHost is a fully-featured Discord bot with a modern web dashboard for managing everything from antinuke to music. Built on `discord.py v2`, `FastAPI`, and `Next.js 14` with Tailwind CSS.
|
Axiom is a fully-featured Discord bot by HexaHost with a modern web dashboard for managing everything from antinuke to music. Built on `discord.py v2`, `FastAPI`, and `Next.js 14` with Tailwind CSS.
|
||||||
|
|
||||||
```
|
```
|
||||||
HexaHost-CV2-With-Dashboard/
|
Axiom-CV2-With-Dashboard/
|
||||||
├── 🤖 bot/ Python Discord bot + FastAPI backend
|
├── 🤖 bot/ Python Discord bot + FastAPI backend
|
||||||
│ ├── api/ Dashboard REST API (FastAPI)
|
│ ├── api/ Dashboard REST API (FastAPI)
|
||||||
│ ├── cogs/ All bot features (commands, events, antinuke, automod…)
|
│ ├── cogs/ All bot features (commands, events, antinuke, automod…)
|
||||||
@@ -37,7 +38,7 @@ HexaHost-CV2-With-Dashboard/
|
|||||||
│ ├── utils/ Shared utilities (emoji, tools, sync, cloudflare tunnel…)
|
│ ├── utils/ Shared utilities (emoji, tools, sync, cloudflare tunnel…)
|
||||||
│ ├── games/ Standalone game modules
|
│ ├── games/ Standalone game modules
|
||||||
│ ├── assets/ Fonts, backgrounds, GIFs
|
│ ├── assets/ Fonts, backgrounds, GIFs
|
||||||
│ └── HexaHost.py Entry point
|
│ └── Axiom.py Entry point
|
||||||
│
|
│
|
||||||
└── 🌐 dashboard/ Next.js frontend
|
└── 🌐 dashboard/ Next.js frontend
|
||||||
├── app/ App Router pages & API routes
|
├── app/ App Router pages & API routes
|
||||||
@@ -116,7 +117,7 @@ HexaHost-CV2-With-Dashboard/
|
|||||||
- Slash + prefix commands
|
- Slash + prefix commands
|
||||||
- FastAPI backend with API key auth + rate limiting
|
- FastAPI backend with API key auth + rate limiting
|
||||||
- Cloudflare Tunnel — unlimited bandwidth, permanent URL, zero system installs
|
- Cloudflare Tunnel — unlimited bandwidth, permanent URL, zero system installs
|
||||||
- HexaHost watermark on every source file
|
- HexaHost manufacturer watermark on every source file
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -142,8 +143,8 @@ HexaHost-CV2-With-Dashboard/
|
|||||||
**1 — Clone the repo**
|
**1 — Clone the repo**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/theoneandonlymace/HexaHost-CV2-With-Dashboard
|
git clone https://github.com/theoneandonlymace/Axiom-CV2-With-Dashboard
|
||||||
cd HexaHost-CV2-With-Dashboard/bot
|
cd Axiom-CV2-With-Dashboard/bot
|
||||||
```
|
```
|
||||||
|
|
||||||
**2 — Install dependencies**
|
**2 — Install dependencies**
|
||||||
@@ -167,7 +168,7 @@ Copy `.env.example` to `.env` and fill in the values:
|
|||||||
```env
|
```env
|
||||||
# ── Core ──────────────────────────────────────────────────────────
|
# ── Core ──────────────────────────────────────────────────────────
|
||||||
TOKEN = your_discord_bot_token
|
TOKEN = your_discord_bot_token
|
||||||
brand_name = 'HexaHost'
|
brand_name = 'Axiom'
|
||||||
|
|
||||||
# ── Owner IDs (REQUIRED — your Discord user ID) ───────────────────
|
# ── Owner IDs (REQUIRED — your Discord user ID) ───────────────────
|
||||||
OWNER_IDS = YOUR_DISCORD_USER_ID_HERE
|
OWNER_IDS = YOUR_DISCORD_USER_ID_HERE
|
||||||
@@ -201,7 +202,7 @@ CF_TUNNEL_URL = "https://api.yourdomain.com"
|
|||||||
**4 — Run the bot**
|
**4 — Run the bot**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python HexaHost.py
|
python Axiom.py
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -231,7 +232,7 @@ DISCORD_CLIENT_SECRET = your_discord_oauth_client_secret
|
|||||||
|
|
||||||
ADMIN_IDS = your_discord_user_id
|
ADMIN_IDS = your_discord_user_id
|
||||||
NEXT_PUBLIC_ADMIN_IDS = your_discord_user_id
|
NEXT_PUBLIC_ADMIN_IDS = your_discord_user_id
|
||||||
NEXT_PUBLIC_BRAND_NAME = "HexaHost"
|
NEXT_PUBLIC_BRAND_NAME = "Axiom"
|
||||||
NEXT_PUBLIC_BRAND_NAME_WORD = "ZX"
|
NEXT_PUBLIC_BRAND_NAME_WORD = "ZX"
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -303,7 +304,7 @@ The bot uses **pycloudflared** — a Python package that downloads the `cloudfla
|
|||||||
**Setup (browser only, no CLI needed):**
|
**Setup (browser only, no CLI needed):**
|
||||||
|
|
||||||
1. Go to [one.dash.cloudflare.com](https://one.dash.cloudflare.com) → **Networks → Tunnels → Create a tunnel**
|
1. Go to [one.dash.cloudflare.com](https://one.dash.cloudflare.com) → **Networks → Tunnels → Create a tunnel**
|
||||||
2. Choose **Cloudflared**, give it a name (e.g. `hexahost-api`), save
|
2. Choose **Cloudflared**, give it a name (e.g. `axiom-api`), save
|
||||||
3. On the **Install connector** step, copy the token from the command shown:
|
3. On the **Install connector** step, copy the token from the command shown:
|
||||||
```
|
```
|
||||||
cloudflared tunnel run --token <COPY_THIS>
|
cloudflared tunnel run --token <COPY_THIS>
|
||||||
@@ -330,7 +331,7 @@ On every startup the console prints:
|
|||||||
### 🤖 Bot — any Python host
|
### 🤖 Bot — any Python host
|
||||||
|
|
||||||
1. Upload the entire `bot/` folder to your host (Pterodactyl, Render, Railway, Fly.io, VPS…)
|
1. Upload the entire `bot/` folder to your host (Pterodactyl, Render, Railway, Fly.io, VPS…)
|
||||||
2. Set the start command to `python HexaHost.py`
|
2. Set the start command to `python Axiom.py`
|
||||||
3. Add all environment variables
|
3. Add all environment variables
|
||||||
4. `pycloudflared` downloads the binary automatically on first run — no extra steps
|
4. `pycloudflared` downloads the binary automatically on first run — no extra steps
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
| **Publication Date** | 2026-07-21 |
|
| **Publication Date** | 2026-07-21 |
|
||||||
| **Status** | Patches applied — operator action required |
|
| **Status** | Patches applied — operator action required |
|
||||||
| **Classification** | Internal — Distribution Restricted |
|
| **Classification** | Internal — Distribution Restricted |
|
||||||
| **Affected Product** | HexaHost CV2 AIO Discord Bot with Dashboard |
|
| **Affected Product** | Axiom CV2 AIO Discord Bot with Dashboard |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@ This document tracks remediation of findings identified during static security a
|
|||||||
| File | Change |
|
| File | Change |
|
||||||
|------|--------|
|
|------|--------|
|
||||||
| `bot/utils/config.py` | `_parse_ids()` returns empty list on missing env var |
|
| `bot/utils/config.py` | `_parse_ids()` returns empty list on missing env var |
|
||||||
| `bot/HexaHost.py` | Startup warning when `OWNER_IDS` is empty |
|
| `bot/Axiom.py` | Startup warning when `OWNER_IDS` is empty |
|
||||||
| `bot/.env.example` | Placeholder `YOUR_DISCORD_USER_ID_HERE`; foreign IDs removed |
|
| `bot/.env.example` | Placeholder `YOUR_DISCORD_USER_ID_HERE`; foreign IDs removed |
|
||||||
| `dashboard/.env.example` | `ADMIN_IDS` placeholder replaces foreign ID |
|
| `dashboard/.env.example` | `ADMIN_IDS` placeholder replaces foreign ID |
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ OWNER_IDS=<your_discord_snowflake>
|
|||||||
| File | Change |
|
| File | Change |
|
||||||
|------|--------|
|
|------|--------|
|
||||||
| `bot/utils/config.py` | `JISHAKU_ENABLED` flag (default: `false`) |
|
| `bot/utils/config.py` | `JISHAKU_ENABLED` flag (default: `false`) |
|
||||||
| `bot/HexaHost.py` | Conditional extension load |
|
| `bot/Axiom.py` | Conditional extension load |
|
||||||
| `bot/.env.example` | Documented opt-in flag |
|
| `bot/.env.example` | Documented opt-in flag |
|
||||||
|
|
||||||
**Post-patch behavior:** Jishaku inactive unless `JISHAKU_ENABLED=true`. Recommended for local debugging only.
|
**Post-patch behavior:** Jishaku inactive unless `JISHAKU_ENABLED=true`. Recommended for local debugging only.
|
||||||
@@ -82,7 +82,7 @@ OWNER_IDS=<your_discord_snowflake>
|
|||||||
| File | Change |
|
| File | Change |
|
||||||
|------|--------|
|
|------|--------|
|
||||||
| `bot/utils/config.py` | `_valid_webhook_url()` rejects empty/placeholder values |
|
| `bot/utils/config.py` | `_valid_webhook_url()` rejects empty/placeholder values |
|
||||||
| `bot/HexaHost.py` | `on_command_completion` early-return when URL invalid |
|
| `bot/Axiom.py` | `on_command_completion` early-return when URL invalid |
|
||||||
|
|
||||||
**Post-patch behavior:** No outbound command telemetry without fully qualified, operator-configured webhook URL.
|
**Post-patch behavior:** No outbound command telemetry without fully qualified, operator-configured webhook URL.
|
||||||
|
|
||||||
@@ -96,7 +96,7 @@ OWNER_IDS=<your_discord_snowflake>
|
|||||||
| File | Change |
|
| File | Change |
|
||||||
|------|--------|
|
|------|--------|
|
||||||
| `bot/utils/config.py` | `LOG_CHANNEL_ID`, `SERVER_COUNT_CHANNEL_ID`, `USER_COUNT_CHANNEL_ID` |
|
| `bot/utils/config.py` | `LOG_CHANNEL_ID`, `SERVER_COUNT_CHANNEL_ID`, `USER_COUNT_CHANNEL_ID` |
|
||||||
| `bot/HexaHost.py` | Config-driven channel references; stats task gated on config |
|
| `bot/Axiom.py` | Config-driven channel references; stats task gated on config |
|
||||||
| `bot/cogs/events/on_guild.py` | Join/leave logging conditional on `LOG_CHANNEL_ID` |
|
| `bot/cogs/events/on_guild.py` | Join/leave logging conditional on `LOG_CHANNEL_ID` |
|
||||||
| `bot/cogs/commands/np.py` | Audit logs use `LOG_CHANNEL_ID` |
|
| `bot/cogs/commands/np.py` | Audit logs use `LOG_CHANNEL_ID` |
|
||||||
| `bot/.env.example` | Optional IDs documented (commented) |
|
| `bot/.env.example` | Optional IDs documented (commented) |
|
||||||
@@ -120,7 +120,7 @@ USER_COUNT_CHANNEL_ID=<channel_snowflake>
|
|||||||
| File | Change |
|
| File | Change |
|
||||||
|------|--------|
|
|------|--------|
|
||||||
| `bot/utils/config.py` | `API_ENABLED=false`, `API_HOST=127.0.0.1`, `TUNNEL_ENABLED=false` |
|
| `bot/utils/config.py` | `API_ENABLED=false`, `API_HOST=127.0.0.1`, `TUNNEL_ENABLED=false` |
|
||||||
| `bot/HexaHost.py` | Bind to `API_HOST`; warn on `0.0.0.0` |
|
| `bot/Axiom.py` | Bind to `API_HOST`; warn on `0.0.0.0` |
|
||||||
| `bot/.env.example` | Secure defaults documented |
|
| `bot/.env.example` | Secure defaults documented |
|
||||||
|
|
||||||
**Post-patch behavior:** API and tunnel disabled until explicitly enabled. Localhost binding by default.
|
**Post-patch behavior:** API and tunnel disabled until explicitly enabled. Localhost binding by default.
|
||||||
@@ -200,7 +200,7 @@ Remove `NEXT_PUBLIC_DASHBOARD_API_KEY` from any existing `.env`.
|
|||||||
| File | Change |
|
| File | Change |
|
||||||
|------|--------|
|
|------|--------|
|
||||||
| `bot/cogs/commands/general.py` | Removed `hack`, `token`, `wizz`; dead code cleanup |
|
| `bot/cogs/commands/general.py` | Removed `hack`, `token`, `wizz`; dead code cleanup |
|
||||||
| `bot/cogs/hexahost/general.py` | Help index updated |
|
| `bot/cogs/axiom/general.py` | Help index updated |
|
||||||
|
|
||||||
**Post-patch behavior:** Commands no longer registered. No regression in remaining general commands.
|
**Post-patch behavior:** Commands no longer registered. No regression in remaining general commands.
|
||||||
|
|
||||||
@@ -234,8 +234,8 @@ Secondary pass on remediation code identified gaps in the initial proxy implemen
|
|||||||
| API proxy accessible without session | Critical | Session gate + guild/admin validation in proxy route |
|
| API proxy accessible without session | Critical | Session gate + guild/admin validation in proxy route |
|
||||||
| Guild dashboard pages lacking authZ check | High | `guild/[guildId]/layout.tsx` enforces Discord permissions |
|
| Guild dashboard pages lacking authZ check | High | `guild/[guildId]/layout.tsx` enforces Discord permissions |
|
||||||
| `GET /guilds` returned all bot guilds | High | Proxy filters to user-manageable intersection |
|
| `GET /guilds` returned all bot guilds | High | Proxy filters to user-manageable intersection |
|
||||||
| `on_command_completion` NullPointer on `command is None` | Medium | Guard clause in `HexaHost.py` |
|
| `on_command_completion` NullPointer on `command is None` | Medium | Guard clause in `Axiom.py` |
|
||||||
| Orphaned `jishaku` import in `bot/core/hexahost.py` | Low | Import removed |
|
| Orphaned `jishaku` import in `bot/core/axiom.py` | Low | Import removed |
|
||||||
| Admin check relied solely on `NEXT_PUBLIC_ADMIN_IDS` | Medium | Server-side `ADMIN_IDS` supported |
|
| Admin check relied solely on `NEXT_PUBLIC_ADMIN_IDS` | Medium | Server-side `ADMIN_IDS` supported |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
TOKEN=TOKEN_HERE
|
TOKEN=TOKEN_HERE
|
||||||
brand_name='HexaHost'
|
brand_name='Axiom'
|
||||||
NEXT_PUBLIC_BRAND_NAME='HexaHost'
|
NEXT_PUBLIC_BRAND_NAME='Axiom'
|
||||||
|
|
||||||
# ── Multiple instances (optional) ─────────────────────────────────────────────
|
# ── Multiple instances (optional) ─────────────────────────────────────────────
|
||||||
# Run several bot processes on one host — each needs its own .env / TOKEN / API_PORT.
|
# Run several bot processes on one host — each needs its own .env / TOKEN / API_PORT.
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ from discord.ext import commands, tasks
|
|||||||
|
|
||||||
from core import Context
|
from core import Context
|
||||||
from core.Cog import Cog
|
from core.Cog import Cog
|
||||||
from core.hexahost import HexaHost
|
from core.axiom import Axiom
|
||||||
from utils.Tools import *
|
from utils.Tools import *
|
||||||
from utils.config import *
|
from utils.config import *
|
||||||
from utils.emoji import SUCCESS, ERROR, TICK, CROSS, REACTION_TEST_EMOJIS
|
from utils.emoji import SUCCESS, ERROR, TICK, CROSS, REACTION_TEST_EMOJIS
|
||||||
@@ -50,7 +50,7 @@ if not OWNER_IDS:
|
|||||||
print("\033[33m⚠ OWNER_IDS is not set in .env — no bot owners configured.\033[0m")
|
print("\033[33m⚠ OWNER_IDS is not set in .env — no bot owners configured.\033[0m")
|
||||||
print("\033[33m Set OWNER_IDS=YOUR_DISCORD_USER_ID before running in production.\033[0m")
|
print("\033[33m Set OWNER_IDS=YOUR_DISCORD_USER_ID before running in production.\033[0m")
|
||||||
|
|
||||||
client = HexaHost()
|
client = Axiom()
|
||||||
tree = client.tree
|
tree = client.tree
|
||||||
|
|
||||||
# --- Background Task for Stats ---
|
# --- Background Task for Stats ---
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# HexaHost Discord Bot + FastAPI dashboard backend
|
# Axiom Discord Bot + FastAPI dashboard backend (by HexaHost)
|
||||||
FROM python:3.12-slim-bookworm
|
FROM python:3.12-slim-bookworm
|
||||||
|
|
||||||
ENV PYTHONDONTWRITEBYTECODE=1 \
|
ENV PYTHONDONTWRITEBYTECODE=1 \
|
||||||
@@ -26,4 +26,4 @@ RUN mkdir -p /app/db /app/jsondb /app/logs
|
|||||||
|
|
||||||
EXPOSE 8000
|
EXPOSE 8000
|
||||||
|
|
||||||
CMD ["python", "HexaHost.py"]
|
CMD ["python", "Axiom.py"]
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
```
|
```
|
||||||
+-+-+-+-+-+-+-+-+
|
+-+-+-+-+-+
|
||||||
|H|e|x|a|H|o|s|t|
|
|A|x|i|o|m|
|
||||||
+-+-+-+-+-+-+-+-+
|
+-+-+-+-+-+
|
||||||
|
by HexaHost
|
||||||
```
|
```
|
||||||
|
|
||||||
<h3>HexaHost Bot — Python Discord Bot + FastAPI Backend</h3>
|
<h3>Axiom Bot — Python Discord Bot + FastAPI Backend</h3>
|
||||||
|
|
||||||
<a href="https://nexiohost.in"><img src="https://img.shields.io/badge/⭐%20PREMIUM%20HOSTING-NexioHost-FFD700?style=for-the-badge&labelColor=1a1a2e&color=FFD700&logoColor=FFD700"/></a>
|
<a href="https://nexiohost.in"><img src="https://img.shields.io/badge/⭐%20PREMIUM%20HOSTING-NexioHost-FFD700?style=for-the-badge&labelColor=1a1a2e&color=FFD700&logoColor=FFD700"/></a>
|
||||||
|
|
||||||
@@ -27,7 +28,7 @@
|
|||||||
|
|
||||||
## ✦ Overview
|
## ✦ Overview
|
||||||
|
|
||||||
This folder contains the HexaHost Discord bot built on `discord.py v2` alongside a `FastAPI` backend that powers the web dashboard. Everything runs from a single `python HexaHost.py` command.
|
This folder contains the Axiom Discord bot built on `discord.py v2` alongside a `FastAPI` backend that powers the web dashboard. Everything runs from a single `python Axiom.py` command.
|
||||||
|
|
||||||
```
|
```
|
||||||
bot/
|
bot/
|
||||||
@@ -39,12 +40,12 @@ bot/
|
|||||||
│ ├── commands/ All slash & prefix command modules
|
│ ├── commands/ All slash & prefix command modules
|
||||||
│ ├── events/ General Discord event listeners
|
│ ├── events/ General Discord event listeners
|
||||||
│ ├── moderation/ Moderation action modules
|
│ ├── moderation/ Moderation action modules
|
||||||
│ └── hexahost/ Core HexaHost feature cogs
|
│ └── axiom/ Help / feature index cogs
|
||||||
├── core/ Bot client, context, cog base classes
|
├── core/ Bot client, context, cog base classes
|
||||||
├── games/ Standalone game logic + button views
|
├── games/ Standalone game logic + button views
|
||||||
├── utils/ Emoji, tools, sync, Cloudflare tunnel
|
├── utils/ Emoji, tools, sync, Cloudflare tunnel
|
||||||
├── assets/ Fonts, backgrounds, GIFs
|
├── assets/ Fonts, backgrounds, GIFs
|
||||||
└── HexaHost.py Entry point
|
└── Axiom.py Entry point
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -132,7 +133,7 @@ bot/
|
|||||||
- Slash + prefix commands
|
- Slash + prefix commands
|
||||||
- Cloudflare Tunnel via pycloudflared — zero system installs, unlimited traffic
|
- Cloudflare Tunnel via pycloudflared — zero system installs, unlimited traffic
|
||||||
- Single `OWNER_IDS` env var controls all permission checks
|
- Single `OWNER_IDS` env var controls all permission checks
|
||||||
- HexaHost watermark on every source file
|
- HexaHost manufacturer watermark on every source file
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -174,7 +175,7 @@ Create a `.env` file (copy from `.env.example`):
|
|||||||
```env
|
```env
|
||||||
# ── Core ──────────────────────────────────────────────────────────
|
# ── Core ──────────────────────────────────────────────────────────
|
||||||
TOKEN = your_discord_bot_token
|
TOKEN = your_discord_bot_token
|
||||||
brand_name = 'HexaHost'
|
brand_name = 'Axiom'
|
||||||
|
|
||||||
# ── Owner IDs (REQUIRED — your Discord user ID) ───────────────────
|
# ── Owner IDs (REQUIRED — your Discord user ID) ───────────────────
|
||||||
OWNER_IDS = YOUR_DISCORD_USER_ID_HERE
|
OWNER_IDS = YOUR_DISCORD_USER_ID_HERE
|
||||||
@@ -208,7 +209,7 @@ CF_TUNNEL_URL = "https://api.yourdomain.com"
|
|||||||
### 3 — Run
|
### 3 — Run
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python HexaHost.py
|
python Axiom.py
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -258,7 +259,7 @@ Uses **pycloudflared** — downloads the `cloudflared` binary automatically on f
|
|||||||
**Setup (browser only — no CLI needed):**
|
**Setup (browser only — no CLI needed):**
|
||||||
|
|
||||||
1. Go to [one.dash.cloudflare.com](https://one.dash.cloudflare.com) → **Networks → Tunnels → Create a tunnel**
|
1. Go to [one.dash.cloudflare.com](https://one.dash.cloudflare.com) → **Networks → Tunnels → Create a tunnel**
|
||||||
2. Choose **Cloudflared**, name it (e.g. `hexahost-api`), save
|
2. Choose **Cloudflared**, name it (e.g. `axiom-api`), save
|
||||||
3. On **Install connector**, copy the token from the command shown:
|
3. On **Install connector**, copy the token from the command shown:
|
||||||
```
|
```
|
||||||
cloudflared tunnel run --token <COPY_THIS_TOKEN>
|
cloudflared tunnel run --token <COPY_THIS_TOKEN>
|
||||||
@@ -300,7 +301,7 @@ When `EMOJI_SYNC=true`, the bot syncs application emojis on every startup:
|
|||||||
Upload the entire `bot/` folder to your host and set the start command to:
|
Upload the entire `bot/` folder to your host and set the start command to:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python HexaHost.py
|
python Axiom.py
|
||||||
```
|
```
|
||||||
|
|
||||||
`pycloudflared` downloads the binary on first run — no extra steps on any host.
|
`pycloudflared` downloads the binary on first run — no extra steps on any host.
|
||||||
|
|||||||
@@ -20,13 +20,13 @@ from slowapi import Limiter
|
|||||||
from slowapi.util import get_remote_address
|
from slowapi.util import get_remote_address
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from core.hexahost import HexaHost
|
from core.axiom import Axiom
|
||||||
|
|
||||||
# Initialize rate limiter
|
# Initialize rate limiter
|
||||||
limiter = Limiter(key_func=get_remote_address, default_limits=["1000 per minute"])
|
limiter = Limiter(key_func=get_remote_address, default_limits=["1000 per minute"])
|
||||||
|
|
||||||
# Global reference to the bot instance
|
# Global reference to the bot instance
|
||||||
_bot_instance: Optional["HexaHost"] = None
|
_bot_instance: Optional["Axiom"] = None
|
||||||
|
|
||||||
# Security scheme
|
# Security scheme
|
||||||
security = HTTPBearer()
|
security = HTTPBearer()
|
||||||
@@ -53,18 +53,18 @@ def verify_api_key(credentials: HTTPAuthorizationCredentials = Security(security
|
|||||||
)
|
)
|
||||||
return credentials.credentials
|
return credentials.credentials
|
||||||
|
|
||||||
def set_bot(bot_instance: "HexaHost"):
|
def set_bot(bot_instance: "Axiom"):
|
||||||
"""
|
"""
|
||||||
Sets the global bot instance.
|
Sets the global bot instance.
|
||||||
This should be called in HexaHost.py during startup.
|
This should be called in Axiom.py during startup.
|
||||||
"""
|
"""
|
||||||
global _bot_instance
|
global _bot_instance
|
||||||
_bot_instance = bot_instance
|
_bot_instance = bot_instance
|
||||||
|
|
||||||
def get_bot() -> "HexaHost":
|
def get_bot() -> "Axiom":
|
||||||
"""
|
"""
|
||||||
FastAPI dependency to retrieve the Discord bot instance.
|
FastAPI dependency to retrieve the Discord bot instance.
|
||||||
Usage: bot: HexaHost = Depends(get_bot)
|
Usage: bot: Axiom = Depends(get_bot)
|
||||||
"""
|
"""
|
||||||
if _bot_instance is None:
|
if _bot_instance is None:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import os
|
|||||||
import aiosqlite
|
import aiosqlite
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from core.hexahost import HexaHost
|
from core.axiom import Axiom
|
||||||
|
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
|
||||||
@@ -38,7 +38,7 @@ import psutil
|
|||||||
import time
|
import time
|
||||||
|
|
||||||
@router.get("/stats", response_model=AdminStats)
|
@router.get("/stats", response_model=AdminStats)
|
||||||
async def get_admin_stats(bot: "HexaHost" = Depends(get_bot)):
|
async def get_admin_stats(bot: "Axiom" = Depends(get_bot)):
|
||||||
# Calculate DB size and shard info
|
# Calculate DB size and shard info
|
||||||
total_size: float = 0.0
|
total_size: float = 0.0
|
||||||
db_count = 0
|
db_count = 0
|
||||||
|
|||||||
@@ -19,12 +19,12 @@ from utils.config import *
|
|||||||
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from core.hexahost import HexaHost
|
from core.axiom import Axiom
|
||||||
|
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
|
||||||
@router.get("/status", response_model=BotStatus, summary="Get bot status", description="Returns real-time health metrics, latency, and scale information.")
|
@router.get("/status", response_model=BotStatus, summary="Get bot status", description="Returns real-time health metrics, latency, and scale information.")
|
||||||
async def get_status(bot: "HexaHost" = Depends(get_bot)):
|
async def get_status(bot: "Axiom" = Depends(get_bot)):
|
||||||
"""
|
"""
|
||||||
Returns the live status of the bot.
|
Returns the live status of the bot.
|
||||||
"""
|
"""
|
||||||
@@ -38,7 +38,7 @@ async def get_status(bot: "HexaHost" = Depends(get_bot)):
|
|||||||
)
|
)
|
||||||
|
|
||||||
@router.get("/info", response_model=BotInfo, summary="Get bot info", description="Returns general information about the bot including command count and user reach.")
|
@router.get("/info", response_model=BotInfo, summary="Get bot info", description="Returns general information about the bot including command count and user reach.")
|
||||||
async def get_bot_info(bot: "HexaHost" = Depends(get_bot)):
|
async def get_bot_info(bot: "Axiom" = Depends(get_bot)):
|
||||||
"""
|
"""
|
||||||
Get general information about the Discord bot.
|
Get general information about the Discord bot.
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -37,13 +37,13 @@ import json
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from core.hexahost import HexaHost
|
from core.axiom import Axiom
|
||||||
|
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
|
||||||
|
|
||||||
@router.get("/", response_model=List[GuildSummary], summary="List all guilds", description="Returns guilds the authenticated user can manage that the bot is in.")
|
@router.get("/", response_model=List[GuildSummary], summary="List all guilds", description="Returns guilds the authenticated user can manage that the bot is in.")
|
||||||
async def list_guilds(request: Request, bot: "HexaHost" = Depends(get_bot)):
|
async def list_guilds(request: Request, bot: "Axiom" = Depends(get_bot)):
|
||||||
"""
|
"""
|
||||||
Lists guilds the bot is in, filtered to those the caller can manage on Discord.
|
Lists guilds the bot is in, filtered to those the caller can manage on Discord.
|
||||||
"""
|
"""
|
||||||
@@ -64,7 +64,7 @@ async def list_guilds(request: Request, bot: "HexaHost" = Depends(get_bot)):
|
|||||||
return guilds_list
|
return guilds_list
|
||||||
|
|
||||||
@router.get("/{guild_id}", response_model=GuildDetails, summary="Get guild details", description="Returns detailed metrics and metadata for a specific Discord guild.")
|
@router.get("/{guild_id}", response_model=GuildDetails, summary="Get guild details", description="Returns detailed metrics and metadata for a specific Discord guild.")
|
||||||
async def get_guild_details(guild_id: int, bot: "HexaHost" = Depends(get_bot)):
|
async def get_guild_details(guild_id: int, bot: "Axiom" = Depends(get_bot)):
|
||||||
"""
|
"""
|
||||||
Returns detailed info for a specific guild by its ID.
|
Returns detailed info for a specific guild by its ID.
|
||||||
"""
|
"""
|
||||||
@@ -820,7 +820,7 @@ async def get_guild_j2c(guild_id: int):
|
|||||||
return J2CConfig(guild_id=str(guild_id))
|
return J2CConfig(guild_id=str(guild_id))
|
||||||
|
|
||||||
@router.patch("/{guild_id}/j2c", summary="Update J2C config")
|
@router.patch("/{guild_id}/j2c", summary="Update J2C config")
|
||||||
async def patch_guild_j2c(guild_id: int, data: J2CUpdate, bot: "HexaHost" = Depends(get_bot)):
|
async def patch_guild_j2c(guild_id: int, data: J2CUpdate, bot: "Axiom" = Depends(get_bot)):
|
||||||
import aiosqlite
|
import aiosqlite
|
||||||
|
|
||||||
def to_id(val):
|
def to_id(val):
|
||||||
@@ -1000,7 +1000,7 @@ async def patch_guild_customroles(guild_id: int, data: CustomRoleUpdate):
|
|||||||
return {"status": "success"}
|
return {"status": "success"}
|
||||||
|
|
||||||
@router.get("/{guild_id}/logging", response_model=LoggingConfig, summary="Get Logging config", description="Retrieves the event logging configuration and designated log channels.")
|
@router.get("/{guild_id}/logging", response_model=LoggingConfig, summary="Get Logging config", description="Retrieves the event logging configuration and designated log channels.")
|
||||||
async def get_guild_logging(guild_id: int, bot: "HexaHost" = Depends(get_bot)):
|
async def get_guild_logging(guild_id: int, bot: "Axiom" = Depends(get_bot)):
|
||||||
"""
|
"""
|
||||||
Retrieves the logging configuration for a specific guild.
|
Retrieves the logging configuration for a specific guild.
|
||||||
"""
|
"""
|
||||||
@@ -1044,7 +1044,7 @@ async def get_guild_logging(guild_id: int, bot: "HexaHost" = Depends(get_bot)):
|
|||||||
)
|
)
|
||||||
|
|
||||||
@router.patch("/{guild_id}/logging", summary="Update Logging config", description="Updates which Discord events are logged and where they are posted.")
|
@router.patch("/{guild_id}/logging", summary="Update Logging config", description="Updates which Discord events are logged and where they are posted.")
|
||||||
async def patch_guild_logging(guild_id: int, data: LoggingUpdate, bot: "HexaHost" = Depends(get_bot)):
|
async def patch_guild_logging(guild_id: int, data: LoggingUpdate, bot: "Axiom" = Depends(get_bot)):
|
||||||
"""
|
"""
|
||||||
Updates the logging configuration for a specific guild.
|
Updates the logging configuration for a specific guild.
|
||||||
"""
|
"""
|
||||||
@@ -1076,7 +1076,7 @@ async def patch_guild_logging(guild_id: int, data: LoggingUpdate, bot: "HexaHost
|
|||||||
return {"status": "success", "guild_id": guild_id}
|
return {"status": "success", "guild_id": guild_id}
|
||||||
|
|
||||||
@router.get("/{guild_id}/leveling/leaderboard", response_model=List[LeaderboardEntry], summary="Get leveling leaderboard", description="Returns top users by XP for a specific guild.")
|
@router.get("/{guild_id}/leveling/leaderboard", response_model=List[LeaderboardEntry], summary="Get leveling leaderboard", description="Returns top users by XP for a specific guild.")
|
||||||
async def get_leveling_leaderboard(guild_id: int, bot: "HexaHost" = Depends(get_bot)):
|
async def get_leveling_leaderboard(guild_id: int, bot: "Axiom" = Depends(get_bot)):
|
||||||
db = await db_manager.get_connection(db_path('leveling.db'))
|
db = await db_manager.get_connection(db_path('leveling.db'))
|
||||||
cursor = await db.execute(
|
cursor = await db.execute(
|
||||||
"SELECT user_id, xp FROM user_xp WHERE guild_id = ? ORDER BY xp DESC LIMIT 100",
|
"SELECT user_id, xp FROM user_xp WHERE guild_id = ? ORDER BY xp DESC LIMIT 100",
|
||||||
@@ -1116,7 +1116,7 @@ async def get_leveling_leaderboard(guild_id: int, bot: "HexaHost" = Depends(get_
|
|||||||
return leaderboard
|
return leaderboard
|
||||||
|
|
||||||
@router.get("/{guild_id}/channels", response_model=List[DiscordChannel], summary="Get guild channels", description="Returns a list of all channels for the specific guild.")
|
@router.get("/{guild_id}/channels", response_model=List[DiscordChannel], summary="Get guild channels", description="Returns a list of all channels for the specific guild.")
|
||||||
async def get_guild_channels(guild_id: int, bot: "HexaHost" = Depends(get_bot)):
|
async def get_guild_channels(guild_id: int, bot: "Axiom" = Depends(get_bot)):
|
||||||
guild = bot.get_guild(guild_id)
|
guild = bot.get_guild(guild_id)
|
||||||
if not guild:
|
if not guild:
|
||||||
raise HTTPException(status_code=404, detail="Guild not found")
|
raise HTTPException(status_code=404, detail="Guild not found")
|
||||||
@@ -1136,7 +1136,7 @@ async def get_guild_channels(guild_id: int, bot: "HexaHost" = Depends(get_bot)):
|
|||||||
return channels
|
return channels
|
||||||
|
|
||||||
@router.get("/{guild_id}/roles", response_model=List[DiscordRole], summary="Get guild roles", description="Returns a list of roles for the specific guild.")
|
@router.get("/{guild_id}/roles", response_model=List[DiscordRole], summary="Get guild roles", description="Returns a list of roles for the specific guild.")
|
||||||
async def get_guild_roles(guild_id: int, bot: "HexaHost" = Depends(get_bot)):
|
async def get_guild_roles(guild_id: int, bot: "Axiom" = Depends(get_bot)):
|
||||||
guild = bot.get_guild(guild_id)
|
guild = bot.get_guild(guild_id)
|
||||||
if not guild:
|
if not guild:
|
||||||
raise HTTPException(status_code=404, detail="Guild not found")
|
raise HTTPException(status_code=404, detail="Guild not found")
|
||||||
|
|||||||
@@ -52,8 +52,8 @@ async def lifespan(app: FastAPI):
|
|||||||
|
|
||||||
def create_app() -> FastAPI:
|
def create_app() -> FastAPI:
|
||||||
"""
|
"""
|
||||||
Initializes the FastAPI application for the HexaHost Bot Dashboard.
|
Initializes the FastAPI application for the Axiom Bot Dashboard.
|
||||||
The bot instance will be attached to app.state.bot in HexaHost.py at runtime.
|
The bot instance will be attached to app.state.bot in Axiom.py at runtime.
|
||||||
"""
|
"""
|
||||||
app = FastAPI(
|
app = FastAPI(
|
||||||
title=f"{BRAND_NAME} Bot API",
|
title=f"{BRAND_NAME} Bot API",
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
from colorama import Fore, Style
|
from colorama import Fore, Style
|
||||||
|
|
||||||
from core import HexaHost
|
from core import Axiom
|
||||||
from utils.config import BotName
|
from utils.config import BotName
|
||||||
|
|
||||||
from .commands.help import Help
|
from .commands.help import Help
|
||||||
@@ -94,34 +94,34 @@ from .events.autoreact import AutoReactListener
|
|||||||
from .events.ai import AIResponses
|
from .events.ai import AIResponses
|
||||||
from .events.stickymessage import StickyMessageListener
|
from .events.stickymessage import StickyMessageListener
|
||||||
|
|
||||||
from .hexahost.antinuke import _antinuke
|
from .axiom.antinuke import _antinuke
|
||||||
from .hexahost.extra import _extra
|
from .axiom.extra import _extra
|
||||||
from .hexahost.general import _general
|
from .axiom.general import _general
|
||||||
from .hexahost.automod import _automod
|
from .axiom.automod import _automod
|
||||||
from .hexahost.moderation import _moderation
|
from .axiom.moderation import _moderation
|
||||||
from .hexahost.music import _music
|
from .axiom.music import _music
|
||||||
from .hexahost.fun import _fun
|
from .axiom.fun import _fun
|
||||||
from .hexahost.games import _games
|
from .axiom.games import _games
|
||||||
from .hexahost.ignore import _ignore
|
from .axiom.ignore import _ignore
|
||||||
from .hexahost.server import _server
|
from .axiom.server import _server
|
||||||
from .hexahost.voice import _voice
|
from .axiom.voice import _voice
|
||||||
from .hexahost.welcome import _welcome
|
from .axiom.welcome import _welcome
|
||||||
from .hexahost.giveaway import _giveaway
|
from .axiom.giveaway import _giveaway
|
||||||
from .hexahost.ticket import _ticket
|
from .axiom.ticket import _ticket
|
||||||
from .hexahost.logging import _logging
|
from .axiom.logging import _logging
|
||||||
from .hexahost.vanity import _vanity
|
from .axiom.vanity import _vanity
|
||||||
from .hexahost.inviteTracker import inviteTracker
|
from .axiom.inviteTracker import inviteTracker
|
||||||
from .hexahost.counting import _Counting
|
from .axiom.counting import _Counting
|
||||||
from .hexahost.j2c import _J2C
|
from .axiom.j2c import _J2C
|
||||||
from .hexahost.ai import _ai
|
from .axiom.ai import _ai
|
||||||
from .hexahost.booster import __boost
|
from .axiom.booster import __boost
|
||||||
from .hexahost.leveling import _leveling
|
from .axiom.leveling import _leveling
|
||||||
from .hexahost.sticky import _sticky
|
from .axiom.sticky import _sticky
|
||||||
from .hexahost.verify import _verify
|
from .axiom.verify import _verify
|
||||||
from .hexahost.encryption import _encrypt
|
from .axiom.encryption import _encrypt
|
||||||
from .hexahost.mc import _mc
|
from .axiom.mc import _mc
|
||||||
from .hexahost.joindm import _joindm
|
from .axiom.joindm import _joindm
|
||||||
from .hexahost.birth import _birth
|
from .axiom.birth import _birth
|
||||||
|
|
||||||
from .antinuke.anti_member_update import AntiMemberUpdate
|
from .antinuke.anti_member_update import AntiMemberUpdate
|
||||||
from .antinuke.antiban import AntiBan
|
from .antinuke.antiban import AntiBan
|
||||||
@@ -191,7 +191,7 @@ COG_CLASSES: tuple[type, ...] = (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def setup(bot: HexaHost) -> None:
|
async def setup(bot: Axiom) -> None:
|
||||||
for cog_cls in COG_CLASSES:
|
for cog_cls in COG_CLASSES:
|
||||||
await bot.add_cog(cog_cls(bot))
|
await bot.add_cog(cog_cls(bot))
|
||||||
print(Fore.RED + Style.BRIGHT + f"Loaded cog: {cog_cls.__name__}")
|
print(Fore.RED + Style.BRIGHT + f"Loaded cog: {cog_cls.__name__}")
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
import discord
|
import discord
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
import os
|
import os
|
||||||
from core import Cog, HexaHost, Context
|
from core import Cog, Axiom, Context
|
||||||
import games as games
|
import games as games
|
||||||
from utils.Tools import *
|
from utils.Tools import *
|
||||||
from utils.cv2 import CV2
|
from utils.cv2 import CV2
|
||||||
@@ -25,9 +25,9 @@ import asyncio
|
|||||||
|
|
||||||
|
|
||||||
class Games(Cog):
|
class Games(Cog):
|
||||||
"""HexaHost Games"""
|
"""Axiom Games"""
|
||||||
|
|
||||||
def __init__(self, client: HexaHost):
|
def __init__(self, client: Axiom):
|
||||||
self.client = client
|
self.client = client
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ import datetime
|
|||||||
import re
|
import re
|
||||||
from typing import *
|
from typing import *
|
||||||
from time import strftime
|
from time import strftime
|
||||||
from core import Cog, HexaHost, Context
|
from core import Cog, Axiom, Context
|
||||||
from discord.ui import LayoutView, TextDisplay, Separator, Container
|
from discord.ui import LayoutView, TextDisplay, Separator, Container
|
||||||
from utils.cv2 import CV2, build_container
|
from utils.cv2 import CV2, build_container
|
||||||
|
|
||||||
@@ -49,7 +49,7 @@ datefmt ="%H:%M:%S",
|
|||||||
)
|
)
|
||||||
|
|
||||||
class Booster (Cog ):
|
class Booster (Cog ):
|
||||||
def __init__ (self ,bot : HexaHost ):
|
def __init__ (self ,bot : Axiom ):
|
||||||
self .bot =bot
|
self .bot =bot
|
||||||
self .color =0xFF0000
|
self .color =0xFF0000
|
||||||
self .db_path =db_path("boost.db")
|
self .db_path =db_path("boost.db")
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ from typing import *
|
|||||||
from utils import *
|
from utils import *
|
||||||
from utils.config import BotName, serverLink
|
from utils.config import BotName, serverLink
|
||||||
from utils import Paginator, DescriptionEmbedPaginator, FieldPagePaginator, TextPaginator
|
from utils import Paginator, DescriptionEmbedPaginator, FieldPagePaginator, TextPaginator
|
||||||
from core import Cog, HexaHost, Context
|
from core import Cog, Axiom, Context
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
import aiosqlite
|
import aiosqlite
|
||||||
import asyncio
|
import asyncio
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
import discord
|
import discord
|
||||||
from utils.emoji import CROSS, TICK, ZWARNING, HEXAHOST_CONNECTION, HEXAHOST_LINKS
|
from utils.emoji import CROSS, TICK, ZWARNING, AXIOM_CONNECTION, AXIOM_LINKS
|
||||||
from discord.ext import commands, tasks
|
from discord.ext import commands, tasks
|
||||||
from discord.utils import get
|
from discord.utils import get
|
||||||
import datetime
|
import datetime
|
||||||
@@ -308,8 +308,8 @@ class General(commands.Cog):
|
|||||||
async def invite(self, ctx: commands.Context):
|
async def invite(self, ctx: commands.Context):
|
||||||
invite_text = (
|
invite_text = (
|
||||||
"```Empower your server with blazing-fast features and 24/7 support!```\n"
|
"```Empower your server with blazing-fast features and 24/7 support!```\n"
|
||||||
f"{HEXAHOST_LINKS} **Quick Actions**\n"
|
f"{AXIOM_LINKS} **Quick Actions**\n"
|
||||||
f">>> **[Invite {BotName}](https://discord.com/oauth2/authorize?client_id=1396114795102470196&permissions=8&integration_type=0&scope=bot+applications.commands)**\n"
|
f">>> **[Invite {BotName}](https://discord.com/oauth2/authorize?client_id=1396114795102470196&permissions=8&integration_type=0&scope=bot+applications.commands)**\n"
|
||||||
"**[Support Server](https://discord.gg/hexahost)**"
|
"**[Support Server](https://discord.gg/hexahost)**"
|
||||||
)
|
)
|
||||||
await ctx.send(view=CV2(f"{HEXAHOST_CONNECTION} {BotName} Integration Hub!", invite_text))
|
await ctx.send(view=CV2(f"{AXIOM_CONNECTION} {BotName} Integration Hub!", invite_text))
|
||||||
@@ -18,7 +18,7 @@ from discord import app_commands, Interaction
|
|||||||
from difflib import get_close_matches
|
from difflib import get_close_matches
|
||||||
from contextlib import suppress
|
from contextlib import suppress
|
||||||
from core import Context
|
from core import Context
|
||||||
from core.hexahost import HexaHost
|
from core.axiom import Axiom
|
||||||
from core.Cog import Cog
|
from core.Cog import Cog
|
||||||
from utils.Tools import getConfig
|
from utils.Tools import getConfig
|
||||||
from itertools import chain
|
from itertools import chain
|
||||||
@@ -268,7 +268,7 @@ class HelpCommand(commands.HelpCommand):
|
|||||||
|
|
||||||
class Help(Cog, name="help"):
|
class Help(Cog, name="help"):
|
||||||
|
|
||||||
def __init__(self, client: HexaHost):
|
def __init__(self, client: Axiom):
|
||||||
self._original_help_command = client.help_command
|
self._original_help_command = client.help_command
|
||||||
attributes = {
|
attributes = {
|
||||||
'name': "help",
|
'name': "help",
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ from discord.ui import Button, View, LayoutView, TextDisplay, Separator, Contain
|
|||||||
import wavelink
|
import wavelink
|
||||||
from wavelink.enums import TrackSource
|
from wavelink.enums import TrackSource
|
||||||
from utils import Paginator, DescriptionEmbedPaginator
|
from utils import Paginator, DescriptionEmbedPaginator
|
||||||
from core import Cog, HexaHost, Context
|
from core import Cog, Axiom, Context
|
||||||
from PIL import Image, ImageDraw, ImageFont, ImageOps
|
from PIL import Image, ImageDraw, ImageFont, ImageOps
|
||||||
import io
|
import io
|
||||||
import aiohttp
|
import aiohttp
|
||||||
@@ -334,7 +334,7 @@ class MusicControlView(LayoutView):
|
|||||||
|
|
||||||
|
|
||||||
class Music(commands.Cog):
|
class Music(commands.Cog):
|
||||||
def __init__(self, client: HexaHost):
|
def __init__(self, client: Axiom):
|
||||||
self.client = client
|
self.client = client
|
||||||
self.client.loop.create_task(self.connect_nodes())
|
self.client.loop.create_task(self.connect_nodes())
|
||||||
self.client.loop.create_task(self.monitor_inactivity())
|
self.client.loop.create_task(self.monitor_inactivity())
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ from utils.db_paths import db_path
|
|||||||
from discord.ext import commands, tasks
|
from discord.ext import commands, tasks
|
||||||
from discord import *
|
from discord import *
|
||||||
import discord
|
import discord
|
||||||
from utils.emoji import BOOST, ICONS_WARNING, INFO, MENTION, PREMIUM, TICK, TIME, TIMER_ALT1, U_ADMIN, ZDIL, ZHUMAN, HEXAHOST_HAMMER, HEXAHOST_SYS
|
from utils.emoji import BOOST, ICONS_WARNING, INFO, MENTION, PREMIUM, TICK, TIME, TIMER_ALT1, U_ADMIN, ZDIL, ZHUMAN, AXIOM_HAMMER, AXIOM_SYS
|
||||||
import aiosqlite
|
import aiosqlite
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
@@ -143,7 +143,7 @@ class TimeSelect(Select):
|
|||||||
await log_channel.send(view=embed)
|
await log_channel.send(view=embed)
|
||||||
|
|
||||||
embed = CV2Embed(
|
embed = CV2Embed(
|
||||||
description=f"**Added Global No Prefix**:\n{ZHUMAN} User: **{self.user.mention}**\n{MENTION} User Mention: {self.user.mention}\n{HEXAHOST_SYS} User ID: {self.user.id}\n\n__**Additional Info**__:\n{HEXAHOST_HAMMER} Added By: **{self.author.display_name}**\n{TIME} Expiry Time: {expiry_text}\n{BOOST} Timestamp: {expiry_timestamp}",
|
description=f"**Added Global No Prefix**:\n{ZHUMAN} User: **{self.user.mention}**\n{MENTION} User Mention: {self.user.mention}\n{AXIOM_SYS} User ID: {self.user.id}\n\n__**Additional Info**__:\n{AXIOM_HAMMER} Added By: **{self.author.display_name}**\n{TIME} Expiry Time: {expiry_text}\n{BOOST} Timestamp: {expiry_timestamp}",
|
||||||
color=0xFF0000,
|
color=0xFF0000,
|
||||||
)
|
)
|
||||||
embed.set_author(
|
embed.set_author(
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ from utils import Paginator, DescriptionEmbedPaginator, FieldPagePaginator, Text
|
|||||||
from utils.Tools import *
|
from utils.Tools import *
|
||||||
from utils.config import OWNER_IDS, BOT_OWNER_IDS
|
from utils.config import OWNER_IDS, BOT_OWNER_IDS
|
||||||
from utils.emoji import BOOSTS, DISCORD_BADGE_EMOJIS, LOADINGRED, NITRO_BOOST, TICK, ZWARNING
|
from utils.emoji import BOOSTS, DISCORD_BADGE_EMOJIS, LOADINGRED, NITRO_BOOST, TICK, ZWARNING
|
||||||
from core import Cog, HexaHost, Context
|
from core import Cog, Axiom, Context
|
||||||
import sqlite3
|
import sqlite3
|
||||||
import os
|
import os
|
||||||
import requests
|
import requests
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
from utils.db_paths import db_path
|
from utils.db_paths import db_path
|
||||||
|
|
||||||
import discord
|
import discord
|
||||||
from utils.emoji import CODEBASE, LOADING, SYSTEM, THUNDER, HEXAHOST_CODE, HEXAHOST_COMMAND, HEXAHOST_GLOBAL, HEXAHOST_OWNER, HEXAHOST_SEARCH
|
from utils.emoji import CODEBASE, LOADING, SYSTEM, THUNDER, AXIOM_CODE, AXIOM_COMMAND, AXIOM_GLOBAL, AXIOM_OWNER, AXIOM_SEARCH
|
||||||
import psutil
|
import psutil
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
@@ -60,27 +60,27 @@ def create_stats_content(stats_data, selected):
|
|||||||
f"**{SYSTEM} Hardware**\n"
|
f"**{SYSTEM} Hardware**\n"
|
||||||
f"Cpu Usage: **{stats_data['cpu']}%**\n"
|
f"Cpu Usage: **{stats_data['cpu']}%**\n"
|
||||||
f"Ram Usage: **{stats_data['ram']}%**\n\n"
|
f"Ram Usage: **{stats_data['ram']}%**\n\n"
|
||||||
f"**{HEXAHOST_CODE} Software**\n"
|
f"**{AXIOM_CODE} Software**\n"
|
||||||
f"Python: **{sys.version_info.major}.{sys.version_info.minor}**\n"
|
f"Python: **{sys.version_info.major}.{sys.version_info.minor}**\n"
|
||||||
f"Discord.py: **{discord.__version__}**"
|
f"Discord.py: **{discord.__version__}**"
|
||||||
),
|
),
|
||||||
"General Info": (
|
"General Info": (
|
||||||
f"**Uptime**: `{stats_data['uptime']}`\n\n"
|
f"**Uptime**: `{stats_data['uptime']}`\n\n"
|
||||||
f"**{HEXAHOST_GLOBAL} Server Stats**\n"
|
f"**{AXIOM_GLOBAL} Server Stats**\n"
|
||||||
f"Guilds: **{stats_data['guilds']}**\n"
|
f"Guilds: **{stats_data['guilds']}**\n"
|
||||||
f"Users: **{stats_data['users']}**\n\n"
|
f"Users: **{stats_data['users']}**\n\n"
|
||||||
f"**{HEXAHOST_COMMAND} Commands Stats**\n"
|
f"**{AXIOM_COMMAND} Commands Stats**\n"
|
||||||
f"Total Commands: **{stats_data['all_cmds']}**\n"
|
f"Total Commands: **{stats_data['all_cmds']}**\n"
|
||||||
f"Slash Commands: **{stats_data['slash_cmds']}**"
|
f"Slash Commands: **{stats_data['slash_cmds']}**"
|
||||||
),
|
),
|
||||||
"Team Info": (
|
"Team Info": (
|
||||||
"There is only one person who made me. Thanks to him ❤️.\n\n"
|
"There is only one person who made me. Thanks to him ❤️.\n\n"
|
||||||
f"**{HEXAHOST_OWNER} Main Owner**\n"
|
f"**{AXIOM_OWNER} Main Owner**\n"
|
||||||
"[01]. [runxking](https://discord.com/users/767979794411028491)\n"
|
"[01]. [runxking](https://discord.com/users/767979794411028491)\n"
|
||||||
"[02]. [Ray](https://discord.com/users/870179991462236170)"
|
"[02]. [Ray](https://discord.com/users/870179991462236170)"
|
||||||
),
|
),
|
||||||
"Code Info": (
|
"Code Info": (
|
||||||
f"**{HEXAHOST_SEARCH} Codebase Overview**\n\n"
|
f"**{AXIOM_SEARCH} Codebase Overview**\n\n"
|
||||||
f"Files: **{stats_data['files']}**\n"
|
f"Files: **{stats_data['files']}**\n"
|
||||||
f"Lines: **{stats_data['lines']}**\n"
|
f"Lines: **{stats_data['lines']}**\n"
|
||||||
f"Words: **{stats_data['words']}**"
|
f"Words: **{stats_data['words']}**"
|
||||||
@@ -110,7 +110,7 @@ class StatsView(LayoutView):
|
|||||||
),
|
),
|
||||||
discord.SelectOption(
|
discord.SelectOption(
|
||||||
label="General Info",
|
label="General Info",
|
||||||
emoji=HEXAHOST_GLOBAL,
|
emoji=AXIOM_GLOBAL,
|
||||||
description="General info",
|
description="General info",
|
||||||
),
|
),
|
||||||
discord.SelectOption(
|
discord.SelectOption(
|
||||||
@@ -120,7 +120,7 @@ class StatsView(LayoutView):
|
|||||||
),
|
),
|
||||||
discord.SelectOption(
|
discord.SelectOption(
|
||||||
label="Code Info",
|
label="Code Info",
|
||||||
emoji=HEXAHOST_SEARCH,
|
emoji=AXIOM_SEARCH,
|
||||||
description="Code stats",
|
description="Code stats",
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -16,11 +16,11 @@ import json
|
|||||||
import aiosqlite
|
import aiosqlite
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
from utils.config import serverLink
|
from utils.config import serverLink
|
||||||
from core import HexaHost, Cog, Context
|
from core import Axiom, Cog, Context
|
||||||
from utils.Tools import get_ignore_data
|
from utils.Tools import get_ignore_data
|
||||||
|
|
||||||
class Errors(Cog):
|
class Errors(Cog):
|
||||||
def __init__(self, client: HexaHost):
|
def __init__(self, client: Axiom):
|
||||||
self.client = client
|
self.client = client
|
||||||
|
|
||||||
@commands.Cog.listener()
|
@commands.Cog.listener()
|
||||||
|
|||||||
@@ -14,14 +14,14 @@
|
|||||||
import discord
|
import discord
|
||||||
from utils.emoji import ARROWRED, ZMODULE
|
from utils.emoji import ARROWRED, ZMODULE
|
||||||
from discord.utils import *
|
from discord.utils import *
|
||||||
from core import HexaHost, Cog
|
from core import Axiom, Cog
|
||||||
from utils.Tools import *
|
from utils.Tools import *
|
||||||
from utils.config import BotName, serverLink
|
from utils.config import BotName, serverLink
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
from discord.ui import Button, View
|
from discord.ui import Button, View
|
||||||
|
|
||||||
class Autorole(Cog):
|
class Autorole(Cog):
|
||||||
def __init__(self, bot: HexaHost):
|
def __init__(self, bot: Axiom):
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -14,13 +14,13 @@ from utils.db_paths import db_path
|
|||||||
|
|
||||||
import discord
|
import discord
|
||||||
from utils.emoji import ZWARNING
|
from utils.emoji import ZWARNING
|
||||||
from core import HexaHost, Cog
|
from core import Axiom, Cog
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
import aiosqlite
|
import aiosqlite
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
class AutoBlacklist(Cog):
|
class AutoBlacklist(Cog):
|
||||||
def __init__(self, client: HexaHost):
|
def __init__(self, client: Axiom):
|
||||||
self.client = client
|
self.client = client
|
||||||
self.spam_cd_mapping = commands.CooldownMapping.from_cooldown(5, 5, commands.BucketType.member)
|
self.spam_cd_mapping = commands.CooldownMapping.from_cooldown(5, 5, commands.BucketType.member)
|
||||||
self.spam_command_mapping = commands.CooldownMapping.from_cooldown(6, 10, commands.BucketType.member)
|
self.spam_command_mapping = commands.CooldownMapping.from_cooldown(6, 10, commands.BucketType.member)
|
||||||
|
|||||||
@@ -18,14 +18,14 @@ import aiosqlite
|
|||||||
import asyncio
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
from core import HexaHost, Cog
|
from core import Axiom, Cog
|
||||||
from utils.config import *
|
from utils.config import *
|
||||||
|
|
||||||
DATABASE_PATH = db_path('autorole.db')
|
DATABASE_PATH = db_path('autorole.db')
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
class Autorole2(Cog):
|
class Autorole2(Cog):
|
||||||
def __init__(self, bot: HexaHost):
|
def __init__(self, bot: Axiom):
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
self.headers = {"Authorization": f"Bot {self.bot.http.token}"}
|
self.headers = {"Authorization": f"Bot {self.bot.http.token}"}
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ from utils.db_paths import db_path
|
|||||||
from utils import getConfig
|
from utils import getConfig
|
||||||
from utils.config import BotName
|
from utils.config import BotName
|
||||||
import discord
|
import discord
|
||||||
from utils.emoji import ARROWRED, CODEBASE, HEART3, INDEX, HEXAHOST_LINKS
|
from utils.emoji import ARROWRED, CODEBASE, HEART3, INDEX, AXIOM_LINKS
|
||||||
from discord.ui import LayoutView, TextDisplay, Separator, Container, ActionRow, Select
|
from discord.ui import LayoutView, TextDisplay, Separator, Container, ActionRow, Select
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
from utils.Tools import get_ignore_data
|
from utils.Tools import get_ignore_data
|
||||||
@@ -44,7 +44,7 @@ class MentionSelectView(LayoutView):
|
|||||||
),
|
),
|
||||||
discord.SelectOption(
|
discord.SelectOption(
|
||||||
label="Links",
|
label="Links",
|
||||||
emoji=HEXAHOST_LINKS,
|
emoji=AXIOM_LINKS,
|
||||||
description="Useful bot links",
|
description="Useful bot links",
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
# ╚══════════════════════════════════════════════════════════════════╝
|
# ╚══════════════════════════════════════════════════════════════════╝
|
||||||
|
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
from core import HexaHost, Cog
|
from core import Axiom, Cog
|
||||||
import discord
|
import discord
|
||||||
from utils.emoji import ARROWRED, KING, ZBOT, ZHUMAN, ZROCKET
|
from utils.emoji import ARROWRED, KING, ZBOT, ZHUMAN, ZROCKET
|
||||||
import logging
|
import logging
|
||||||
@@ -27,7 +27,7 @@ logging.basicConfig(
|
|||||||
|
|
||||||
|
|
||||||
class Guild(Cog):
|
class Guild(Cog):
|
||||||
def __init__(self, client: HexaHost):
|
def __init__(self, client: Axiom):
|
||||||
self.client = client
|
self.client = client
|
||||||
self.bot = client
|
self.bot = client
|
||||||
self.recently_removed_guilds = set()
|
self.recently_removed_guilds = set()
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import typing
|
|||||||
import typing as t
|
import typing as t
|
||||||
from typing import *
|
from typing import *
|
||||||
from utils.Tools import *
|
from utils.Tools import *
|
||||||
from core import Cog, HexaHost, Context
|
from core import Cog, Axiom, Context
|
||||||
from discord.ext.commands import Converter
|
from discord.ext.commands import Converter
|
||||||
from discord.ext import commands, tasks
|
from discord.ext import commands, tasks
|
||||||
from discord.ui import Button, View
|
from discord.ui import Button, View
|
||||||
|
|||||||
@@ -11,6 +11,6 @@
|
|||||||
# ║ ║
|
# ║ ║
|
||||||
# ╚══════════════════════════════════════════════════════════════════╝
|
# ╚══════════════════════════════════════════════════════════════════╝
|
||||||
|
|
||||||
from .hexahost import HexaHost
|
from .axiom import Axiom
|
||||||
from .Context import Context
|
from .Context import Context
|
||||||
from .Cog import Cog
|
from .Cog import Cog
|
||||||
@@ -34,7 +34,7 @@ extensions: List[str] = [
|
|||||||
"cogs"
|
"cogs"
|
||||||
]
|
]
|
||||||
|
|
||||||
class HexaHost(commands.AutoShardedBot):
|
class Axiom(commands.AutoShardedBot):
|
||||||
def __init__(self, *arg, **kwargs):
|
def __init__(self, *arg, **kwargs):
|
||||||
intents = discord.Intents.all()
|
intents = discord.Intents.all()
|
||||||
intents.presences = True
|
intents.presences = True
|
||||||
@@ -141,5 +141,5 @@ class HexaHost(commands.AutoShardedBot):
|
|||||||
|
|
||||||
def setup_bot():
|
def setup_bot():
|
||||||
intents = discord.Intents.all()
|
intents = discord.Intents.all()
|
||||||
bot = HexaHost(intents=intents)
|
bot = Axiom(intents=intents)
|
||||||
return bot
|
return bot
|
||||||
@@ -17,7 +17,7 @@ from dotenv import load_dotenv
|
|||||||
load_dotenv()
|
load_dotenv()
|
||||||
|
|
||||||
TOKEN = os.environ.get("TOKEN")
|
TOKEN = os.environ.get("TOKEN")
|
||||||
BRAND_NAME = os.environ.get("brand_name", "HexaHost")
|
BRAND_NAME = os.environ.get("brand_name", "Axiom")
|
||||||
NAME = BRAND_NAME
|
NAME = BRAND_NAME
|
||||||
BotName = BRAND_NAME
|
BotName = BRAND_NAME
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
# ╚══════════════════════════════════════════════════════════════════╝
|
# ╚══════════════════════════════════════════════════════════════════╝
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Centralized emoji module for the HexaHost bot.
|
Centralized emoji module for the Axiom bot.
|
||||||
All emoji definitions are stored here for easy management and consistency.
|
All emoji definitions are stored here for easy management and consistency.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@@ -126,15 +126,15 @@ ZTICK = "<:Ztick:1222750301233090600>"
|
|||||||
ZUNMUTE = "<:zunmute:1448951487970414694>"
|
ZUNMUTE = "<:zunmute:1448951487970414694>"
|
||||||
ZWARNING = "<:zwarning:1448949627712966717>"
|
ZWARNING = "<:zwarning:1448949627712966717>"
|
||||||
ZWRENCH = "<:zwrench:1448951382597177495>"
|
ZWRENCH = "<:zwrench:1448951382597177495>"
|
||||||
HEXAHOST_CONNECTION = "<:zyroxconnection:1448949425828528230>"
|
AXIOM_CONNECTION = "<:zyroxconnection:1448949425828528230>"
|
||||||
HEXAHOST_HAMMER = "<:zyroxhammer:1448949447617806458>"
|
AXIOM_HAMMER = "<:zyroxhammer:1448949447617806458>"
|
||||||
HEXAHOST_LINKS = "<:zyroxlinks:1448949436939239495>"
|
AXIOM_LINKS = "<:zyroxlinks:1448949436939239495>"
|
||||||
HEXAHOST_SYS = "<:zyroxsys:1448949469650620426>"
|
AXIOM_SYS = "<:zyroxsys:1448949469650620426>"
|
||||||
HEXAHOST_CODE = "<:zyrox_code:1448949381436014662>"
|
AXIOM_CODE = "<:zyrox_code:1448949381436014662>"
|
||||||
HEXAHOST_COMMAND = "<:zyrox_command:1448949381436014662>"
|
AXIOM_COMMAND = "<:zyrox_command:1448949381436014662>"
|
||||||
HEXAHOST_GLOBAL = "<:zyrox_global:1448949370539217026>"
|
AXIOM_GLOBAL = "<:zyrox_global:1448949370539217026>"
|
||||||
HEXAHOST_OWNER = "<:zyrox_owner:1448949381436014662>"
|
AXIOM_OWNER = "<:zyrox_owner:1448949381436014662>"
|
||||||
HEXAHOST_SEARCH = "<:zyrox_search:1448949381436014662>"
|
AXIOM_SEARCH = "<:zyrox_search:1448949381436014662>"
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# DISCORD CUSTOM EMOJIS (Animated)
|
# DISCORD CUSTOM EMOJIS (Animated)
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
# ╚══════════════════════════════════════════════════════════════════╝
|
# ╚══════════════════════════════════════════════════════════════════╝
|
||||||
|
|
||||||
"""
|
"""
|
||||||
HTTPS Tunnel for the HexaHost API — Cloudflare Tunnel via pycloudflared.
|
HTTPS Tunnel for the Axiom API — Cloudflare Tunnel via pycloudflared.
|
||||||
|
|
||||||
Zero manual installs. Just:
|
Zero manual installs. Just:
|
||||||
1. pip install pycloudflared (already in requirements.txt)
|
1. pip install pycloudflared (already in requirements.txt)
|
||||||
@@ -27,16 +27,16 @@ How to get your CF_TUNNEL_TOKEN (browser only, no CLI needed)
|
|||||||
1. Go to https://one.dash.cloudflare.com
|
1. Go to https://one.dash.cloudflare.com
|
||||||
2. Networks → Tunnels → Create a tunnel
|
2. Networks → Tunnels → Create a tunnel
|
||||||
3. Choose "Cloudflared" as connector type
|
3. Choose "Cloudflared" as connector type
|
||||||
4. Give it a name (e.g. hexahost-api) and click Save
|
4. Give it a name (e.g. axiom-api) and click Save
|
||||||
5. On the "Install connector" step, find the token in the command shown:
|
5. On the "Install connector" step, find the token in the command shown:
|
||||||
cloudflared tunnel run --token <YOUR_TOKEN_HERE>
|
cloudflared tunnel run --token <YOUR_TOKEN_HERE>
|
||||||
Copy just the token string.
|
Copy just the token string.
|
||||||
6. Go to "Published Application Routes" tab → Add a Published Application Routes:
|
6. Go to "Published Application Routes" tab → Add a Published Application Routes:
|
||||||
Subdomain: HexaHost-api Domain: yourdomain.com Service: http://localhost:8000
|
Subdomain: Axiom-api Domain: yourdomain.com Service: http://localhost:8000
|
||||||
(Or use any domain you have on Cloudflare)
|
(Or use any domain you have on Cloudflare)
|
||||||
7. Paste the token into your .env:
|
7. Paste the token into your .env:
|
||||||
CF_TUNNEL_TOKEN = "eyJhIjoiX..."
|
CF_TUNNEL_TOKEN = "eyJhIjoiX..."
|
||||||
CF_TUNNEL_URL = "https://hexahost-api.yourdomain.com"
|
CF_TUNNEL_URL = "https://axiom-api.yourdomain.com"
|
||||||
|
|
||||||
That's the permanent URL — never changes between restarts.
|
That's the permanent URL — never changes between restarts.
|
||||||
Unlimited bandwidth, unlimited requests, free.
|
Unlimited bandwidth, unlimited requests, free.
|
||||||
@@ -303,7 +303,7 @@ def _run_tunnel(binary: str, token: str, port: int, public_url: str) -> None:
|
|||||||
def start_tunnel() -> None:
|
def start_tunnel() -> None:
|
||||||
"""
|
"""
|
||||||
Start the Cloudflare Tunnel in a background daemon thread.
|
Start the Cloudflare Tunnel in a background daemon thread.
|
||||||
Called from HexaHost.py after keep_alive().
|
Called from Axiom.py after keep_alive().
|
||||||
"""
|
"""
|
||||||
if not TUNNEL_ENABLED:
|
if not TUNNEL_ENABLED:
|
||||||
print(f"{_YELLOW}◈ Tunnel: disabled via TUNNEL_ENABLED=false{_RESET}")
|
print(f"{_YELLOW}◈ Tunnel: disabled via TUNNEL_ENABLED=false{_RESET}")
|
||||||
|
|||||||
@@ -20,5 +20,5 @@ ADMIN_IDS=YOUR_DISCORD_USER_ID_HERE
|
|||||||
NEXT_PUBLIC_ADMIN_IDS=YOUR_DISCORD_USER_ID_HERE
|
NEXT_PUBLIC_ADMIN_IDS=YOUR_DISCORD_USER_ID_HERE
|
||||||
|
|
||||||
# Customizable Brand / Bot name shown across the dashboard
|
# Customizable Brand / Bot name shown across the dashboard
|
||||||
NEXT_PUBLIC_BRAND_NAME="HexaHost"
|
NEXT_PUBLIC_BRAND_NAME="Axiom"
|
||||||
NEXT_PUBLIC_BRAND_NAME_WORD="HH"
|
NEXT_PUBLIC_BRAND_NAME_WORD="AX"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# HexaHost Dashboard (Next.js)
|
# Axiom Dashboard (Next.js)
|
||||||
FROM node:20-alpine AS deps
|
FROM node:20-alpine AS deps
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY package.json package-lock.json* ./
|
COPY package.json package-lock.json* ./
|
||||||
@@ -10,8 +10,8 @@ COPY --from=deps /app/node_modules ./node_modules
|
|||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
# Build-time public env (overridden at runtime where possible)
|
# Build-time public env (overridden at runtime where possible)
|
||||||
ARG NEXT_PUBLIC_BRAND_NAME=HexaHost
|
ARG NEXT_PUBLIC_BRAND_NAME=Axiom
|
||||||
ARG NEXT_PUBLIC_BRAND_NAME_WORD=HH
|
ARG NEXT_PUBLIC_BRAND_NAME_WORD=AX
|
||||||
ARG NEXT_PUBLIC_ADMIN_IDS=
|
ARG NEXT_PUBLIC_ADMIN_IDS=
|
||||||
ARG NEXT_PUBLIC_API_URL=
|
ARG NEXT_PUBLIC_API_URL=
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
# HexaHost Dashboard
|
# Axiom Dashboard
|
||||||
|
|
||||||
Next.js web dashboard for configuring the HexaHost Discord bot.
|
Next.js web dashboard for configuring the Axiom Discord bot.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -23,7 +23,7 @@ Next.js web dashboard for configuring the HexaHost Discord bot.
|
|||||||
| Requirement | Notes |
|
| Requirement | Notes |
|
||||||
|---|---|
|
|---|---|
|
||||||
| Node.js 18+ | — |
|
| Node.js 18+ | — |
|
||||||
| HexaHost bot running | with `API_ENABLED=true` on `127.0.0.1` (or via Cloudflare Tunnel) |
|
| Axiom bot running | with `API_ENABLED=true` on `127.0.0.1` (or via Cloudflare Tunnel) |
|
||||||
| Discord OAuth app | from [Discord Developer Portal](https://discord.com/developers/applications) |
|
| Discord OAuth app | from [Discord Developer Portal](https://discord.com/developers/applications) |
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -56,7 +56,7 @@ DISCORD_CLIENT_SECRET = your_discord_oauth_client_secret
|
|||||||
# ── Admin & Branding ──────────────────────────────────────────────
|
# ── Admin & Branding ──────────────────────────────────────────────
|
||||||
ADMIN_IDS = your_discord_user_id
|
ADMIN_IDS = your_discord_user_id
|
||||||
NEXT_PUBLIC_ADMIN_IDS = your_discord_user_id
|
NEXT_PUBLIC_ADMIN_IDS = your_discord_user_id
|
||||||
NEXT_PUBLIC_BRAND_NAME = "HexaHost"
|
NEXT_PUBLIC_BRAND_NAME = "Axiom"
|
||||||
NEXT_PUBLIC_BRAND_NAME_WORD = "ZX"
|
NEXT_PUBLIC_BRAND_NAME_WORD = "ZX"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ export default function DashboardLayout({
|
|||||||
<div className="min-h-screen bg-[#0f172a] flex items-center justify-center">
|
<div className="min-h-screen bg-[#0f172a] flex items-center justify-center">
|
||||||
<div className="animate-pulse flex flex-col items-center gap-4">
|
<div className="animate-pulse flex flex-col items-center gap-4">
|
||||||
<div className="h-12 w-12 rounded-xl bg-primary flex items-center justify-center shadow-lg shadow-primary/20">
|
<div className="h-12 w-12 rounded-xl bg-primary flex items-center justify-center shadow-lg shadow-primary/20">
|
||||||
<span className="font-black text-white italic text-xl">{process.env.NEXT_PUBLIC_BRAND_NAME_WORD || "ZX"}</span>
|
<span className="font-black text-white italic text-xl">{process.env.NEXT_PUBLIC_BRAND_NAME_WORD || "AX"}</span>
|
||||||
</div>
|
</div>
|
||||||
<p className="text-slate-400 font-bold tracking-widest uppercase text-xs">
|
<p className="text-slate-400 font-bold tracking-widest uppercase text-xs">
|
||||||
Authenticating...
|
Authenticating...
|
||||||
@@ -189,7 +189,7 @@ export default function DashboardLayout({
|
|||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col">
|
<div className="flex flex-col">
|
||||||
<h1 className="text-lg font-bold tracking-tight text-white font-outfit leading-none">
|
<h1 className="text-lg font-bold tracking-tight text-white font-outfit leading-none">
|
||||||
{process.env.NEXT_PUBLIC_BRAND_NAME || "HexaHost"}
|
{process.env.NEXT_PUBLIC_BRAND_NAME || "Axiom"}
|
||||||
</h1>
|
</h1>
|
||||||
<span className="text-[9px] font-black uppercase tracking-[0.2em] text-red-500/80 mt-1">
|
<span className="text-[9px] font-black uppercase tracking-[0.2em] text-red-500/80 mt-1">
|
||||||
Dashboard
|
Dashboard
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ export default async function DashboardPage() {
|
|||||||
error = err.message || "Failed to connect to the bot API.";
|
error = err.message || "Failed to connect to the bot API.";
|
||||||
// Fallback data for UI structure if API fails
|
// Fallback data for UI structure if API fails
|
||||||
botInfo = {
|
botInfo = {
|
||||||
name: "HexaHost Bot",
|
name: "Axiom Bot",
|
||||||
guilds: 0,
|
guilds: 0,
|
||||||
users: 0,
|
users: 0,
|
||||||
commands: 0,
|
commands: 0,
|
||||||
@@ -110,7 +110,7 @@ export default async function DashboardPage() {
|
|||||||
{ title: "Manage Servers", desc: "View and configure your Discord guilds.", icon: ServerIcon, href: "/dashboard/guilds" },
|
{ title: "Manage Servers", desc: "View and configure your Discord guilds.", icon: ServerIcon, href: "/dashboard/guilds" },
|
||||||
{ title: "Global Settings", desc: "Adjust your personal dashboard preferences.", icon: Settings, href: "/dashboard" },
|
{ title: "Global Settings", desc: "Adjust your personal dashboard preferences.", icon: Settings, href: "/dashboard" },
|
||||||
{ title: "Support Matrix", desc: "Get help from our neural support team.", icon: LifeBuoy, href: "#" },
|
{ title: "Support Matrix", desc: "Get help from our neural support team.", icon: LifeBuoy, href: "#" },
|
||||||
{ title: "Documentation", desc: "Learn how to master the HexaHost engine.", icon: FileText, href: "#" },
|
{ title: "Documentation", desc: "Learn how to master the Axiom engine.", icon: FileText, href: "#" },
|
||||||
].map((item) => (
|
].map((item) => (
|
||||||
<a key={item.title} href={item.href} className="flex items-center gap-5 p-4 rounded-2xl bg-white/[0.02] border border-white/[0.03] group/item hover:bg-white/[0.05] hover:border-red-500/20 transition-all">
|
<a key={item.title} href={item.href} className="flex items-center gap-5 p-4 rounded-2xl bg-white/[0.02] border border-white/[0.03] group/item hover:bg-white/[0.05] hover:border-red-500/20 transition-all">
|
||||||
<div className="h-12 w-12 rounded-2xl bg-red-500/5 border border-red-500/10 flex items-center justify-center group-hover/item:bg-red-500/10 transition-colors">
|
<div className="h-12 w-12 rounded-2xl bg-red-500/5 border border-red-500/10 flex items-center justify-center group-hover/item:bg-red-500/10 transition-colors">
|
||||||
@@ -130,7 +130,7 @@ export default async function DashboardPage() {
|
|||||||
|
|
||||||
<div className="relative z-10">
|
<div className="relative z-10">
|
||||||
<h2 className="text-2xl font-bold text-white mb-3 font-outfit">Module Status</h2>
|
<h2 className="text-2xl font-bold text-white mb-3 font-outfit">Module Status</h2>
|
||||||
<p className="text-slate-500 text-sm mb-10 font-medium">Global operational health of HexaHost core.</p>
|
<p className="text-slate-500 text-sm mb-10 font-medium">Global operational health of Axiom core.</p>
|
||||||
|
|
||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
{[
|
{[
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ export default function DocsPage() {
|
|||||||
<div className="h-8 w-8 rounded-lg bg-red-600 flex items-center justify-center mr-3">
|
<div className="h-8 w-8 rounded-lg bg-red-600 flex items-center justify-center mr-3">
|
||||||
<Bot className="h-5 w-5 text-white" />
|
<Bot className="h-5 w-5 text-white" />
|
||||||
</div>
|
</div>
|
||||||
<span className="text-xl font-bold text-white font-outfit uppercase tracking-tighter hidden md:block">HexaHost Docs</span>
|
<span className="text-xl font-bold text-white font-outfit uppercase tracking-tighter hidden md:block">Axiom Docs</span>
|
||||||
</Link>
|
</Link>
|
||||||
|
|
||||||
<div className="hidden lg:flex items-center w-80 relative group">
|
<div className="hidden lg:flex items-center w-80 relative group">
|
||||||
@@ -154,7 +154,7 @@ export default function DocsPage() {
|
|||||||
|
|
||||||
<div className="prose prose-invert max-w-none">
|
<div className="prose prose-invert max-w-none">
|
||||||
<p className="text-lg text-slate-400 mb-12 leading-relaxed">
|
<p className="text-lg text-slate-400 mb-12 leading-relaxed">
|
||||||
Welcome to the {activeTab} section of the HexaHost Engine documentation. Our engine is designed for communities that demand absolute performance and cinematic management tools.
|
Welcome to the {activeTab} section of the Axiom Engine documentation. Our engine is designed for communities that demand absolute performance and cinematic management tools.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||||
@@ -177,7 +177,7 @@ export default function DocsPage() {
|
|||||||
<h2 className="text-2xl font-bold text-white font-outfit uppercase tracking-tight mb-4">Neural Architecture</h2>
|
<h2 className="text-2xl font-bold text-white font-outfit uppercase tracking-tight mb-4">Neural Architecture</h2>
|
||||||
<h3 className="text-white font-bold">Protocol Overview</h3>
|
<h3 className="text-white font-bold">Protocol Overview</h3>
|
||||||
<p className="text-slate-500 font-bold leading-relaxed mb-8">
|
<p className="text-slate-500 font-bold leading-relaxed mb-8">
|
||||||
The HexaHost Engine utilizes a decentralized event stream processing model. When a Discord event is received, it is instantly routed to the nearest edge cluster.
|
The Axiom Engine utilizes a decentralized event stream processing model. When a Discord event is received, it is instantly routed to the nearest edge cluster.
|
||||||
</p>
|
</p>
|
||||||
<div className="bg-black/40 p-6 rounded-2xl border border-white/5 font-mono text-sm text-red-500 mb-8">
|
<div className="bg-black/40 p-6 rounded-2xl border border-white/5 font-mono text-sm text-red-500 mb-8">
|
||||||
$ hexahost initialize --cluster-shard [neural_07] --mode enterprise
|
$ hexahost initialize --cluster-shard [neural_07] --mode enterprise
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ import { AuthProvider } from "@/components/auth-provider";
|
|||||||
const inter = Inter({ subsets: ["latin"], variable: "--font-inter" });
|
const inter = Inter({ subsets: ["latin"], variable: "--font-inter" });
|
||||||
const outfit = Outfit({ subsets: ["latin"], variable: "--font-outfit" });
|
const outfit = Outfit({ subsets: ["latin"], variable: "--font-outfit" });
|
||||||
|
|
||||||
const brandName = process.env.NEXT_PUBLIC_BRAND_NAME || "HexaHost";
|
const brandName = process.env.NEXT_PUBLIC_BRAND_NAME || "Axiom";
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: `${brandName} - Ultimate Discord Bot`,
|
title: `${brandName} - Ultimate Discord Bot`,
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ export default function LandingPage() {
|
|||||||
<Bot className="h-6 w-6 text-white" />
|
<Bot className="h-6 w-6 text-white" />
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col">
|
<div className="flex flex-col">
|
||||||
<h1 className="text-lg font-bold tracking-tight text-white font-outfit leading-none">{process.env.NEXT_PUBLIC_BRAND_NAME || "HexaHost"}</h1>
|
<h1 className="text-lg font-bold tracking-tight text-white font-outfit leading-none">{process.env.NEXT_PUBLIC_BRAND_NAME || "Axiom"}</h1>
|
||||||
<span className="text-[9px] font-black uppercase tracking-[0.2em] text-red-500/80 mt-1">Dashboard</span>
|
<span className="text-[9px] font-black uppercase tracking-[0.2em] text-red-500/80 mt-1">Dashboard</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -254,7 +254,7 @@ export default function LandingPage() {
|
|||||||
</p>
|
</p>
|
||||||
<div className="grid grid-cols-1 sm:grid-cols-2 gap-8 pt-8">
|
<div className="grid grid-cols-1 sm:grid-cols-2 gap-8 pt-8">
|
||||||
{[
|
{[
|
||||||
{ icon: Terminal, title: "Custom DSL", desc: "Write advanced logic with our intuitive HexaHost scripting language." },
|
{ icon: Terminal, title: "Custom DSL", desc: "Write advanced logic with our intuitive Axiom scripting language." },
|
||||||
{ icon: Cpu, title: "FPGA Ready", desc: "Hardware-accelerated pattern matching for instant response." },
|
{ icon: Cpu, title: "FPGA Ready", desc: "Hardware-accelerated pattern matching for instant response." },
|
||||||
{ icon: Lock, title: "Zero Trust", desc: "Every command execution is sandboxed and cryptographically verified." },
|
{ icon: Lock, title: "Zero Trust", desc: "Every command execution is sandboxed and cryptographically verified." },
|
||||||
{ icon: Radio, title: "Low Entropy", desc: "Optimized for minimal CPU jitter and maximum reliability." }
|
{ icon: Radio, title: "Low Entropy", desc: "Optimized for minimal CPU jitter and maximum reliability." }
|
||||||
@@ -365,7 +365,7 @@ export default function LandingPage() {
|
|||||||
</div>
|
</div>
|
||||||
<div className="space-y-6">
|
<div className="space-y-6">
|
||||||
{[
|
{[
|
||||||
{ q: "Is the HexaHost Engine free to use?", a: "The core engine is 100% free for all communities. We offer premium clusters for ultra-high-scale enterprise servers." },
|
{ q: "Is the Axiom Engine free to use?", a: "The core engine is 100% free for all communities. We offer premium clusters for ultra-high-scale enterprise servers." },
|
||||||
{ q: "How secure is my server data?", a: "Every byte of configuration data is AES-256 encrypted at rest. We never store personal user data beyond Discord's standard requirements." },
|
{ q: "How secure is my server data?", a: "Every byte of configuration data is AES-256 encrypted at rest. We never store personal user data beyond Discord's standard requirements." },
|
||||||
{ q: "Can I migrate from other bots?", a: "Yes, our Migration Matrix tool allows you to import leveling and configuration data from most popular bots in minutes." },
|
{ q: "Can I migrate from other bots?", a: "Yes, our Migration Matrix tool allows you to import leveling and configuration data from most popular bots in minutes." },
|
||||||
{ q: "What is the 'Neural Core'?", a: "It's our advanced event-processing architecture that uses predictive analysis to moderate raids before they escalate." }
|
{ q: "What is the 'Neural Core'?", a: "It's our advanced event-processing architecture that uses predictive analysis to moderate raids before they escalate." }
|
||||||
@@ -388,7 +388,7 @@ export default function LandingPage() {
|
|||||||
<div className="absolute inset-0 bg-[url('https://grainy-gradients.vercel.app/noise.svg')] opacity-20 mix-blend-overlay" />
|
<div className="absolute inset-0 bg-[url('https://grainy-gradients.vercel.app/noise.svg')] opacity-20 mix-blend-overlay" />
|
||||||
<div className="relative z-10">
|
<div className="relative z-10">
|
||||||
<h2 className="text-7xl md:text-[9rem] font-bold text-white tracking-tighter font-outfit mb-12 uppercase leading-[0.8] italic">Ready to <br />Evolve?</h2>
|
<h2 className="text-7xl md:text-[9rem] font-bold text-white tracking-tighter font-outfit mb-12 uppercase leading-[0.8] italic">Ready to <br />Evolve?</h2>
|
||||||
<p className="text-2xl text-white/70 max-w-3xl mx-auto mb-20 font-medium">Join 5,000+ communities scaling their automation with the HexaHost Engine. Setup takes less than 30 seconds.</p>
|
<p className="text-2xl text-white/70 max-w-3xl mx-auto mb-20 font-medium">Join 5,000+ communities scaling their automation with the Axiom Engine. Setup takes less than 30 seconds.</p>
|
||||||
<div className="flex flex-col sm:flex-row items-center justify-center gap-8 tracking-widest uppercase text-xs font-black">
|
<div className="flex flex-col sm:flex-row items-center justify-center gap-8 tracking-widest uppercase text-xs font-black">
|
||||||
<Button
|
<Button
|
||||||
onClick={() => signIn('discord', { callbackUrl: '/dashboard' })}
|
onClick={() => signIn('discord', { callbackUrl: '/dashboard' })}
|
||||||
@@ -411,7 +411,7 @@ export default function LandingPage() {
|
|||||||
<div className="grid grid-cols-1 md:grid-cols-4 gap-20 mb-32">
|
<div className="grid grid-cols-1 md:grid-cols-4 gap-20 mb-32">
|
||||||
<div className="col-span-1 md:col-span-2 space-y-12">
|
<div className="col-span-1 md:col-span-2 space-y-12">
|
||||||
<div className="flex items-center gap-4 group">
|
<div className="flex items-center gap-4 group">
|
||||||
<span className="text-3xl font-bold text-white font-outfit uppercase tracking-tighter">{process.env.NEXT_PUBLIC_BRAND_NAME || "HexaHost"} Engine</span>
|
<span className="text-3xl font-bold text-white font-outfit uppercase tracking-tighter">{process.env.NEXT_PUBLIC_BRAND_NAME || "Axiom"} Engine</span>
|
||||||
</div>
|
</div>
|
||||||
<p className="text-slate-600 max-w-sm font-bold leading-relaxed uppercase text-xs tracking-widest">
|
<p className="text-slate-600 max-w-sm font-bold leading-relaxed uppercase text-xs tracking-widest">
|
||||||
The high-performance Discord engine for communities that demand excellence. Open-source, secure, and infinitely scalable.
|
The high-performance Discord engine for communities that demand excellence. Open-source, secure, and infinitely scalable.
|
||||||
@@ -436,7 +436,7 @@ export default function LandingPage() {
|
|||||||
</div>
|
</div>
|
||||||
<div className="pt-12 border-t border-white/5 flex flex-col md:flex-row items-center justify-between gap-6 opacity-40">
|
<div className="pt-12 border-t border-white/5 flex flex-col md:flex-row items-center justify-between gap-6 opacity-40">
|
||||||
<p className="text-slate-700 text-[10px] font-black uppercase tracking-[0.4em]">
|
<p className="text-slate-700 text-[10px] font-black uppercase tracking-[0.4em]">
|
||||||
© 2026 {process.env.NEXT_PUBLIC_BRAND_NAME || "HexaHost"} Development // Advanced Neural Infrastructure.
|
© 2026 HexaHost // Axiom // Advanced Neural Infrastructure.
|
||||||
</p>
|
</p>
|
||||||
<div className="flex items-center gap-8">
|
<div className="flex items-center gap-8">
|
||||||
<div className="flex items-center gap-3 text-[10px] font-black text-red-500 uppercase tracking-[0.3em]">
|
<div className="flex items-center gap-3 text-[10px] font-black text-red-500 uppercase tracking-[0.3em]">
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ export default function PrivacyPage() {
|
|||||||
<div className="h-9 w-9 rounded-xl bg-red-600 flex items-center justify-center mr-4">
|
<div className="h-9 w-9 rounded-xl bg-red-600 flex items-center justify-center mr-4">
|
||||||
<Bot className="h-5 w-5 text-white" />
|
<Bot className="h-5 w-5 text-white" />
|
||||||
</div>
|
</div>
|
||||||
<span className="text-xl font-bold text-white font-outfit uppercase tracking-tighter">HexaHost Engine</span>
|
<span className="text-xl font-bold text-white font-outfit uppercase tracking-tighter">Axiom Engine</span>
|
||||||
</Link>
|
</Link>
|
||||||
<Link href="/">
|
<Link href="/">
|
||||||
<Button variant="ghost" className="text-slate-400 hover:text-white gap-2">
|
<Button variant="ghost" className="text-slate-400 hover:text-white gap-2">
|
||||||
@@ -62,7 +62,7 @@ export default function PrivacyPage() {
|
|||||||
<h2 className="text-2xl font-bold font-outfit uppercase tracking-tight">Data Collection</h2>
|
<h2 className="text-2xl font-bold font-outfit uppercase tracking-tight">Data Collection</h2>
|
||||||
</div>
|
</div>
|
||||||
<p className="text-slate-400 leading-relaxed font-medium">
|
<p className="text-slate-400 leading-relaxed font-medium">
|
||||||
The HexaHost Engine collects only the minimum necessary data to function within Discord. This includes your Discord User ID, Server (Guild) ID, and configuration settings provided during setup. We do not store message content unless explicitly configured for logging purposes by server administrators.
|
The Axiom Engine collects only the minimum necessary data to function within Discord. This includes your Discord User ID, Server (Guild) ID, and configuration settings provided during setup. We do not store message content unless explicitly configured for logging purposes by server administrators.
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ export default function TermsPage() {
|
|||||||
<div className="h-10 w-10 rounded-xl bg-red-600 flex items-center justify-center group-hover:rotate-12 transition-transform">
|
<div className="h-10 w-10 rounded-xl bg-red-600 flex items-center justify-center group-hover:rotate-12 transition-transform">
|
||||||
<Bot className="h-5 w-5 text-white" />
|
<Bot className="h-5 w-5 text-white" />
|
||||||
</div>
|
</div>
|
||||||
<span className="text-xl font-bold text-white font-outfit uppercase tracking-tighter">{process.env.NEXT_PUBLIC_BRAND_NAME || "HexaHost"} Engine</span>
|
<span className="text-xl font-bold text-white font-outfit uppercase tracking-tighter">{process.env.NEXT_PUBLIC_BRAND_NAME || "Axiom"} Engine</span>
|
||||||
</Link>
|
</Link>
|
||||||
<Link href="/">
|
<Link href="/">
|
||||||
<Button variant="ghost" className="text-slate-400 hover:text-white gap-2">
|
<Button variant="ghost" className="text-slate-400 hover:text-white gap-2">
|
||||||
@@ -62,7 +62,7 @@ export default function TermsPage() {
|
|||||||
<h2 className="text-2xl font-bold font-outfit uppercase tracking-tight">Acceptance of Protocol</h2>
|
<h2 className="text-2xl font-bold font-outfit uppercase tracking-tight">Acceptance of Protocol</h2>
|
||||||
</div>
|
</div>
|
||||||
<p className="text-slate-400 leading-relaxed font-medium">
|
<p className="text-slate-400 leading-relaxed font-medium">
|
||||||
By integrating the {process.env.NEXT_PUBLIC_BRAND_NAME || "HexaHost"} Engine into your Discord server, you agree to abide by these terms. The engine is provided "as is," and while we strive for 100% uptime through our neural edge clusters, we are not liable for any data loss resulting from third-party API disruptions.
|
By integrating the {process.env.NEXT_PUBLIC_BRAND_NAME || "Axiom"} Engine into your Discord server, you agree to abide by these terms. The engine is provided "as is," and while we strive for 100% uptime through our neural edge clusters, we are not liable for any data loss resulting from third-party API disruptions.
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ export default function TermsPage() {
|
|||||||
<h2 className="text-2xl font-bold font-outfit uppercase tracking-tight">Usage Constraints</h2>
|
<h2 className="text-2xl font-bold font-outfit uppercase tracking-tight">Usage Constraints</h2>
|
||||||
</div>
|
</div>
|
||||||
<p className="text-slate-400 leading-relaxed font-medium">
|
<p className="text-slate-400 leading-relaxed font-medium">
|
||||||
You may not use the {process.env.NEXT_PUBLIC_BRAND_NAME || "HexaHost"} Engine for any illicit activities, including but not limited to: automated harassment, token logging, or raid coordination. Violation of these constraints will result in immediate neural deauthorization and blacklisting from the global cluster network.
|
You may not use the {process.env.NEXT_PUBLIC_BRAND_NAME || "Axiom"} Engine for any illicit activities, including but not limited to: automated harassment, token logging, or raid coordination. Violation of these constraints will result in immediate neural deauthorization and blacklisting from the global cluster network.
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
@@ -92,7 +92,7 @@ export default function TermsPage() {
|
|||||||
|
|
||||||
<div className="pt-12 border-t border-white/5">
|
<div className="pt-12 border-t border-white/5">
|
||||||
<p className="text-[10px] font-black uppercase text-slate-600 tracking-[0.4em]">
|
<p className="text-[10px] font-black uppercase text-slate-600 tracking-[0.4em]">
|
||||||
March 2026 // Distributed via {process.env.NEXT_PUBLIC_BRAND_NAME || "HexaHost"} Neural Cloud
|
March 2026 // Distributed via {process.env.NEXT_PUBLIC_BRAND_NAME || "Axiom"} Neural Cloud
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ export function AdminContent() {
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h1 className="text-4xl font-black text-white tracking-tight font-outfit">Admin Control Panel</h1>
|
<h1 className="text-4xl font-black text-white tracking-tight font-outfit">Admin Control Panel</h1>
|
||||||
<p className="text-slate-400 mt-2 font-medium">Restricted access for HexaHost administrators only.</p>
|
<p className="text-slate-400 mt-2 font-medium">Restricted access for Axiom administrators only.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
|
|||||||
@@ -222,7 +222,7 @@ export function AntiNukeForm({ initialConfig, guildId }: AntiNukeFormProps) {
|
|||||||
<ShieldAlert className="h-32 w-32 text-red-500" />
|
<ShieldAlert className="h-32 w-32 text-red-500" />
|
||||||
</div>
|
</div>
|
||||||
<h3 className="text-sm font-bold text-red-400 mb-2">Maximum Protection</h3>
|
<h3 className="text-sm font-bold text-red-400 mb-2">Maximum Protection</h3>
|
||||||
<p className="text-xs text-slate-400 leading-relaxed mb-4">Anti-Nuke is fixed to instantly Ban malicious actors. Ensure that HexaHost's role is at the TOP of the role hierarchy for it to be able to ban admins.</p>
|
<p className="text-xs text-slate-400 leading-relaxed mb-4">Anti-Nuke is fixed to instantly Ban malicious actors. Ensure that Axiom's role is at the TOP of the role hierarchy for it to be able to ban admins.</p>
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<div className="h-2 w-2 rounded-full bg-red-500 animate-pulse" />
|
<div className="h-2 w-2 rounded-full bg-red-500 animate-pulse" />
|
||||||
<span className="text-[10px] font-black uppercase text-red-500">Fixed Punishments</span>
|
<span className="text-[10px] font-black uppercase text-red-500">Fixed Punishments</span>
|
||||||
|
|||||||
@@ -195,7 +195,7 @@ export function AutoRoleForm({ initialConfig, roles, guildId }: AutoRoleFormProp
|
|||||||
<div className="flex gap-3">
|
<div className="flex gap-3">
|
||||||
<div className="h-1.5 w-1.5 rounded-full bg-primary mt-1.5 shrink-0" />
|
<div className="h-1.5 w-1.5 rounded-full bg-primary mt-1.5 shrink-0" />
|
||||||
<p className="text-[11px] text-slate-400 leading-relaxed">
|
<p className="text-[11px] text-slate-400 leading-relaxed">
|
||||||
<span className="text-slate-200 font-bold">Hierarchy Matter:</span> Ensure HexaHost's top role is <span className="text-primary italic">higher</span> than any role you select here.
|
<span className="text-slate-200 font-bold">Hierarchy Matter:</span> Ensure Axiom's top role is <span className="text-primary italic">higher</span> than any role you select here.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex gap-3">
|
<div className="flex gap-3">
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ export function CustomRolesForm({ initialConfig, roles, guildId }: CustomRolesFo
|
|||||||
<li>• <code>.staff @user</code> - Assigns/Removes Staff role</li>
|
<li>• <code>.staff @user</code> - Assigns/Removes Staff role</li>
|
||||||
<li>• <code>.girl @user</code> - Assigns/Removes Girl role</li>
|
<li>• <code>.girl @user</code> - Assigns/Removes Girl role</li>
|
||||||
<li>• <code>.vip @user</code> - Assigns/Removes VIP role</li>
|
<li>• <code>.vip @user</code> - Assigns/Removes VIP role</li>
|
||||||
<li>• Ensure HexaHost is placed higher than these roles in server settings!</li>
|
<li>• Ensure Axiom is placed higher than these roles in server settings!</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -200,7 +200,7 @@ export function VerificationForm({ initialConfig, channels, roles, guildId }: Ve
|
|||||||
</div>
|
</div>
|
||||||
<h3 className="text-sm font-bold text-primary mb-2">How It Works</h3>
|
<h3 className="text-sm font-bold text-primary mb-2">How It Works</h3>
|
||||||
<p className="text-xs text-slate-400 leading-relaxed mb-4">
|
<p className="text-xs text-slate-400 leading-relaxed mb-4">
|
||||||
HexaHost Verification ensures that no unauthorized bots or malicious users enter your server unverified.
|
Axiom Verification ensures that no unauthorized bots or malicious users enter your server unverified.
|
||||||
</p>
|
</p>
|
||||||
<ul className="text-xs text-slate-500 space-y-2">
|
<ul className="text-xs text-slate-500 space-y-2">
|
||||||
<li>• The bot will create a panel in your Verification Channel.</li>
|
<li>• The bot will create a panel in your Verification Channel.</li>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "hexahost-dashboard",
|
"name": "axiom-dashboard",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# HexaHost — Bot + Dashboard behind Traefik
|
# Axiom — Bot + Dashboard (HexaHost) behind Traefik
|
||||||
#
|
#
|
||||||
# Prerequisites:
|
# Prerequisites:
|
||||||
# - External Docker network: traefik-network
|
# - External Docker network: traefik-network
|
||||||
@@ -8,14 +8,14 @@
|
|||||||
# Start:
|
# Start:
|
||||||
# docker compose up -d --build
|
# docker compose up -d --build
|
||||||
|
|
||||||
name: hexahost
|
name: axiom
|
||||||
|
|
||||||
services:
|
services:
|
||||||
bot:
|
bot:
|
||||||
build:
|
build:
|
||||||
context: ./bot
|
context: ./bot
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
container_name: hexahost-bot
|
container_name: axiom-bot
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
@@ -31,7 +31,7 @@ services:
|
|||||||
- bot-logs:/app/logs
|
- bot-logs:/app/logs
|
||||||
networks:
|
networks:
|
||||||
- traefik-network
|
- traefik-network
|
||||||
- hexahost-internal
|
- axiom-internal
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test:
|
test:
|
||||||
[
|
[
|
||||||
@@ -50,10 +50,10 @@ services:
|
|||||||
context: ./dashboard
|
context: ./dashboard
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
args:
|
args:
|
||||||
NEXT_PUBLIC_BRAND_NAME: ${NEXT_PUBLIC_BRAND_NAME:-HexaHost}
|
NEXT_PUBLIC_BRAND_NAME: ${NEXT_PUBLIC_BRAND_NAME:-Axiom}
|
||||||
NEXT_PUBLIC_BRAND_NAME_WORD: ${NEXT_PUBLIC_BRAND_NAME_WORD:-HH}
|
NEXT_PUBLIC_BRAND_NAME_WORD: ${NEXT_PUBLIC_BRAND_NAME_WORD:-AX}
|
||||||
NEXT_PUBLIC_ADMIN_IDS: ${NEXT_PUBLIC_ADMIN_IDS:-}
|
NEXT_PUBLIC_ADMIN_IDS: ${NEXT_PUBLIC_ADMIN_IDS:-}
|
||||||
container_name: hexahost-dashboard
|
container_name: axiom-dashboard
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
depends_on:
|
depends_on:
|
||||||
bot:
|
bot:
|
||||||
@@ -64,33 +64,33 @@ services:
|
|||||||
# Server-side proxy → Bot API (Docker-intern, nicht öffentlich)
|
# Server-side proxy → Bot API (Docker-intern, nicht öffentlich)
|
||||||
DASHBOARD_API_URL: http://bot:8000/api/v1
|
DASHBOARD_API_URL: http://bot:8000/api/v1
|
||||||
NEXTAUTH_URL: https://bot.hexahost.de/
|
NEXTAUTH_URL: https://bot.hexahost.de/
|
||||||
NEXT_PUBLIC_BRAND_NAME: ${NEXT_PUBLIC_BRAND_NAME:-HexaHost}
|
NEXT_PUBLIC_BRAND_NAME: ${NEXT_PUBLIC_BRAND_NAME:-Axiom}
|
||||||
NEXT_PUBLIC_BRAND_NAME_WORD: ${NEXT_PUBLIC_BRAND_NAME_WORD:-HH}
|
NEXT_PUBLIC_BRAND_NAME_WORD: ${NEXT_PUBLIC_BRAND_NAME_WORD:-AX}
|
||||||
PORT: "3000"
|
PORT: "3000"
|
||||||
HOSTNAME: "0.0.0.0"
|
HOSTNAME: "0.0.0.0"
|
||||||
networks:
|
networks:
|
||||||
- traefik-network
|
- traefik-network
|
||||||
- hexahost-internal
|
- axiom-internal
|
||||||
labels:
|
labels:
|
||||||
- traefik.enable=true
|
- traefik.enable=true
|
||||||
- traefik.docker.network=traefik-network
|
- traefik.docker.network=traefik-network
|
||||||
# HTTP → HTTPS redirect (optional, falls Entrypoint "web" existiert)
|
# HTTP → HTTPS redirect (optional, falls Entrypoint "web" existiert)
|
||||||
- traefik.http.routers.hexahost-dashboard-http.rule=Host(`bot.hexahost.de`)
|
- traefik.http.routers.axiom-dashboard-http.rule=Host(`bot.hexahost.de`)
|
||||||
- traefik.http.routers.hexahost-dashboard-http.entrypoints=web
|
- traefik.http.routers.axiom-dashboard-http.entrypoints=web
|
||||||
- traefik.http.routers.hexahost-dashboard-http.middlewares=hexahost-https-redirect
|
- traefik.http.routers.axiom-dashboard-http.middlewares=axiom-https-redirect
|
||||||
- traefik.http.middlewares.hexahost-https-redirect.redirectscheme.scheme=https
|
- traefik.http.middlewares.axiom-https-redirect.redirectscheme.scheme=https
|
||||||
- traefik.http.middlewares.hexahost-https-redirect.redirectscheme.permanent=true
|
- traefik.http.middlewares.axiom-https-redirect.redirectscheme.permanent=true
|
||||||
# HTTPS
|
# HTTPS
|
||||||
- traefik.http.routers.hexahost-dashboard.rule=Host(`bot.hexahost.de`)
|
- traefik.http.routers.axiom-dashboard.rule=Host(`bot.hexahost.de`)
|
||||||
- traefik.http.routers.hexahost-dashboard.entrypoints=websecure
|
- traefik.http.routers.axiom-dashboard.entrypoints=websecure
|
||||||
- traefik.http.routers.hexahost-dashboard.tls=true
|
- traefik.http.routers.axiom-dashboard.tls=true
|
||||||
- traefik.http.routers.hexahost-dashboard.tls.certresolver=${TRAEFIK_CERT_RESOLVER:-letsencrypt}
|
- traefik.http.routers.axiom-dashboard.tls.certresolver=${TRAEFIK_CERT_RESOLVER:-letsencrypt}
|
||||||
- traefik.http.services.hexahost-dashboard.loadbalancer.server.port=3000
|
- traefik.http.services.axiom-dashboard.loadbalancer.server.port=3000
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
traefik-network:
|
traefik-network:
|
||||||
external: true
|
external: true
|
||||||
hexahost-internal:
|
axiom-internal:
|
||||||
driver: bridge
|
driver: bridge
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import re
|
|||||||
|
|
||||||
ROOT = pathlib.Path(__file__).resolve().parent.parent
|
ROOT = pathlib.Path(__file__).resolve().parent.parent
|
||||||
|
|
||||||
# Clear, readable banner — spells "HexaHost" literally
|
# Clear, readable banner — spells "Axiom" literally
|
||||||
ASCII_LINES = [
|
ASCII_LINES = [
|
||||||
"+-+-+-+-+-+-+-+-+",
|
"+-+-+-+-+-+-+-+-+",
|
||||||
"|H|e|x|a|H|o|s|t|",
|
"|H|e|x|a|H|o|s|t|",
|
||||||
|
|||||||
Reference in New Issue
Block a user