diff options
| author | Sho Sakuma <me@m1sk9.dev> | 2026-04-05 01:45:01 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-04-05 01:45:01 +0900 |
| commit | 579ca7f5bf01187e1f758cadfb4eda652fd5a4c3 (patch) | |
| tree | c008f240e02aa828ad47728e671232e687f4b911 | |
| parent | bd92ba60d39b4956a580cc56b83ecf55dd348aea (diff) | |
| parent | 9146547efae71efa1d67a48e20ae4271785847e9 (diff) | |
| download | LunaticChat-1.0.0.tar.gz LunaticChat-1.0.0.tar.bz2 LunaticChat-1.0.0.zip | |
Merge pull request #167 from m1sk9/docs/Update-v1-docsv1.0.0
docs: Update v1 Document
116 files changed, 3162 insertions, 4241 deletions
diff --git a/.gitattributes b/.gitattributes index e921901..2f2bc30 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,4 +2,3 @@ x linguist-vendored=true gradlew linguist-vendored=true .github/scripts/post-test-results.sh linguist-vendored=true -docs/.vitepress/theme/*.vue linguist-vendored=true diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index bdf605f..05f262b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -62,7 +62,7 @@ jobs: runs-on: ubuntu-24.04 defaults: run: - working-directory: "./docs" + working-directory: "./website" steps: - name: Checkout repository uses: actions/checkout@v6 diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 958855e..fb7809d 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -16,7 +16,7 @@ jobs: contents: read defaults: run: - working-directory: "./docs" + working-directory: "./website" steps: - name: Checkout repository uses: actions/checkout@v6 @@ -36,4 +36,4 @@ jobs: uses: cloudflare/wrangler-action@v3 with: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} - workingDirectory: docs + workingDirectory: website @@ -22,5 +22,5 @@ gradle-app.setting .classpath .idea/ -docs/.vitepress/cache/deps +website/.vitepress/cache/deps /docker/paper/plugins @@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Project Overview -LunaticChat is a Minecraft chat plugin supporting Paper, Folia, and Velocity servers. It provides direct messaging, channel chat, romaji-to-Japanese conversion, and cross-server global chat via Velocity proxy. +LunaticChat is a Minecraft chat plugin supporting Paper, Folia, and Velocity servers. It provides direct messaging, channel chat, and romaji-to-Japanese conversion. Velocity proxy support enables global chat relay across multiple servers. - **Language**: Kotlin (JVM 25) - **Build**: Gradle 9+ with Kotlin DSL @@ -48,7 +48,7 @@ LunaticChat is a Minecraft chat plugin supporting Paper, Folia, and Velocity ser ``` engine/ → Platform-agnostic core (models, converters, protocol, exceptions) platform-paper/ → Paper & Folia plugin (commands, listeners, config, services) -platform-velocity/ → Velocity proxy plugin (message relay between servers) +platform-velocity/ → Velocity proxy plugin (global chat relay between servers) dokka/ → API documentation aggregator (no Kotlin source) docs/ → VitePress documentation site ``` @@ -61,7 +61,7 @@ docs/ → VitePress documentation site **Feature Gating**: Features are toggled via `config.yml`. The `ServiceInitializer` conditionally creates services based on config, and the `ServiceContainer` holds them as nullable properties. -**Plugin Messaging Protocol**: Cross-server communication uses a custom `PluginMessageCodec` in the engine module. Paper servers encode/decode messages via this codec, and Velocity relays them between servers. +**Plugin Messaging Protocol**: Cross-server communication uses a custom `PluginMessageCodec` in the engine module. Paper servers encode/decode messages via this codec, and Velocity relays global chat between servers. DM and channel chat are local to each Paper server only. ### Key Packages (engine) @@ -34,7 +34,7 @@ Pre-built artifacts can be installed from the following locations. Place the dow - [GitHub](https://github.com/m1sk9/LunaticChat/releases) - [Modrinth](https://modrinth.com/project/lunaticchat) -See the [Documentation](https://lc.m1sk9.dev/player-guide/getting-started). +See the [Documentation](https://lc.m1sk9.dev/docs/getting-started). ## Features diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts deleted file mode 100644 index a9c733a..0000000 --- a/docs/.vitepress/config.mts +++ /dev/null @@ -1,39 +0,0 @@ -import { defineVersionedConfig } from '@viteplus/versions'; -import { en } from './config/en'; -import { ja } from './config/ja'; - -export default defineVersionedConfig({ - cleanUrls: true, - description: 'Next-generation channel chat plugin for Paper/Velocity', - head: [['link', { href: '/favicon.ico', rel: 'icon' }]], - locales: { - en: { - label: 'English', - lang: 'en-US', - link: '/en/', - themeConfig: en, - }, - root: { - label: '日本語', - lang: 'ja-JP', - themeConfig: ja, - }, - }, - outDir: './dist', - themeConfig: { - socialLinks: [ - { icon: 'github', link: 'https://github.com/m1sk9/LunaticChat' }, - ], - }, - title: 'LunaticChat Docs', - titleTemplate: 'LunaticChat', - versionsConfig: { - current: 'v0 (1.21.x) - Latest', - sources: 'src', - archive: 'archive', - versionSwitcher: false, - }, - vite: { - publicDir: '.vitepress/public', - }, -}); diff --git a/docs/.vitepress/config/en.ts b/docs/.vitepress/config/en.ts deleted file mode 100644 index e528413..0000000 --- a/docs/.vitepress/config/en.ts +++ /dev/null @@ -1,136 +0,0 @@ -import type { DefaultTheme } from 'vitepress'; - -export const en: DefaultTheme.Config = { - editLink: { - pattern: 'https://github.com/m1sk9/LunaticChat/edit/main/docs/src/:path', - text: 'Edit this page on GitHub', - }, - footer: { - copyright: 'Copyright © 2026 m1sk9', - }, - nav: [ - { link: '/en/player-guide/getting-started', text: 'Player Guide' }, - { link: '/en/admin-guide/getting-started', text: 'Admin Guide' }, - { component: 'VersionSwitcher' }, - ], - sidebar: { - '/en/admin-guide/': [ - { - link: '/en/admin-guide/getting-started', - text: 'Getting Started', - }, - { - link: '/en/admin-guide/configuration', - text: 'Configuration', - }, - { - link: '/en/admin-guide/permissions', - text: 'Permissions', - }, - { - items: [ - { - link: '/en/admin-guide/channel-chat/introduction', - text: 'Deployment Guide', - }, - { - link: '/en/admin-guide/channel-chat/logs', - text: 'Logs', - }, - ], - text: 'Channel Chat', - }, - { - link: '/en/admin-guide/velocity', - text: 'Velocity Integration', - }, - { - link: '/en/admin-guide/cache', - text: 'Cache System', - }, - { - link: '/en/admin-guide/management-data', - text: 'Data Management', - }, - ], - '/en/player-guide/': [ - { - link: '/en/player-guide/getting-started', - text: 'Getting Started', - }, - { - link: '/en/player-guide/about', - text: 'About LunaticChat', - }, - { - items: [ - { - link: '/en/player-guide/channel-chat/private-channel', - text: 'Private Channel', - }, - { - link: '/en/player-guide/channel-chat/moderation', - text: 'Moderation', - }, - ], - link: '/en/player-guide/channel-chat/about', - text: 'Channel Chat', - }, - { - link: '/en/player-guide/direct-message', - text: 'Direct Messages', - }, - { - link: '/en/player-guide/japanese-romanization', - text: 'Romanization Conversion', - }, - { - items: [ - { - link: '/en/player-guide/commands/tell', - text: '/tell', - }, - { - link: '/en/player-guide/commands/reply', - text: '/reply', - }, - { - link: '/en/player-guide/commands/jp', - text: '/jp', - }, - { - link: '/en/player-guide/commands/notice', - text: '/notice', - }, - { - items: [ - { - link: '/en/player-guide/commands/lc/settings', - text: '/lc settings', - }, - { - link: '/en/player-guide/commands/lc/status', - text: '/lc status', - }, - { - link: '/en/player-guide/commands/lc/channel', - text: '/lc channel', - }, - ], - text: '/lc', - }, - { - items: [ - { - link: '/en/player-guide/commands/lcv/status', - text: '/lcv status', - }, - ], - text: '/lcv', - }, - ], - text: 'Commands', - }, - ], - }, -}; diff --git a/docs/.vitepress/config/ja.ts b/docs/.vitepress/config/ja.ts deleted file mode 100644 index 9b17835..0000000 --- a/docs/.vitepress/config/ja.ts +++ /dev/null @@ -1,128 +0,0 @@ -import type { DefaultTheme } from 'vitepress'; - -export const ja: DefaultTheme.Config = { - editLink: { - pattern: 'https://github.com/m1sk9/LunaticChat/edit/main/docs/src/:path', - text: 'GitHub で編集', - }, - footer: { - copyright: 'Copyright © 2026 m1sk9', - }, - nav: [ - { link: '/player-guide/getting-started', text: 'プレイヤーガイド' }, - { link: '/admin-guide/getting-started', text: '管理者ガイド' }, - { component: 'VersionSwitcher' }, - ], - sidebar: { - '/admin-guide/': [ - { - link: '/admin-guide/getting-started', - text: 'はじめる', - }, - { - link: '/admin-guide/configuration', - text: '設定', - }, - { - link: '/admin-guide/permissions', - text: 'パーミッション', - }, - { - items: [ - { - link: '/admin-guide/channel-chat/introduction', - text: '展開ガイド', - }, - { - link: '/admin-guide/channel-chat/logs', - text: 'ログ', - }, - ], - text: 'チャンネルチャット', - }, - { - link: '/admin-guide/velocity', - text: 'Velocity 連携', - }, - { - link: '/admin-guide/cache', - text: 'キャッシュシステム', - }, - { - link: '/admin-guide/management-data', - text: 'データの管理', - }, - ], - '/player-guide/': [ - { - link: '/player-guide/getting-started', - text: 'はじめる', - }, - { - link: '/player-guide/about', - text: 'LunaticChat について', - }, - { - items: [ - { - link: '/player-guide/channel-chat/private-channel', - text: 'プライベートチャンネル', - }, - { - link: '/player-guide/channel-chat/moderation', - text: 'モデレーション', - }, - ], - link: '/player-guide/channel-chat/about', - text: 'チャンネルチャット', - }, - { - link: '/player-guide/direct-message', - text: 'ダイレクトメッセージ', - }, - { - link: '/player-guide/japanese-romanization', - text: 'ローマ字変換', - }, - { - items: [ - { - link: '/player-guide/commands/tell', - text: '/tell', - }, - { - link: '/player-guide/commands/reply', - text: '/reply', - }, - { - items: [ - { - link: '/player-guide/commands/lc/settings', - text: '/lc settings', - }, - { - link: '/player-guide/commands/lc/status', - text: '/lc status', - }, - { - link: '/player-guide/commands/lc/channel', - text: '/lc channel', - }, - ], - text: '/lc', - }, - { - items: [ - { - link: '/player-guide/commands/lcv/status', - text: '/lcv status', - }, - ], - text: '/lcv', - }, - ], - text: 'コマンド', - }, - ], - }, -}; diff --git a/docs/.vitepress/theme/Layout.vue b/docs/.vitepress/theme/Layout.vue deleted file mode 100644 index 9a2b4ae..0000000 --- a/docs/.vitepress/theme/Layout.vue +++ /dev/null @@ -1,14 +0,0 @@ -<script setup lang="ts"> -import DefaultTheme from 'vitepress/theme'; -import VersionBanner from './VersionBanner.vue'; - -const { Layout } = DefaultTheme; -</script> - -<template> - <Layout> - <template #layout-top> - <VersionBanner /> - </template> - </Layout> -</template> diff --git a/docs/.vitepress/theme/VersionBanner.vue b/docs/.vitepress/theme/VersionBanner.vue deleted file mode 100644 index 68347d0..0000000 --- a/docs/.vitepress/theme/VersionBanner.vue +++ /dev/null @@ -1,72 +0,0 @@ -<script setup lang="ts"> -import { ref, computed, watch, onMounted, onUnmounted, nextTick } from 'vue'; -import { useRoute, inBrowser } from 'vitepress'; - -const route = useRoute(); -const bannerRef = ref<HTMLElement | null>(null); - -const isNonDefaultVersion = computed(() => { - const path = route.path; - return /^\/(en\/)?v\d+\//.test(path) || /^\/(en\/)?v\d+$/.test(path); -}); - -const versionLabel = computed(() => { - const match = route.path.match(/\/v(\d+)/); - return match ? `v${match[1]}` : ''; -}); - -const isJapanese = computed(() => { - return !route.path.startsWith('/en/'); -}); - -function updateLayoutTopHeight() { - if (!inBrowser || !bannerRef.value) return; - const height = bannerRef.value.getBoundingClientRect().height; - if (height > 0) { - document.documentElement.style.setProperty('--vp-layout-top-height', `${height}px`); - } else { - document.documentElement.style.removeProperty('--vp-layout-top-height'); - } -} - -function updateBannerClass(show: boolean) { - if (!inBrowser) return; - if (show) { - document.documentElement.classList.add('has-version-banner'); - nextTick(updateLayoutTopHeight); - } else { - document.documentElement.classList.remove('has-version-banner'); - document.documentElement.style.removeProperty('--vp-layout-top-height'); - } -} - -let resizeObserver: ResizeObserver | null = null; - -onMounted(() => { - updateBannerClass(isNonDefaultVersion.value); - watch(isNonDefaultVersion, (val) => updateBannerClass(val)); - - if (bannerRef.value) { - resizeObserver = new ResizeObserver(updateLayoutTopHeight); - resizeObserver.observe(bannerRef.value); - } -}); - -onUnmounted(() => { - resizeObserver?.disconnect(); - updateBannerClass(false); -}); -</script> - -<template> - <div v-if="isNonDefaultVersion" ref="bannerRef" class="version-banner"> - <span v-if="isJapanese"> - このドキュメントは <strong>{{ versionLabel }}</strong> - 版です。最新の安定版ではありません。 - </span> - <span v-else> - You are viewing the <strong>{{ versionLabel }}</strong> documentation. - This is not the latest stable version. - </span> - </div> -</template> diff --git a/docs/.vitepress/theme/VersionSwitcher.vue b/docs/.vitepress/theme/VersionSwitcher.vue deleted file mode 100644 index d3ecd62..0000000 --- a/docs/.vitepress/theme/VersionSwitcher.vue +++ /dev/null @@ -1,251 +0,0 @@ -<script setup lang="ts"> -import { computed, ref } from 'vue'; -import { useData, useRouter } from 'vitepress'; -import VPFlyout from 'vitepress/dist/client/theme-default/components/VPFlyout.vue'; -import VPMenuLink from 'vitepress/dist/client/theme-default/components/VPMenuLink.vue'; - -/** - * Mapping from archive folder names to display labels. - * Update this when adding new versions. - */ -const versionLabels: Record<string, string> = { - v1: 'v1 (26.1) - Next', -}; - -interface VersioningPlugin { - versions: Set<string>; - currentVersion: string; -} - -interface Props { - versioningPlugin: VersioningPlugin; - screenMenu?: boolean; -} - -interface VersionMenuItem { - text: string; - link: string; -} - -const props = defineProps<Props>(); -const router = useRouter(); -const { site } = useData(); -const isOpen = ref(false); - -const versionSet = computed(() => new Set([...props.versioningPlugin.versions])); -const hasVersions = computed(() => versionSet.value.size > 0); - -const currentLocale = computed( - () => site.value.locales[site.value.localeIndex]?.link?.replace(/\//g, '') || '', -); - -const pathSegments = computed(() => - router.route.path.replace(/^\/|\/$/g, '').split('/'), -); - -const activeVersion = computed(() => { - const { currentVersion } = props.versioningPlugin; - const segments = pathSegments.value; - const locale = currentLocale.value; - const hasLocalePrefix = locale !== '' && segments[0] === locale; - const versionCandidate = hasLocalePrefix ? segments[1] : segments[0]; - return versionSet.value.has(versionCandidate) ? versionCandidate : currentVersion; -}); - -const activeVersionLabel = computed( - () => versionLabels[activeVersion.value] ?? activeVersion.value, -); - -const availableVersions = computed(() => - Array.from(props.versioningPlugin.versions).filter((v) => v !== activeVersion.value), -); - -const shouldShowCurrentVersion = computed( - () => activeVersion.value !== props.versioningPlugin.currentVersion, -); - -function isLocaleFirst(segments: string[]): boolean { - const locale = currentLocale.value; - return locale !== '' && segments[0] === locale; -} - -function removeVersionSegments(segments: string[]): string[] { - return segments.filter((seg) => !versionSet.value.has(seg)); -} - -function buildVersionPath(version: string): string { - const { currentVersion } = props.versioningPlugin; - const baseSegments = removeVersionSegments(pathSegments.value); - const hasLocale = isLocaleFirst(baseSegments); - - let newSegments: string[]; - - if (version === currentVersion) { - newSegments = baseSegments; - } else if (hasLocale) { - newSegments = [baseSegments[0], version, ...baseSegments.slice(1)]; - } else { - newSegments = [version, ...baseSegments]; - } - - return `/${newSegments.join('/')}`; -} - -function label(version: string): string { - return versionLabels[version] ?? version; -} - -function createVersionMenuItem(version: string): VersionMenuItem { - return { - text: label(version), - link: buildVersionPath(version), - }; -} - -function toggle(): void { - isOpen.value = !isOpen.value; -} -</script> - -<template> - <template v-if="hasVersions"> - <!-- Desktop flyout --> - <VPFlyout - v-if="!screenMenu" - class="VPVersionSwitcher" - icon="vpi-versioning" - :button="activeVersionLabel" - label="Switch Version" - > - <div class="items"> - <VPMenuLink - v-if="shouldShowCurrentVersion" - :item="createVersionMenuItem(versioningPlugin.currentVersion)" - /> - <VPMenuLink - v-for="version in availableVersions" - :key="version" - :item="createVersionMenuItem(version)" - /> - </div> - </VPFlyout> - - <!-- Mobile dropdown --> - <div v-else class="VPScreenVersionSwitcher" :class="{ open: isOpen }"> - <button - class="button" - type="button" - aria-controls="navbar-group-version" - :aria-expanded="isOpen" - @click="toggle" - > - <span class="button-text"> - <span class="vpi-versioning icon" /> - Switch Version - </span> - <span class="vpi-plus button-icon" /> - </button> - - <div id="navbar-group-version" class="items"> - <VPMenuLink :item="createVersionMenuItem(versioningPlugin.currentVersion)" /> - <VPMenuLink - v-for="version in versioningPlugin.versions" - :key="version" - :item="createVersionMenuItem(version)" - /> - </div> - </div> - </template> -</template> - -<style> -.vpi-versioning.option-icon { - margin-right: 2px !important; -} - -.vpi-versioning { - --icon: url("data:image/svg+xml;charset=utf-8;base64,PHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0cm9rZS13aWR0aD0iMi4yIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNvbG9yPSIjMDAwMDAwIj48cGF0aCBkPSJNMTcgN0MxOC4xMDQ2IDcgMTkgNi4xMDQ1NyAxOSA1QzE5IDMuODk1NDMgMTguMTA0NiAzIDE3IDNDMTUuODk1NCAzIDE1IDMuODk1NDMgMTUgNUMxNSA2LjEwNDU3IDE1Ljg5NTQgNyAxNyA3WiIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIuMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48L3BhdGg+PHBhdGggZD0iTTcgN0M4LjEwNDU3IDcgOSA2LjEwNDU3IDkgNUM5IDMuODk1NDMgOC4xMDQ1NyAzIDcgM0M1Ljg5NTQzIDMgNSAzLjg5NTQzIDUgNUM1IDYuMTA0NTcgNS44OTU0MyA3IDcgN1oiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyLjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PC9wYXRoPjxwYXRoIGQ9Ik03IDIxQzguMTA0NTcgMjEgOSAyMC4xMDQ2IDkgMTlDOSAxNy44OTU0IDguMTA0NTcgMTcgNyAxN0M1Ljg5NTQzIDE3IDUgMTcuODk1NCA1IDE5QzUgMjAuMTA0NiA1Ljg5NTQzIDIxIDcgMjFaIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi4yIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjwvcGF0aD48cGF0aCBkPSJNNyA3VjE3IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi4yIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjwvcGF0aD48cGF0aCBkPSJNMTcgN1Y4QzE3IDEwLjUgMTUgMTEgMTUgMTFMOSAxM0M5IDEzIDcgMTMuNSA3IDE2VjE3IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi4yIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjwvcGF0aD48L3N2Zz4="); -} -</style> - -<style scoped> -.VPVersionSwitcher { - display: flex; - align-items: center; -} - -.icon { - padding: 8px; -} - -.title { - padding: 0 24px 0 12px; - line-height: 32px; - font-size: 14px; - font-weight: 700; - color: var(--vp-c-text-1); -} - -.VPScreenVersionSwitcher { - border-bottom: 1px solid var(--vp-c-divider); - height: 48px; - overflow: hidden; - transition: border-color 0.5s; -} - -.VPScreenVersionSwitcher .items { - visibility: hidden; -} - -.VPScreenVersionSwitcher.open { - padding-bottom: 10px; - height: auto; -} - -.VPScreenVersionSwitcher.open .items { - visibility: visible; -} - -.VPScreenVersionSwitcher.open .button { - padding-bottom: 6px; - color: var(--vp-c-brand-1); -} - -.VPScreenVersionSwitcher.open .button-icon { - transform: rotate(45deg); -} - -.VPScreenVersionSwitcher button .icon { - margin-right: 8px; -} - -.button { - display: flex; - justify-content: space-between; - align-items: center; - padding: 12px 4px 11px 0; - width: 100%; - line-height: 24px; - font-size: 14px; - font-weight: 500; - color: var(--vp-c-text-1); - transition: color 0.25s; -} - -.button:hover { - color: var(--vp-c-brand-1); -} - -.button-icon { - transition: transform 0.25s; -} - -.group:first-child { - padding-top: 0; -} - -.group + .group, -.group + .item { - padding-top: 4px; -} -</style> diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css deleted file mode 100644 index a4ebd52..0000000 --- a/docs/.vitepress/theme/custom.css +++ /dev/null @@ -1,21 +0,0 @@ -.version-banner { - display: block; - padding: 12px 16px; - background-color: var(--vp-c-warning-soft); - color: var(--vp-c-warning-1); - text-align: center; - font-size: 14px; - line-height: 1.6; - border-bottom: 1px solid var(--vp-c-warning-2); -} - -@media (min-width: 960px) { - .version-banner { - position: fixed; - top: 0; - left: 0; - right: 0; - z-index: 30; - padding: 12px 24px; - } -} diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts deleted file mode 100644 index 26c6640..0000000 --- a/docs/.vitepress/theme/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import DefaultTheme from 'vitepress/theme'; -import Layout from './Layout.vue'; -import VersionSwitcher from './VersionSwitcher.vue'; -import './custom.css'; - -export default { - extends: DefaultTheme, - Layout, - enhanceApp({ app }) { - app.component('VersionSwitcher', VersionSwitcher); - }, -}; diff --git a/docs/archive/v1/index.md b/docs/archive/v1/index.md deleted file mode 100644 index 51834ed..0000000 --- a/docs/archive/v1/index.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -# https://vitepress.dev/reference/default-theme-home-page -layout: home - -hero: - name: 'LunaticChat' - tagline: A next-generation chat plugin for Paper, Folia and Velocity. - actions: - - theme: alt - text: GitHub - link: https://github.com/m1sk9/LunaticChat - image: - src: /icon.png - alt: LunaticChat Logo ---- - -::: warning - -このドキュメントは現在編集中です.現行安定版のドキュメントではありません. - -現行のバージョンについては [こちら](/) をご覧ください. - -::: diff --git a/docs/src/admin-guide/cache.md b/docs/src/admin-guide/cache.md deleted file mode 100644 index b1a6754..0000000 --- a/docs/src/admin-guide/cache.md +++ /dev/null @@ -1,31 +0,0 @@ -# キャッシュシステム - -LunaticChat では,かな・ローマ字変換時のフレーズを自動でメモリ・ディスクにキャッシュするシステムが搭載されています. - -かな・ローマ字変換に関する情報は [こちら](../player-guide/japanese-romanization.md) をご覧ください. - -## メモリキャッシュ - -LunaticChat は変換済みのフレーズをメモリ上にキャッシュし,再度同じフレーズが要求された際に高速に応答できるようにしています. - -このキャッシュは一時的であり,サーバー再起動時や設定した秒数毎にディスクキャッシュへ保存されます. - -## ディスクキャッシュ - -LunaticChat はメモリキャッシュの内容を定期的にディスクに保存します. これにより,サーバー再起動後もキャッシュ内容を保持できるようになっています. - -ディスクキャッシュとして使用されるファイルは [設定で変更できます](configuration.md#cachefilepath). - -## キャッシュの解放 - -メモリキャッシュは,ディスクにキャッシュしたのち自動的に JVM のガベージコレクションにより解放されます. - -ディスクキャッシュは,手動でファイルを削除することで解放できます. 再起動時に LunaticChat は再度キャッシュファイルを作成します. - -::: warning パージ機能について - -LunaticChat では,キャッシュのパージ 機能は実装されていません. - -これはプレイヤー側にホストのファイルシステムを操作させることがセキュリティ上好ましくないためです. - -::: diff --git a/docs/src/admin-guide/channel-chat/introduction.md b/docs/src/admin-guide/channel-chat/introduction.md deleted file mode 100644 index 559283c..0000000 --- a/docs/src/admin-guide/channel-chat/introduction.md +++ /dev/null @@ -1,74 +0,0 @@ -# チャンネルチャット: 展開ガイド - -このガイドでは、チャンネルチャットの展開方法について説明します. - -## チャンネルチャットとは - -プレイヤー間でチャンネルを作成し,特定のプレイヤー間で,チャットを共有できる機能です. - -詳しい機能については [プレイヤー向けガイド版](../../player-guide/channel-chat/about.md) を参照してください. - -## チャンネルチャットの展開準備 - -チャンネルチャットを展開するには,LunaticChat の設定ファイル `config.yml` でチャンネルチャット機能を有効化する必要があります. - -1. サーバーを停止します. -2. `plugins/LunaticChat/config.yml` を開きます. -3. `features.channelChat.enabled` を `true` に設定します. -4. サーバーを再起動します. - -以上でチャンネルチャット機能が有効化され,プレイヤーがチャンネルチャットを使用できるようになります. - -## チャンネルチャットの設定 - -チャンネルチャットに関する設定項目は以下の通りです. - -- `features.channelChat.maxChannelsPerPlayer`: 1人のプレイヤーが作成できるチャンネルの最大数を指定します. -- `features.channelChat.maxMembersPerChannel`: 1つのチャンネルに参加できるメンバーの最大数を指定します. -- `features.channelChat.maxMembershipPerPlayer`: 1人のプレイヤーが参加できるチャンネルの最大数を指定します. - -デフォルトは `0` に設定されており,制限はありません. - -::: tip 設定のおすすめは? - -チャンネルチャット機能を活発に使用したい場合は,これらの値を高めに設定することをお勧めします. - -ただし,サーバーのパフォーマンスに影響を与える可能性があるため,サーバーのリソース状況に応じて適切に設定してください. - -おすすめの設定は次のとおりです. - -- `features.channelChat.maxChannelsPerPlayer`: `3` 〜 `5` -- `features.channelChat.maxMembersPerChannel`: `20` 〜 `50` -- `features.channelChat.maxMembershipPerPlayer`: `5` 〜 `10` - -::: - -## チャンネルチャットのログ - -::: warning CoreProtect などのプラグインとの互換性 - -LunaticChat では,チャンネルチャット機能に限り v0.7.0 以降 CoreProtect などのログ記録プラグインと互換性はありません. - -::: - -チャンネルチャットのログ機能はデフォルトで有効になっています. - -詳しくは [チャンネルチャット: ログ](logs.md) を参照してください. - -## チャンネルの管理 - -基本的に,[チャンネルの管理はプレイヤー自身が行います](../../player-guide/channel-chat/moderation.md). - -ただし,サーバー管理者として,以下の点に注意してください: - -- サーバー管理者はすべてのチャンネルに対してオーナー権限を持ちます.操作が必要な場合は,適切に対応してください. -- サーバーのパフォーマンスを維持するために,必要に応じてチャンネル数やメンバー数の制限を設定してください. -- 不適切なチャンネルやメンバー行動が発生した場合は,適切な措置を講じてください. - -また,それらのチャンネルの管理によるトラブルを回避したい場合は `/lc channel ban` などのモデレートコマンドの制限を検討してください. - -## チャンネルチャットを捕捉してしまうプラグイン - -基本的に CoreProtect などのログ記録プラグインは,LunaticChat のチャンネルチャットメッセージを捕捉しません. - -ただし,Paper API の `originalMessage()` を使用してメッセージを取得しているプラグインは,LunaticChat のチャンネルチャットメッセージを捕捉してしまう可能性があります. diff --git a/docs/src/admin-guide/channel-chat/logs.md b/docs/src/admin-guide/channel-chat/logs.md deleted file mode 100644 index df09169..0000000 --- a/docs/src/admin-guide/channel-chat/logs.md +++ /dev/null @@ -1,119 +0,0 @@ -# チャンネルチャット: ログ <Badge type="tip" text="v0.7.0" /> - -チャンネルチャットのログは,チャット内で行われたすべてのメッセージとアクティビティの記録です. - -::: warning CoreProtect などのプラグインとの互換性 - -LunaticChat では,チャンネルチャット機能に限り v0.7.0 以降 CoreProtect などのログ記録プラグインと互換性はありません. - -::: - -## チャンネルチャットのログを確認する - -チャンネルチャットのログは `plugins/LunaticChat/logs/channelchat/` ディレクトリに保存されます. - -チャンネルチャットのログファイルは,以下のフォーマットで保存されます: - -``` -{"timestamp":"2026-01-31T08:54:18.504343071Z","playerId":"ceaea267-39dd-3bac-931c-761ada671ebe","playerName":"m1sk9","channelId":"test","message":"こんにちは"} -``` - -## ファイルサイズについて - -各行が1つの完全な JSON オブジェクトであり,各行で区切られているだけで,ファイル全体としては JSON 配列ではありません. - -```text -plugins/LunaticChat/logs/ -├── channel-messages-2026-01-17.json (5.2 MB) -├── channel-messages-2026-01-18.json (4.8 MB) -├── channel-messages-2026-01-19.json (6.1 MB) -├── channel-messages-2026-01-20.json (5.5 MB) -├── channel-messages-2026-01-21.json (7.2 MB) <- 週末、アクティブ -├── channel-messages-2026-01-22.json (6.9 MB) -├── channel-messages-2026-01-23.json (4.3 MB) -├── channel-messages-2026-01-24.json (5.0 MB) -├── channel-messages-2026-01-25.json (5.4 MB) -├── channel-messages-2026-01-26.json (4.9 MB) -├── channel-messages-2026-01-27.json (6.2 MB) -├── channel-messages-2026-01-28.json (7.5 MB) -├── channel-messages-2026-01-29.json (5.8 MB) -├── channel-messages-2026-01-30.json (6.0 MB) -└── channel-messages-2026-01-31.json (2.1 MB) <- 今日(進行中) -``` - -合計: 約 83 MB - -30日保持設定 の場合,1月17日のファイルは明日自動削除されます. - -### 1メッセージあたりのサイズ - -チャンネルチャットのログエントリは1行につき,約200バイトです. - -1時間に1000メッセージの計算として - -```text -1000 msg/h × 24h × 220 bytes = 5,280,000 bytes ≈ 5.3 MB/日 -``` - -デフォルト設定の30日間保持の場合は **159 MB** 程度になります. - -```text -5.3 MB × 30日 = 159 MB -``` - -## Grafana Loki での可視化 - -JSON 形式のため,Promtail を使用し,Grafana Loki にチャンネルチャットのログを取り込むとパースされ読みやすくなります. - -```text -2026-01-31 10:23:45.123 {job="lunatichat", player="Steve", channel="Global"} -Hello everyone! - -2026-01-31 10:24:12.456 {job="lunatichat", player="Alex", channel="Global"} -Hi Steve! - -2026-01-31 10:25:03.789 {job="lunatichat", player="Notch", channel="Development Team"} -Working on new features -``` - -::: tip フィルタリング例 - -Grafana Loki でログをクエリ化する例: - -```text -{job="lunatichat"} |= "new features" -{job="lunatichat", channel="Global"} -{job="lunatichat", player="Steve"} -``` - -::: - -## コマンドラインでの確認例 - -### 最新10件を見る - -```bash -tail -n 10 plugins/LunaticChat/logs/channel-messages-2026-01-31.json | jq -``` - -### 特定プレイヤーのメッセージを抽出 - -```bash -cat plugins/LunaticChat/logs/channel-messages-*.json | \ -jq 'select(.playerName=="Steve")' -``` - -### 特定チャンネルのメッセージ数をカウント - -```bash -cat plugins/LunaticChat/logs/channel-messages-*.json | \ -jq 'select(.channelId=="global")' | wc -l -``` - -### 日付別メッセージ数 - -```bash -for file in plugins/LunaticChat/logs/channel-messages-*.json; do -echo "$file: $(wc -l < $file) messages" -done -``` diff --git a/docs/src/admin-guide/configuration.md b/docs/src/admin-guide/configuration.md deleted file mode 100644 index dfe8094..0000000 --- a/docs/src/admin-guide/configuration.md +++ /dev/null @@ -1,318 +0,0 @@ -# 設定 - -```yaml -# ---------------------------------------------- -# -------------- LunaticChat --------------- -# ---------------------------------------------- -# -# Docs: https://lc.m1sk9.dev -# GitHub: https://github.com/m1sk9/LunaticChat -# -# This configuration file is for customizing LunaticChat's behavior. -# Please specify appropriate values to ensure LunaticChat functions correctly. -# -# For detailed configuration options, please refer to the documentation: -# Japanese: https://lc.m1sk9.dev/guide/admin/configuration -# English: https://lc.m1sk9.dev/en/guide/admin/configuration -# ---------------------------------------------- - -# If enabled, Activate LunaticChat's debug mode, which provides detailed logging for troubleshooting. -debug: false - -# Path to the YAML file storing player settings -userSettingsFilePath: 'player-settings.yaml' - -# If enabled, LunaticChat will check for updates on startup. -checkForUpdates: true - -# Plugin Configuration Language. This setting applies only to player feedback and does not affect plugin logs or similar outputs. -language: 'en' - -# ---------------------------------------------- -# ----------- Features Settings ------------ -# ---------------------------------------------- - -features: - quickReplies: - # If enabled, the quick reply feature via the /reply command will be activated. - enabled: true - japaneseConversion: - # If enabled, enables the conversion function from Roman letters to hiragana. - enabled: false - cache: - # Specifies the maximum number of entries to store in the Romanization conversion cache. - maxEntries: 500 - # Specify the interval (in seconds) for saving the Romanization conversion cache to disk. - saveIntervalSeconds: 300 - # Specify the file path where the cache for Romanization conversion is saved. - filePath: 'conversion_cache.json' - api: - # Specify the timeout duration (in milliseconds) for API requests to the Romanization conversion service. - timeout: 3000 - # Specify the number of retry attempts for failed API requests to the Romanization conversion service. - retryAttempts: 2 - channelChat: - # If enabled, channel-based chat functionality will be activated. - enabled: false - # Maximum number of channels that can be created per server. Set to 0 for unlimited. - maxChannelsPerServer: 0 - # Maximum number of members allowed in a single channel. Set to 0 for unlimited. - maxMembersPerChannel: 0 - # Maximum number of channels a single player can join. Set to 0 for unlimited. - maxMembershipPerPlayer: 0 - # Channel message logging configuration - messageLogging: - # If enabled, all channel messages will be logged to NDJSON files for analysis and archival. - enabled: true - # Number of days to retain log files. Set to 0 to keep logs indefinitely. - retentionDays: 30 - # Maximum size of a single log file in megabytes. Files exceeding this size will stop accepting new entries. - maxFileSizeMB: 100 - velocityIntegration: - # If enabled, enables integration with Velocity proxy plugin. - # This allows Paper and Velocity instances to communicate and verify compatibility. - enabled: false - # If enabled, global chat messages will be shared across all Paper servers connected to the Velocity proxy. - # Players on different servers can communicate through the GLOBAL chat mode. - crossServerGlobalChat: false - # Server name to display in cross-server chat (e.g., "survival", "creative", "lobby"). - # This should match the server name defined in your Velocity configuration. - serverName: 'Unknown' - # Size of the message deduplication cache to prevent duplicate messages from appearing. - # Keeps track of the most recent N message IDs to filter out duplicates. - messageDeduplicationCacheSize: 100 - -# ---------------------------------------------- -# --------- Message Format Settings -------- -# ---------------------------------------------- -# -# Customize the format of various chat messages here. -# You can use placeholders such as {sender}, {message}, etc. -# -# {sender} - The name of the message sender -# {recipient} - The name of the message recipient -# {message} - The content of the message -# {channel} - The name of the chat channel (only for channel chat) -# {server} - The name of the server (only for Velocity cross-server chat) -# ---------------------------------------------- - -messageFormat: - # Configure the format for direct messages sent via /tell or /msg - directMessageFormat: '§7[§e{sender} §7>> §e{recipient}§7] §f{message}' - # Configure the format for messages sent in channel chat - channelMessageFormat: '§7[§b#{channel}§7] §e{sender}: §f{message}' - # Configure the format for global chat messages in Velocity integration - crossServerGlobalChatFormat: '§7[§6{server}§7] §e{sender}: §f{message}' -``` - -## General Settings - -### `debug` - -- Type: `boolean` -- Default: `false` - -LunaticChat をデバッグモードで起動します. - -### `userSettingsFilePath` - -- Type: `string` -- Default: `player-settings.yaml` - -LunaticChat がプレイヤーの設定を保存する YAML ファイルのパスを指定します. - -### `checkForUpdates` - -- Type: `boolean` -- Default: `true` - -LunaticChat の起動時・権限を持ったプレイヤーがサーバに参加した際に,LunaticChat のアップデートを促すかどうか設定します. - -### `language` - -- Type: `string` -- Default: `en` - -LunaticChat のプレイヤー向けメッセージの言語を指定します. - -### Supported languages: - -- `en`: English -- `ja`: 日本語 - -## Features Settings - -### `features.quickReplies.enabled` - -- Type: `boolean` -- Default: `true` - -LunaticChat の [`/reply`](../player-guide/commands/reply.md) コマンドによるクイックリプライ機能を有効にします. - -無効にすると [`/reply`](../player-guide/commands/reply.md) コマンドは Paper に登録されず,使用できなくなります. - -### `features.japaneseConversion.enabled` - -- Type: `boolean` -- Default: `false` - -ローマ字からひらがなへの変換機能を有効にします. - -### `features.japaneseConversion` - -#### `cache.maxEntries` - -- Type: `integer` -- Default: `500` - -ローマ字変換のキャッシュに保存する最大エントリ数を指定します. - -この値を超えると,最も古いエントリから順に削除されます. - -値を高く設定すれば,変換のパフォーマンスが向上しますが,メモリ使用量・キャッシュファイルサイズも増加します. - -#### `cache.saveIntervalSeconds` - -- Type: `integer` -- Default: `300` - -ローマ字変換のキャッシュをディスクに保存する間隔(秒)を指定します. - -#### `cache.filePath` - -- Type: `string` -- Default: `conversion_cache.json` - -ローマ字変換のキャッシュを保存するファイルパスを指定します. - -ここで設定したパスは `plugins/LunaticChat/` ディレクトリを基準とした相対パスとして解釈されます. - -#### `api.timeout` - -- Type: `integer` -- Default: `3000` - -ローマ字変換 API へのリクエストのタイムアウト時間(ミリ秒)を指定します. - -#### `api.retryAttempts` - -- Type: `integer` -- Default: `2` - -ローマ字変換 API へのリクエストが失敗した場合の再試行回数を指定します. - -### `features.channelChat` - -#### `enabled` - -- Type: `boolean` -- Default: `false` - -チャンネルチャット機能を有効にします. - -#### `maxChannelsPerServer` - -- Type: `integer` -- Default: `0` - -サーバーあたりで作成可能なチャンネルの最大数を指定します. - -`0` に設定すると無制限になります. - -#### `maxMembersPerChannel` - -- Type: `integer` -- Default: `0` - -1 つのチャンネルに参加可能なメンバーの最大数を指定します. - -`0` に設定すると無制限になります. - -#### `maxMembershipPerPlayer` - -- Type: `integer` -- Default: `0` - -1 人のプレイヤーが参加可能なチャンネルの最大数を指定します. - -`0` に設定すると無制限になります. - -#### `messageLogging.enabled` - -- Type: `boolean` -- Default: `true` - -チャンネルチャットのメッセージを NDJSON 形式でログに記録するかどうかを指定します. - -#### `messageLogging.retentionDays` - -- Type: `integer` -- Default: `30` - -チャンネルチャットのログファイルを保存する日数を指定します. - -`0` に設定すると,ログファイルは削除されません. - -#### `messageLogging.maxFileSizeMB` - -- Type: `integer` -- Default: `100` - -チャンネルチャットのログファイルの最大サイズ(メガバイト)を指定します. - -`maxFileSizeMB` を超えたログファイルは新しいエントリを受け付けなくなります. - -### `features.velocityIntegration` - -#### `enabled` - -- Type: `boolean` -- Default: `false` - -Velocity プロキシプラグインとの連携を有効にします. - -#### `crossServerGlobalChat` - -- Type: `boolean` -- Default: `false` - -Velocity プロキシに接続されたすべての Paper サーバー間でチャットメッセージを共有するかどうかを指定します. - -#### `serverName` - -- Type: `string` -- Default: `Unknown` - -Velocity クロスサーバーチャットで表示されるサーバー名を指定します. - -例: `survival`, `creative`, `lobby` - -#### `messageDeduplicationCacheSize` - -- Type: `integer` -- Default: `100` - -メッセージの重複排除キャッシュのサイズを指定します. - -## Message Format Settings - -使用できるプレースホルダー: - -- `{sender}`: メッセージ送信者の名前 -- `{recipient}`: メッセージ受信者の名前 -- `{message}`: メッセージの内容 -- `{channel}`: チャットチャンネルの名前 (チャンネルチャットの場合のみ) - -### `messageFormat.directMessageFormat` - -- Type: `string` -- Default: `§7[§e{sender} §7>> §e{recipient}§7] §f{message}` - -ダイレクトメッセージ( [`/tell`](../player-guide/commands/tell.md) や [`/reply`](../player-guide/commands/reply.md) コマンド)で送信されるメッセージのフォーマットを指定します. - -### `messageFormat.channelMessageFormat` - -- Type: `string` -- Default: `§7[§b#{channel}§7] §e{sender}: §f{message}` - -チャンネルチャットで送信されるメッセージのフォーマットを指定します. diff --git a/docs/src/admin-guide/getting-started.md b/docs/src/admin-guide/getting-started.md deleted file mode 100644 index 9254f33..0000000 --- a/docs/src/admin-guide/getting-started.md +++ /dev/null @@ -1,72 +0,0 @@ -# はじめる - -## 事前準備 - -LunaticChat を使用するには,以下のソフトウェアが必要です: - -- Java 21 (LTS 以降) -- Paper 1.21 以降 - - または Folia 1.21 以降 - -最新版は [こちら](https://papermc.io/downloads/paper), それ以降のバージョンは [こちら](https://fill-ui.papermc.io/projects/paper/family/1.21) から入手できます. - -::: warning Spigot 系プラットフォームでの動作について - -LunaticChat は Paper プラグインです.Spigot / Bukkit / CraftBukkit では動作しません. - -::: - -## インストール - -LunaticChat をインストールします.LunaticChat は以下から入手できます: - -- [GitHub](https://github.com/m1sk9/LunaticChat/releases) -- [Modrinth](https://modrinth.com/project/lunaticchat) - -ダウンロードしたプラグインファイルをサーバーの `plugins` フォルダに配置し,サーバーを起動します. - -## 設定 - -LunaticChat を起動すると設定ファイル `config.yml` が作成されます. - -該当のファイルを開き,初期設定を変更してください.なお,全設定項目の詳細については,[設定ガイド](./configuration.md)を参照してください. - -### 推奨する初期設定 - -`config.yml` の以下の項目を確認・変更してください: - -- `checkForUpdates`: LunaticChat のアップデートチェックを有効にするかどうかを指定します.`true` に設定することを推奨します. -- `language`: LunaticChat のメッセージ言語を指定します.日本語環境の場合は `ja` に設定してください. - - なお,日本語環境が使用できないサーバー向けにプラグイン内のログは全て英語で出力されます. -- `features.quickReplies.enabled`: クイックリプライ機能を有効にするかどうかを指定します.`true` に設定することを推奨します. -- `features.japaneseConversion.enabled`: ローマ字からひらがなへの変換機能を有効にするかどうかを指定します.日本人向けにサーバーを開放する場合は `true` に設定することを推奨します. - -::: tip その他,設定項目について - -チャンネルチャットなどの各機能に関する設定項目も存在します. - -必要に応じて設定を変更してください. - -::: - -## パーミッション - -LunaticChat のパーミッションを LuckPerms などのパーミッション管理プラグインで設定します. - -基本的なパーミッションは Paper, Folia や Velocity のデフォルトパーミッションシステム ( `OP` / `non OP` ) でも使用できるように開発されていますが,より詳細な制御を行う場合は LuckPerms の使用を推奨します. - -- パーミッションノードの詳細については [パーミッションガイド](./permissions.md)を参照してください. -- コマンドの各機能に対応するパーミッションノードは,[コマンドリファレンス](../player-guide/index.md)を参照してください. - -## サーバーの再起動 - -設定が完了したら,サーバーを再起動して設定を反映させてください. - -以上で LunaticChat の基本的なセットアップは完了です. - -## 次は? - -- [キャッシュシステム](./cache.md): LunaticChat のキャッシュシステムについて説明します. -- [チャンネルチャット](./channel-chat/introduction.md): チャンネルチャット機能の概要を説明します. -- [コマンド一覧](../player-guide/index.md): LunaticChat のコマンド一覧を確認します. -- [パーミッション一覧](./permissions.md): LunaticChat のパーミッションノード一覧を確認します. diff --git a/docs/src/admin-guide/management-data.md b/docs/src/admin-guide/management-data.md deleted file mode 100644 index 9255721..0000000 --- a/docs/src/admin-guide/management-data.md +++ /dev/null @@ -1,88 +0,0 @@ -# データ・ログ - -::: danger 編集厳禁 - -これらのデータファイルは LunaticChat の動作に不可欠です.直接編集すると,データの破損や予期せぬ動作を引き起こす可能性があります.データのバックアップを取る場合を除き,これらのファイルを直接編集しないでください. - -::: - -## データの保存場所 - -LunaticChat は、チャンネルデータや設定情報をローカルディスクに保存します. - -- `channels.json`: チャンネル情報を保存するファイルです. -- `conversion_cache.json`: チャンネル変換のキャッシュを保存するファイルです. -- `player-settings.yaml`: プレイヤーごとの設定情報を保存するファイルです. - -::: tip 定期的なバックアップ - -LunaticChat のデータの安全性を確保するために,定期的にバックアップを作成することをお勧めします. - -::: - -### `channels.json` - -`channels.json` ファイルは、LunaticChat が管理するチャンネルの情報を保存します.このファイルには,チャンネル名、参加者リストなどの情報が含まれます. - -```json -{ - "channels": { - "general-channel": { - "id": "general-channel", - "name": "一般チャンネル", - "ownerId": "a01e3843-e521-3998-958a-f459800e4d11", - "createdAt": 1769507213150, - "bannedPlayers": ["ceaea267-39dd-3bac-931c-761ada671ebe"] - } - }, - "members": { - "general-channel": [ - { - "channelId": "test2", - "playerId": "a01e3843-e521-3998-958a-f459800e4d11", - "role": "OWNER", - "joinedAt": 1769507213150 - } - ] - }, - "activeChannels": { - "a01e3843-e521-3998-958a-f459800e4d11": "test2" - } -} -``` - -### `conversion_cache.json` - -`conversion_cache.json` ファイルは、チャンネル変換のキャッシュを保存します.このファイルには,プレイヤーごとのチャンネル変換情報が含まれます. - -キャッシュシステムに関する詳細は [こちら](./cache.md) をご覧ください. - -```json -{ "version": "1", "entries": { "hi": "日" } } -``` - -### `player-settings.yaml` - -`player-settings.yaml` ファイルは、プレイヤーごとの設定情報を保存します.このファイルには,プレイヤーの個別設定が含まれます. - -```yaml -version: 1 -japaneseConversion: - 'aed5efd4-551b-3965-bc28-ae21aa072a66': false - 'ceaea267-39dd-3bac-931c-761ada671ebe': false -directMessageNotification: - 'aed5efd4-551b-3965-bc28-ae21aa072a66': true - 'ceaea267-39dd-3bac-931c-761ada671ebe': true -channelMessageNotification: - 'ceaea267-39dd-3bac-931c-761ada671ebe': true -``` - -## キャッシュバージョン - -ディスクキャッシュに使用されるファイルには `version` フィールドが含まれており,LunaticChat のバージョンアップに伴うキャッシュフォーマットの変更に対応しています. - -バージョンが不一致の場合,LunaticChat はキャッシュファイルを **古い形式のキャッシュ** として認識し,内容を無視して新しい形式で再作成します. - -```json -{ "version": "1", "entries": {} } -``` diff --git a/docs/src/admin-guide/permissions.md b/docs/src/admin-guide/permissions.md deleted file mode 100644 index 09d12d7..0000000 --- a/docs/src/admin-guide/permissions.md +++ /dev/null @@ -1,167 +0,0 @@ -# パーミッション - -LuckPerms を使用した設定方法に関する詳細は [LuckPerms Wiki](https://luckperms.net/wiki/Home) を参照してください. - -## `lunaticchat.*` - -### `lunaticchat.spy` - -- Default: `OP` - -各種プレイヤー間のやり取りを可視化します. - -この権限を持つプレイヤーは他プレイヤーの [`/tell`](../player-guide/commands/tell.md) / [`/reply`](../player-guide/commands/reply.md) でのメッセージ・全チャンネルチャットがブロードキャストされます. - -### `lunaticchat.noticeUpdate` - -- Default: `OP` - -LunaticChat のアップデート通知を受け取ります. - -[受け取るには `checkForUpdates` を有効にしておく](./configuration.md#checkforupdates) 必要があります. - -### `lunaticchat.channelbypass` - -- Default: `OP` - -各チャンネルのモデレート機能やプライベートチャンネルに対する制限を無視します. - -## `lunaticchat.command.*` - -### `lunaticchat.command.tell` - -- Default: `non OP` - -[`/tell`](../player-guide/commands/tell.md) コマンドの使用を切り替えます. - -### `lunaticchat.command.reply` - -- Default: `non OP` - -[`/reply`](../player-guide/commands/reply.md) コマンドの使用を切り替えます. - -### `lunaticchat.command.lc` - -- Default: `non OP` - -`/lc` コマンドの使用を切り替えます. - -### `lunaticchat.command.lc.settings` - -- Default: `non OP` - -[`/lc settings`](../player-guide/commands/lc/settings.md) コマンドの使用を切り替えます. - -### `lunaticchat.command.lc.status` - -- Default: `non OP` - -[`/lc status`](../player-guide/commands/lc/status.md) コマンドの使用を切り替えます. - -### `lunaticchat.command.lc.channel` - -- Default: `non OP` - -[`/lc channel`](../player-guide/commands/lc/channel.md) コマンドの使用を切り替えます. - -### `lunaticchat.command.lc.channel.create` - -- Default: `non OP` - -[`/lc channel create`](../player-guide/commands/lc/channel.md) コマンドの使用を切り替えます. - -### `lunaticchat.command.lc.channel.list` - -- Default: `non OP` - -[`/lc channel list`](../player-guide/commands/lc/channel.md) コマンドの使用を切り替えます. - -### `lunaticchat.command.lc.channel.join` - -- Default: `non OP` - -[`/lc channel join`](../player-guide/commands/lc/channel.md) コマンドの使用を切り替えます. - -### `lunaticchat.command.lc.channel.leave` - -- Default: `non OP` - -[`/lc channel leave`](../player-guide/commands/lc/channel.md) コマンドの使用を切り替えます. - -### `lunaticchat.command.lc.channel.switch` - -- Default: `non OP` - -[`/lc channel switch`](../player-guide/commands/lc/channel.md) コマンドの使用を切り替えます. - -### `lunaticchat.command.lc.channel.status` - -- Default: `non OP` - -[`/lc channel status`](../player-guide/commands/lc/channel.md) コマンドの使用を切り替えます. - -### `lunaticchat.command.lc.channel.info` - -- Default: `non OP` - -[`/lc channel info`](../player-guide/commands/lc/channel.md) コマンドの使用を切り替えます. - -### `lunaticchat.command.lc.channel.delete` - -- Default: `non OP` - -[`/lc channel delete`](../player-guide/commands/lc/channel.md) コマンドの使用を切り替えます. - -### `lunaticchat.command.lc.channel.invite` - -- Default: `non OP` - -[`/lc channel invite`](../player-guide/commands/lc/channel.md) コマンドの使用を切り替えます. - -### `lunaticchat.command.lc.channel.kick` - -- Default: `non OP` - -[`/lc channel kick`](../player-guide/commands/lc/channel.md) コマンドの使用を切り替えます. - -### `lunaticchat.command.lc.channel.ban` - -- Default: `non OP` - -[`/lc channel ban`](../player-guide/commands/lc/channel.md) コマンドの使用を切り替えます. - -### `lunaticchat.command.lc.channel.unban` - -- Default: `non OP` - -[`/lc channel unban`](../player-guide/commands/lc/channel.md) コマンドの使用を切り替えます. - -### `lunaticchat.command.lc.channel.mod` - -- Default: `non OP` - -[`/lc channel mod`](../player-guide/commands/lc/channel.md) コマンドの使用を切り替えます. - -### `lunaticchat.command.lc.channel.ownership` - -- Default: `non OP` - -[`/lc channel ownership`](../player-guide/commands/lc/channel.md) コマンドの使用を切り替えます. - -### `lunaticchat.command.lcv.status` - -- Default: `OP` - -[`/lcv status`](../player-guide/commands/lcv/status.md) コマンドの使用を切り替えます. - -### `lunaticchat.command.jp` <Badge type="danger" text="非推奨: v1.0.0 で削除予定" /> - -- Default: `non OP` - -`/jp` コマンドの使用を切り替えます. - -### `lunaticchat.command.notice` <Badge type="danger" text="非推奨: v1.0.0 で削除予定" /> - -- Default: `non OP` - -`/notice` コマンドの使用を切り替えます. diff --git a/docs/src/admin-guide/velocity.md b/docs/src/admin-guide/velocity.md deleted file mode 100644 index b3652de..0000000 --- a/docs/src/admin-guide/velocity.md +++ /dev/null @@ -1,87 +0,0 @@ -# Velocity 連携 (クロスサーバーチャット) <Badge type="tip" text="v0.8.0" /> - -Velocity を使用して,プロキシサーバーを繋いだ Paper サーバー間のクロスサーバーチャットを行う機能です. - -::: warning 試験的機能 - -この機能は現在試験的な機能として提供されています.今後のアップデートで仕様が変更される可能性があります. - -::: - -::: warning Folia との互換性 - -Velocity 連携機能は Folia とは互換性がありません. - -Folia を使用している場合は Velocity 連携機能を使用できません. - -::: - -## 連携機能を有効化する - -Velocity 連携を有効化するには以下の手順を行います: - -1. Velocity 側に Velocity 版 LunaticChat をインストールします. -2. 各 Paper サーバの `plugins/LunaticChat/config.yml` を開き, `velocity.enabled` を `true` に設定します. -3. Velocity, Paper を起動し,連携完了のメッセージが表示されることを確認します. - -## プラグインバージョンとプロトコルバージョン - -Velocity と Paper の LunaticChat が正しく連携するには,両方のプラグインバージョン・プロトコルバージョンが互換性のあるものである必要があります. - -- Velocity 側と Paper 側の LunaticChat のバージョンが同じであることを確認してください. - - ベータ版や開発版を使用している場合,互換性が保証されないことがあります. -- プロトコルバージョンが一致していることを確認してください. - -::: danger v0.7.0 未満の LunaticChat について - -v0.7.0 未満の LunaticChat は Velocity 版との後方互換性はありません. - -併用することもできないため,v0.7.0 未満の LunaticChat を使用している場合は,Velocity 連携機能を使用しないでください. - -::: - -## 連携状況の確認方法 - -Velocity 連携が正常に動作しているか確認するには,`/lcv status` コマンドを使用します. - -現在のプロトコルバージョンと接続状態が表示されます. - -::: warning バージョン不一致時の動作 - -バージョンやプロトコルバージョンが一致しない場合,Velocity 連携機能は無効化されますが,**プラグイン自体は動作を継続します**. - -`/lcv status` コマンドで接続状態とエラー内容を確認できます.再接続するには Velocity 側と Paper 側の LunaticChat のバージョン / プロトコルバージョンを一致させてください. - -::: - -::: tip Velocity との連携タイミングについて - -LunaticChat が Velocity と連携するタイミングは,起動後 **最初のプレイヤーがサーバーに接続したとき** に行われます. - -そのため,サーバー起動直後に `/lcv status` コマンドを実行しても,まだ Velocity との連携が確立されていない場合があります. - -::: - -## トラブルシューティング - -Velocity 連携に関する問題が発生した場合,以下の点を確認してください: - -- **`/lcv status` コマンドを実行して接続状態を確認してください**.バージョン不一致などのエラーがある場合は,エラーメッセージが表示されます. -- Velocity 側と Paper 側の LunaticChat のバージョン / プロトコルバージョンが同じであることを確認してください. -- LunaticChat の設定が正しいことを確認してください. -- Velocity サーバーと Paper サーバー間のネットワーク接続が正常であることを確認してください. -- LunaticChat のログを確認し,エラーメッセージや警告メッセージがないか確認してください. - -## クロスサーバーチャット - -Velocity 連携が有効化されている場合,プロキシサーバーを介して接続されている全てのサーバー間でチャットメッセージが共有されます. - -## Velocity 連携と互換性のある機能 - -Velocity 連携中に利用可能な主な機能は以下の通りです: - -| | 互換性の有無 | 挙動 | 備考 | -| -------------------- | ------------ | ------------------------------------------------ | -------------------------------------------------------- | -| ダイレクトメッセージ | × | `/tell`, `/reply` コマンドはサーバー内限定で動作 | ダイレクトメッセージは Velocity 連携に対応していません. | -| チャンネルチャット | × | チャンネルチャットはサーバー内限定で動作 | チャンネルチャットは Velocity 連携に対応していません. | -| かな・ローマ字変換 | ◯ | かな・ローマ字変換は全サーバーで動作 | | diff --git a/docs/src/assets/direct-message/minecraft-player-sound.png b/docs/src/assets/direct-message/minecraft-player-sound.png Binary files differdeleted file mode 100644 index 56059e5..0000000 --- a/docs/src/assets/direct-message/minecraft-player-sound.png +++ /dev/null diff --git a/docs/src/en/admin-guide/cache.md b/docs/src/en/admin-guide/cache.md deleted file mode 100644 index 5142a9e..0000000 --- a/docs/src/en/admin-guide/cache.md +++ /dev/null @@ -1,41 +0,0 @@ -# Cache System - -LunaticChat includes a system that automatically caches phrases from Japanese romanization conversion to both memory and disk. - -For information on Japanese romanization conversion, see [here](../player-guide/japanese-romanization.md). - -## Memory Cache - -LunaticChat caches converted phrases in memory, allowing for fast responses when the same phrase is requested again. - -This cache is temporary and is saved to disk cache at server restart or at configured intervals. - -## Disk Cache - -LunaticChat periodically saves the contents of the memory cache to disk. This allows the cache contents to be retained even after server restarts. - -The file used for disk cache can be [changed in the configuration](configuration.md#cachefilepath). - -## Cache Release - -Memory cache is automatically released by the JVM's garbage collection after being cached to disk. - -Disk cache can be released by manually deleting the file. LunaticChat will recreate the cache file on restart. - -::: warning About Purge Functionality - -LunaticChat does not implement a cache purge feature. - -This is because allowing players to manipulate the host's file system is not desirable from a security perspective. - -::: - -## Cache Version - -The file used for disk cache includes a `version` field, which handles changes to the cache format due to LunaticChat version updates. - -If the version does not match, LunaticChat recognizes the cache file as **an old format cache**, ignores its contents, and recreates it in the new format. - -```json -{ "version": "1", "entries": {} } -``` diff --git a/docs/src/en/admin-guide/channel-chat/introduction.md b/docs/src/en/admin-guide/channel-chat/introduction.md deleted file mode 100644 index c87be1b..0000000 --- a/docs/src/en/admin-guide/channel-chat/introduction.md +++ /dev/null @@ -1,74 +0,0 @@ -# Channel Chat: Deployment Guide - -This guide explains how to deploy channel chat. - -## What is Channel Chat - -Channel chat is a feature that allows players to create channels and share chat among specific players. - -For detailed features, please refer to the [Player Guide](../../player-guide/channel-chat/about.md). - -## Preparing to Deploy Channel Chat - -To deploy channel chat, you need to enable the channel chat feature in the LunaticChat configuration file `config.yml`. - -1. Stop the server. -2. Open `plugins/LunaticChat/config.yml`. -3. Set `features.channelChat.enabled` to `true`. -4. Restart the server. - -This will enable the channel chat feature and allow players to use channel chat. - -## Channel Chat Configuration - -The configuration items related to channel chat are as follows: - -- `features.channelChat.maxChannelsPerPlayer`: Specifies the maximum number of channels a single player can create. -- `features.channelChat.maxMembersPerChannel`: Specifies the maximum number of members that can join a single channel. -- `features.channelChat.maxMembershipPerPlayer`: Specifies the maximum number of channels a single player can join. - -The default is set to `0`, which means there is no limit. - -::: tip Recommended Settings - -If you want to actively use the channel chat feature, we recommend setting these values higher. - -However, as this may impact server performance, please set them appropriately according to your server's resource situation. - -Recommended settings are as follows: - -- `features.channelChat.maxChannelsPerPlayer`: `3` to `5` -- `features.channelChat.maxMembersPerChannel`: `20` to `50` -- `features.channelChat.maxMembershipPerPlayer`: `5` to `10` - -::: - -## Channel Chat Logging - -::: warning Compatibility with Plugins like CoreProtect - -As of v0.7.0, LunaticChat's channel chat feature is not compatible with logging plugins like CoreProtect. - -::: - -Channel chat logging is enabled by default. - -For more details, see [Channel Chat: Logs](logs.md). - -## Channel Management - -Basically, [players manage channels themselves](../../player-guide/channel-chat/moderation.md). - -However, as a server administrator, please note the following: - -- Server administrators have owner permissions for all channels. If operations are required, please respond appropriately. -- To maintain server performance, set limits on the number of channels and members as needed. -- If inappropriate channels or member behavior occurs, take appropriate action. - -If you want to avoid troubles related to channel management, consider restricting moderate commands such as `/lc channel ban`. - -## Plugins that Intercept Channel Chat - -Logging plugins like CoreProtect do not intercept LunaticChat's channel chat messages by default. - -However, plugins that use Paper API's `originalMessage()` to retrieve messages may intercept LunaticChat's channel chat messages. diff --git a/docs/src/en/admin-guide/channel-chat/logs.md b/docs/src/en/admin-guide/channel-chat/logs.md deleted file mode 100644 index 632a572..0000000 --- a/docs/src/en/admin-guide/channel-chat/logs.md +++ /dev/null @@ -1,119 +0,0 @@ -# Channel Chat: Logs <Badge type="tip" text="v0.7.0" /> - -Channel chat logs are a record of all messages and activities that occur within the chat. - -::: warning Compatibility with Plugins like CoreProtect - -As of v0.7.0, LunaticChat's channel chat feature is not compatible with logging plugins like CoreProtect. - -::: - -## Checking Channel Chat Logs - -Channel chat logs are stored in the `plugins/LunaticChat/logs/channelchat/` directory. - -Channel chat log files are saved in the following format: - -``` -{"timestamp":"2026-01-31T08:54:18.504343071Z","playerId":"ceaea267-39dd-3bac-931c-761ada671ebe","playerName":"m1sk9","channelId":"test","message":"Hello"} -``` - -## About File Size - -Each line is a complete JSON object, separated by line breaks, and the file as a whole is not a JSON array. - -```text -plugins/LunaticChat/logs/ -├── channel-messages-2026-01-17.json (5.2 MB) -├── channel-messages-2026-01-18.json (4.8 MB) -├── channel-messages-2026-01-19.json (6.1 MB) -├── channel-messages-2026-01-20.json (5.5 MB) -├── channel-messages-2026-01-21.json (7.2 MB) <- Weekend, active -├── channel-messages-2026-01-22.json (6.9 MB) -├── channel-messages-2026-01-23.json (4.3 MB) -├── channel-messages-2026-01-24.json (5.0 MB) -├── channel-messages-2026-01-25.json (5.4 MB) -├── channel-messages-2026-01-26.json (4.9 MB) -├── channel-messages-2026-01-27.json (6.2 MB) -├── channel-messages-2026-01-28.json (7.5 MB) -├── channel-messages-2026-01-29.json (5.8 MB) -├── channel-messages-2026-01-30.json (6.0 MB) -└── channel-messages-2026-01-31.json (2.1 MB) <- Today (in progress) -``` - -Total: approximately 83 MB - -With a 30-day retention setting, the January 17 file will be automatically deleted tomorrow. - -### Size per Message - -Channel chat log entries are approximately 200 bytes per line. - -Assuming 1000 messages per hour: - -```text -1000 msg/h × 24h × 220 bytes = 5,280,000 bytes ≈ 5.3 MB/day -``` - -With the default 30-day retention setting, this amounts to approximately **159 MB**. - -```text -5.3 MB × 30 days = 159 MB -``` - -## Visualization with Grafana Loki - -Due to the JSON format, using Promtail to ingest channel chat logs into Grafana Loki will parse them for easier reading. - -```text -2026-01-31 10:23:45.123 {job="lunatichat", player="Steve", channel="Global"} -Hello everyone! - -2026-01-31 10:24:12.456 {job="lunatichat", player="Alex", channel="Global"} -Hi Steve! - -2026-01-31 10:25:03.789 {job="lunatichat", player="Notch", channel="Development Team"} -Working on new features -``` - -::: tip Filtering Examples - -Examples of querying logs in Grafana Loki: - -```text -{job="lunatichat"} |= "new features" -{job="lunatichat", channel="Global"} -{job="lunatichat", player="Steve"} -``` - -::: - -## Command Line Checking Examples - -### View the latest 10 entries - -```bash -tail -n 10 plugins/LunaticChat/logs/channel-messages-2026-01-31.json | jq -``` - -### Extract messages from a specific player - -```bash -cat plugins/LunaticChat/logs/channel-messages-*.json | \ -jq 'select(.playerName=="Steve")' -``` - -### Count messages from a specific channel - -```bash -cat plugins/LunaticChat/logs/channel-messages-*.json | \ -jq 'select(.channelId=="global")' | wc -l -``` - -### Message count by date - -```bash -for file in plugins/LunaticChat/logs/channel-messages-*.json; do -echo "$file: $(wc -l < $file) messages" -done -``` diff --git a/docs/src/en/admin-guide/configuration.md b/docs/src/en/admin-guide/configuration.md deleted file mode 100644 index 61d99ef..0000000 --- a/docs/src/en/admin-guide/configuration.md +++ /dev/null @@ -1,326 +0,0 @@ -# Configuration - -```yaml -# ---------------------------------------------- -# -------------- LunaticChat --------------- -# ---------------------------------------------- -# -# Docs: https://lc.m1sk9.dev -# GitHub: https://github.com/m1sk9/LunaticChat -# -# This configuration file is for customizing LunaticChat's behavior. -# Please specify appropriate values to ensure LunaticChat functions correctly. -# -# For detailed configuration options, please refer to the documentation: -# Japanese: https://lc.m1sk9.dev/guide/admin/configuration -# English: https://lc.m1sk9.dev/en/guide/admin/configuration -# ---------------------------------------------- - -# If enabled, Activate LunaticChat's debug mode, which provides detailed logging for troubleshooting. -debug: false - -# Path to the YAML file storing player settings -userSettingsFilePath: 'player-settings.yaml' - -# If enabled, LunaticChat will check for updates on startup. -checkForUpdates: true - -# Plugin Configuration Language. This setting applies only to player feedback and does not affect plugin logs or similar outputs. -language: 'en' - -# ---------------------------------------------- -# ----------- Features Settings ------------ -# ---------------------------------------------- - -features: - quickReplies: - # If enabled, the quick reply feature via the /reply command will be activated. - enabled: true - japaneseConversion: - # If enabled, enables the conversion function from Roman letters to hiragana. - enabled: false - cache: - # Specifies the maximum number of entries to store in the Romanization conversion cache. - maxEntries: 500 - # Specify the interval (in seconds) for saving the Romanization conversion cache to disk. - saveIntervalSeconds: 300 - # Specify the file path where the cache for Romanization conversion is saved. - filePath: 'conversion_cache.json' - api: - # Specify the timeout duration (in milliseconds) for API requests to the Romanization conversion service. - timeout: 3000 - # Specify the number of retry attempts for failed API requests to the Romanization conversion service. - retryAttempts: 2 - channelChat: - # If enabled, channel-based chat functionality will be activated. - enabled: false - # Maximum number of channels that can be created per server. Set to 0 for unlimited. - maxChannelsPerServer: 0 - # Maximum number of members allowed in a single channel. Set to 0 for unlimited. - maxMembersPerChannel: 0 - # Maximum number of channels a single player can join. Set to 0 for unlimited. - maxMembershipPerPlayer: 0 - # Channel message logging configuration - messageLogging: - # If enabled, all channel messages will be logged to NDJSON files for analysis and archival. - enabled: true - # Number of days to retain log files. Set to 0 to keep logs indefinitely. - retentionDays: 30 - # Maximum size of a single log file in megabytes. Files exceeding this size will stop accepting new entries. - maxFileSizeMB: 100 - velocityIntegration: - # If enabled, enables integration with Velocity proxy plugin. - # This allows Paper and Velocity instances to communicate and verify compatibility. - enabled: false - # If enabled, global chat messages will be shared across all Paper servers connected to the Velocity proxy. - # Players on different servers can communicate through the GLOBAL chat mode. - crossServerGlobalChat: false - # Server name to display in cross-server chat (e.g., "survival", "creative", "lobby"). - # This should match the server name defined in your Velocity configuration. - serverName: 'Unknown' - # Size of the message deduplication cache to prevent duplicate messages from appearing. - # Keeps track of the most recent N message IDs to filter out duplicates. - messageDeduplicationCacheSize: 100 - -# ---------------------------------------------- -# --------- Message Format Settings -------- -# ---------------------------------------------- -# -# Customize the format of various chat messages here. -# You can use placeholders such as {sender}, {message}, etc. -# -# {sender} - The name of the message sender -# {recipient} - The name of the message recipient -# {message} - The content of the message -# {channel} - The name of the chat channel (only for channel chat) -# {server} - The name of the server (only for Velocity cross-server chat) -# ---------------------------------------------- - -messageFormat: - # Configure the format for direct messages sent via /tell or /msg - directMessageFormat: '§7[§e{sender} §7>> §e{recipient}§7] §f{message}' - # Configure the format for messages sent in channel chat - channelMessageFormat: '§7[§b#{channel}§7] §e{sender}: §f{message}' - # Configure the format for global chat messages in Velocity integration - crossServerGlobalChatFormat: '§7[§6{server}§7] §e{sender}: §f{message}' -``` - -## General Settings - -### `debug` - -- Type: `boolean` -- Default: `false` - -Starts LunaticChat in debug mode. - -### `userSettingsFilePath` - -- Type: `string` -- Default: `player-settings.yaml` - -Specifies the path to the YAML file where LunaticChat saves player settings. - -### `checkForUpdates` - -- Type: `boolean` -- Default: `true` - -Configures whether to prompt for LunaticChat updates at startup and when players with the required permissions join the server. - -### `language` - -- Type: `string` -- Default: `en` - -Specifies the language for LunaticChat's player-facing messages. - -### Supported languages: - -- `en`: English -- `ja`: Japanese (日本語) - -## Features Settings - -### `features.quickReplies.enabled` - -- Type: `boolean` -- Default: `true` - -Enables the quick reply feature via the [`/reply`](../player-guide/commands/reply.md) command in LunaticChat. - -When disabled, the [`/reply`](../player-guide/commands/reply.md) command will not be registered with Paper and cannot be used. - -### `features.japaneseConversion.enabled` - -- Type: `boolean` -- Default: `false` - -Enables the conversion feature from romaji to hiragana. - -### `features.japaneseConversion` - -#### `cache.maxEntries` - -- Type: `integer` -- Default: `500` - -Specifies the maximum number of entries to store in the romanization conversion cache. - -When this value is exceeded, the oldest entries are deleted first. - -Setting a higher value improves conversion performance, but also increases memory usage and cache file size. - -#### `cache.saveIntervalSeconds` - -- Type: `integer` -- Default: `300` - -Specifies the interval (in seconds) for saving the romanization conversion cache to disk. - -#### `cache.filePath` - -- Type: `string` -- Default: `conversion_cache.json` - -Specifies the file path where the romanization conversion cache is saved. - -The path set here is interpreted as a relative path from the `plugins/LunaticChat/` directory. - -#### `api.timeout` - -- Type: `integer` -- Default: `3000` - -Specifies the timeout duration (in milliseconds) for API requests to the romanization conversion service. - -#### `api.retryAttempts` - -- Type: `integer` -- Default: `2` - -Specifies the number of retry attempts for failed API requests to the romanization conversion service. - -### `features.channelChat` - -#### `enabled` - -- Type: `boolean` -- Default: `false` - -Enables channel-based chat functionality. - -#### `maxChannelsPerServer` - -- Type: `integer` -- Default: `0` - -Specifies the maximum number of channels that can be created per server. - -Set to `0` for unlimited. - -#### `maxMembersPerChannel` - -- Type: `integer` -- Default: `0` - -Specifies the maximum number of members that can join a single channel. - -Set to `0` for unlimited. - -#### `maxMembershipPerPlayer` - -- Type: `integer` -- Default: `0` - -Specifies the maximum number of channels a single player can join. - -Set to `0` for unlimited. - -#### `messageLogging.enabled` - -- Type: `boolean` -- Default: `true` - -Specifies whether to log channel chat messages in NDJSON format. - -#### `messageLogging.retentionDays` - -- Type: `integer` -- Default: `30` - -Specifies the number of days to retain channel chat log files. - -Set to `0` to never delete log files. - -#### `messageLogging.maxFileSizeMB` - -- Type: `integer` -- Default: `100` - -Specifies the maximum size (in megabytes) of channel chat log files. - -Log files exceeding `maxFileSizeMB` will stop accepting new entries. - -### `features.velocityIntegration` - -#### `enabled` - -- Type: `boolean` -- Default: `false` - -Enables integration with Velocity proxy plugin. - -#### `crossServerGlobalChat` - -- Type: `boolean` -- Default: `false` - -Specifies whether to share chat messages across all Paper servers connected to the Velocity proxy. - -#### `serverName` - -- Type: `string` -- Default: `Unknown` - -Specifies the server name to display in Velocity cross-server chat. - -Examples: `survival`, `creative`, `lobby` - -#### `messageDeduplicationCacheSize` - -- Type: `integer` -- Default: `100` - -Specifies the size of the message deduplication cache. - -## Message Format Settings - -Available placeholders: - -- `{sender}`: Name of the message sender -- `{recipient}`: Name of the message recipient -- `{message}`: Content of the message -- `{channel}`: Name of the chat channel (only for channel chat) -- `{server}`: Name of the server (only for Velocity cross-server chat) - -### `messageFormat.directMessageFormat` - -- Type: `string` -- Default: `§7[§e{sender} §7>> §e{recipient}§7] §f{message}` - -Specifies the format for messages sent via direct message ([`/tell`](../player-guide/commands/tell.md) or [`/reply`](../player-guide/commands/reply.md) commands). - -### `messageFormat.channelMessageFormat` - -- Type: `string` -- Default: `§7[§b#{channel}§7] §e{sender}: §f{message}` - -Specifies the format for messages sent in channel chat. - -### `messageFormat.crossServerGlobalChatFormat` - -- Type: `string` -- Default: `§7[§6{server}§7] §e{sender}: §f{message}` - -Specifies the format for messages sent via Velocity cross-server global chat. diff --git a/docs/src/en/admin-guide/getting-started.md b/docs/src/en/admin-guide/getting-started.md deleted file mode 100644 index c7654a0..0000000 --- a/docs/src/en/admin-guide/getting-started.md +++ /dev/null @@ -1,42 +0,0 @@ -# Getting Started - -## Installation - -Install LunaticChat. LunaticChat can be obtained from: - -- [GitHub](https://github.com/m1sk9/LunaticChat/releases) -- [Modrinth](https://modrinth.com/project/lunaticchat) - -Place the downloaded plugin file in your server's `plugins` folder and restart the server. - -## Configuration - -When LunaticChat starts, the following files will be created: - -- `plugins/LunaticChat/config.yml`: Plugin configuration file -- `plugins/LunaticChat/player-settings.yaml`: User-specific settings file -- `plugins/LunaticChat/conversion_cache.json`: Romanization conversion cache file - -Open the configuration file `config.yml` and modify the settings as needed. For details on configuration options, refer to the [Configuration Guide](./configuration.md). - -## Permissions - -Set LunaticChat's permissions using a permission management plugin like LuckPerms. - -Basic permissions can be configured using Paper or Velocity's default permission system (`OP` / `non OP`), but LuckPerms is recommended for more detailed control. - -- For details on permission nodes, refer to the [Permissions Guide](./permissions.md). -- For permission nodes corresponding to each command feature, refer to the [Command Reference](../player-guide/index.md). - -## Restart the server - -After completing the configuration, restart the server to apply the changes. - -This completes the basic setup of LunaticChat. - -## What's next? - -- [Cache System](./cache.md): Explains LunaticChat's cache system. -- [Channel Chat](./channel-chat/introduction.md): Overview of the channel chat feature. -- [Command List](../player-guide/index.md): View the list of LunaticChat commands. -- [Permissions List](./permissions.md): View LunaticChat's permission nodes. diff --git a/docs/src/en/admin-guide/management-data.md b/docs/src/en/admin-guide/management-data.md deleted file mode 100644 index 0255bf0..0000000 --- a/docs/src/en/admin-guide/management-data.md +++ /dev/null @@ -1,88 +0,0 @@ -# Data and Logs - -::: danger Do Not Edit - -These data files are essential to the operation of LunaticChat. Direct editing may cause data corruption or unexpected behavior. Do not directly edit these files unless you are backing up data. - -::: - -## Data Storage Location - -LunaticChat saves channel data and configuration information to local disk. - -- `channels.json`: Stores channel information. -- `conversion_cache.json`: Stores cache for channel conversion. -- `player-settings.yaml`: Stores player-specific settings. - -::: tip Regular Backups - -To ensure the safety of your LunaticChat data, we recommend creating regular backups. - -::: - -### `channels.json` - -The `channels.json` file stores information about channels managed by LunaticChat. This file contains information such as channel names and participant lists. - -```json -{ - "channels": { - "general-channel": { - "id": "general-channel", - "name": "General Channel", - "ownerId": "a01e3843-e521-3998-958a-f459800e4d11", - "createdAt": 1769507213150, - "bannedPlayers": ["ceaea267-39dd-3bac-931c-761ada671ebe"] - } - }, - "members": { - "general-channel": [ - { - "channelId": "test2", - "playerId": "a01e3843-e521-3998-958a-f459800e4d11", - "role": "OWNER", - "joinedAt": 1769507213150 - } - ] - }, - "activeChannels": { - "a01e3843-e521-3998-958a-f459800e4d11": "test2" - } -} -``` - -### `conversion_cache.json` - -The `conversion_cache.json` file stores cache for channel conversion. This file contains channel conversion information for each player. - -For more information about the cache system, see [here](./cache.md). - -```json -{ "version": "1", "entries": { "hi": "日" } } -``` - -### `player-settings.yaml` - -The `player-settings.yaml` file stores player-specific settings. This file contains individual player settings. - -```yaml -version: 1 -japaneseConversion: - 'aed5efd4-551b-3965-bc28-ae21aa072a66': false - 'ceaea267-39dd-3bac-931c-761ada671ebe': false -directMessageNotification: - 'aed5efd4-551b-3965-bc28-ae21aa072a66': true - 'ceaea267-39dd-3bac-931c-761ada671ebe': true -channelMessageNotification: - 'ceaea267-39dd-3bac-931c-761ada671ebe': true -``` - -## Cache Version - -Files used for disk caching include a `version` field to accommodate changes in cache format as LunaticChat is upgraded. - -If the version does not match, LunaticChat recognizes the cache file as **old format cache**, ignores the contents, and recreates it in the new format. - -```json -{ "version": "1", "entries": {} } -``` diff --git a/docs/src/en/admin-guide/permissions.md b/docs/src/en/admin-guide/permissions.md deleted file mode 100644 index dd70b0e..0000000 --- a/docs/src/en/admin-guide/permissions.md +++ /dev/null @@ -1,167 +0,0 @@ -# Permissions - -For details on configuration using LuckPerms, refer to the [LuckPerms Wiki](https://luckperms.net/wiki/Home). - -## `lunaticchat.*` - -### `lunaticchat.spy` - -- Default: `OP` - -Visualizes communication via [`/tell`](../player-guide/commands/tell.md) / [`/reply`](../player-guide/commands/reply.md) commands. - -Players with this permission will have messages from other players' [`/tell`](../player-guide/commands/tell.md) / [`/reply`](../player-guide/commands/reply.md) commands broadcast to them. - -### `lunaticchat.noticeUpdate` - -- Default: `OP` - -Receives LunaticChat update notifications. - -[You must have `checkForUpdates` enabled](./configuration.md#checkforupdates) to receive notifications. - -### `lunaticchat.channelbypass` - -- Default: `OP` - -Bypasses moderation features and restrictions on private channels. - -## `lunaticchat.command.*` - -### `lunaticchat.command.tell` - -- Default: `non OP` - -Toggles the use of the [`/tell`](../player-guide/commands/tell.md) command. - -### `lunaticchat.command.reply` - -- Default: `non OP` - -Toggles the use of the [`/reply`](../player-guide/commands/reply.md) command. - -### `lunaticchat.command.lc` - -- Default: `non OP` - -Toggles the use of the `/lc` command. - -### `lunaticchat.command.lc.settings` - -- Default: `non OP` - -Toggles the use of the [`/lc settings`](../player-guide/commands/lc/settings.md) command. - -### `lunaticchat.command.lc.status` - -- Default: `non OP` - -Toggles the use of the [`/lc status`](../player-guide/commands/lc/status.md) command. - -### `lunaticchat.command.lc.channel` - -- Default: `non OP` - -Toggles the use of the [`/lc channel`](../player-guide/commands/lc/channel.md) command. - -### `lunaticchat.command.lc.channel.create` - -- Default: `non OP` - -Toggles the use of the [`/lc channel create`](../player-guide/commands/lc/channel.md) command. - -### `lunaticchat.command.lc.channel.list` - -- Default: `non OP` - -Toggles the use of the [`/lc channel list`](../player-guide/commands/lc/channel.md) command. - -### `lunaticchat.command.lc.channel.join` - -- Default: `non OP` - -Toggles the use of the [`/lc channel join`](../player-guide/commands/lc/channel.md) command. - -### `lunaticchat.command.lc.channel.leave` - -- Default: `non OP` - -Toggles the use of the [`/lc channel leave`](../player-guide/commands/lc/channel.md) command. - -### `lunaticchat.command.lc.channel.switch` - -- Default: `non OP` - -Toggles the use of the [`/lc channel switch`](../player-guide/commands/lc/channel.md) command. - -### `lunaticchat.command.lc.channel.status` - -- Default: `non OP` - -Toggles the use of the [`/lc channel status`](../player-guide/commands/lc/channel.md) command. - -### `lunaticchat.command.lc.channel.info` - -- Default: `non OP` - -Toggles the use of the [`/lc channel info`](../player-guide/commands/lc/channel.md) command. - -### `lunaticchat.command.lc.channel.delete` - -- Default: `non OP` - -Toggles the use of the [`/lc channel delete`](../player-guide/commands/lc/channel.md) command. - -### `lunaticchat.command.lc.channel.invite` - -- Default: `non OP` - -Toggles the use of the [`/lc channel invite`](../player-guide/commands/lc/channel.md) command. - -### `lunaticchat.command.lc.channel.kick` - -- Default: `non OP` - -Toggles the use of the [`/lc channel kick`](../player-guide/commands/lc/channel.md) command. - -### `lunaticchat.command.lc.channel.ban` - -- Default: `non OP` - -Toggles the use of the [`/lc channel ban`](../player-guide/commands/lc/channel.md) command. - -### `lunaticchat.command.lc.channel.unban` - -- Default: `non OP` - -Toggles the use of the [`/lc channel unban`](../player-guide/commands/lc/channel.md) command. - -### `lunaticchat.command.lc.channel.mod` - -- Default: `non OP` - -Toggles the use of the [`/lc channel mod`](../player-guide/commands/lc/channel.md) command. - -### `lunaticchat.command.lc.channel.ownership` - -- Default: `non OP` - -Toggles the use of the [`/lc channel ownership`](../player-guide/commands/lc/channel.md) command. - -### `lunaticchat.command.lcv.status` - -- Default: `OP` - -Toggles the use of the [`/lcv status`](../player-guide/commands/lcv/status.md) command. - -### `lunaticchat.command.jp` <Badge type="danger" text="Deprecated: Will be removed in v1.0.0" /> - -- Default: `non OP` - -Toggles the use of the [`/jp`](../player-guide/commands/jp.md) command. - -### `lunaticchat.command.notice` <Badge type="danger" text="Deprecated: Will be removed in v1.0.0" /> - -- Default: `non OP` - -Toggles the use of the [`/notice`](../player-guide/commands/notice.md) command. diff --git a/docs/src/en/admin-guide/velocity.md b/docs/src/en/admin-guide/velocity.md deleted file mode 100644 index 97f2a7f..0000000 --- a/docs/src/en/admin-guide/velocity.md +++ /dev/null @@ -1,78 +0,0 @@ -# Velocity Integration (Cross-Server Chat) <Badge type="tip" text="v0.8.0" /> - -This feature enables cross-server chat between Paper servers connected through a Velocity proxy server. - -::: warning Experimental Feature - -This feature is currently provided as an experimental feature. Specifications may change in future updates. - -::: - -## Enabling Integration - -To enable Velocity integration, follow these steps: - -1. Install the Velocity version of LunaticChat on the Velocity side. -2. Open `plugins/LunaticChat/config.yml` on each Paper server and set `velocity.enabled` to `true`. -3. Start Velocity and Paper, and verify that the integration completion message appears. - -## Plugin Version and Protocol Version - -For Velocity and Paper's LunaticChat to integrate correctly, both plugin versions and protocol versions must be compatible. - -- Ensure that the LunaticChat versions on Velocity and Paper sides are the same. - - Compatibility may not be guaranteed when using beta or development versions. -- Ensure that protocol versions match. - -::: danger Regarding LunaticChat versions prior to v0.7.0 - -LunaticChat versions prior to v0.7.0 are not backward compatible with the Velocity version. - -They cannot be used together, so if you are using LunaticChat prior to v0.7.0, do not use the Velocity integration feature. - -::: - -## How to Check Integration Status - -To verify that Velocity integration is working properly, use the `/lcv status` command. - -The current protocol version and connection state will be displayed. - -::: warning Behavior When Versions Mismatch - -When the version or protocol version does not match, the Velocity integration feature is disabled, but **the plugin itself continues to operate**. - -You can check the connection state and error details using the `/lcv status` command. To reconnect, ensure that the LunaticChat version / protocol version on Velocity and Paper sides match. - -::: - -::: tip About Velocity Integration Timing - -LunaticChat connects to Velocity **when the first player joins the server** after startup. - -Therefore, if you run the `/lcv status` command immediately after server startup, the Velocity integration may not be established yet. - -::: - -## Troubleshooting - -If you encounter issues with Velocity integration, check the following: - -- **Run the `/lcv status` command to check the connection state**. If there are errors such as version mismatches, an error message will be displayed. -- Ensure that the LunaticChat version / protocol version on Velocity and Paper sides are the same. -- Verify that LunaticChat settings are correct. -- Ensure that network connection between Velocity server and Paper servers is working properly. - -## Cross-Server Chat - -When Velocity integration is enabled, chat messages are shared across all servers connected through the proxy server. - -## Features Compatible with Velocity Integration - -The main features available during Velocity integration are as follows: - -| | Compatibility | Behavior | Notes | -| ----------------- | ------------- | ------------------------------------------------------------ | ---------------------------------------------------- | -| Direct Messages | × | `/tell` and `/reply` commands operate only within the server | Direct messages do not support Velocity integration. | -| Channel Chat | × | Channel chat operates only within the server | Channel chat does not support Velocity integration. | -| Kana/Romanization | ◯ | Kana/Romanization works across all servers | | diff --git a/docs/src/en/index.md b/docs/src/en/index.md deleted file mode 100644 index 63441df..0000000 --- a/docs/src/en/index.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -# https://vitepress.dev/reference/default-theme-home-page -layout: home - -hero: - name: 'LunaticChat' - tagline: A next-generation chat plugin for Paper, Folia and Velocity. - actions: - - theme: brand - text: Player Guide - link: /en/player-guide/channel-chat/about - - theme: brand - text: Admin Guide - link: /en/admin-guide/getting-started - - theme: alt - text: GitHub - link: https://github.com/m1sk9/LunaticChat - image: - src: /icon.png - alt: LunaticChat Logo - -features: - - title: 1-on-1 Direct Messaging - details: Chat one-on-one using /tell or /msg commands - icon: ✉️ - - title: Quick Reply - details: Quickly reply to the most recent message sender with /reply - icon: 💌 - - title: Japanese Romanization Conversion - details: Automatically converts messages input in romaji to Japanese - icon: 🌍 - - title: Channel Chat Feature - details: Create and manage chat channels, send private messages between specific players - icon: ☎️ - - title: Multi-Platform Support - details: Support for multi-platform Paper, Folia and Velocity, enabling cross-server chat - icon: 🚀 - - title: High-Speed Performance with Caching - details: Uses caching for romaji-to-Japanese conversion, operating faster than traditional LunaChat - icon: 🎈 - - title: Latest Version Support - details: Reduces dependencies on other plugins, always supporting the latest Minecraft versions - icon: ⛏️️ ---- diff --git a/docs/src/en/player-guide/about.md b/docs/src/en/player-guide/about.md deleted file mode 100644 index ef64e3b..0000000 --- a/docs/src/en/player-guide/about.md +++ /dev/null @@ -1,60 +0,0 @@ -# About LunaticChat - -LunaticChat is a chat plugin for the Minecraft server software Paper/Velocity. - -In 2013, [ucchyocean](https://github.com/ucchyocean) released [LunaChat](https://github.com/ucchyocean/LunaChat). LunaticChat is developed as a successor to LunaChat, rewritten from scratch to work with the latest versions. - -LunaChat is no longer being developed and does not support the latest Minecraft versions. While many server administrators have forked LunaChat, LunaticChat is designed as an alternative that inherits LunaChat's features while being designed to work with the latest Minecraft versions. - -## Key Features - -- **Lightweight and Fast**: LunaticChat is designed to maintain high performance while minimizing server load. -- **1-on-1 Direct Messaging**: Chat one-on-one using /tell or /msg commands. -- **Quick Reply**: Quickly reply to the most recent message sender with /reply. -- **Japanese Romanization Conversion**: Automatically converts messages input in romaji to Japanese. -- **CoreProtect Support**: LunaticChat's chat logs are compatible with CoreProtect. -- **High-Speed Performance with Caching**: Uses caching for romaji-to-Japanese conversion, operating faster than traditional LunaChat. -- **Latest Version Support**: Reduces dependencies on other plugins, always supporting the latest Minecraft versions. - -## Comparison - -| | LunaticChat | LunaChat | -| ------------------- | ------------------------------- | -------------------------------------- | -| Development Status | Actively Developed | Development Ended | -| Supported Platforms | Paper / Velocity | Bukkit / Spigot / BungeeCord | -| Supported Versions | 1.21.x ~ | Up to 1.16.x | -| Language | Kotlin | Java | -| Plugin Dependencies | None | EssentialsX, etc. | -| Caching | Yes | No | -| Documentation | Yes | No | -| License | GNU General Public License v3.0 | GNU Lesser General Public License v3.0 | - -## FAQ - -### Is LunaticChat free to use? - -As open-source software, LunaticChat can be used, modified, and distributed for free. - -### Which Minecraft versions does LunaticChat support? - -LunaticChat supports Minecraft version 1.21.x and later. - -### Can LunaticChat be used alongside other chat plugins? - -LunaticChat can be used alongside other chat plugins, but to avoid conflicts, ensure that chat-related features do not overlap. - -### Where can I get support for LunaticChat? - -Support for LunaticChat is available on the [official GitHub Discussions](https://github.com/m1sk9/LunaticChat/discussions). - -### Where can I get the source code for LunaticChat? - -The source code for LunaticChat is available on [GitHub](https://github.com/m1sk9/LunaticChat). - -### Is there a Spigot/BungeeCord version of LunaticChat? - -No. There are no plans to support these platforms. Please use Paper/Velocity. - -### Under what license is LunaticChat distributed? - -LunaticChat is distributed under the GNU General Public License v3.0 (GPLv3). diff --git a/docs/src/en/player-guide/channel-chat/about.md b/docs/src/en/player-guide/channel-chat/about.md deleted file mode 100644 index 404075d..0000000 --- a/docs/src/en/player-guide/channel-chat/about.md +++ /dev/null @@ -1,111 +0,0 @@ -# Channel Chat <Badge type="tip" text="v0.6.0" /> <Badge type="warning" text="Experimental" /> - -This feature allows specific players to share chat. - -::: warning Experimental Feature - -This feature is currently implemented experimentally, and specifications may change in future updates. - -Since this is a large-scale feature, we plan to implement it gradually rather than all at once. - -For detailed implementation plans, see the [Roadmap (m1sk9/LunaticChat #54)](https://github.com/m1sk9/LunaticChat/issues/54). - -::: - -::: tip This feature must be enabled on the server - -If channel chat is disabled on the server, these features cannot be used. - -Please contact your server administrator. - -::: - -## Creating a Channel - -To use channel chat, you must first create a chat channel. - -Use the [`/lc channnel create`](../commands/lc/channel.md#lc-channel-create-channel-id-channel-name-channel-description-private-setting) command to create a chat channel. - -``` -/lc channel create <channel-id> <channel-name> [channel-description] [private-setting] -``` - -- `<channel-id>` specifies the channel ID. -- `<channel-name>` specifies the channel name. -- `[channel-description]` specifies the channel description (optional). - - The description will be displayed when viewing the channel list with the `/lc channel list` command. -- `[private-setting]` specifies the channel's privacy setting. - - If `true` is specified, it will be created as a private channel, and only invited players can join. - - If `false` is specified or omitted, it will be created as a public channel, and anyone can join. - -::: tip Channel ID Requirements - -Channel IDs must follow these requirements: - -- Must be between 3 and 30 characters long -- Can only contain alphanumeric characters, underscores (\_), and hyphens (-) - -::: - -::: warning Notes on Entering Channel Names and Descriptions - -When entering channel names and descriptions, arguments must be enclosed in `"` (double quotes). - -Example: - -``` -/lc channel create pvp_channel "PvP Enthusiasts Club" "A gathering of people who love PvP" false -``` - -::: - -The channel will be created and a confirmation message will be displayed in chat. - -## Joining a Channel - -To join a created channel, use the [`/lc channel join`](../commands/lc/channel.md#lc-channel-join-channel-id) command. - -``` -/lc channel join <channel-id> -``` - -When you join a channel, all your chat messages will be visible only to players in that channel. - -## Viewing the Channel List - -To view the list of channels you can join, use the [`/lc channel list`](../commands/lc/channel.md#lc-channel-list) command. - -``` -/lc channel list -``` - -A list of available channels will be displayed in the chat. You can click on them or use the [`/lc channel join`](#joining-a-channel) command to join a channel. - -## Sending to Global Chat - -While in a channel, all your chat messages are visible only to players in that channel. - -To temporarily send a message to global chat, prefix your message with `!`. - -``` -!Hello everyone, how are you? -``` - -## Difference Between Active Channel and Membership Status - -In LunaticChat, a player's active channel and membership status are managed separately. - -- Active channel: The channel used in channel chat mode -- Membership status: List of channels the player has joined - -Only one channel can be designated as the active channel at a time. To switch the active channel to a channel in your membership status, use the [`/lc channel switch`](../commands/lc/channel.md#lc-channel-switch-channel-id) command. - -``` -/lc channel switch <channel-id> -``` - -Removing a channel from your active status does not remove it from your membership status. To leave a channel, switch to it as your active channel first, then use the [`/lc channel leave`](../commands/lc/channel.md#lc-channel-leave) command. - -``` -/lc channel leave -``` diff --git a/docs/src/en/player-guide/channel-chat/moderation.md b/docs/src/en/player-guide/channel-chat/moderation.md deleted file mode 100644 index 14e2c8b..0000000 --- a/docs/src/en/player-guide/channel-chat/moderation.md +++ /dev/null @@ -1,95 +0,0 @@ -# Channel Management - -You can manage member behavior within a channel using channel chat moderation features. - -::: danger Warning - -These moderation features are only available for LunaticChat channel chat. - -If you need to punish actual rule violators, we recommend reporting them to the server administrator. - -::: - -## Moderation Feature Specifications - -Moderation features have several specifications: - -- Players with Bypass permissions are not affected by moderation features. - - This means you cannot use these features against server administrators. -- To use moderation features, you need the respective channel role and server permissions. -- The effects of moderation features are independent for each channel. - - For example, a player permanently banned (BAN) from one channel can chat normally in other channels. - -## Roles - -Channels have the following roles: - -- Member: Regular players participating in the channel -- Moderator: Players who can use channel moderation features -- Owner: The channel creator who can use all moderation features - -::: tip Moderation by Server Administrators - -Server administrators uniformly have the same permissions as owner permissions in all channels. - -::: - -## Temporarily Expel a Member (Kick) - -To temporarily expel a member from a channel, use the [`/lc channel kick`](../commands/lc/channel.md#lc-channel-kick-player-id) command. - -``` -/lc channel kick <player ID> -``` - -Executing this command will immediately expel the specified player from the channel. - -However, the expelled player can rejoin. - -## Permanently Ban a Member (Ban) - -To permanently ban a member from a channel, use the [`/lc channel ban`](../commands/lc/channel.md#lc-channel-ban-player-id) command. - -``` -/lc channel ban <player ID> -``` - -Executing this command will immediately expel the specified player from the channel and also prohibit them from rejoining. - -## Unban a Permanently Banned Member - -To unban a permanently banned member, use the [`/lc channel unban`](../commands/lc/channel.md#lc-channel-unban-player-id) command. - -``` -/lc channel unban <player ID> -``` - -## Appoint/Dismiss Moderators - -To appoint/dismiss a channel member as a moderator, use the [`/lc channel mod`](../commands/lc/channel.md#lc-channel-mod-player-id) command. - -``` -/lc channel mod <player ID> -``` - -Executing this command will appoint the specified player as a moderator. Executing this command again on an appointed player will dismiss them from being a moderator. - -## Transfer Owner Permissions - -To transfer channel owner permissions to another member, use the [`/lc channel ownership`](../commands/lc/channel.md#lc-channel-ownership-player-id) command. - -``` -/lc channel ownership <player ID> -``` - -Executing this command will transfer all owner permissions to the specified player. The original owner becomes a moderator. - -::: danger Important Notes on Execution - -- Owner permission transfer is an irreversible operation. - - Once transferred, the original owner cannot regain owner permissions unless the player with owner permissions transfers them again. - - This applies even to server administrators. -- The recipient of owner permissions must be a member of the channel. -- Owner permissions can use all moderation features and delete the channel, which is a powerful privilege. Choose carefully to whom you transfer permissions. - -::: diff --git a/docs/src/en/player-guide/channel-chat/private-channel.md b/docs/src/en/player-guide/channel-chat/private-channel.md deleted file mode 100644 index 414f783..0000000 --- a/docs/src/en/player-guide/channel-chat/private-channel.md +++ /dev/null @@ -1,25 +0,0 @@ -# Private Channels - -Private channels are chat channels that only specific users can join. - -## Creating a Private Channel - -To create a private channel, use the [`/lc channel create`](../commands/lc/channel.md) command and specify `true` for the private setting argument. - -``` -/lc channel create <channel ID> <channel name> [channel description] [private setting] -``` - -## Inviting to a Channel - -Private channels are not listed in the `/lc channel list` command and cannot be joined using the `/lc channel join` command. - -To join, you need to receive an invitation from the owner or moderator. - -To invite someone, use the [`/lc channel invite`](../commands/lc/channel.md#lc-channel-invite-player-id) command. - -``` -/lc channel invite <player ID> -``` - -The invited player automatically joins the channel. diff --git a/docs/src/en/player-guide/commands/jp.md b/docs/src/en/player-guide/commands/jp.md deleted file mode 100644 index 3ed57aa..0000000 --- a/docs/src/en/player-guide/commands/jp.md +++ /dev/null @@ -1,17 +0,0 @@ -# /jp <Badge type="tip" text="v0.1.0" /> <Badge type="tip" text="Paper" /> - -### `/jp [on | off]` <Badge type="danger" text="Deprecated: Will be removed in v1.0.0" /> - -::: danger Deprecated - -This command was deprecated in v0.5.0. Please use the [`/lc settings`](lc/settings.md) command instead. - -::: - -| Permission | -| ------------------------ | -| `lunaticchat.command.jp` | - -Toggles the romanization conversion setting. - -This setting is saved by UUID, so the setting will not be lost even if you change your MCID. diff --git a/docs/src/en/player-guide/commands/lc/channel.md b/docs/src/en/player-guide/commands/lc/channel.md deleted file mode 100644 index edb33c2..0000000 --- a/docs/src/en/player-guide/commands/lc/channel.md +++ /dev/null @@ -1,77 +0,0 @@ -# /lc channel <Badge type="tip" text="v0.6.0" /> <Badge type="tip" text="Paper" /> - -### `/lc channel create <channel-id> <channel-name> [channel-description] [private-setting]` - -| Permission | -| --------------------------------------- | -| `lunaticchat.command.lc.channel.create` | - -Creates a channel. - -- `<channel-id>` specifies the channel ID. -- `<channel-name>` specifies the channel name. -- `[channel-description]` specifies the channel description (optional). - - The description will be displayed when viewing the channel list with the `/lc channel list` command. -- `[private-setting]` specifies the channel's privacy setting. - - If `true` is specified, it will be created as a private channel, and only invited players can join. - - If `false` is specified or omitted, it will be created as a public channel, and anyone can join. - -::: warning Notes on Entering Channel Names and Descriptions - -When entering channel names and descriptions, arguments must be enclosed in `"` (double quotes). - -Example: - -``` -/lc channel create pvp_channel "PvP Enthusiasts Club" "A gathering of people who love PvP" false -``` - -::: - -### `/lc channel list` - -| Permission | -| ------------------------------------- | -| `lunaticchat.command.lc.channel.list` | - -Displays the list of channels. - -### `/lc channel join <channel-id>` - -| Permission | -| ------------------------------------- | -| `lunaticchat.command.lc.channel.join` | - -Joins the specified channel. - -### `/lc channel leave` - -| Permission | -| -------------------------------------- | -| `lunaticchat.command.lc.channel.leave` | - -Leaves the currently active channel. - -### `/lc channel switch <channel-id>` - -| Permission | -| --------------------------------------- | -| `lunaticchat.command.lc.channel.switch` | - -Switches to the specified channel. Use this when you want to switch to another channel while in channel chat mode. - -### `/lc channel status` - -| Permission | -| --------------------------------------- | -| `lunaticchat.command.lc.channel.status` | - -Displays information about the currently joined and active channels. - -### `/lc channel delete <channel-id>` - -| Permission | -| --------------------------------------- | -| `lunaticchat.command.lc.channel.delete` | - -Deletes the specified channel. You must be the channel creator (owner). diff --git a/docs/src/en/player-guide/commands/lc/settings.md b/docs/src/en/player-guide/commands/lc/settings.md deleted file mode 100644 index a2bf4cf..0000000 --- a/docs/src/en/player-guide/commands/lc/settings.md +++ /dev/null @@ -1,19 +0,0 @@ -# /lc settings <Badge type="tip" text="v0.5.0" /> <Badge type="tip" text="Paper" /> - -### `/lc settings <key> [value]` - -| Permission | -| --------------------------------- | -| `lunaticchat.command.lc.settings` | - -Manages player settings for LunaticChat. If no value is specified, the current setting value will be displayed. - -This setting is saved by UUID, so the setting will not be lost even if you change your MCID. - -#### Available Keys - -| Key | Description | Default Value | -| ---------- | ------------------------------------------------------------------------------------------------ | ------------- | -| `japanese` | Toggles romanization conversion on or off. | `true` | -| `notice` | Toggles whether to receive notifications when receiving direct messages via `/tell` or `/reply`. | `true` | -| `chNotice` | Toggles whether to receive notifications when receiving channel chat messages. | `true` | diff --git a/docs/src/en/player-guide/commands/lc/status.md b/docs/src/en/player-guide/commands/lc/status.md deleted file mode 100644 index fe9a680..0000000 --- a/docs/src/en/player-guide/commands/lc/status.md +++ /dev/null @@ -1,9 +0,0 @@ -# /lc status <Badge type="tip" text="v0.5.0" /> <Badge type="tip" text="Paper" /> - -### `/lc status` - -| Permission | -| ------------------------------- | -| `lunaticchat.command.lc.status` | - -Displays the status of LunaticChat. diff --git a/docs/src/en/player-guide/commands/lcv/status.md b/docs/src/en/player-guide/commands/lcv/status.md deleted file mode 100644 index f54fd14..0000000 --- a/docs/src/en/player-guide/commands/lcv/status.md +++ /dev/null @@ -1,9 +0,0 @@ -# /lcv status <Badge type="tip" text="v0.8.0" /> <Badge type="tip" text="Velocity" /> - -### `/lcv status` - -| Permission | -| -------------------------------- | -| `lunaticchat.command.lcv.status` | - -Displays the current LunaticChat Velocity integration status. diff --git a/docs/src/en/player-guide/commands/notice.md b/docs/src/en/player-guide/commands/notice.md deleted file mode 100644 index fc74014..0000000 --- a/docs/src/en/player-guide/commands/notice.md +++ /dev/null @@ -1,17 +0,0 @@ -# /notice <Badge type="tip" text="v0.4.0" /> <Badge type="tip" text="Paper" /> - -### `/notice [on | off]` <Badge type="danger" text="Deprecated: Will be removed in v1.0.0" /> - -::: danger Deprecated - -This command was deprecated in v0.5.0. Please use the [`/lc settings`](lc/settings.md) command instead. - -::: - -| Permission | Aliases | -| ---------------------------- | ----------- | -| `lunaticchat.command.notice` | `/dmnotice` | - -Toggles notifications for direct messages sent via [`/tell`](tell.md) or [`/reply`](reply.md) commands on or off. - -This setting is saved by UUID, so the setting will not be lost even if you change your MCID. diff --git a/docs/src/en/player-guide/commands/reply.md b/docs/src/en/player-guide/commands/reply.md deleted file mode 100644 index 1cca973..0000000 --- a/docs/src/en/player-guide/commands/reply.md +++ /dev/null @@ -1,17 +0,0 @@ -# /reply <Badge type="tip" text="v0.1.0" /> <Badge type="tip" text="Paper/Velocity" /> - -### `/reply <message>` - -| Permission | Aliases | -| --------------------------- | ------- | -| `lunaticchat.command.reply` | `/r` | - -Replies to the player with whom you most recently communicated using [`/tell`](tell.md). - -::: info If This Command Cannot Be Used - -This command may be disabled (this feature can be toggled ON/OFF in the configuration). - -Please contact your server administrator. - -::: diff --git a/docs/src/en/player-guide/commands/tell.md b/docs/src/en/player-guide/commands/tell.md deleted file mode 100644 index cde71d6..0000000 --- a/docs/src/en/player-guide/commands/tell.md +++ /dev/null @@ -1,11 +0,0 @@ -# /tell <Badge type="tip" text="v0.1.0" /> <Badge type="tip" text="Paper/Velocity" /> - -### `/tell <player ID> <message>` - -| Permission | Aliases | -| -------------------------- | ------------------------------------ | -| `lunaticchat.command.tell` | `/t`, `/msg`, `/m`, `/w`, `/whisper` | - -Sends a message to the specified player. - -Clicking on a sent message will automatically input this command into the chat bar. diff --git a/docs/src/en/player-guide/direct-message.md b/docs/src/en/player-guide/direct-message.md deleted file mode 100644 index 54f7404..0000000 --- a/docs/src/en/player-guide/direct-message.md +++ /dev/null @@ -1,65 +0,0 @@ -# Direct Messages <Badge type="tip" text="v0.1.0" /> - -The direct message feature allows you to send messages to specific players only. - -## Sending Messages - -To send a message, use the [`/tell`](./commands/tell.md) command. - -You can only send messages to online players. Messages cannot be sent to offline players. - -``` -/tell <player> <message> -``` - -::: tip Auto-completion Feature - -LunaticChat supports player name auto-completion during chat input. - -For example, if you type `/tell Al`, online player names starting with `Al` will be suggested as candidates. - -::: - -::: warning Operation in GeyserMC Environments - -We do not guarantee functionality for players connecting from Minecraft Bedrock Edition using GeyserMC environments. - -Since LunaticChat is designed based on the Minecraft Java Edition/Paper chat system, issues may occur when operating through GeyserMC. There are no plans to support this. - -::: - -## Quick Reply Feature <Badge type="tip" text="v0.1.0" /> - -LunaticChat provides a quick reply feature that allows you to quickly respond to the most recent player who sent you a direct message. - -To use quick reply, use the [`/reply`](./commands/reply.md) command. - -``` -/reply <message> -``` - -::: warning If This Command Cannot Be Used - -This command may be disabled (this feature can be toggled ON/OFF in the configuration). - -Please contact your server administrator. - -::: - -## Notification Settings <Badge type="tip" text="v0.4.0" /> - -As of v0.4.0, you can change the notification settings for direct messages. - -A notification sound will play when you receive or send a direct message. - -To change notification settings, use the [`/lc settings`](./commands/lc/settings.md) command. - -::: tip Client Volume Settings - -This notification sound depends on the **Players** category volume setting on the client. - -If you cannot hear LunaticChat's notification sound, check your client's volume settings. - - - -::: diff --git a/docs/src/en/player-guide/getting-started.md b/docs/src/en/player-guide/getting-started.md deleted file mode 100644 index 19f7c83..0000000 --- a/docs/src/en/player-guide/getting-started.md +++ /dev/null @@ -1,77 +0,0 @@ -# Player Guide: Getting Started - -This guide is for players who have joined a server with LunaticChat installed. - -::: info For Server Administrators - -For plugin installation and configuration, refer to the [Admin Guide: Getting Started](../admin-guide/getting-started.md). - -::: - -## What You Can Do with LunaticChat - -LunaticChat is a plugin that extends the chat features of your Minecraft server. The following features are available: - -- **Direct Messages**: Send one-on-one messages to specific players -- **Quick Reply**: Quickly reply to the last player who messaged you with a single command -- **Channel Chat**: Create and join channels with other players to chat only among specific members -- **Romanization Conversion**: Automatically converts messages typed in romaji to hiragana - -::: tip - -Available features may vary depending on server configuration. Contact your server administrator for details. - -::: - -## Sending Direct Messages - -Use the [`/tell`](./commands/tell.md) command to send a message to a specific player. - -``` -/tell <player> <message> -``` - -After receiving a message, you can quickly reply using the [`/reply`](./commands/reply.md) command. - -``` -/reply <message> -``` - -For more details, see [Direct Messages](./direct-message.md). - -## Joining Channel Chat - -Channel chat lets you create and join channels where only specific members can converse. - -You can see available channels with [`/lc channel list`](./commands/lc/channel.md). - -``` -/lc channel list -``` - -To join a channel, use [`/lc channel join`](./commands/lc/channel.md). - -``` -/lc channel join <channel-id> -``` - -For more details, see [Channel Chat](./channel-chat/about.md). - -## Using Romanization Conversion - -LunaticChat can automatically convert messages typed in romaji to hiragana. - -You can toggle romanization conversion on or off with the [`/lc settings`](./commands/lc/settings.md) command. - -``` -/lc settings romanization <on|off> -``` - -For more details, see [Romanization Conversion](./japanese-romanization.md). - -## What's Next? - -- [Channel Chat](./channel-chat/about.md): Learn how to use channel chat -- [Direct Messages](./direct-message.md): Learn how to use direct messages -- [Romanization Conversion](./japanese-romanization.md): Details on the romanization conversion feature -- [Command List](./index.md): View all commands available in LunaticChat diff --git a/docs/src/en/player-guide/index.md b/docs/src/en/player-guide/index.md deleted file mode 100644 index 545d0f6..0000000 --- a/docs/src/en/player-guide/index.md +++ /dev/null @@ -1,23 +0,0 @@ -# Player Reference - -This page is a reference for players using LunaticChat. - -For plugin installation and configuration, refer to the [Guide](../admin-guide/getting-started.md). - -## Legend - -The legend used in the command reference is as follows: - -- `<argument>`: Indicates a required argument. Must be specified for execution. -- `[argument]`: Indicates an optional argument. Can be omitted during execution. -- `|`: Used when there are multiple choices. For example, `<yes|no>` means specifying either `yes` or `no`. -- `...`: Indicates that multiple arguments can be specified. For example, `<item>...` means multiple items can be specified. - -## Labels - -When the following labels are present, they have these meanings: - -- <Badge type="info" text="v0.1.0" />: Indicates this feature was introduced in LunaticChat version 0.1.0. -- <Badge type="tip" text="Paper" />: Indicates this feature is available in Paper environments. -- <Badge type="tip" text="Velocity" />: Indicates this feature is available in Velocity environments. -- <Badge type="tip" text="Paper / Velocity" />: Indicates this feature is available in both Paper and Velocity environments. diff --git a/docs/src/en/player-guide/japanese-romanization.md b/docs/src/en/player-guide/japanese-romanization.md deleted file mode 100644 index 104d6d0..0000000 --- a/docs/src/en/player-guide/japanese-romanization.md +++ /dev/null @@ -1,101 +0,0 @@ -# Romanization Conversion <Badge type="tip" text="v0.1.0" /> <Badge type="tip" text="Paper" /> - -LunaticChat provides a feature to convert Japanese text from romaji. - -## Enabling/Disabling - -The romanization conversion feature is enabled by default. - -You can toggle the romanization conversion setting using the [`/lc settings`](./commands/lc/settings.md) command. - -## Conversion Process - -LunaticChat converts text from players through the following steps: - -1. Verify that the player's text is composed of romaji -2. Check if the phrase exists in the memory cache - 1. If a matching phrase is found here, return it to the server -3. If it doesn't exist in the memory cache, convert from romaji to hiragana -4. Send the converted string to the Google IME API to convert it to a human-readable form -5. Save to memory cache and return it to the server - -``` -┌───────────────────────────────────────────────────┐ -│ User Input │ -│ (Romanji Text) │ -└─────────────────────┬─────────────────────────────┘ - │ - ▼ -┌───────────────────────────────────────────────────┐ -│ RomanjiConverter │ -│ ┌───────────────────────────────────────────┐ │ -│ │ 1. Check Memory Cache │ │ -│ │ └─→ Hit: Return immediately │ │ -│ │ │ │ -│ │ 2. Call Google IME API │ │ -│ │ │ │ -│ │ 3. Store in Memory Cache │ │ -│ │ │ │ -│ │ 4. Queue for Disk Save (async) │ │ -│ └───────────────────────────────────────────┘ │ -└─────────────────────┬─────────────────────────────┘ - │ - ▼ -┌───────────────────────────────────────────────────┐ -│ Converted Text │ -│ (Japanese Text) │ -└───────────────────────────────────────────────────┘ -``` - -::: tip Saving to File - -To avoid adding load, the contents of the memory cache are automatically saved to file cache at configured intervals and after server shutdown. - -::: - -For information on cache files, see [here](../admin-guide/cache.md). - -## Improved Cache Strategy <Badge type="tip" text="v0.5.0" /> - -As of v0.5.0, LunaticChat has improved the cache strategy for romanization conversion. - -Player chat is now cached word by word, enabling more efficient conversion. - -For example, consider the following long chat message: - -> konnichiwa minna ohayou gozaimasu kyou wa totemo ii tenki desu ne bokutachi wa issho ni asobi ni ikimashou kono atarashii game wo tameshite mitai to omoimasu sore wa totemo omoshiroi to kiite imasu arigatou gozaimasu mata ne - -LunaticChat doesn't convert this sentence all at once, but splits and caches it word by word. - -This means that if words like "konnichiwa" or "minna" are already cached, those words don't need to be converted again, significantly improving conversion speed. - -### First Conversion - -``` -Input: "konnichiwa minna ohayou gozaimasu" - -konnichiwa → API → こんにちは (cached) -minna → API → みんな (cached) -ohayou → API → おはよう (cached) -gozaimasu → API → ございます (cached) - -Result: "こんにちは みんな おはよう ございます" -API Calls: 4 -``` - -### Second Conversion - -``` -Input: "ohayou gozaimasu kyou wa ii tenki desu" - -ohayou → Cache hit → おはよう -gozaimasu → Cache hit → ございます -kyou → API → 今日 (cached) -wa → API → は (cached) -ii → API → いい (cached) -tenki → API → 天気 (cached) -desu → API → です (cached) - -Result: "おはよう ございます 今日 は いい 天気 です" -API Calls: 5 (Cache hits: 2) -``` diff --git a/docs/src/index.md b/docs/src/index.md deleted file mode 100644 index 90fa431..0000000 --- a/docs/src/index.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -# https://vitepress.dev/reference/default-theme-home-page -layout: home - -hero: - name: 'LunaticChat' - tagline: A next-generation chat plugin for Paper, Folia and Velocity. - actions: - - theme: brand - text: プレイヤーガイド - link: /player-guide/channel-chat/about - - theme: brand - text: 管理者ガイド - link: /admin-guide/getting-started - - theme: alt - text: GitHub - link: https://github.com/m1sk9/LunaticChat - image: - src: /icon.png - alt: LunaticChat Logo - -features: - - title: 1on1 ダイレクトメッセージ機能 - details: /tell や /msg コマンドで,1対1のチャットが可能 - icon: ✉️ - - title: クイック返信 - details: /reply で,直前にメッセージを送信した相手に素早く返信可能 - icon: 💌 - - title: かな・ローマ字変換 - details: ローマ字で入力したメッセージを,自動的に日本語に変換 - icon: 🌍 - - title: チャンネルチャット機能 - details: チャットチャンネルを作成・管理し,特定のプレイヤー間でのプライベートメッセージを送信可能 - icon: ☎️ - - title: マルチプラットフォーム対応 - details: Paper, Folia と Velocity のマルチプラットフォームに対応し,サーバ間チャットを実現します - icon: 🚀 - - title: キャッシュによる高速動作 - details: ローマ字から日本語の変換はキャッシュを使用し,従来の LunaChat よりも高速に動作します - icon: 🎈 - - title: 最新版の対応 - details: 他プラグインとの依存を減らし,常に最新の Minecraft バージョンに対応します - icon: ⛏️️ ---- diff --git a/docs/src/player-guide/about.md b/docs/src/player-guide/about.md deleted file mode 100644 index bcc3b86..0000000 --- a/docs/src/player-guide/about.md +++ /dev/null @@ -1,61 +0,0 @@ -# LunaticChat について - -LunaticChat は Minecraft サーバソフトウェアである Paper / Velocity 向けのチャットプラグインです. - -2013年,[ucchyocean](https://github.com/ucchyocean) 氏が公開した [LunaChat](https://github.com/ucchyocean/LunaChat) の後継,そして最新版で動くように一から書き直したプラグインとして開発しています. - -現在 LunaChat は開発が終了しており,最新の Minecraft バージョンには対応していません.多くのサーバー管理者が LunaChat を Fork していますが, LunaticChat はその代替として,LunaChat の機能を引き継ぎつつ,最新の Minecraft バージョンで動作するよう設計されています. - -## 主な特徴 - -- **軽量で高速**: LunaticChat は高いパフォーマンスを維持しつつ,サーバーへの負荷を最小限に抑えるよう設計されています. -- **1on1 ダイレクトメッセージ機能**: /tell や /msg コマンドで,1対1のチャットが可能です. -- **クイック返信**: /reply で,直前にメッセージを送信した相手に素早く返信可能です. -- **かな・ローマ字変換**: ローマ字で入力したメッセージを,自動的に日本語に変換します. -- **チャンネルチャット機能**: 複数のチャットチャンネルを作成し,特定のチャンネルでのみメッセージを送信できる環境を実現します. -- **CoreProtect への対応**: LunaticChat のチャットログは CoreProtect と互換性があります. -- **キャッシュによる高速動作**: ローマ字から日本語の変換はキャッシュを使用し,従来の LunaChat よりも高速に動作します. -- **最新版の対応**: 他プラグインとの依存を完全に排除し,常に最新の Minecraft バージョンに対応します. - -## 比較 - -| | LunaticChat | LunaChat | -| -------------------- | ------------------------------- | -------------------------------------- | -| 開発状況 | 継続的に開発中 | 開発終了 | -| 対応プラットフォーム | Paper / Velocity | Bukkit / Spigot / BungeeCord | -| サポートバージョン | 1.21.x ~ | 1.16.x まで | -| 使用言語 | Kotlin | Java | -| 依存プラグイン | なし | EssentialsX など | -| キャッシュ | あり | なし | -| ドキュメント | あり | なし | -| ライセンス | GNU General Public License v3.0 | GNU Lesser General Public License v3.0 | - -## FAQ - -### LunaticChat は無料で使えますか? - -オープンソースソフトウェアとして,LunaticChat は無料で使用,修正,配布できます. - -### LunaticChat はどの Minecraft バージョンに対応していますか? - -LunaticChat は Minecraft 1.21.x 以降のバージョンに対応しています. - -### LunaticChat は他のチャットプラグインと併用できますか? - -LunaticChat は他のチャットプラグインと併用できますが,競合を避けるために,チャット関連の機能が重複しないように注意してください. - -### LunaticChat のサポートはどこで受けられますか? - -LunaticChat のサポートは,[公式の GitHub Discussion](https://github.com/m1sk9/LunaticChat/discussions) で受けられます. - -### LunaticChat のソースコードはどこで入手できますか? - -LunaticChat のソースコードは,[GitHub](https://github.com/m1sk9/LunaticChat) で公開されています. - -### Spigot / BungeeCord 版の LunaticChat はありますか? - -ありません.対応する予定もありません.Paper / Velocity でご利用ください. - -### LunaticChat はどのようなライセンスで配布されていますか? - -LunaticChat は GNU General Public License v3.0 (GPLv3) の下で配布されています. diff --git a/docs/src/player-guide/channel-chat/about.md b/docs/src/player-guide/channel-chat/about.md deleted file mode 100644 index dfbee07..0000000 --- a/docs/src/player-guide/channel-chat/about.md +++ /dev/null @@ -1,107 +0,0 @@ -# チャンネルチャット <Badge type="tip" text="v0.6.0" /> <Badge type="warning" text="試験的" /> - -特定のプレイヤー間で,チャットを共有できる機能です. - -::: warning 試験的機能 - -この機能は現在試験的な機能として提供されています.今後のアップデートで仕様が変更される可能性があります. - -::: - -::: tip この機能はサーバーで有効化する必要があります - -チャンネルチャットがサーバーで無効化されている場合,これらの機能は使用できません. - -サーバー管理者にお問い合わせください. - -::: - -## チャンネルを作成する - -チャンネルチャットを利用するには,まずチャットチャンネルを作成する必要があります. - -[`/lc channnel create`](../commands/lc/channel.md#lc-channel-create-チャンネルid-チャンネル名-チャンネルの説明-プライベート設定) コマンドを使用して,チャットチャンネルを作成します. - -``` -/lc channel create <チャンネルID> <チャンネル名> [チャンネルの説明] [プライベート設定] -``` - -- `<チャンネルID>` はチャンネルのIDを指定します. -- `<チャンネル名>` はチャンネルの名前を指定します. -- `[チャンネルの説明]` はチャンネルの説明を指定します (省略可能). - - `/lc channel list` コマンドでチャンネル一覧を表示した際に,説明が表示されます. -- `[プライベート設定]` はチャンネルの公開設定を指定します. - - `true` を指定するとプライベートチャンネルとして作成され,招待されたプレイヤーのみが参加できます. - - `false` を指定するか,省略した場合はパブリックチャンネルとして作成され,誰でも参加できます. - -::: tip チャンネルIDの要件 - -チャンネルIDは次の要件に従う必要があります: - -- 3文字以上,30文字以下であること -- 英数字,アンダースコア(\_),ハイフン(-)のみを含むこと - -::: - -::: warning チャンネル名・チャンネルの説明を入力する際の注意点 - -チャンネル名・チャンネルの説明を入力する際は,引数を `"` (ダブルクォーテーション) で囲む必要があります. - -実行例は次のとおりです: - -``` -/lc channel create pvp_channel "PvP大好きクラブ" "PvPが大好きな人たちの集まり" false -``` - -::: - -チャンネルが正常に作成されると,チャットで確認メッセージが表示されます. - -## チャンネルに参加する - -作成されたチャンネルに参加するには,[`/lc channel join`](../commands/lc/channel.md#lc-channel-join-チャンネルid) コマンドを使用します. - -チャンネルに参加すると,チャットがチャンネル内のプレイヤーのみに表示されるようになります. - -``` -/lc channel join <チャンネルID> -``` - -## チャンネル一覧を表示する - -参加可能なチャンネル一覧を表示するには,[`/lc channel list`](../commands/lc/channel.md#lc-channel-list) コマンドを使用します. - -チャット欄に参加可能なチャンネルの一覧が表示されます.クリックするか [`/lc channel join`](#チャンネルに参加する) コマンドを使用して,チャンネルに参加できます. - -``` -/lc channel list -``` - -## 全体チャットへの送信 - -チャンネルに参加中は,すべてのチャットがチャンネル内のプレイヤーのみに表示されます. - -一時的に全体チャットへ送信したい場合は,メッセージの先頭に `!` を付けて送信します. - -``` -!こんにちは、みんな元気? -``` - -## アクティブチャンネルとメンバーシップ状態の違い - -LunaticChat では,プレイヤーのアクティブチャンネルとメンバーシップ状態は別々に管理されています. - -- アクティブチャンネル: チャンネルチャットモードで使用されるチャンネル -- メンバーシップ状態: プレイヤーが参加しているチャンネルの一覧 - -アクティブチャンネルは一度に一つのチャンネルのみを指定できます.メンバーシップ状態のチャンネルにアクティブチャンネルを切り替える場合は [`/lc channel switch`](../commands/lc/channel.md#lc-channel-switch-チャンネルid) コマンドを使用します. - -``` -/lc channel switch <チャンネルID> -``` - -メンバーシップ状態のチャンネルからアクティブチャンネルを解除してもチャンネルからは削除されません.チャンネルから退出するにはアクティブチャンネルに切り替えてから [`/lc channel leave`](../commands/lc/channel.md#lc-channel-leave) コマンドを使用します. - -``` -/lc channel leave -``` diff --git a/docs/src/player-guide/channel-chat/moderation.md b/docs/src/player-guide/channel-chat/moderation.md deleted file mode 100644 index 99d4ebe..0000000 --- a/docs/src/player-guide/channel-chat/moderation.md +++ /dev/null @@ -1,95 +0,0 @@ -# チャンネルの管理 - -チャンネルチャットのモデレート機能を使用して,チャンネル内のメンバー行動を管理できます. - -::: danger 注意 - -これらのモデレート機能はあくまで LunaticChat のチャンネルチャットに対して使用できるものです. - -実際にルール違反者に対して処罰が必要な場合は,サーバー管理者に通報することをお勧めします. - -::: - -## モデレート機能の仕様 - -モデレート機能にはいくつかの仕様があります. - -- Bypass 権限を持つプレイヤーは,モデレート機能の影響を受けません. - - つまり,サーバー管理者に対してはこれらの機能を使用できません. -- モデレート機能を使用するには,それぞれのチャンネルのロールとサーバー自体の権限が必要です. -- モデレート機能の効果はチャンネルごとに独立しています. - - 例えば,あるチャンネルで永久追放(BAN)されたプレイヤーは,他のチャンネルでは通常通りチャットできます. - -## ロール - -チャンネルには以下のロールが存在しています. - -- メンバー (Member): チャンネルに参加している通常のプレイヤー -- モデレーター (Moderator): チャンネルのモデレート機能を使用できるプレイヤー -- オーナー (Owner): チャンネルの作成者であり,すべてのモデレート機能を使用できるプレイヤー - -::: tip サーバー管理者によるモデレート - -サーバー管理者は一律で全てのチャンネルにおいてオーナー権限と同じ権限を持ちます. - -::: - -## メンバーを一時的に追放する (Kick) - -メンバーを一時的にチャンネルから追放するには,[`/lc channel kick`](../commands/lc/channel.md#lc-channel-kick-プレイヤーid) コマンドを使用します. - -``` -/lc channel kick <プレイヤーID> -``` - -このコマンドを実行すると,指定したプレイヤーがチャンネルから即座に退出されます. - -ただし,追放されたプレイヤーは再参加が可能です. - -## メンバーを永久に追放する (Ban) - -メンバーを永久にチャンネルから追放するには,[`/lc channel ban`](../commands/lc/channel.md#lc-channel-ban-プレイヤーid) コマンドを使用します. - -``` -/lc channel ban <プレイヤーID> -``` - -このコマンドを実行すると,指定したプレイヤーがチャンネルから即座に退出され,さらに再参加も禁止されます. - -## 永久追放を解除する - -永久追放されたメンバーの追放を解除するには,[`/lc channel unban`](../commands/lc/channel.md#lc-channel-unban-プレイヤーid) コマンドを使用します. - -``` -/lc channel unban <プレイヤーID> -``` - -## モデレーターを任命・解任する - -チャンネルのメンバーをモデレーターに任命/解任するには,[`/lc channel mod`](../commands/lc/channel.md#lc-channel-mod-プレイヤーid) コマンドを使用します. - -``` -/lc channel mod <プレイヤーID> -``` - -このコマンドを実行すると,指定したプレイヤーがモデレーターに任命されます.また任命状態のプレイヤーに対して再度このコマンドを実行すると,モデレーターから解任されます. - -## オーナー権限を譲渡する - -チャンネルのオーナー権限を他のメンバーに譲渡するには,[`/lc channel ownership`](../commands/lc/channel.md#lc-channel-ownership-プレイヤーid) コマンドを使用します. - -``` -/lc channel ownership <プレイヤーID> -``` - -このコマンドを実行すると,指定したプレイヤーに全てのオーナー権限が譲渡されます.元のオーナーはモデレーターになります. - -::: danger 実行時の注意点 - -- オーナー権限の譲渡は不可逆的な操作です. - - つまり,一度譲渡してしまうとオーナー権限を持つプレイヤーが再度譲渡しない限り,元のオーナーがオーナー権限を取り戻すことはできません. - - これはサーバー管理者であってもです. -- オーナー権限を譲渡する相手は,必ずチャンネルのメンバーである必要があります. -- オーナー権限は全てのモデレート機能を使用でき,かつチャンネルを削除できる強力な権限です.譲渡する相手を慎重に選んでください. - -::: diff --git a/docs/src/player-guide/channel-chat/private-channel.md b/docs/src/player-guide/channel-chat/private-channel.md deleted file mode 100644 index eb321de..0000000 --- a/docs/src/player-guide/channel-chat/private-channel.md +++ /dev/null @@ -1,25 +0,0 @@ -# プライベートチャンネル - -プライベートチャンネルは,特定のユーザーのみが参加できるチャットチャンネルです. - -## プライベートチャンネルの作成 - -プライベートを作成する場合は [`/lc channel create`](../commands/lc/channel.md) コマンドで,プライベート設定引数に `true` を指定します. - -``` -/lc channel create <チャンネルID> <チャンネル名> [チャンネルの説明] [プライベート設定] -``` - -## チャンネルへの招待 - -プライベートチャンネルは `/lc channel list` コマンドでは一覧表示されず, `/lc channel join` コマンドで参加することもできません. - -参加するにはオーナーもしくはモデレーターから招待を受ける必要があります. - -招待するには,[`/lc channel invite`](../commands/lc/channel.md#lc-channel-invite-プレイヤーid) コマンドを使用します. - -``` -/lc channel invite <プレイヤーID> -``` - -招待を受けたプレイヤーは自動でチャンネルに参加します. diff --git a/docs/src/player-guide/commands/lc/channel.md b/docs/src/player-guide/commands/lc/channel.md deleted file mode 100644 index a0c77dc..0000000 --- a/docs/src/player-guide/commands/lc/channel.md +++ /dev/null @@ -1,141 +0,0 @@ -# /lc channel <Badge type="tip" text="v0.6.0" /> <Badge type="tip" text="Paper/Folia" /> - -### `/lc channel create <チャンネルID> <チャンネル名> [チャンネルの説明] [プライベート設定]` - -| パーミッション | -| --------------------------------------- | -| `lunaticchat.command.lc.channel.create` | - -チャンネルを作成します. - -- `<チャンネルID>` はチャンネルのIDを指定します. -- `<チャンネル名>` はチャンネルの名前を指定します. -- `[チャンネルの説明]` はチャンネルの説明を指定します (省略可能). - - `/lc channel list` コマンドでチャンネル一覧を表示した際に,説明が表示されます. -- `[プライベート設定]` はチャンネルの公開設定を指定します. - - `true` を指定するとプライベートチャンネルとして作成され,招待されたプレイヤーのみが参加できます. - - `false` を指定するか,省略した場合はパブリックチャンネルとして作成され,誰でも参加できます. - -::: warning チャンネル名・チャンネルの説明を入力する際の注意点 - -チャンネル名・チャンネルの説明を入力する際は,引数を `"` (ダブルクォーテーション) で囲む必要があります. - -実行例は次のとおりです: - -``` -/lc channel create pvp_channel "PvP大好きクラブ" "PvPが大好きな人たちの集まり" false -``` - -::: - -### `/lc channel list` - -| パーミッション | -| ------------------------------------- | -| `lunaticchat.command.lc.channel.list` | - -チャンネルの一覧を表示します. - -### `/lc channel join <チャンネルID>` - -| パーミッション | -| ------------------------------------- | -| `lunaticchat.command.lc.channel.join` | - -指定したチャンネルに参加します. - -### `/lc channel leave` - -| パーミッション | -| -------------------------------------- | -| `lunaticchat.command.lc.channel.leave` | - -現在アクティブなチャンネルから退出します. - -### `/lc channel switch <チャンネルID>` - -| パーミッション | -| --------------------------------------- | -| `lunaticchat.command.lc.channel.switch` | - -指定したチャンネルに切り替えます.チャンネルチャットモード中に他のチャンネルに切り替えたい場合に使用します. - -### `/lc channel status` - -| パーミッション | -| --------------------------------------- | -| `lunaticchat.command.lc.channel.status` | - -現在参加・アクティブ状態のチャンネルの情報を表示します. - -### `/lc channel delete <チャンネルID>` - -| パーミッション | -| --------------------------------------- | -| `lunaticchat.command.lc.channel.delete` | - -指定したチャンネルを削除します.チャンネルの作成者(オーナー) である必要があります. - -### `/lc channel info [<チャンネルID>]` - -| パーミッション | -| ------------------------------------- | -| `lunaticchat.command.lc.channel.info` | - -指定したチャンネルの情報を表示します. - -引数を指定した場合は現在アクティブ状態のチャンネルの情報を表示します. - -### `/lc channel invite <プレイヤーID>` - -| パーミッション | -| --------------------------------------- | -| `lunaticchat.command.lc.channel.invite` | - -指定したプレイヤーを現在アクティブ状態のチャンネルに招待します. - -### `/lc channel kick <プレイヤーID>` - -| パーミッション | -| ------------------------------------- | -| `lunaticchat.command.lc.channel.kick` | - -指定したプレイヤーを現在アクティブ状態のチャンネルから一時的に追放します. - -追放されたプレイヤーはそのチャンネルから即時退出されますが,再参加できます. - -### `/lc channel ban <プレイヤーID>` - -| パーミッション | -| ------------------------------------ | -| `lunaticchat.command.lc.channel.ban` | - -指定したプレイヤーを現在アクティブ状態のチャンネルから永久追放します. - -永久追放されたプレイヤーはそのチャンネルから即時退出され,再参加できません. - -### `/lc channel unban <プレイヤーID>` - -| パーミッション | -| -------------------------------------- | -| `lunaticchat.command.lc.channel.unban` | - -指定したプレイヤーの永久追放の解除を行います. - -### `/lc channel mod <プレイヤーID>` - -| パーミッション | -| ------------------------------------ | -| `lunaticchat.command.lc.channel.mod` | - -指定したプレイヤーを現在アクティブ状態のチャンネルのモデレーターに昇格/降格させます. - -### `/lc channel ownership <プレイヤーID>` - -| パーミッション | -| ------------------------------------------ | -| `lunaticchat.command.lc.channel.ownership` | - -指定したプレイヤーに現在アクティブ状態のチャンネルのオーナー権を譲渡します. - -譲渡後,元のオーナーにはモデレーター権が付与されます. diff --git a/docs/src/player-guide/commands/lc/settings.md b/docs/src/player-guide/commands/lc/settings.md deleted file mode 100644 index b7ba77f..0000000 --- a/docs/src/player-guide/commands/lc/settings.md +++ /dev/null @@ -1,19 +0,0 @@ -# /lc settings <Badge type="tip" text="v0.5.0" /> <Badge type="tip" text="Paper/Folia" /> - -### `/lc settings <key> [value]` - -| パーミッション | -| --------------------------------- | -| `lunaticchat.command.lc.settings` | - -LunaticChat のプレイヤー設定を管理します.値を指定しなかった場合は設定値が表示されます. - -この設定は UUID で保存されるため, MCID を切り替えても設定が消えることはありません. - -#### 利用可能なキー - -| キー | 説明 | デフォルト値 | -| ---------- | ---------------------------------------------------------------------------------------------- | ------------ | -| `japanese` | ローマ字変換の有効化・無効化を切り替えます. | `true` | -| `notice` | `/tell` や `/reply` でダイレクトメッセージを受信した際に通知を受け取るかどうかを切り替えます. | `true` | -| `chNotice` | チャンネルチャットを受信した際に通知を受け取るかどうかを切り替えます. | `true` | diff --git a/docs/src/player-guide/commands/lc/status.md b/docs/src/player-guide/commands/lc/status.md deleted file mode 100644 index 90b1469..0000000 --- a/docs/src/player-guide/commands/lc/status.md +++ /dev/null @@ -1,9 +0,0 @@ -# /lc status <Badge type="tip" text="v0.5.0" /> <Badge type="tip" text="Paper/Folia" /> - -### `/lc status` - -| パーミッション | -| ------------------------------- | -| `lunaticchat.command.lc.status` | - -LunaticChat のステータスを表示します. diff --git a/docs/src/player-guide/commands/lcv/status.md b/docs/src/player-guide/commands/lcv/status.md deleted file mode 100644 index 49e5352..0000000 --- a/docs/src/player-guide/commands/lcv/status.md +++ /dev/null @@ -1,9 +0,0 @@ -# /lcv status <Badge type="tip" text="v0.8.0" /> <Badge type="tip" text="Velocity" /> - -### `/lcv status` - -| パーミッション | -| -------------------------------- | -| `lunaticchat.command.lcv.status` | - -現在の LunaticChat の Velocity 連携ステータスを表示します. diff --git a/docs/src/player-guide/commands/reply.md b/docs/src/player-guide/commands/reply.md deleted file mode 100644 index 908fa96..0000000 --- a/docs/src/player-guide/commands/reply.md +++ /dev/null @@ -1,17 +0,0 @@ -# /reply <Badge type="tip" text="v0.1.0" /> <Badge type="tip" text="Paper/Folia" /> - -### `/reply <メッセージ>` - -| パーミッション | エイリアス | -| --------------------------- | ---------- | -| `lunaticchat.command.reply` | `/r` | - -直近で [`/tell`](tell.md) を使用し,やりとりをしたプレイヤーに対して返信します. - -::: info このコマンドが使用できない場合 - -このコマンドが無効化されている可能性があります (この機能は設定で ON/OFF できるため) - -サーバーの管理者に連絡してください. - -::: diff --git a/docs/src/player-guide/commands/tell.md b/docs/src/player-guide/commands/tell.md deleted file mode 100644 index 8d54533..0000000 --- a/docs/src/player-guide/commands/tell.md +++ /dev/null @@ -1,11 +0,0 @@ -# /tell <Badge type="tip" text="v0.1.0" /> <Badge type="tip" text="Paper/Folia" /> - -### `/tell <プレイヤーID> <メッセージ>` - -| パーミッション | エイリアス | -| -------------------------- | ------------------------------------ | -| `lunaticchat.command.tell` | `/t`, `/msg`, `/m`, `/w`, `/whisper` | - -指定したプレイヤーに対してメッセージを送信します. - -送信されたメッセージをクリックするとこのコマンドがチャット欄に自動入力されます. diff --git a/docs/src/player-guide/direct-message.md b/docs/src/player-guide/direct-message.md deleted file mode 100644 index 64fbb95..0000000 --- a/docs/src/player-guide/direct-message.md +++ /dev/null @@ -1,65 +0,0 @@ -# ダイレクトメッセージ <Badge type="tip" text="v0.1.0" /> - -特定のプレイヤーに対してのみメッセージを送信するダイレクトメッセージ機能です. - -## メッセージを送信する - -メッセージを送信するには [`/tell`](./commands/tell.md) コマンドを使用します. - -オンラインプレイヤーに対してのみメッセージを送信できます.オフラインプレイヤーには送信できません. - -``` -/tell <player> <message> -``` - -::: tip 補完機能 - -LunaticChat はチャット入力時にプレイヤー名の補完をサポートしています. - -例えば,`/tell Al` と入力した場合,`Al` で始まるオンラインプレイヤー名が候補として表示されます. - -::: - -::: warning GeyserMC 環境での動作 - -GeyserMC 環境を用いて Minecraft Bedrock Edition から接続しているプレイヤーに機能を提供している場合の動作は保証していません. - -LunaticChat は Minecraft Java Edition / Paper のチャットシステムを前提として設計されているため,GeyserMC 経由での動作に問題が発生する可能性があります.対応の予定はありません. - -::: - -## クイックリプライ機能 <Badge type="tip" text="v0.1.0" /> - -LunaticChat では,直前にダイレクトメッセージを送信した相手に対して素早く返信できるクイックリプライ機能が提供されています. - -クイックリプライを使用するには [`/reply`](./commands/reply.md) コマンドを使用します. - -``` -/reply <message> -``` - -::: warning このコマンドが使用できない場合 - -このコマンドが無効化されている可能性があります (この機能は設定で ON/OFF できるため) - -サーバーの管理者に連絡してください. - -::: - -## 通知設定 <Badge type="tip" text="v0.4.0" /> - -v0.4.0 以降,ダイレクトメッセージの通知設定を変更できるようになりました. - -ダイレクトメッセージを受信・送信時に通知音がなるようになります. - -通知設定を変更するには [`/lc settings`](./commands/lc/settings.md) コマンドを使用します. - -::: tip クライアントでの音量設定 - -この通知音はクライアント上の **プレイヤー** カテゴリーの音量設定に依存します. - -LunaticChat の通知音が聞こえない場合は,クライアントの音量設定を確認してください. - - - -::: diff --git a/docs/src/player-guide/getting-started.md b/docs/src/player-guide/getting-started.md deleted file mode 100644 index 440e287..0000000 --- a/docs/src/player-guide/getting-started.md +++ /dev/null @@ -1,77 +0,0 @@ -# プレイヤーガイド: はじめる - -LunaticChat が導入されたサーバーに参加したプレイヤー向けのガイドです. - -::: info サーバー管理者の方へ - -プラグインの導入・設定方法については [管理者ガイド: はじめる](../admin-guide/getting-started.md) を参照してください. - -::: - -## LunaticChat でできること - -LunaticChat は,Minecraft サーバーのチャット機能を拡張するプラグインです.以下の機能が利用できます: - -- **ダイレクトメッセージ**: 特定のプレイヤーへ 1 対 1 でメッセージを送信できます -- **クイック返信**: 直前にメッセージを送ってきた相手に,コマンド一つで素早く返信できます -- **チャンネルチャット**: プレイヤー同士でチャンネルを作成・参加し,特定のメンバー間でのみチャットができます -- **ローマ字変換**: ローマ字で入力したメッセージを,自動的にひらがなに変換します - -::: tip - -利用できる機能はサーバーの設定によって異なる場合があります.詳しくはサーバー管理者にお問い合わせください. - -::: - -## ダイレクトメッセージを送る - -[`/tell`](./commands/tell.md) コマンドを使用して,特定のプレイヤーにメッセージを送信できます. - -``` -/tell <プレイヤー名> <メッセージ> -``` - -メッセージを受け取った後,[`/reply`](./commands/reply.md) コマンドで素早く返信できます. - -``` -/reply <メッセージ> -``` - -詳しくは [ダイレクトメッセージ](./direct-message.md) を参照してください. - -## チャンネルチャットに参加する - -チャンネルチャットでは,特定のメンバー間だけで会話できるチャンネルを作成・参加できます. - -参加可能なチャンネルは [`/lc channel list`](./commands/lc/channel.md) で確認できます. - -``` -/lc channel list -``` - -チャンネルに参加するには [`/lc channel join`](./commands/lc/channel.md) を使用します. - -``` -/lc channel join <チャンネルID> -``` - -詳しくは [チャンネルチャット](./channel-chat/about.md) を参照してください. - -## ローマ字変換を使う - -LunaticChat はローマ字で入力したメッセージを自動的にひらがなに変換できます. - -ローマ字変換のオン / オフは [`/lc settings`](./commands/lc/settings.md) コマンドで切り替えられます. - -``` -/lc settings romanization <on|off> -``` - -詳しくは [ローマ字変換](./japanese-romanization.md) を参照してください. - -## 次は? - -- [チャンネルチャット](./channel-chat/about.md): チャンネルチャットの使い方を確認します -- [ダイレクトメッセージ](./direct-message.md): ダイレクトメッセージの使い方を確認します -- [ローマ字変換](./japanese-romanization.md): ローマ字変換機能の詳細を確認します -- [コマンド一覧](./index.md): LunaticChat で使用できるコマンド一覧を確認します diff --git a/docs/src/player-guide/index.md b/docs/src/player-guide/index.md deleted file mode 100644 index 4b09530..0000000 --- a/docs/src/player-guide/index.md +++ /dev/null @@ -1,23 +0,0 @@ -# プレイヤー向けリファレンス - -このページは LunaticChat を使用するプレイヤー向けのリファレンスです。 - -プラグインの導入方法や設定方法については [ガイド](../admin-guide/getting-started.md) を参照してください。 - -## 凡例 - -コマンドリファレンスで使用される凡例は以下の通りです。 - -- `<引数>`: 必須の引数を示します.実行には必ず指定する必要があります. -- `[引数]`: 任意の引数を示します.実行時に省略可能です. -- `|`: 複数の選択肢がある場合に使用します.例えば,`<yes|no>` は `yes` または `no` のいずれかを指定することを意味します. -- `...` : 複数の引数を指定できることを示します.例えば,`<item>...` は複数のアイテムを指定できることを意味します. - -## ラベル - -以下のようなラベルが記載されている場合は,次のような意味を持ちます. - -- <Badge type="info" text="v0.1.0" /> : この機能が LunaticChat バージョン 0.1.0 で導入されたことを示します. -- <Badge type="tip" text="Paper" /> : この機能が Paper 環境で利用可能であることを示します. -- <Badge type="tip" text="Velocity" /> : この機能が Velocity 環境で利用可能であることを示します. -- <Badge type="tip" text="Paper / Velocity" /> : この機能が Paper / Velocity 環境で利用可能であることを示します. diff --git a/docs/src/player-guide/japanese-romanization.md b/docs/src/player-guide/japanese-romanization.md deleted file mode 100644 index cc982f0..0000000 --- a/docs/src/player-guide/japanese-romanization.md +++ /dev/null @@ -1,101 +0,0 @@ -# ローマ字変換 <Badge type="tip" text="v0.1.0" /> <Badge type="tip" text="Paper" /> - -LunaticChat では、日本語のテキストをローマ字に変換する機能が提供されています. - -## 有効化・無効化 - -ローマ字変換機能はデフォルトで有効化されています. - -[`/lc settings`](./commands/lc/settings.md) コマンドを使用して,ローマ字変換の設定を切り替えることができます. - -## 変換の仕組み - -LunaticChat はプレイヤーからのテキストを以下の手順で変換を行います. - -1. プレイヤーからのテキストがローマ字で構成されているかを検証する -2. メモリキャッシュから該当のフレーズがあるかどうかを調べる - 1. ここで該当フレーズがヒットした場合はそれをサーバーに返す -3. メモリキャッシュに存在していない場合は,ローマ字からひらがなに変換する -4. 変換した文字列を Google IME API へ送り,人が読める形に変換する -5. メモリキャッシュに保存し,それをサーバーに返す - -``` -┌───────────────────────────────────────────────────┐ -│ User Input │ -│ (Romanji Text) │ -└─────────────────────┬─────────────────────────────┘ - │ - ▼ -┌───────────────────────────────────────────────────┐ -│ RomanjiConverter │ -│ ┌───────────────────────────────────────────┐ │ -│ │ 1. Check Memory Cache │ │ -│ │ └─→ Hit: Return immediately │ │ -│ │ │ │ -│ │ 2. Call Google IME API │ │ -│ │ │ │ -│ │ 3. Store in Memory Cache │ │ -│ │ │ │ -│ │ 4. Queue for Disk Save (async) │ │ -│ └───────────────────────────────────────────┘ │ -└─────────────────────┬─────────────────────────────┘ - │ - ▼ -┌───────────────────────────────────────────────────┐ -│ Converted Text │ -│ (Japanese Text) │ -└───────────────────────────────────────────────────┘ -``` - -::: tip ファイルへの保存 - -メモリキャッシュの内容は負荷にならないよう,設定した秒毎・サーバ停止後にファイルキャッシュへ自動でセーブします. - -::: - -キャッシュファイルに関する情報は [こちら](../admin-guide/cache.md) をご覧ください. - -## 改善されたキャッシュ戦略 <Badge type="tip" text="v0.5.0" /> - -v0.5.0 以降,LunaticChat はローマ字変換のキャッシュ戦略を改善しました. - -プレイヤーのチャットを単語ごとにキャッシュするようになり,より効率的に変換を行えるようになりました. - -例えば,以下のような長文のチャットがあるとします. - -> konnichiwa minna ohayou gozaimasu kyou wa totemo ii tenki desu ne bokutachi wa issho ni asobi ni ikimashou kono atarashii game wo tameshite mitai to omoimasu sore wa totemo omoshiroi to kiite imasu arigatou gozaimasu mata ne - -LunaticChat はこの文章を一度に変換するのではなく,単語ごとに分割してキャッシュを行います. - -これにより,例えば「konnichiwa」や「minna」などの単語が既にキャッシュされている場合,それらの単語は再度変換する必要がなくなり,変換速度が大幅に向上します. - -### 1回目の変換 - -``` -入力: "konnichiwa minna ohayou gozaimasu" - -konnichiwa → API → こんにちは (キャッシュ保存) -minna → API → みんな (キャッシュ保存) -ohayou → API → おはよう (キャッシュ保存) -gozaimasu → API → ございます (キャッシュ保存) - -結果: "こんにちは みんな おはよう ございます" -APIコール: 4回 -``` - -### 2回目の変換 - -``` -入力: "ohayou gozaimasu kyou wa ii tenki desu" - -ohayou → キャッシュヒット → おはよう -gozaimasu → キャッシュヒット → ございます -kyou → API → 今日 (キャッシュ保存) -wa → API → は (キャッシュ保存) -ii → API → いい (キャッシュ保存) -tenki → API → 天気 (キャッシュ保存) -desu → API → です (キャッシュ保存) - -結果: "おはよう ございます 今日 は いい 天気 です" -APIコール: 5回(キャッシュヒット: 2回) -``` diff --git a/docs/.gitignore b/website/.gitignore index 0d28533..0d28533 100644 --- a/docs/.gitignore +++ b/website/.gitignore diff --git a/website/.mcp.json b/website/.mcp.json new file mode 100644 index 0000000..cc35acb --- /dev/null +++ b/website/.mcp.json @@ -0,0 +1,13 @@ +{ + "mcpServers": { + "chrome-devtools": { + "type": "stdio", + "command": "bunx", + "args": [ + "chrome-devtools-mcp", + "--executablePath=/Applications/Chromium.app/Contents/MacOS/Chromium" + ], + "env": {} + } + } +}
\ No newline at end of file diff --git a/website/.vitepress/config.mts b/website/.vitepress/config.mts new file mode 100644 index 0000000..a3fcb56 --- /dev/null +++ b/website/.vitepress/config.mts @@ -0,0 +1,50 @@ +import { execSync } from 'node:child_process'; +import { defineConfig } from 'vitepress'; +import { en } from './config/en'; +import { ja } from './config/ja'; + +const gitRoot = execSync('git rev-parse --show-toplevel').toString().trim(); +const commitHash = execSync(`git log -1 --format=%H -- ${gitRoot}/website/`) + .toString() + .trim() + .slice(0, 7); + +export default defineConfig({ + cleanUrls: true, + description: 'Next-generation channel chat plugin for Paper/Velocity', + head: [['link', { href: '/favicon.ico', rel: 'icon' }]], + locales: { + en: { + label: 'English', + lang: 'en-US', + link: '/en/', + themeConfig: { + ...en, + footer: { + copyright: 'Copyright © 2026 m1sk9', + message: `<a href="https://github.com/m1sk9/LunaticChat/commit/${commitHash}">LunaticChat/website@${commitHash}</a>`, + }, + }, + }, + root: { + label: '日本語', + lang: 'ja-JP', + themeConfig: { + ...ja, + footer: { + copyright: 'Copyright © 2026 m1sk9', + message: `<a href="https://github.com/m1sk9/LunaticChat/commit/${commitHash}">LunaticChat/website@${commitHash}</a>`, + }, + }, + }, + }, + outDir: './dist', + srcDir: 'src', + themeConfig: { + socialLinks: [ + { icon: 'github', link: 'https://github.com/m1sk9/LunaticChat' }, + ], + }, + title: 'LunaticChat', + titleTemplate: 'LunaticChat', +}); diff --git a/website/.vitepress/config/en.ts b/website/.vitepress/config/en.ts new file mode 100644 index 0000000..3a05016 --- /dev/null +++ b/website/.vitepress/config/en.ts @@ -0,0 +1,74 @@ +import type { DefaultTheme } from 'vitepress'; + +export const en: DefaultTheme.Config = { + editLink: { + pattern: 'https://github.com/m1sk9/LunaticChat/edit/main/website/src/:path', + text: 'Edit this page on GitHub', + }, + nav: [ + { link: '/en/download', text: 'Download' }, + { link: '/en/docs/getting-started', text: 'Documentation' }, + ], + sidebar: { + '/en/docs/': [ + { + link: '/en/docs/getting-started', + text: 'Getting Started', + }, + { + link: '/en/docs/configuration', + text: 'Configuration', + }, + { + link: '/en/docs/permissions', + text: 'Permissions', + }, + { + text: 'Feature Guides', + items: [ + { + link: '/en/docs/features/direct-message', + text: 'Direct Messages', + }, + { + link: '/en/docs/features/channel-chat', + text: 'Channel Chat', + }, + { + link: '/en/docs/features/japanese-conversion', + text: 'Romaji Conversion', + }, + { + link: '/en/docs/features/velocity', + text: 'Velocity Integration', + }, + { + link: '/en/docs/features/message-logging', + text: 'Message Logging', + }, + { + link: '/en/docs/features/admin', + text: 'Admin Features', + }, + ], + }, + { + text: 'Reference', + items: [ + { + link: '/en/docs/reference/commands', + text: 'Commands', + }, + { + link: '/en/docs/reference/message-format', + text: 'Message Format', + }, + { + link: '/en/docs/reference/player-settings', + text: 'Player Settings', + }, + ], + }, + ], + }, +}; diff --git a/website/.vitepress/config/ja.ts b/website/.vitepress/config/ja.ts new file mode 100644 index 0000000..e74102c --- /dev/null +++ b/website/.vitepress/config/ja.ts @@ -0,0 +1,74 @@ +import type { DefaultTheme } from 'vitepress'; + +export const ja: DefaultTheme.Config = { + editLink: { + pattern: 'https://github.com/m1sk9/LunaticChat/edit/main/website/src/:path', + text: 'GitHub で編集', + }, + nav: [ + { link: '/download', text: 'ダウンロード' }, + { link: '/docs/getting-started', text: 'ドキュメント' }, + ], + sidebar: { + '/docs/': [ + { + link: '/docs/getting-started', + text: 'はじめる', + }, + { + link: '/docs/configuration', + text: '設定', + }, + { + link: '/docs/permissions', + text: 'パーミッション', + }, + { + text: '機能ガイド', + items: [ + { + link: '/docs/features/direct-message', + text: 'ダイレクトメッセージ', + }, + { + link: '/docs/features/channel-chat', + text: 'チャンネルチャット', + }, + { + link: '/docs/features/japanese-conversion', + text: 'ローマ字変換', + }, + { + link: '/docs/features/velocity', + text: 'Velocity 連携', + }, + { + link: '/docs/features/message-logging', + text: 'メッセージログ', + }, + { + link: '/docs/features/admin', + text: '管理者向け機能', + }, + ], + }, + { + text: 'リファレンス', + items: [ + { + link: '/docs/reference/commands', + text: 'コマンド一覧', + }, + { + link: '/docs/reference/message-format', + text: 'メッセージフォーマット', + }, + { + link: '/docs/reference/player-settings', + text: 'プレイヤー設定', + }, + ], + }, + ], + }, +}; diff --git a/website/.vitepress/theme/components/DownloadCard.vue b/website/.vitepress/theme/components/DownloadCard.vue new file mode 100644 index 0000000..019a8f8 --- /dev/null +++ b/website/.vitepress/theme/components/DownloadCard.vue @@ -0,0 +1,380 @@ +<script setup lang="ts"> +import { computed } from 'vue'; +import { useData } from 'vitepress'; +import { data } from './download.data'; + +const { lang } = useData(); +const isEn = computed(() => lang.value === 'en-US'); + +const t = computed(() => + isEn.value + ? { + title: 'Download', + description: 'Download the latest releases of LunaticChat.', + compatible: 'Paper and Velocity Compatibility', + requirements: 'Requirements', + javaReq: '25 or later', + paperReq: '26.1.x or later', + velocityReq: '3.4.x or later', + noRelease: 'No release', + releaseDate: 'Release date', + fileSize: 'File size', + download: 'Download', + releaseNotes: 'Release notes', + modrinthDesc: 'LunaticChat is also available on Modrinth.', + notYetReleased: 'Not yet released.', + devBuilds: 'Development Builds', + devBuildsDesc: + 'The latest build from the main branch is available from CI. Development builds are not guaranteed to be stable.', + viewCiBuilds: 'View latest CI builds', + compatNotice: + 'Paper and Velocity plugins are versioned with a protocol version. For MINOR version changes, update Velocity first. For MAJOR version changes, update all servers simultaneously.', + compatLink: 'See Velocity Integration - Protocol Version for details.', + } + : { + title: 'ダウンロード', + description: 'LunaticChat の最新リリースをダウンロードできます。', + compatible: 'Paper / Velocity の互換性', + requirements: '動作要件', + javaReq: '25 以降', + paperReq: '26.1.x 以降', + velocityReq: '3.4.x 以降', + noRelease: 'リリースなし', + releaseDate: 'リリース日', + fileSize: 'ファイルサイズ', + download: 'ダウンロード', + releaseNotes: 'リリースノート', + modrinthDesc: 'LunaticChat は Modrinth でも公開しています。', + notYetReleased: 'まだリリースされていません。', + devBuilds: '開発ビルド', + devBuildsDesc: + '最新の main ブランチのビルドは CI から取得できます。開発ビルドは安定性が保証されていません。', + viewCiBuilds: '最新の CI ビルドを確認', + compatNotice: + 'Paper プラグインと Velocity プラグインはプロトコルバージョンで互換性が管理されています.MINOR バージョン変更時は Velocity を先にアップデートしてください.MAJOR バージョン変更時は全サーバーを同時にアップデートする必要があります.', + compatLink: '詳細は Velocity 連携 - プロトコルバージョン を参照してください.', + }, +); + +function formatSize(bytes: number | null): string { + if (!bytes) return '-'; + const mb = bytes / (1024 * 1024); + return `${mb.toFixed(1)} MB`; +} + +function formatDate(dateStr: string | null): string { + if (!dateStr) return '-'; + const locale = isEn.value ? 'en-US' : 'ja-JP'; + return new Date(dateStr).toLocaleDateString(locale, { + year: 'numeric', + month: 'long', + day: 'numeric', + }); +} +</script> + +<template> + <div class="download-page"> + <h1>{{ t.title }}</h1> + <p>{{ t.description }}</p> + + <div class="download-requirements"> + <p class="download-requirements-title">{{ t.requirements }}</p> + <ul> + <li><strong>Java</strong>: {{ t.javaReq }}</li> + <li><strong>Paper / Folia</strong>: {{ t.paperReq }}</li> + <li><strong>Velocity</strong>: {{ t.velocityReq }}</li> + </ul> + </div> + + <div class="download-compat-notice"> + <p class="download-compat-title">{{ t.compatible }}</p> + <p>{{ t.compatNotice }}</p> + <p><a :href="isEn ? '/en/docs/features/velocity#protocol-version' : '/docs/features/velocity#プロトコルバージョン'">{{ t.compatLink }}</a></p> + </div> + + <div class="download-grid"> + <!-- Paper / Folia --> + <div class="download-card"> + <div class="download-card-header"> + <img src="/assets/brand/paper.svg" alt="Paper" class="download-icon" /> + <div> + <h2>Paper / Folia</h2> + <p class="download-version" v-if="data.paper">v{{ data.paper.version }}</p> + <p class="download-version" v-else>{{ t.noRelease }}</p> + </div> + </div> + <div class="download-card-body" v-if="data.paper"> + <dl class="download-meta"> + <div> + <dt>{{ t.releaseDate }}</dt> + <dd>{{ formatDate(data.paper.publishedAt) }}</dd> + </div> + <div> + <dt>{{ t.fileSize }}</dt> + <dd>{{ formatSize(data.paper.fileSize) }}</dd> + </div> + <div> + <dd><code>{{ data.paper.fileName ?? '-' }}</code></dd> + </div> + </dl> + <div class="download-actions"> + <a v-if="data.paper.downloadUrl" :href="data.paper.downloadUrl" class="download-btn primary">{{ t.download }}</a> + <a :href="data.paper.releaseUrl" class="download-btn" target="_blank" rel="noopener">{{ t.releaseNotes }}</a> + </div> + </div> + <div class="download-card-body" v-else> + <p class="download-empty">{{ t.notYetReleased }}</p> + </div> + </div> + + <!-- Velocity --> + <div class="download-card"> + <div class="download-card-header"> + <img src="/assets/brand/velocity.svg" alt="Velocity" class="download-icon" /> + <div> + <h2>Velocity</h2> + <p class="download-version" v-if="data.velocity">v{{ data.velocity.version }}</p> + <p class="download-version" v-else>{{ t.noRelease }}</p> + </div> + </div> + <div class="download-card-body" v-if="data.velocity"> + <dl class="download-meta"> + <div> + <dt>{{ t.releaseDate }}</dt> + <dd>{{ formatDate(data.velocity.publishedAt) }}</dd> + </div> + <div> + <dt>{{ t.fileSize }}</dt> + <dd>{{ formatSize(data.velocity.fileSize) }}</dd> + </div> + <div> + <dd><code>{{ data.velocity.fileName ?? '-' }}</code></dd> + </div> + </dl> + <div class="download-actions"> + <a v-if="data.velocity.downloadUrl" :href="data.velocity.downloadUrl" class="download-btn primary">{{ t.download }}</a> + <a :href="data.velocity.releaseUrl" class="download-btn" target="_blank" rel="noopener">{{ t.releaseNotes }}</a> + </div> + </div> + <div class="download-card-body" v-else> + <p class="download-empty">{{ t.notYetReleased }}</p> + </div> + </div> + </div> + + <h2>Modrinth</h2> + <p>{{ t.modrinthDesc }}</p> + <div class="download-ci"> + <a href="https://modrinth.com/plugin/lunaticchat" class="download-btn" target="_blank" rel="noopener">Modrinth</a> + </div> + + <h2>{{ t.devBuilds }}</h2> + <p>{{ t.devBuildsDesc }}</p> + <div class="download-ci"> + <a :href="data.ci.url" class="download-btn" target="_blank" rel="noopener">{{ t.viewCiBuilds }}</a> + </div> + </div> +</template> + +<style scoped> +.download-page { + max-width: 768px; + margin: 0 auto; + padding: 48px 24px; +} + +.download-page h1 { + font-size: 2rem; + font-weight: 700; + margin-bottom: 8px; +} + +.download-page > p { + color: var(--vp-c-text-2); + margin-bottom: 24px; +} + +.download-page h2 { + font-size: 1.25rem; + font-weight: 600; + margin-top: 40px; + margin-bottom: 8px; + border: none; + padding: 0; +} + +.download-requirements { + border: 1px solid var(--vp-c-brand-soft); + background: var(--vp-c-brand-soft); + border-radius: 8px; + padding: 16px 20px; + margin-bottom: 24px; +} + +.download-requirements-title { + font-weight: 600; + margin-bottom: 8px; +} + +.download-requirements ul { + margin: 0; + padding-left: 20px; +} + +.download-requirements li { + font-size: 0.9rem; + line-height: 1.7; +} + +.download-compat-notice { + border: 1px solid var(--vp-c-warning-soft); + background: var(--vp-c-warning-soft); + border-radius: 8px; + padding: 16px 20px; + margin-bottom: 24px; + font-size: 0.9rem; + line-height: 1.7; +} + +.download-compat-notice p { + margin: 0; +} + +.download-compat-notice p + p { + margin-top: 8px; +} + +.download-compat-title { + font-weight: 600; + margin-bottom: 8px !important; +} + +.download-compat-notice a { + color: var(--vp-c-brand-1); + text-decoration: underline; +} + +.download-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 20px; + margin: 24px 0; +} + +@media (max-width: 640px) { + .download-grid { + grid-template-columns: 1fr; + } +} + +.download-card { + border: 1px solid var(--vp-c-divider); + border-radius: 12px; + overflow: hidden; + background: var(--vp-c-bg-soft); +} + +.download-card-header { + display: flex; + align-items: center; + gap: 16px; + padding: 24px 24px 0; +} + +.download-card-header h2 { + margin: 0; + font-size: 1.25rem; +} + +.download-icon { + width: 40px; + height: 40px; + object-fit: contain; + filter: brightness(0) saturate(100%); +} + +:global(.dark .download-icon) { + filter: brightness(0) saturate(100%) invert(1); +} + +.download-version { + margin: 2px 0 0; + font-size: 0.875rem; + color: var(--vp-c-text-2); +} + +.download-card-body { + padding: 20px 24px 24px; +} + +.download-meta { + margin: 0 0 20px; + padding: 0; +} + +.download-meta div { + display: flex; + justify-content: space-between; + padding: 6px 0; + border-bottom: 1px solid var(--vp-c-divider); + font-size: 0.875rem; +} + +.download-meta div:last-child { + border-bottom: none; +} + +.download-meta dt { + color: var(--vp-c-text-2); +} + +.download-meta dd { + margin: 0; + color: var(--vp-c-text-1); +} + +.download-actions { + display: flex; + gap: 8px; +} + +.download-btn { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 8px 20px; + border-radius: 8px; + font-size: 0.875rem; + font-weight: 500; + text-decoration: none !important; + color: var(--vp-c-text-1); + border: 1px solid var(--vp-c-divider); + background: var(--vp-c-bg); + transition: border-color 0.25s, background 0.25s; +} + +.download-btn:hover { + border-color: var(--vp-c-brand-1); +} + +.download-btn.primary { + background: var(--vp-button-brand-bg); + color: var(--vp-button-brand-text); + border-color: var(--vp-button-brand-border); +} + +.download-btn.primary:hover { + background: var(--vp-button-brand-hover-bg); + border-color: var(--vp-button-brand-hover-border); +} + +.download-empty { + color: var(--vp-c-text-3); + font-size: 0.875rem; +} + +.download-ci { + margin: 16px 0; +} +</style> diff --git a/website/.vitepress/theme/components/download.data.ts b/website/.vitepress/theme/components/download.data.ts new file mode 100644 index 0000000..11e0489 --- /dev/null +++ b/website/.vitepress/theme/components/download.data.ts @@ -0,0 +1,105 @@ +const REPO = 'm1sk9/LunaticChat'; + +interface ReleaseAsset { + name: string; + size: number; + browser_download_url: string; +} + +interface GitHubRelease { + tag_name: string; + published_at: string; + html_url: string; + assets: ReleaseAsset[]; +} + +interface PlatformRelease { + version: string; + publishedAt: string; + releaseUrl: string; + downloadUrl: string | null; + fileName: string | null; + fileSize: number | null; +} + +interface CIBuild { + url: string; +} + +export interface DownloadData { + paper: PlatformRelease | null; + velocity: PlatformRelease | null; + ci: CIBuild; +} + +async function fetchLatestRelease( + tagPrefix: string, +): Promise<GitHubRelease | null> { + const res = await fetch( + `https://api.github.com/repos/${REPO}/releases?per_page=20`, + ); + if (!res.ok) return null; + + const releases: GitHubRelease[] = await res.json(); + return ( + releases.find( + (r) => + r.tag_name.startsWith(tagPrefix) || r.tag_name.startsWith('v'), + ) ?? null + ); +} + +function parsePlatformRelease( + release: GitHubRelease | null, + jarPattern: RegExp, +): PlatformRelease | null { + if (!release) return null; + + const asset = release.assets.find((a) => jarPattern.test(a.name)); + const version = release.tag_name.replace(/^(paper\/|velocity\/)?v/, ''); + + return { + version, + publishedAt: release.published_at, + releaseUrl: release.html_url, + downloadUrl: asset?.browser_download_url ?? null, + fileName: asset?.name ?? null, + fileSize: asset?.size ?? null, + }; +} + +export default { + async load(): Promise<DownloadData> { + // Fetch all recent releases and find the latest for each platform + const res = await fetch( + `https://api.github.com/repos/${REPO}/releases?per_page=30`, + ); + const releases: GitHubRelease[] = res.ok ? await res.json() : []; + + // Find latest Paper release (paper/v* or v*) + const paperRelease = + releases.find((r) => r.tag_name.startsWith('paper/v')) ?? + releases.find((r) => /^v\d/.test(r.tag_name)) ?? + null; + + // Find latest Velocity release (velocity/v* or v*) + const velocityRelease = + releases.find((r) => r.tag_name.startsWith('velocity/v')) ?? + releases.find((r) => /^v\d/.test(r.tag_name)) ?? + null; + + return { + paper: parsePlatformRelease( + paperRelease, + /^LunaticChat-[\d.]+\.jar$/, + ), + velocity: parsePlatformRelease( + velocityRelease, + /^LunaticChat-[\d.]+-velocity\.jar$/, + ), + ci: { + url: `https://github.com/${REPO}/actions/workflows/ci.yaml?query=branch%3Amain`, + }, + }; + }, +}; diff --git a/website/.vitepress/theme/custom.css b/website/.vitepress/theme/custom.css new file mode 100644 index 0000000..1f928a1 --- /dev/null +++ b/website/.vitepress/theme/custom.css @@ -0,0 +1,188 @@ +/* ── Home page custom styles ── */ + +/* Hero tagline emphasis */ +.VPHero .tagline { + font-size: 1.2rem !important; + max-width: 560px; +} + +/* ── Feature showcase: alternating text + image ── */ +.feature-showcase { + max-width: 1152px; + margin: 0 auto; + padding: 64px 24px; + display: flex; + align-items: center; + gap: 48px; +} + +.feature-showcase.reverse { + flex-direction: row-reverse; +} + +.feature-showcase-text { + flex: 3; + min-width: 0; +} + +.feature-showcase-text h2 { + font-size: 1.75rem; + font-weight: 700; + line-height: 1.3; + margin-bottom: 16px; +} + +.feature-showcase-text p { + color: var(--vp-c-text-2); + font-size: 1rem; + line-height: 1.7; + margin-bottom: 12px; +} + +.feature-showcase-text ul { + list-style: none; + padding: 0; + margin: 16px 0 0; +} + +.feature-showcase-text ul li { + position: relative; + padding-left: 24px; + color: var(--vp-c-text-2); + font-size: 0.95rem; + line-height: 1.7; + margin-bottom: 8px; +} + +.feature-showcase-text ul li::before { + content: ''; + position: absolute; + left: 0; + top: 10px; + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--vp-c-brand-1); +} + +.feature-showcase-image { + flex: 3; + min-width: 0; +} + +.feature-showcase-image img { + width: 100%; + border-radius: 12px; + border: 1px solid var(--vp-c-divider); + box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08); +} + +.feature-showcase-image .image-placeholder { + width: 100%; + aspect-ratio: 16 / 10; + border-radius: 12px; + border: 2px dashed var(--vp-c-divider); + background: var(--vp-c-bg-soft); + display: flex; + align-items: center; + justify-content: center; + color: var(--vp-c-text-3); + font-size: 0.875rem; +} + +@media (max-width: 768px) { + .feature-showcase, + .feature-showcase.reverse { + flex-direction: column; + padding: 40px 24px; + gap: 32px; + } +} + +/* ── Platform cards ── */ +.platform-section { + max-width: 1024px; + margin: 0 auto; + padding: 64px 24px; + text-align: center; +} + +.platform-section h2 { + font-size: 1.75rem; + font-weight: 700; + margin-bottom: 8px; +} + +.platform-section .section-desc { + color: var(--vp-c-text-2); + margin-bottom: 32px; + font-size: 1rem; +} + +.platform-cards { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 16px; +} + +@media (max-width: 640px) { + .platform-cards { + grid-template-columns: 1fr; + } +} + +.platform-card { + display: block; + border: 1px solid var(--vp-c-divider); + border-radius: 12px; + padding: 24px 16px; + background: var(--vp-c-bg-soft); + transition: border-color 0.25s, box-shadow 0.25s; + text-decoration: none !important; + color: inherit; +} + +.platform-card:hover { + border-color: var(--vp-c-brand-1); + box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06); +} + +.platform-icon { + margin-bottom: 12px; + height: 40px; + display: flex; + align-items: center; + justify-content: center; +} + +.platform-icon img { + width: 40px; + height: 40px; + object-fit: contain; + filter: brightness(0) saturate(100%); +} + +.dark .platform-icon img { + filter: brightness(0) saturate(100%) invert(1); +} + +.platform-card .name { + font-size: 1.1rem; + font-weight: 600; + margin-bottom: 8px; + color: var(--vp-c-text-1); +} + +.platform-card .desc { + font-size: 0.875rem; + color: var(--vp-c-text-2); + line-height: 1.6; +} + +/* ── Divider ── */ +.home-divider { + max-width: 1024px; + margin: 0 auto; + border: none; + border-top: 1px solid var(--vp-c-divider); +} diff --git a/website/.vitepress/theme/index.ts b/website/.vitepress/theme/index.ts new file mode 100644 index 0000000..bc82522 --- /dev/null +++ b/website/.vitepress/theme/index.ts @@ -0,0 +1,11 @@ +import type { Theme } from 'vitepress'; +import DefaultTheme from 'vitepress/theme'; +import DownloadCard from './components/DownloadCard.vue'; +import './custom.css'; + +export default { + extends: DefaultTheme, + enhanceApp({ app }) { + app.component('DownloadCard', DownloadCard); + }, +} satisfies Theme; diff --git a/docs/biome.jsonc b/website/biome.jsonc index ac66012..ac66012 100644 --- a/docs/biome.jsonc +++ b/website/biome.jsonc diff --git a/docs/bun.lock b/website/bun.lock index 1d0314b..63d664a 100644 --- a/docs/bun.lock +++ b/website/bun.lock @@ -4,11 +4,11 @@ "workspaces": { "": { "dependencies": { - "@viteplus/versions": "^2.0.6", "wrangler": "^4.69.0", }, "devDependencies": { "@biomejs/biome": "2.4.10", + "@types/bun": "^1.3.11", "husky": "^9.1.7", "vitepress": "^1.6.4", }, @@ -99,8 +99,6 @@ "@docsearch/react": ["@docsearch/react@3.8.2", "", { "dependencies": { "@algolia/autocomplete-core": "1.17.7", "@algolia/autocomplete-preset-algolia": "1.17.7", "@docsearch/css": "3.8.2", "algoliasearch": "^5.14.2" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 19.0.0", "react": ">= 16.8.0 < 19.0.0", "react-dom": ">= 16.8.0 < 19.0.0", "search-insights": ">= 1 < 3" }, "optionalPeers": ["@types/react", "react", "react-dom", "search-insights"] }, "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg=="], - "@docsearch/sidepanel-js": ["@docsearch/sidepanel-js@4.6.0", "", {}, "sha512-lFT5KLwlzUmpoGArCScNoK41l9a22JYsEPwBzMrz+/ILVR5Ax87UphCuiyDFQWEvEmbwzn/kJx5W/O5BUlN1Rw=="], - "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], @@ -221,10 +219,6 @@ "@poppinss/exception": ["@poppinss/exception@1.2.3", "", {}, "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw=="], - "@remotex-labs/xansi": ["@remotex-labs/xansi@1.3.3", "", {}, "sha512-P5qKSYLA5508Wt/lh4gUsGW7VO30hL6alswS713WnrYzo5xGknG2O5OddD1Ae/dRzP8e0H1rBJuf1v1ztu3IFQ=="], - - "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.2", "", {}, "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.59.0", "", { "os": "android", "cpu": "arm" }, "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg=="], "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.59.0", "", { "os": "android", "cpu": "arm64" }, "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q=="], @@ -295,6 +289,8 @@ "@speed-highlight/core": ["@speed-highlight/core@1.2.14", "", {}, "sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA=="], + "@types/bun": ["@types/bun@1.3.11", "", { "dependencies": { "bun-types": "1.3.11" } }, "sha512-5vPne5QvtpjGpsGYXiFyycfpDF2ECyPcTSsFBMa0fraoxiQyMJ3SmuQIGhzPg2WJuWxVBoxWJ2kClYTcw/4fAg=="], + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], @@ -307,6 +303,8 @@ "@types/mdurl": ["@types/mdurl@2.0.0", "", {}, "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg=="], + "@types/node": ["@types/node@25.5.2", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg=="], + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], "@types/web-bluetooth": ["@types/web-bluetooth@0.0.21", "", {}, "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA=="], @@ -315,8 +313,6 @@ "@vitejs/plugin-vue": ["@vitejs/plugin-vue@5.2.4", "", { "peerDependencies": { "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA=="], - "@viteplus/versions": ["@viteplus/versions@2.0.6", "", { "dependencies": { "@remotex-labs/xansi": "^1.3.3", "vitepress": "^2.0.0-alpha.12" } }, "sha512-13XNud+sCGTOs1L6Z0Ru7TxwkYmTknGSm/KU7/5wXR7vwMPqaPByC/A4H6R2R3aF8uK4Y1Y9bXyBQYJyYc3/Cw=="], - "@vue/compiler-core": ["@vue/compiler-core@3.5.29", "", { "dependencies": { "@babel/parser": "^7.29.0", "@vue/shared": "3.5.29", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw=="], "@vue/compiler-dom": ["@vue/compiler-dom@3.5.29", "", { "dependencies": { "@vue/compiler-core": "3.5.29", "@vue/shared": "3.5.29" } }, "sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg=="], @@ -355,6 +351,8 @@ "blake3-wasm": ["blake3-wasm@2.1.5", "", {}, "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g=="], + "bun-types": ["bun-types@1.3.11", "", { "dependencies": { "@types/node": "*" } }, "sha512-1KGPpoxQWl9f6wcZh57LvrPIInQMn2TQ7jsgxqpRzg+l0QPOFvJVH7HmvHo/AiPgwXy+/Thf6Ov3EdVn1vOabg=="], + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], @@ -385,8 +383,6 @@ "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], - "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], - "focus-trap": ["focus-trap@7.8.0", "", { "dependencies": { "tabbable": "^6.4.0" } }, "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA=="], "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], @@ -429,8 +425,6 @@ "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], - "oniguruma-parser": ["oniguruma-parser@0.12.1", "", {}, "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w=="], - "oniguruma-to-es": ["oniguruma-to-es@3.1.1", "", { "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ=="], "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="], @@ -441,8 +435,6 @@ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], "preact": ["preact@10.28.4", "", {}, "sha512-uKFfOHWuSNpRFVTnljsCluEFq57OKT+0QdOiQo8XWnQ/pSvg7OpX5eNOejELXJMWy+BwM2nobz0FkvzmnpCNsQ=="], @@ -481,14 +473,14 @@ "tabbable": ["tabbable@6.4.0", "", {}, "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg=="], - "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], - "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "undici": ["undici@7.18.2", "", {}, "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw=="], + "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], + "unenv": ["unenv@2.0.0-rc.24", "", { "dependencies": { "pathe": "^2.0.3" } }, "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw=="], "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], @@ -523,32 +515,8 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - "@viteplus/versions/vitepress": ["vitepress@2.0.0-alpha.16", "", { "dependencies": { "@docsearch/css": "^4.5.3", "@docsearch/js": "^4.5.3", "@docsearch/sidepanel-js": "^4.5.3", "@iconify-json/simple-icons": "^1.2.68", "@shikijs/core": "^3.21.0", "@shikijs/transformers": "^3.21.0", "@shikijs/types": "^3.21.0", "@types/markdown-it": "^14.1.2", "@vitejs/plugin-vue": "^6.0.3", "@vue/devtools-api": "^8.0.5", "@vue/shared": "^3.5.27", "@vueuse/core": "^14.1.0", "@vueuse/integrations": "^14.1.0", "focus-trap": "^7.8.0", "mark.js": "8.11.1", "minisearch": "^7.2.0", "shiki": "^3.21.0", "vite": "^7.3.1", "vue": "^3.5.27" }, "peerDependencies": { "markdown-it-mathjax3": "^4", "oxc-minify": "*", "postcss": "^8" }, "optionalPeers": ["markdown-it-mathjax3", "oxc-minify", "postcss"], "bin": { "vitepress": "bin/vitepress.js" } }, "sha512-w1nwsefDVIsje7BZr2tsKxkZutDGjG0YoQ2yxO7+a9tvYVqfljYbwj5LMYkPy8Tb7YbPwa22HtIhk62jbrvuEQ=="], - "vite/esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], - "@viteplus/versions/vitepress/@docsearch/css": ["@docsearch/css@4.6.0", "", {}, "sha512-YlcAimkXclvqta47g47efzCM5CFxDwv2ClkDfEs/fC/Ak0OxPH2b3czwa4o8O1TRBf+ujFF2RiUwszz2fPVNJQ=="], - - "@viteplus/versions/vitepress/@docsearch/js": ["@docsearch/js@4.6.0", "", {}, "sha512-9/rbgkm/BgTq46cwxIohvSAz3koOFjnPpg0mwkJItAfzKbQIj+310PvwtgUY1YITDuGCag6yOL50GW2DBkaaBw=="], - - "@viteplus/versions/vitepress/@shikijs/core": ["@shikijs/core@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA=="], - - "@viteplus/versions/vitepress/@shikijs/transformers": ["@shikijs/transformers@3.23.0", "", { "dependencies": { "@shikijs/core": "3.23.0", "@shikijs/types": "3.23.0" } }, "sha512-F9msZVxdF+krQNSdQ4V+Ja5QemeAoTQ2jxt7nJCwhDsdF1JWS3KxIQXA3lQbyKwS3J61oHRUSv4jYWv3CkaKTQ=="], - - "@viteplus/versions/vitepress/@shikijs/types": ["@shikijs/types@3.23.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ=="], - - "@viteplus/versions/vitepress/@vitejs/plugin-vue": ["@vitejs/plugin-vue@6.0.4", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-rc.2" }, "peerDependencies": { "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "vue": "^3.2.25" } }, "sha512-uM5iXipgYIn13UUQCZNdWkYk+sysBeA97d5mHsAoAt1u/wpN3+zxOmsVJWosuzX+IMGRzeYUNytztrYznboIkQ=="], - - "@viteplus/versions/vitepress/@vue/devtools-api": ["@vue/devtools-api@8.0.7", "", { "dependencies": { "@vue/devtools-kit": "^8.0.7" } }, "sha512-tc1TXAxclsn55JblLkFVcIRG7MeSJC4fWsPjfM7qu/IcmPUYnQ5Q8vzWwBpyDY24ZjmZTUCCwjRSNbx58IhlAA=="], - - "@viteplus/versions/vitepress/@vueuse/core": ["@vueuse/core@14.2.1", "", { "dependencies": { "@types/web-bluetooth": "^0.0.21", "@vueuse/metadata": "14.2.1", "@vueuse/shared": "14.2.1" }, "peerDependencies": { "vue": "^3.5.0" } }, "sha512-3vwDzV+GDUNpdegRY6kzpLm4Igptq+GA0QkJ3W61Iv27YWwW/ufSlOfgQIpN6FZRMG0mkaz4gglJRtq5SeJyIQ=="], - - "@viteplus/versions/vitepress/@vueuse/integrations": ["@vueuse/integrations@14.2.1", "", { "dependencies": { "@vueuse/core": "14.2.1", "@vueuse/shared": "14.2.1" }, "peerDependencies": { "async-validator": "^4", "axios": "^1", "change-case": "^5", "drauu": "^0.4", "focus-trap": "^7 || ^8", "fuse.js": "^7", "idb-keyval": "^6", "jwt-decode": "^4", "nprogress": "^0.2", "qrcode": "^1.5", "sortablejs": "^1", "universal-cookie": "^7 || ^8", "vue": "^3.5.0" }, "optionalPeers": ["async-validator", "axios", "change-case", "drauu", "focus-trap", "fuse.js", "idb-keyval", "jwt-decode", "nprogress", "qrcode", "sortablejs", "universal-cookie"] }, "sha512-2LIUpBi/67PoXJGqSDQUF0pgQWpNHh7beiA+KG2AbybcNm+pTGWT6oPGlBgUoDWmYwfeQqM/uzOHqcILpKL7nA=="], - - "@viteplus/versions/vitepress/shiki": ["shiki@3.23.0", "", { "dependencies": { "@shikijs/core": "3.23.0", "@shikijs/engine-javascript": "3.23.0", "@shikijs/engine-oniguruma": "3.23.0", "@shikijs/langs": "3.23.0", "@shikijs/themes": "3.23.0", "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA=="], - - "@viteplus/versions/vitepress/vite": ["vite@7.3.1", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA=="], - "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], @@ -594,27 +562,5 @@ "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], - - "@viteplus/versions/vitepress/@vue/devtools-api/@vue/devtools-kit": ["@vue/devtools-kit@8.0.7", "", { "dependencies": { "@vue/devtools-shared": "^8.0.7", "birpc": "^2.6.1", "hookable": "^5.5.3", "perfect-debounce": "^2.0.0" } }, "sha512-H6esJGHGl5q0E9iV3m2EoBQHJ+V83WMW83A0/+Fn95eZ2iIvdsq4+UCS6yT/Fdd4cGZSchx/MdWDreM3WqMsDw=="], - - "@viteplus/versions/vitepress/@vueuse/core/@vueuse/metadata": ["@vueuse/metadata@14.2.1", "", {}, "sha512-1ButlVtj5Sb/HDtIy1HFr1VqCP4G6Ypqt5MAo0lCgjokrk2mvQKsK2uuy0vqu/Ks+sHfuHo0B9Y9jn9xKdjZsw=="], - - "@viteplus/versions/vitepress/@vueuse/core/@vueuse/shared": ["@vueuse/shared@14.2.1", "", { "peerDependencies": { "vue": "^3.5.0" } }, "sha512-shTJncjV9JTI4oVNyF1FQonetYAiTBd+Qj7cY89SWbXSkx7gyhrgtEdF2ZAVWS1S3SHlaROO6F2IesJxQEkZBw=="], - - "@viteplus/versions/vitepress/@vueuse/integrations/@vueuse/shared": ["@vueuse/shared@14.2.1", "", { "peerDependencies": { "vue": "^3.5.0" } }, "sha512-shTJncjV9JTI4oVNyF1FQonetYAiTBd+Qj7cY89SWbXSkx7gyhrgtEdF2ZAVWS1S3SHlaROO6F2IesJxQEkZBw=="], - - "@viteplus/versions/vitepress/shiki/@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA=="], - - "@viteplus/versions/vitepress/shiki/@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g=="], - - "@viteplus/versions/vitepress/shiki/@shikijs/langs": ["@shikijs/langs@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg=="], - - "@viteplus/versions/vitepress/shiki/@shikijs/themes": ["@shikijs/themes@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA=="], - - "@viteplus/versions/vitepress/@vue/devtools-api/@vue/devtools-kit/@vue/devtools-shared": ["@vue/devtools-shared@8.0.7", "", {}, "sha512-CgAb9oJH5NUmbQRdYDj/1zMiaICYSLtm+B1kxcP72LBrifGAjUmt8bx52dDH1gWRPlQgxGPqpAMKavzVirAEhA=="], - - "@viteplus/versions/vitepress/@vue/devtools-api/@vue/devtools-kit/perfect-debounce": ["perfect-debounce@2.1.0", "", {}, "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g=="], - - "@viteplus/versions/vitepress/shiki/@shikijs/engine-javascript/oniguruma-to-es": ["oniguruma-to-es@4.3.4", "", { "dependencies": { "oniguruma-parser": "^0.12.1", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA=="], } } diff --git a/docs/package.json b/website/package.json index 8b6506d..361214b 100644 --- a/docs/package.json +++ b/website/package.json @@ -12,11 +12,11 @@ }, "devDependencies": { "@biomejs/biome": "2.4.10", + "@types/bun": "^1.3.11", "husky": "^9.1.7", "vitepress": "^1.6.4" }, "dependencies": { - "@viteplus/versions": "^2.0.6", "wrangler": "^4.69.0" } } diff --git a/website/src/assets/brand/LICENSE b/website/src/assets/brand/LICENSE new file mode 100644 index 0000000..bff9945 --- /dev/null +++ b/website/src/assets/brand/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 PaperMC Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/website/src/assets/brand/folia.svg b/website/src/assets/brand/folia.svg new file mode 100644 index 0000000..59a821b --- /dev/null +++ b/website/src/assets/brand/folia.svg @@ -0,0 +1,3 @@ +<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> +<path d="M17,8C8,10 5.9,16.17 3.82,21.34L5.71,22L6.66,19.7C7.14,19.87 7.64,20 8,20C19,20 22,3 22,3C21,5 14,5.25 9,6.25C4,7.25 2,11.5 2,13.5C2,15.5 3.75,17.25 3.75,17.25C7,8 17,8 17,8Z" fill="currentColor"/> +</svg> diff --git a/website/src/assets/brand/paper.svg b/website/src/assets/brand/paper.svg new file mode 100644 index 0000000..126e636 --- /dev/null +++ b/website/src/assets/brand/paper.svg @@ -0,0 +1,3 @@ +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M23.9871 1.00449L20.5586 21.5759C20.5185 21.8303 20.3579 22.0446 20.13 22.1781C20.0027 22.2479 19.8599 22.2847 19.7147 22.2853C19.6044 22.2824 19.4956 22.2597 19.3933 22.2183L13.3263 19.7406L10.0852 23.6917C10.0062 23.7893 9.90612 23.8677 9.79248 23.921C9.67884 23.9744 9.55459 24.0014 9.42905 23.9999C9.32829 24.0017 9.22817 23.9835 9.13446 23.9464C8.96962 23.8865 8.82722 23.7773 8.72657 23.6336C8.62593 23.49 8.57192 23.3188 8.57187 23.1434V18.4686L20.1433 4.28567L5.82693 16.6739L0.536782 14.5044C0.228637 14.3839 0.0278925 14.1029 0.00104276 13.7679C-0.0067358 13.6096 0.029121 13.4521 0.104701 13.3128C0.18028 13.1734 0.292678 13.0575 0.429633 12.9777L22.7146 0.120453C22.8439 0.0420511 22.9921 0.000404741 23.1432 4.67454e-06C23.3151 -0.000564065 23.4831 0.0507774 23.6253 0.147303C23.7607 0.241085 23.8667 0.3715 23.9308 0.523296C23.9949 0.675093 24.0144 0.841995 23.9871 1.00449Z" fill="currentColor"/> +</svg> diff --git a/website/src/assets/brand/velocity.svg b/website/src/assets/brand/velocity.svg new file mode 100644 index 0000000..ee24f2b --- /dev/null +++ b/website/src/assets/brand/velocity.svg @@ -0,0 +1,12 @@ +<svg width="34" height="34" viewBox="0 0 34 34" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_313_379)"> +<path d="M15.9489 15.1371L11.7286 9.37874C11.6243 9.23621 11.4813 9.12653 11.3166 9.06265C11.1519 8.99876 10.9724 8.98334 10.7992 9.01821L4.06776 10.3784C3.93676 10.4053 3.81314 10.4603 3.70538 10.5395C3.59762 10.6187 3.50827 10.7203 3.44346 10.8372L0.115968 16.8516C0.0302571 17.0061 -0.00934416 17.1819 0.00185928 17.3583C0.0130627 17.5346 0.0746008 17.7041 0.179177 17.8465L4.40956 23.6213C4.51392 23.7638 4.65689 23.8735 4.82158 23.9374C4.98627 24.0012 5.16581 24.0167 5.33898 23.9818L12.0502 22.6263C12.1813 22.5994 12.305 22.5444 12.4128 22.465C12.5206 22.3857 12.6099 22.2839 12.6745 22.1667L16.0129 16.1344C16.0988 15.9795 16.1384 15.8031 16.1271 15.6264C16.1157 15.4496 16.0539 15.2798 15.9489 15.1371V15.1371ZM11.3096 20.9282C11.2305 20.9864 11.1406 21.0283 11.0453 21.0517C10.9499 21.0751 10.8508 21.0795 10.7538 21.0645C10.6567 21.0496 10.5636 21.0157 10.4796 20.9647C10.3957 20.9137 10.3227 20.8467 10.2647 20.7675L7.84553 17.4712C7.70493 17.2801 7.51283 17.1331 7.29171 17.0473C7.07058 16.9615 6.82959 16.9404 6.59694 16.9866L2.49375 17.8161C2.39752 17.8356 2.2984 17.8359 2.20205 17.8171C2.10569 17.7982 2.01399 17.7606 1.93218 17.7063C1.85036 17.652 1.78004 17.5822 1.72523 17.5007C1.67042 17.4193 1.63218 17.3278 1.61272 17.2316C1.57333 17.0376 1.6125 16.8359 1.72163 16.6707C1.83077 16.5055 2.00096 16.3904 2.19487 16.3506L6.64298 15.4516C6.81991 15.4157 6.98695 15.3418 7.13259 15.2351C7.27823 15.1284 7.39899 14.9914 7.48656 14.8335L9.71919 10.8021C9.81511 10.629 9.97577 10.501 10.1659 10.4461C10.3561 10.3912 10.5603 10.414 10.7337 10.5095C10.9068 10.6054 11.0348 10.7661 11.0897 10.9562C11.1446 11.1464 11.1218 11.3506 11.0263 11.524L8.96926 15.2502C8.8545 15.4584 8.80155 15.695 8.81662 15.9322C8.83168 16.1694 8.91415 16.3974 9.05432 16.5894L11.4735 19.8849C11.5899 20.045 11.638 20.2448 11.6073 20.4404C11.5766 20.636 11.4695 20.8115 11.3096 20.9282V20.9282Z" fill="currentColor"/> +<path d="M30.0103 16.182C30.4339 16.182 30.7774 15.8385 30.7774 15.4149C30.7774 14.9912 30.4339 14.6478 30.0103 14.6478C29.5866 14.6478 29.2432 14.9912 29.2432 15.4149C29.2432 15.8385 29.5866 16.182 30.0103 16.182Z" fill="currentColor"/> +<path d="M33.2757 17.7162H19.4031C19.1997 17.7162 19.0046 17.6354 18.8607 17.4915C18.7168 17.3477 18.636 17.1525 18.636 16.9491C18.636 16.7457 18.7168 16.5505 18.8607 16.4067C19.0046 16.2628 19.1997 16.182 19.4031 16.182H27.6922C27.8915 16.1756 28.0805 16.092 28.2193 15.9488C28.358 15.8055 28.4356 15.6139 28.4356 15.4145C28.4356 15.2151 28.358 15.0235 28.2193 14.8803C28.0805 14.737 27.8915 14.6534 27.6922 14.647H22.214C22.0106 14.647 21.8154 14.5662 21.6716 14.4223C21.5277 14.2785 21.4469 14.0834 21.4469 13.8799C21.4469 13.6765 21.5277 13.4813 21.6716 13.3375C21.8154 13.1936 22.0106 13.1128 22.214 13.1128H30.514C30.7133 13.1064 30.9024 13.0228 31.0411 12.8796C31.1798 12.7363 31.2574 12.5447 31.2574 12.3453C31.2574 12.1459 31.1798 11.9543 31.0411 11.8111C30.9024 11.6678 30.7133 11.5842 30.514 11.5778H13.3404L15.9484 15.1371C16.0528 15.2796 16.1143 15.449 16.1255 15.6253C16.1367 15.8016 16.0972 15.9775 16.0116 16.1321L12.6732 22.1643C12.6423 22.22 12.6057 22.2723 12.564 22.3204H29.1304C29.3339 22.3204 29.529 22.2396 29.6728 22.0957C29.8167 21.9518 29.8975 21.7567 29.8975 21.5533C29.8975 21.3498 29.8167 21.1547 29.6728 21.0109C29.529 20.867 29.3339 20.7862 29.1304 20.7862H24.9531C24.8503 20.7895 24.7478 20.772 24.6518 20.7349C24.5558 20.6978 24.4683 20.6418 24.3944 20.5702C24.3205 20.4987 24.2617 20.4129 24.2216 20.3182C24.1814 20.2234 24.1607 20.1216 24.1607 20.0187C24.1607 19.9158 24.1814 19.8139 24.2216 19.7192C24.2617 19.6244 24.3205 19.5387 24.3944 19.4671C24.4683 19.3955 24.5558 19.3395 24.6518 19.3024C24.7478 19.2653 24.8503 19.2479 24.9531 19.2512H33.2757C33.3786 19.2545 33.4811 19.237 33.577 19.2C33.673 19.1629 33.7606 19.1069 33.8345 19.0353C33.9084 18.9637 33.9672 18.8779 34.0073 18.7832C34.0474 18.6884 34.0681 18.5866 34.0681 18.4837C34.0681 18.3808 34.0474 18.2789 34.0073 18.1842C33.9672 18.0894 33.9084 18.0037 33.8345 17.9321C33.7606 17.8605 33.673 17.8045 33.577 17.7674C33.4811 17.7303 33.3786 17.7129 33.2757 17.7162V17.7162Z" fill="currentColor"/> +</g> +<defs> +<clipPath id="clip0_313_379"> +<rect width="34" height="34" fill="white"/> +</clipPath> +</defs> +</svg> diff --git a/website/src/assets/features/channel-chat.png b/website/src/assets/features/channel-chat.png Binary files differnew file mode 100644 index 0000000..4f9dab2 --- /dev/null +++ b/website/src/assets/features/channel-chat.png diff --git a/website/src/assets/features/cross-chat.png b/website/src/assets/features/cross-chat.png Binary files differnew file mode 100644 index 0000000..34857e2 --- /dev/null +++ b/website/src/assets/features/cross-chat.png diff --git a/website/src/assets/features/dm.png b/website/src/assets/features/dm.png Binary files differnew file mode 100644 index 0000000..bcc429d --- /dev/null +++ b/website/src/assets/features/dm.png diff --git a/website/src/assets/features/romaji.png b/website/src/assets/features/romaji.png Binary files differnew file mode 100644 index 0000000..fd1dd9b --- /dev/null +++ b/website/src/assets/features/romaji.png diff --git a/docs/.vitepress/public/icon.png b/website/src/assets/icon.png Binary files differindex 064445a..064445a 100644 --- a/docs/.vitepress/public/icon.png +++ b/website/src/assets/icon.png diff --git a/website/src/docs/configuration.md b/website/src/docs/configuration.md new file mode 100644 index 0000000..8e603de --- /dev/null +++ b/website/src/docs/configuration.md @@ -0,0 +1,73 @@ +--- +layout: doc +--- + +# 設定 + +LunaticChat の設定は `plugins/LunaticChat/config.yml` で管理されます.サーバーの初回起動時にデフォルトの設定ファイルが生成されます. + +## グローバル設定 + +| キー | 型 | デフォルト | 説明 | +|------|------|------------|------| +| `debug` | Boolean | `false` | デバッグログを有効にする | +| `userSettingsFilePath` | String | `"player-settings.yaml"` | プレイヤー設定ファイルのパス | +| `checkForUpdates` | Boolean | `true` | 起動時にアップデートを確認する | +| `language` | String | `"en"` | プラグインの言語 (`en` / `ja`) | + +## 機能設定 (`features`) + +### クイックリプライ (`features.quickReplies`) + +| キー | 型 | デフォルト | 説明 | +|------|------|------------|------| +| `enabled` | Boolean | `true` | `/reply` コマンドを有効にする | + +### ローマ字変換 (`features.japaneseConversion`) + +| キー | 型 | デフォルト | 説明 | +|------|------|------------|------| +| `enabled` | Boolean | `false` | ローマ字→ひらがな変換を有効にする | +| `cache.maxEntries` | Int | `500` | 変換キャッシュの最大エントリ数 | +| `cache.saveIntervalSeconds` | Int | `300` | キャッシュのディスク保存間隔(秒) | +| `cache.filePath` | String | `"conversion_cache.json"` | キャッシュファイルのパス | +| `api.timeout` | Long | `3000` | API リクエストのタイムアウト(ミリ秒) | +| `api.retryAttempts` | Int | `2` | API リクエスト失敗時のリトライ回数 | + +### チャンネルチャット (`features.channelChat`) + +| キー | 型 | デフォルト | 説明 | +|------|------|------------|------| +| `enabled` | Boolean | `false` | チャンネルチャット機能を有効にする | +| `maxChannelsPerServer` | Int | `0` | サーバーあたりの最大チャンネル数(`0` = 無制限) | +| `maxMembersPerChannel` | Int | `0` | チャンネルあたりの最大メンバー数(`0` = 無制限) | +| `maxMembershipPerPlayer` | Int | `0` | プレイヤーあたりの最大参加チャンネル数(`0` = 無制限) | + +#### メッセージログ (`features.channelChat.messageLogging`) + +| キー | 型 | デフォルト | 説明 | +|------|------|------------|------| +| `enabled` | Boolean | `true` | チャンネルメッセージを NDJSON ファイルに記録する | +| `retentionDays` | Int | `30` | ログファイルの保持日数(`0` = 無期限) | +| `maxFileSizeMB` | Int | `100` | 単一ログファイルの最大サイズ(MB) | + +### Velocity 連携 (`features.velocityIntegration`) + +| キー | 型 | デフォルト | 説明 | +|------|------|------------|------| +| `enabled` | Boolean | `false` | Velocity プロキシとの連携を有効にする | +| `crossServerGlobalChat` | Boolean | `false` | サーバー間グローバルチャットを有効にする | +| `serverName` | String | `"Unknown"` | クロスサーバーチャットで表示されるサーバー名 | +| `messageDeduplicationCacheSize` | Int | `100` | メッセージ重複排除キャッシュのサイズ | + +## メッセージフォーマット (`messageFormat`) + +| キー | デフォルト | 利用可能なプレースホルダー | +|------|------------|--------------------------| +| `directMessageFormat` | `§7[§e{sender} §7>> §e{recipient}§7] §f{message}` | `{sender}`, `{recipient}`, `{message}` | +| `channelMessageFormat` | `§7[§b#{channel}§7] §e{sender}: §f{message}` | `{sender}`, `{message}`, `{channel}` | +| `crossServerGlobalChatFormat` | `§7[§6{server}§7] §e{sender}: §f{message}` | `{sender}`, `{message}`, `{server}` | + +## デフォルト設定ファイル + +[GitHub で確認する](https://github.com/m1sk9/LunaticChat/blob/main/platform-paper/src/main/resources/config.yml) diff --git a/website/src/docs/features/admin.md b/website/src/docs/features/admin.md new file mode 100644 index 0000000..57d38c0 --- /dev/null +++ b/website/src/docs/features/admin.md @@ -0,0 +1,74 @@ +--- +layout: doc +--- + +# 管理者向け機能 + +サーバー管理者向けの機能をまとめて解説します.これらの機能は主に OP 権限を持つプレイヤーが利用できます. + +## プラグインステータス (`/lc status`) + +プラグインの動作状況を一覧で確認できます. + +``` +/lc status +``` + +表示される情報: + +- プラグインバージョン (Git コミットハッシュ付き) +- ヘルスステータス (OK / Degraded) +- 各機能の有効/無効状態 +- 設定値 (デバッグモード,アップデート確認,言語) +- GitHub,Modrinth,ドキュメントへのリンク + +## スパイモード + +`lunaticchat.spy` パーミッション (デフォルト: op) を持つプレイヤーは,サーバー上で送受信されるすべてのダイレクトメッセージを閲覧できます. + +- スパイプレイヤーにはローマ字変換前の元のメッセージが表示されます +- ホバーテキストでスパイメッセージであることが示されます +- スパイプレイヤー自身は通常の送受信者リストには含まれません + +## チャンネルバイパス + +`lunaticchat.channelbypass` パーミッション (デフォルト: op) を持つプレイヤーは,チャンネルに関する以下の制限を無視できます. + +- キック・BAN の対象にならない +- オーナーでなくてもチャンネルを削除できる + +## アップデート通知 + +`checkForUpdates` が `true` (デフォルト) の場合,プラグインは起動時に新しいバージョンが利用可能か確認します.`lunaticchat.noticeupdate` パーミッション (デフォルト: op) を持つプレイヤーがサーバーに参加した際にアップデート通知が表示されます. + +```yaml +# config.yml +checkForUpdates: true +``` + +## デバッグモード + +`debug` を `true` にすると,プラグインの詳細なログが出力されます.問題の調査やバグ報告時に有用です. + +```yaml +# config.yml +debug: true +``` + +## 言語設定 + +プレイヤーに表示されるメッセージの言語を切り替えられます.プラグインログやコンソール出力には影響せず,英語のみ出力となります. + +```yaml +# config.yml +language: "ja" # "en" または "ja" +``` + +## 管理者パーミッション一覧 + +| パーミッション | デフォルト | 説明 | +|---------------|-----------|------| +| `lunaticchat.spy` | op | 全ダイレクトメッセージの閲覧 | +| `lunaticchat.channelbypass` | op | チャンネル制限のバイパス | +| `lunaticchat.noticeupdate` | op | アップデート通知の受信 | +| `lunaticchat.command.lcv.status` | op | `/lcv status` コマンドの使用 | diff --git a/website/src/docs/features/channel-chat.md b/website/src/docs/features/channel-chat.md new file mode 100644 index 0000000..b0caa43 --- /dev/null +++ b/website/src/docs/features/channel-chat.md @@ -0,0 +1,92 @@ +--- +layout: doc +--- + +# チャンネルチャット + +チャンネルを作成してグループごとに会話を分離できます.この機能を利用するには `config.yml` で `features.channelChat.enabled` を `true` に設定してください. + +## チャンネルの作成 + +``` +/lc channel create <channelId> <name> [description] [isPrivate] +``` + +- `channelId`: チャンネルの一意な識別子 (英数字, `_`, `-` のみ, 3〜30文字) +- `name`: チャンネルの表示名 +- `description`: チャンネルの説明 (省略可) +- `isPrivate`: プライベートチャンネルにする場合は `true` (デフォルト: `false`) + +作成者は自動的にオーナーになります. + +## チャンネルへの参加・退出 + +``` +/lc channel join <channelId> # チャンネルに参加 +/lc channel leave # アクティブチャンネルから退出 +/lc channel switch <channelId> # アクティブチャンネルを切り替え +``` + +プライベートチャンネルに参加するには,オーナーまたはモデレーターからの招待が必要です. + +## アクティブチャンネル + +プレイヤーは複数のチャンネルに参加できますが,一度にアクティブにできるチャンネルは1つです.チャットメッセージはアクティブチャンネルに送信されます.`/lc channel switch` でアクティブチャンネルを切り替えられます. + +``` +/lc channel status # 現在のアクティブチャンネルと参加チャンネル一覧を表示 +``` + +## ロールと権限 + +チャンネルには3つのロールがあります. + +| ロール | 権限 | +|--------|------| +| **OWNER** | チャンネルの削除,モデレーター管理,オーナー譲渡,メンバー管理 | +| **MODERATOR** | メンバーの招待,キック,BAN/BAN解除 | +| **MEMBER** | チャットへの参加,チャンネル情報の閲覧 | + +### モデレーター管理 (オーナーのみ) + +``` +/lc channel mod <playerName> # モデレーター権限の付与/剥奪 +/lc channel ownership <playerName> # オーナー権限の譲渡 +``` + +### メンバー管理 (オーナー / モデレーター) + +``` +/lc channel invite <playerName> # プレイヤーを招待 +/lc channel kick <playerName> # プレイヤーをキック +/lc channel ban <playerName> # プレイヤーを BAN +/lc channel unban <playerName> # BAN を解除 +``` + +## 制限設定 + +`config.yml` でチャンネルの上限を設定できます (すべて `0` で無制限) . + +| 設定キー | 説明 | +|----------|------| +| `maxChannelsPerServer` | サーバーあたりの最大チャンネル数 | +| `maxMembersPerChannel` | チャンネルあたりの最大メンバー数 | +| `maxMembershipPerPlayer` | プレイヤーあたりの最大参加チャンネル数 | + +## メッセージログ + +チャンネルメッセージは NDJSON 形式でログファイルに記録できます.ファイルは日次でローテーションされ,`maxFileSizeMB` を超えるとサフィックス付きの新しいファイルが作成されます. + +```json +{"timestamp":"2026-04-05T14:23:45.123Z","playerId":"550e8400-...","playerName":"Steve","channelId":"general","message":"Hello!"} +``` + +ログ設定の詳細は[設定ページ](/docs/configuration)の `features.channelChat.messageLogging` を参照してください. + +## バイパス権限 + +`lunaticchat.channelbypass` パーミッション (デフォルト: op) を持つプレイヤーは,キック・BAN の保護やチャンネルの強制削除が可能です. + +## メッセージフォーマット + +チャンネルメッセージの表示形式は `config.yml` の `messageFormat.channelMessageFormat` でカスタマイズできます.詳細は[メッセージフォーマット](/docs/reference/message-format)を参照してください. diff --git a/website/src/docs/features/direct-message.md b/website/src/docs/features/direct-message.md new file mode 100644 index 0000000..7b12aff --- /dev/null +++ b/website/src/docs/features/direct-message.md @@ -0,0 +1,52 @@ +--- +layout: doc +--- + +# ダイレクトメッセージ + +プレイヤー間で 1対1 のプライベートメッセージを送受信できます. + +## 基本的な使い方 + +### メッセージの送信 + +``` +/tell <player> <message> +``` + +エイリアス: `/t`, `/msg`, `/m`, `/w`, `/whisper` + +指定したプレイヤーにダイレクトメッセージを送信します.受信したメッセージをクリックすると,送信者への返信コマンドが自動入力されます. + +### クイック返信 + +``` +/reply <message> +``` + +エイリアス: `/r` + +最後にメッセージを送ってきたプレイヤーに返信します.該当するプレイヤーがいない場合は,最後にメッセージを送った相手に送信されます. + +クイック返信を利用するには `config.yml` で `features.quickReplies.enabled` が `true` (デフォルト) である必要があります. + +## 通知設定 + +プレイヤーはダイレクトメッセージ受信時のサウンド通知を個別に制御できます. + +``` +/lc settings notice on # 通知を有効化 +/lc settings notice off # 通知を無効化 +``` + +## ローマ字変換との連携 + +[ローマ字変換](/docs/features/japanese-conversion)が有効な場合,ダイレクトメッセージの内容も自動的に日本語に変換されます.変換はプレイヤーの `japanese` 設定に従います. + +## スパイ機能 + +`lunaticchat.spy` パーミッション (デフォルト: op) を持つプレイヤーは,サーバー上のすべてのダイレクトメッセージを閲覧できます.スパイプレイヤーには変換前のメッセージが表示されます. + +## メッセージフォーマット + +ダイレクトメッセージの表示形式は `config.yml` の `messageFormat.directMessageFormat` でカスタマイズできます.詳細は[メッセージフォーマット](/docs/reference/message-format)を参照してください. diff --git a/website/src/docs/features/japanese-conversion.md b/website/src/docs/features/japanese-conversion.md new file mode 100644 index 0000000..e5e751b --- /dev/null +++ b/website/src/docs/features/japanese-conversion.md @@ -0,0 +1,62 @@ +--- +layout: doc +--- + +# ローマ字変換 + +ローマ字で入力したチャットメッセージを自動的に日本語に変換します.この機能を利用するには `config.yml` で `features.japaneseConversion.enabled` を `true` に設定してください. + +## 変換の仕組み + +変換は2段階で行われます. + +1. **ローマ字 → ひらがな**: プラグイン内蔵の Trie ベースの変換エンジンでローマ字をひらがなに変換します +2. **ひらがな → 漢字/カナ**: Google IME API を使用してひらがなを自然な日本語に変換します + +### 変換例 + +``` +入力: konnichiha sekai +変換1: こんにちは せかい +変換2: こんにちは 世界 +``` + +## 変換対象 + +- 通常チャット +- ダイレクトメッセージ (`/tell`, `/reply`) +- チャンネルチャット + +入力が有効なローマ字でない場合 (英単語などが含まれる場合),変換は行われずそのまま送信されます. + +## プレイヤー設定 + +プレイヤーは個別に変換のオン/オフを切り替えられます. + +``` +/lc settings japanese on # 変換を有効化 +/lc settings japanese off # 変換を無効化 +``` + +## キャッシュ + +変換結果は単語単位でキャッシュされ,同じ単語の再変換時には API を呼び出さずにキャッシュから取得します.キャッシュは JSON ファイルとしてディスクに定期保存されます. + +| 設定キー | デフォルト | 説明 | +|----------|-----------|------| +| `cache.maxEntries` | `500` | キャッシュの最大エントリ数 | +| `cache.saveIntervalSeconds` | `300` | ディスク保存の間隔 (秒) | +| `cache.filePath` | `"conversion_cache.json"` | キャッシュファイルのパス | + +キャッシュが上限に達すると,古いエントリの10%が自動的に削除されます. + +## API 設定 + +Google IME API への接続に関する設定です. + +| 設定キー | デフォルト | 説明 | +|----------|-----------|------| +| `api.timeout` | `3000` | リクエストタイムアウト (ミリ秒) | +| `api.retryAttempts` | `2` | 失敗時のリトライ回数 | + +API がタイムアウトまたは失敗した場合,ひらがなのまま送信されます. diff --git a/website/src/docs/features/message-logging.md b/website/src/docs/features/message-logging.md new file mode 100644 index 0000000..944b9e9 --- /dev/null +++ b/website/src/docs/features/message-logging.md @@ -0,0 +1,94 @@ +--- +layout: doc +--- + +# メッセージログ + +チャンネルチャットのメッセージを NDJSON (Newline Delimited JSON) 形式でファイルに記録します.この機能はチャンネルチャットが有効な場合に利用でき,デフォルトで有効です. + +## 設定 + +```yaml +# config.yml +features: + channelChat: + enabled: true + messageLogging: + enabled: true + retentionDays: 30 + maxFileSizeMB: 100 +``` + +| 設定キー | デフォルト | 説明 | +|----------|-----------|------| +| `enabled` | `true` | メッセージログを有効にする | +| `retentionDays` | `30` | ログファイルの保持日数 (`0` で無期限保持) | +| `maxFileSizeMB` | `100` | 単一ログファイルの最大サイズ (MB) | + +## ログファイルの形式 + +ログファイルは `plugins/LunaticChat/logs/` ディレクトリに保存されます.各行が1つの JSON オブジェクトです. + +### ファイル名 + +``` +channel-messages-YYYY-MM-dd.json +``` + +ファイルサイズが `maxFileSizeMB` を超えた場合,サフィックス付きの新しいファイルが作成されます. + +``` +channel-messages-2026-04-05.json # 基本ファイル +channel-messages-2026-04-05-1.json # サイズ超過時 +channel-messages-2026-04-05-2.json # さらに超過時 +``` + +### エントリ形式 + +各行は以下の JSON 構造を持ちます. + +```json +{ + "timestamp": "2026-04-05T14:23:45.123Z", + "playerId": "550e8400-e29b-41d4-a716-446655440000", + "playerName": "Steve", + "channelId": "general", + "message": "Hello everyone!" +} +``` + +| フィールド | 型 | 説明 | +|-----------|------|------| +| `timestamp` | String | ISO 8601 形式のタイムスタンプ (UTC) | +| `playerId` | String | プレイヤーの UUID | +| `playerName` | String | プレイヤーの表示名 | +| `channelId` | String | メッセージが送信されたチャンネルの ID | +| `message` | String | メッセージの内容 | + +## ファイルローテーション + +- **日次ローテーション**: 日付が変わると新しいファイルが作成されます +- **サイズローテーション**: `maxFileSizeMB` を超えるとサフィックス付きファイルに切り替わります +- **自動クリーンアップ**: `retentionDays` で指定した日数を超えたログファイルは自動的に削除されます (`0` の場合は削除されません) + +## ログの活用例 + +NDJSON 形式のため,`jq` などのツールで簡単にフィルタリング・集計が可能です. + +### 特定チャンネルのメッセージを抽出 + +```bash +jq 'select(.channelId == "general")' channel-messages-2026-04-05.json +``` + +### 特定プレイヤーのメッセージを抽出 + +```bash +jq 'select(.playerName == "Steve")' channel-messages-2026-04-05.json +``` + +### メッセージ数をチャンネルごとに集計 + +```bash +jq -s 'group_by(.channelId) | map({channel: .[0].channelId, count: length})' channel-messages-2026-04-05.json +``` diff --git a/website/src/docs/features/velocity.md b/website/src/docs/features/velocity.md new file mode 100644 index 0000000..d1394ec --- /dev/null +++ b/website/src/docs/features/velocity.md @@ -0,0 +1,109 @@ +--- +layout: doc +--- + +# Velocity 連携 + +Velocity プロキシを経由して複数の Paper / Folia サーバー間でグローバルチャットをリレーします. + +## セットアップ + +### 1. Velocity プラグインの導入 + +`LunaticChat-<version>-velocity.jar` を Velocity の `plugins/` ディレクトリに配置し,プロキシを再起動します. + +### 2. Paper 側の設定 + +各 Paper サーバーの `config.yml` で以下を設定します. + +```yaml +features: + velocityIntegration: + enabled: true + crossServerGlobalChat: true + serverName: "survival" # Velocity 設定のサーバー名に合わせる +``` + +### 3. 接続の確認 + +``` +/lcv status +``` + +接続状態,プロトコルバージョン,Velocity プラグインのバージョンなどを確認できます (パーミッション: `lunaticchat.command.lcv.status`, デフォルト: op) . + +## クロスサーバーグローバルチャット + +`crossServerGlobalChat` を `true` にすると,プレイヤーのチャットメッセージが Velocity を経由して他のすべての Paper サーバーに中継されます. + +### メッセージの流れ + +1. プレイヤーがチャットメッセージを送信 +2. Paper サーバーがメッセージを Velocity に送信 +3. Velocity が送信元以外の全サーバーにメッセージを中継 +4. 各サーバーのプレイヤーにメッセージが表示される + +### メッセージ重複排除 + +各メッセージに一意な ID が付与され,キャッシュにより同じメッセージが重複して表示されることを防ぎます.キャッシュサイズは `messageDeduplicationCacheSize` (デフォルト: `100`) で設定できます. + +## プロトコルバージョン + +Paper と Velocity 間の互換性はプロトコルバージョンで管理されます.接続時にハンドシェイクが行われ,互換性のないバージョン同士では接続が拒否されます. + +### バージョンバンプルール + +| レベル | 変更例 | 互換性 | デプロイ順序 | +|--------|--------|--------|-------------| +| PATCH (1.0.0 → 1.0.1) | optional フィールド追加,新 sub-channel 追加 | 完全互換 (`ignoreUnknownKeys=true` で安全) | 順不同,いつでも | +| MINOR (1.0.x → 1.1.0) | required フィールド追加,既存 sub-channel のセマンティクス変更 | `MIN_SUPPORTED_MINOR` の範囲内で後方互換 | **Velocity を先に更新** → 各 Paper を順次更新 | +| MAJOR (1.x.x → 2.0.0) | ワイヤフォーマット変更,sub-channel 削除/リネーム | 非互換 | **全サーバー同時デプロイ** | + +### 互換性判定 + +ハンドシェイク時に以下のルールで互換性が判定されます: + +- **MAJOR** が一致すること +- リモートの **MINOR** が `MIN_SUPPORTED_MINOR` 以上かつ自身の MINOR 以下であること +- **PATCH** は互換性判定に影響しない + +#### 例: Velocity がプロトコル 1.2.0 で `MIN_SUPPORTED_MINOR=1` の場合 + +| Paper プロトコル | 結果 | +|-----------------|------| +| 1.1.x | 接続 OK | +| 1.2.x | 接続 OK | +| 1.0.x | 拒否 (`MIN_SUPPORTED_MINOR` より古い) | +| 1.3.x | 拒否 (Velocity より新しい) | +| 2.0.x | 拒否 (MAJOR 不一致) | + +### 運用サイクル + +1. **プロトコル変更なし** → Paper / Velocity を独立にデプロイ可能 +2. **PATCH 変更** → どちら側からでも自由にデプロイ +3. **MINOR 変更** → Velocity を先行更新し,`MIN_SUPPORTED_MINOR` で旧 Paper の猶予期間を設定.全 Paper 更新後に `MIN_SUPPORTED_MINOR` を引き上げ +4. **MAJOR 変更** → メンテナンスウィンドウで一括更新 + +## 接続状態 + +| 状態 | 説明 | +|------|------| +| `DISCONNECTED` | 未接続 | +| `HANDSHAKING` | ハンドシェイク中 | +| `CONNECTED` | 接続済み | +| `FAILED` | 接続失敗 | + +ハンドシェイクのタイムアウトは5秒です.タイムアウトした場合,状態は `FAILED` になります. + +## 設定一覧 + +| 設定キー | デフォルト | 説明 | +|----------|-----------|------| +| `enabled` | `false` | Velocity 連携を有効にする | +| `crossServerGlobalChat` | `false` | クロスサーバーグローバルチャットを有効にする | +| `serverName` | `"Unknown"` | クロスサーバーチャットで表示されるサーバー名 | +| `messageDeduplicationCacheSize` | `100` | メッセージ重複排除キャッシュのサイズ | + +## メッセージフォーマット + +クロスサーバーチャットの表示形式は `config.yml` の `messageFormat.crossServerGlobalChatFormat` でカスタマイズできます.詳細は[メッセージフォーマット](/docs/reference/message-format)を参照してください. diff --git a/website/src/docs/getting-started.md b/website/src/docs/getting-started.md new file mode 100644 index 0000000..63b52d5 --- /dev/null +++ b/website/src/docs/getting-started.md @@ -0,0 +1,47 @@ +--- +layout: doc +--- + +# はじめる + +LunaticChat を導入するための手順を説明します. + +## 動作要件 + +| 項目 | 要件 | +|------|------| +| Minecraft | 26.1 以降 | +| Java | 25 以降 | +| サーバー | Paper, Folia, または Velocity | + +## ダウンロード + +以下のいずれかからプラグイン JAR をダウンロードできます. + +- [GitHub Releases](https://github.com/m1sk9/LunaticChat/releases) +- [Modrinth](https://modrinth.com/project/lunaticchat) + +Paper / Folia サーバーには `LunaticChat-<version>.jar` を,Velocity プロキシには `LunaticChat-<version>-velocity.jar` を使用してください. + +## インストール + +### Paper / Folia + +1. ダウンロードした `LunaticChat-<version>.jar` をサーバーの `plugins/` ディレクトリに配置します +2. サーバーを起動 (または再起動) します +3. `plugins/LunaticChat/config.yml` が自動生成されます +4. 必要に応じて[設定](/docs/configuration)を変更し,サーバーを再起動します + +### Velocity + +1. ダウンロードした `LunaticChat-<version>-velocity.jar` を Velocity の `plugins/` ディレクトリに配置します +2. Velocity プロキシを起動 (または再起動) します +3. Paper 側の `config.yml` で `features.velocityIntegration.enabled` を `true` に設定します +4. 詳細は [Velocity 連携](/docs/features/velocity)を参照してください + +## 次のステップ + +- [設定](/docs/configuration) - `config.yml` の全設定項目を確認する +- [ダイレクトメッセージ](/docs/features/direct-message) - DM 機能の使い方 +- [チャンネルチャット](/docs/features/channel-chat) - チャンネル機能の使い方 +- [コマンド一覧](/docs/reference/commands) - 全コマンドのリファレンス diff --git a/website/src/docs/permissions.md b/website/src/docs/permissions.md new file mode 100644 index 0000000..3fb20f5 --- /dev/null +++ b/website/src/docs/permissions.md @@ -0,0 +1,50 @@ +--- +layout: doc +--- + +# パーミッション + +LunaticChat のすべてのパーミッションノードの一覧です. + +## コマンドパーミッション + +すべてのコマンドパーミッションはデフォルトで全プレイヤーに付与されています. + +| パーミッション | 説明 | +|---------------|------| +| `lunaticchat.command.lc` | `/lc` コマンドの使用 | +| `lunaticchat.command.tell` | `/tell` コマンドの使用 | +| `lunaticchat.command.reply` | `/reply` コマンドの使用 | +| `lunaticchat.command.lc.settings` | `/lc settings` の使用 | +| `lunaticchat.command.lc.status` | `/lc status` の使用 | + +### チャンネル関連 + +| パーミッション | 説明 | +|---------------|------| +| `lunaticchat.command.lc.channel` | `/lc channel` の使用 | +| `lunaticchat.command.lc.channel.create` | チャンネルの作成 | +| `lunaticchat.command.lc.channel.list` | チャンネル一覧の表示 | +| `lunaticchat.command.lc.channel.join` | チャンネルへの参加 | +| `lunaticchat.command.lc.channel.leave` | チャンネルからの退出 | +| `lunaticchat.command.lc.channel.switch` | アクティブチャンネルの切り替え | +| `lunaticchat.command.lc.channel.status` | チャンネル参加状況の確認 | +| `lunaticchat.command.lc.channel.info` | チャンネル情報の表示 | +| `lunaticchat.command.lc.channel.delete` | チャンネルの削除 | +| `lunaticchat.command.lc.channel.invite` | チャンネルへの招待 | +| `lunaticchat.command.lc.channel.kick` | チャンネルからのキック | +| `lunaticchat.command.lc.channel.ban` | チャンネルからの BAN | +| `lunaticchat.command.lc.channel.unban` | チャンネル BAN の解除 | +| `lunaticchat.command.lc.channel.mod` | モデレーター権限の付与・剥奪 | +| `lunaticchat.command.lc.channel.ownership` | チャンネルオーナーの譲渡 | + +## 管理者パーミッション + +以下のパーミッションはデフォルトで OP のみに付与されています. + +| パーミッション | デフォルト | 説明 | +|---------------|-----------|------| +| `lunaticchat.spy` | op | サーバー上の全ダイレクトメッセージを閲覧 | +| `lunaticchat.noticeupdate` | op | アップデート通知の受信 | +| `lunaticchat.channelbypass` | op | チャンネル制限のバイパス(キック・BAN 保護,強制削除) | +| `lunaticchat.command.lcv.status` | op | `/lcv status` コマンドの使用 | diff --git a/website/src/docs/reference/commands.md b/website/src/docs/reference/commands.md new file mode 100644 index 0000000..4c40b9b --- /dev/null +++ b/website/src/docs/reference/commands.md @@ -0,0 +1,157 @@ +--- +layout: doc +--- + +# コマンド一覧 + +LunaticChat で使用できるすべてのコマンドのリファレンスです. + +## ダイレクトメッセージ + +### `/tell <player> <message>` + +プレイヤーにダイレクトメッセージを送信します. + +- **エイリアス**: `t`, `msg`, `m`, `w`, `whisper` +- **パーミッション**: `lunaticchat.command.tell` + +### `/reply <message>` + +最後にメッセージを送ってきたプレイヤーに返信します. + +- **エイリアス**: `r` +- **パーミッション**: `lunaticchat.command.reply` +- **前提条件**: クイックリプライ機能が有効であること + +## メインコマンド (`/lc`) + +**エイリアス**: `lunaticchat` + +### `/lc status` + +プラグインのバージョン,ヘルス,有効な機能,設定値を表示します. + +- **パーミッション**: `lunaticchat.command.lc.status` + +### `/lc settings [key] [on|off]` + +プレイヤー個人の設定を確認・変更します.引数なしで設定一覧を表示します. + +- **パーミッション**: `lunaticchat.command.lc.settings` +- **設定キー**: `japanese`, `notice`, `chNotice`(詳細は[プレイヤー設定](/docs/reference/player-settings)を参照) + +## チャンネルコマンド (`/lc channel`) + +チャンネルチャット機能が有効な場合にのみ使用できます. + +### 作成・探索 + +#### `/lc channel create <channelId> <name> [description] [isPrivate]` + +新しいチャンネルを作成します.作成者がオーナーになります. + +- **パーミッション**: `lunaticchat.command.lc.channel.create` +- `channelId`: 英数字,アンダースコア,ハイフンのみ使用可能 +- `isPrivate`: `true` / `false`(デフォルト: `false`) + +#### `/lc channel list [page]` + +公開チャンネルの一覧を表示します(1ページ10件). + +- **パーミッション**: `lunaticchat.command.lc.channel.list` + +#### `/lc channel info [channelId]` + +チャンネルの詳細情報を表示します.引数なしでアクティブチャンネルの情報を表示します. + +- **パーミッション**: `lunaticchat.command.lc.channel.info` + +### 参加・退出 + +#### `/lc channel join <channelId>` + +チャンネルに参加します.プライベートチャンネルには招待が必要です. + +- **パーミッション**: `lunaticchat.command.lc.channel.join` + +#### `/lc channel leave` + +アクティブチャンネルから退出します. + +- **パーミッション**: `lunaticchat.command.lc.channel.leave` + +#### `/lc channel switch <channelId>` + +参加済みの別チャンネルをアクティブに切り替えます. + +- **パーミッション**: `lunaticchat.command.lc.channel.switch` + +#### `/lc channel status` + +自分のチャンネル参加状況(アクティブチャンネルと参加チャンネル一覧)を表示します. + +- **パーミッション**: `lunaticchat.command.lc.channel.status` + +### モデレーション(オーナー / モデレーター) + +#### `/lc channel invite <playerName>` + +プレイヤーをアクティブチャンネルに招待します.プライベートチャンネルの制限をバイパスします. + +- **パーミッション**: `lunaticchat.command.lc.channel.invite` +- **必要ロール**: OWNER または MODERATOR + +#### `/lc channel kick <playerName>` + +プレイヤーをアクティブチャンネルからキックします. + +- **パーミッション**: `lunaticchat.command.lc.channel.kick` +- **必要ロール**: OWNER または MODERATOR + +#### `/lc channel ban <playerName>` + +プレイヤーをアクティブチャンネルから BAN します.BAN されたプレイヤーは再参加できません. + +- **パーミッション**: `lunaticchat.command.lc.channel.ban` +- **必要ロール**: OWNER または MODERATOR + +#### `/lc channel unban <playerName>` + +プレイヤーのチャンネル BAN を解除します. + +- **パーミッション**: `lunaticchat.command.lc.channel.unban` +- **必要ロール**: OWNER または MODERATOR + +### 管理(オーナーのみ) + +#### `/lc channel delete <channelId>` + +チャンネルを削除します. + +- **パーミッション**: `lunaticchat.command.lc.channel.delete` +- **必要ロール**: OWNER(`lunaticchat.channelbypass` 権限で制限をバイパス可能) + +#### `/lc channel mod <playerName>` + +チャンネルメンバーのモデレーター権限を付与・剥奪します. + +- **パーミッション**: `lunaticchat.command.lc.channel.mod` +- **必要ロール**: OWNER + +#### `/lc channel ownership <playerName>` + +チャンネルのオーナー権限を別のメンバーに譲渡します. + +- **パーミッション**: `lunaticchat.command.lc.channel.ownership` +- **必要ロール**: OWNER + +## Velocity コマンド (`/lcv`) + +**エイリアス**: `lunaticvelocity` + +### `/lcv status` + +Velocity プロキシとの接続状態,プロトコルバージョン,オンラインプレイヤー数を表示します. + +- **パーミッション**: `lunaticchat.command.lcv.status` +- **デフォルト**: op のみ diff --git a/website/src/docs/reference/message-format.md b/website/src/docs/reference/message-format.md new file mode 100644 index 0000000..7ae42e9 --- /dev/null +++ b/website/src/docs/reference/message-format.md @@ -0,0 +1,86 @@ +--- +layout: doc +--- + +# メッセージフォーマット + +`config.yml` の `messageFormat` セクションで,チャットメッセージの表示形式をカスタマイズできます. + +## プレースホルダー + +| プレースホルダー | 説明 | 使用可能なフォーマット | +|----------------|------|----------------------| +| `{sender}` | メッセージの送信者名 | すべて | +| `{recipient}` | メッセージの受信者名 | `directMessageFormat` | +| `{message}` | メッセージの内容 | すべて | +| `{channel}` | チャンネル名 | `channelMessageFormat` | +| `{server}` | サーバー名 | `crossServerGlobalChatFormat` | + +## フォーマット一覧 + +### `directMessageFormat` + +`/tell` や `/reply` で送信されるダイレクトメッセージの表示形式です. + +**デフォルト:** +``` +§7[§e{sender} §7>> §e{recipient}§7] §f{message} +``` + +**表示例:** <span style="color: gray">[</span><span style="color: gold">Steve</span> <span style="color: gray">>></span> <span style="color: gold">Alex</span><span style="color: gray">]</span> <span style="color: white">こんにちは!</span> + +### `channelMessageFormat` + +チャンネルチャットで送信されるメッセージの表示形式です. + +**デフォルト:** +``` +§7[§b#{channel}§7] §e{sender}: §f{message} +``` + +**表示例:** <span style="color: gray">[</span><span style="color: aqua">#general</span><span style="color: gray">]</span> <span style="color: gold">Steve:</span> <span style="color: white">こんにちは!</span> + +### `crossServerGlobalChatFormat` + +Velocity 連携時のクロスサーバーグローバルチャットの表示形式です. + +**デフォルト:** +``` +§7[§6{server}§7] §e{sender}: §f{message} +``` + +**表示例:** <span style="color: gray">[</span><span style="color: gold">survival</span><span style="color: gray">]</span> <span style="color: gold">Steve:</span> <span style="color: white">こんにちは!</span> + +## カラーコード + +Minecraft のセクション記号(`§`)を使ったカラーコードが使用できます. + +| コード | 色 | +|--------|------| +| `§0` | 黒 | +| `§1` | 濃い青 | +| `§2` | 濃い緑 | +| `§3` | 濃い水色 | +| `§4` | 濃い赤 | +| `§5` | 濃い紫 | +| `§6` | 金色 | +| `§7` | 灰色 | +| `§8` | 濃い灰色 | +| `§9` | 青 | +| `§a` | 緑 | +| `§b` | 水色 | +| `§c` | 赤 | +| `§d` | ピンク | +| `§e` | 黄色 | +| `§f` | 白 | + +### 装飾コード + +| コード | 効果 | +|--------|------| +| `§l` | **太字** | +| `§o` | *斜体* | +| `§n` | <u>下線</u> | +| `§m` | ~~取り消し線~~ | +| `§k` | 難読化(文字がランダムに変化) | +| `§r` | リセット | diff --git a/website/src/docs/reference/player-settings.md b/website/src/docs/reference/player-settings.md new file mode 100644 index 0000000..bbd294d --- /dev/null +++ b/website/src/docs/reference/player-settings.md @@ -0,0 +1,50 @@ +--- +layout: doc +--- + +# プレイヤー設定 + +プレイヤーは `/lc settings` コマンドで個人設定を変更できます.設定はサーバーの `player-settings.yaml`(設定ファイルの `userSettingsFilePath` で変更可能)に UUID ごとに保存されます. + +## コマンド + +``` +/lc settings # 設定一覧を表示 +/lc settings <key> # 現在の値を確認 +/lc settings <key> on|off # 値を変更 +``` + +## 設定キー + +| キー | 説明 | デフォルト | +|------|------|-----------| +| `japanese` | ローマ字→日本語変換を有効にする | `true` | +| `notice` | ダイレクトメッセージの通知を有効にする | `true` | +| `chNotice` | チャンネルメッセージの通知を有効にする | `true` | + +### `japanese` + +ローマ字で入力したチャットメッセージを自動的に日本語(ひらがな)に変換します.この設定はサーバー側で `features.japaneseConversion.enabled` が `true` の場合にのみ機能します. + +``` +/lc settings japanese on # 変換を有効化 +/lc settings japanese off # 変換を無効化 +``` + +### `notice` + +ダイレクトメッセージ(`/tell` / `/reply`)を受信した際の通知を制御します. + +``` +/lc settings notice on # 通知を有効化 +/lc settings notice off # 通知を無効化 +``` + +### `chNotice` + +チャンネルチャットのメッセージを受信した際の通知を制御します.この設定はサーバー側で `features.channelChat.enabled` が `true` の場合にのみ機能します. + +``` +/lc settings chNotice on # 通知を有効化 +/lc settings chNotice off # 通知を無効化 +``` diff --git a/website/src/download.md b/website/src/download.md new file mode 100644 index 0000000..ef1167b --- /dev/null +++ b/website/src/download.md @@ -0,0 +1,6 @@ +--- +layout: page +title: ダウンロード +--- + +<DownloadCard /> diff --git a/website/src/en/docs/configuration.md b/website/src/en/docs/configuration.md new file mode 100644 index 0000000..e7891b3 --- /dev/null +++ b/website/src/en/docs/configuration.md @@ -0,0 +1,73 @@ +--- +layout: doc +--- + +# Configuration + +LunaticChat's configuration is managed in `plugins/LunaticChat/config.yml`. A default configuration file is generated on the server's first startup. + +## Global Settings + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| `debug` | Boolean | `false` | Enable debug logging | +| `userSettingsFilePath` | String | `"player-settings.yaml"` | Path to the player settings file | +| `checkForUpdates` | Boolean | `true` | Check for updates on startup | +| `language` | String | `"en"` | Plugin language (`en` / `ja`) | + +## Feature Settings (`features`) + +### Quick Replies (`features.quickReplies`) + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| `enabled` | Boolean | `true` | Enable the `/reply` command | + +### Japanese Conversion (`features.japaneseConversion`) + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| `enabled` | Boolean | `false` | Enable romaji-to-hiragana conversion | +| `cache.maxEntries` | Int | `500` | Maximum number of conversion cache entries | +| `cache.saveIntervalSeconds` | Int | `300` | Interval (in seconds) for saving cache to disk | +| `cache.filePath` | String | `"conversion_cache.json"` | Path to the cache file | +| `api.timeout` | Long | `3000` | API request timeout (in milliseconds) | +| `api.retryAttempts` | Int | `2` | Number of retries on API request failure | + +### Channel Chat (`features.channelChat`) + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| `enabled` | Boolean | `false` | Enable the channel chat feature | +| `maxChannelsPerServer` | Int | `0` | Maximum channels per server (`0` = unlimited) | +| `maxMembersPerChannel` | Int | `0` | Maximum members per channel (`0` = unlimited) | +| `maxMembershipPerPlayer` | Int | `0` | Maximum channel memberships per player (`0` = unlimited) | + +#### Message Logging (`features.channelChat.messageLogging`) + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| `enabled` | Boolean | `true` | Log channel messages to an NDJSON file | +| `retentionDays` | Int | `30` | Log file retention period in days (`0` = indefinite) | +| `maxFileSizeMB` | Int | `100` | Maximum size of a single log file (MB) | + +### Velocity Integration (`features.velocityIntegration`) + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| `enabled` | Boolean | `false` | Enable integration with the Velocity proxy | +| `crossServerGlobalChat` | Boolean | `false` | Enable cross-server global chat | +| `serverName` | String | `"Unknown"` | Server name displayed in cross-server chat | +| `messageDeduplicationCacheSize` | Int | `100` | Size of the message deduplication cache | + +## Message Format (`messageFormat`) + +| Key | Default | Available Placeholders | +|-----|---------|----------------------| +| `directMessageFormat` | `§7[§e{sender} §7>> §e{recipient}§7] §f{message}` | `{sender}`, `{recipient}`, `{message}` | +| `channelMessageFormat` | `§7[§b#{channel}§7] §e{sender}: §f{message}` | `{sender}`, `{message}`, `{channel}` | +| `crossServerGlobalChatFormat` | `§7[§6{server}§7] §e{sender}: §f{message}` | `{sender}`, `{message}`, `{server}` | + +## Default Configuration File + +[View on GitHub](https://github.com/m1sk9/LunaticChat/blob/main/platform-paper/src/main/resources/config.yml) diff --git a/website/src/en/docs/features/admin.md b/website/src/en/docs/features/admin.md new file mode 100644 index 0000000..c3a3d2f --- /dev/null +++ b/website/src/en/docs/features/admin.md @@ -0,0 +1,74 @@ +--- +layout: doc +--- + +# Admin Features + +This page covers features intended for server administrators. These features are primarily available to players with OP permissions. + +## Plugin Status (`/lc status`) + +View an overview of the plugin's operational status. + +``` +/lc status +``` + +Displayed information: + +- Plugin version (with Git commit hash) +- Health status (OK / Degraded) +- Enabled/disabled state of each feature +- Configuration values (debug mode, update checking, language) +- Links to GitHub, Modrinth, and documentation + +## Spy Mode + +Players with the `lunaticchat.spy` permission (default: op) can view all direct messages sent and received on the server. + +- Spy players see the original message before romaji conversion +- Hover text indicates the message is a spy message +- Spy players themselves are not included in the normal sender/recipient list + +## Channel Bypass + +Players with the `lunaticchat.channelbypass` permission (default: op) can bypass the following channel restrictions. + +- Cannot be kicked or banned +- Can delete channels even without being the owner + +## Update Notifications + +When `checkForUpdates` is `true` (default), the plugin checks for new versions at startup. Players with the `lunaticchat.noticeupdate` permission (default: op) receive an update notification when they join the server. + +```yaml +# config.yml +checkForUpdates: true +``` + +## Debug Mode + +Setting `debug` to `true` enables verbose plugin logging. This is useful for troubleshooting issues or submitting bug reports. + +```yaml +# config.yml +debug: true +``` + +## Language Setting + +You can change the language of messages displayed to players. Plugin logs and console output are not affected and remain in English only. + +```yaml +# config.yml +language: "ja" # "en" or "ja" +``` + +## Admin Permissions Reference + +| Permission | Default | Description | +|-----------|---------|-------------| +| `lunaticchat.spy` | op | View all direct messages | +| `lunaticchat.channelbypass` | op | Bypass channel restrictions | +| `lunaticchat.noticeupdate` | op | Receive update notifications | +| `lunaticchat.command.lcv.status` | op | Use the `/lcv status` command | diff --git a/website/src/en/docs/features/channel-chat.md b/website/src/en/docs/features/channel-chat.md new file mode 100644 index 0000000..68d216e --- /dev/null +++ b/website/src/en/docs/features/channel-chat.md @@ -0,0 +1,92 @@ +--- +layout: doc +--- + +# Channel Chat + +Create channels to separate conversations by group. To use this feature, set `features.channelChat.enabled` to `true` in `config.yml`. + +## Creating a Channel + +``` +/lc channel create <channelId> <name> [description] [isPrivate] +``` + +- `channelId`: A unique identifier for the channel (alphanumeric, `_`, `-` only, 3-30 characters) +- `name`: The display name of the channel +- `description`: A description of the channel (optional) +- `isPrivate`: Set to `true` to make the channel private (default: `false`) + +The creator automatically becomes the owner. + +## Joining and Leaving Channels + +``` +/lc channel join <channelId> # Join a channel +/lc channel leave # Leave the active channel +/lc channel switch <channelId> # Switch the active channel +``` + +Joining a private channel requires an invitation from the owner or a moderator. + +## Active Channel + +Players can join multiple channels, but only one channel can be active at a time. Chat messages are sent to the active channel. Use `/lc channel switch` to change the active channel. + +``` +/lc channel status # Display the current active channel and list of joined channels +``` + +## Roles and Permissions + +Channels have three roles. + +| Role | Permissions | +|------|-------------| +| **OWNER** | Delete the channel, manage moderators, transfer ownership, manage members | +| **MODERATOR** | Invite, kick, ban/unban members | +| **MEMBER** | Participate in chat, view channel information | + +### Moderator Management (Owner Only) + +``` +/lc channel mod <playerName> # Grant/revoke moderator permissions +/lc channel ownership <playerName> # Transfer ownership +``` + +### Member Management (Owner / Moderator) + +``` +/lc channel invite <playerName> # Invite a player +/lc channel kick <playerName> # Kick a player +/lc channel ban <playerName> # Ban a player +/lc channel unban <playerName> # Unban a player +``` + +## Limit Settings + +You can set channel limits in `config.yml` (set to `0` for unlimited). + +| Setting Key | Description | +|-------------|-------------| +| `maxChannelsPerServer` | Maximum number of channels per server | +| `maxMembersPerChannel` | Maximum number of members per channel | +| `maxMembershipPerPlayer` | Maximum number of channels a player can join | + +## Message Logging + +Channel messages can be logged in NDJSON format. Files are rotated daily, and a new file with a suffix is created when `maxFileSizeMB` is exceeded. + +```json +{"timestamp":"2026-04-05T14:23:45.123Z","playerId":"550e8400-...","playerName":"Steve","channelId":"general","message":"Hello!"} +``` + +See the `features.channelChat.messageLogging` section on the [Configuration page](/en/docs/configuration) for logging settings. + +## Bypass Permission + +Players with the `lunaticchat.channelbypass` permission (default: op) are protected from kicks and bans, and can force-delete channels. + +## Message Format + +The display format for channel messages can be customized via `messageFormat.channelMessageFormat` in `config.yml`. See [Message Format](/en/docs/reference/message-format) for details. diff --git a/website/src/en/docs/features/direct-message.md b/website/src/en/docs/features/direct-message.md new file mode 100644 index 0000000..7a88ecd --- /dev/null +++ b/website/src/en/docs/features/direct-message.md @@ -0,0 +1,52 @@ +--- +layout: doc +--- + +# Direct Message + +Send and receive private 1-on-1 messages between players. + +## Basic Usage + +### Sending a Message + +``` +/tell <player> <message> +``` + +Aliases: `/t`, `/msg`, `/m`, `/w`, `/whisper` + +Sends a direct message to the specified player. Clicking on a received message will auto-fill the reply command to the sender. + +### Quick Reply + +``` +/reply <message> +``` + +Alias: `/r` + +Replies to the last player who sent you a message. If there is no such player, the message is sent to the last player you messaged. + +To use quick reply, `features.quickReplies.enabled` must be `true` (default) in `config.yml`. + +## Notification Settings + +Players can individually control the sound notification when receiving direct messages. + +``` +/lc settings notice on # Enable notifications +/lc settings notice off # Disable notifications +``` + +## Integration with Japanese Conversion + +When [Japanese Conversion](/en/docs/features/japanese-conversion) is enabled, direct message content is also automatically converted to Japanese. Conversion follows each player's `japanese` setting. + +## Spy Feature + +Players with the `lunaticchat.spy` permission (default: op) can view all direct messages on the server. Spy players see the original message before conversion. + +## Message Format + +The display format for direct messages can be customized via `messageFormat.directMessageFormat` in `config.yml`. See [Message Format](/en/docs/reference/message-format) for details. diff --git a/website/src/en/docs/features/japanese-conversion.md b/website/src/en/docs/features/japanese-conversion.md new file mode 100644 index 0000000..3bcd52b --- /dev/null +++ b/website/src/en/docs/features/japanese-conversion.md @@ -0,0 +1,62 @@ +--- +layout: doc +--- + +# Japanese Conversion + +Automatically converts chat messages typed in romaji into Japanese. To use this feature, set `features.japaneseConversion.enabled` to `true` in `config.yml`. + +## How Conversion Works + +Conversion is performed in two stages. + +1. **Romaji to Hiragana**: The plugin's built-in Trie-based conversion engine converts romaji to hiragana +2. **Hiragana to Kanji/Katakana**: The Google IME API converts hiragana into natural Japanese + +### Conversion Example + +``` +Input: konnichiha sekai +Stage 1: こんにちは せかい +Stage 2: こんにちは 世界 +``` + +## Conversion Targets + +- Normal chat +- Direct messages (`/tell`, `/reply`) +- Channel chat + +If the input is not valid romaji (e.g., contains English words), no conversion is performed and the message is sent as-is. + +## Player Settings + +Players can individually toggle conversion on or off. + +``` +/lc settings japanese on # Enable conversion +/lc settings japanese off # Disable conversion +``` + +## Cache + +Conversion results are cached per word. When the same word is converted again, the result is retrieved from cache instead of calling the API. The cache is periodically saved to disk as a JSON file. + +| Setting Key | Default | Description | +|-------------|---------|-------------| +| `cache.maxEntries` | `500` | Maximum number of cache entries | +| `cache.saveIntervalSeconds` | `300` | Interval for saving to disk (seconds) | +| `cache.filePath` | `"conversion_cache.json"` | Path to the cache file | + +When the cache reaches its limit, the oldest 10% of entries are automatically removed. + +## API Settings + +Settings related to the connection to the Google IME API. + +| Setting Key | Default | Description | +|-------------|---------|-------------| +| `api.timeout` | `3000` | Request timeout (milliseconds) | +| `api.retryAttempts` | `2` | Number of retry attempts on failure | + +If the API times out or fails, the message is sent in hiragana as-is. diff --git a/website/src/en/docs/features/message-logging.md b/website/src/en/docs/features/message-logging.md new file mode 100644 index 0000000..5e929bc --- /dev/null +++ b/website/src/en/docs/features/message-logging.md @@ -0,0 +1,94 @@ +--- +layout: doc +--- + +# Message Logging + +Records channel chat messages in NDJSON (Newline Delimited JSON) format to files. This feature is available when channel chat is enabled and is turned on by default. + +## Configuration + +```yaml +# config.yml +features: + channelChat: + enabled: true + messageLogging: + enabled: true + retentionDays: 30 + maxFileSizeMB: 100 +``` + +| Setting Key | Default | Description | +|-------------|---------|-------------| +| `enabled` | `true` | Enable message logging | +| `retentionDays` | `30` | Number of days to retain log files (`0` for unlimited retention) | +| `maxFileSizeMB` | `100` | Maximum size of a single log file (MB) | + +## Log File Format + +Log files are saved in the `plugins/LunaticChat/logs/` directory. Each line is a single JSON object. + +### File Naming + +``` +channel-messages-YYYY-MM-dd.json +``` + +When the file size exceeds `maxFileSizeMB`, a new file with a suffix is created. + +``` +channel-messages-2026-04-05.json # Base file +channel-messages-2026-04-05-1.json # On size overflow +channel-messages-2026-04-05-2.json # On further overflow +``` + +### Entry Format + +Each line has the following JSON structure. + +```json +{ + "timestamp": "2026-04-05T14:23:45.123Z", + "playerId": "550e8400-e29b-41d4-a716-446655440000", + "playerName": "Steve", + "channelId": "general", + "message": "Hello everyone!" +} +``` + +| Field | Type | Description | +|-------|------|-------------| +| `timestamp` | String | ISO 8601 timestamp (UTC) | +| `playerId` | String | Player UUID | +| `playerName` | String | Player display name | +| `channelId` | String | ID of the channel the message was sent to | +| `message` | String | Message content | + +## File Rotation + +- **Daily rotation**: A new file is created when the date changes +- **Size rotation**: Switches to a suffixed file when `maxFileSizeMB` is exceeded +- **Automatic cleanup**: Log files older than the number of days specified by `retentionDays` are automatically deleted (no deletion when set to `0`) + +## Usage Examples + +Since the format is NDJSON, you can easily filter and aggregate logs using tools like `jq`. + +### Extract Messages from a Specific Channel + +```bash +jq 'select(.channelId == "general")' channel-messages-2026-04-05.json +``` + +### Extract Messages from a Specific Player + +```bash +jq 'select(.playerName == "Steve")' channel-messages-2026-04-05.json +``` + +### Count Messages by Channel + +```bash +jq -s 'group_by(.channelId) | map({channel: .[0].channelId, count: length})' channel-messages-2026-04-05.json +``` diff --git a/website/src/en/docs/features/velocity.md b/website/src/en/docs/features/velocity.md new file mode 100644 index 0000000..9241e80 --- /dev/null +++ b/website/src/en/docs/features/velocity.md @@ -0,0 +1,109 @@ +--- +layout: doc +--- + +# Velocity Integration + +Relays global chat across multiple Paper / Folia servers via a Velocity proxy. + +## Setup + +### 1. Install the Velocity Plugin + +Place `LunaticChat-<version>-velocity.jar` in the Velocity `plugins/` directory and restart the proxy. + +### 2. Paper-Side Configuration + +Set the following in each Paper server's `config.yml`. + +```yaml +features: + velocityIntegration: + enabled: true + crossServerGlobalChat: true + serverName: "survival" # Must match the server name in the Velocity configuration +``` + +### 3. Verify the Connection + +``` +/lcv status +``` + +You can check the connection status, protocol version, Velocity plugin version, and more (permission: `lunaticchat.command.lcv.status`, default: op). + +## Cross-Server Global Chat + +When `crossServerGlobalChat` is set to `true`, player chat messages are relayed via Velocity to all other Paper servers. + +### Message Flow + +1. A player sends a chat message +2. The Paper server sends the message to Velocity +3. Velocity relays the message to all servers except the sender's +4. The message is displayed to players on each server + +### Message Deduplication + +Each message is assigned a unique ID, and a cache prevents the same message from being displayed more than once. The cache size can be configured with `messageDeduplicationCacheSize` (default: `100`). + +## Protocol Version + +Compatibility between Paper and Velocity is managed by protocol version. A handshake is performed upon connection, and incompatible versions are rejected. + +### Version Bump Rules + +| Level | Example Change | Compatibility | Deployment Order | +|-------|---------------|---------------|-----------------| +| PATCH (1.0.0 -> 1.0.1) | Adding optional fields, new sub-channels | Fully compatible (safe with `ignoreUnknownKeys=true`) | Any order, anytime | +| MINOR (1.0.x -> 1.1.0) | Adding required fields, changing existing sub-channel semantics | Backward compatible within `MIN_SUPPORTED_MINOR` range | **Update Velocity first** -> then update each Paper server | +| MAJOR (1.x.x -> 2.0.0) | Wire format changes, removing/renaming sub-channels | Incompatible | **Simultaneous deployment of all servers** | + +### Compatibility Check + +Compatibility is determined during the handshake using the following rules: + +- **MAJOR** versions must match +- The remote **MINOR** must be at least `MIN_SUPPORTED_MINOR` and at most the local MINOR +- **PATCH** does not affect the compatibility check + +#### Example: Velocity with protocol 1.2.0 and `MIN_SUPPORTED_MINOR=1` + +| Paper Protocol | Result | +|---------------|--------| +| 1.1.x | Connection OK | +| 1.2.x | Connection OK | +| 1.0.x | Rejected (older than `MIN_SUPPORTED_MINOR`) | +| 1.3.x | Rejected (newer than Velocity) | +| 2.0.x | Rejected (MAJOR mismatch) | + +### Operational Cycle + +1. **No protocol change** -> Paper / Velocity can be deployed independently +2. **PATCH change** -> Deploy freely from either side +3. **MINOR change** -> Update Velocity first and set `MIN_SUPPORTED_MINOR` to allow a grace period for older Paper servers. After all Paper servers are updated, raise `MIN_SUPPORTED_MINOR` +4. **MAJOR change** -> Simultaneous update during a maintenance window + +## Connection States + +| State | Description | +|-------|-------------| +| `DISCONNECTED` | Not connected | +| `HANDSHAKING` | Handshake in progress | +| `CONNECTED` | Connected | +| `FAILED` | Connection failed | + +The handshake timeout is 5 seconds. If the handshake times out, the state becomes `FAILED`. + +## Configuration Reference + +| Setting Key | Default | Description | +|-------------|---------|-------------| +| `enabled` | `false` | Enable Velocity integration | +| `crossServerGlobalChat` | `false` | Enable cross-server global chat | +| `serverName` | `"Unknown"` | Server name displayed in cross-server chat | +| `messageDeduplicationCacheSize` | `100` | Size of the message deduplication cache | + +## Message Format + +The display format for cross-server chat can be customized via `messageFormat.crossServerGlobalChatFormat` in `config.yml`. See [Message Format](/en/docs/reference/message-format) for details. diff --git a/website/src/en/docs/getting-started.md b/website/src/en/docs/getting-started.md new file mode 100644 index 0000000..abfd2ac --- /dev/null +++ b/website/src/en/docs/getting-started.md @@ -0,0 +1,47 @@ +--- +layout: doc +--- + +# Getting Started + +This guide explains how to set up LunaticChat. + +## Requirements + +| Item | Requirement | +|------|-------------| +| Minecraft | 26.1 or later | +| Java | 25 or later | +| Server | Paper, Folia, or Velocity | + +## Download + +You can download the plugin JAR from either of the following: + +- [GitHub Releases](https://github.com/m1sk9/LunaticChat/releases) +- [Modrinth](https://modrinth.com/project/lunaticchat) + +Use `LunaticChat-<version>.jar` for Paper / Folia servers and `LunaticChat-<version>-velocity.jar` for Velocity proxies. + +## Installation + +### Paper / Folia + +1. Place the downloaded `LunaticChat-<version>.jar` into the server's `plugins/` directory +2. Start (or restart) the server +3. `plugins/LunaticChat/config.yml` will be generated automatically +4. Modify the [configuration](/en/docs/configuration) as needed and restart the server + +### Velocity + +1. Place the downloaded `LunaticChat-<version>-velocity.jar` into the Velocity `plugins/` directory +2. Start (or restart) the Velocity proxy +3. Set `features.velocityIntegration.enabled` to `true` in the Paper-side `config.yml` +4. See [Velocity Integration](/en/docs/features/velocity) for details + +## Next Steps + +- [Configuration](/en/docs/configuration) - Review all settings in `config.yml` +- [Direct Message](/en/docs/features/direct-message) - How to use the DM feature +- [Channel Chat](/en/docs/features/channel-chat) - How to use the channel feature +- [Command Reference](/en/docs/reference/commands) - Reference for all commands diff --git a/website/src/en/docs/permissions.md b/website/src/en/docs/permissions.md new file mode 100644 index 0000000..d059bba --- /dev/null +++ b/website/src/en/docs/permissions.md @@ -0,0 +1,50 @@ +--- +layout: doc +--- + +# Permissions + +A list of all permission nodes in LunaticChat. + +## Command Permissions + +All command permissions are granted to all players by default. + +| Permission | Description | +|------------|-------------| +| `lunaticchat.command.lc` | Use the `/lc` command | +| `lunaticchat.command.tell` | Use the `/tell` command | +| `lunaticchat.command.reply` | Use the `/reply` command | +| `lunaticchat.command.lc.settings` | Use `/lc settings` | +| `lunaticchat.command.lc.status` | Use `/lc status` | + +### Channel-Related + +| Permission | Description | +|------------|-------------| +| `lunaticchat.command.lc.channel` | Use `/lc channel` | +| `lunaticchat.command.lc.channel.create` | Create a channel | +| `lunaticchat.command.lc.channel.list` | View the channel list | +| `lunaticchat.command.lc.channel.join` | Join a channel | +| `lunaticchat.command.lc.channel.leave` | Leave a channel | +| `lunaticchat.command.lc.channel.switch` | Switch the active channel | +| `lunaticchat.command.lc.channel.status` | View channel membership status | +| `lunaticchat.command.lc.channel.info` | View channel information | +| `lunaticchat.command.lc.channel.delete` | Delete a channel | +| `lunaticchat.command.lc.channel.invite` | Invite to a channel | +| `lunaticchat.command.lc.channel.kick` | Kick from a channel | +| `lunaticchat.command.lc.channel.ban` | Ban from a channel | +| `lunaticchat.command.lc.channel.unban` | Unban from a channel | +| `lunaticchat.command.lc.channel.mod` | Grant or revoke moderator privileges | +| `lunaticchat.command.lc.channel.ownership` | Transfer channel ownership | + +## Admin Permissions + +The following permissions are granted to OPs only by default. + +| Permission | Default | Description | +|------------|---------|-------------| +| `lunaticchat.spy` | op | View all direct messages on the server | +| `lunaticchat.noticeupdate` | op | Receive update notifications | +| `lunaticchat.channelbypass` | op | Bypass channel restrictions (kick/ban protection, force deletion) | +| `lunaticchat.command.lcv.status` | op | Use the `/lcv status` command | diff --git a/website/src/en/docs/reference/commands.md b/website/src/en/docs/reference/commands.md new file mode 100644 index 0000000..3ed72df --- /dev/null +++ b/website/src/en/docs/reference/commands.md @@ -0,0 +1,157 @@ +--- +layout: doc +--- + +# Command Reference + +A reference for all commands available in LunaticChat. + +## Direct Messages + +### `/tell <player> <message>` + +Sends a direct message to a player. + +- **Aliases**: `t`, `msg`, `m`, `w`, `whisper` +- **Permission**: `lunaticchat.command.tell` + +### `/reply <message>` + +Replies to the last player who sent you a message. + +- **Aliases**: `r` +- **Permission**: `lunaticchat.command.reply` +- **Prerequisite**: Quick reply feature must be enabled + +## Main Command (`/lc`) + +**Aliases**: `lunaticchat` + +### `/lc status` + +Displays the plugin version, health, enabled features, and configuration values. + +- **Permission**: `lunaticchat.command.lc.status` + +### `/lc settings [key] [on|off]` + +Views or changes your personal settings. Without arguments, displays the settings list. + +- **Permission**: `lunaticchat.command.lc.settings` +- **Setting keys**: `japanese`, `notice`, `chNotice` (see [Player Settings](/en/docs/reference/player-settings) for details) + +## Channel Commands (`/lc channel`) + +Only available when the channel chat feature is enabled. + +### Create & Browse + +#### `/lc channel create <channelId> <name> [description] [isPrivate]` + +Creates a new channel. The creator becomes the owner. + +- **Permission**: `lunaticchat.command.lc.channel.create` +- `channelId`: Only alphanumeric characters, underscores, and hyphens are allowed +- `isPrivate`: `true` / `false` (default: `false`) + +#### `/lc channel list [page]` + +Displays a list of public channels (10 per page). + +- **Permission**: `lunaticchat.command.lc.channel.list` + +#### `/lc channel info [channelId]` + +Displays detailed information about a channel. Without arguments, shows information about the active channel. + +- **Permission**: `lunaticchat.command.lc.channel.info` + +### Join & Leave + +#### `/lc channel join <channelId>` + +Joins a channel. An invitation is required for private channels. + +- **Permission**: `lunaticchat.command.lc.channel.join` + +#### `/lc channel leave` + +Leaves the active channel. + +- **Permission**: `lunaticchat.command.lc.channel.leave` + +#### `/lc channel switch <channelId>` + +Switches the active channel to another channel you have already joined. + +- **Permission**: `lunaticchat.command.lc.channel.switch` + +#### `/lc channel status` + +Displays your channel membership status (active channel and list of joined channels). + +- **Permission**: `lunaticchat.command.lc.channel.status` + +### Moderation (Owner / Moderator) + +#### `/lc channel invite <playerName>` + +Invites a player to the active channel. Bypasses private channel restrictions. + +- **Permission**: `lunaticchat.command.lc.channel.invite` +- **Required role**: OWNER or MODERATOR + +#### `/lc channel kick <playerName>` + +Kicks a player from the active channel. + +- **Permission**: `lunaticchat.command.lc.channel.kick` +- **Required role**: OWNER or MODERATOR + +#### `/lc channel ban <playerName>` + +Bans a player from the active channel. Banned players cannot rejoin. + +- **Permission**: `lunaticchat.command.lc.channel.ban` +- **Required role**: OWNER or MODERATOR + +#### `/lc channel unban <playerName>` + +Unbans a player from the channel. + +- **Permission**: `lunaticchat.command.lc.channel.unban` +- **Required role**: OWNER or MODERATOR + +### Administration (Owner Only) + +#### `/lc channel delete <channelId>` + +Deletes a channel. + +- **Permission**: `lunaticchat.command.lc.channel.delete` +- **Required role**: OWNER (can be bypassed with `lunaticchat.channelbypass` permission) + +#### `/lc channel mod <playerName>` + +Grants or revokes moderator privileges for a channel member. + +- **Permission**: `lunaticchat.command.lc.channel.mod` +- **Required role**: OWNER + +#### `/lc channel ownership <playerName>` + +Transfers channel ownership to another member. + +- **Permission**: `lunaticchat.command.lc.channel.ownership` +- **Required role**: OWNER + +## Velocity Commands (`/lcv`) + +**Aliases**: `lunaticvelocity` + +### `/lcv status` + +Displays the connection status with the Velocity proxy, protocol version, and online player count. + +- **Permission**: `lunaticchat.command.lcv.status` +- **Default**: op only diff --git a/website/src/en/docs/reference/message-format.md b/website/src/en/docs/reference/message-format.md new file mode 100644 index 0000000..2669adb --- /dev/null +++ b/website/src/en/docs/reference/message-format.md @@ -0,0 +1,86 @@ +--- +layout: doc +--- + +# Message Format + +You can customize the display format of chat messages in the `messageFormat` section of `config.yml`. + +## Placeholders + +| Placeholder | Description | Available formats | +|-------------|-------------|-------------------| +| `{sender}` | Name of the message sender | All | +| `{recipient}` | Name of the message recipient | `directMessageFormat` | +| `{message}` | Message content | All | +| `{channel}` | Channel name | `channelMessageFormat` | +| `{server}` | Server name | `crossServerGlobalChatFormat` | + +## Format List + +### `directMessageFormat` + +The display format for direct messages sent via `/tell` or `/reply`. + +**Default:** +``` +§7[§e{sender} §7>> §e{recipient}§7] §f{message} +``` + +**Example:** <span style="color: gray">[</span><span style="color: gold">Steve</span> <span style="color: gray">>></span> <span style="color: gold">Alex</span><span style="color: gray">]</span> <span style="color: white">Hello!</span> + +### `channelMessageFormat` + +The display format for messages sent in channel chat. + +**Default:** +``` +§7[§b#{channel}§7] §e{sender}: §f{message} +``` + +**Example:** <span style="color: gray">[</span><span style="color: aqua">#general</span><span style="color: gray">]</span> <span style="color: gold">Steve:</span> <span style="color: white">Hello!</span> + +### `crossServerGlobalChatFormat` + +The display format for cross-server global chat when using Velocity integration. + +**Default:** +``` +§7[§6{server}§7] §e{sender}: §f{message} +``` + +**Example:** <span style="color: gray">[</span><span style="color: gold">survival</span><span style="color: gray">]</span> <span style="color: gold">Steve:</span> <span style="color: white">Hello!</span> + +## Color Codes + +You can use color codes with the Minecraft section sign (`§`). + +| Code | Color | +|------|-------| +| `§0` | Black | +| `§1` | Dark blue | +| `§2` | Dark green | +| `§3` | Dark aqua | +| `§4` | Dark red | +| `§5` | Dark purple | +| `§6` | Gold | +| `§7` | Gray | +| `§8` | Dark gray | +| `§9` | Blue | +| `§a` | Green | +| `§b` | Aqua | +| `§c` | Red | +| `§d` | Pink | +| `§e` | Yellow | +| `§f` | White | + +### Formatting Codes + +| Code | Effect | +|------|--------| +| `§l` | **Bold** | +| `§o` | *Italic* | +| `§n` | <u>Underline</u> | +| `§m` | ~~Strikethrough~~ | +| `§k` | Obfuscated (characters change randomly) | +| `§r` | Reset | diff --git a/website/src/en/docs/reference/player-settings.md b/website/src/en/docs/reference/player-settings.md new file mode 100644 index 0000000..6db48ac --- /dev/null +++ b/website/src/en/docs/reference/player-settings.md @@ -0,0 +1,50 @@ +--- +layout: doc +--- + +# Player Settings + +Players can change their personal settings using the `/lc settings` command. Settings are saved per UUID in the server's `player-settings.yaml` (the file path can be changed via `userSettingsFilePath` in the configuration file). + +## Command + +``` +/lc settings # Display settings list +/lc settings <key> # Check current value +/lc settings <key> on|off # Change value +``` + +## Setting Keys + +| Key | Description | Default | +|-----|-------------|---------| +| `japanese` | Enable romaji-to-Japanese conversion | `true` | +| `notice` | Enable direct message notifications | `true` | +| `chNotice` | Enable channel message notifications | `true` | + +### `japanese` + +Automatically converts chat messages typed in romaji to Japanese (hiragana). This setting only works when `features.japaneseConversion.enabled` is set to `true` on the server side. + +``` +/lc settings japanese on # Enable conversion +/lc settings japanese off # Disable conversion +``` + +### `notice` + +Controls notifications when receiving direct messages (`/tell` / `/reply`). + +``` +/lc settings notice on # Enable notifications +/lc settings notice off # Disable notifications +``` + +### `chNotice` + +Controls notifications when receiving channel chat messages. This setting only works when `features.channelChat.enabled` is set to `true` on the server side. + +``` +/lc settings chNotice on # Enable notifications +/lc settings chNotice off # Disable notifications +``` diff --git a/website/src/en/download.md b/website/src/en/download.md new file mode 100644 index 0000000..e629415 --- /dev/null +++ b/website/src/en/download.md @@ -0,0 +1,6 @@ +--- +layout: page +title: Download +--- + +<DownloadCard /> diff --git a/website/src/en/index.md b/website/src/en/index.md new file mode 100644 index 0000000..b823a0d --- /dev/null +++ b/website/src/en/index.md @@ -0,0 +1,153 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'LunaticChat' + tagline: A next-generation chat plugin for Paper, Folia and Velocity. + actions: + - theme: brand + text: Download + link: /en/download + - theme: brand + text: Documentation + link: /en/docs/getting-started + - theme: alt + text: GitHub + link: https://github.com/m1sk9/LunaticChat + +features: + - title: Channel Chat + details: Create and manage channels for group conversations between specific players. Includes private channels and moderation features. + icon: ☎️ + - title: Direct Messages + details: Send 1-on-1 chats with /tell or /msg commands. Quickly reply to the last sender with /reply. + icon: ✉️ + - title: Romaji Conversion + details: Automatically convert romaji input into Japanese. Fast performance powered by caching. + icon: 🌍 + - title: Velocity Cross-Server Chat + details: Relay global chat across multiple servers via a Velocity proxy. Join conversations from any server. + icon: 🔗 + - title: Flexible Configuration + details: Toggle features on/off with a YAML-based config file. Customize to fit your server's needs. + icon: ⚙️ + - title: Latest Version Support + details: Minimal external plugin dependencies, always supporting the latest Minecraft versions. + icon: ⛏️ +--- + +<hr class="home-divider" /> + +<!-- Section 1: Channel Chat (text left, image right) --> +<div class="feature-showcase"> + <div class="feature-showcase-text"> + <h2>Organize Conversations with Channel Chat</h2> + <p> + Create channels within your server to separate conversations by topic or group. + Communicate with only the members you need, without flooding the global chat. + </p> + <ul> + <li>Create password-protected private channels</li> + <li>Per-channel moderation (kick, mute, ban)</li> + <li>Customizable join/leave notifications</li> + </ul> + </div> + <div class="feature-showcase-image"> + <img src="../assets/features/channel-chat.png" alt="LunaticChat Channel Chat feature" /> + </div> +</div> + +<hr class="home-divider" /> + +<!-- Section 2: Direct Messages (image left, text right) --> +<div class="feature-showcase reverse"> + <div class="feature-showcase-text"> + <h2>Direct Messages & Quick Reply</h2> + <p> + Easily send private 1-on-1 chats between players. + Use the <code>/reply</code> command to instantly respond to the last sender. + </p> + <ul> + <li>Send direct messages with <code>/tell</code> / <code>/msg</code></li> + <li>Instantly reply to the last sender with <code>/reply</code></li> + <li>Messages are visible only to the sender and recipient</li> + </ul> + </div> + <div class="feature-showcase-image"> + <img src="../assets/features/dm.png" alt="LunaticChat Direct Message feature" /> + </div> +</div> + +<hr class="home-divider" /> + +<!-- Section 3: Romaji Conversion (text left, image right) --> +<div class="feature-showcase"> + <div class="feature-showcase-text"> + <h2>Automatic Romaji to Japanese Conversion</h2> + <p> + Even in environments without Japanese input support, simply type in romaji and it will be automatically converted to Japanese. + Powered by the Google IME API for natural conversion results. + </p> + <ul> + <li>Real-time romaji-to-Japanese conversion while chatting</li> + <li>Fast performance with conversion result caching</li> + <li>Per-player toggle to enable/disable conversion</li> + </ul> + </div> + <div class="feature-showcase-image"> + <img src="../assets/features/romaji.png" alt="LunaticChat Romaji Conversion feature" /> + </div> +</div> + +<hr class="home-divider" /> + +<!-- Section 4: Velocity Integration (image left, text right) --> +<div class="feature-showcase reverse"> + <div class="feature-showcase-text"> + <h2>Cross-Server Chat with Velocity</h2> + <p> + Integrate with a Velocity proxy to relay global chat across multiple Paper/Folia servers. + Players can join the same chat space regardless of which server they're on. + </p> + <ul> + <li>Relay regular chat to all servers in real time</li> + <li>Fast communication via a custom plugin messaging protocol</li> + <li>Backward compatibility guaranteed through protocol versioning</li> + </ul> + </div> + <div class="feature-showcase-image"> + <img src="../assets/features/cross-chat.png" alt="LunaticChat Cross-Server Chat feature" /> + </div> +</div> + +<hr class="home-divider" /> + +<!-- Section 5: Platforms --> +<div class="platform-section"> + <h2>Multi-Platform Support</h2> + <p class="section-desc">Flexibly deploy to match your server setup</p> + <div class="platform-cards"> + <a class="platform-card" href="https://papermc.io/software/paper/" target="_blank" rel="noopener"> + <div class="platform-icon"> + <img src="../assets/brand/paper.svg" alt="Paper" width="40" height="40" /> + </div> + <p class="name">Paper</p> + <p class="desc">The most widely used Minecraft server implementation. Full support for DM, channel chat, romaji conversion, and all features. Maintains compatibility with Bukkit/Spigot plugins.</p> + </a> + <a class="platform-card" href="https://papermc.io/software/folia" target="_blank" rel="noopener"> + <div class="platform-icon"> + <img src="../assets/brand/folia.svg" alt="Folia" width="40" height="40" /> + </div> + <p class="name">Folia</p> + <p class="desc">A multithreaded server implementation by PaperMC. Provides a stable chat experience even on large-scale servers through region-based parallel processing.</p> + </a> + <a class="platform-card" href="https://papermc.io/software/velocity" target="_blank" rel="noopener"> + <div class="platform-icon"> + <img src="../assets/brand/velocity.svg" alt="Velocity" width="40" height="40" /> + </div> + <p class="name">Velocity</p> + <p class="desc">A high-performance proxy server. Install the LunaticChat Velocity plugin to enable global chat relay across multiple Paper/Folia servers.</p> + </a> + </div> +</div> diff --git a/website/src/index.md b/website/src/index.md new file mode 100644 index 0000000..007a6ad --- /dev/null +++ b/website/src/index.md @@ -0,0 +1,153 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'LunaticChat' + tagline: A next-generation chat plugin for Paper, Folia and Velocity. + actions: + - theme: brand + text: ダウンロード + link: /download + - theme: brand + text: ドキュメント + link: /docs/getting-started + - theme: alt + text: GitHub + link: https://github.com/m1sk9/LunaticChat + +features: + - title: チャンネルチャット + details: チャンネルを作成・管理し,特定のプレイヤー間でグループチャットが可能.プライベートチャンネルやモデレーション機能も搭載 + icon: ☎️ + - title: ダイレクトメッセージ + details: /tell や /msg コマンドで 1対1 のチャットが可能./reply で直前の相手に素早く返信 + icon: ✉️ + - title: ローマ字変換 + details: ローマ字で入力したメッセージを自動的に日本語に変換.キャッシュにより高速に動作 + icon: 🌍 + - title: Velocity サーバー間連携 + details: Velocity プロキシを経由して複数サーバー間でグローバルチャットをリレー.どのサーバーにいても会話に参加可能 + icon: 🔗 + - title: 柔軟な設定 + details: YAML ベースの設定ファイルで機能の有効/無効を切り替え.サーバーの用途に合わせてカスタマイズ可能 + icon: ⚙️ + - title: 最新バージョン対応 + details: 外部プラグインへの依存を最小限に抑え,常に最新の Minecraft バージョンに対応 + icon: ⛏️ +--- + +<hr class="home-divider" /> + +<!-- Section 1: チャンネルチャット (text left, image right) --> +<div class="feature-showcase"> + <div class="feature-showcase-text"> + <h2>チャンネルチャットで会話を整理</h2> + <p> + サーバー内にチャンネルを作成して,トピックやグループごとに会話を分離できます. + 全体チャットに流れることなく,必要なメンバーだけでコミュニケーションが可能です. + </p> + <ul> + <li>パスワード付きのプライベートチャンネルを作成</li> + <li>チャンネルごとのモデレーション機能(キック・ミュート・BAN)</li> + <li>チャンネル参加・退出の通知をカスタマイズ</li> + </ul> + </div> + <div class="feature-showcase-image"> + <img src="./assets/features/channel-chat.png" alt="LunaticChat のチャンネルチャット機能" /> + </div> +</div> + +<hr class="home-divider" /> + +<!-- Section 2: ダイレクトメッセージ (image left, text right) --> +<div class="feature-showcase reverse"> + <div class="feature-showcase-text"> + <h2>ダイレクトメッセージ & クイック返信</h2> + <p> + プレイヤー間で手軽に 1対1 のプライベートチャットができます. + <code>/reply</code> コマンドで直前の相手にすぐ返信でき,テンポの良いやり取りを実現します. + </p> + <ul> + <li><code>/tell</code> / <code>/msg</code> でダイレクトメッセージを送信</li> + <li><code>/reply</code> で直前の送信者に即座に返信</li> + <li>メッセージは送信者と受信者だけに表示</li> + </ul> + </div> + <div class="feature-showcase-image"> + <img src="./assets/features/dm.png" alt="LunaticChat のダイレクトメッセージ機能" /> + </div> +</div> + +<hr class="home-divider" /> + +<!-- Section 3: ローマ字変換 (text left, image right) --> +<div class="feature-showcase"> + <div class="feature-showcase-text"> + <h2>ローマ字入力を自動で日本語に</h2> + <p> + 日本語入力に対応していない環境でも,ローマ字で入力するだけで自動的に日本語に変換されます. + Google IME API を活用し,自然な変換結果を提供します. + </p> + <ul> + <li>チャット入力時にリアルタイムでローマ字→日本語変換</li> + <li>変換結果のキャッシュで高速動作を実現</li> + <li>プレイヤーごとに変換機能のオン/オフを切り替え可能</li> + </ul> + </div> + <div class="feature-showcase-image"> + <img src="./assets/features/romaji.png" alt="LunaticChat のローマ字変換機能" /> + </div> +</div> + +<hr class="home-divider" /> + +<!-- Section 4: Velocity 連携 (image left, text right) --> +<div class="feature-showcase reverse"> + <div class="feature-showcase-text"> + <h2>Velocity でサーバー間連携</h2> + <p> + Velocity プロキシと連携して,複数の Paper/Folia サーバー間でグローバルチャットをリレーします. + プレイヤーはどのサーバーにいても,同じチャット空間で会話に参加できます. + </p> + <ul> + <li>通常チャットを全サーバーにリアルタイムでリレー</li> + <li>独自のプラグインメッセージングプロトコルで高速な通信</li> + <li>プロトコルバージョニングによる後方互換性の保証</li> + </ul> + </div> + <div class="feature-showcase-image"> + <img src="./assets/features/cross-chat.png" alt="LunaticChat のクロスチャット機能" /> + </div> +</div> + +<hr class="home-divider" /> + +<!-- Section 5: プラットフォーム --> +<div class="platform-section"> + <h2>マルチプラットフォーム対応</h2> + <p class="section-desc">サーバーの構成に合わせて柔軟に導入できます</p> + <div class="platform-cards"> + <a class="platform-card" href="https://papermc.io/software/paper/" target="_blank" rel="noopener"> + <div class="platform-icon"> + <img src="./assets/brand/paper.svg" alt="Paper" width="40" height="40" /> + </div> + <p class="name">Paper</p> + <p class="desc">最も広く利用されている Minecraft サーバー実装.DM,チャンネルチャット,ローマ字変換など全機能をフルサポート.Bukkit/Spigot プラグインとの互換性も維持</p> + </a> + <a class="platform-card" href="https://papermc.io/software/folia" target="_blank" rel="noopener"> + <div class="platform-icon"> + <img src="./assets/brand/folia.svg" alt="Folia" width="40" height="40" /> + </div> + <p class="name">Folia</p> + <p class="desc">PaperMC が開発するマルチスレッド対応のサーバー実装.リージョン分割による並列処理で,大規模サーバーでも安定したチャット体験を提供</p> + </a> + <a class="platform-card" href="https://papermc.io/software/velocity" target="_blank" rel="noopener"> + <div class="platform-icon"> + <img src="./assets/brand/velocity.svg" alt="Velocity" width="40" height="40" /> + </div> + <p class="name">Velocity</p> + <p class="desc">高性能なプロキシサーバー.LunaticChat の Velocity プラグインを導入することで,複数の Paper/Folia サーバー間でグローバルチャットのリレーを実現</p> + </a> + </div> +</div> diff --git a/docs/.vitepress/public/favicon.ico b/website/src/public/favicon.ico Binary files differindex 46c0cad..46c0cad 100644 --- a/docs/.vitepress/public/favicon.ico +++ b/website/src/public/favicon.ico diff --git a/docs/tsconfig.json b/website/tsconfig.json index 5f61eef..5f61eef 100644 --- a/docs/tsconfig.json +++ b/website/tsconfig.json diff --git a/docs/wrangler.jsonc b/website/wrangler.jsonc index c1e3ce5..c1e3ce5 100644 --- a/docs/wrangler.jsonc +++ b/website/wrangler.jsonc |
