diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..ffd308c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true +end_of_line = lf +max_line_length = 100 + +[*.md] +max_line_length = off +trim_trailing_whitespace = false + +[*.svg] +max_line_length = off +insert_final_newline = false diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 08429d9..2abf5d1 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -2,9 +2,9 @@ ## Type of Change -- [ ] Bug fix -- [ ] New feature -- [ ] Breaking change +- [ ] Update +- [ ] Addition +- [ ] Translation ## Testing @@ -15,4 +15,6 @@ - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings -- [ ] I have added tests that prove my fix is effective or that my feature works +- [ ] I have added my new file to all language directories +- [ ] I have replaced the old file in all language directories and not just the english language directory +- [ ] I have reviewed my translation for langauge mistakes \ No newline at end of file diff --git a/.gitignore b/.gitignore index 6845ef7..1f343ea 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -book -**/.DS_Store -.idea/ -*.iml \ No newline at end of file +.DS_Store +node_modules +docs/.vitepress/cache +docs/.vitepress/dist diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 0ee12ca..0000000 --- a/Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -# compile book to html -FROM rust:buster - -RUN cargo install mdbook - -RUN mkdir -p /tmp/build -WORKDIR /tmp/build - -COPY book.toml /tmp/build/book.toml -COPY src /tmp/build/src/ - -RUN mdbook build - -# nginx container -FROM nginx:mainline - -COPY --from=0 /tmp/build/book/ /usr/share/nginx/html/ diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts new file mode 100644 index 0000000..0764679 --- /dev/null +++ b/docs/.vitepress/config.mts @@ -0,0 +1,511 @@ +import { defineConfig } from "vitepress"; +import { footnote } from "@mdit/plugin-footnote"; + +// https://vitepress.dev/reference/site-config +export default defineConfig({ + title: "Tickets Docs", + description: "Official Documentation of the Tickets Discord Bot", + srcDir: "./src", + rewrites: { + "en/:rest*": ":rest*", + }, + locales: { + root: { + label: "πŸ‡¬πŸ‡§ English", + lang: "en-GB", + }, + // de: { + // label: "πŸ‡©πŸ‡ͺ Deutsch", + // lang: "de-DE", + // link: "/de" + // } + }, + markdown: { + config: (md) => { + md.use(footnote); + }, + }, + themeConfig: { + // https://vitepress.dev/reference/default-theme-config + search: { + provider: "local", + }, + logo: "/logov2-round.png", + nav: [ + { + text: "Home", + link: "/", + }, + { + text: "Documentation", + items: [ + { + text: "Introduction", + link: "/introduction/introduction", + }, + { + text: "Setup", + link: "/setup/introduction", + }, + { + text: "Commands", + link: "/commands/introduction", + }, + { + text: "Dashboard", + link: "/dashboard/introduction", + }, + { + text: "Premium", + link: "/premium/introduction", + }, + { + text: "Features", + link: "/features/introduction", + }, + { + text: "Miscellaneous", + link: "/miscellaneous/introduction", + }, + { + text: "Meet the Team", + link: "/team", + }, + ], + }, + { + text: "Dashboard", + link: "https://dashboard.tickets.bot", + }, + { + text: "Support Server", + link: "https://discord.gg/ticketsbot", + }, + ], + footer: { + message: "Maintained with 💖", + copyright: + '© 2026 BH Cloud Labs Ltd. All rights reserved.
BH Cloud Labs Ltd, trading as Tickets Bot is registered in England and Wales (No. 16211348).
Registered Address: The Grange, Grange Road, Great Malvern, WR14 3HA.', + }, + sidebar: [ + { + text: "Introduction", + link: "/introduction/introduction", + collapsed: false, + items: [], + }, + { + text: "Setup", + link: "/setup/introduction", + collapsed: true, + items: [ + { + text: "Inviting the Bot", + link: "/setup/invite", + }, + { + text: "Language Customisation", + link: "/setup/language-customisation", + }, + { + text: "Bot Configuration", + link: "/setup/configuration", + }, + { + text: "", + items: [ + { + text: "Web Dashboard", + link: "/setup/dashboard", + }, + { + text: "Setup Command", + link: "/setup/setup-command", + }, + ], + }, + { + text: "Ticket Panels", + link: "/setup/ticket-panels", + }, + { + text: "Support Staff", + link: "/setup/support-staff", + }, + ], + }, + { + text: "Commands", + link: "/commands/introduction", + collapsed: true, + items: [ + { + text: "List of Commands", + link: "/commands/list-of-commands", + }, + { + text: "", + items: [ + { + text: "Add Admin / Support", + link: "/commands/add-admin-support", + }, + { + text: "Close Requests", + link: "/commands/close-requests", + }, + { + text: "GDPR Data Request", + link: "/commands/gdpr", + }, + ], + }, + ], + }, + { + text: "Dashboard", + link: "/dashboard/introduction", + collapsed: true, + items: [ + { + text: "Overview", + link: "/dashboard/overview", + }, + { + text: "Tickets", + items: [ + { + text: "Tickets", + link: "/dashboard/tickets", + }, + { + text: "Transcripts", + link: "/dashboard/transcripts", + }, + { + text: "Analytics", + link: "/dashboard/analytics", + }, + ], + }, + { + text: "Setup", + items: [ + { + text: "Server Settings", + link: "/dashboard/settings/settings", + }, + { + text: "Panels", + link: "/dashboard/ticket-panels", + }, + { + text: "", + items: [ + { + text: "Multi-Panels", + link: "/dashboard/multi-panels", + }, + { + text: "Template Gallery", + link: "/dashboard/panel-gallery", + }, + ], + }, + { + text: "Forms", + link: "/dashboard/forms", + }, + { + text: "Integrations", + link: "/integrations/introduction", + }, + { + text: "", + items: [ + { + text: "Building Integrations", + link: "/integrations/building-integrations", + }, + { + text: "Cloudflare Workers", + link: "/integrations/cloudflare-workers", + }, + ], + }, + ], + }, + { + text: "Content", + items: [ + { + text: "Knowledge Base", + link: "/dashboard/knowledge-base", + }, + { + text: "Tags", + link: "/dashboard/tags", + }, + ], + }, + { + text: "Moderation", + items: [ + { + text: "Staff Teams", + link: "/dashboard/staff-teams", + }, + { + text: "Blacklist", + link: "/dashboard/blacklist", + }, + { + text: "Audit Log", + link: "/dashboard/audit-log", + }, + ], + }, + { + text: "Account", + items: [ + { + text: "Notifications", + link: "/dashboard/notifications", + }, + { + text: "User Settings", + link: "/dashboard/settings", + }, + ], + }, + { + text: "Ticket Features", + items: [ + { + text: "Thread Mode", + link: "/dashboard/settings/thread-mode", + }, + { + text: "Claiming Tickets", + link: "/dashboard/settings/claiming-tickets", + }, + { + text: "User Feedback", + link: "/dashboard/settings/user-feedback", + }, + { + text: "Exit Survey", + link: "/dashboard/settings/exit-survey", + }, + { + text: "Awaiting User Response", + link: "/dashboard/settings/awaiting-user-response", + }, + { + text: "Start Ticket From Message", + link: "/dashboard/settings/start-ticket-from-message", + }, + { + text: "Placeholders", + link: "/miscellaneous/placeholders", + }, + ], + }, + ], + }, + { + text: "Premium", + link: "/premium/introduction", + collapsed: true, + items: [ + { + text: "Premium and Whitelabel Perks", + link: "/premium/perks", + }, + { + text: "Whitelabel Setup Guide", + link: "/premium/whitelabel-setup-guide", + }, + { + text: "Whitelabel Resync Guide", + link: "/premium/whitelabel-resync-guide", + }, + { + text: "Whitelabel Removal Guide", + link: "/premium/whitelabel-removal-guide", + }, + { + text: "Whitelabel Intents Guide", + link: "/premium/whitelabel-intents-guide", + }, + ], + }, + { + text: "Features", + link: "/features/introduction", + collapsed: true, + items: [ + { + text: "Affiliate Programme", + link: "/features/affiliate-programme", + }, + { + text: "Auto Close", + link: "/dashboard/ticket-panels#auto-close", + }, + { + text: "Awaiting User Response", + link: "/dashboard/settings/awaiting-user-response", + }, + { + text: "Claiming Tickets", + link: "/dashboard/settings/claiming-tickets", + }, + { + text: "Close Requests", + link: "/features/close-requests", + }, + { + text: "Exit Survey", + link: "/dashboard/settings/exit-survey", + }, + { + text: "Forms", + link: "/dashboard/forms", + }, + { + text: "", + items: [ + { + text: "API-Based Form Inputs", + link: "/features/api-form-inputs", + }, + ], + }, + { + text: "Knowledge Base", + link: "/dashboard/knowledge-base", + }, + { + text: "Multi Panels", + link: "/dashboard/multi-panels", + }, + { + text: "Start Ticket from Message", + link: "/dashboard/settings/start-ticket-from-message", + }, + { + text: "Support Hours", + link: "/features/support-hours", + }, + { + text: "Thread Mode", + link: "/dashboard/settings/thread-mode", + }, + { + text: "User Feedback", + link: "/dashboard/settings/user-feedback", + }, + ], + }, + { + text: "Miscellaneous", + link: "/miscellaneous/introduction", + collapsed: true, + items: [ + { + text: "Official Tickets Links", + link: "/miscellaneous/official-links", + }, + { + text: "Patreon Links/Articles", + link: "/miscellaneous/patreon", + }, + { + text: "Bot Permissions Explained", + link: "/miscellaneous/permissions-explained", + }, + { + text: "Placeholders", + link: "/miscellaneous/placeholders", + }, + { + text: "Translate the Bot", + link: "/miscellaneous/translate", + }, + { + text: "Dashboard: No Permission", + link: "/miscellaneous/dashboard-no-permission", + }, + ], + }, + { + text: "Meet the Team", + link: "/team", + collapsed: false, + items: [], + }, + ], + socialLinks: [ + { + icon: "discord", + link: "https://discord.gg/ticketsbot", + }, + { + icon: "github", + link: "https://github.com/TicketsBot-cloud", + }, + ], + }, + cleanUrls: true, + head: [ + [ + "meta", + { + content: "Tickets | Documentation", + property: "og:title", + }, + ], + [ + "meta", + { + content: "Official Documentation of the Tickets Discord bot", + property: "og:description", + }, + ], + [ + "meta", + { + content: "/favicon.ico", + property: "og:image", + }, + ], + [ + "meta", + { + content: "#2047f8", + name: "theme-color", + }, + ], + [ + "link", + { + rel: "icon", + href: "/favicon.ico", + }, + ], + [ + "script", + { + defer: "", + src: "/scripts/statusembed.js", + }, + ], + ], + // -- DEVELOPMENT SHOWCASE CONFIG -- + vite: { + server: { + allowedHosts: [".tickets.bot"], + }, + }, +}); diff --git a/docs/.vitepress/icons.ts b/docs/.vitepress/icons.ts new file mode 100644 index 0000000..7e1f151 --- /dev/null +++ b/docs/.vitepress/icons.ts @@ -0,0 +1,22 @@ +import { library } from "@fortawesome/fontawesome-svg-core"; +import { + faCheck, + faHeart, + faLightbulb, + faRocket, + faServer, + faSquareCheck, + faToggleOff, + faToggleOn, +} from "@fortawesome/free-solid-svg-icons"; + +library.add( + faCheck, + faHeart, + faLightbulb, + faRocket, + faServer, + faSquareCheck, + faToggleOff, + faToggleOn +); diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts new file mode 100644 index 0000000..a56937a --- /dev/null +++ b/docs/.vitepress/theme/index.ts @@ -0,0 +1,23 @@ +/// + +// https://vitepress.dev/guide/custom-theme +import { h } from "vue"; +import type { Theme } from "vitepress"; +import DefaultTheme from "vitepress/theme"; +import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome"; +import { dom } from "@fortawesome/fontawesome-svg-core"; +import "../icons"; +import "./style.css"; + +export default { + extends: DefaultTheme, + Layout: () => { + return h(DefaultTheme.Layout, null, { + // https://vitepress.dev/guide/extending-default-theme#layout-slots + }); + }, + enhanceApp({ app }) { + app.component("Icon", FontAwesomeIcon); + if (!import.meta.env.SSR) dom.watch(); + }, +} satisfies Theme; diff --git a/docs/.vitepress/theme/style.css b/docs/.vitepress/theme/style.css new file mode 100644 index 0000000..2df7869 --- /dev/null +++ b/docs/.vitepress/theme/style.css @@ -0,0 +1,227 @@ +/** + * Customize default theme styling by overriding CSS variables: + * https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css + */ + +/** + * Colors + * + * Each colors have exact same color scale system with 3 levels of solid + * colors with different brightness, and 1 soft color. + * + * - `XXX-1`: The most solid color used mainly for colored text. It must + * satisfy the contrast ratio against when used on top of `XXX-soft`. + * + * - `XXX-2`: The color used mainly for hover state of the button. + * + * - `XXX-3`: The color for solid background, such as bg color of the button. + * It must satisfy the contrast ratio with pure white (#ffffff) text on + * top of it. + * + * - `XXX-soft`: The color used for subtle background such as custom container + * or badges. It must satisfy the contrast ratio when putting `XXX-1` colors + * on top of it. + * + * The soft color must be semi transparent alpha channel. This is crucial + * because it allows adding multiple "soft" colors on top of each other + * to create an accent, such as when having inline code block inside + * custom containers. + * + * - `default`: The color used purely for subtle indication without any + * special meanings attached to it such as bg color for menu hover state. + * + * - `brand`: Used for primary brand colors, such as link text, button with + * brand theme, etc. + * + * - `tip`: Used to indicate useful information. The default theme uses the + * brand color for this by default. + * + * - `warning`: Used to indicate warning to the users. Used in custom + * container, badges, etc. + * + * - `danger`: Used to show error, or dangerous message to the users. Used + * in custom container, badges, etc. + * -------------------------------------------------------------------------- */ + +:root { + --vp-c-default-1: var(--vp-c-gray-1); + --vp-c-default-2: var(--vp-c-gray-2); + --vp-c-default-3: var(--vp-c-gray-3); + --vp-c-default-soft: var(--vp-c-gray-soft); + + --vp-c-brand-1: var(--vp-c-indigo-1); + --vp-c-brand-2: var(--vp-c-indigo-2); + --vp-c-brand-3: var(--vp-c-indigo-3); + --vp-c-brand-soft: var(--vp-c-indigo-soft); + + --vp-c-tip-1: var(--vp-c-brand-1); + --vp-c-tip-2: var(--vp-c-brand-2); + --vp-c-tip-3: var(--vp-c-brand-3); + --vp-c-tip-soft: var(--vp-c-brand-soft); + + --vp-c-warning-1: var(--vp-c-yellow-1); + --vp-c-warning-2: var(--vp-c-yellow-2); + --vp-c-warning-3: var(--vp-c-yellow-3); + --vp-c-warning-soft: var(--vp-c-yellow-soft); + + --vp-c-danger-1: var(--vp-c-red-1); + --vp-c-danger-2: var(--vp-c-red-2); + --vp-c-danger-3: var(--vp-c-red-3); + --vp-c-danger-soft: var(--vp-c-red-soft); + + --vp-c-purple-1: #4a27de; + --vp-c-purple-2: #5539cc; + --vp-c-purple-3: #4a379a; + --vp-c-purple-soft: #5e48bd24; +} + +/** + * Component: Button + * -------------------------------------------------------------------------- */ + +:root { + /** + * Brand Color + * -------------------------------------------------------------------------- */ + + --vp-button-brand-border: transparent; + --vp-button-brand-text: var(--vp-c-white); + --vp-button-brand-bg: #2047f8; + --vp-button-brand-hover-border: transparent; + --vp-button-brand-hover-text: var(--vp-c-white); + --vp-button-brand-hover-bg: #1938c6; + --vp-button-brand-active-border: transparent; + --vp-button-brand-active-text: var(--vp-c-white); + --vp-button-brand-active-bg: #132a94; + + /** + * Alt Color + * -------------------------------------------------------------------------- */ + + --vp-button-alt-border: transparent; + --vp-button-alt-text: var(--vp-c-white); + --vp-button-alt-bg: #5539cc; + --vp-button-alt-hover-border: transparent; + --vp-button-alt-hover-text: var(--vp-c-white); + --vp-button-alt-hover-bg: #4a27de; + --vp-button-alt-active-border: transparent; + --vp-button-alt-active-text: var(--vp-c-white); + --vp-button-alt-active-bg: #5e48bd; +} + +/** + * Component: Home + * -------------------------------------------------------------------------- */ + +:root { + --vp-home-hero-name-color: transparent; + --vp-home-hero-name-background: -webkit-linear-gradient( + 120deg, + #5539cc 30%, + #2047f8 + ); + + --vp-home-hero-image-background-image: linear-gradient( + -25deg, + #2047f8 50%, + #5865f2 50% + ); + --vp-home-hero-image-filter: blur(44px); +} + +@media (min-width: 640px) { + :root { + --vp-home-hero-image-filter: blur(56px); + } +} + +@media (min-width: 960px) { + :root { + --vp-home-hero-image-filter: blur(68px); + } +} + +.VPFeature .icon > svg { + color: var(--vp-c-brand-1); +} + +/** + * Component: Custom Block + * -------------------------------------------------------------------------- */ + +:root { + --vp-custom-block-tip-border: transparent; + --vp-custom-block-tip-text: var(--vp-c-text-1); + --vp-custom-block-tip-bg: var(--vp-c-brand-soft); + --vp-custom-block-tip-code-bg: var(--vp-c-brand-soft); +} + +/** + * Chrome: Footer / Nav dividers + * -------------------------------------------------------------------------- */ + +:root { + --tb-c-gutter-strong: var(--vp-c-gutter); +} + +.VPFooter, +.VPNavBar, +.VPLocalNav { + --vp-c-gutter: var(--vp-c-divider); +} + +.VPLocalNavOutlineDropdown .items { + --vp-c-gutter: var(--tb-c-gutter-strong); +} + +/** + * Component: Nav Extra + * -------------------------------------------------------------------------- */ + +.VPNavBarExtra .item.social-links { + justify-content: center; +} + +/** + * Component: Algolia + * -------------------------------------------------------------------------- */ + +.DocSearch { + --docsearch-primary-color: var(--vp-c-brand-1) !important; +} + +.VPTeamPage { + margin: 0; +} + +/** + * Component: Sidebar + * -------------------------------------------------------------------------- */ + +#VPSidebarNav > div:first-of-type .VPSidebarItem.level-0 { + padding-bottom: 10px; +} + +/** + * Component: Code Block + * -------------------------------------------------------------------------- */ + +.vp-doc div[class*="language-txt"] pre code { + white-space: pre-wrap; + overflow-wrap: break-word; +} + +/** + * Component: Premium Marker + * -------------------------------------------------------------------------- */ + +.premium-marker { + color: var(--vp-c-yellow-2); + font-size: 1.15em; + font-weight: 700; + line-height: 1; +} + +.dark .premium-marker { + color: var(--vp-c-yellow-1); +} diff --git a/docs/src/en/commands/add-admin-support.md b/docs/src/en/commands/add-admin-support.md new file mode 100644 index 0000000..3e3aabc --- /dev/null +++ b/docs/src/en/commands/add-admin-support.md @@ -0,0 +1,25 @@ +# Add Admin / Support + +You can quickly add users to your default team in [staff teams](../dashboard/staff-teams) with these commands. + +There is a major difference between the two, so let's cover them: + +## Add Admin + +**Command:** `/addadmin @username`, `/addadmin @role` + +Not only does this add the specified user to the default team in staff teams but it also gives that user full administrator privileges of the Tickets bot for your server. This is just for obtaining administrator privileges for the Tickets bot itself, **not your server**. + +:::warning Grants Full Bot Control +Having these privileges of the bot means the user will be able to use all features of the [web dashboard](https://dashboard.tickets.bot) and control all the configuration, settings, and customisation of the bot as well as see **ALL** of the tickets/transcripts contained there. ***Only give this privilege to those you trust.*** +::: + +## Add Support + +**Command:** `/addsupport @role` + +:::warning Deprecated: Use Roles Instead +Users in support teams are now deprecated. Please migrate to roles. +::: + +This adds the specified role to the default team in staff teams. The only thing the users with this role will be able to see on the web dashboard are the tickets that the default team has been assigned as a support team. diff --git a/docs/src/en/commands/close-requests.md b/docs/src/en/commands/close-requests.md new file mode 100644 index 0000000..f5d69d0 --- /dev/null +++ b/docs/src/en/commands/close-requests.md @@ -0,0 +1,22 @@ +# /closerequest + +Sends a close request to the ticket opener, asking them to confirm the ticket can be closed. The user sees Accept and Deny buttons in Discord. + +## Syntax + +``` +/closerequest [reason] [close_delay] +``` + +| Parameter | Required | Description | +|---|---|---| +| `reason` | No | A reason for closing the ticket, shown to the user. | +| `close_delay` | No | Time in hours after which the ticket closes automatically if the user does not respond. | + +If no `close_delay` is specified, the ticket stays open until the user accepts or denies the request. + +:::info Excluded Tickets Ignore Delays +If the ticket is excluded from auto-close via `/autoclose exclude`, close request delays will not apply, even if provided. +::: + +For a full explanation of close requests, including dashboard usage and bulk actions, see the [Close Requests](/features/close-requests) page. diff --git a/src/commands/gdpr.md b/docs/src/en/commands/gdpr.md similarity index 77% rename from src/commands/gdpr.md rename to docs/src/en/commands/gdpr.md index 295070e..434308a 100644 --- a/src/commands/gdpr.md +++ b/docs/src/en/commands/gdpr.md @@ -1,20 +1,20 @@ # GDPR Data Request -*** The `/gdpr` command allows users to exercise their data protection rights under the General Data Protection Regulation (GDPR). This command enables users to request deletion of ticket transcripts from servers they own, or anonymization of their messages from transcripts they participated in. -> **Note:** This command can **only be used in Direct Messages (DMs)** with the bot for privacy and security reasons. +:::info Direct Messages Only +This command can **only be used in Direct Messages (DMs)** with the bot for privacy and security reasons. +::: -
- -**Important:** All GDPR deletions are **permanent and cannot be undone**. Requests are processed within 30 days. -
+:::danger Deletions Are Permanent +All GDPR deletions are **permanent and cannot be undone**. Requests are processed within 30 days. +::: ## Overview When you run the `/gdpr` command in your DMs with the bot, you'll see an interactive menu with different request types: -![GDPR Request Menu](../img/gdpr/gdpr_request.png) +![GDPR Request Menu](../../img/gdpr/gdpr_request.webp) The command provides two main categories of requests: @@ -60,9 +60,11 @@ If no language is specified, the command defaults to English. 3. Review the confirmation screen showing which servers will be affected 4. Click "Confirm - I understand" to submit the request -> **Note:** Only servers you **own** with existing transcripts will appear in the dropdown menu. +:::info Owned Servers Only +Only servers you **own** with existing transcripts will appear in the dropdown menu. +::: -![Confirmation Screen](../img/gdpr/gdpr_confirm.png) +![Confirmation Screen](../../img/gdpr/gdpr_confirm.webp) ### Specific Transcripts from a Server @@ -84,7 +86,9 @@ If no language is specified, the command defaults to English. 4. Review the confirmation screen 5. Click "Confirm - I understand" to submit the request -> **Note:** Only servers you **own** with existing transcripts will appear in the dropdown menu. +:::info Owned Servers Only +Only servers you **own** with existing transcripts will appear in the dropdown menu. +::: **Ticket ID Format:** You can use any of the following separators: @@ -112,9 +116,11 @@ You can use any of the following separators: 3. Review the confirmation screen showing which servers will be affected 4. Click "Confirm - I understand" to submit the request -> **Note:** Only servers where you have **participated in tickets** with transcripts will appear in the dropdown menu. You do **not** need to be the server owner for this option. +:::info Participation, Not Ownership +Only servers where you have **participated in tickets** with transcripts will appear in the dropdown menu. You do **not** need to be the server owner for this option. +::: -![Message Confirmation](../img/gdpr/gdpr_messages_confirm.png) +![Message Confirmation](../../img/gdpr/gdpr_messages_confirm.webp) **What happens to your messages:** @@ -143,7 +149,9 @@ You can use any of the following separators: 4. Review the confirmation screen 5. Click "Confirm - I understand" to submit the request -> **Note:** Only servers where you have **participated in tickets** with transcripts will appear in the dropdown menu. You do **not** need to be the server owner for this option. +:::info Participation, Not Ownership +Only servers where you have **participated in tickets** with transcripts will appear in the dropdown menu. You do **not** need to be the server owner for this option. +::: **Ticket ID Format:** You can use any of the following separators: @@ -153,13 +161,13 @@ You can use any of the following separators: - One per line (newline-separated) - Tab-separated -> **Tip:** To find a server ID, enable Developer Mode in Discord settings, then right-click the server icon and select "Copy Server ID". [More info](http://dis.gd/findmyid) +:::tip Finding a Server ID +To find a server ID, enable Developer Mode in Discord settings, then right-click the server icon and select `Copy Server ID`. [More info](https://dis.gd/findmyid) +::: ## Request Processing -After confirmation, your request is queued for processing: - -![Request Queued](../img/gdpr/gdpr_queued.png) +After confirmation, your request is queued for processing ### Processing Timeline @@ -172,9 +180,10 @@ After confirmation, your request is queued for processing: The GDPR processing system runs on a separate worker service. If the system is temporarily unavailable, you'll see an error message: -**"The GDPR processing service is currently unavailable. Please try again later or contact support if this issue persists."** +`The GDPR processing service is currently unavailable. Please try again later or contact support if this issue persists.` This can happen during: + - Scheduled maintenance - Service updates - Temporary downtime @@ -194,7 +203,7 @@ The completion message shows: - **For message anonymization:** Number of messages anonymized - **If error occurred:** Error details and reason -![Request Complete](../img/gdpr/gdpr_done.png) +![Request Complete](../../img/gdpr/gdpr_done.webp) ## Important Information @@ -215,10 +224,9 @@ The completion message shows: ### Permanence Warning -
- -**⚠️ Warning:** All GDPR deletions and anonymizations are permanent and irreversible. Once data is deleted or anonymized, it cannot be recovered. Make absolutely sure you want to proceed before confirming any request. -
+:::danger Permanent and Irreversible +**All GDPR deletions and anonymizations are permanent and irreversible. Once data is deleted or anonymized, it cannot be recovered. Make absolutely sure you want to proceed before confirming any request.** +::: ### Request Queue @@ -229,44 +237,44 @@ The completion message shows: ## Frequently Asked Questions -**How long does processing take?** +### How long does processing take? Most requests are processed within a few minutes to a few hours, but GDPR regulations allow up to 30 days for completion. The processing time depends on the amount of data and the current queue length. -**Can I cancel a request after submitting it?** +### Can I cancel a request after submitting it? No, once a request is queued, it cannot be cancelled. Please review carefully before confirming. -**Will I be notified if my request fails?** +### Will I be notified if my request fails? Yes, you'll receive an ephemeral follow-up message and the original message will be updated explaining why the request failed. -**Can I select multiple servers at once?** +### Can I select multiple servers at once? Yes! For "All transcripts from servers" and "All your messages in servers" options, you can select multiple servers using the multi-select dropdown menu (if you have 25 or fewer eligible servers) or by entering comma-separated server IDs (if you have more than 25). -**What's the difference between deleting transcripts and anonymizing messages?** +### What's the difference between deleting transcripts and anonymizing messages? - **Deleting transcripts:** Completely removes the entire transcript file for all tickets. This requires server ownership. - **Anonymizing messages:** Replaces your messages with anonymized text while keeping the transcript intact. This does not require server ownership. -**Can I request an export of my data before deletion?** +### Can I request an export of my data before deletion? -Currently, data export is not available through the bot. Please contact support via the support server for data export requests. +Currently, data export is not available through the bot. Please contact support via the [support server](https://discord.gg/ticketsbot) for data export requests. -**Does message anonymization affect other users' ability to see the transcript?** +### Does message anonymization affect other users' ability to see the transcript? No, only your messages are anonymized. The transcript remains visible to others, but your messages and username will be replaced. -**What if I accidentally request deletion of the wrong data?** +### What if I accidentally request deletion of the wrong data? Unfortunately, there is no undo function. Deleted data and anonymized messages cannot be recovered. Always double-check your request before confirming. -**What happens if the GDPR worker is offline?** +### What happens if the GDPR worker is offline? If the GDPR processing service is temporarily unavailable, you'll see an error message and won't be able to submit requests. Try again in a few minutes, or contact support if the issue persists. -**Do I need to stay in the support server or keep my DMs open?** +### Do I need to stay in the support server or keep my DMs open? No, once your request is queued, it will continue processing even if you close your DMs or are offline. You'll receive the completion notification when you next open your DMs with the bot. @@ -274,10 +282,10 @@ No, once your request is queued, it will continue processing even if you close y Learn more about GDPR and your data protection rights: -- [What is GDPR?](https://gdpr.eu/what-is-gdpr/) -- [Right to Erasure](https://gdpr-info.eu/art-17-gdpr/) -- [Right of Access](https://gdpr-info.eu/art-15-gdpr/) +- [What is GDPR?](https://gdpr.eu/what-is-gdpr) +- [Right to Erasure](https://gdpr-info.eu/art-17-gdpr) +- [Right of Access](https://gdpr-info.eu/art-15-gdpr) ## Need Help? -If you have questions about GDPR requests or need assistance with data protection matters, please open a support ticket in the [Tickets Support Server](https://discord.gg/ticketsbot). +If you have questions about GDPR requests or need assistance with data protection matters, please open a support ticket in the [Tickets support server](https://discord.gg/ticketsbot). diff --git a/docs/src/en/commands/introduction.md b/docs/src/en/commands/introduction.md new file mode 100644 index 0000000..f42387d --- /dev/null +++ b/docs/src/en/commands/introduction.md @@ -0,0 +1,14 @@ +# Commands + +Tickets is configured mainly through the [web dashboard](/dashboard/introduction), but a set of slash commands covers the things you do from inside Discord: granting staff access, managing an open ticket, and changing server-wide settings without leaving the channel. + +Run `/help` in your server for the in-Discord list, or use the pages below for the commands that need more explanation than a single line. + +## Pages in This Chapter + +| Page | What it covers | +| ---- | -------------- | +| [List of Commands](/commands/list-of-commands) | Complete reference of every slash command, grouped by general, ticket, and administrative use | +| [Add Admin / Support](/commands/add-admin-support) | The difference between `/addadmin` and `/addsupport`, and what access each one grants | +| [Close Requests](/commands/close-requests) | Using `/closerequest` to ask the ticket opener to confirm a close, with an optional auto-close delay | +| [GDPR Data Request](/commands/gdpr) | Requesting transcript deletion or message anonymisation with `/gdpr` in DMs with the bot | diff --git a/docs/src/en/commands/list-of-commands.md b/docs/src/en/commands/list-of-commands.md new file mode 100644 index 0000000..1839cbf --- /dev/null +++ b/docs/src/en/commands/list-of-commands.md @@ -0,0 +1,61 @@ +# List of Commands + +| General Commands | Description | +| ---------------- | ----------- | +| `/about` | Information about the bot. | +| `/gdpr (lang)` | Request deletion or anonymization of your data under GDPR. [Learn more.](./gdpr) | +| `/help` | Displays a list of commands. | +| `/invite` | Provides an invite link for the bot. | +| `/jumptotop` | Displays a button to click and will automatically scroll to the top of the ticket. | +| `/vote` | Gives a link to vote for free premium benefits. | + +| Ticket Commands | Description | +| --------------- | ----------- | +| `/add (user_or_role)` | Add a user or role to an existing ticket. | +| `/claim` | Assigns a single staff member to the current ticket. | +| `/close (reason)` | Closes the current ticket. | +| `/closerequest (close_delay) (reason)` | Sends a message asking the ticket opener to approve or deny closing of the ticket. [Learn more.](../features/close-requests) | +| `/edit` | Edits settings for the current ticket, such as its labels. | +| `/on-call` | Toggles whether the user of command will be added and pinged to all new thread mode tickets. | +| `/open (panel)` | Opens a new ticket. | +| `/remove (user_or_role)` | Removes a user or role from the current ticket. | +| `/rename (name)` | Renames the current ticket. | +| `/reopen (ticket_id)` | Reopens a thread ticket that was previously closed. | +| `/switchpanel (panel)` | Switches the current ticket to another ticket panel - changing the channel category, support teams, etc. | +| `/transfer (user)` | Transfers a claimed ticket to another user. | +| `/unclaim` | Removes the claim on the current ticket. | +| `/notes` | Creates a private thread for staff to talk in, only works in channel mode. | +| `Start Ticket` (message command) | Right-click a message β†’ `Apps` β†’ `Start Ticket` to open a ticket seeded from that message. | + +| Setting Commands | Description | +| ---------------- | ----------- | +| `/addadmin (user_or_role)` | Grants a user or role admin privileges of the bot. [Learn more.](./add-admin-support#add-admin) | +| `/addsupport (role)` | Adds a role as a support representative. [Learn more.](./add-admin-support#add-support) | +| `/autoclose configure` | Edit autoclose related settings. | +| `/autoclose exclude` | Excludes the current ticket from being automatically closed. | +| `/blacklist (user_or_role)` | Toggles whether users are allowed to interact with the bot. | +| `/language` | Changes the language the bot messages are displayed in. | +| `/panel` | Provides a link to create a ticket panel for users to open tickets. | +| `/premium` | Activates premium benefits after purchasing (choose patreon on select menu). | +| `/removeadmin (user_or_role)` | Revokes a user's or role's admin privileges. | +| `/removesupport (user_or_role)` | Revokes a role's support representative privileges. | +| `/setup` | Runs a basic automatic setup - creates support and admin roles, a transcripts channel, and a ticket category. | +| `/viewstaff` | Lists the staff members and roles (admin or support). | + +| Tag Commands | Description | +| ------------ | ----------- | +| `/managetags add (id) (content)` | Adds a new tag. | +| `/managetags delete (id)` | Deletes a tag. | +| `/managetags list` | Lists all existing tags. | +| `/tag (id)` | Sends a message snippet. | + +| Statistics Commands | Description | +| ------------------- | ----------- | +| `/stats user (user)` | Displays statistics about the selected user. | +| `/stats server` | Displays statistics about the server. | + +| Knowledge Base Commands | Description | +| ----------------------- | ----------- | +| `/kb search (query)` | Search knowledge base articles by keyword. [Learn more.](../dashboard/knowledge-base) | +| `/kb browse (category)` | Browse knowledge base articles by category. | +| `/kb send (article)` | Sends a knowledge base article as a message in the current channel. | diff --git a/docs/src/en/dashboard/analytics.md b/docs/src/en/dashboard/analytics.md new file mode 100644 index 0000000..7f9fe63 --- /dev/null +++ b/docs/src/en/dashboard/analytics.md @@ -0,0 +1,153 @@ +# Analytics + +::: tip Premium Feature +Analytics is available to servers with a [Premium](../premium/introduction) subscription. Servers without Premium see a preview of the available metrics with a link to upgrade. +::: + +The Analytics page gives you detailed insight into your server's ticket activity, staff performance, and user feedback over time. You can adjust the time range, explore charts and breakdowns, and export data for offline analysis. + +![Analytics page](../../img/dashboard/analytics/analytics-full.webp) + +## Time Range + +A row of buttons at the top lets you filter most of the page by time range. The available options are **7d**, **30d**, **90d**, **1y**, and **All**. The default is 30d. The two all-time stat cards (Total Tickets and Open Tickets) are not affected by this selector. + +## Stat Cards + +### All-Time Stats + +Two cards are always visible, regardless of the time range: + +| Card | Description | +|------|-------------| +| **Total Tickets** | The total number of tickets ever created. | +| **Open Tickets** | The number of tickets currently open. | + +### Time-Filtered Stats + +Six additional cards update when you change the time range: + +| Card | Description | +|------|-------------| +| **Avg First Response** | The average time until a staff member first replies. | +| **Avg Rating** | The average star rating from user feedback (out of 5). Shows the number of responses underneath. | +| **Feedback Rate** | The percentage of closed tickets that received a rating, shown as rated tickets out of total closed tickets. | +| **Auto-closed** | The number of tickets closed automatically, with the percentage of total closures. | +| **One-Touch Resolution** | The percentage of tickets resolved with a single staff reply. | +| **Avg Messages/Ticket** | The average total messages per ticket, with a staff and user breakdown underneath. | + +![Stat cards](../../img/dashboard/analytics/stat-cards.webp) + +## Charts + +### Ticket Volume + +An area chart showing the number of tickets created per day over the selected time range. Hover over any point to see the exact date and count. + +### Backlog Trend + +An area chart showing the number of open tickets at the end of each day. This helps you spot whether your queue is growing or shrinking over time. + +### Peak Hours + +A heatmap displaying ticket creation volume by day of the week and hour of the day. All times are shown in UTC. Darker cells indicate higher volume. Hover over a cell to see the exact day, hour, and ticket count. + +![Peak hours](../../img/dashboard/analytics/peak-hours.webp) + +### Ticket Source + +A horizontal bar chart showing how tickets were created. The possible sources are: + +| Source | Meaning | +|--------|---------| +| **Panel** | The user clicked a button on a [ticket panel](./ticket-panels). | +| **Command** | The user ran the `/open` or `/new` command. | +| **Unknown** | The creation method was not recorded. | + +### Response Time by Hour + +A bar chart showing the average first response time broken down by hour of the day (UTC). This helps you identify when your team responds fastest and when gaps exist. + +## Additional Breakdowns + +### Resolution Time + +Shows the average time from ticket creation to closure, split into three windows: **Weekly**, **Monthly**, and **All Time**. + +### Top Close Reasons + +A horizontal bar chart of the most common close reasons used when tickets are closed. If no close reasons have been recorded, a message is shown instead. + +### Tickets by Panel + +A horizontal bar chart showing how many tickets were created from each [panel](./ticket-panels) in the selected time range. + +### Tickets by Label + +A horizontal bar chart showing the number of tickets assigned to each [label](./tickets#labels). Each bar uses the label's colour. + +### Feedback Distribution + +A bar chart showing how many ratings were given for each star value (1 through 5). See [User Feedback](./settings/user-feedback) for information on enabling ratings. + +### Ticket Breakdown + +Two summary rows: + +- **Thread vs Channel** shows the split between tickets opened as Discord threads and tickets opened as separate channels. +- **Auto-close vs Manual** shows how many tickets were closed automatically versus manually by a staff member or the user. + +## Staff Performance + +::: tip Admin Only +The staff performance table is visible only to server administrators. +::: + +A table at the bottom of the page lists each staff member who was active during the selected time range. The default columns are: + +| Column | Description | +|--------|-------------| +| **Staff Member** | The staff member's Discord username, linked to their [detail page](#staff-detail-page). | +| **Tickets Answered** | The number of tickets where this staff member sent at least one message. | +| **Tickets Claimed** | The number of tickets this staff member claimed. | +| **Avg Rating** | The average rating received on tickets this staff member handled. | + +A **Ratings** column always displays alongside the selected columns, showing the total number of feedback responses received. + +You can show or hide columns using the column selector button in the top-right corner of the table. + +![Staff table](../../img/dashboard/analytics/staff-table.webp) + +### Staff Detail Page + +Clicking a staff member's name opens a detail page with that individual's analytics. This page includes: + +- **Stat cards**: Avg Rating, Avg First Response, Tickets Claimed (with a "this month" count), and Open Tickets currently claimed. +- **First Response Time**: A breakdown by Weekly, Monthly, and All Time. +- **Tickets Claimed** and **Tickets Answered**: Each shown as Weekly, Monthly, and All Time. The Tickets Answered row also shows the server's total for comparison. +- **Feedback Distribution**: A bar chart of this staff member's star ratings (1 through 5). + +You can export the staff member's data using the export button at the top right. + + +## Exporting Analytics + +Both the main analytics page and the staff detail page have an **Export** button. Clicking it opens a modal where you can choose which sections to include and the file format. + +The available formats are **CSV** and **JSON**. The exported file includes a timestamp and guild identifier. + +On the main analytics page, the sections available for export are: + +- Summary statistics +- Ticket volume +- Backlog trend +- Peak hours +- Ticket source +- Response time by hour +- Resolution time +- Top close reasons +- Tickets by panel +- Tickets by label +- Feedback distribution +- Ticket breakdown +- Staff performance (admin only) diff --git a/docs/src/en/dashboard/audit-log.md b/docs/src/en/dashboard/audit-log.md new file mode 100644 index 0000000..cd902a9 --- /dev/null +++ b/docs/src/en/dashboard/audit-log.md @@ -0,0 +1,58 @@ +# Audit Log + +The Audit Log records every change made through the dashboard by your staff. Use it to track who changed what and when, and to review exactly what was modified. + +![Audit log page](../../img/dashboard/audit-log/audit-log-full.webp) + +## Filters + +The filter card at the top of the page lets you narrow down the entries shown. All filters are applied together. Filters update the results automatically as you type or select values. + +| Filter | Description | +|--------|-------------| +| **User ID** | Show only entries from a specific user. Enter a Discord user ID. | +| **Action Type** | Filter by the type of action performed (e.g. Panel Create, Settings Update). Select from the dropdown, or choose "All Actions" to clear. | +| **Resource Type** | Filter by the type of resource affected (e.g. Panel, Tag, Team). Select from the dropdown, or choose "All Resources" to clear. | +| **Date From** | Show only entries on or after this date. | +| **Date To** | Show only entries on or before this date. | + +## Audit Log Table + +Below the filters, the audit log entries are displayed in a paginated table. The total number of matching entries is shown in the header. You can show or hide columns using the column selector. + +The default columns are: + +| Column | Description | +|--------|-------------| +| **Timestamp** | When the action was performed. | +| **User** | The Discord username of the staff member who performed the action. | +| **Action** | The specific action taken (e.g. "Panel Update", "Tag Create", "Ticket Close"). | +| **Resource** | The type of resource that was affected (e.g. "Panel", "Tag", "Ticket"). | + +### Action Types + +The audit log tracks a wide range of actions across your server. Some common examples include: + +- **Settings Update** for changes to server-wide settings +- **Panel Create**, **Panel Update**, **Panel Delete**, **Panel Resend** for ticket panel changes +- **Multi-Panel Create**, **Multi-Panel Update**, **Multi-Panel Delete** for multi-panel changes +- **Form Create**, **Form Update**, **Form Delete** for opening form changes +- **Tag Create**, **Tag Delete** for tag changes +- **Team Create**, **Team Update**, **Team Delete**, **Team Member Add**, **Team Member Remove** for staff team changes +- **Blacklist Add**, **Blacklist Remove User**, **Blacklist Remove Role** for blacklist changes +- **Ticket Send Message**, **Ticket Close**, **Ticket Close Request** for ticket actions taken from the dashboard +- **Ticket Label Create**, **Ticket Label Delete**, **Ticket Label Assign** for label management + +### Viewing Changes + +If an entry recorded what changed (old and new values), a chevron icon appears on the right side of the row. Click the row to expand it and see the diff. + +The diff view highlights which fields were added, removed, or modified. For structured data such as panel settings or form inputs, each changed field is shown alongside its previous and new value. + +If the entry includes metadata (additional context about the action), it is displayed below the diff in a formatted block. + +![Audit log diff](../../img/dashboard/audit-log/audit-log-diff.webp) + +## Pagination + +Results are paginated. Use the page controls at the bottom of the table to navigate between pages. diff --git a/docs/src/en/dashboard/blacklist.md b/docs/src/en/dashboard/blacklist.md new file mode 100644 index 0000000..3d2ff25 --- /dev/null +++ b/docs/src/en/dashboard/blacklist.md @@ -0,0 +1,47 @@ +# Blacklist + +--- + +The blacklist prevents specific users or roles from opening tickets in your server. Blacklisted users and roles see an error when they attempt to create a ticket. + +## Blacklist Page + +Navigate to **Dashboard** > your server > **Blacklist** (in the Moderation sidebar group). + +The page has three sections: action buttons at the top, followed by the **Blacklisted Roles** table and the **Blacklisted Users** table. + +![Blacklist page](../../img/dashboard/blacklist/blacklist-page.webp) + +## Blacklisting a User + +Click the **Blacklist User** button to open a modal with a user search field. Start typing a username to search for server members, then select the user you want to blacklist and click **Confirm**. + +You can also enter a user ID directly if you know it (useful for users who have left the server). The search field accepts raw user IDs as well as usernames. + +Once confirmed, the user appears in the **Blacklisted Users** table, showing their username and ID. + +![Blacklist user modal](../../img/dashboard/blacklist/blacklist-user-modal.webp) + +## Blacklisting a Role + +Click the **Blacklist Role** button to open a modal with a role selector dropdown listing all roles in your Discord server. Select the role you want to blacklist and click **Confirm**. + +Once confirmed, the role appears in the **Blacklisted Roles** table. + +## Removing from the Blacklist + +To restore a user or role's ability to open tickets, open the action menu in the corresponding table row and click **Remove**. A confirmation dialog appears before the entry is removed. + +## Blacklisted Users Table + +Shows all blacklisted users with their username and user ID. If the username cannot be resolved (for example, the user has left the server), the entry displays as "Unknown" with the user ID. + +The table paginates when there are many entries, with page controls at the bottom. + +## Blacklisted Roles Table + +Shows all blacklisted roles by name. If a role has been deleted from Discord, it displays as "Unknown" with the role ID. + +## Using the /blacklist Command + +Users can also be blacklisted via the `/blacklist` command in Discord. See the [commands list](/commands/list-of-commands) for usage details. Entries added via the command appear in the dashboard, and entries added via the dashboard work in Discord, as both manage the same underlying blacklist. diff --git a/docs/src/en/dashboard/forms.md b/docs/src/en/dashboard/forms.md new file mode 100644 index 0000000..f3497af --- /dev/null +++ b/docs/src/en/dashboard/forms.md @@ -0,0 +1,111 @@ +# Forms + +--- + +Forms let you collect structured information from users when they open a ticket. Each form contains up to five fields with a variety of input types, from free text to dropdown selects and checkboxes. + +To use a form, create it in the dashboard, add fields, then assign it to a [ticket panel](/dashboard/ticket-panels). A single form can be assigned to multiple panels. + +## Forms List + +Navigate to **Dashboard** > your server > **Forms** (in the Setup sidebar group). + +The main page shows a table of all your forms with two columns: **Form Title** and **Fields** (the number of fields on that form). Each row has an action menu with the following options: + +- **Edit** opens the form editor +- **Clone** duplicates the form (see [Cloning a Form](#cloning-a-form)) +- **Publish to Gallery** submits the form to the public gallery for other servers to import +- **Remove** deletes the form after a confirmation prompt + +![Forms list](../../img/dashboard/forms/forms-list.webp) + +Click **Create Form** to start building a new form. + +## Creating a Form + +1. Click **Create Form** on the forms list page. +2. Enter a title for your form in the **Form Title** field and click **Create**. +3. You are redirected to the form editor where you can add fields. + +![Create form](../../img/dashboard/forms/create-form.webp) + +## Form Editor + +The editor page shows the form title at the top (with a **Rename Form** button) and the list of fields below. Click **New Field** to add a field, or use the arrow and delete buttons on each field to reorder or remove them. + +### Field Limit + +Each form supports a maximum of **5 fields**. Once you reach five, the "New Field" button is replaced by a message confirming the limit has been reached. + +![Form editor](../../img/dashboard/forms/form-editor.webp) + +### Field Settings + +Every field has the following settings: + +| Setting | Description | +| ------- | ----------- | +| **Label** | The question or prompt shown to the user. Required, maximum 45 characters. | +| **Placeholder** | Hint text shown inside the input before the user types (for text inputs). | +| **Description** | Optional helper text displayed below the label, maximum 100 characters. | +| **Type** | The kind of input. See [Field Types](#field-types) below. | +| **Style** | For Text Input fields only: Single-line or Multi-line. | +| **Required** | Whether the user must fill in this field before submitting. | +| **Length Range / Items Range** | Minimum and maximum character count (for text) or selection count (for select types). | + +Fields can be reordered using the up and down arrow buttons, and deleted using the bin button. + +### Field Types + +| Type | Description | +| ---- | ----------- | +| **Text Input** | Free text entry. Choose between Single-line and Multi-line style. Maximum 4,000 characters. | +| **String Select** | A dropdown menu where the user picks from a list of options you define (up to 25). Supports [API-based options](/features/api-form-inputs). | +| **User Select** | A dropdown that lists server members for the user to select. | +| **Role Select** | A dropdown that lists server roles for the user to select. | +| **Mentionable Select** | A dropdown that lists both users and roles for the user to select. | +| **Channel Select** | A dropdown that lists server channels for the user to select. | +| **Radio Group** | A set of radio buttons where the user picks exactly one option (2 to 10 options). | +| **Checkbox Group** | A set of checkboxes where the user can select multiple options (1 to 10 options). | + +### Options for Select, Radio, and Checkbox Types + +For **String Select**, **Radio Group**, and **Checkbox Group** fields, you define the options manually. Each option has: + +- **Label** (required): the text displayed to the user +- **Value** (required): the value submitted when the option is selected +- **Description** (optional): additional text shown below the label + +Options can be reordered, edited, and removed individually. String Select fields support up to 25 options; Radio Group and Checkbox Group fields support up to 10 each. + +:::info Minimum Option Counts +Radio Group requires at least 2 options, since a single radio button would serve no purpose. String Select and Checkbox Group require at least 1 option. +::: + +### API-Based Options for String Select + +String Select fields can fetch their options dynamically from an external API instead of using a fixed list. Toggle **API Config** next to the Required toggle to reveal the API configuration. See the [API-based form inputs](/features/api-form-inputs) guide for full setup instructions. + +## Saving Changes + +After adding or editing fields, click **Save Changes** at the bottom of the page. The button is disabled if any field has validation errors (missing label, blank options, duplicate values, or an incomplete or invalid API configuration). + +## Cloning a Form + +On the forms list page, open the action menu for any form and click **Clone**. This creates a new form titled ` (Copy)` with all of the original form's fields copied over, including labels, placeholders, types, options, and settings. You are taken to the editor for the new form, where you can rename it and adjust fields as needed. + +## Deleting a Form + +On the forms list page, open the action menu and click **Remove**. A confirmation dialog appears asking you to confirm. Deletion is permanent. + +On the editor page, you can also delete the current form using the **Delete Form** button. + +## Assigning a Form to a Panel + +Once your form is saved, head to [Ticket Panels](/dashboard/ticket-panels) and create or edit a panel. In the panel settings, select your form from the **Form** dropdown. Save the panel, and the form will be shown to users when they click the panel button. + +When using [multi-panels](/dashboard/multi-panels), the form shown to the user is the one assigned to the specific panel button or dropdown item they interact with. + +## Publishing to Gallery + +You can share your form with other Tickets users by publishing it to the gallery. Open the action menu for a form on the list page and click **Publish to Gallery**. Other server admins can then import your form directly from the gallery. diff --git a/docs/src/en/dashboard/introduction.md b/docs/src/en/dashboard/introduction.md new file mode 100644 index 0000000..96bc5df --- /dev/null +++ b/docs/src/en/dashboard/introduction.md @@ -0,0 +1,94 @@ +# Dashboard + +The Tickets web dashboard is your central hub for managing your Discord ticket system. From here you can configure settings, create ticket panels, manage staff teams, view transcripts, and more. + +## Logging In + +Visit [dashboard.tickets.bot](https://dashboard.tickets.bot) and click **Log in with Discord**. You will be redirected to Discord's authorisation page. Click **Authorise** to grant the dashboard access to your Discord account, then you will be returned to the dashboard. + + +## Servers Page + +After logging in you land on the **Servers** page. This page lists every Discord server you are a member of, separated into three groups: + +- **Premium Servers** - servers with an active premium subscription +- **Free Servers** - servers where you have admin or support access but no premium subscription +- **Other Servers** - servers you belong to but have no management access to + +You can switch between **Card view** and **Icon view** using the toggle buttons at the top. A search bar lets you filter servers by name or ID, and the **Refresh list** button reloads your server list from Discord. + +Click on a server to open its management dashboard. + +![Servers](../../img/dashboard/introduction/servers.webp) + +## Sidebar Navigation + +Once you select a server, the sidebar shows the server's name and icon at the top, followed by navigation links organised into groups. + +### Navigation Groups + +The sidebar is divided into the following sections: + +| Group | Pages | Description | +| ----- | ----- | ----------- | +| (Top-level) | [Overview](/dashboard/overview) | Server dashboard with ticket statistics | +| **Tickets** | [Tickets](/dashboard/tickets), [Transcripts](/dashboard/transcripts), [Analytics](/dashboard/analytics) | View open tickets, closed ticket transcripts, and performance analytics | +| **Setup** | [Settings](/dashboard/settings/settings), [Panels](/dashboard/ticket-panels), [Forms](/dashboard/forms), [Integrations](/integrations/introduction) | Configure server settings, ticket panels, forms, and third-party integrations | +| **Content** | [Knowledge Base](/dashboard/knowledge-base), [Tags](/dashboard/tags) | Manage knowledge base articles and quick-reply tags | +| **Moderation** | [Staff Teams](/dashboard/staff-teams), [Blacklist](/dashboard/blacklist), [Audit Log](/dashboard/audit-log) | Manage support teams, blocked users, and review a log of dashboard changes | + +### Permission Levels + +Not all sidebar items are visible to every user. Visibility depends on your permission level for that server: + +| Level | Label | What You See | +| ----- | ----- | ------------ | +| 2 | Bot Admin | All sidebar items | +| 1 | Support Rep | Overview, Tickets, Transcripts, Analytics, and Blacklist | + +Bot Admins are users added via the `/addadmin` command or the server owner. Support Reps are members of a staff team or users with the support role. If you cannot see a page you expect to have access to, check with your server administrator. + +### Sidebar Footer + +Below the navigation links, the sidebar footer contains: + +- **Notifications** - a bell icon that links to the [Notifications](/dashboard/notifications) page. When you have unread notifications, a blue dot and count badge appear on the bell. +- **Account menu** - your Discord avatar and username. Click it to expand a menu with **Settings** (opens [User Settings](/dashboard/settings)) and **Log out**. + +The sidebar can be collapsed to icon-only mode by clicking the collapse button at the top. On mobile, it opens as a slide-out drawer via the hamburger menu. + +## Command Palette + +Press Ctrl+K (or Cmd+K on macOS) to open the command palette. This is a quick-navigation overlay that lets you search for and jump to any page in the dashboard. Type a page name and press Enter to navigate. + +When you are viewing a server, the command palette also shows **Quick Actions** for admin users: + +- **Create Panel** - jump directly to the panel creation page +- **Create Form** - jump directly to the form creation page +- **Create Team** - jump to the staff teams page + +## Keyboard Shortcuts + +Press ? on any page to open the keyboard shortcuts modal. The following shortcuts are available when viewing a server: + +| Shortcut | Action | +| -------- | ------ | +| ? | Show keyboard shortcuts | +| Ctrl+K / Cmd+K | Open command palette | +| g then o | Go to Overview | +| g then t | Go to Tickets | +| g then a | Go to Analytics | +| g then r | Go to Transcripts | +| g then p | Go to Panels (admin only) | +| g then s | Go to Settings (admin only) | + +Keyboard shortcuts are disabled when you are typing in a text input, text area, or select field. + +## Global Pages + +Outside of server management, the sidebar shows links to global pages: + +- **Servers** - return to the server list +- **Gallery** - browse community-submitted panel templates +- **Premium** - view pricing, manage your subscription, and configure your whitelabel bot +- **Affiliate** - apply for the affiliate programme and track referrals diff --git a/docs/src/en/dashboard/knowledge-base.md b/docs/src/en/dashboard/knowledge-base.md new file mode 100644 index 0000000..0db1437 --- /dev/null +++ b/docs/src/en/dashboard/knowledge-base.md @@ -0,0 +1,204 @@ +# Knowledge Base + +The Knowledge Base lets you create help articles that users can browse before opening a ticket. Articles can be searched in Discord using slash commands, automatically suggested when users open tickets, and viewed on a public web page. + +## Overview + +The Knowledge Base system has three parts: + +1. **Dashboard management**: create, edit, and organise articles from the web dashboard +2. **Discord commands**: users can search and browse articles with `/kb`, staff can send articles into tickets with `/kb send` +3. **Public web page**: a shareable URL where anyone can browse your knowledge base + +## Managing Articles + +Navigate to **Dashboard** > your server > **Knowledge Base** (in the Content sidebar group). + +The top of the page shows an article count and two buttons: **Go to Knowledge Base** (opens your public KB page) and **Create Article**. + +![Knowledge Base list](../../img/dashboard/kb/kb-list.webp) + +### Creating an Article + +1. Click **Create Article** +2. Fill in the **Title** (required, maximum 100 characters) +3. Write your **Content** using the markdown editor (maximum 4,096 characters). The editor supports headings, bold, italic, strikethrough, lists, blockquotes, code blocks, links, and horizontal rules. A live preview is shown to the right. +4. Select **Categories** to organise the article (optional) +5. Add **Keywords** to help users find the article through search. Separate keywords with commas or press Enter. Keywords are shown as removable badges. +6. Toggle **Published** to control whether the article is visible to users +7. Optionally toggle **Use Embed** to attach a Discord embed to the article (see below) +8. Click **Create Article** to save + +![Create article](../../img/dashboard/kb/create-article.webp) + +:::tip Add a Custom Embed +You can also add a custom Discord embed to your article, similar to how embeds work on [Tags](/dashboard/tags). This is useful for visually rich responses when articles are sent into tickets. + +[Placeholders](/miscellaneous/placeholders) in the embed are filled in when the article reaches a ticket through a linked tag. +::: + +### Editing an Article + +Click the **Edit** action on any article in the table. The edit page shows the same form as creation, pre-populated with the article's current content. Click **Save Changes** when done. + +### Article Table + +The article table shows all your articles with sortable, filterable columns: + +- **Title**: click the filter icon to search by title, or sort alphabetically, by position, or by last updated +- **Categories**: filter by one or more categories using the checkbox dropdown +- **Keywords**: search across keyword values +- **Status**: filter by Published, Draft, or All + +You can choose which columns to display using the column selector button above the table. + +The table paginates at 20 articles per page. Use the page controls at the bottom to navigate. + +### Drafts + +Articles can be saved as **Draft** by toggling the Published switch off. Draft articles: + +- Are visible to admins in the web dashboard +- Do **not** appear in Discord search results +- Do **not** appear on the public knowledge base page +- Can be published at any time by editing and toggling Published on + +## Categories + +Categories help organise articles into groups. Users can browse articles by category both in Discord and on the web page. + +### Managing Categories + +1. Open the **Categories** collapsible section on the Knowledge Base page +2. Type a category name and click **Add** +3. Existing categories are listed below, each with a delete button +4. Deleting a category removes the association but does not delete articles + +You can filter the article table by category to see which articles belong to each group. + +## Customisation + +The Customisation section lets you control the look of your public knowledge base page. Open the **Customisation** collapsible section on the Knowledge Base page. + +:::warning Premium Required +Customisation settings require Premium. Without Premium, the settings are shown but locked behind a "View Premium Plans" prompt. +::: + +### Colour Scheme + +Four colour pickers control the public KB page appearance: + +| Setting | Default | Description | +| ------- | ------- | ----------- | +| **Primary Background** | `#111827` | The main page background colour | +| **Card Background** | `#1F2937` | The background colour for article cards | +| **Text Colour** | `#FFFFFF` | The primary text colour | +| **Accent Colour** | `#3B82F6` | The colour used for links and interactive elements | + +The dashboard checks colour contrast and shows a warning if your text or accent colour does not meet WCAG accessibility guidelines against the selected backgrounds. + +Click **Reset colours to defaults** to restore the original colour scheme. + +### Logo + +Enter a **Logo URL** to display your own logo on the public knowledge base page. The image should be square, at least 128x128 pixels, and served over HTTPS. A preview thumbnail appears next to the input. + +### Branding + +Toggle **Hide 'Powered by Tickets' footer** to remove the Tickets branding from the bottom of your public knowledge base page. + +Click **Save Customisation** at the bottom of the section to apply all changes. + +![Customisation](../../img/dashboard/kb/customisation.webp) + +## Discord Commands + +### `/kb search ` + +Search for articles by keyword. The bot returns matching articles as an ephemeral message (only visible to the person who ran the command). Supports autocomplete: start typing and matching article titles appear. + +### `/kb browse [category]` + +Browse articles by category. Without a category, shows all available categories. With a category selected, lists articles in that category. + +### `/kb send
` + +**Staff only.** Send a knowledge base article as a permanent message in the current channel. Useful for sharing articles with users during a ticket conversation. The article renders as a Discord embed with its full content. + +:::tip Autocomplete Is Supported +All `/kb` commands support autocomplete. Start typing an article name or category and matching suggestions will appear. +::: + +## Linking Tags to KB Articles + +Tags can be linked to Knowledge Base articles. When a linked tag is used via `/tag`, it renders the KB article's content instead of the tag's own content. This avoids duplicating content between tags and KB articles. + +### Setting Up a Linked Tag + +1. Go to **Dashboard** > **Tags** +2. Create or edit a tag +3. Toggle **Link to Knowledge Base article** +4. Select the article from the dropdown +5. Save the tag + +When the tag is invoked in Discord, the linked article's content (including any embed) is displayed. If the linked article is later deleted or unpublished, the tag falls back to its own content. + +:::tip Edit Once, Update Everywhere +This is great for keeping canned responses in sync with your knowledge base. Edit the KB article once, and all linked tags automatically use the updated content. +::: + +## Public Knowledge Base + +Your server's knowledge base is available at a public URL that anyone can visit without being in your Discord server: + +```text +https://kb.tickets.bot/kb/ +``` + +The public page features: + +- **Search**: full-text search across article titles, content, and keywords +- **Category browsing**: filter articles by category +- **Article pages**: each article has its own shareable URL +- **Related articles**: articles in the same category are shown as suggestions + +### Sharing Articles + +Each article has a shareable URL in the format: + +```text +https://kb.tickets.bot/kb// +``` + +You can share these links in Discord messages, on your website, or anywhere else. The article slug is automatically generated from the title. + +## Freemium Limits + +| Feature | Free | Premium | +| ------- | ---- | ------- | +| Articles | Up to 5 | Unlimited | +| Categories | Up to 3 | Unlimited | +| `/kb` commands | Yes | Yes | +| Public knowledge base | Yes | Yes | +| Tag to KB linking | Yes | Yes | +| Customisation (colours, logo, branding) | No | Yes | + +## Markdown Editor + +The article content editor supports rich text formatting through a toolbar: + +| Button | Format | Discord Support | +| ------ | ------ | --------------- | +| **B** | Bold | Yes | +| *I* | Italic | Yes | +| ~~S~~ | Strikethrough | Yes | +| `` | Inline code | Yes | +| H1/H2/H3 | Headings | Yes | +| Bullet list | Unordered list | Yes | +| Numbered list | Ordered list | Yes | +| Blockquote | Quote | Yes | +| Code block | Fenced code | Yes | +| Link | Hyperlink | Yes | +| Horizontal rule | Divider | Yes | + +Content is stored as Markdown, which renders natively in Discord messages and on the web knowledge base page. The editor shows a live preview of how the formatted content will appear. diff --git a/docs/src/en/dashboard/multi-panels.md b/docs/src/en/dashboard/multi-panels.md new file mode 100644 index 0000000..5f730e6 --- /dev/null +++ b/docs/src/en/dashboard/multi-panels.md @@ -0,0 +1,115 @@ +# Multi-Panels + +--- + +Multi-panels combine two or more ticket panels into a single embed message. Instead of posting each panel separately, you can present all of your ticket types in one place, either as a row of buttons or as a dropdown menu. + +You need at least two existing panels before you can create a multi-panel. If you have not created any panels yet, follow the [Panels](/dashboard/ticket-panels) guide first. + +## Creating a Multi-Panel + +Open the dashboard, select your server, and click **Panels** in the sidebar. The **Multi-Panels** section is on the right side of the page. Click **Create Multi-Panel** to open the editor. + +![Multi-panel create](../../img/dashboard/multipanels/multipanel-create.webp) + +The editor is divided into three sections described below. After configuring the multi-panel, click **Create Multi Panel** at the bottom of the page. + +## Editing a Multi-Panel + +From the Panels page, click the action menu on any multi-panel row and select **Edit**. The same editor opens with the multi-panel's current settings. After making changes, click **Save Changes**. + +To resend a multi-panel (for example, if the message was deleted in Discord), click **Resend** in the action menu. To delete a multi-panel, click **Remove**. Deleting the message in Discord does not remove the multi-panel from the dashboard; you can resend it at any time. + +## Ticket Settings + +Controls which panels are included and how they are presented. + +### Panel Channel + +The Discord text channel where the bot sends the multi-panel embed. This should be a channel accessible to all members. + +:::warning Use a Separate Channel +Do not use the same channel as your transcript channel. +::: + +### Panels + +Select the individual panels to include in this multi-panel. Each panel must already exist. You must select at least 2 and can include up to 15. + +### Use Dropdown Menu + +Toggle between two display modes: + +- **Enabled** - the panels appear as a dropdown select menu beneath the embed. Each panel must have a label (either its own button text or a custom label set in the Panel Customization section). +- **Disabled** - the panels appear as individual buttons beneath the embed. + +Click the info icon next to the toggle for a visual comparison of both modes. + +### Dropdown Placeholder Text + +Only available when the dropdown menu is enabled. Sets the placeholder text shown in the dropdown before the user makes a selection (e.g. "Select a category"). + +## Panel Customization (Optional) + +Override the appearance of individual panels within this multi-panel. Each panel you selected in the Ticket Settings section appears as a card with the following fields: + +### Custom Emoji + +Override the emoji shown on this panel's button (or in the dropdown). Leave empty to use the panel's default emoji. + +### Custom Label + +Override the text label shown on this panel's button (or in the dropdown). Leave empty to use the panel's default button text. + +:::warning Dropdown Mode Requires Labels +When using dropdown mode, every panel must have a label. If a panel has neither a custom label here nor a button text on the panel itself, the editor will show an error and prevent you from saving. +::: + +### Description + +Only available when dropdown mode is enabled. An optional short description shown beneath the panel's label in the dropdown menu. + +## Panel Settings + +Controls the appearance of the multi-panel embed itself. A live preview is shown on the right side of the editor. + +![Multi-panel settings](../../img/dashboard/multipanels/multipanel-settings.webp) + +### Title + +The bold text at the top of the embed. + +### Colour + +The accent colour on the left edge of the embed. Click the colour picker to choose a custom colour. + +### Description + +The main body text of the embed. Maximum length: 1,000 characters. + +### Author Settings + +An expandable sub-section with fields for: + +- **Author Name** - text displayed above the embed title. +- **Author Icon URL** - a small image displayed next to the author name. +- **Author URL** - a link that the author name points to when clicked. + +### Images + +An expandable sub-section with fields for: + +- **Thumbnail URL** - a small image shown to the right of the embed content. +- **Image URL** - a large image shown below the embed content. + +:::tip Image URLs +The URL should point directly to an image file. An easy way to get a suitable URL is to send the image as a message in a Discord channel, then right-click the image and choose **Copy Link**. +::: + +### Footer Settings + +An expandable sub-section with fields for: + +- **Footer Text** - text displayed at the bottom of the embed. +- **Footer Icon URL** - a small image displayed next to the footer text. +- **Footer Timestamp (Optional)** - a date and time displayed next to the footer. diff --git a/docs/src/en/dashboard/notifications.md b/docs/src/en/dashboard/notifications.md new file mode 100644 index 0000000..3951621 --- /dev/null +++ b/docs/src/en/dashboard/notifications.md @@ -0,0 +1,64 @@ +# Notifications + +The notifications system keeps you informed about important account activity, such as affiliate referrals and integration review outcomes. You can view notifications in the dashboard and configure how you receive them. + +## Accessing Notifications + +Click the **bell icon** in the sidebar footer to open the Notifications page. When you have unread notifications, a blue dot appears on the bell icon and a count badge shows the number of unread items. + + +## Viewing Notifications + +The Notifications page displays your notifications grouped by time period: **Today**, **Yesterday**, **This Week**, and **Earlier**. Only groups that contain notifications are shown. + +Each notification card displays: + +- A **category badge** (e.g. Affiliate, Integrations) colour-coded by type +- The notification **title** +- A **body** with additional detail +- A **timestamp** showing when the notification was created +- An **unread indicator** (a blue left border on unread items) + +Click on a notification to navigate to the relevant page and mark it as read automatically. + + +### Filtering by Category + +Use the tabs at the top of the Notifications page to filter by category: + +- **All** - shows every notification +- **Affiliate** - shows only affiliate-related notifications (referral activity, credit updates) + +### Managing Notifications + +- **Mark as read** - hover over an unread notification and click the tick icon to mark it as read without navigating away +- **Mark all as read** - click the **Mark all as read** button at the top right to clear all unread indicators at once + +### Pagination + +If you have many notifications, the list is paginated with 25 notifications per page. Use the pagination controls at the bottom to navigate between pages. + +## Notification Preferences + +You can control how and where you receive notifications from the [User Settings](/dashboard/settings) page. Three notification channels are available for each category: + +| Channel | Description | +| ------- | ----------- | +| **In-app** | Notifications appear in the dashboard via the bell icon | +| **Discord DM** | The bot sends you a direct message on Discord | +| **Email** | Sent to your verified email address | + +For full details on configuring notification preferences and adding an email address, see [User Settings](/dashboard/settings). + +## Notification Categories + +The following notification categories are available to all users: + +| Category | What You Are Notified About | +| -------- | --------------------------- | +| **Affiliate** | Referral activity, credit updates, and programme status changes | +| **Integrations** | Updates when your public integration request is approved, rejected, or unapproved | + +:::info Default Channel Settings +Each category can be independently toggled on or off for each notification channel. By default, In-app is enabled while Discord DM and Email are disabled. +::: diff --git a/docs/src/en/dashboard/overview.md b/docs/src/en/dashboard/overview.md new file mode 100644 index 0000000..2d13072 --- /dev/null +++ b/docs/src/en/dashboard/overview.md @@ -0,0 +1,42 @@ +# Overview + +The Overview page is the first thing you see after selecting a server in the dashboard. It provides a summary of your server's ticket activity and quick links to common actions. + +![Overview page](../../img/dashboard/overview/overview-full.webp) + +## Stat Cards + +At the top of the page, stat cards display key numbers at a glance. All servers see two cards: + +| Card | Description | +|------|-------------| +| **Open Tickets** | The number of tickets currently open in your server. | +| **Total Tickets** | The total number of tickets ever created in your server. | + +Premium servers see two additional cards: + +| Card | Description | +|------|-------------| +| **Avg First Response** | The average time until a staff member first replies, measured over the past 7 days. | +| **Active Panels** | The number of [ticket panels](./ticket-panels) currently configured in your server. | + +## Tickets This Week + +Below the stat cards, a chart shows your ticket volume over the past seven days. Each point represents the number of tickets created on that date. Hover over the chart to see the exact count for a given day. + +If no tickets were created during the period, a message is shown instead. + +![Tickets chart](../../img/dashboard/overview/tickets-chart.webp) + +## Quick Actions + +At the bottom of the page, Quick Actions cards provide shortcuts to the pages you are most likely to visit. The cards shown depend on your permission level and premium status: + +| Card | Description | Requires | +|------|-------------|----------| +| **View Tickets** | Opens the [Tickets](./tickets) page. | Support or Admin | +| **Manage Panels** | Opens the [Ticket Panels](./ticket-panels) page. | Admin | +| **View Analytics** | Opens the [Analytics](./analytics) page. | Premium | +| **Settings** | Opens the [Settings](./settings/settings) page. | Admin | + +![Quick actions](../../img/dashboard/overview/quick-actions.webp) diff --git a/docs/src/en/dashboard/panel-gallery.md b/docs/src/en/dashboard/panel-gallery.md new file mode 100644 index 0000000..c60ce31 --- /dev/null +++ b/docs/src/en/dashboard/panel-gallery.md @@ -0,0 +1,119 @@ +# Template Gallery + +--- + +The Template Gallery is a community-driven collection of pre-made templates. You can browse panels, tags, and forms shared by other server admins, import them into your own server, or publish your own designs for others to use. + +## Browsing the Gallery + +To open the gallery, click **Browse Gallery** on the [Panels](/dashboard/ticket-panels) page, or navigate to the gallery directly from the sidebar. + +![Gallery browse](../../img/dashboard/gallery/gallery-browse.webp) + +The gallery supports several ways to find templates: + +- **Search** - type in the search bar to filter templates by name. +- **Category** - narrow results by category (e.g. Support, Moderation, Applications). Select "All categories" to clear the filter. +- **Type** - filter by template type: Panels, Tags, or Forms. +- **Sort** - order results by **Popular** (most imported) or **Newest** (most recently published). +- **Clear** - click the clear button to reset all filters at once. + +Each gallery card shows the template's name, description, category, type, tags, and the number of times it has been imported. + +### Featured Templates + +On the first page, when no filters are active, a **Featured Templates** section highlights curated templates at the top of the gallery. + +### Template Detail Page + +Click any gallery card to view the full detail page. This shows a larger preview of the template (panel embed, tag content, or form fields), the author's name, the date it was published, the import count, and the template's tags and category. + +![Gallery detail](../../img/dashboard/gallery/gallery-detail.webp) + +## Importing a Template + +To import a template into your server: + +1. Find a template you like and click **Import Panel**, **Import Tag**, or **Import Form** (the label matches the template type). +2. Select the server you would like to import it into. +3. For panels, you can optionally choose a **channel** for the panel and a **category** for new tickets. +4. Click **Import**. The template is created in your server. +5. For panels, you are redirected to the panel editor where you can customise server-specific settings such as support teams, forms, access control, and more. + +:::tip Imports Are Fully Editable +Importing a template gives you a fully editable copy. You are free to change any settings after import. +::: + +## Publishing a Template + +To share one of your templates with the community: + +1. Head to the appropriate page on the dashboard: + - **Panels**: go to the Panels page, click the action menu on a panel, and select **Publish to Gallery**. + - **Tags and Forms**: publishing is available from their respective pages in the same way. +2. Fill in the required details in the submission modal: + - **Name** - a clear, descriptive title for your template (up to 100 characters). + - **Description** - a short summary of what the template is designed for (up to 500 characters). + - **Category** - choose the most relevant category (see [Categories](#categories) below). + - **Tags** (optional) - add up to 3 tags to help others find your template. +3. Click **Submit for Review**. + +:::warning Submission Requirements +Please ensure your template has a descriptive title, meaningful content, and no server-specific references. Custom Discord emojis are not supported in gallery submissions; use standard Unicode emojis instead. +::: + +## Submission Review + +After you submit a template to the gallery, it enters a review queue. Submissions are typically reviewed within 48 hours. + +You can check the status of your submissions on the **Panels** page in the **Gallery Submissions** section. Each submission shows one of three statuses: + +| Status | Meaning | +|---|---| +| Pending | Awaiting review | +| Approved | Published and visible in the gallery | +| Rejected | Not accepted; a reason is provided so you can make changes and resubmit | + +## Managing Your Submissions + +From the Gallery Submissions section on the Panels page, you can: + +- **Edit** a submission to update its name, description, category, or tags. If the source template has changed, editing will also re-submit the latest version for review. +- **Withdraw** a pending submission to cancel it before it is reviewed. +- **Unpublish** an approved submission to remove it from the gallery. Servers that have already imported it keep their copy. + +## Categories + +When publishing a template, choose from the following categories: + +| Category | Description | +|---|---| +| Support | Customer support and help desks | +| Moderation | Ban appeals, reports, rule violations | +| Sales | Orders, purchases, commercial enquiries | +| Applications | Staff recruitment, team tryouts, sign-ups | +| Feedback | Suggestions, bug reports, feature requests | +| General | Other designs that do not fit the above | +| Other | Anything else | + +## What Gets Shared + +When you publish a panel to the gallery, only the panel's **visual design** is shared. This includes: + +- Panel title and content +- Embed colour +- Button style, text, and emoji +- Welcome message +- Image URLs + +Server-specific settings are **not** shared. The following are left for importers to configure themselves: + +- Panel channel and ticket category +- Support teams +- Forms +- Access control rules +- Mention on open settings +- Naming scheme +- Support hours + +This means your server's private configuration stays private. Only the look and feel of the template is published. diff --git a/docs/src/en/dashboard/settings.md b/docs/src/en/dashboard/settings.md new file mode 100644 index 0000000..053bb99 --- /dev/null +++ b/docs/src/en/dashboard/settings.md @@ -0,0 +1,64 @@ +# User Settings + +The User Settings page is where you manage your email address and notification preferences. These settings apply to your account across all servers, they are not tied to any individual server. + +To access your settings, click on your avatar in the sidebar footer to open the account menu, then select **Settings**. + +![User settings](../../img/dashboard/settings/user-settings.webp) + +## Email Address + +You can optionally add an email address to your account. Your email is used for transactional notifications only, Tickets will never send you marketing emails. + +### Adding and Verifying Your Email + +1. Open the **Settings** page +2. Enter your email address and click **Add Email** +3. A **6-digit verification code** is sent to the address you provided +4. Enter the code on the Settings page and click **Verify** to complete verification + +::: tip Verify to Unlock Email Notifications +You must verify your email before any email notifications can be sent to it. Until verification is complete, the email notification channel remains unavailable. +::: + +::: warning Verification Code Expiry +The verification code expires after **15 minutes**. If it expires, you can request a new one by clicking **Resend code** on the Settings page. +::: + +### Changing or Removing Your Email + +- You can **change** your email address at any time by entering a new address and clicking **Update Email**. Changing it resets your verification status, and you will need to verify the new address before email notifications resume. +- You can **remove** your email entirely by clicking the delete button next to your email address. A confirmation prompt will appear before the address is removed. Removing your email disables all email notifications immediately. + +## Notification Preferences + +You can choose how you receive notifications for different event categories. Three notification channels are available: + +| Channel | Description | +| ------- | ----------- | +| **In-app** | Notifications appear in the web dashboard via the bell icon in the sidebar | +| **Discord DM** | The bot sends you a direct message on Discord | +| **Email** | Sent to your verified email address | + +By default, **In-app** is enabled while **Discord DM** and **Email** are disabled. You can toggle each channel on or off independently for every notification category. + +::: warning Discord DMs +For Discord DM notifications to work, your DMs must be open. The bot needs to be able to send you a direct message. If your privacy settings block DMs from server members, you will not receive these notifications. +::: + +### Notification Categories + +| Category | What You Are Notified About | +| -------- | --------------------------- | +| **Affiliate** | Referral activity, credit updates, and application status changes | +| **Integrations** | Updates when your public integration request is approved, rejected, or unapproved | + +Each row in the notification preferences table shows a category with its description, along with toggle switches for In-app, Discord DM, and Email. Toggle each channel on or off as needed, then click **Save Preferences** to apply your changes. + +::: tip Email Channel Warning +If you enable the Email channel for a category but have not yet added and verified an email address, a warning will appear next to the toggle reading "Needs verified email". You will not receive email notifications until your email is verified. +::: + +## Notifications + +Access your notifications by clicking the **bell icon** in the sidebar footer. A blue dot on the bell icon indicates you have unread notifications. For full details on the Notifications page, see [Notifications](/dashboard/notifications). diff --git a/docs/src/en/dashboard/settings/awaiting-user-response.md b/docs/src/en/dashboard/settings/awaiting-user-response.md new file mode 100644 index 0000000..c76ceae --- /dev/null +++ b/docs/src/en/dashboard/settings/awaiting-user-response.md @@ -0,0 +1,23 @@ +# Awaiting Response Category + +The awaiting response category automatically moves a ticket channel to a separate Discord category when the ticket is waiting for the user to reply. This helps staff quickly see which tickets need their attention and which are waiting on the user. + +:::info Channel Mode Only +This feature is channel mode only. Discord does not allow threads to be moved between categories. See the [mode comparison](/dashboard/settings/thread-mode#mode-comparison) for differences between the two modes. +::: + +:::tip Premium Feature +The awaiting response category requires [Premium](https://tickets.bot/premium). +::: + +## How It Works + +When a staff member sends a message in a ticket, the ticket is considered to be awaiting a response from the user. After a short delay, the ticket channel is moved to the configured awaiting response category. When the user replies, the channel is moved back to the panel's main ticket category. + +Due to Discord rate limits, a channel can only be updated twice every 10 minutes. The move happens approximately 10 minutes after the last staff response. + +## Configuration + +The awaiting response category is set per panel. Open any panel from the [Panels](/dashboard/ticket-panels) page, expand the **Routing** section, and select a Discord category in the **Awaiting Response Category** dropdown. + +![Panel editor awaiting](../../../img/dashboard/awaiting-response/panel-editor-awaiting.webp) diff --git a/docs/src/en/dashboard/settings/claiming-tickets.md b/docs/src/en/dashboard/settings/claiming-tickets.md new file mode 100644 index 0000000..4b3242a --- /dev/null +++ b/docs/src/en/dashboard/settings/claiming-tickets.md @@ -0,0 +1,50 @@ +# Claiming Tickets + +:::info Channel Mode Only +Claiming is only available in channel mode. In thread mode, staff members join tickets individually by clicking a button, which provides similar behaviour. See the [mode comparison](/dashboard/settings/thread-mode#mode-comparison) for details. +::: + +When a staff member claims a ticket, they take ownership of it. This keeps conversations focused by preventing multiple staff members from responding at the same time. Administrators with the Discord **Administrator** permission always have access to any claimed ticket. + +## Commands + +| Command | Description | +|---|---| +| `/claim` | Claim the current ticket for yourself. | +| `/transfer @user` | Transfer the claim to another staff member. | +| `/unclaim` | Release the claim on the current ticket. | + +## Dashboard Configuration + +Claiming settings are configured per panel. Open any panel from the [Panels](/dashboard/ticket-panels) page, expand the **Closing and Claiming** section, and look under the **Claiming** sub-heading. + +![Panel editor claiming](../../../img/dashboard/claiming/panel-editor-claiming.webp) + +The available settings are: + +| Setting | Description | +|---|---| +| **Hide Claim Button** | When enabled, the Claim button is not shown in tickets from this panel. Staff can still claim using the `/claim` command. | +| **Support Can View Claimed Tickets** | When enabled, other support staff can see a ticket that has been claimed by a different staff member. When disabled, only the claimer can see the ticket. | +| **Support Can Type in Claimed Tickets** | When enabled, other support staff can send messages in a claimed ticket. This option is only available when **Support Can View Claimed Tickets** is enabled. | + +These three settings combine to create common claiming configurations: + +- **Default**: all staff can see the ticket, but only the claimer can reply. +- **Full visibility**: all staff can see the ticket and all staff can reply (enable both "view" and "type"). +- **Private to claimer**: only the claimer can see the ticket (disable "view"). + +## Panel Switch Behaviour + +When a claimed ticket is switched to a different panel using `/switchpanel`, the claimer may not have access to the new panel's support team. The **Panel Switch Behaviour** setting in [Server Settings](/dashboard/settings/settings#panel-switch-behaviour) controls what happens in this scenario. + +| Option | Behaviour | +|---|---| +| **Auto Unclaim** | Automatically unclaim if the claimer has no access to the new panel. This is the default. | +| **Block Switch** | Prevent switching if the claimer has no access to the new panel. The ticket must be unclaimed first. | +| **Remove On Unclaim** | Allow the switch, but remove the claimer's access when they unclaim. | +| **Keep Access** | Allow the switch and keep the claimer's access even after unclaiming. | + +:::info When This Applies +This setting only applies when the claimer does not have access to the new panel. If the claimer has access to both panels, the ticket remains claimed and no special handling is needed. +::: diff --git a/docs/src/en/dashboard/settings/exit-survey.md b/docs/src/en/dashboard/settings/exit-survey.md new file mode 100644 index 0000000..17df1e1 --- /dev/null +++ b/docs/src/en/dashboard/settings/exit-survey.md @@ -0,0 +1,21 @@ +# Exit Survey + +An exit survey is a form presented to the user after they close a ticket and leave a star rating. It lets you collect structured written feedback alongside the numeric rating. + +:::tip Premium Feature +Exit surveys require [Premium](https://tickets.bot/premium). +::: + +## Setting Up an Exit Survey + +1. Create a [form](/dashboard/forms) containing your feedback questions. +2. Enable [user feedback](./user-feedback) on the panel (the **Enable User Feedback** toggle in the **Closing and Claiming** section). +3. In the same section, set the **Exit Survey** dropdown to the form you created. + +![Panel editor exit survey](../../../img/dashboard/exit-survey/panel-editor-exit-survey.webp) + +The next time a user rates a ticket on that panel, they will also be prompted to fill in the survey form. + +## Viewing Responses + +When a user submits a survey response, the archive message in your transcript channel is updated with a button to view their answers. diff --git a/docs/src/en/dashboard/settings/placeholders.md b/docs/src/en/dashboard/settings/placeholders.md new file mode 100644 index 0000000..d6fc30f --- /dev/null +++ b/docs/src/en/dashboard/settings/placeholders.md @@ -0,0 +1,3 @@ +# Placeholders + +The full placeholders reference has moved. See the [Placeholders](/miscellaneous/placeholders) page for all available welcome message placeholders, custom naming scheme placeholders, integration placeholders, and escaping syntax. diff --git a/docs/src/en/dashboard/settings/settings.md b/docs/src/en/dashboard/settings/settings.md new file mode 100644 index 0000000..d36b3df --- /dev/null +++ b/docs/src/en/dashboard/settings/settings.md @@ -0,0 +1,95 @@ +# Server Settings + +--- + +The Server Settings page controls options that apply globally across your server, rather than to individual panels. Open the dashboard, select your server, and click **Settings** in the sidebar. + +The page is divided into three collapsible sections: [General](#general), [Context Menu](#context-menu), and [Colour Scheme](#colour-scheme). After making changes, click **Save Changes** at the bottom of the page. + +![Settings overview](../../../img/dashboard/settings/settings-overview.webp) + +## Looking for a setting that used to be here? + +Several settings have moved to the per-panel editor. Each panel now controls its own behaviour independently. Open any panel from the [Panels](/dashboard/ticket-panels) page and look in the section listed below. + +| Old Settings location | New location (panel editor section) | +|---|---| +| Per User Simultaneous Ticket Limit | [Ticket Behaviour](/dashboard/ticket-panels#ticket-behaviour) (Max Open Tickets Per User) | +| Allow Users to Close Tickets | [Closing and Claiming](/dashboard/ticket-panels#closing-and-claiming) | +| Ticket Close Confirmation | [Closing and Claiming](/dashboard/ticket-panels#closing-and-claiming) | +| Enable User Feedback | [Closing and Claiming](/dashboard/ticket-panels#closing-and-claiming) | +| Thread Mode (Enabled) | [Ticket Behaviour](/dashboard/ticket-panels#ticket-behaviour) (Create Tickets as Threads) | +| Thread Notification Channel | [Ticket Behaviour](/dashboard/ticket-panels#ticket-behaviour) | +| Transcripts Channel | [Routing](/dashboard/ticket-panels#routing) (Transcript Channel) | +| Store Ticket Transcripts | [Routing](/dashboard/ticket-panels#routing) (Enable Transcripts) | +| Overflow Category | [Ticket Behaviour](/dashboard/ticket-panels#ticket-behaviour) (Enable Overflow Category) | +| Hide Claim Button | [Closing and Claiming](/dashboard/ticket-panels#closing-and-claiming) | +| Hide Close Button | [Closing and Claiming](/dashboard/ticket-panels#closing-and-claiming) | +| Hide Close with Reason Button | [Closing and Claiming](/dashboard/ticket-panels#closing-and-claiming) | +| /open Command settings | [Ticket Behaviour](/dashboard/ticket-panels#ticket-behaviour) (Show in /open Command) | +| Naming Scheme | [Ticket Behaviour](/dashboard/ticket-panels#ticket-behaviour) | +| Welcome Message | [Welcome Message](/dashboard/ticket-panels#welcome-message) | +| Auto Close | [Auto Close](/dashboard/ticket-panels#auto-close) | +| Ticket Permissions | [Permissions](/dashboard/ticket-panels#permissions) | + +## General + +The General section contains settings that affect the bot across the entire server. + +### Language + +Select the language the bot uses for all messages in your server. The dropdown lists all available translations. + +[Learn more about language customisation](../../setup/language-customisation). + +### Panel Switch Behaviour + +Controls what happens when a ticket is switched to a different panel and the current claimer does not have access to the new panel's support team. The available options are: + +| Option | Behaviour | +|---|---| +| Auto Unclaim | Automatically unclaim if the claimer has no access to the new panel | +| Block Switch | Prevent switching if the claimer has no access to the new panel | +| Remove On Unclaim | Allow the switch, but remove the claimer's access when they unclaim | +| Keep Access | Allow the switch and keep the claimer's access even after unclaiming | + +Click the info icon next to the label for a detailed explanation of each option. + +### Anonymise Dashboard Responses + +When enabled, all responses sent from the web dashboard appear as if they were sent by the bot rather than by the individual staff member. This hides the identity of the staff member responding. + +## Context Menu + +The Context Menu section configures the "Start ticket from message" feature, which lets users right-click a message in Discord and open a ticket from it. + +[Learn more about starting a ticket from a message](./start-ticket-from-message). + +### Use Settings from Panel + +Select a panel whose ticket settings (support teams, category, welcome message, etc.) will be used when a ticket is opened via the context menu. If set to "None", tickets opened this way use default settings. + +### Required Permission Level + +Controls who can use the context menu to start a ticket. The options are: + +- **Everyone** - any server member can use it. +- **Staff Only** - only users with a support role or higher can use it. +- **Admin Only** - only users with an admin role can use it. + +### Add Sender to Ticket + +When enabled, the user who sent the original message (the one that was right-clicked) is automatically added to the new ticket, even if they are not the one who opened it. + +## Colour Scheme + +Customise the colours used in the bot's embedded messages across your server. Two colour pickers are available: + +- **Success** - the colour used for positive messages (default: green, `#2ecc71`). +- **Failure** - the colour used for error or warning messages (default: red, `#fc3f35`). + +:::tip Premium Feature +This is a premium feature. [Learn more about premium](https://tickets.bot/premium). +::: + +![Colour scheme](../../../img/dashboard/settings/colour-scheme.webp) diff --git a/docs/src/en/dashboard/settings/start-ticket-from-message.md b/docs/src/en/dashboard/settings/start-ticket-from-message.md new file mode 100644 index 0000000..d160ab4 --- /dev/null +++ b/docs/src/en/dashboard/settings/start-ticket-from-message.md @@ -0,0 +1,33 @@ +# Start Ticket from Message + +You can open a ticket directly from any message in your server using Discord's context menu. This is useful for moderation workflows where you need to discuss a specific message with its author in a private ticket. + +## How to Use + +Right-click a message in Discord (or long-press on mobile), hover over **Apps**, and select **Start Ticket**. + +![Context menu](/img/context_menu_start_ticket.webp) + +A new ticket is created with the user who sent the message. The bot posts a message quoting the original content and linking back to it. + +![Quote message](/img/context_menu_quote_message.webp) + +## Configuration + +These settings are found in the dashboard under **Settings** in the sidebar, in the **Context Menu** section. + +### Use Settings from Panel + +Select a panel whose ticket settings (support teams, category, welcome message, etc.) are used when a ticket is opened via the context menu. If set to "None", tickets opened this way use default settings. + +### Required Permission Level + +Controls who can use the context menu to start a ticket: + +- **Everyone** - any server member can use it. +- **Staff Only** - only users with a support role or higher can use it. +- **Admin Only** - only users with an admin role can use it. + +### Add Sender to Ticket + +When enabled, the user who sent the original message is automatically added to the new ticket. When disabled, the sender is not added and the "Conversation moved to ticket" message is not sent. This is useful when the sender is being reported and should not be aware of the ticket. diff --git a/docs/src/en/dashboard/settings/thread-mode.md b/docs/src/en/dashboard/settings/thread-mode.md new file mode 100644 index 0000000..4e9aaa8 --- /dev/null +++ b/docs/src/en/dashboard/settings/thread-mode.md @@ -0,0 +1,57 @@ +# Thread Mode + +Thread mode is an alternative way to create tickets. Instead of opening a separate channel for each ticket, the bot creates a private thread under the panel channel. This changes several aspects of how tickets work, so read the comparison below to decide which mode suits your server. + +## Enabling Thread Mode + +Thread mode is enabled per panel. Open any panel from the [Panels](/dashboard/ticket-panels) page, expand the **Ticket Behaviour** section, and enable the **Create Tickets as Threads** toggle. + +When thread mode is enabled, you must also set a **Thread Notification Channel**. This is the text channel where the bot posts a notification embed each time a ticket thread is opened. Staff members click a button on that embed to join the thread. + +![Notification embed](/img/ticket_notification.webp) + +![Panel editor threads](../../../img/dashboard/thread-mode/panel-editor-threads.webp) + +## Mode Comparison + +| Channel mode | Thread mode | +|---|---| +| Tickets are sorted by category. | Threads are attached to the panel channel. | +| Can move between categories with `/switchpanel`. | `/switchpanel` is not supported. | +| Tickets cannot be reopened once closed. | Tickets can be reopened. | +| Transcripts are only viewable on the web dashboard. | Transcripts are viewable on the web dashboard and within Discord. | +| Limited to 500 channels total, and only 50 channels in a single category. This is a Discord limitation, not a bot limitation. | 1,000 open threads, unlimited closed threads. | +| All staff on the support team are added to the ticket. | Staff members must press a button to join the ticket. See the [FAQ](#can-the-support-team-be-added-to-threads-automatically) for a workaround. | +| Tickets can be claimed. | Claiming is not supported. Staff members join individually, which replicates similar behaviour. | +| `/notes` creates a private thread for staff to talk in. | Discord does not support threads inside threads, so `/notes` cannot be used. | +| No concept of on-call staff. | Staff can be marked as on-call to be automatically pinged and added to tickets. | +| No spaces in channel names. | Spaces in channel names are permitted (e.g. `Ticket 1234`). | + +## On-Call + +Thread mode introduces the `/on-call` command. When a staff member runs this command, they are assigned a role marking them as on-call until they run the command again. When a new ticket is opened, on-call roles are pinged in the ticket, instantly adding all currently on-call staff members. + +:::info Applies to New Tickets Only +When a staff member becomes on-call, they will **not** be added to any existing tickets. They must join existing tickets via the notification channel as normal. +::: + +## FAQ + +### Which mode should I use? + +If you run a server with a small team, channel mode is usually simpler. If you run a server with a heavy focus on 1-on-1 support, or need features like reopening tickets, thread mode is a better fit. + +### Can the support team be added to threads automatically? + +Yes. Add the staff members or roles to both the panel's **Support Teams** and the **Mention On Open** list. When mentioned on open, those staff members are pinged inside the thread, which adds them automatically. + +### Will channel mode be removed? + +No. Both modes will continue to be supported. Thread mode is entirely optional. + +### My users cannot type in their support tickets + +You must grant the **Send Messages in Threads** permission to your `@everyone` role on the panel channel. + +![Edit Channel](/img/edit_channel.webp) +![Grant Send Messages in Threads](/img/grant_send_messages_in_thread.webp) diff --git a/docs/src/en/dashboard/settings/user-feedback.md b/docs/src/en/dashboard/settings/user-feedback.md new file mode 100644 index 0000000..dc8386f --- /dev/null +++ b/docs/src/en/dashboard/settings/user-feedback.md @@ -0,0 +1,42 @@ +# User Feedback + +User feedback lets your users rate the support they received after a ticket is closed. When enabled, the user is prompted with a star rating (1 to 5) after their ticket closes. + +![Example Screenshot](../../../img/feedback_example.webp) + +## Enabling Feedback + +User feedback is enabled per panel. Open any panel from the [Panels](/dashboard/ticket-panels) page, expand the **Closing and Claiming** section, and enable the **Enable User Feedback** toggle. + +![Panel editor feedback](../../../img/dashboard/user-feedback/panel-editor-feedback.webp) + +The next time a user's ticket is closed on that panel, they will be asked to provide a rating. + +## Exit Survey + +You can collect more detailed feedback by attaching an exit survey form. When an exit survey is configured, the user is asked to fill in a form after leaving their star rating. + +[Learn more about exit surveys](./exit-survey). + +## Viewing Feedback + +### Analytics + +Premium subscribers can view feedback data on the [Analytics](/dashboard/analytics) page: + +- **Avg Rating** shows the average star rating across all rated tickets. +- **Feedback Rate** shows the percentage of closed tickets that received a rating. +- **Feedback Distribution** shows a breakdown of how many ratings were given for each star value. + +Individual staff member ratings are available on the [staff detail page](/dashboard/analytics#staff-detail-page). + +### Transcripts + +You can view the rating for any individual ticket on the [Transcripts](/dashboard/transcripts) page. The **Rating** column shows the star rating left by the user, or "No rating" if no feedback was submitted. + +### Placeholders + +You can include feedback statistics in your welcome messages using these [placeholders](/miscellaneous/placeholders): + +- `%average_rating%` displays your server's average feedback rating. +- `%rating_count%` displays the total number of feedback ratings received. diff --git a/docs/src/en/dashboard/staff-teams.md b/docs/src/en/dashboard/staff-teams.md new file mode 100644 index 0000000..4cf678b --- /dev/null +++ b/docs/src/en/dashboard/staff-teams.md @@ -0,0 +1,80 @@ +# Staff Teams + +--- + +Staff teams can be used to further customize, which of your staff members can see, claim, respond to, and close specific types of tickets. This is possible because staff teams get linked to individual ticket panels however you see fit. Learn more about [ticket panels](./ticket-panels) and the [support teams input](./ticket-panels#support-teams). + +## Teams Page + +Navigate to **Dashboard** > your server > **Staff Teams** (in the Moderation sidebar group). + +The page has three sections: **Create Team**, **Manage Teams**, and **Team Permissions** (visible when a non-default team is selected). + +![Teams page](../../img/dashboard/teams/teams-page.webp) + +## Create Team + +Enter a team name in the text field and click **Submit** to create a new team. The team appears in the team selector dropdown immediately. + +## Manage Teams + +### Selecting a Team + +Use the **Team** dropdown to switch between teams. The page loads the selected team's members and permissions. + +### Deleting a Team + +Select a team and click the **Delete** button next to the dropdown. A confirmation dialog appears. If a deleted team was linked to a ticket panel, that panel will no longer have a team assigned, and all staff members will be able to see and manage tickets for that panel. + +:::warning Default Team Cannot Be Deleted +The Default team cannot be deleted. See [Default Team](#default-team) below. +::: + +### Adding Roles to a Team + +The right-hand column, labelled **Add Role**, contains a role selector dropdown listing all roles in your Discord server. Select a role and click **Add To Team** to assign that role to the current team. Members with that role will then have access to tickets routed to this team. + +:::info Users and Roles as Members +The dashboard supports both individual users and roles as team members. Existing user members added through Discord commands are shown in the members list. New members are added via roles using the dashboard interface. +::: + +### Removing Members + +The left-hand column, labelled **Manage Members**, lists all current members and roles assigned to the selected team. Open the action menu for any member or role and click **Remove**. A confirmation dialog appears before the member is removed. + +## Team Permissions + +When a non-default team is selected, a **Team Permissions** section appears below the member management area. These permissions control what team members can do inside ticket channels. Each permission can be toggled on or off individually, and changes are saved automatically. + +The available permissions are: + +| Permission | Default | +| ---------- | ------- | +| Add Reactions | On | +| Send Messages | On | +| Send TTS Messages | On | +| Embed Links | On | +| Attach Files | On | +| Mention Everyone | Off | +| Use External Emojis | On | +| Use Application Commands | On | +| Use External Stickers | On | +| Send Voice Messages | On | + +:::info Admins Bypass These Settings +Ticket admins and support reps always have full permissions regardless of these settings. +::: + +Team permissions are not available for the Default team. + +## Default Team + +The Default team is created automatically and cannot be deleted. Members and roles added through the `/addadmin` and `/addsupport` commands are placed into this team. + +:::tip Related Commands +Learn more about the [/addadmin and /addsupport](/commands/add-admin-support) commands. +::: + +## Linking Teams to Panels + +To restrict a ticket panel to a specific team, edit the panel on the [Ticket Panels](/dashboard/ticket-panels) page and select the team in the routing section. Only members of the assigned team will be able to see and respond to tickets created through that panel. diff --git a/docs/src/en/dashboard/tags.md b/docs/src/en/dashboard/tags.md new file mode 100644 index 0000000..7f4ac4d --- /dev/null +++ b/docs/src/en/dashboard/tags.md @@ -0,0 +1,108 @@ +# Tags + +--- + +Tags are pre-defined snippets of text sent by the bot. These can be useful for quickly sending responses to commonly asked questions or concerns. + +## Tags List + +Navigate to **Dashboard** > your server > **Tags** (in the Content sidebar group). + +The main page shows a table with two columns: + +- **Tag ID**: the identifier used in the `/tag` command (displayed in monospace) +- **Type**: shows whether the tag is Text, Embed, or Embed + Text + +Each row has an action menu with the following options: + +- **Edit** opens the tag editor modal with the tag's current settings +- **Clone** opens the tag editor pre-filled with all of the original tag's settings (see [Cloning a Tag](#cloning-a-tag)) +- **Publish to Gallery** submits the tag to the public gallery for other servers to import +- **Remove** deletes the tag after a confirmation prompt + +Click **Create Tag** to open the tag editor for a new tag. + +![Tags list](../../img/dashboard/tags/tags-list.webp) + +## Creating a Tag + +Click **Create Tag** to open the tag editor modal. The modal title reads "Create Tag" for new tags, "Edit Tag" when editing, and "Clone Tag" when cloning. + +![Tag editor](../../img/dashboard/tags/tag-editor.webp) + +### Tag ID + +The Tag ID is the name used in the `/tag` command. For example, if the ID is `greeting`, staff would type `/tag greeting` in Discord. + +Tag IDs must be 1 to 16 characters, lowercase, and can only contain letters, numbers, hyphens, and underscores. The editor automatically converts your input to lowercase and strips invalid characters. + +### Create Custom Command Alias + +When enabled, this creates a dedicated slash command for the tag (e.g. `/greeting` instead of `/tag greeting`). This is a Premium feature. If your server does not have Premium, the toggle is disabled with a "(Premium)" label. + +### Message Content + +The text message the bot sends when the tag is used. Maximum 2,000 characters. + +:::tip Placeholders Work in Tags +Tags support [placeholders](/miscellaneous/placeholders) when used in ticket channels. Every welcome message placeholder works in the message content, allowing you to create dynamic responses with user information, ticket details, and more. Inside an embed, which placeholders each field takes is listed under [where they work](/miscellaneous/placeholders#where-they-work). +::: + +### Link to Knowledge Base Article + +If your server has published [Knowledge Base](/dashboard/knowledge-base) articles, you can link a tag to an article instead of writing separate content. Toggle **Link to Knowledge Base article** and select an article from the dropdown. + +When the tag is invoked in Discord, the linked article's content (including any embed) is displayed. The tag's own content and embed settings are kept as a fallback in case the article is later deleted or unpublished. + +:::tip Edit Once, Update Everywhere +This is useful for keeping canned responses in sync with your knowledge base. Edit the article once, and all linked tags automatically use the updated content. +::: + +### Use Embed + +Toggle **Use Embed** to send the tag response as a Discord embed. When enabled, the following settings appear: + +**Embed settings:** + +- **Title**: bold text at the top of the embed (maximum 256 characters) +- **Colour**: the accent colour on the left side of the embed, chosen via a colour picker +- **Description**: the main body text of the embed (maximum 4,096 characters) + +**Author section** (collapsible): + +- **Author Name**: text displayed above the embed title +- **Author Icon URL**: image displayed to the left of the author name +- **Author URL**: makes the author name a clickable hyperlink + +**Images section** (collapsible): + +- **Thumbnail URL**: small image displayed at the top right of the embed +- **Image URL**: large image displayed at the bottom of the embed + +**Footer section** (collapsible): + +- **Footer Text**: smaller text at the very bottom of the embed +- **Footer Icon URL**: image displayed to the left of the footer text +- **Footer Timestamp**: optional date/time displayed after the footer text + +**Embed Fields** (collapsible): + +Additional titled sections within the embed. Each field has a **Name** (bold heading), **Value** (body text), and an **Inline** toggle. Inline fields display side by side on the same row; non-inline fields stack vertically. + +A live preview of the embed is shown on the right side of the modal as you edit. + +## Cloning a Tag + +Open the action menu for any tag on the list page and click **Clone**. The tag editor opens with all settings copied from the original, including message content, embed configuration, and fields. Update the Tag ID (and any other details you wish to change) and save. The original tag is not modified. + +## Deleting a Tag + +Open the action menu for any tag and click **Remove**. A confirmation dialog appears. Deletion is permanent. + +## Using a Tag in Discord + +In Discord, type `/tag` followed by the tag ID. Autocomplete suggestions appear as you type, showing available tag IDs for the server. + +## Publishing to Gallery + +You can share your tag with other Tickets users by opening the action menu and clicking **Publish to Gallery**. Other server admins can then import your tag directly from the gallery. diff --git a/docs/src/en/dashboard/ticket-panels.md b/docs/src/en/dashboard/ticket-panels.md new file mode 100644 index 0000000..3b9cf8b --- /dev/null +++ b/docs/src/en/dashboard/ticket-panels.md @@ -0,0 +1,382 @@ +# Panels + +--- + +Panels are the primary way users open tickets in your server. Each panel sends an embed with a button to a Discord channel; when a user clicks the button, a new ticket is created. You can create multiple panels with different settings, categories, and support teams to handle different types of requests. + +## The Panels Page + +The Panels page shows all of your server's panels and multi-panels side by side. To reach it, open the dashboard, select your server, and click **Panels** in the sidebar. + +![Panels list](../../img/dashboard/panels/panels-list.webp) + +The left section lists your individual panels. Each row shows the channel, panel name, and support hours status (Open, Closed, or 24/7). The right section lists your [multi-panels](/dashboard/multi-panels). + +Free servers are limited to **3 panels**. Premium servers can create unlimited panels. If you have reached the free limit, a prompt to upgrade is displayed at the top of the page. + +### Creating a Panel + +Click **Create Panel** to open the panel editor with default values. Fill in the sections described below, then click **Create Panel** at the bottom of the page. + +### Editing a Panel + +Click the action menu on any panel row and select **Edit** to open the panel editor with the panel's current settings. After making changes, click **Save Changes**. + +### Deleting a Panel + +Click the action menu and select **Remove**. A confirmation prompt will appear. If you delete the panel's message directly in Discord instead, the panel continues to exist on the dashboard and can be resent. + +### Resending a Panel + +If the panel message in Discord was deleted or you need to re-post it, click the action menu and select **Resend**. The bot sends a fresh copy of the panel embed to the configured channel. + +### Cloning a Panel + +Click the action menu and select **Clone** to open the panel creation page pre-filled with all of the original panel's settings, including ticket properties, the panel message, welcome message, access control rules, and support hours. Adjust any details you wish to change (such as the title or channel), then save. + +:::info Free Plan Panel Limit +Free servers are limited to 3 panels. If cloning would exceed this limit, you will need to upgrade to premium. [Learn more about premium](https://tickets.bot/premium). +::: + +### Publishing to the Template Gallery + +Click the action menu and select **Publish to Gallery** to share your panel design with the community. See the [Template Gallery](/dashboard/panel-gallery) page for details on the submission process. + +### Gallery Submissions + +If you have published any panels, tags, or forms to the gallery, a **Gallery Submissions** section appears below the panels and multi-panels lists. Each submission shows its name, category, status (Pending, Approved, or Rejected), import count, and actions to edit or withdraw it. + +## Panel Editor + +The panel editor is used for both creating and editing panels. It is organised into the following collapsible sections, described in order below. + +## Panel Appearance + +Controls how the panel embed looks in Discord and which channel it is posted to. + +![Panel appearance](../../img/dashboard/panels/panel-appearance.webp) + +### Panel Title + +The bold text at the top of the embed. Default: "Open a ticket". + +### Panel Colour + +The accent colour shown on the left edge of the embed. Click the colour picker to choose a custom colour. + +### Panel Content + +The main body text of the embed. Use this to describe your support process, available languages, or any other information for your users. Maximum length: 1,000 characters. + +:::tip Formatting +You can use [Discord message formatting](https://discord.com/developers/docs/reference#message-formatting) in the panel content, including bold, italic, links, and mentions. +::: + +### Panel Channel + +The Discord text channel where the bot sends the panel embed. This should be a channel accessible to all members. In thread mode, new tickets are created as threads under this channel. In channel mode, tickets open in the ticket category, but the panel message still lives in this channel. + +:::warning Use a Separate Channel +Do not use the same channel as your transcript channel. +::: + +### Thumbnail URL + +A URL pointing to an image displayed as a small thumbnail to the right of the embed content. + +### Image URL + +A URL pointing to an image displayed full-width below the embed content. + +:::tip Image URLs +The URL should point directly to an image file. An easy way to get a suitable URL is to send the image as a message in a Discord channel, then right-click the image and choose **Copy Link**. +::: + +### Button Text + +The label displayed on the panel button. Default: "Open Ticket". + +### Button Colour + +The colour of the panel button. Options are Blue, Grey, Green, and Red. + +### Button Emoji + +The emoji displayed on the panel button. You can paste a standard Unicode emoji directly into the field. To use a custom emoji from your server, the picker shows a list of your server's custom emojis to choose from. + +## Routing + +Controls where tickets go, which teams handle them, and what notifications are sent when a ticket is opened. + +### Support Teams + +Select which staff teams handle tickets created from this panel. You can select the **Default** team, any custom teams you have created, or a combination. If no team is selected, all staff can see the ticket. + +### Ticket Category + +The Discord channel category that new ticket channels are created under. Each panel can use a different category, letting you organise tickets by type. [Learn more about channel categories](https://support.discord.com/hc/en-us/articles/115001580171-Channel-Categories-101). + +### Awaiting Response Category + +When a ticket is awaiting a response from the user, it can be automatically moved to a separate category to help staff prioritise. Select the category to use, or leave it empty to disable this behaviour. + +[Learn more about the awaiting response category](./settings/awaiting-user-response). + +:::tip Premium Feature +This is a premium feature. [Learn more about premium](https://tickets.bot/premium). +::: + +### Transcript Channel + +The text channel where the bot posts a summary message after a ticket is closed. The summary includes the ticket ID, opener, closer, timestamps, and a link to the online transcript (if transcripts are enabled). Leave empty to disable. Works together with the **Enable Transcripts** toggle below. + +### Mention On Open + +A list of roles or users to mention when a ticket is opened from this panel. You can also select **Ticket Opener** to mention the user who opened the ticket, or **@here** to mention all online members in the ticket channel. + +:::warning Muted Users Are Not Notified +Mentions will not notify users who have their notification settings set to mute. +::: + +### Mentions Behaviour + +Controls what happens to the mention message after it is sent: + +| Option | Behaviour | +|---|---| +| Delete mentions | The mention message is deleted after sending | +| Hide Mentions | The mention message is hidden (suppressed) | +| Do Nothing | The mention message remains visible | + +### Form + +Attach a form to this panel. When a user clicks the panel button, they are presented with the form to fill in before the ticket is created. Select "None" to open tickets without a form. + +[Learn more about forms](./forms). + +### Enable Transcripts + +Toggle whether transcripts of tickets opened from this panel are stored for later review by staff. + +## Welcome Message + +The welcome message is the embed sent to the ticket channel as soon as the ticket is opened. The editor includes a live preview on the right side. + +![Welcome message](../../img/dashboard/panels/welcome-message.webp) + +Previously, the welcome message was set globally on the Settings page. It is now configured per panel. + +### Title + +The bold text at the top of the welcome message embed. + +### Title URL + +Makes the title a clickable link. + +### Colour + +The accent colour on the left edge of the welcome message embed. + +### Description + +The main body text of the welcome message. Maximum length: 1,000 characters. [Placeholders](../miscellaneous/placeholders) can be used here. + +:::tip Formatting +You can use [Discord message formatting](https://discord.com/developers/docs/reference#message-formatting) in the description, including bold, italic, channel links, role mentions, and user mentions. To use mentions, enable Discord Developer Mode (User Settings, Advanced, Developer Mode), right-click any channel, user, or role and choose **Copy ID**, then use the format from [Discord's formatting reference](https://discord.com/developers/docs/reference#message-formatting). +::: + +### Author Settings + +An expandable sub-section with fields for: + +- **Author Name** - text displayed above the embed title. +- **Author Icon URL** - a small image displayed next to the author name. +- **Author URL** - a link that the author name points to when clicked. + +### Images + +An expandable sub-section with fields for: + +- **Thumbnail URL** - a small image shown to the right of the embed content. +- **Image URL** - a large image shown below the embed content. + +### Footer Settings + +An expandable sub-section with fields for: + +- **Footer Text** - text displayed at the bottom of the embed. +- **Footer Icon URL** - a small image displayed next to the footer text. +- **Footer Timestamp (Optional)** - a date and time displayed next to the footer. + +### Embed Fields + +An expandable sub-section where you can add custom fields to the embed. Each field has a name, value, and an option to display it inline. + +## Ticket Behaviour + +Controls how tickets are created, named, and limited. + +Previously, several of these settings were on the global Settings page. They are now configured per panel. + +### Create Tickets as Threads + +When enabled, tickets are created as private threads instead of separate channels. Click the info icon next to the toggle for a detailed comparison of thread mode and channel mode. + +[Learn more about thread mode](./settings/thread-mode). + +### Thread Notification Channel + +Only available when thread mode is enabled. Select the text channel where the bot posts a notification embed each time a ticket thread is opened. Staff can click a button on that embed to join the thread. This field is required when thread mode is active. + +### Naming Scheme + +Choose how ticket channels (or threads) are named. Preset options: + +- `ticket-%id%` (default) +- `ticket-%username%` +- `ticket-%id%-%username%` +- `ticket-%nickname%` +- `ticket-%id_padded%` +- **Custom** - enter your own pattern. + +When **Custom** is selected, a text field appears for you to type a custom naming scheme. Spaces are automatically replaced with hyphens. [Placeholders](../miscellaneous/placeholders#custom-naming-scheme-placeholders) can be used. + +### Show in /open Command + +When enabled, this panel appears as an option in the `/open` command, letting users open a ticket from the command picker instead of clicking a button. When disabled, the panel is only accessible via its button in the panel channel. + +### Enable Overflow Category + +Discord limits each category to 50 channels. When enabled, tickets that would exceed this limit are created in the overflow category instead. + +### Overflow Category + +Only visible when overflow is enabled. Select the Discord channel category to use when the primary ticket category is full. + +### Ticket Open Cooldown (seconds) + +A per-user cooldown preventing users from opening tickets on this panel in rapid succession. Set to 0 to disable (default). Staff members are exempt from cooldowns. On the edit page, a **Reset Cooldowns** button clears all active cooldowns for the panel. + +### Max Open Tickets Per User + +The maximum number of tickets a single user can have open at the same time on this panel. Set to 0 for no limit (default). Maximum value: 10. Staff members are exempt from this limit. + +## Closing and Claiming + +Controls how tickets are closed and how staff claim tickets. The section is divided into **Closing** and **Claiming** sub-headings. + +Previously, several of these settings were on the global Settings page. They are now configured per panel. + +### Closing + +#### Allow Users to Close Tickets + +Toggle whether the user who opened the ticket can also close it. When disabled, only staff members can close tickets. + +#### Ticket Close Confirmation + +Toggle whether a second confirmation prompt is required before a ticket is closed. + +#### Enable User Feedback + +Toggle whether users are asked to provide a star rating after their ticket is closed. + +[Learn more about user feedback](./settings/user-feedback). + +#### Hide Close Button + +Toggle whether the **Close** button is hidden in tickets opened from this panel. + +#### Hide Close with Reason Button + +Toggle whether the **Close with Reason** button is hidden in tickets opened from this panel. + +#### Exit Survey + +Select a form to present to users when their ticket is closed, allowing them to provide structured feedback. Select "None" to disable. The form must already exist on the [Forms](/dashboard/forms) page. + +[Learn more about exit surveys](./settings/exit-survey). + +:::tip Premium Feature +This is a premium feature. [Learn more about premium](https://tickets.bot/premium). +::: + +### Claiming + +[Learn more about claiming tickets](./settings/claiming-tickets). + +#### Hide Claim Button + +Toggle whether the **Claim** button is shown in tickets opened from this panel. + +#### Support Can View Claimed Tickets + +Toggle whether other support staff can view a ticket that has been claimed by a different staff member. + +#### Support Can Type in Claimed Tickets + +Toggle whether other support staff can send messages in a claimed ticket. This option is only available when **Support Can View Claimed Tickets** is enabled. + +## Permissions + +Controls which Discord permissions are granted to the ticket opener inside their ticket channel. Each permission has a toggle: + +- **Enabled (green)** - the user receives this permission in the ticket channel. +- **Disabled (grey)** - the user does not receive this permission. + +Previously, these settings were on the global Settings page. They are now configured per panel. + +The available permissions are: + +| Permission | Description | +|---|---| +| Add Reactions | Allow the user to add reactions to messages | +| Send TTS Messages | Allow the user to send text-to-speech messages | +| Embed Links | Allow URLs posted by the user to show embeds | +| Attach Files | Allow the user to upload files | +| Use External Emojis | Allow the user to use emojis from other servers | +| Use External Stickers | Allow the user to use stickers from other servers | +| Send Voice Messages | Allow the user to send voice messages | + +## Access Control + +Restrict which roles can open tickets from this panel. The access control list is evaluated from top to bottom, stopping at the first matching rule. + +Each rule specifies a role and an action: **Allow** or **Deny**. By default, the server's @everyone role is set to Allow, meaning all members can open tickets. Add Deny rules above it to block specific roles, or change the default to Deny and add Allow rules for specific roles. + +![Access control](../../img/dashboard/panels/access-control.webp) + +## Auto Close + +Automatically close tickets based on inactivity. All options in this section require the **Enable Auto Close** toggle to be active. + +:::tip Premium Feature +This is a premium feature. [Learn more about premium](https://tickets.bot/premium). +::: + +### Enable Auto Close + +Master toggle for auto-close behaviour on this panel. + +### Close on User Leave + +When enabled, tickets are automatically closed if the user who opened the ticket leaves the server. + +### Since Open with No Response + +Set a duration. If the ticket opener does not send a message within this time after the ticket is opened, the ticket is closed automatically. + +### Since Last Message + +Set a duration. If no messages are sent in the ticket for this length of time, the ticket is closed automatically. + +## Support Hours + +Restrict when this panel accepts new tickets. Support hours are configured per day of the week with a start and end time in a timezone of your choice. Outside of the configured hours, the panel button is disabled and users cannot open tickets. + +[Learn more about support hours](../features/support-hours). + +:::info Free Plan Support Hours Limit +Free servers can configure support hours on 1 panel. Premium servers have no limit. [Learn more about premium](https://tickets.bot/premium). +::: diff --git a/docs/src/en/dashboard/tickets.md b/docs/src/en/dashboard/tickets.md new file mode 100644 index 0000000..7287032 --- /dev/null +++ b/docs/src/en/dashboard/tickets.md @@ -0,0 +1,130 @@ +# Tickets + +The Tickets page shows all currently open tickets in your server. From here you can filter, sort, label, and take bulk actions on tickets, or click through to view an individual ticket's messages. + +![Tickets list](../../img/dashboard/tickets/tickets-list.webp) + +## Filtering and Sorting + +The filter card at the top of the page provides several controls for narrowing down the ticket list. Filters are applied automatically as you type. + +### Sort By + +A dropdown that controls the order of the ticket list. The options are: + +| Sort | Behaviour | +|------|-----------| +| **Unclaimed & Awaiting Response First** | Tickets that are unclaimed or claimed by you appear first. Among those, tickets awaiting a user response are prioritised. This is the default. | +| **Ticket ID (Ascending) / Oldest First** | Sorts by ticket number from lowest to highest. | +| **Ticket ID (Descending) / Newest First** | Sorts by ticket number from highest to lowest. | + +### Panel + +Filter tickets by the [ticket panel](./ticket-panels) they were created from. Select a panel name, or choose "Any Panel" to show all tickets. + +### Text Filters + +The following text fields filter tickets by specific criteria. The Ticket ID, Username, and User ID filters are mutually exclusive: entering a value in one clears the others. + +| Filter | Description | +|--------|-------------| +| **Ticket ID** | Show only the ticket with this ID number. | +| **Username** | Search by the ticket opener's Discord username. | +| **User ID** | Search by the ticket opener's Discord user ID. | +| **Claimed By ID** | Show only tickets claimed by this staff member's Discord user ID. | + +### Only Show Unclaimed & My Tickets + +A toggle that, when enabled, hides tickets that are claimed by other staff members. Only unclaimed tickets and tickets claimed by you are shown. + +### Table Columns + +You can customise which columns appear in the ticket table using the column selector button above the table. The available columns are: + +| Column | Description | +|--------|-------------| +| **ID** | The ticket's unique number. | +| **Panel** | The panel the ticket was created from. | +| **User** | The Discord username of the ticket opener. | +| **Opened** | How long ago the ticket was opened (e.g. "2 hours ago"). | +| **Claimed By** | The staff member who claimed the ticket, or "Unclaimed". | +| **Last Message** | How long ago the most recent message was sent. | +| **Awaiting Response** | Whether the last message in the ticket was from the user (i.e. staff have not yet replied). | +| **Labels** | Any labels assigned to the ticket. | + +## Labels + +Labels are coloured tags you can assign to tickets to help organise and categorise them. Labels are shared between the Tickets and [Transcripts](./transcripts) pages, so any label you create here is also available on transcripts. + +### Filtering by Label + +If you have created labels, they appear as pill buttons below the filter fields. Click a label to toggle it as a filter. When one or more labels are active, only tickets with at least one of those labels are shown. + +### Assigning Labels to a Ticket + +In the **Labels** column of the ticket table, click the **+** button next to a ticket's existing labels. A dropdown appears listing all available labels. Click a label to assign or remove it. Changes are saved immediately. + +### Managing Labels + +::: tip Admin Only +The "Manage Labels" button is visible only to server administrators. +::: + +Click **Manage Labels** in the filter card header to open the label management modal. From here you can: + +- View all existing labels +- Delete a label by clicking the bin icon next to it +- Create a new label by clicking **+ Create Label**, entering a **Label Name**, choosing a **Colour**, and clicking **Create** + +![Manage labels](../../img/dashboard/tickets/manage-labels.webp) + +## Viewing a Ticket + +Click the **View** button on any ticket row to open the ticket detail page. + +![Ticket view](../../img/dashboard/tickets/ticket-view.webp) + +### Ticket Info + +A collapsible section at the top shows the ticket's metadata: + +| Field | Description | +|-------|-------------| +| **ID** | The ticket number. | +| **Panel** | The panel the ticket was created from. | +| **Opened** | The date and time the ticket was opened. | +| **Opener** | The Discord username and user ID of the person who opened the ticket. | +| **Claimed by** | The staff member who claimed the ticket, or "Unclaimed". | + +### Close Ticket + +You can close the ticket by entering an optional close reason and clicking **Close**. After closing, you are returned to the tickets list. + +### Send Close Request + +Instead of closing the ticket immediately, you can send a close request to the ticket opener. They will see Accept and Deny buttons in Discord. You can optionally provide a reason and an **Auto-close delay (hours)** value. If the user does not respond within the specified number of hours, the ticket closes automatically. + +### Messages + +The ticket's messages are displayed below, rendered in the same style as Discord. Messages refresh automatically. + +::: tip Premium Feature +Replying to tickets from the dashboard and live message updates via WebSocket require [Premium](../premium/introduction). Without Premium, messages refresh on a polling interval. +::: + +If your server has Premium, a text input appears below the messages. Type your reply and click **Send** to post a message to the ticket channel in Discord. You can also use the **Select Tag** button to send a pre-made [tag](./tags) response. + +## Bulk Actions + +To perform actions on multiple tickets at once, select tickets using the checkboxes in the leftmost column of the table. You can also use the checkbox in the header row to select or deselect all visible tickets. + +Once you have selected one or more tickets, a **Bulk Actions** section appears below the table. Expand it to see the available actions: + +| Action | Description | +|--------|-------------| +| **Send Message** | Send the same message to all selected tickets. Enter the message text (up to 2000 characters) and click **Send**. | +| **Send Tag** | Send a [tag](./tags) to all selected tickets. Choose a tag from the dropdown and click **Send**. This option only appears if you have tags configured. | +| **Send Close Request** | Send a close request to all selected tickets. You can optionally enter a reason and an auto-close delay in hours. | +| **Close tickets** | Close all selected tickets immediately. You can optionally enter a close reason. | + +![Bulk actions](../../img/dashboard/tickets/bulk-actions.webp) diff --git a/docs/src/en/dashboard/transcripts.md b/docs/src/en/dashboard/transcripts.md new file mode 100644 index 0000000..3c7088d --- /dev/null +++ b/docs/src/en/dashboard/transcripts.md @@ -0,0 +1,75 @@ +# Transcripts + +The Transcripts page lists all closed tickets in your server. You can search and filter the list, assign labels, edit close reasons, and open a full message transcript for any ticket that has one stored. + +![Transcripts list](../../img/dashboard/transcripts/transcripts-list.webp) + +## Filters + +The filter card at the top of the page lets you narrow down the transcript list. All filters are applied together and update the results automatically as you type or select values. The total number of matching results is displayed in the filter header. + +| Filter | Description | +|--------|-------------| +| **Ticket ID** | Show only the transcript for this ticket number. | +| **Username** | Search by the ticket opener's Discord username. | +| **User ID** | Search by the ticket opener's Discord user ID. | +| **Closed By** | Show only tickets closed by this user's Discord ID. | +| **Panel** | Filter by the [ticket panel](./ticket-panels) the ticket was created from. Select a panel name, or choose "Any Panel" to show all. | +| **Rating** | Filter by the star rating (1 through 5) given by the ticket opener in [user feedback](./settings/user-feedback). Select "Any" to show all. | +| **Claimed By** | Show only tickets claimed by this staff member's Discord user ID. | +| **Close Reason** | Search by text within the close reason. | + +## Labels + +Labels work the same way on the Transcripts page as on the [Tickets](./tickets#labels) page. The same set of labels is shared between both pages, so any label you create or delete in one place is reflected in the other. + +### Filtering by Label + +If labels exist, they appear as pill buttons below the filter fields. Click a label to toggle it on or off as a filter. When one or more labels are active, only transcripts with at least one of those labels are shown. + +### Assigning Labels + +In the **Labels** column of the transcript table, click the **+** button next to a transcript's existing labels. A dropdown appears listing all available labels. Click a label to assign or remove it. Changes are saved immediately. + +### Managing Labels + +::: tip Admin Only +The "Manage Labels" button is visible only to server administrators. +::: + +Click **Manage Labels** in the filter card header to open the label management modal. Here you can view, delete, and create labels using a **Label Name** and **Colour**. This is the same modal used on the [Tickets](./tickets#managing-labels) page. + +## Transcript Table + +The table shows one row per closed ticket. You can show or hide columns using the column selector button above the table. The available columns are: + +| Column | Description | +|--------|-------------| +| **Ticket ID** | The ticket's unique number. If a transcript is available, the ID is a clickable link to the [transcript view](#viewing-a-transcript). | +| **Username** | The Discord username of the ticket opener. | +| **Rating** | The star rating given by the ticket opener, or "No rating" if no feedback was left. | +| **Close Reason** | The reason provided when the ticket was closed, or "No reason specified". | +| **Labels** | Any labels assigned to the transcript. | + +### Actions + +Each row has an action menu with the following options: + +- **View** opens the full transcript (only shown if a transcript is stored for that ticket). +- **Edit Close Reason** opens a modal where you can update or clear the close reason for that ticket. + +## Viewing a Transcript + +Clicking a ticket ID link or the **View** action opens the transcript viewer. This page renders the ticket's messages in the same style as Discord, including embeds, attachments, mentions, and components. + +A **Back to transcripts** link at the top returns you to the transcript list. + +![Transcript view](../../img/dashboard/transcripts/transcript-view.webp) + +## Pagination + +Results are paginated. Use the page controls at the bottom of the table to navigate between pages. + +## Who Can Access Transcripts + +Any staff member with at least Support-level permissions on the server can view the Transcripts page and open individual transcripts. Creating, deleting, and managing labels requires Admin-level permissions. diff --git a/docs/src/en/features/affiliate-programme.md b/docs/src/en/features/affiliate-programme.md new file mode 100644 index 0000000..c9a264b --- /dev/null +++ b/docs/src/en/features/affiliate-programme.md @@ -0,0 +1,112 @@ +# Affiliate Programme + +The Affiliate Programme is a referral system that rewards you for bringing new users to Tickets. Share your unique code with others - they get a discount on their subscription, and you earn credits that can be redeemed for premium time. + +Anyone with a Tickets account can apply. You do not need an active premium subscription to become an affiliate. + +## How It Works + +1. **Apply** - Visit the Affiliate page in the web dashboard and submit an application with your chosen code +2. **Get approved** - An admin reviews your application. Once approved, your code goes live +3. **Share your code** - Send your referral link to others. New customers who use it get a discount at checkout +4. **Earn credits** - When someone subscribes using your code, you earn credits +5. **Redeem** - Convert your earned credits into premium time directly from the affiliate web dashboard + +## Applying for an Affiliate Code + +Head to the **Affiliate** page in the web dashboard. You can either choose a custom code or have one generated for you. + +Your code must be **3-6 alphanumeric characters** (letters and numbers only). + +Once you submit your application, an admin will review it. You will be notified when your code is approved and ready to share. + +## Sharing Your Referral Link + +Once approved, you have two ways to share your code: + +- **Direct link** - `https://dashboard.tickets.bot/?ref=YOURCODE` - the code is applied automatically when the user visits +- **Manual entry** - Users can enter your code on the pricing page under "Have an affiliate code?" + +:::tip Referral Window +When someone visits your referral link, the code is stored for **30 days**. Even if they do not subscribe immediately, you still earn credit if they purchase within that window. +::: + +## Referred Customer Discount + +New customers who use your affiliate code receive a **5% discount** on their subscription for the first 3 months. The discount is applied automatically at checkout via Polar - no extra steps needed on their end. + +## Earning Credits + +When someone first subscribes using your code, you earn credits based on a percentage of the purchased duration and the tier they buy. + +| Your Subscription Status | Credit Rate | +|--------------------------|-------------| +| No active premium | 5% | +| Premium subscriber | 10% | + +Credits are also multiplied based on the tier the referred customer purchases: + +| Referred Purchase | Credit Multiplier | +|-------------------|-------------------| +| Premium | 1x | +| Whitelabel | 2x | + +Your credit rate is determined at the time of each referral. If you upgrade to premium, all **future** referrals earn at the higher 10% rate - but past referrals keep whichever rate applied when they were made. + +**Example:** Someone buys 365 days of Premium using your code while you have an active premium subscription. You earn 10% of 365 x 1 = **37 credits**. + +**Example:** Someone buys 30 days of Whitelabel using your code at the standard rate. You earn 5% of 30 x 2 = **3 credits**. + +:::tip Upgrade for Better Rewards +If you are on the standard 5% rate, upgrading to premium doubles your credit rate to 10% on all future referrals. +::: + +:::warning First Subscription Only +Credits are earned when someone **first subscribes** using your code. You do not earn credits when a referred customer renews or their subscription recurs each month. Each subscription generates credit once. +::: + +### 14-Day Cooling Period + +Referral credit is not available immediately. Each referral enters a **14-day cooling period** to account for potential refunds. Once the cooling period ends, the credits become redeemable. + +## Redeeming Credits + +Visit the Affiliate page in the web dashboard and click **Redeem** to convert your available credits into premium time. + +How your credits convert to days depends on your current subscription: + +| Your Current Subscription | Redemption Rate | What Happens | +|---------------------------|--------------------|--------------------------------------------------------| +| Active Whitelabel | 2 credits = 1 day | Your Whitelabel subscription is extended automatically | +| Active Premium | 1 credit = 1 day | Your Premium subscription is extended automatically | +| No subscription | 1 credit = 1 day | A new Premium subscription is created for you | + +When you have an active subscription, redeeming credits extends your billing period - the extra days are added to the end of your current subscription, so nothing is wasted. + +## Credit Limits + +- **365 credits lifetime cap** - Once you have earned 365 credits in total, no further credits accrue. +- **Single-level only** - You earn credits from your direct referrals only. There are no earnings from sub-referrals (i.e. people referred by your referrals). +- **No self-referral** - You cannot use your own affiliate code. + +:::warning Credits Have No Cash Value +Affiliate credits can only be redeemed for Tickets premium time. They cannot be exchanged for money or transferred to another user. +::: + +## Affiliate Dashboard + +The Affiliate page gives you a complete overview of your referral activity: + +- **Your code and referral link** with copy buttons for easy sharing +- **Current credit rate** showing whether you are earning at the standard or premium rate +- **Stats at a glance** - total referrals, pending referrals (in cooling period), redeemable credits, and redeemed credits +- **Referral history table** with status badges for each referral: + - **Pending** - within the 14-day cooling period + - **Redeemable** - cooling period complete, ready to redeem + - **Redeemed** - credit has been claimed + - **Voided** - referral was cancelled (e.g. due to a refund) + +## Refund Handling + +- If a referred customer refunds **within the 14-day cooling period**, the pending credit is automatically voided +- If a refund occurs **after credit has already been redeemed**, the referral is flagged for admin review diff --git a/docs/src/en/features/api-form-inputs.md b/docs/src/en/features/api-form-inputs.md new file mode 100644 index 0000000..0b8b021 --- /dev/null +++ b/docs/src/en/features/api-form-inputs.md @@ -0,0 +1,191 @@ +# API-Based Form Inputs + +API-based form inputs allow "String Select" fields in your ticket forms to fetch their options dynamically from an external API endpoint. Instead of using a fixed list of options, the select menu can show personalised or real-time options based on the user opening the ticket. + +This is useful when your options change frequently, depend on external data, or need to be tailored to the individual user. For example, you could show a list of a user's active subscriptions, their linked game characters, or the current set of available support categories from your own system. + +## How It Works + +1. A user clicks a ticket panel button and the form is displayed +2. For any String Select field with API config enabled, Tickets sends a request to your configured endpoint +3. Your endpoint returns a JSON array of options +4. The options are displayed in the select menu for the user to choose from + +If the endpoint is unreachable, returns an error, or returns no options, a fallback message is displayed instead. + +## Setting up API-Based Inputs + +Head over to the [web dashboard](https://dashboard.tickets.bot), select your server, and navigate to the **Forms** page. + +### Step 1: Add a String Select Field + +Create a new form or edit an existing one. Add a field with the type **String Select** (or edit an existing String Select field). + +### Step 2: Enable API Config + +Next to the **Required** toggle, you will see an **API Config** toggle. Turn this on to reveal the API configuration options. + +### Step 3: Configure the Endpoint + +Fill in the following settings: + +| Setting | Description | +| ------- | ----------- | +| **API Endpoint URL** | The URL that Tickets will call to fetch the select options. Supports [placeholders](#placeholders) in the path and query string. | +| **HTTP Method** | The HTTP method to use for the request. Supported methods: GET or POST. | +| **Cache Duration** | How long (in seconds) to cache the response. Set to `0` to disable caching and always fetch fresh options. | +| **No Options Message** | The text shown in the select menu if the API returns no options or encounters an error. Defaults to "No options available". | + +The URL must use `http` or `https`, cannot point to `discord.com` or `discord.gg`, and cannot +contain a placeholder in the domain - only in the path or query string. + +### Step 4: Add Headers (optional) + +If your API requires authentication or custom headers, click to add headers. Each header has three fields: + +- **Name**: The header name (e.g. `X-Api-Key`) +- **Value**: The header value (e.g. `your-api-key`). Supports [placeholders](#placeholders). +- **Sensitive**: When enabled, the header value is masked in the web dashboard after saving and cannot be read back. Use this for API keys and other secrets. Press **Replace** to enter a new value. + +Some header names are reserved and are dropped before the request is sent, including +`Authorization`, `Cookie`, `Host`, `Content-Type` and anything starting with `X-Forwarded-`, +`X-Proxy-` or `CF-`. Use a custom header name such as `X-Api-Key` for credentials. + +### Step 5: Request Body (optional, POST only) + +When the method is **POST**, Tickets sends every [placeholder](#placeholders) value as a JSON body: + +```json +{ + "guild_id": "1071167333265047653", + "panel_title": "Billing", + "user_id": "1325579039888511056", + "user_locale": "en-US", + "user_nickname": "Tyler", + "user_permission_level": "support", + "user_roles": ["1326631159987175577", "1330545905211932672"], + "username": "tyler" +} +``` + +`user_roles` is a JSON array here rather than the comma-separated string the `%user_roles%` +placeholder produces, and is `[]` when the user has no roles. Every other value is a string. + +To send a different shape, turn on **Custom body** and write your own JSON: + +```json +{ + "discord_id": "%user_id%", + "server": "%guild_id%", + "display_name": "%user_nickname%", + "roles": "%user_roles%" +} +``` + +A custom body must be valid JSON once placeholders are filled in. The dashboard checks this when +you save. GET requests cannot carry a body. + +## API Response Format + +Your endpoint must return a JSON array of objects. Each object represents one option in the select menu. + +```json +[ + { + "label": "Option A", + "value": "option_a", + "description": "An optional description shown below the label" + }, + { + "label": "Option B", + "value": "option_b" + } +] +``` + +### Fields + +| Field | Required | Description | +| ----- | -------- | ----------- | +| `label` | Yes | The text displayed in the select menu for this option. | +| `value` | Yes | The value submitted when the user selects this option. | +| `description` | No | Additional text shown below the label in the select menu. | + +Options with an empty `label` or `value` are silently skipped. + +## Placeholders + +These placeholders can be used in the API Endpoint URL, header values, and the request body. The +dashboard lists them under **Available placeholders** next to the endpoint URL. + +| Placeholder | Replaced With | +| ----------- | ------------- | +| `%user_id%` | Discord user ID of the person opening the ticket | +| `%username%` | Discord username | +| `%user_nickname%` | Server nickname, falls back to the username | +| `%user_roles%` | Role IDs, comma-separated with no spaces (`123,456`). Empty if the user has no roles | +| `%user_permission_level%` | `everyone`, `support` or `admin` | +| `%user_locale%` | The user's Discord language, as a locale code (`en-US`) | +| `%guild_id%` | Discord server ID | +| `%panel_title%` | Title of the panel the ticket is being opened from | + +Options are fetched before the ticket exists, so there is no ticket or channel placeholder. + +## Error Handling + +If any of the following occur, the select menu will display a single option containing the **No Options Message** text: + +- The API endpoint is unreachable or times out +- The API returns a non-success HTTP status code +- The API returns an empty array +- The API returns a response that is not valid JSON +- A custom request body does not produce valid JSON once placeholders are filled in + +The rest of the form still opens normally; only the affected select menu shows the fallback. + +## Example + +Suppose you run a game server and want users to select one of their linked characters when opening a support ticket. You could configure: + +- **API Endpoint URL**: `https://api.example.com/characters?discord_id=%user_id%` +- **HTTP Method**: GET +- **Cache Duration**: 60 (cache for one minute) +- **No Options Message**: "No linked characters found" + +With a header: + +- **Name**: `X-Api-Key` +- **Value**: `your-api-key` +- **Sensitive**: Enabled + +Your API would return: + +```json +[ + { + "label": "SwordMaster42", + "value": "char_001", + "description": "Level 85 Warrior" + }, + { + "label": "MageOfDoom", + "value": "char_002", + "description": "Level 72 Mage" + } +] +``` + +The user would then see a select menu with their two characters listed. + +## Security + +- All API requests are made through a secure proxy. Requests are not sent directly from the Tickets infrastructure to your endpoint. Requests to private network addresses are blocked. +- Reserved headers (`Authorization`, `Cookie`, `Host`, `User-Agent`, `Content-Type` and proxy-related names) are filtered out before the request is sent. +- Sensitive header values are masked in the web dashboard and are not returned by the API, so they cannot be read after being saved. +- Placeholders are rejected in the domain portion of the endpoint URL, so a value filled in at runtime cannot redirect the request to an unapproved host. +- Placeholder values are escaped for the context they appear in, so user-supplied text cannot inject extra query parameters, header lines or JSON fields. + +## Related + +- [Forms](/dashboard/forms) for general form setup and configuration +- [Building Integrations](../integrations/building-integrations) for another way to pull external data into tickets using welcome message placeholders diff --git a/docs/src/en/features/close-requests.md b/docs/src/en/features/close-requests.md new file mode 100644 index 0000000..18db0fa --- /dev/null +++ b/docs/src/en/features/close-requests.md @@ -0,0 +1,36 @@ +# Close Requests + +Close requests let you ask the ticket opener to confirm that their issue is resolved before the ticket is closed. The user sees Accept and Deny buttons in Discord. + +## Using Close Requests + +### From Discord + +Use the `/closerequest` command inside a ticket. The bot sends an embed with Accept and Deny buttons to the user. + +![Close Request](/img/close_request.webp) + +If the user denies the request, the message is updated to reflect their choice and the ticket stays open. + +![Denied](/img/close_request_deny.webp) + +### Close Delay + +You can specify a time (in hours) after which the ticket closes automatically if the user has not responded. A reason can also be provided. + +![Params](/img/close_request_params.webp) + +If no delay is specified, the ticket remains open until the user explicitly accepts or denies the request. + +:::info Excluded Tickets Ignore Delays +If a ticket is excluded from auto-close via `/autoclose exclude`, close request delays will not apply, even if provided. +::: + +### From the Dashboard + +You can also send close requests from the web dashboard: + +- **Individual tickets**: open a ticket on the [Tickets](/dashboard/tickets) page and use the **Send Close Request** section. You can provide a reason and an auto-close delay in hours. +- **Bulk**: select multiple tickets on the Tickets page, expand the **Bulk Actions** section, and click **Send Close Request**. The same reason and delay options are available. + +[Learn more about managing tickets from the dashboard](/dashboard/tickets). diff --git a/docs/src/en/features/introduction.md b/docs/src/en/features/introduction.md new file mode 100644 index 0000000..a212bd9 --- /dev/null +++ b/docs/src/en/features/introduction.md @@ -0,0 +1,22 @@ +# Features + +The core capabilities of the ticket system, beyond opening and closing tickets. Some of these are configured per panel in the [panel editor](/dashboard/ticket-panels), some under [Server Settings](/dashboard/settings/settings), and a few are premium-only, as listed in the [perks table](/premium/perks). + +## Pages in This Chapter + +| Page | What it covers | +| ---- | -------------- | +| [Affiliate Programme](/features/affiliate-programme) | Earning premium credits by referring new users with your own discount code | +| [Auto Close](/dashboard/ticket-panels#auto-close) | Closing tickets automatically on inactivity, on no first response, or when the opener leaves the server | +| [Awaiting User Response](/dashboard/settings/awaiting-user-response) | Moving a channel-mode ticket to a separate Discord category while it waits on the user | +| [Claiming Tickets](/dashboard/settings/claiming-tickets) | Letting one staff member take ownership of a ticket so replies stay focused, in channel mode | +| [Close Requests](/features/close-requests) | Asking the ticket opener to confirm their issue is resolved, with Accept and Deny buttons | +| [Exit Survey](/dashboard/settings/exit-survey) | Presenting a form after closing to collect written feedback alongside the star rating | +| [Forms](/dashboard/forms) | Collecting information from users with a modal before the ticket channel is created | +| [API-Based Form Inputs](/features/api-form-inputs) | Populating a String Select form field from your own API so options are per-user or real-time | +| [Knowledge Base](/dashboard/knowledge-base) | Publishing help articles that users can search, and that the bot can suggest when a ticket opens | +| [Multi Panels](/dashboard/multi-panels) | Combining several ticket panels into one embed with multiple buttons or a dropdown | +| [Start Ticket from Message](/dashboard/settings/start-ticket-from-message) | Opening a ticket from any message via Discord's right-click context menu | +| [Support Hours](/features/support-hours) | Restricting when a panel accepts new tickets, with a per-day schedule and timezone | +| [Thread Mode](/dashboard/settings/thread-mode) | Creating tickets as private threads instead of separate channels, and how the two modes compare | +| [User Feedback](/dashboard/settings/user-feedback) | Letting users leave a star rating after their ticket is closed | diff --git a/docs/src/en/features/support-hours.md b/docs/src/en/features/support-hours.md new file mode 100644 index 0000000..9109c8a --- /dev/null +++ b/docs/src/en/features/support-hours.md @@ -0,0 +1,53 @@ +# Support Hours + +Support hours let you restrict when tickets can be opened on a panel. You configure a schedule for each day of the week with a start and end time, and choose what happens when a user tries to open a ticket outside of those hours. + +## Configuration + +Support hours are configured per panel. Open any panel from the [Panels](/dashboard/ticket-panels) page and expand the **Support Hours** section. + +[Learn more about the panel editor](/dashboard/ticket-panels#support-hours). + +### Timezone + +Select the timezone your support hours are based on. This should match the timezone your support team operates in. Any valid IANA timezone is supported (e.g. `America/New_York`, `Europe/London`, `UTC`). The form displays the current time in the selected timezone for reference. + +### Schedule + +For each day of the week, you can: + +- **Enable or disable** the day. Disabled days mean the panel is closed all day. +- Set a **start time** and **end time** for the window during which tickets can be opened. + +If no days are enabled, support hours are effectively disabled and the panel is available 24/7. + +#### Presets + +The form provides quick preset buttons: + +- **Business hours** sets Monday to Friday, 09:00 to 17:00. +- **Copy to weekdays** copies Monday's hours to Tuesday through Friday. +- **Set 24/7** clears all restrictions. + +## Out-of-Hours Behaviour + +When a user tries to open a ticket outside the configured hours, the panel's behaviour depends on the **Out-of-hours behaviour** setting: + +| Option | Behaviour | +|---|---| +| **Block ticket creation** | The user cannot open a ticket. They see an embed with a customisable title, message, and colour explaining that support is currently unavailable. This is the default. | +| **Allow with warning** | The user can still open a ticket, but receives a warning message that support is currently outside of normal hours and response times may be longer. | + +### Customisation + +You can customise the embed shown to users who interact with the panel outside of support hours: + +- **Embed Colour** - the accent colour of the embed. +- **Custom out-of-hours title** - the embed title. Defaults to "This panel is currently closed". +- **Custom out-of-hours message** - the embed description (maximum 500 characters). + +## Premium + +Free servers can configure support hours on **1 panel**. Premium servers can configure support hours on **unlimited panels**. + +[Learn more about premium](https://tickets.bot/premium). diff --git a/docs/src/en/index.md b/docs/src/en/index.md new file mode 100644 index 0000000..722c894 --- /dev/null +++ b/docs/src/en/index.md @@ -0,0 +1,31 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: Tickets + text: Official Documentation + tagline: + image: + src: /logov2-round.png + alt: Tickets Logo + actions: + - theme: brand + text: Start reading the documentation + link: /introduction/introduction + - theme: alt + text: Join our support server + link: https://discord.gg/ticketsbot + +features: + - icon: '' + title: Feature Rich + details: We are always innovating and creating new features exclusive to Tickets to extend the benefits gained from using the service. + - icon: '' + title: Bleeding Edge + details: Tickets is always the first bot to make use of new Discord features. We were the first bot to offer slash commands, and the first ticket bot to offer buttons. + - icon: '' + title: Reliable + details: Tickets is built with redundancy and scalability as a core competency. In fact, we designed almost everything from the ground up to ensure that the bot can run for months on end with zero downtime. + +--- diff --git a/docs/src/en/integrations/building-integrations.md b/docs/src/en/integrations/building-integrations.md new file mode 100644 index 0000000..eba6597 --- /dev/null +++ b/docs/src/en/integrations/building-integrations.md @@ -0,0 +1,269 @@ +# Building Integrations + +Integrations let you include information from your own web server or a third-party API directly in ticket welcome messages. + +In this guide we build a custom integration from scratch: a sample API, dashboard setup, and how to use the placeholders in a panel welcome message. + +## What can I use integrations for? + +If you run a service where users link Discord accounts (for example via [Discord OAuth](https://discord.com/developers/docs/topics/oauth2)), you can expose an HTTP endpoint that Tickets calls when a ticket opens and map the response into welcome-message placeholders. + +A simple example is a forum: when a user opens a ticket, you could show their forum username automatically. + +Integrations do not have to return user-specific data - any JSON your endpoint returns can be mapped to placeholders. + +## Limits + +| Limit | Value | +| ----- | ----- | +| Integrations created per user | 5 | +| Active integrations per server | 5 | +| Secrets per integration | 5 | +| Request headers per integration | 5 | +| Placeholders per integration | 15 | +| Secret value length | 1–255 characters | +| Integration name | 1–32 characters | +| Integration description | 1–255 characters | + +Webhook and validation URLs must use `http` or `https` and cannot point to `discord.com` or `discord.gg`. + +## Background Setup + +Suppose we run a game where users link Discord accounts. We want to show usernames, scores, and status in the welcome message when they open a ticket. + +The following Express server serves example JSON at `https://example.tickets.bot`. It accepts **POST** requests with a JSON body (recommended - see [Ticket-open requests](#ticket-open-requests)): + +```js +const express = require("express"); +const app = express(); + +app.use(express.json()); + +const users = { + "1325579039888511056": { + online_status: "Online", + user: { + username: "Tyler", + account_created_year: 2019, + scores: { + high_score: 3000, + last_score: 400, + }, + }, + }, +}; + +app.post("/lookup", (req, res) => { + const user = users[req.body.user_id]; + res.json(user ?? {}); +}); + +app.listen(process.env.PORT, () => console.log("Listening...")); +``` + +If the user exists, the server returns their object; otherwise it returns `{}`. Missing values in the response map to `N/A` in welcome messages (see [Responses](#responses)). + +Example request: + +```bash +curl -X POST https://example.tickets.bot/lookup \ + -H "Content-Type: application/json" \ + -d '{"user_id":"1325579039888511056","guild_id":"1071167333265047653"}' | jq . +``` + +Your integration **must** return JSON. Other formats are not supported. Nested objects are fine; **top-level JSON arrays are not** - join arrays to strings before returning. + +## Creating Your Integration + +Open the [web dashboard](https://dashboard.tickets.bot), select a server, and go to **Integrations** in the sidebar. Press **Create Integration**: + +![Navigation](/img/integrations/navbar.webp) + +Fill in name, description, and optionally a logo image URL and privacy policy URL (recommended for public integrations). Press **Continue**. + +![Metadata](/img/integrations/metadata.webp) + +### HTTP request + +Configure how Tickets calls your server when a ticket opens: + +![Request URL](/img/integrations/request_url.webp) + +Set the request URL to your endpoint. For this tutorial use **POST** with URL `https://example.tickets.bot/lookup`. + +You can use these placeholders in the URL and header values: + +| Placeholder | Replaced with | +| ----------- | -------------- | +| `%user_id%` | Discord user ID of the ticket opener | +| `%guild_id%` | Discord server ID | +| `%secret_name%` | Per-server secret value (name matches your secret definition) | + +GET is also supported (query string substitution only, no body). POST is recommended so you receive a structured ticket payload. + +### Ticket-open requests + +When the HTTP method is **POST**, Tickets sends a JSON body like: + +```json +{ + "guild_id": "1071167333265047653", + "user_id": "1325579039888511056", + "ticket_id": 30, + "ticket_channel_id": "1326292668053192704", + "is_new_ticket": true, + "form_data": { + "What is your question?": "I have a problem with XYZ", + "What is your email address?": "user@example.com" + } +} +``` + +| Field | Notes | +| ----- | ----- | +| `guild_id`, `user_id` | String snowflakes | +| `ticket_id` | Numeric ticket ID | +| `ticket_channel_id` | String snowflake | +| `is_new_ticket` | Always `true` today (integrations run only when a ticket is opened) | +| `form_data` | Only for **non-public** integrations. Keys are form **question labels**, not internal field IDs | + +Requests are sent through the [secure-proxy](https://github.com/TicketsBot-cloud/tickets.rs/tree/master/secure-proxy), not directly from the bot. + +### Responses + +- Return `Content-Type: application/json`. +- Map fields to placeholders using dot paths (for example `user.username` β†’ `%player_name%`). +- If a JSON path is missing, the placeholder becomes `N/A` in the welcome message. +- Do not return top-level arrays. + +### Headers and Secrets + +Add authentication or other headers under **Request Headers**. Use a custom header name for API keys - the `Authorization` header is blocked and will not be sent. + +![Headers](/img/integrations/headers.webp) + +**Secrets** let each server supply its own values (for example an API key). Define a secret name and description; users enter the value when they add the integration to their server. Reference secrets in URLs or headers with `%secret_name%`: + +![Completed](/img/integrations/request_completed.webp) + +![Secrets example](/img/integrations/secrets_example.webp) + +**Important:** + +- Secret values are sent to **your** server. You can change the webhook URL at any time. +- After saving, secret values **cannot be viewed again** in the web dashboard - users must re-enter them to update. +- On the public integration view page, only the webhook **domain** is shown, not the full URL. + +Prefer passing secrets in **headers** (for example `X-MyService-Api-Key: %api_key%`) rather than query strings. + +### Secret validation + +For **public, staff-approved** integrations you can set a **validation URL**. When a server admin activates the integration, Tickets POSTs to that URL to verify the secrets before saving. + +The request includes: + +- **JSON body** - `guild_id` and `user_id` (Discord snowflakes as strings), plus `{ "secret_name": "value", ... }` for each secret +- **Headers** - your configured headers with `%secret_name%`, `%guild_id%`, and `%user_id%` placeholders replaced +- **Validation URL** - `%guild_id%`, `%user_id%`, and `%secret_name%` placeholders in the URL are also replaced + +Success: any **2xx** status code (body ignored). + +Failure: any non-2xx status. You may return JSON with an `error` field; the message is shown to the admin: + +```json +{ + "error": "Your API key is invalid." +} +``` + +The validation URL must share the same registrable domain as the webhook URL. + +### Placeholders + +Map JSON response fields to welcome-message placeholders: + +![Placeholder Creation](/img/integrations/placeholder_creation.webp) + +Example response: + +```json +{ + "online_status": "Online", + "user": { + "username": "Ryan", + "account_created_year": 2019, + "scores": { + "high_score": 3000, + "last_score": 400 + } + } +} +``` + +| JSON path | Example value | Example placeholder name | +| --------- | ------------- | ------------------------ | +| `online_status` | `Online` | `%status%` | +| `user.username` | `Ryan` | `%player_name%` | +| `user.scores.high_score` | `3000` | `%high_score%` | + +Placeholder names are independent of JSON paths. + +Press `Create`, then review the integration preview: + +![Integration Preview](/img/integrations/integration_preview.webp) + +Press `Add to server` to activate it on your server (enter secrets if required). + +## Installing a Community Integration + +Server admins can browse **available integrations** on the Integrations page, open an integration, and press `Add to server`. After activation, use `Configure` to update secrets (re-enter all values) or `Remove` to deactivate. + +To publish your own integration: create it, then use **Make Public** on the manage page. Staff review it before it appears in the public list. + +## Using Placeholders + +After the integration is active on your server, add placeholders to a panel welcome message. Open **Ticket Panels**, edit a panel, and open the welcome message editor: + +![Welcome Message Editor](/img/integrations/edit_welcome_message.webp) + +![Example Embed](/img/integrations/example_embed.webp) + +Open a ticket to test: + +![Example Success](/img/integrations/example_success.webp) + +Custom integration placeholders only apply to integrations you have added and configured. Each integration defines its own placeholder names on its view page. + +## Cloudflare Workers (optional) + +You do not need a worker to build an integration - any HTTPS JSON endpoint is enough. If an upstream API is hard to map directly (nested arrays, fields to filter), you can deploy a [Cloudflare Worker](https://workers.cloudflare.com/) and use its URL as your integration request URL. See [Cloudflare Workers](./cloudflare-workers). + +If you want Tickets to host your integration as a first-party public option (not just your own URL), that is a separate process via pull request on GitHub; see [hosting a public integration with Tickets](./cloudflare-workers#hosting-a-public-integration-with-tickets). + +## Need Help? + +Ask in our [Discord server](https://discord.gg/ticketsbot). + +## Security + +We proxy all integration HTTP requests and block private-network targets. Integration traffic should arrive via Cloudflare (AS13335). + +We are particularly interested in reports about: + +- Accessing internal services +- Exposing origin IPs of our nodes +- Accessing secret values of other servers +- Accessing another user's IP via integration logos + +Integration logos are proxied through dedicated image CDN nodes (AS16276 / OVH), separate from our internal network. Logos on the create/edit pages are not proxied (only visible to the integration author). + +When performing security research: + +- Confirm assets are in scope and operated by us. If unsure, ask in Discord. +- Do not use automated scanners. +- Do not run (D)DoS or resource-exhaustion tests. + +Open-source components: + +- Integration proxy: [secure-proxy](https://github.com/TicketsBot-cloud/tickets.rs/tree/master/secure-proxy), [global-resolver](https://github.com/TicketsBot-cloud/tickets.rs/tree/master/global-resolver) +- Image proxy: [image-proxy](https://github.com/TicketsBot-cloud/tickets.rs/tree/master/image-proxy), [global-resolver](https://github.com/TicketsBot-cloud/tickets.rs/tree/master/global-resolver) diff --git a/docs/src/en/integrations/cloudflare-workers.md b/docs/src/en/integrations/cloudflare-workers.md new file mode 100644 index 0000000..4a2b29a --- /dev/null +++ b/docs/src/en/integrations/cloudflare-workers.md @@ -0,0 +1,36 @@ +# Cloudflare Workers + +[Cloudflare Workers](https://workers.cloudflare.com/) let you run serverless JavaScript at the edge. They are optional - you do **not** need a worker to create a [custom integration](./building-integrations). Any HTTPS endpoint that returns JSON works. + +## When a Worker Helps + +Tickets maps placeholders from exact JSON keys using dot paths. It cannot search arrays or reshape responses for you. + +If an upstream API returns data in an awkward shape - for example a list of players you must search by Discord ID - a small worker can call that API, pick the right record, and return a flat JSON object your integration placeholders can read: + +```json +{ + "username": "Username", + "steam_profile_url": "https://steamcommunity.com/profiles/76561198000000000" +} +``` + +Returning full URLs as field values (rather than IDs alone) lets server owners paste a single placeholder into welcome messages. + +If you deploy a worker, register its URL as the **request URL** when creating your custom integration in the web dashboard. Your worker should accept the [ticket-open request format](./building-integrations#ticket-open-requests) described in Building Integrations (POST with `user_id`, `guild_id`, and so on). + +Workers can use [key-value storage](https://developers.cloudflare.com/workers/learning/how-kv-works/) to cache slow-changing data and reduce upstream API usage. + +The [Cloudflare Workers docs](https://developers.cloudflare.com/workers/) cover deployment and runtime APIs. + +## Hosting a Public Integration with Tickets + +This is separate from running your own worker for a **custom** integration. + +If you want Tickets to **host** an integration as a first-party, publicly listed option (maintained in our infrastructure rather than only on your own URL), open a pull request on the [TicketsBot integrations repository](https://github.com/TicketsBot-cloud/integrations). + +Accepted workers in that repo must follow **[INTEGRATION_STANDARDS.md](https://github.com/TicketsBot-cloud/integrations/blob/main/INTEGRATION_STANDARDS.md)** - that guide is only required for submissions there, not for ordinary dashboard integrations. It covers auth guards, Sentry, `/validate`, caching, response conventions, and `wrangler.toml` setup. + +Before contributing, read the repository [README](https://github.com/TicketsBot-cloud/integrations/blob/main/README.md) for deploy workflow and proxy routing. Reference implementations live under [`bloxlink/`](https://github.com/TicketsBot-cloud/integrations/tree/main/bloxlink) and [`fivem/`](https://github.com/TicketsBot-cloud/integrations/tree/main/fivem). + +We review hosted integration PRs before they go live. For help, ask in our [Discord server](https://discord.gg/ticketsbot). diff --git a/docs/src/en/integrations/introduction.md b/docs/src/en/integrations/introduction.md new file mode 100644 index 0000000..9c5e866 --- /dev/null +++ b/docs/src/en/integrations/introduction.md @@ -0,0 +1,37 @@ +# Integrations + +Integrations let you pull data from an external HTTP API into ticket welcome messages. When someone opens a ticket, Tickets calls your endpoint, reads the JSON response, and substitutes configured `%placeholders%` in the welcome message. + +## How It Works + +1. An **integration author** creates an integration in the [web dashboard](https://dashboard.tickets.bot) by navigating to **Dashboard** > your server > **Integrations** (in the Setup sidebar group). They configure a request URL, optional secrets, and placeholder mappings. +2. A **server admin** adds the integration to their server and supplies any required secret values (for example, an API key). +3. When a ticket is opened, Tickets sends an HTTP request to the integration URL (via the [secure-proxy](https://github.com/TicketsBot-cloud/tickets.rs/tree/master/secure-proxy)), parses the JSON response, and fills in welcome-message placeholders. + +All outbound integration traffic is proxied for security. Requests should reach your server from Cloudflare (AS13335), not directly from Tickets nodes. + +## Who This Chapter Is For + +| Audience | Start here | +| -------- | ---------- | +| Server admins installing a community integration | [Building Integrations](./building-integrations): activate and configure sections | +| Developers building a custom HTTP endpoint | [Building Integrations](./building-integrations) | +| Developers who need to transform an awkward API (optional) | [Cloudflare Workers](./cloudflare-workers) | +| Teams asking Tickets to host a first-party integration | [Cloudflare Workers](./cloudflare-workers#hosting-a-public-integration-with-tickets), then PR on GitHub | + +## Pages in This Chapter + +| Page | What it covers | +| ---- | -------------- | +| [Building Integrations](./building-integrations) | Creating, publishing, and installing custom integrations through the web dashboard, including the HTTP request contract your server must implement | +| [Cloudflare Workers](./cloudflare-workers) | Optional serverless adapters for complex APIs, plus how to submit a worker for Tickets to host publicly | + +## Limits + +| Limit | Value | +| ----- | ----- | +| Integrations created per user | 5 | +| Active integrations per server | 5 | +| Secrets per integration | 5 | +| Request headers per integration | 5 | +| Placeholders per integration | 15 | diff --git a/docs/src/en/introduction/introduction.md b/docs/src/en/introduction/introduction.md new file mode 100644 index 0000000..13361b5 --- /dev/null +++ b/docs/src/en/introduction/introduction.md @@ -0,0 +1,30 @@ +# Introduction + +## Tickets Bot Official Documentation + +Dive into the vast world of Tickets! This documentation aims to help you with: + +* Easily setting up the bot +* Explaining each feature of the bot in detail +* Setting up each feature individually +* Correctly using the bot's commands +* Fixing issues with permissions and other common problems + + + +## This is a Living Document + +Updates to the documentation are made frequently. + +Maintained with by awesome people from the community! + +:::tip Report Documentation Issues +If you find any issues in the documentation, things like typos and outdated information, then please let us know in our [support server](https://discord.gg/ticketsbot). +::: + +Get started with setting up the bot by going to the [first chapter](../setup/introduction) of the documentation. diff --git a/docs/src/en/miscellaneous/dashboard-no-permission.md b/docs/src/en/miscellaneous/dashboard-no-permission.md new file mode 100644 index 0000000..1d53de2 --- /dev/null +++ b/docs/src/en/miscellaneous/dashboard-no-permission.md @@ -0,0 +1,11 @@ +# Dashboard: No Permission + +When the bot is first added to the server, you may receive a `No Permission` warning on the web dashboard when trying to manage it. + +![No Permission Message](../../img/dashboard-no-permission.webp) + +This is because Tickets uses its own permission management system, and ignores any permissions you may have in the Discord server itself. + +In order to gain access to the web dashboard for your server, ask the **server owner** to add you as a bot admin using the `/addadmin @user` command. You can read more about the `/addadmin` command in [the command guide](../commands/add-admin-support). + +![Usage of /addadmin Command](../../img/addadmin-command.webp) diff --git a/docs/src/en/miscellaneous/introduction.md b/docs/src/en/miscellaneous/introduction.md new file mode 100644 index 0000000..bc4db03 --- /dev/null +++ b/docs/src/en/miscellaneous/introduction.md @@ -0,0 +1,14 @@ +# Miscellaneous + +Reference material and troubleshooting that does not belong to a single chapter: official links, placeholder syntax, permission requirements, and fixes for the problems people hit most often. + +## Pages in This Chapter + +| Page | What it covers | +| ---- | -------------- | +| [Official Tickets Links](/miscellaneous/official-links) | The genuine website, invite, dashboard, documentation, and support server URLs | +| [Patreon Links/Articles](/miscellaneous/patreon) | Cancelling a subscription, linking Discord to Patreon, and where to take other billing issues | +| [Bot Permissions Explained](/miscellaneous/permissions-explained) | What each Discord permission the bot requests is actually used for, and which are mandatory | +| [Placeholders](/miscellaneous/placeholders) | Every placeholder available in welcome messages, naming schemes, tags, and integrations | +| [Translate the Bot](/miscellaneous/translate) | Setting your language with `/language`, and helping translate the bot into more languages | +| [Dashboard: No Permission](/miscellaneous/dashboard-no-permission) | Why the dashboard denies access even to server admins, and how `/addadmin` fixes it | diff --git a/docs/src/en/miscellaneous/official-links.md b/docs/src/en/miscellaneous/official-links.md new file mode 100644 index 0000000..bd67a3a --- /dev/null +++ b/docs/src/en/miscellaneous/official-links.md @@ -0,0 +1,21 @@ +# Official Tickets Links + +## Website + +[tickets.bot](https://tickets.bot) + +## Invite the Bot + +[invite.tickets.bot](https://invite.tickets.bot) + +## Dashboard + +[dashboard.tickets.bot](https://dashboard.tickets.bot) + +## Documentation + +[docs.tickets.bot](https://docs.tickets.bot) + +## Discord Support Server + +[Support Server](https://discord.gg/ticketsbot) diff --git a/src/miscellaneous/patreon.md b/docs/src/en/miscellaneous/patreon.md similarity index 53% rename from src/miscellaneous/patreon.md rename to docs/src/en/miscellaneous/patreon.md index 2a72ead..29de70c 100644 --- a/src/miscellaneous/patreon.md +++ b/docs/src/en/miscellaneous/patreon.md @@ -1,11 +1,13 @@ -# Patreon Guides -*** +# Patreon Links/Articles + +## How to Cancel Subscription -### How to Cancel Subscription [Patreon Support Article](https://support.patreon.com/hc/en-us/articles/360005502572-How-to-cancel) -### How to Link Discord and Patreon +## How to Link Discord and Patreon + [Patreon Support Article](https://support.patreon.com/hc/en-us/articles/212052266-Get-my-Discord-role) -### Other Patreon Issues -[Patreon Support Center](https://support.patreon.com/hc/en-us) \ No newline at end of file +## Other Patreon Issues + +[Patreon Support Center](https://support.patreon.com/hc/en-us) diff --git a/docs/src/en/miscellaneous/permissions-explained.md b/docs/src/en/miscellaneous/permissions-explained.md new file mode 100644 index 0000000..14747bd --- /dev/null +++ b/docs/src/en/miscellaneous/permissions-explained.md @@ -0,0 +1,53 @@ +# Bot Permissions Explained + +For the bot to work fully it needs many permissions. + +Either you manually give it all the needed permissions or you give it the `Administrator` permission which will just make it "work". For an explanation of how to adjust permissions, [check the Discord help article](https://support.discord.com/hc/en-us/articles/206029707-How-do-I-set-up-Permissions). + +Below is a rough explanation of what each permission is used for: + +- `View Channels`: Allows the bot to view the content of a channel. + +- `Manage Channels`: Allows the bot to create, rename, recategorise, and delete channels. + +- `Manage Roles`: Allows the bot to create and edit roles, give and take away roles from users, and adjust a channel's role permissions. + +- `Manage Webhooks`: Allows the bot to create webhooks for transcripts, and for staff to use the web dashboard to send messages or tags in open tickets. + +- `Send Messages`: Allows the bot to send messages in channels. + +- `Send TTS Messages`: Allows the bot to assign this permission to ticket openers and staff members. + +- `Send Messages in Threads`: Allows the bot to send messages in threads. + +- `Create Public Threads`: Allows the bot to create public threads. + +- `Create Private Threads`: Allows the bot to create private threads, such as thread mode tickets and the `/notes` command for channel tickets. + +- `Embed Links`: Allows the bot to send ticket panels, welcome messages, and tags that include an embedded message. + +- `Attach Files`: Allows the bot to assign this permission to ticket openers and staff members. + +- `Add Reactions`: Allows the bot to add the buttons to ticket panels, welcome messages, and all commands that use buttons. + +- `Use External Emojis`: Allows the bot to use non-server emojis in ticket panels, welcome messages, and tags. The bot must still be in the other server to use them. + +- `Pin Messages`: Allows the bot to pin the welcome message and its buttons on ticket creation. + +- `Mention @Everyone`: Allows the bot to mention everyone, here and all roles in a ticket. + +- `Manage Threads`: Allows the bot to create, rename, close, and delete threads. + +- `Read Message History`: Allows the bot to read all messages in a channel. + +- `Use Application Commands`: Allows the bot's slash commands to work. + +- `Use External Stickers`: Allows the bot to assign this permission to ticket openers and staff members. + +- `Send Voice Messages`: Allows the bot to assign this permission to ticket openers and staff members. + +These permissions are mandatory so that the bot can work. Any other permission can be denied for the bot to use since those aren't used by the bot. + +:::info Permissions Can Change +The used permissions can change when the bot gets a new update or feature. Please keep a lookout for an announcement about changed permissions in our [support server](https://discord.gg/ticketsbot). +::: diff --git a/docs/src/en/miscellaneous/placeholders.md b/docs/src/en/miscellaneous/placeholders.md new file mode 100644 index 0000000..1d7c098 --- /dev/null +++ b/docs/src/en/miscellaneous/placeholders.md @@ -0,0 +1,141 @@ +# Placeholders + +:::info Not Every Placeholder Works Everywhere +Support differs by placeholder type and by field. Check the **Fields** column, then [Where They Work](#where-they-work). +::: + +## Welcome Message Placeholders + +### Built-in + +#### User + +| Placeholder | Fields | Description | +| ----------- | ------ | ----------- | +| `%user%` | Text only | Mentions the user, will display nickname if set. | +| `%username%` | All | Display the user's name. | +| `%nickname%` | All | Display the user's server nickname. | +| `%user_id%` | All | Display the user's numeric ID. | +| `%avatar_url%` | URL only | The user's avatar image, falling back to Discord's default avatar. The dashboard preview shows the default avatar in its place. | +| `%discord_account_creation_date%` | Text only | The date and time that the user's Discord account was created. | +| `%discord_account_age%` | Text only | How long ago the user's Discord account was created. | + +#### Ticket + +| Placeholder | Fields | Description | +| ----------- | ------ | ----------- | +| `%ticket_id%` | All | Display the ticket's numeric ID. | +| `%channel%` | Text only | Mention the channel. | + +#### Server + +| Placeholder | Fields | Description | +| ----------- | ------ | ----------- | +| `%server%` | All | Display the server's name. | +| `%ticket_limit%` | All | Display the server's ticket limit. | + +#### Statistics + +| Placeholder | Fields | Description | +| ----------- | ------ | ----------- | +| `%open_tickets%` | All | Display the number of open tickets in the server. | +| `%total_tickets%` | All | Display the number of tickets that have ever been opened in the server. | +| `%user_open_tickets%` | All | Display the number of tickets that the user currently has open in the server. | +| `%user_total_tickets%` | All | Display the number of tickets that the user has ever opened in the server. | +| `%rating_count%` | All | Amount of feedback ratings you have received. | +| `%average_rating%` | All | Displays server's average feedback rating. | +| `%first_response_time_weekly%` * | All | Staff average first response time to tickets this week. | +| `%first_response_time_monthly%` * | All | Staff average first response time to tickets this month. | +| `%first_response_time_all_time%` * | All | Staff average first response time to tickets since the beginning. | + +:::info Premium Placeholders +Rows marked with * require [premium](https://tickets.bot/premium). +::: + +#### Date & Time + +| Placeholder | Fields | Description | +| ----------- | ------ | ----------- | +| `%time%` | Text only | Display the current time. | +| `%date%` | Text only | Display today's date. | +| `%datetime%` | Text only | Display the current date and time. | +| `%timestamp%` | All | Display the current Unix timestamp as a raw number. | +| `%date_days:N%` | Text only | Display a date `N` days from now. | +| `%date_days:N:FORMAT%` | Text only | Display a date `N` days from now with Discord format. | +| `%date_weeks:N%` | Text only | Display a date `N` weeks from now. | +| `%date_weeks:N:FORMAT%` | Text only | Display a date `N` weeks from now with Discord format. | +| `%date_months:N%` | Text only | Display a date `N` months from now. | +| `%date_months:N:FORMAT%` | Text only | Display a date `N` months from now with Discord format. | +| `%date_timestamp:UNIX%` | Text only | Convert a Unix timestamp to a date. | +| `%date_timestamp:UNIX:FORMAT%` | Text only | Convert a Unix timestamp to a date with Discord format. | +| `%timestamp_days:N%` | All | Display the raw Unix timestamp `N` days from now. | + +**N** - Number of days/weeks/months + +**UNIX** - Unix timestamp + +**FORMAT** - Discord format code: `d` (short date), `D` (long date), `t` (short time), `T` (long time), `f` (short date/time, default), `F` (long date/time), `R` (relative) + +### Where They Work + +Welcome message placeholders work in the message sent when a ticket is opened, and in tags. + +**All** - every part of the message: the content, and the embed's description, title, author name, footer text and field names and values. + +**Text only** - the message content, the embed description and embed field values. + +**URL only** - `%avatar_url%`, as the whole value of Title URL, Author URL, Author Icon URL, Image URL, Thumbnail URL or Footer Icon URL. On the icon and image fields the avatar shows as a picture; on Title URL and Author URL, which are links rather than images, clicking the title or the author name opens the avatar. + +Placeholders provided by your integrations behave like **All**. The title, author name, footer text and field names are capped at Discord's limits once the placeholders have been filled in - 256 characters for a title, author name or field name, and 2,048 for footer text - and anything past that is trimmed off. + +## Custom Naming Scheme Placeholders + +### Ticket + +| Placeholder | Description | +| ----------- | ----------- | +| `%id%` | Display the unique ticket ID. | +| `%id_padded%` | Display the unique ticket ID to 4 places. | +| `%claimed%` | Display whether the ticket is claimed or unclaimed. | +| `%claim_indicator%` | Display 🟒 if claimed or πŸ”΄ if unclaimed. | +| `%claimed_by%` | Display the claimer's username. | + +### User + +| Placeholder | Description | +| ----------- | ----------- | +| `%username%` | Display the user's name. | +| `%nickname%` | Display the user's nickname. | + +### Date & Time + +| Placeholder | Description | +| ----------- | ----------- | +| `%date%` | Display the current date in short format. | +| `%date:FORMAT%` | Display the current date with custom format. | +| `%date_days:N%` | Display a date `N` days from now. | +| `%date_days:N:FORMAT%` | Display a date `N` days from now with custom format. | +| `%date_weeks:N%` | Display a date `N` weeks from now. | +| `%date_weeks:N:FORMAT%` | Display a date `N` weeks from now with custom format. | +| `%date_months:N%` | Display a date `N` months from now. | +| `%date_months:N:FORMAT%` | Display a date `N` months from now with custom format. | +| `%date_timestamp:UNIX%` | Convert a Unix timestamp to a date. | +| `%date_timestamp:UNIX:FORMAT%` | Convert a Unix timestamp to a date with custom format. | + +**N** - Number of days/weeks/months + +**UNIX** - Unix timestamp + +**FORMAT** - Custom format using tokens: `yyyy` (4-digit year), `yy` (2-digit year), `mm` (zero-padded month), `m` (single-digit month), `dd` (zero-padded day), `d` (single-digit day). Use any separator, e.g. `yyyy-mm-dd`, `d/m/yy`, `dd.mm.yyyy`. Defaults to short format (`jan19`) if not specified. + +## Integrations + +Custom integration placeholders are defined by each integration's author. After you add an integration to your server, its available placeholders are listed on the integration's view page in the web dashboard. See the [building integrations](../integrations/building-integrations) page for more information. + +## API-Based Form Inputs + +String Select fields that fetch their options from an external API have their own set of placeholders. See the [API-based form inputs](../features/api-form-inputs#placeholders) page for the list. + +## Escaping Placeholders + +To display a placeholder as literal text instead of having it replaced, use backslashes: `\%placeholder\%` diff --git a/src/miscellaneous/translate.md b/docs/src/en/miscellaneous/translate.md similarity index 81% rename from src/miscellaneous/translate.md rename to docs/src/en/miscellaneous/translate.md index eb4d5ea..5ab7a0a 100644 --- a/src/miscellaneous/translate.md +++ b/docs/src/en/miscellaneous/translate.md @@ -1,19 +1,20 @@ -# Language Customisation -*** +# Translate the Bot Tickets is highly accessible, supporting over 30 languages at the time of writing. -Use the `/language` command and an embedded message with all supported languages will appear, select the language you want from one of the dropdowns below the message +Use the `/language` command and an embedded message with all supported languages will appear, select the language you want from one of the dropdowns below the message. -![Language list](../img/languages.webp) +![Language List](../../img/languages.webp) If you do not have a language selected, your server's preferred language will be used: -![Community language](../img/server_language.webp) +![Community Language](../../img/server_language.webp) ## Limitations + - The bot does not currently support server-level customisation of individual messages - Some messages, such as embed titles and some button messages, are not currently translated ## Help Wanted + If you are multilingual and interested in helping translate the bot into more languages (or getting languages to 100%), please join our [support server](https://discord.gg/ticketsbot) and let us know! diff --git a/docs/src/en/premium/introduction.md b/docs/src/en/premium/introduction.md new file mode 100644 index 0000000..29690c7 --- /dev/null +++ b/docs/src/en/premium/introduction.md @@ -0,0 +1,19 @@ +# Premium + +The bot is free to use, with three tiers layered on top that raise its limits and unlock extra dashboard features. **Voting Premium** is earned for free by running `/vote` in Discord. **Premium** and **Whitelabel** are subscriptions, available at [tickets.bot/premium](https://tickets.bot/premium) and billed through Patreon. + +Whitelabel includes everything in Premium and additionally lets you run the bot under your own name, avatar, and status, so your support system appears as your own bot rather than as Tickets. + +## Pages in This Chapter + +| Page | What it covers | +| ---- | -------------- | +| [Premium and Whitelabel Perks](/premium/perks) | Feature-by-feature comparison of every tier, and where each premium feature is configured in the dashboard | +| [Whitelabel Setup Guide](/premium/whitelabel-setup-guide) | The six-step process for creating your own Discord application and connecting its token to Tickets | +| [Whitelabel Resync Guide](/premium/whitelabel-resync-guide) | Fixing a whitelabel bot with missing slash commands, an offline status, or a wrong server count | +| [Whitelabel Removal Guide](/premium/whitelabel-removal-guide) | Disabling whitelabel, returning to the public Tickets bot, and resending your ticket panels | +| [Whitelabel Intents Guide](/premium/whitelabel-intents-guide) | Prepared answers for Discord's privileged intents application, required once your bot serves more than 10,000 users | + +:::tip Subscription Help +Billing is handled by Patreon. See [Patreon Links/Articles](/miscellaneous/patreon) for cancelling a subscription or linking your Discord and Patreon accounts. +::: diff --git a/docs/src/en/premium/perks.md b/docs/src/en/premium/perks.md new file mode 100644 index 0000000..5f1c38f --- /dev/null +++ b/docs/src/en/premium/perks.md @@ -0,0 +1,32 @@ +# Premium and Whitelabel Perks + +--- + +Premium features are configured in different places across the dashboard. Colour Scheme is found under [Server Settings](/dashboard/settings/settings). Auto Close, Exit Surveys, Awaiting Response Category, and Support Hours are configured per panel in the [panel editor](/dashboard/ticket-panels). Analytics is accessible from the [Analytics](/dashboard/analytics) page in the sidebar. + +## Tier Comparison + +| Feature | Free | Voting Premium | Premium | Whitelabel | +| ------- | :--: | :------------: | :-----: | :--------: | +| Unlimited tickets | | | | | +| Automatic ticket archives | | | | | +| Forms | | | | | +| Ticket claiming | | | | | +| Access control | | | | | +| Access to autoclose | On leave | On leave | | | +| Max ticket panels | 3 | 3 | Unlimited | Unlimited | +| Panel support hours | 1 | 1 | Unlimited | Unlimited | +| Message branding removal | - | Welcome message | | | +| Access to statistics | - | | | | +| Awaiting response category | - | - | | | +| Exit surveys | - | - | | | +| Customise embed colour | - | - | | | +| Live message updates on the web dashboard | - | - | | | +| Send messages directly from the web dashboard | - | - | | | +| Custom tag alias | - | - | | | +| Knowledge Base articles | 5 | 5 | Unlimited | Unlimited | +| Knowledge Base categories | 3 | 3 | Unlimited | Unlimited | +| KB auto-suggest on ticket open | - | - | | | +| Customise bot name | - | - | - | | +| Customise bot avatar | - | - | - | | +| Customise bot status | - | - | - | | diff --git a/src/premium/whitelabel-intents-application-guide.md b/docs/src/en/premium/whitelabel-intents-guide.md similarity index 92% rename from src/premium/whitelabel-intents-application-guide.md rename to docs/src/en/premium/whitelabel-intents-guide.md index 7b71f0a..b6ec07c 100644 --- a/src/premium/whitelabel-intents-application-guide.md +++ b/docs/src/en/premium/whitelabel-intents-guide.md @@ -1,12 +1,15 @@ -# Intents Request Guide -*** +# Whitelabel Intents Guide This document is to cover the questions you will need to answer if your bot serves more than 10,000 individual users. +:::tip How to Use This Page +Each answer below is provided as a copyable block. Copy the relevant block into the matching field on Discord's intents application form. +::: ## Application Details ### 1. What does your application do? Please be as detailed as possible, and feel free to include links to image or video examples. + ```txt This bot is a custom (white label) version of the Tickets Bot platform (https://tickets.bot), which serves as the hosting provider. Tickets Bot is a well-established Discord ticket and support management system. @@ -27,16 +30,19 @@ Full documentation with screenshots is available at https://docs.tickets.bot ``` ### 2. Do you have a public Privacy Policy telling your users about their data usage? + ```txt Yes ``` #### 2.1. Where is your Privacy Policy available? + ```txt The Privacy Policy is publicly available on the Tickets Bot website. ``` #### 2.2. Please share a link to your Privacy Policy. + ```txt https://tickets.bot/privacy ``` @@ -44,12 +50,13 @@ https://tickets.bot/privacy ## Privileged Gateway Intents 1. Which intents are you applying for, if any? - - [x] Server Members intent - - [x] Message Content intent + - Server Members intent + - Message Content intent ## Server Members Intent ### 1. Why do you need the Guild Members intent? + ```txt The bot requires the Server Members intent to operate its core ticket management functionality: @@ -62,10 +69,11 @@ Without this intent, the bot cannot resolve member roles or permissions, which a ``` ### 2. Please provide links to screenshots and/or videos that demonstrate your use case + ```txt Full documentation with screenshots demonstrating these features is available at: -- Ticket panels and role-based access: https://docs.tickets.bot/setup/panels +- Ticket panels and role-based access: https://docs.tickets.bot/setup/ticket-panels - Staff team management: https://docs.tickets.bot/dashboard/staff-teams - Ticket transcripts: https://docs.tickets.bot/dashboard/transcripts - General setup and configuration: https://docs.tickets.bot/setup/configuration @@ -74,15 +82,19 @@ Regarding data storage, ticket transcripts and associated data are retained for ``` ### 3. Are you storing any API Data off-platform (outside of Discord)? + ```txt Yes. ``` + #### 3.1. Are you storing API Data for 30 days or less? + ```txt No. ``` #### 3.2. How do users contact you to request deletion of their activity data? + ```txt Users can request deletion of their data through multiple channels: @@ -94,6 +106,7 @@ Full documentation on the GDPR process is available at https://docs.tickets.bot/ ``` #### 3.3. Are you encrypting the data that you store at rest, as is required by our developer policy? + ```txt Yes. Data is encrypted at rest. ``` @@ -101,20 +114,25 @@ Yes. Data is encrypted at rest. ## Message Content Intent ### 1. Can users opt-out of having their message content data tracked? + ```txt Yes. ``` ### 2. Are you storing message content data off-platform (outside of Discord)? + ```txt Yes. ``` + #### 2.1. Are you storing user message content data for 30 days or less? + ```txt No. ``` #### 2.2. How do users contact you to request deletion of their activity data? + ```txt Users can request deletion of their data through multiple channels: @@ -125,17 +143,20 @@ Users can request deletion of their data through multiple channels: Full documentation on the GDPR process is available at https://docs.tickets.bot/commands/gdpr ``` -#### 2.3 Are you encrypting the data that you store at rest, as is required by our developer policy? +#### 2.3. Are you encrypting the data that you store at rest, as is required by our developer policy? + ```txt Yes. Data is encrypted at rest. ``` ### 3. Will the message content data be used to train machine learning or AI Models? + ```txt No. ``` ### 4. Why do you need the Message Content intent? + ```txt The bot requires the Message Content intent to operate its core ticket management functionality: @@ -147,11 +168,12 @@ Without this intent, the bot cannot read message content in ticket channels, whi ``` ### 5. Please provide links to screenshots and/or videos that demonstrate your use case + ```txt Full documentation with screenshots demonstrating these features is available at: - Ticket transcripts: https://docs.tickets.bot/dashboard/transcripts - Tags (canned responses): https://docs.tickets.bot/dashboard/tags -- Thread-based ticket mode: https://docs.tickets.bot/features/thread-mode -- Ticket panel setup: https://docs.tickets.bot/setup/panels +- Thread-based ticket mode: https://docs.tickets.bot/dashboard/settings/thread-mode +- Ticket panel setup: https://docs.tickets.bot/setup/ticket-panels ``` diff --git a/docs/src/en/premium/whitelabel-removal-guide.md b/docs/src/en/premium/whitelabel-removal-guide.md new file mode 100644 index 0000000..4521f81 --- /dev/null +++ b/docs/src/en/premium/whitelabel-removal-guide.md @@ -0,0 +1,29 @@ +# Whitelabel Removal Guide + +Please follow this guide **very carefully**. If you skip a single step, the process will not work. The whitelabel removal process is very short. + +## (Step 1 of 4) Disable Whitelabel + +Head over to the whitelabel section on the [web dashboard](https://dashboard.tickets.bot/whitelabel). There you will need to disable your whitelabel bot. + +To do this press the `Disable Whitelabel` button. + +![Disable Bot](../../img/whitelabel/disable-bot.webp) + +Confirm by pressing `Disable` in the dialog that appears. + +![Disable Confirmation](../../img/whitelabel/disable-bot-confirm.webp) + +You will then be presented with a message saying that whitelabel has been disabled. + +## (Step 2 of 4) Remove the Whitelabel Bot + +Kick the whitelabel bot. + +## (Step 3 of 4) Invite Tickets + +Invite the Tickets bot to your server. Follow our [invite guide](../setup/invite) if you need help with this. + +## (Step 4 of 4) Resend Your Ticket Panels + +To do this you will need to delete the ticket panel messages sent by your whitelabel bot. Afterwards head to the [web dashboard](https://dashboard.tickets.bot) > select your server > `Ticket Panels` section > 3 dot menu > press the `Resend` button. Repeat this for **all ticket panels**. diff --git a/docs/src/en/premium/whitelabel-resync-guide.md b/docs/src/en/premium/whitelabel-resync-guide.md new file mode 100644 index 0000000..9774ed9 --- /dev/null +++ b/docs/src/en/premium/whitelabel-resync-guide.md @@ -0,0 +1,35 @@ +# Whitelabel Resync Guide + +In some rare cases your whitelabel bot may become out of sync with our service. In that case you will need to resync it. The resync process is very short and easy. + +Resync your bot if its slash commands are missing, if it appears offline, or if the server count shown under `Manage Bot` is wrong. + +## (Step 1 of 1) Resync Your Bot + +Head over to the whitelabel section on the [web dashboard](https://dashboard.tickets.bot/whitelabel). There you will need to press the `Resync Bot` button. + +![Resync Bot](../../img/whitelabel/resync-bot.webp) + +A confirmation dialog appears telling you exactly what will happen: it reapplies your bot token, re-registers its slash commands, and refreshes the list of servers your bot is in. Press `Resync` to continue. + +![Resync Confirmation](../../img/whitelabel/resync-bot-confirm.webp) + +Your bot is then reconnected and synced up with our systems again. + +:::info Wait a Minute Between Resyncs +Slash commands may take a few minutes before they are visible. If you need to resync again, wait a full minute first β€” two resyncs in quick succession will skip the slash command refresh. +::: + +:::info Privileged Intents May Be Required +If the resync fails with a message about privileged intents, Discord requires you to apply for them before your bot can use them. See the [Whitelabel Intents Guide](./whitelabel-intents-guide). +::: + +## Optional: Resend Ticket Panels + +In some cases you will need to resend your ticket panels. A resync does not do this for you. + +To do this, head to the `Ticket Panels` tab of your server. Once there, click the three dots next to your ticket panel and choose the `Resend` option. + +You will be presented with a message saying that your ticket panel has been sent successfully. If you receive an error, make sure that your whitelabel bot is active and added to your server. + +Do this for **all of your ticket panels** that were sent by the whitelabel bot. Afterwards your bot and your ticket panels should be working again. diff --git a/docs/src/en/premium/whitelabel-setup-guide.md b/docs/src/en/premium/whitelabel-setup-guide.md new file mode 100644 index 0000000..dc13c4b --- /dev/null +++ b/docs/src/en/premium/whitelabel-setup-guide.md @@ -0,0 +1,105 @@ +# Whitelabel Setup Guide + +Thanks for purchasing whitelabel and supporting us! + +Please follow this guide **very carefully**. If you skip a single step, the process will not work. The setup is short, and will only need to be done once. + +## (Step 1 of 6) Link Patreon Account + +If you haven't done so already, you'll need to link your Patreon and Discord accounts in [your Patreon settings](https://www.patreon.com/settings/apps). +Patreon has [a longer guide on how to do this](https://support.patreon.com/hc/en-us/articles/212052266-Get-my-Discord-role). + +## (Step 2 of 6) Create Bot + +Next, you'll need to create your custom bot that Tickets will run under. To do this, visit the [Discord developer portal](https://discord.com/developers/applications) and press `New Application` in the top right: + +![New application](../../img/whitelabel/new_application.webp) + +Enter a name for your bot and press create. From here, you can change your bot's avatar: + +![General Information](../../img/whitelabel/general_information.webp) + +:::info Required Above 10,000 Users +Once your bot serves more than 10,000 users, Discord requires you to apply for privileged intents. See the [Whitelabel Intents Guide](./whitelabel-intents-guide). +::: + +## (Step 3 of 6) Start Bot + +Next, you have to submit the bot's token. This is like a password to the bot. + +:::danger Keep Your Bot Token Secret +**Never send this token to anyone, not even in our support server.** If someone obtains this token, they have full control over your bot. If you believe your token has been compromised, immediately reset the token in the Discord developer portal and update the token on the Tickets web dashboard. +::: + +Click on `Bot` on the sidebar of the Discord developer portal and copy the token. You may have to click the `Reset Token` button before you can copy the token: + +![Copy Token](../../img/whitelabel/copy_token.webp) + +Then head over to the whitelabel section on the [web dashboard](https://dashboard.tickets.bot/whitelabel). Paste the token into the `Bot Token` field and press `Submit`: + +:::info Allow Up to 10 Minutes +There may be up to a 10 minute delay for the whitelabel section of web dashboard to recognize your status. Until it does, it will lead you back to the "buy premium/whitelabel" page. +::: + +![Submit Token](../../img/whitelabel/submit_token.webp) + +You will then be presented with a message saying that the bot is now online. + +If you receive an error, make sure that you fully copied the token, not the client secret. Additionally, refresh the page and check the `Error Log` table for any errors. + +## (Step 4 of 6) Invite Bot to Server + +Before you can invite the bot to your server, you must kick the main Tickets bot from your server. It is **extremely** important that you do this **before** inviting your custom bot to your server. + +:::danger Do Not Skip This Step +**If you skip this step, you risk losing your data.** If you are having issues with this step, please contact support immediately. +::: + +![Kick Bot](../../img/whitelabel/kick_bot.webp) + +To invite your whitelabel bot to your server, click the `Generate Invite Link` button under the `Manage Bot` section. + +Upon clicking the button, you will be taken to the normal bot invite page - select your server and authorise. It is important that you grant the bot all the permissions that it asks for. + +![Invite](../../img/whitelabel/invite.webp) + +## (Step 5 of 6) Activate Premium Perks + +The last mandatory step is to activate the premium perks that come with whitelabel for your server. + +:::info Allow Up to 10 Minutes +There may be up to a 10 minute delay for the whitelabel bot to recognize the server and sync commands. Until it does, it will error when running commands. If the command errors, wait 10 minutes and try the command again. +::: + +Go to your Discord server and run the `/premium` command. You must select the command when it displays to you after typing. Make sure to choose `Patreon` since that is how you paid for the whitelabel bot. **Giveaway Key is not used here.** + +*If `Patreon` is not a selectable option, then your premium perks are already applied to the server.* + +![Activate Premium Perks](../../img/whitelabel/activate_premium.webp) + +## (Step 6 of 6) Resend Your Ticket Panels + +To do this you will need to delete the ticket panel messages sent by the Tickets bot. Afterwards head to our [web dashboard](https://dashboard.tickets.bot) > select your server > `Ticket Panels` section > 3 dot menu > press the `Resend` button. Repeat this for **all ticket panels**. + +**And you're done!** Your bot should be ready for use. + +There are a few more **optional** steps below, if you wish to take them. + +## Optional: Set Custom Status + +You can optionally change the status of your whitelabel bot. Simply enter the new status on the web dashboard and press `Submit`. + +`Playing`, `Listening`, `Watching`, `Competing` and `Custom` are all currently available. + +![Custom Status](../../img/whitelabel/custom_status.webp) + +## Optional: Set Privacy Policy & Terms of Service Links + +On the `General Information` tab of the Discord developer portal, you may have noticed `Terms Of Service URL` and `Privacy Policy URL` fields. + +You should enter our policies here to inform users of how their data may be used. + +**Terms of Service:** https://tickets.bot/terms-of-service +**Privacy Policy:** https://tickets.bot/privacy + +![Policies](../../img/whitelabel/policies.webp) diff --git a/docs/src/en/setup/configuration.md b/docs/src/en/setup/configuration.md new file mode 100644 index 0000000..751c762 --- /dev/null +++ b/docs/src/en/setup/configuration.md @@ -0,0 +1,25 @@ +# Bot Configuration + +Let's start getting the bot ready for use in your server! + +Tickets was a very early adopter of slash commands, meaning that you can simply hit `/` in your Discord client to have commands auto-completed with the correct arguments: + +![Slash Commands](../../img/slash_commands.webp) + +If you're not the owner of the server, now would be a good time to get the owner to designate you as an admin of Tickets. You can do this by asking the owner to run the command `/addadmin @YourUsername` in a channel the bot can see. If successful, Tickets will show you a βœ…. + +There are two ways in which you can configure the bot: + +- Via the [web dashboard](https://dashboard.tickets.bot) **[Recommended]** +- Via the `/setup` command in Discord + +:::tip Use the Dashboard +We recommend using the web dashboard to configure the bot, as it's easier and more settings are available - including ticket panels. +::: + +`/setup` automatically creates the roles, channels, and category you need (excluding ticket panels) without any interaction required from you. This is fine as a starting point, but every other setting - ticket limits, transcripts, thread mode, welcome messages, and so on - is configured per panel on the web dashboard. + +We have guides on both of the available methods: + +- [Web dashboard](./dashboard) **[Recommended]** +- [Setup command](./setup-command) diff --git a/docs/src/en/setup/dashboard.md b/docs/src/en/setup/dashboard.md new file mode 100644 index 0000000..4d1e32b --- /dev/null +++ b/docs/src/en/setup/dashboard.md @@ -0,0 +1,24 @@ +# Bot Configuration: Web Dashboard + +The web dashboard is where you configure Tickets for your Discord server. This page walks you through logging in and selecting your server, then points you to the full dashboard guide. + +## Logging In + +Head to [dashboard.tickets.bot](https://dashboard.tickets.bot). You will be asked to log in with Discord. Click **Authorise** on Discord's OAuth2 page and you will be returned to the dashboard. + + +## Selecting Your Server + +After logging in, you will see a list of servers. Servers where you have bot admin access (via `/addadmin` or server ownership) and where the bot has been invited appear under **Premium Servers** or **Free Servers**. Click a server to open its management dashboard. + +If your server does not appear, check the following: + +1. You are either the server owner or have been added as a Tickets bot admin using `/addadmin @YourUsername` +2. The Tickets bot has been invited to the server (see the [invite guide](./invite)) +3. Try clicking **Refresh list** at the top of the server list, or log out and back in + +![Servers](../../img/dashboard/introduction/servers.webp) + +## Exploring the Dashboard + +For a complete tour of the dashboard layout, sidebar navigation, keyboard shortcuts, and command palette, see the [Dashboard Introduction](/dashboard/introduction). diff --git a/docs/src/en/setup/introduction.md b/docs/src/en/setup/introduction.md new file mode 100644 index 0000000..9c04c06 --- /dev/null +++ b/docs/src/en/setup/introduction.md @@ -0,0 +1,43 @@ +# Setup + +Thanks for choosing Tickets as your support solution! In this guide we'll teach you how to get up and running in no time at all. + +:::tip Need Help? +If you need any assistance in the process, feel free to join our [Discord server](https://discord.gg/ticketsbot) and open a ticket to talk to our support staff. +::: + +## For those with previous experience configuring Discord bots + +Quickly get the absolute basic functions of a ticket system for your server in 5 steps: + +1. [Invite the bot](https://invite.tickets.bot) +2. Make yourself admin of the bot `/addadmin @your-username` +3. Go to the [web dashboard](https://dashboard.tickets.bot) +4. Make a [ticket panel](../setup/ticket-panels) +5. Go back to Discord and add your staff as support so they can see and answer tickets `/addsupport @your-role` + +:::tip Continue Through the Setup Guide +It is **HIGHLY RECOMMENDED** to continue reading through SETUP and the rest of the documentation, as these steps only provide the most basic working ticket system. There are many ways to customise the system, messages, notifications, and support staff. +::: + +## For Beginners with Discord Bots + +You'll need to start by inviting Tickets to your server. + +[Learn how to invite the bot](./invite). + +**If you've already invited the bot to your server**, feel free to jump ahead and start configuring it. + +[View the configuration guide](./configuration). + +## Pages in This Chapter + +| Page | What it covers | +| ---- | -------------- | +| [Inviting the Bot](./invite) | Adding Tickets to your server from invite.tickets.bot, and the permissions it asks for | +| [Language Customisation](./language-customisation) | Setting your server's language with `/language`, with over 30 supported | +| [Bot Configuration](./configuration) | Choosing between the web dashboard and in-Discord slash commands to configure the bot | +| [Web Dashboard](./dashboard) | Logging in with Discord and selecting your server, the recommended configuration route | +| [Setup Command](./setup-command) | What `/setup` creates automatically, and why it is not the recommended route | +| [Ticket Panels](./ticket-panels) | Creating your first panel, the embed with a button that members click to open a ticket | +| [Support Staff](./support-staff) | Giving staff access to tickets with `/addsupport`, `/addadmin`, and staff teams | diff --git a/src/setup/invite.md b/docs/src/en/setup/invite.md similarity index 65% rename from src/setup/invite.md rename to docs/src/en/setup/invite.md index 5a7f44e..abe7262 100644 --- a/src/setup/invite.md +++ b/docs/src/en/setup/invite.md @@ -1,21 +1,23 @@ -# Inviting The Bot -*** +# Inviting the Bot -To get started with adding Tickets to your server, visit [invite.tickets.bot](https://invite.tickets.bot): you'll be redirected to Discord automatically. - -You'll first be asked to select the server you want to add the Tickets bot. -> **Note:** you must have the **Manage Server** permission to do this. +To get started with adding Tickets to your server, visit [invite.tickets.bot](https://invite.tickets.bot): you'll be redirected to Discord automatically. -![Select server](../img/invite-1.webp) +You'll first be asked to select the server you want to add the Tickets bot. -Upon pressing `Continue`, you'll be presented with a list of permissions Tickets is asking for. It is important that you allow the bot all of these permissions to ensure successful operation. However, you *are* able to remove the Administrator permission if you so wish, but please make sure you do not have any deny permission overrides applied to roles the bot has (including @everyone) on your channel categories. +:::warning Manage Server Permission Required +You must have the **Manage Server** permission to do this. +::: + +![Select Server](../../img/invite-1.webp) + +Upon pressing `Continue`, you'll be presented with a list of permissions Tickets is asking for. It is important that you allow the bot all of these permissions to ensure successful operation. However, you *are* able to remove the Administrator permission if you so wish, but please make sure you do not have any deny permission overrides applied to roles the bot has (including @everyone) on your channel categories. Click `Authorize` to proceed. -![Authorize permissions](../img/invite-2.webp) +![Authorize Permissions](../../img/invite-2.webp) -Discord will then present you with a screen stating that you've authorised the bot: it's now in your server! +Discord will then present you with a screen stating that you've authorised the bot: it's now in your server! -If you need the bot to be in a language other than English, learn more [here](./languages.md). +If you need the bot to be in a language other than English, learn more about [language customisation](./language-customisation). -If not, let's start configuring the bot: [Bot Configuration](./configuration.md) +If not, let's start configuring the bot: [Bot Configuration](./configuration) diff --git a/src/setup/languages.md b/docs/src/en/setup/language-customisation.md similarity index 84% rename from src/setup/languages.md rename to docs/src/en/setup/language-customisation.md index eb4d5ea..5ea5766 100644 --- a/src/setup/languages.md +++ b/docs/src/en/setup/language-customisation.md @@ -1,19 +1,20 @@ # Language Customisation -*** Tickets is highly accessible, supporting over 30 languages at the time of writing. -Use the `/language` command and an embedded message with all supported languages will appear, select the language you want from one of the dropdowns below the message +Use the `/language` command and an embedded message with all supported languages will appear, select the language you want from one of the dropdowns below the message. -![Language list](../img/languages.webp) +![Language List](../../img/languages.webp) If you do not have a language selected, your server's preferred language will be used: -![Community language](../img/server_language.webp) +![Community Language](../../img/server_language.webp) ## Limitations + - The bot does not currently support server-level customisation of individual messages - Some messages, such as embed titles and some button messages, are not currently translated ## Help Wanted + If you are multilingual and interested in helping translate the bot into more languages (or getting languages to 100%), please join our [support server](https://discord.gg/ticketsbot) and let us know! diff --git a/docs/src/en/setup/setup-command.md b/docs/src/en/setup/setup-command.md new file mode 100644 index 0000000..d560890 --- /dev/null +++ b/docs/src/en/setup/setup-command.md @@ -0,0 +1,32 @@ +# Bot Configuration: Setup Command + +Tickets provides an option to automatically create a basic configuration for you. This isn't recommended since the settings are unlikely to be to your preference, and a ticket panel is **not** automatically created. For information on creating ticket panels, see our [ticket panels guide](./ticket-panels). + +To run it, first ensure that you are either the owner of the server, or the owner has designated you as an administrator of the bot using `/addadmin @YourUsername`. Next, simply execute `/setup` in a channel the bot can see. + +It will update you as the process progresses: + +![Auto Setup](../../img/auto_setup.webp) + +Simply assign your support staff the new `Tickets Support` role and your administrators the `Tickets Admin` role and your staff will be able to open and support users in tickets created via `/open` or the context menu (right click > apps > start ticket.) + +## What `/setup` Does + +The command performs the following four actions in order: + +| Step | Result | +|---|---| +| Create the `Tickets Support` role | Registered as a support role, so members holding it can see and reply to tickets | +| Create the `Tickets Admin` role | Registered as an admin role, granting full control over the bot | +| Create a `#transcripts` channel | Visible only to the two roles above; everyone else is denied access | +| Create a `Tickets` category | Where ticket channels are placed | + +If any step fails (usually a missing permission), the bot marks that line with a ❌ and continues with the remaining steps. + +## Settings That Moved to Panels + +`/setup` is the only setup command. The options it used to accept are now configured per panel, so each panel can behave differently. Open any panel from the [Panels](/dashboard/ticket-panels) page. + +For the full list of settings that moved, see [Server Settings](/dashboard/settings/settings#looking-for-a-setting-that-used-to-be-here). + +You'll probably want to [create a ticket panel](./ticket-panels) so it's easier for your server members to open a ticket, or tweak the settings on the [web dashboard](./dashboard). diff --git a/docs/src/en/setup/support-staff.md b/docs/src/en/setup/support-staff.md new file mode 100644 index 0000000..7a32328 --- /dev/null +++ b/docs/src/en/setup/support-staff.md @@ -0,0 +1,30 @@ +# Support Staff + +Now that the ticket system is in place, Tickets bot needs to know which of your staff should have access to the tickets (and the web dashboard settings - if desired.) + +> **There are two scenarios for how to setup support staff:** +> - Staff members handle **SPECIFIC** tickets +> - Staff members handle **ALL** tickets + +## Staff Members Handle Specific Tickets + +> Setting the support staff in this scenario can only be accomplished via the [web dashboard](https://dashboard.tickets.bot). A guide on this can be found in the [staff teams guide](../dashboard/staff-teams). + +## Staff Members Handle All Tickets + +> Setting the support staff in this scenario is recommended via slash commands. + + +**Command:** `/addadmin @username` or `/addadmin @role` + +Not only does this add the specified user to the Default Team in Staff Teams, but it also gives that user full administrative privileges of the Tickets bot for your server. This is just having admin of the Tickets bot, **not your server**. + +:::danger Only Grant to Trusted Users +Only give this privilege to those you trust. +::: + +Having admin privileges of the bot means the user will be able to use the [web dashboard](https://dashboard.tickets.bot) fully, and control all the configuration, settings, customisation of the bot, as well as see ALL of the tickets/transcripts contained there. + +**Command:** `/addsupport @role` + +This adds the specified role to the Default Team in Staff Teams. The only thing the users with this role will be able to see on the web dashboard are the tickets that the Default Team has been assigned as a support team. diff --git a/docs/src/en/setup/ticket-panels.md b/docs/src/en/setup/ticket-panels.md new file mode 100644 index 0000000..29b969d --- /dev/null +++ b/docs/src/en/setup/ticket-panels.md @@ -0,0 +1,43 @@ +# Create Your First Ticket Panel + +A ticket panel is the embed message with a button that your server members click to open a ticket. This guide walks you through creating a basic panel. For a full reference of all panel options, see [Ticket Panels](/dashboard/ticket-panels). + +## Open the Panels Page + +1. Log in to the [web dashboard](https://dashboard.tickets.bot) and select your server +2. In the sidebar, find the **Setup** group and click **Panels** + +![Panels page](../../img/setup/ticket-panels/panels-page.webp) + +## Create a Panel + +Click the **Create Panel** button at the top of the page. You will be taken to the panel creation form. + +### Required Fields + +At a minimum, configure these four fields to get a working panel: + +1. **Panel Title** - the bold heading displayed on the embed (e.g. "Need Help? Open a Ticket") +2. **Panel Channel** - the Discord channel where the panel message will be sent. Choose a channel that all members can see. +3. **Ticket Category** - the Discord channel category where new ticket channels will be created +4. **Support Team** - which staff team will handle tickets opened from this panel + +:::tip Create a Support Team First +If you have not created a support team yet, visit the [Staff Teams](/dashboard/staff-teams) page first. +::: + +### Optional Fields + +You can also set a panel description, button text, button colour, button emoji, a form to collect information from users, and more. These can all be configured now or added later by editing the panel. + +## Send the Panel + +Once you have filled in at least the required fields, click **Create** at the bottom of the page. The panel embed will be sent to the channel you selected. A success notification will confirm it was created. + +Your members can now click the button on the panel message to open a ticket. + +## What Next + +- Learn about all the panel options (welcome messages, access control, support hours, auto close) in the full [Ticket Panels](/dashboard/ticket-panels) reference +- Create additional panels for different types of support (e.g. billing, moderation, general) +- Attach a [form](/dashboard/forms) to collect structured information before a ticket is opened diff --git a/docs/src/en/team/index.md b/docs/src/en/team/index.md new file mode 100644 index 0000000..7c8814f --- /dev/null +++ b/docs/src/en/team/index.md @@ -0,0 +1,75 @@ +--- +layout: page +--- + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/img/addadmin-command.webp b/docs/src/img/addadmin-command.webp new file mode 100644 index 0000000..971ca0d Binary files /dev/null and b/docs/src/img/addadmin-command.webp differ diff --git a/docs/src/img/auto_setup.webp b/docs/src/img/auto_setup.webp new file mode 100644 index 0000000..b6289ad Binary files /dev/null and b/docs/src/img/auto_setup.webp differ diff --git a/docs/src/img/close_request.webp b/docs/src/img/close_request.webp new file mode 100644 index 0000000..5b461cc Binary files /dev/null and b/docs/src/img/close_request.webp differ diff --git a/docs/src/img/close_request_deny.webp b/docs/src/img/close_request_deny.webp new file mode 100644 index 0000000..7e3ba1d Binary files /dev/null and b/docs/src/img/close_request_deny.webp differ diff --git a/docs/src/img/close_request_params.webp b/docs/src/img/close_request_params.webp new file mode 100644 index 0000000..b9e813a Binary files /dev/null and b/docs/src/img/close_request_params.webp differ diff --git a/docs/src/img/context_menu_quote_message.webp b/docs/src/img/context_menu_quote_message.webp new file mode 100644 index 0000000..4ebed1a Binary files /dev/null and b/docs/src/img/context_menu_quote_message.webp differ diff --git a/docs/src/img/context_menu_start_ticket.webp b/docs/src/img/context_menu_start_ticket.webp new file mode 100644 index 0000000..79dda30 Binary files /dev/null and b/docs/src/img/context_menu_start_ticket.webp differ diff --git a/docs/src/img/dashboard-no-permission.webp b/docs/src/img/dashboard-no-permission.webp new file mode 100644 index 0000000..bf5e28a Binary files /dev/null and b/docs/src/img/dashboard-no-permission.webp differ diff --git a/docs/src/img/dashboard/analytics/analytics-full.webp b/docs/src/img/dashboard/analytics/analytics-full.webp new file mode 100644 index 0000000..d6fe89f Binary files /dev/null and b/docs/src/img/dashboard/analytics/analytics-full.webp differ diff --git a/docs/src/img/dashboard/analytics/peak-hours.webp b/docs/src/img/dashboard/analytics/peak-hours.webp new file mode 100644 index 0000000..9e01bb3 Binary files /dev/null and b/docs/src/img/dashboard/analytics/peak-hours.webp differ diff --git a/docs/src/img/dashboard/analytics/staff-table.webp b/docs/src/img/dashboard/analytics/staff-table.webp new file mode 100644 index 0000000..8eebd4e Binary files /dev/null and b/docs/src/img/dashboard/analytics/staff-table.webp differ diff --git a/docs/src/img/dashboard/analytics/stat-cards.webp b/docs/src/img/dashboard/analytics/stat-cards.webp new file mode 100644 index 0000000..3e1be46 Binary files /dev/null and b/docs/src/img/dashboard/analytics/stat-cards.webp differ diff --git a/docs/src/img/dashboard/audit-log/audit-log-diff.webp b/docs/src/img/dashboard/audit-log/audit-log-diff.webp new file mode 100644 index 0000000..ea90033 Binary files /dev/null and b/docs/src/img/dashboard/audit-log/audit-log-diff.webp differ diff --git a/docs/src/img/dashboard/audit-log/audit-log-full.webp b/docs/src/img/dashboard/audit-log/audit-log-full.webp new file mode 100644 index 0000000..bca074d Binary files /dev/null and b/docs/src/img/dashboard/audit-log/audit-log-full.webp differ diff --git a/docs/src/img/dashboard/awaiting-response/panel-editor-awaiting.webp b/docs/src/img/dashboard/awaiting-response/panel-editor-awaiting.webp new file mode 100644 index 0000000..318fe21 Binary files /dev/null and b/docs/src/img/dashboard/awaiting-response/panel-editor-awaiting.webp differ diff --git a/docs/src/img/dashboard/blacklist/blacklist-page.webp b/docs/src/img/dashboard/blacklist/blacklist-page.webp new file mode 100644 index 0000000..c266c3e Binary files /dev/null and b/docs/src/img/dashboard/blacklist/blacklist-page.webp differ diff --git a/docs/src/img/dashboard/blacklist/blacklist-user-modal.webp b/docs/src/img/dashboard/blacklist/blacklist-user-modal.webp new file mode 100644 index 0000000..fe967d2 Binary files /dev/null and b/docs/src/img/dashboard/blacklist/blacklist-user-modal.webp differ diff --git a/docs/src/img/dashboard/claiming/panel-editor-claiming.webp b/docs/src/img/dashboard/claiming/panel-editor-claiming.webp new file mode 100644 index 0000000..8132c26 Binary files /dev/null and b/docs/src/img/dashboard/claiming/panel-editor-claiming.webp differ diff --git a/docs/src/img/dashboard/exit-survey/panel-editor-exit-survey.webp b/docs/src/img/dashboard/exit-survey/panel-editor-exit-survey.webp new file mode 100644 index 0000000..067d24a Binary files /dev/null and b/docs/src/img/dashboard/exit-survey/panel-editor-exit-survey.webp differ diff --git a/docs/src/img/dashboard/forms/create-form.webp b/docs/src/img/dashboard/forms/create-form.webp new file mode 100644 index 0000000..7c4b57e Binary files /dev/null and b/docs/src/img/dashboard/forms/create-form.webp differ diff --git a/docs/src/img/dashboard/forms/form-editor.webp b/docs/src/img/dashboard/forms/form-editor.webp new file mode 100644 index 0000000..d417b8e Binary files /dev/null and b/docs/src/img/dashboard/forms/form-editor.webp differ diff --git a/docs/src/img/dashboard/forms/forms-list.webp b/docs/src/img/dashboard/forms/forms-list.webp new file mode 100644 index 0000000..9e673b9 Binary files /dev/null and b/docs/src/img/dashboard/forms/forms-list.webp differ diff --git a/docs/src/img/dashboard/gallery/gallery-browse.webp b/docs/src/img/dashboard/gallery/gallery-browse.webp new file mode 100644 index 0000000..037657b Binary files /dev/null and b/docs/src/img/dashboard/gallery/gallery-browse.webp differ diff --git a/docs/src/img/dashboard/gallery/gallery-detail.webp b/docs/src/img/dashboard/gallery/gallery-detail.webp new file mode 100644 index 0000000..9943106 Binary files /dev/null and b/docs/src/img/dashboard/gallery/gallery-detail.webp differ diff --git a/docs/src/img/dashboard/introduction/servers.webp b/docs/src/img/dashboard/introduction/servers.webp new file mode 100644 index 0000000..94c8724 Binary files /dev/null and b/docs/src/img/dashboard/introduction/servers.webp differ diff --git a/docs/src/img/dashboard/kb/create-article.webp b/docs/src/img/dashboard/kb/create-article.webp new file mode 100644 index 0000000..f32c627 Binary files /dev/null and b/docs/src/img/dashboard/kb/create-article.webp differ diff --git a/docs/src/img/dashboard/kb/customisation.webp b/docs/src/img/dashboard/kb/customisation.webp new file mode 100644 index 0000000..1db34d2 Binary files /dev/null and b/docs/src/img/dashboard/kb/customisation.webp differ diff --git a/docs/src/img/dashboard/kb/kb-list.webp b/docs/src/img/dashboard/kb/kb-list.webp new file mode 100644 index 0000000..0b323b4 Binary files /dev/null and b/docs/src/img/dashboard/kb/kb-list.webp differ diff --git a/docs/src/img/dashboard/multipanels/multipanel-create.webp b/docs/src/img/dashboard/multipanels/multipanel-create.webp new file mode 100644 index 0000000..b5610e2 Binary files /dev/null and b/docs/src/img/dashboard/multipanels/multipanel-create.webp differ diff --git a/docs/src/img/dashboard/multipanels/multipanel-settings.webp b/docs/src/img/dashboard/multipanels/multipanel-settings.webp new file mode 100644 index 0000000..0d8560e Binary files /dev/null and b/docs/src/img/dashboard/multipanels/multipanel-settings.webp differ diff --git a/docs/src/img/dashboard/overview/overview-full.webp b/docs/src/img/dashboard/overview/overview-full.webp new file mode 100644 index 0000000..08d5e51 Binary files /dev/null and b/docs/src/img/dashboard/overview/overview-full.webp differ diff --git a/docs/src/img/dashboard/overview/quick-actions.webp b/docs/src/img/dashboard/overview/quick-actions.webp new file mode 100644 index 0000000..1774265 Binary files /dev/null and b/docs/src/img/dashboard/overview/quick-actions.webp differ diff --git a/docs/src/img/dashboard/overview/tickets-chart.webp b/docs/src/img/dashboard/overview/tickets-chart.webp new file mode 100644 index 0000000..0e60d18 Binary files /dev/null and b/docs/src/img/dashboard/overview/tickets-chart.webp differ diff --git a/docs/src/img/dashboard/panels/access-control.webp b/docs/src/img/dashboard/panels/access-control.webp new file mode 100644 index 0000000..de1abc9 Binary files /dev/null and b/docs/src/img/dashboard/panels/access-control.webp differ diff --git a/docs/src/img/dashboard/panels/panel-appearance.webp b/docs/src/img/dashboard/panels/panel-appearance.webp new file mode 100644 index 0000000..6fd77d7 Binary files /dev/null and b/docs/src/img/dashboard/panels/panel-appearance.webp differ diff --git a/docs/src/img/dashboard/panels/panels-list.webp b/docs/src/img/dashboard/panels/panels-list.webp new file mode 100644 index 0000000..761ee39 Binary files /dev/null and b/docs/src/img/dashboard/panels/panels-list.webp differ diff --git a/docs/src/img/dashboard/panels/welcome-message.webp b/docs/src/img/dashboard/panels/welcome-message.webp new file mode 100644 index 0000000..17156b6 Binary files /dev/null and b/docs/src/img/dashboard/panels/welcome-message.webp differ diff --git a/docs/src/img/dashboard/settings/colour-scheme.webp b/docs/src/img/dashboard/settings/colour-scheme.webp new file mode 100644 index 0000000..08c5450 Binary files /dev/null and b/docs/src/img/dashboard/settings/colour-scheme.webp differ diff --git a/docs/src/img/dashboard/settings/settings-overview.webp b/docs/src/img/dashboard/settings/settings-overview.webp new file mode 100644 index 0000000..cc18e95 Binary files /dev/null and b/docs/src/img/dashboard/settings/settings-overview.webp differ diff --git a/docs/src/img/dashboard/settings/user-settings.webp b/docs/src/img/dashboard/settings/user-settings.webp new file mode 100644 index 0000000..37f94c7 Binary files /dev/null and b/docs/src/img/dashboard/settings/user-settings.webp differ diff --git a/docs/src/img/dashboard/tags/tag-editor.webp b/docs/src/img/dashboard/tags/tag-editor.webp new file mode 100644 index 0000000..1c95e71 Binary files /dev/null and b/docs/src/img/dashboard/tags/tag-editor.webp differ diff --git a/docs/src/img/dashboard/tags/tags-list.webp b/docs/src/img/dashboard/tags/tags-list.webp new file mode 100644 index 0000000..e8567f4 Binary files /dev/null and b/docs/src/img/dashboard/tags/tags-list.webp differ diff --git a/docs/src/img/dashboard/teams/teams-page.webp b/docs/src/img/dashboard/teams/teams-page.webp new file mode 100644 index 0000000..f5d8538 Binary files /dev/null and b/docs/src/img/dashboard/teams/teams-page.webp differ diff --git a/docs/src/img/dashboard/thread-mode/panel-editor-threads.webp b/docs/src/img/dashboard/thread-mode/panel-editor-threads.webp new file mode 100644 index 0000000..d56b31a Binary files /dev/null and b/docs/src/img/dashboard/thread-mode/panel-editor-threads.webp differ diff --git a/docs/src/img/dashboard/tickets/bulk-actions.webp b/docs/src/img/dashboard/tickets/bulk-actions.webp new file mode 100644 index 0000000..98313b3 Binary files /dev/null and b/docs/src/img/dashboard/tickets/bulk-actions.webp differ diff --git a/docs/src/img/dashboard/tickets/manage-labels.webp b/docs/src/img/dashboard/tickets/manage-labels.webp new file mode 100644 index 0000000..421bfb6 Binary files /dev/null and b/docs/src/img/dashboard/tickets/manage-labels.webp differ diff --git a/docs/src/img/dashboard/tickets/ticket-view.webp b/docs/src/img/dashboard/tickets/ticket-view.webp new file mode 100644 index 0000000..97db3b4 Binary files /dev/null and b/docs/src/img/dashboard/tickets/ticket-view.webp differ diff --git a/docs/src/img/dashboard/tickets/tickets-list.webp b/docs/src/img/dashboard/tickets/tickets-list.webp new file mode 100644 index 0000000..f060193 Binary files /dev/null and b/docs/src/img/dashboard/tickets/tickets-list.webp differ diff --git a/docs/src/img/dashboard/transcripts/transcript-view.webp b/docs/src/img/dashboard/transcripts/transcript-view.webp new file mode 100644 index 0000000..12d656d Binary files /dev/null and b/docs/src/img/dashboard/transcripts/transcript-view.webp differ diff --git a/docs/src/img/dashboard/transcripts/transcripts-list.webp b/docs/src/img/dashboard/transcripts/transcripts-list.webp new file mode 100644 index 0000000..d0c345e Binary files /dev/null and b/docs/src/img/dashboard/transcripts/transcripts-list.webp differ diff --git a/docs/src/img/dashboard/user-feedback/panel-editor-feedback.webp b/docs/src/img/dashboard/user-feedback/panel-editor-feedback.webp new file mode 100644 index 0000000..1e84a75 Binary files /dev/null and b/docs/src/img/dashboard/user-feedback/panel-editor-feedback.webp differ diff --git a/docs/src/img/docs-language-selector.webp b/docs/src/img/docs-language-selector.webp new file mode 100644 index 0000000..411095f Binary files /dev/null and b/docs/src/img/docs-language-selector.webp differ diff --git a/docs/src/img/edit_channel.webp b/docs/src/img/edit_channel.webp new file mode 100644 index 0000000..561ec64 Binary files /dev/null and b/docs/src/img/edit_channel.webp differ diff --git a/docs/src/img/feedback_example.webp b/docs/src/img/feedback_example.webp new file mode 100644 index 0000000..ba37e6b Binary files /dev/null and b/docs/src/img/feedback_example.webp differ diff --git a/docs/src/img/forms/create.webp b/docs/src/img/forms/create.webp new file mode 100644 index 0000000..00b95c5 Binary files /dev/null and b/docs/src/img/forms/create.webp differ diff --git a/docs/src/img/forms/example.webp b/docs/src/img/forms/example.webp new file mode 100644 index 0000000..05dbd11 Binary files /dev/null and b/docs/src/img/forms/example.webp differ diff --git a/docs/src/img/gdpr/gdpr_confirm.webp b/docs/src/img/gdpr/gdpr_confirm.webp new file mode 100644 index 0000000..7046d0d Binary files /dev/null and b/docs/src/img/gdpr/gdpr_confirm.webp differ diff --git a/docs/src/img/gdpr/gdpr_done.webp b/docs/src/img/gdpr/gdpr_done.webp new file mode 100644 index 0000000..ac060d5 Binary files /dev/null and b/docs/src/img/gdpr/gdpr_done.webp differ diff --git a/docs/src/img/gdpr/gdpr_messages_confirm.webp b/docs/src/img/gdpr/gdpr_messages_confirm.webp new file mode 100644 index 0000000..f2ccfa4 Binary files /dev/null and b/docs/src/img/gdpr/gdpr_messages_confirm.webp differ diff --git a/docs/src/img/gdpr/gdpr_request.webp b/docs/src/img/gdpr/gdpr_request.webp new file mode 100644 index 0000000..996107b Binary files /dev/null and b/docs/src/img/gdpr/gdpr_request.webp differ diff --git a/docs/src/img/grant_send_messages_in_thread.webp b/docs/src/img/grant_send_messages_in_thread.webp new file mode 100644 index 0000000..0e94d18 Binary files /dev/null and b/docs/src/img/grant_send_messages_in_thread.webp differ diff --git a/docs/src/img/integrations/edit_welcome_message.webp b/docs/src/img/integrations/edit_welcome_message.webp new file mode 100644 index 0000000..2d6c746 Binary files /dev/null and b/docs/src/img/integrations/edit_welcome_message.webp differ diff --git a/docs/src/img/integrations/example_embed.webp b/docs/src/img/integrations/example_embed.webp new file mode 100644 index 0000000..bb4f112 Binary files /dev/null and b/docs/src/img/integrations/example_embed.webp differ diff --git a/docs/src/img/integrations/example_success.webp b/docs/src/img/integrations/example_success.webp new file mode 100644 index 0000000..5c66127 Binary files /dev/null and b/docs/src/img/integrations/example_success.webp differ diff --git a/src/img/tickets_view_card.webp b/docs/src/img/integrations/headers.webp similarity index 68% rename from src/img/tickets_view_card.webp rename to docs/src/img/integrations/headers.webp index 60f44de..4b00e06 100644 Binary files a/src/img/tickets_view_card.webp and b/docs/src/img/integrations/headers.webp differ diff --git a/docs/src/img/integrations/integration_preview.webp b/docs/src/img/integrations/integration_preview.webp new file mode 100644 index 0000000..9d7c505 Binary files /dev/null and b/docs/src/img/integrations/integration_preview.webp differ diff --git a/docs/src/img/integrations/metadata.webp b/docs/src/img/integrations/metadata.webp new file mode 100644 index 0000000..46c32df Binary files /dev/null and b/docs/src/img/integrations/metadata.webp differ diff --git a/docs/src/img/integrations/navbar.webp b/docs/src/img/integrations/navbar.webp new file mode 100644 index 0000000..3adc812 Binary files /dev/null and b/docs/src/img/integrations/navbar.webp differ diff --git a/docs/src/img/integrations/placeholder_creation.webp b/docs/src/img/integrations/placeholder_creation.webp new file mode 100644 index 0000000..5db020d Binary files /dev/null and b/docs/src/img/integrations/placeholder_creation.webp differ diff --git a/docs/src/img/integrations/request_completed.webp b/docs/src/img/integrations/request_completed.webp new file mode 100644 index 0000000..198fa38 Binary files /dev/null and b/docs/src/img/integrations/request_completed.webp differ diff --git a/src/img/tags_card.webp b/docs/src/img/integrations/request_url.webp similarity index 71% rename from src/img/tags_card.webp rename to docs/src/img/integrations/request_url.webp index 93686f8..02fff49 100644 Binary files a/src/img/tags_card.webp and b/docs/src/img/integrations/request_url.webp differ diff --git a/src/img/whitelabel/create_bot.webp b/docs/src/img/integrations/secrets_example.webp similarity index 53% rename from src/img/whitelabel/create_bot.webp rename to docs/src/img/integrations/secrets_example.webp index 162272e..0b1cf59 100644 Binary files a/src/img/whitelabel/create_bot.webp and b/docs/src/img/integrations/secrets_example.webp differ diff --git a/docs/src/img/invite-1.webp b/docs/src/img/invite-1.webp new file mode 100644 index 0000000..b81fdbb Binary files /dev/null and b/docs/src/img/invite-1.webp differ diff --git a/docs/src/img/invite-2.webp b/docs/src/img/invite-2.webp new file mode 100644 index 0000000..2371322 Binary files /dev/null and b/docs/src/img/invite-2.webp differ diff --git a/docs/src/img/languages.webp b/docs/src/img/languages.webp new file mode 100644 index 0000000..86ae442 Binary files /dev/null and b/docs/src/img/languages.webp differ diff --git a/src/img/tickets_docs_readme_intro.webp b/docs/src/img/readme/tickets_docs_readme_intro.webp similarity index 100% rename from src/img/tickets_docs_readme_intro.webp rename to docs/src/img/readme/tickets_docs_readme_intro.webp diff --git a/src/img/tickets_docs_readme_logo.webp b/docs/src/img/readme/tickets_docs_readme_logo.webp similarity index 100% rename from src/img/tickets_docs_readme_logo.webp rename to docs/src/img/readme/tickets_docs_readme_logo.webp diff --git a/docs/src/img/readme/tickets_docs_readme_usage.webp b/docs/src/img/readme/tickets_docs_readme_usage.webp new file mode 100644 index 0000000..16339f8 Binary files /dev/null and b/docs/src/img/readme/tickets_docs_readme_usage.webp differ diff --git a/docs/src/img/server_language.webp b/docs/src/img/server_language.webp new file mode 100644 index 0000000..5066ded Binary files /dev/null and b/docs/src/img/server_language.webp differ diff --git a/docs/src/img/setup/ticket-panels/panels-page.webp b/docs/src/img/setup/ticket-panels/panels-page.webp new file mode 100644 index 0000000..761ee39 Binary files /dev/null and b/docs/src/img/setup/ticket-panels/panels-page.webp differ diff --git a/docs/src/img/slash_commands.webp b/docs/src/img/slash_commands.webp new file mode 100644 index 0000000..0c271b9 Binary files /dev/null and b/docs/src/img/slash_commands.webp differ diff --git a/docs/src/img/threads_command.webp b/docs/src/img/threads_command.webp new file mode 100644 index 0000000..3bdd14b Binary files /dev/null and b/docs/src/img/threads_command.webp differ diff --git a/docs/src/img/ticket_notification.webp b/docs/src/img/ticket_notification.webp new file mode 100644 index 0000000..4b88c0a Binary files /dev/null and b/docs/src/img/ticket_notification.webp differ diff --git a/docs/src/img/whitelabel/activate_premium.webp b/docs/src/img/whitelabel/activate_premium.webp new file mode 100644 index 0000000..6bffe30 Binary files /dev/null and b/docs/src/img/whitelabel/activate_premium.webp differ diff --git a/docs/src/img/whitelabel/copy_token.webp b/docs/src/img/whitelabel/copy_token.webp new file mode 100644 index 0000000..48b3f70 Binary files /dev/null and b/docs/src/img/whitelabel/copy_token.webp differ diff --git a/docs/src/img/whitelabel/custom_status.webp b/docs/src/img/whitelabel/custom_status.webp new file mode 100644 index 0000000..a183e82 Binary files /dev/null and b/docs/src/img/whitelabel/custom_status.webp differ diff --git a/docs/src/img/whitelabel/disable-bot-confirm.webp b/docs/src/img/whitelabel/disable-bot-confirm.webp new file mode 100644 index 0000000..96191ad Binary files /dev/null and b/docs/src/img/whitelabel/disable-bot-confirm.webp differ diff --git a/docs/src/img/whitelabel/disable-bot.webp b/docs/src/img/whitelabel/disable-bot.webp new file mode 100644 index 0000000..0ebfe2e Binary files /dev/null and b/docs/src/img/whitelabel/disable-bot.webp differ diff --git a/docs/src/img/whitelabel/general_information.webp b/docs/src/img/whitelabel/general_information.webp new file mode 100644 index 0000000..9258c46 Binary files /dev/null and b/docs/src/img/whitelabel/general_information.webp differ diff --git a/docs/src/img/whitelabel/invite.webp b/docs/src/img/whitelabel/invite.webp new file mode 100644 index 0000000..4a3af0c Binary files /dev/null and b/docs/src/img/whitelabel/invite.webp differ diff --git a/docs/src/img/whitelabel/kick_bot.webp b/docs/src/img/whitelabel/kick_bot.webp new file mode 100644 index 0000000..e7b5b9f Binary files /dev/null and b/docs/src/img/whitelabel/kick_bot.webp differ diff --git a/docs/src/img/whitelabel/new_application.webp b/docs/src/img/whitelabel/new_application.webp new file mode 100644 index 0000000..966c507 Binary files /dev/null and b/docs/src/img/whitelabel/new_application.webp differ diff --git a/docs/src/img/whitelabel/policies.webp b/docs/src/img/whitelabel/policies.webp new file mode 100644 index 0000000..6a99469 Binary files /dev/null and b/docs/src/img/whitelabel/policies.webp differ diff --git a/docs/src/img/whitelabel/resync-bot-confirm.webp b/docs/src/img/whitelabel/resync-bot-confirm.webp new file mode 100644 index 0000000..90a4334 Binary files /dev/null and b/docs/src/img/whitelabel/resync-bot-confirm.webp differ diff --git a/docs/src/img/whitelabel/resync-bot.webp b/docs/src/img/whitelabel/resync-bot.webp new file mode 100644 index 0000000..a952160 Binary files /dev/null and b/docs/src/img/whitelabel/resync-bot.webp differ diff --git a/docs/src/img/whitelabel/submit_token.webp b/docs/src/img/whitelabel/submit_token.webp new file mode 100644 index 0000000..ae05132 Binary files /dev/null and b/docs/src/img/whitelabel/submit_token.webp differ diff --git a/theme/favicon.png b/docs/src/public/favicon.ico similarity index 100% rename from theme/favicon.png rename to docs/src/public/favicon.ico diff --git a/docs/src/public/logov2-round.png b/docs/src/public/logov2-round.png new file mode 100644 index 0000000..d6e5aeb Binary files /dev/null and b/docs/src/public/logov2-round.png differ diff --git a/docs/src/public/scripts/statusembed.js b/docs/src/public/scripts/statusembed.js new file mode 100644 index 0000000..b2ef8e9 --- /dev/null +++ b/docs/src/public/scripts/statusembed.js @@ -0,0 +1,61 @@ +// fetched from: https://ticketsv21.statuspage.io/embed/script.js + +(function(){ + + var frame = document.createElement('iframe'); + frame.src = 'https://j7dytlqrntrm.statuspage.io/embed/frame'; + frame.style.position = 'fixed'; + frame.style.border = 'none'; + frame.style.boxShadow = '0 20px 32px -8px rgba(9,20,66,0.25)'; + frame.style.zIndex = '9999'; + frame.style.transition = 'left 1s ease, bottom 1s ease, right 1s ease'; + frame.style.background = 'none'; + frame.style.colorScheme = 'normal'; //fixes Iframe having white borders + + frame.title = 'Tickets Status'; + frame.ariaHidden = true; + + var mobile; + if (mobile = screen.width < 450) { + frame.src += '?mobile=true'; + frame.style.height = '20vh'; + frame.style.width = '100vw'; + frame.style.left = '-9999px'; + frame.style.bottom = '-9999px'; + frame.style.transition = 'bottom 1s ease'; + } else { + frame.style.height = '115px'; + frame.style.width = '320px'; + frame.style.left = 'auto'; + frame.style.right = '-9999px'; + frame.style.bottom = '60px'; + } + + document.body.appendChild(frame); + + var actions = { + showFrame: function() { + frame.tabIndex = '0'; + if (mobile) { + frame.style.left = '0'; + frame.style.bottom = '0'; + } + else { + frame.style.left = 'auto'; + frame.style.right = '60px' + } + }, + dismissFrame: function(){ + frame.style.left = '-9999px'; + frame.tabIndex = '-1'; + } + } + + window.addEventListener('message', function(event){ + if (event.data.action && actions.hasOwnProperty(event.data.action)) { + actions[event.data.action](event.data); + } + }, false); + + window.statusEmbedTest = actions.showFrame; +})(); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..e3eb41e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2184 @@ +{ + "name": "new-docs", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@fortawesome/fontawesome-svg-core": "^7.3.1", + "@fortawesome/free-brands-svg-icons": "^7.3.1", + "@fortawesome/free-regular-svg-icons": "^7.3.1", + "@fortawesome/free-solid-svg-icons": "^7.3.1", + "@fortawesome/vue-fontawesome": "^3.3.3", + "vue": "^3.5.41" + }, + "devDependencies": { + "@mdit/plugin-footnote": "^1.1.0", + "vitepress": "^2.0.0-alpha.15" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@docsearch/css": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.7.0.tgz", + "integrity": "sha512-Sk5xkdRFeE7PeWjG9l4AfTwdvMfr9wHiwNNCpHXT4v4SNyNMKdHGvEILc31BgaVFGDDNbv5u/a73tofRiwbEZw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docsearch/js": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-4.7.0.tgz", + "integrity": "sha512-x5lCqu1tetgsJFkjQ6VSocbHldsRkGEgwg5N98Vx21sq/V5wcmj4u226PY9k+TEpIgQ772zlYbPLTPicWyGnpA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docsearch/sidepanel-js": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@docsearch/sidepanel-js/-/sidepanel-js-4.7.0.tgz", + "integrity": "sha512-A8r34jCU8kcIk2viECEn2msA28ojUF1BLi/3v5OWWc5G2N3jOuuumBXoeYjfr8dA0UxgFSy5R2bt12dnFJQSyA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-7.3.1.tgz", + "integrity": "sha512-k0C0sdHmZtAo6dRDtd1Z/qcpyHbL0CKsjV8seMY/21xGhY5Wsv0XRmiI/xEEH4y2c9b1+jvgNs/3EqhV27yUEA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-7.3.1.tgz", + "integrity": "sha512-BoxVN3PKnMbgStHhjoaky/oWdxHomDqmBVA24IA3KEmssFGeI7u9YT/BJceOjIum/t6TpPa/vcMKaVYQeIQ/3Q==", + "license": "MIT", + "dependencies": { + "@fortawesome/fontawesome-common-types": "7.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-brands-svg-icons": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-7.3.1.tgz", + "integrity": "sha512-8eiNzycuFhy3mZsi5EVO8JpO3H8l7/kSCl4Gk4iUew9hJuzYFqAAD6kqgeEup3+YZ9hL+5cjjorGzrRLkYuURg==", + "license": "(CC-BY-4.0 AND MIT)", + "dependencies": { + "@fortawesome/fontawesome-common-types": "7.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-regular-svg-icons": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-7.3.1.tgz", + "integrity": "sha512-q1EsmL7Q8DDnkRBUjSvrxbq7c9oVwwVjCn/xa5apKmdp65YSgzUg2y0Ltnd5aDbT6GdAQQdXql5Ha90ArqIReQ==", + "license": "(CC-BY-4.0 AND MIT)", + "dependencies": { + "@fortawesome/fontawesome-common-types": "7.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-7.3.1.tgz", + "integrity": "sha512-v0BLa0eqg7ubvVWeNSHVBs8fWH/GJicERZoJaxJ3FE/lj67VSqzoMg9pzfZVOfLMX10y0pGwQAuxoRVVH2patg==", + "license": "(CC-BY-4.0 AND MIT)", + "dependencies": { + "@fortawesome/fontawesome-common-types": "7.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/vue-fontawesome": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.3.3.tgz", + "integrity": "sha512-Jbjze98gGcVBSdkscLbnDlHECumMAFVWDarMtycctn9qL3p92ApnV36VW4PwVrcm9IWrHnnE6ZL9x7MXStSCfA==", + "license": "MIT", + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6 || ~7", + "vue": ">= 3.0.0 < 4" + } + }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.93", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.93.tgz", + "integrity": "sha512-/XhANjfGYOuqvSR3TmUnkQkINvQ4GVjVuukvymRbxtVFBvIq/yiXJqCDycKcQPT401OYT9H2vIY6ihAlz1QIAw==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@mdit/helper": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@mdit/helper/-/helper-1.1.0.tgz", + "integrity": "sha512-IWOUioaLobXA4ueulPfJopKaOHEGAH2pYDyK3u0cy4ItzxHXFssIJYksvdhUOC4JSHWfSjCArw41LBQdKOgFiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "markdown-it": "^15.0.0" + }, + "peerDependenciesMeta": { + "markdown-it": { + "optional": true + } + } + }, + "node_modules/@mdit/plugin-footnote": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@mdit/plugin-footnote/-/plugin-footnote-1.1.0.tgz", + "integrity": "sha512-EeVs4w9La5nQJbsU7GVq3aBhhgaNxkO89q8EguWc1ogkNaomL0d2B8jZKbDoZBGo1yg6m2nimraCWQI4jqmXWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mdit/helper": "1.1.0" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "markdown-it": "^15.0.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.146.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", + "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", + "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", + "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", + "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", + "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", + "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", + "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", + "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", + "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", + "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", + "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", + "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", + "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", + "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", + "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", + "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@shikijs/core": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.4.3.tgz", + "integrity": "sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/primitive": "4.4.3", + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5", + "hast-util-to-html": "^9.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.4.3.tgz", + "integrity": "sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.6" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.3.tgz", + "integrity": "sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/langs": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.4.3.tgz", + "integrity": "sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.4.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/primitive": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.4.3.tgz", + "integrity": "sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/themes": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.4.3.tgz", + "integrity": "sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.4.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/transformers": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-4.4.3.tgz", + "integrity": "sha512-oJSARV6NaWd+rnNJbtnpAdj3Zg0ZVyzsnMgb3vi3HA+35y8lBWUCpOnWsmyiXZIikY+x1BDqrQUgmxfzWh7Jvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.4.3", + "@shikijs/types": "4.4.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/types": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.3.tgz", + "integrity": "sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.2.0.tgz", + "integrity": "sha512-NoQ2yGlLWj4wpxMs+TYmRKk3thDrQ97agr7sFqfLsAlvoS8SNQuTrlObhFqG9iugdTtgOE9jpJ6FNM4ZGsa5xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", + "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.8.tgz", + "integrity": "sha512-0ZjgOg7oO6farnNGup7yvoM/YXZV84OZxHAwtflItNa/6zzQyVb5LNxyea3FEKEX2XlagIKzrlH7wwxkKgtiew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.41.tgz", + "integrity": "sha512-q0Xtv/F9w2YO/7htQhtiL+Ev2WCJbe5N2hc+XfgyKkEKqWpSxknmT8QOuGdEKNdjPq0c3F7rNpFkTo3Kfrm7pg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@vue/shared": "3.5.41", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.41.tgz", + "integrity": "sha512-oKacVfNglLvGjnS6BXOlGL7EyG2h8X03pqXCjzotRZUaXGjbrTJUnVAQjrCqUnS+lyu31nwQjZY/d817GmCnfw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.41", + "@vue/shared": "3.5.41" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.41.tgz", + "integrity": "sha512-XJhip7R2wy6vX3knCxdZN4KracFaZUef58s1KYewqluedHIJaPIVfXoYT7MF1F8nCvv6k8bWWxDC8opMkg1VTQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@vue/compiler-core": "3.5.41", + "@vue/compiler-dom": "3.5.41", + "@vue/compiler-ssr": "3.5.41", + "@vue/shared": "3.5.41", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.19", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.41.tgz", + "integrity": "sha512-U3v5OejKEGqOI0Wy0+Sz7hGuIFZHA4LSXzrNM3IMIeDyJEBBfTpX26n3SDgToRpP2bLc9FfI2j/kSgcJ8Emq5A==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.41", + "@vue/shared": "3.5.41" + } + }, + "node_modules/@vue/devtools-api": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.2.1.tgz", + "integrity": "sha512-6u4vXBlIBAC1wMplIZgpyPn7uh/s4Bf6F5bMzvLv+EdJ0aHs/+4B7Ygv864EStQSjRbsRzTko/kUG1A1IejQ3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.2.1" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.2.1.tgz", + "integrity": "sha512-FIGIuq3AWReEpbAHY/cRGeHDfI0qOb8OCQ3YjbEAX04uaxIDbGc9rhkbVcG7rnfHPXE3RsU5KrWOu9V/okd8AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.2.1", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "perfect-debounce": "^2.0.0" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.2.1.tgz", + "integrity": "sha512-Fkac7lUdGReh6pVOi3AYPRGe82LQqRmAfThW7RRligOAP0ZA/Z1z9XLHDM9dv34pV2HRc79DK8uKPeG2fLnA/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/reactivity": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.41.tgz", + "integrity": "sha512-rznsqKM0np0x18EjzF8x88MpEhdNsffbvFbckLL5+oUKz1BxAImEmO7J1ArRYSyo6aQaVoBDp7jEkT91OOxydA==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.41" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.41.tgz", + "integrity": "sha512-Vcry58hiAKwGen9Z1jUZE0feFsNArPCMOImYI8el48A9Idf6DuQYD0U05zZIF2Iad1hGhPSvcbBbAOhNr55fhg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.41", + "@vue/shared": "3.5.41" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.41.tgz", + "integrity": "sha512-3vVBahVBS9+U6cmXBLyb8nE6/yYo4J/CGI9eVFs3KiMc0YHuudwKyShTD65jtJy/L9PUUxNAFu4cj4LiJ0UFbw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.41", + "@vue/runtime-core": "3.5.41", + "@vue/shared": "3.5.41", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.41.tgz", + "integrity": "sha512-n6hx/pNFfbD6SuyeuMVkvqox8bwf/ET9JlA/kAz/imw8sw++wkqKe2mHX5KutjPpbKE4Z56yTHszoOjGMI9igQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.41", + "@vue/runtime-dom": "3.5.41", + "@vue/shared": "3.5.41" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.41.tgz", + "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==", + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.4.0.tgz", + "integrity": "sha512-X4WHz1HlCzCBoYXesUkifzzWBAcZgXG8Fi5iNPQg/epdzOB3gu8Fawj3hvuwYR1nGcXGnvxwYYcUC/71++svtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "14.4.0", + "@vueuse/shared": "14.4.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@vueuse/integrations": { + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-14.4.0.tgz", + "integrity": "sha512-oJz9qTgczvA7L1nXQFRU7h8tQbOCoiceqvMMhT9XYMyOGTqLJ2rEa09PON+nD2t48sZUfeOmg4eaWJXV4sZb/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vueuse/core": "14.4.0", + "@vueuse/shared": "14.4.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "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" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.4.0.tgz", + "integrity": "sha512-swx/255R6JyHZFJhx845iz5CRWDZdCfvkZOpACWc5+c5WHcG24mv8gUT1WIdFQaHt6dq79rvILd9QnCWiyVm9g==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.4.0.tgz", + "integrity": "sha512-JRgY90Sz8DDtPMsaDflvPMp9xYk69JZAmbuDvAquUVXKr2gEjqtzGNTTthLfckH0BzBqvnu31gb4a8TGLRe79g==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/argparse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-3.0.0.tgz", + "integrity": "sha512-BOp5NMrHqKxmq/OLr+clzzrRxgOKSLkcjmkWuChp7Irqwn4s74WjOBPIgWfA/HMcBnVkZ5XEuf9uUqzlpfCQ6A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "Python-2.0", + "peer": true + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/focus-trap": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-8.2.2.tgz", + "integrity": "sha512-qV0g8hRYBqgACcFOH3f9wXc4zPKhr/0z9RI2a6ZijZ72EeBi4g8oBy8zAWuUR1TsMpOzwpUMFvjdasrC41Joug==", + "dev": true, + "license": "MIT", + "dependencies": { + "tabbable": "^6.5.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/linkify-it": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-6.1.0.tgz", + "integrity": "sha512-wJ/TwpSDTLepCrQoYWYIExIKg5Zchex2Nn5yk2mFnB+6PtdkHtyLx742md9csRjjOnGkKIS/RrbY7l8D6gT9Vw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "uc.micro": "^3.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/markdown-it": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-15.0.0.tgz", + "integrity": "sha512-Lf8ajvVNdRpzSNB4VegxNy7gjs8gU35l4b4+ET49LrQC5PKYwLZ72u60LeJ9gv3qiaesuYjJWCyVeQmv/QWKQw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "argparse": "^3.0.0", + "entities": "^8.0.0", + "linkify-it": "^6.0.0", + "mdurl": "^2.1.0", + "punycode.js": "^2.3.1", + "uc.micro": "^3.0.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdurl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.1.0.tgz", + "integrity": "sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/minisearch": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", + "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/oniguruma-parser": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", + "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", + "dev": true, + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", + "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.2", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true, + "license": "MIT" + }, + "node_modules/rolldown": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz", + "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.146.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.5", + "@rolldown/binding-android-arm64": "1.2.5", + "@rolldown/binding-darwin-arm64": "1.2.5", + "@rolldown/binding-darwin-x64": "1.2.5", + "@rolldown/binding-freebsd-x64": "1.2.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.5", + "@rolldown/binding-linux-arm64-gnu": "1.2.5", + "@rolldown/binding-linux-arm64-musl": "1.2.5", + "@rolldown/binding-linux-ppc64-gnu": "1.2.5", + "@rolldown/binding-linux-s390x-gnu": "1.2.5", + "@rolldown/binding-linux-x64-gnu": "1.2.5", + "@rolldown/binding-linux-x64-musl": "1.2.5", + "@rolldown/binding-openharmony-arm64": "1.2.5", + "@rolldown/binding-win32-arm64-msvc": "1.2.5", + "@rolldown/binding-win32-x64-msvc": "1.2.5" + } + }, + "node_modules/shiki": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.4.3.tgz", + "integrity": "sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.4.3", + "@shikijs/engine-javascript": "4.4.3", + "@shikijs/engine-oniguruma": "4.4.3", + "@shikijs/langs": "4.4.3", + "@shikijs/themes": "4.4.3", + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tabbable": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz", + "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/uc.micro": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-3.0.0.tgz", + "integrity": "sha512-U3PppEkleoTnIfi8BozMx3yju3qc/L6SwqWo2Sw+54PX+PX0q9I+r1Um5HCmqD7n9VDX5/v3vQH/AjA6deDdtw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.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" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "2.0.0-alpha.19", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-2.0.0-alpha.19.tgz", + "integrity": "sha512-WnBsb0Bwr43kXKyiis+lld/7ri3hnMbthS8N3hpFtjjwsdLO4IRmiAE08D7aud4q6oMDf9uwRowxzNqRFe/amw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/css": "^4.7.0", + "@docsearch/js": "^4.7.0", + "@docsearch/sidepanel-js": "^4.7.0", + "@iconify-json/simple-icons": "^1.2.92", + "@shikijs/core": "^4.4.1", + "@shikijs/transformers": "^4.4.1", + "@shikijs/types": "^4.4.1", + "@types/markdown-it": "^14.1.2", + "@vitejs/plugin-vue": "^6.0.8", + "@vue/devtools-api": "^8.2.1", + "@vue/shared": "^3.5.40", + "@vueuse/core": "^14.4.0", + "@vueuse/integrations": "^14.4.0", + "focus-trap": "^8.2.2", + "mark.js": "8.11.1", + "minisearch": "^7.2.0", + "shiki": "^4.4.1", + "vite": "^8.2.0", + "vue": "^3.5.40" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.41.tgz", + "integrity": "sha512-2laE0p+aK+/AOPG/XL/WepOs/GlK755LJ1XECi9kDUrz1FKNw8rb2Xzlw9JS1rqEV55nb0ttsKxVlTCcd+R5cg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.41", + "@vue/compiler-sfc": "3.5.41", + "@vue/runtime-dom": "3.5.41", + "@vue/server-renderer": "3.5.41", + "@vue/shared": "3.5.41" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..05c3e01 --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "devDependencies": { + "@mdit/plugin-footnote": "^1.1.0", + "vitepress": "^2.0.0-alpha.15" + }, + "scripts": { + "dev": "vitepress dev docs", + "build": "vitepress build docs", + "preview": "vitepress preview docs" + }, + "dependencies": { + "@fortawesome/fontawesome-svg-core": "^7.3.1", + "@fortawesome/free-brands-svg-icons": "^7.3.1", + "@fortawesome/free-regular-svg-icons": "^7.3.1", + "@fortawesome/free-solid-svg-icons": "^7.3.1", + "@fortawesome/vue-fontawesome": "^3.3.3", + "vue": "^3.5.41" + } +} diff --git a/readme.md b/readme.md index 106972e..d937d29 100644 --- a/readme.md +++ b/readme.md @@ -23,13 +23,13 @@
- Logo + Logo -

Tickets v2 Documentation

+

Tickets Documentation

- All documentation for the Discord bot "Tickets v2" + All documentation for the Discord bot "Tickets"
Explore the docs Β»
@@ -71,9 +71,9 @@ ## About The Project -![Tickets Screen Shot](/src/img/tickets_docs_readme_intro.webp) +![Tickets Screen Shot](/docs/src/img/readme/tickets_docs_readme_intro.webp) -User-facing documentation for [Tickets v2](https://tickets.bot). Tickets is a simple, customisable, and powerful Discord ticket system bot complete with a web UI. +User-facing documentation for [Tickets](https://tickets.bot). Tickets is a simple, customisable, and powerful Discord ticket system bot complete with a web UI.

(back to top)

@@ -96,13 +96,15 @@ To get a local copy up and running follow these simple example steps: ### Prerequisites -section coming soon +[Node.JS](https://nodejs.org/) v20 or higher is installed + ### Installation -SECTION COMING SOON +1. Install dependencies by running: `npm i` + +2. Run: `npm run dev` or `npx vitepress dev docs` to get a local instance running which will allow you to preview your changes in a live updating preview on `http://localhost:5173/`. -to preview changes on `http://localhost:3000/` run `mdbook serve`

(back to top)

@@ -111,7 +113,7 @@ to preview changes on `http://localhost:3000/` run `mdbook serve` ## Usage -![Tickets Docs Screen Shot](/src/img/tickets_docs_readme_usage.webp) +![Tickets Docs Screen Shot](/docs/src/img/readme/tickets_docs_readme_usage.webp)

(back to top)

@@ -128,9 +130,10 @@ Don't forget to give the project a star! Thanks again! 1. Fork the Project 2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`) -3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`) -4. Push to the Branch (`git push origin feature/AmazingFeature`) -5. Open a Pull Request +3. Make your Changes. Copy the changed file(s) and replace the original/add it in the translation directories. +4. Commit your Changes (`git commit -m 'Add some AmazingFeature'`) +5. Push to the Branch (`git push origin feature/AmazingFeature`) +6. Open a Pull Request

(back to top)

diff --git a/src/SUMMARY.md b/src/SUMMARY.md deleted file mode 100644 index 8926ad5..0000000 --- a/src/SUMMARY.md +++ /dev/null @@ -1,62 +0,0 @@ -# SUMMARY -[Introduction](./introduction/introduction.md) - -- [Setup](./setup/introduction.md) - - [Inviting the Bot](./setup/invite.md) - - [Language Customisation](./setup/languages.md) - - [Bot Configuration](./setup/configuration.md) - - [Web Dashboard](./setup/dashboard.md) - - [Auto](./setup/auto.md) - - [Individual Settings](./setup/individual.md) - - [Ticket Panels](./setup/panels.md) - - [Support Staff](./setup/staff.md) - -- [Commands](./commands/introduction.md) - - [Command List](./commands/commands.md) - - [Add Admin / Support](./commands/add-admin-support.md) - - [Close Requests](./commands/close-requests.md) - - [GDPR Data Request](./commands/gdpr.md) - -- [Dashboard](./dashboard/introduction.md) - - [Settings](./dashboard/settings/settings.md) - - [User Feedback](./dashboard/settings/feedback.md) - - [Exit Survey](./dashboard/settings/exit-survey.md) - - [Thread Mode](./dashboard/settings/thread-mode.md) - - [Placeholders](./dashboard/settings/placeholders.md) - - [Start Ticket From Message](./dashboard/settings/start-ticket-from-message.md) - - [Claiming Tickets](./dashboard/settings/claiming.md) - - [Awaiting User Response](./dashboard/settings/awaiting-response.md) - - [Transcripts](./dashboard/transcripts.md) - - [Panels](./dashboard/reaction-panels.md) - - [Multi-Panels](./dashboard/multipanels.md) - - [Forms](./dashboard/forms.md) - - [Staff Teams](./dashboard/staff-teams.md) - - [Integrations](./integrations/introduction.md) - - [Building Integrations](./integrations/building-integrations.md) - - [A Note on Cloudflare Workers](./integrations/cloudflare-workers.md) - - [FiveM Integration](./integrations/fivem.md) - - [Tickets](./dashboard/tickets.md) - - [Blacklist](./dashboard/blacklist.md) - - [Tags](./dashboard/tags.md) - -- [Premium](./premium/introduction.md) - - [Premium and Whitelabel Perks](./premium/perks.md) - - [Whitelabel Setup Guide](./premium/whitelabel-setup-guide.md) - - [Whitelabel Intents](./premium/whitelabel-intents-application-guide.md) - -- [Features](./features/introduction.md) - - [Thread Mode](./features/thread-mode.md) - - [Forms](./features/forms.md) - - [Multi-Panels](./features/multipanels.md) - - [Start Ticket from Message](./features/start-ticket-from-message.md) - - [Close Requests](./features/close-requests.md) - - [User Feedback](./features/feedback.md) - - [Support Hours](./features/support-hours.md) - -- [Miscellaneous](./miscellaneous/introduction.md) - - [Official Tickets Links](./miscellaneous/official-links.md) - - [Patreon Links/Articles](./miscellaneous/patreon.md) - - [Permissions Explained](./miscellaneous/permissions-explained.md) - - [Placeholders](./miscellaneous/placeholders.md) - - [Translate the Bot](./miscellaneous/translate.md) - - [Dashboard: "No Permission"](./miscellaneous/dashboard-no-permission.md) diff --git a/src/commands/add-admin-support.md b/src/commands/add-admin-support.md deleted file mode 100644 index e613f0c..0000000 --- a/src/commands/add-admin-support.md +++ /dev/null @@ -1,22 +0,0 @@ -# Add Admin and Add Support -*** - -You can quickly add users to your Default Team in [Staff Teams](../dashboard/staff-teams.md) with these commands. - -There is a major difference between the two, so let's cover that: - -## Add Admin -**Command:** `/addadmin @username`, `/addadmin @role` - -Not only does this add the specified user to the Default Team in Staff Teams, but it also gives that user full administrative privileges of the Tickets bot for your server. This is just having admin of the Tickets bot, **not your server**. -- Having admin privileges of the bot means the user will be able to use the [web dashboard](https://dashboard.tickets.bot) fully, and control all the configuration, settings, customization of the bot, as well as see ALL of the tickets/transcripts contained there. *Only give this privilege to those you trust.* - -## Add Support -**Command:** `/addsupport @role` - -
- - **Warning:** Users in Support Teams are now deprecated. Please migrate to roles. -
- -This adds the specified user to the Default Team in Staff Teams. The only thing they will be able to see on the web dashboard are the tickets where the Default Team has been assigned as a support team. \ No newline at end of file diff --git a/src/commands/close-requests.md b/src/commands/close-requests.md deleted file mode 100644 index 076fad3..0000000 --- a/src/commands/close-requests.md +++ /dev/null @@ -1,22 +0,0 @@ -# Close Requests -*** - -Another unique feature of Tickets is close requests. - -When you feel a ticket is able to be closed, you can use the `/closerequest` command to ask the user to confirm they feel everything is resolved: - -![Close Request](../img/close_request.webp) - -If the user chooses to deny the request, the message will be updated: - -![Denied](../img/close_request_deny.webp) - -## Close Delay - -Additionally, you can specify a time (in hours) after which the ticket will be closed automatically if the user has not responded, and a reason for closure of the ticket: - -![Params](../img/close_request_params.webp) - -If a close delay is not specified, the ticket will not be closed until the user accepts the request. - -> **Note:** If a ticket is excluded from being automatically closed via `/autoclose exclude`, close request delays will not apply, even if provided. \ No newline at end of file diff --git a/src/commands/commands.md b/src/commands/commands.md deleted file mode 100644 index 6f881b5..0000000 --- a/src/commands/commands.md +++ /dev/null @@ -1,57 +0,0 @@ -# Command List -*** - -| General Commands | Description | -| -- | -- | -| /about | Information about the bot | -| [/gdpr](./gdpr.md) (lang) | Request deletion or anonymization of your data under GDPR | -| /help | Displays a list of commands | -| /invite | Provides an invite link for the bot | -| /vote | Gives a link to vote for free premium beneftis                                         | - -| Ticket Commands | Description | -| -- | -- | -| /add (user_or_role) | Add a user or role to an existing ticket | -| /claim | Assigns a single staff member to the current ticket | -| /close (reason) | Closes the current ticket | -| [/closerequest](../features/close-requests.md) (close_delay) (reason)                                    | Sends a message asking the ticket opener to approve or deny closing of the ticket | -| /jumptotop | Displays a button to click and will automatically scroll to the top of the ticket | -| /on-call | Toggles whether the user of command will be added and pinged to all new thread mode tickets | -| /open (subject) | Opens a new ticket | -| /remove (user_or_role) | Removes a user or role from the current ticket | -| /rename (new_ticket_name) | Renames the current ticket | -| /reopen (ticket ID) | reopens a thread ticket that was previously closed | -| /switchpanel (to_panel) | Switches the current ticket to another ticket panel - changing the channel category, support teams, etc | -| /transfer (user) | Transfers a claimed ticket to another user | -| /unclaim | Removes the claim on the current ticket | -| /notes | Creates a private thread for staff to talk in, only works in channel mode | - -| Setting Commands | Description | -| -- | -- | -| [/addadmin](./add-admin-support.md) (user_or_role) | Grants a user or role admin priveledges of the bot | -| [/addsupport](./add-admin-support.md) (user_or_role) | Adds a user or role as a support representative | -| /autoclose configure | Edit autoclose related settings | -| /autoclose exclude | Excludes the current ticket from being automatically closed | -| /blacklist (user_or_role) | Toggles whether users are allowed to interact with the bot | -| /language (language) | Changes the language the bot messages are displayed in | -| /panel | Provides a link to create a reaction panel for users to open tickets | -| /premium | Activates premium benefits after purchasing (choose patreon on select menu) | -| /removeadmin (user_or_role) | Revokes a user's or role's admin priveledges | -| /removesupport (user_or_role) | Revokes a user's or role's support representative priviledges | -| /setup auto | Bot will make a very basic configuration (no reaction panels - you'll still want to customize on dashboard) | -| /setup limit | Change the quantity of tickets a single user can have open at the same time | -| /setup transcripts | Change the transcripts channel | -| /setup use-threads | Toggle if the bot creates new threads or new channels | -| /viewstaff | Lists the staff members and roles (admin or support) | - -| Tag Commands | Description | -| -- | -- | -| /managetags add | Adds a new tag | -| /managetags delete                         | Deletes a tag | -| /managetags list | Lists all existing tags | -| /tag (tag_id) | Sends a message snippet                                                      | - -| Statistics Commands  | Description | -| -- | -- | -| /stats user | Displays statistics about the selected user                                            | -| /stats server | Displays statistics about the server | diff --git a/src/commands/introduction.md b/src/commands/introduction.md deleted file mode 100644 index 6e8adda..0000000 --- a/src/commands/introduction.md +++ /dev/null @@ -1,4 +0,0 @@ -# Commands -This chapter provides some information regarding key commands. - -Use the sidebar to navigate this chapter. \ No newline at end of file diff --git a/src/dashboard/blacklist.md b/src/dashboard/blacklist.md deleted file mode 100644 index 1e874dd..0000000 --- a/src/dashboard/blacklist.md +++ /dev/null @@ -1,40 +0,0 @@ -# Blacklist -*** - -Upon opening the `Blacklist` tab, there will be one main area that displays two buttons and any users/roles that have been blacklisted in your discord server. - -![Blacklist card](../img/blacklist_card.webp) - -## Blacklist New User -To blacklist an individual user from being able to open a ticket, use this button. Once clicked, a new window will appear with a search input. - -![Blacklist user modal](../img/blacklist_user_modal.webp) - -Start typing the username here and select it when found. - -![Blacklist user selection](../img/blacklist_user_selection.webp) - -Once the selection is confirmed, a success message will display and the username and ID will be displayed under the `Blacklisted User` section. - -![Blacklist user success](../img/blacklist_user_success.webp) -![Blacklisted user example](../img/blacklist_user_card.webp) - -### Notes - -- Users can also be found by their ID, rather than their username. The `USE USER ID` toggle can be flipped to green and the user ID search input will appear. Paste the user ID here and hit `Confirm` to blacklist. -- User ID's can be found if you have turned on the Discord Developer Mode. This can be found in your user settings. - - Right click any username and choose `Copy ID` - -![Discord developer mode](../img/developer_mode.webp) - -#### Blacklist New Role -To blacklist a role from being able to open a ticket, use this button. Once clicked, a new window will appear with a search input. - -- This is very similar to blacklisting an individual user. - -#### Role / User -Those who have been blacklisted will appear in these sections. - -- Any role/user can be allowed to make tickets again by removing them from the blacklist by clicking the corresponding `Remove` button next to the role/username. - -![Blacklisted role example](../img/blacklist_role_card.webp) diff --git a/src/dashboard/forms.md b/src/dashboard/forms.md deleted file mode 100644 index a9c2449..0000000 --- a/src/dashboard/forms.md +++ /dev/null @@ -1,51 +0,0 @@ -# Forms -*** - -Tickets has the ability to prompt users for answers to pre-defined questions when opening a ticket: - -![Example](/img/forms/example.webp) - -To set this up, a form must first be created and then applied to a [Ticket Panel](../dashboard/reaction-panels.md). It is possible to assign a single form to multiple different types of tickets. - -## Basic Video Walkthrough - - -## Creating the Form -First, head over to the [web dashboard](https://dashboard.tickets.bot) and select your server. - -Then, select the `Forms` tab in the navigation bar: - -![Navbar select](../img/forms/forms_navbar.webp) - -You can now create your first form. Enter a name for it, and press `Create`: - -![Form Creation](../img/forms/create.webp) - -Next, select your form from the `Manage Forms` dropdown list, and add up to 5 inputs. Enter a label for the question, some placeholder text, and select the type of input: - -![Input Creation](../img/forms/inputs.webp) - -> **Note the discord imposed limitations for forms:** -> - Maximum of 5 inputs per form -> - Currently only supports text input style - no radio buttons, or checkboxes -> - Maximum character limits -> - Name - 45 -> - Labels - 45 -> - Placeholder - 100 - -Make sure to save your inputs. -Your form has now been created. In order to show it to users, you must assign it to a `Ticket Panel`. - -## Assign Form to a Panel -Head over to the `Ticket Panels` page of the dashboard via the top navigation bar, as shown in the [panels](../setup/panels.md) documentation. - -Either create a new ticket panel, or choose an existing one to edit. You will notice a dropdown labeled `Form`. Expand this dropdown, and select your new form: - -![Form assignment](../img/forms/assignment.webp) - -Save your changes, and then test it out! - -![Output example](../img/forms/output.webp) - -## Multipanels -When using [multi-panels](./multipanels.md) (different types of tickets combined into 1 message with multiple buttons), the form shown to the user is the form associated to the panel of the button clicked. diff --git a/src/dashboard/introduction.md b/src/dashboard/introduction.md deleted file mode 100644 index c3ac70f..0000000 --- a/src/dashboard/introduction.md +++ /dev/null @@ -1,4 +0,0 @@ -# Dashboard -This chapter provides information regarding configuring the bot using the web dashboard. - -Use the sidebar to navigate this chapter. \ No newline at end of file diff --git a/src/dashboard/multipanels.md b/src/dashboard/multipanels.md deleted file mode 100644 index 28d7169..0000000 --- a/src/dashboard/multipanels.md +++ /dev/null @@ -1,74 +0,0 @@ -# Multi Panels -*** - -Multi-panels are the combination of 2 or more Ticket Panels in a single embed: - -![Multipanel example](../img/multipanel_example.webp) - -## Creating A Multi-panel -In order to create a multi-panel, you'll need to head over to the web dashboard and select your server. If you're unfamiliar with how to do that, read our [guide on the web dashboard here](../setup/dashboard.md). - -Once on your server's main settings page, select `Ticket Panels` in the navigation bar: - -![Ticket panel page](../img/panels_navbar.webp) - -You'll want to focus on the *right* side of the screen. The left side are settings for individual panels (known as [Ticket Panels](../dashboard/reaction-panels.md).) - -Draw your attention to the `New Multi-Panel` card. You'll configure the panel's appearance here: - -![Multipanel card](../img/multipanel_card.webp) - -### Panel Title -The panel title is the bold text at the _top_ of the embed. - -> **Note:** The panel title has a maximum length of 255 characters, and by default, it is set to `Open a ticket!`. - -### Panel Content -The panel content is the text in the long description of the embed. We recommend providing a general overview of how your support system works, such as which languages the support agents are fluent in. - -> **Note:** The panel content has a maximum length of 1024 characters. - -### Panel Colour -This is the colour on the left side of the embed. When clicked, a colour picker will open as shown below: - -![Colour picker](../img/colour_picker.webp) - -### Panel Channel -This is the channel that the multi-panel will be sent in for users to react to. Therefore, this channel should be accessible to your users, and be the only message in the channel to avoid confusion. - -**This should not be the same as your archive / transcript channel.** - -### Panels -This input field is where you select which of your already made individual panels you'd like to include in the multi-panel. - -### Use Dropdown Menu -- **Unchecked** = Ticket options appear as clickable buttons. -- **Checked** = Ticket options appear as a dropdown menu. - -## Advanced Settings -Upon clicking `Toggle Advanced Settings`, you'll have extra fields displayed to you: -- [Large Image URL](#large-image-url) -- [Small Image URL](#small-image-url) - -### Large Image URL -Input a URL link to an image here, it will be shown **underneath the welcome message**. -- *File path MUST end in .png - easy trick is to send the image as a message in a discord channel, then right click the message and choose "Copy Link." Paste link into the input.* - -### Small Image URL -Input a URL link to an image here, it will be shown to the **right of the welcome message**. -- *File path MUST end in .png - easy trick is to send the image as a message in a discord channel, then right click the message and choose "Copy Link." Paste link into the input.* - -## Completion -Once you have configured the multi-panel to your liking, click `Submit` and the panel will be created in your server. You should be shown a success message in the bottom right hand corner of your screen if successful, or an appropriate error message if you made a mistake: - -![Success](../img/panel_success.webp) - -- If you leave any fields blank, the default values will be used. - -## Editing -If you wish to update a multi-panel at a later date, simply click the edit button in the list of multi-panels and the editing modal will be opened: - -![Multipanel edit](../img/multipanel_edit.webp) -![Multipanel edit modal](../img/multipanel_edit_modal.webp) - -You can also delete a multi-panel by clicking the `Delete` button, or deleting the message containing the multi-panel in Discord. If you only delete the message in Discord, the multi-panel will continue to exist on your Dashboard and you can resubmit it to Discord if needed. diff --git a/src/dashboard/reaction-panels.md b/src/dashboard/reaction-panels.md deleted file mode 100644 index 4883c4b..0000000 --- a/src/dashboard/reaction-panels.md +++ /dev/null @@ -1,178 +0,0 @@ -# Panels -*** -## Basic Video Walkthrough - - -# Creating A Panel -In order to create a ticket panel, head over to the web dashboard and select your server. If unfamiliar with how to do that, read our [guide on the web dashboard here](../setup/dashboard.md). - -Once on your server's main settings page, select `Ticket Panels` in the navigation bar to be taken to the ticket panel configuration page which looks as follows: - -![Ticket panel page](../img/panels_navbar.webp) - -Focus on the _left_ side of the screen. The right side are settings for combining different panels into a single message. - -Draw your attention to the `New Panel` card. Configure the panel's appearance here: - -![Panel card](../img/panel_card.webp) - - -## Ticket Properties -*** - - -### Mention On Open -Specify a list of roles/users to mention after the ticket is opened. - -> **Note:** This will not work for those who have their notification settings on mute. - -### Support Teams -Input which `Staff Teams` will handle tickets created from this reaction panel. - -### Ticket Category -Designates the channel category that the ticket channel will be created under. If unsure of what a channel category is, Discord has a guide explaining them available [here](https://support.discord.com/hc/en-us/articles/115001580171-Channel-Categories-101). - -Ticket panels use different channel categories to the one configured on the main settings tab to allow for distinction when using multiple reaction panels - meaning it is possible to have each "type" of ticket open in it's own category for easier organization. - -### Form -Assign a form to the panel. - -- _Learn more about Forms [here](../features/forms.md)._ - -### Naming Scheme -This toggle can be used to change the naming scheme of the ticket channels. If it's left on green, it will use the naming scheme set in the `Settings` portion of the Dashboard. If it's flipped to grey, a custom scheme can be setup. - -- Placeholders can be used in the custom naming scheme. View a list of placeholders [here](../miscellaneous/placeholders.md#custom-naming-scheme-placeholders). - -### Exit Survey Form - -Users can be requested to leave feedback when their ticket is closed. - -- _Learn more about Exit Surveys [here](../dashboard/settings/exit-survey.md)._ - -> **Note:** This is a premium feature. Learn more about premium [here](https://tickets.bot/premium). - -### Awaiting Response Category -Tickets awaiting a user's response can be moved to a different category. - -- _Learn more about Awaiting Response Category [here](../dashboard/settings/awaiting-response.md)._ - -> **Note:** This is a premium feature. Learn more about premium [here](https://tickets.bot/premium). - -### Cooldown -Set a per-user cooldown (in seconds) to prevent users from opening multiple tickets on the same panel in quick succession. When a user opens a ticket, they must wait for the cooldown period to elapse before they can open another ticket on this panel. - -- A value of `0` disables the cooldown (default). -- Staff members (Support role and above) are exempt from cooldowns. -- Cooldowns are tracked per user, per panel β€” different panels can have different cooldown durations. -- Admins can reset all active cooldowns for a panel from the dashboard using the `Reset Cooldowns` button. - -### Hide Claim Button -Toggle whether the `Claim` button is shown in tickets opened from this panel. This overrides the server-wide default set in the Settings page. - -- _Learn more about Claiming [here](../dashboard/settings/claiming.md)._ - -### Hide Close Button -Toggle whether the `Close` button is shown in tickets opened from this panel. This overrides the server-wide default set in the Settings page. - -### Hide Close with Reason Button -Toggle whether the `Close with Reason` button is shown in tickets opened from this panel. This overrides the server-wide default set in the Settings page. - -### Support Hours -Configure time-based restrictions on when tickets can be opened from this panel. Support hours are configured per day of the week with a start and end time in a timezone of your choice. - -- _Learn more about Support Hours [here](../features/support-hours.md)._ - -> **Note:** Free servers can configure support hours on 1 panel. Premium servers have no limit. Learn more about premium [here](https://tickets.bot/premium). - -## Panel Message -*** - -### Panel Title -The panel title is the bold text at the _top_ of the embed. - -> **Note:** The panel title has a maximum length of 255 characters, and by default, it is set to `Open a ticket!`. - -### Panel Content -The panel content is the text in the long description of the embed. We recommend providing a general overview of how your support system works, such as which languages the support agents are fluent in. - -> **Note:** The panel content has a maximum length of 1024 characters. - -### Panel Colour -This is the colour on the left side of the embed. When clicked, a colour picker will open as shown below: - -![Colour picker](../img/colour_picker.webp) - -### Panel Channel -This is the channel that the ticket panel will be sent in for users to react to. Therefore, this channel should be accessible to all members, and be the only message in the channel to avoid confusion. - -> **Note:** This should **NOT** be the same as your transcript channel. - -### Disable Panel -Enable this checkbox to disable users from opening tickets from this panel. - -### Button Colour -Choose the colour of the button. - -### Button Text -Enter the text that the button will contain. - -### Button Emoji -This is the emoji that users will click in order to open a ticket. The emoji can either be pasted directly into the box, for example: `πŸ“©`, or the Discord name can be used, for example: `envelope_with_arrow` (colons are optional.) - -Custom emojis from your server can be used by clicking the toggle to show green instead of grey. When toggled on, the input field will show you a list of your available emojis to choose from. - -### Large Image URL -Input a URL link to an image here, it will display **underneath the welcome message**. - - -- _File path MUST end in .png - easy trick is to send the image as a message in a discord channel, then right click the message and choose "Copy Link." Paste link into the input._ - -### Small Image URL -Input a URL link to an image here, it will display to the **right of the welcome message**. - - -- _File path MUST end in .png - easy trick is to send the image as a message in a discord channel, then right click the message and choose "Copy Link." Paste link into the input._ - - -## Welcome Message -*** - -The server's welcome message can be overridden on a per-panel basis using this field. If left blank, the welcome message from the main settings page will be used. - -> **Note:** the message has a maximum limit of 4096 characters due to Discord limitations. - -- Placeholders can be used in the welcome message. View a list of placeholders [here](../miscellaneous/placeholders.md). - -- Discord message formatting can also be used to include links to channels, emojis, roles, or usernames in the welcome message. - - **First**, discord developer mode must be turned on - in your personal discord account settings > advanced > discord developer mode. - - **Second**, right click any channel name, username, message, etc and choose `Copy ID`. - - **Third**, use the `structure` section of [discord's messge formatting chart](https://discord.com/developers/docs/reference#message-formatting) to include it in the welcome message. - -## Access Control -*** - -You can now specify a list of roles that can / can't open a ticket with each panel. The access control list is evaluated from top-to-bottom, stopping after the first match. - -In the image below only users with the `Whitelabel`, `Patrons`, or `Nitro Booster` roles can open tickets, but not if they have the `Muted` role. - -![Access control](../img/access_control.webp) - - -## Completion -*** - -Once the ticket panel has been configured, click `Create` and the panel will be created in the server. A success message should be shown in the bottom right hand corner of the screen if successful, or an appropriate error message if there was a mistake: - -![Success](../img/panel_success.webp) - -- If any fields are left blank, the default values will be used. - - -## Editing -*** - -Ticket panels can be edited at a later date. Simply click the `Edit` button in the list of panels and the editing modal will be opened: -![Panel edit](../img/panel_edit.webp) - -A panel can also be deleted by clicking the `Delete` button, or deleting the message containing the panel in Discord. If only the message in Discord is deleted, the panel will continue to exist on the Web Dashboard and can be resubmitted to Discord if needed, by clicking the `Resend` button. diff --git a/src/dashboard/settings/awaiting-response.md b/src/dashboard/settings/awaiting-response.md deleted file mode 100644 index 8512d9f..0000000 --- a/src/dashboard/settings/awaiting-response.md +++ /dev/null @@ -1,15 +0,0 @@ -# Awaiting User Response -*** - -Setting a category for ticket channels which are awaiting the user's response to be moved to. This feature is highly useful for being able to tell which tickets require a response from staff members, and reduces clutter in your ticket categories. - -> **Note:** Channel mode only. Discord does not allow threads to be moved. For more differences between the two modes, click [here](./thread-mode.md#channel-vs-thread-comparison). - - -![Awaiting response](../../img/awaiting_response.webp) - -This setting can be controlled for each `Ticket Panel` individually. The ticket channel will be moved to the awaiting response category 10 minutes after the last response from a staff member. - -Due to Discord limitations, a channel can only be updated twice every 10 minutes, so it is not possible to change how quickly the channel gets moved to the awaiting response category. - -> **Note:** This feature is only for servers that have premium activiated. Learn more about premium [here](https://tickets.bot/premium). \ No newline at end of file diff --git a/src/dashboard/settings/claiming.md b/src/dashboard/settings/claiming.md deleted file mode 100644 index e582299..0000000 --- a/src/dashboard/settings/claiming.md +++ /dev/null @@ -1,33 +0,0 @@ -# Claiming -*** - -> **Note:** Channel mode only. Discord does not allow threads to be claimed. For more differences between the two modes, click [here](./thread-mode.md#channel-vs-thread-comparison). - -Tickets can be claimed by a staff member, so other staff members cannot also reply to the ticket. The benefit of this is that tickets become less cluttered with many staff members talking at once. -Alternatively, an admin could claim a ticket to keep the support team from seeing potentially sensitive issues. - -> **Note:** Those with Administrator permissions in your server will always have access to any claimed ticket, as well as the user who claimed it. - -## Commands Related to Claiming -- **/claim** - Assigns you to a ticket -- **/transfer @User** - Transfers a claimed ticket to another user -- **/unclaim** - Removes the claim on the current ticket - -## Claiming can be configured in 3 ways -- All staff members can see the ticket, but only the claimer can reply (Default) -- All staff members can see the ticket, and all staff members can reply -- Only the claimer can see the ticket - -## Panel Switch Behavior -When a claimed ticket is switched to a different panel using `/switchpanel`, the claimer may not have access to the new panel's support team. This setting controls what happens in that scenario: - -- **Auto Unclaim** (Default) - The ticket is automatically unclaimed when switched to a panel the claimer doesn't have access to -- **Block Switch** - Prevents switching to a panel if the claimer doesn't have access to it. The ticket must be unclaimed first before switching -- **Remove On Unclaim** - Allows the switch, but removes the claimer's access to the ticket when they unclaim it -- **Keep Access** - Allows the switch and keeps the claimer's access to the ticket even after unclaiming - -> **Note:** This setting only applies when the claimer doesn't have access to the new panel. If the claimer has access to both panels, the ticket remains claimed and no special handling is needed. - -You can configure these settings on the dashboard's settings tab: - -![Claim Settings](../../img/settings_claim.webp) diff --git a/src/dashboard/settings/exit-survey.md b/src/dashboard/settings/exit-survey.md deleted file mode 100644 index e28e396..0000000 --- a/src/dashboard/settings/exit-survey.md +++ /dev/null @@ -1,14 +0,0 @@ -# Exit Survey -*** - -Users can be requested to leave feedback when their ticket is closed. - -## Enable Exit Survey -1. Ensure [user feedback](feedback.md#enabling-feedback) (star rating) is enabled -2. Create a [form](../../features/forms.md), as you normally would, but enter your feedback questions -3. Edit your [panels](../../setup/panels.md) and set the `Exit Survey Form` input to this new form - -The next time a user rates a ticket, they will also be prompted to fill out the feedback form. - -## View Exit Survey Responses -When a user leaves a survey response, the archive message in your `Transcript Channel` will be updated with a button to view their response. \ No newline at end of file diff --git a/src/dashboard/settings/feedback.md b/src/dashboard/settings/feedback.md deleted file mode 100644 index 814959e..0000000 --- a/src/dashboard/settings/feedback.md +++ /dev/null @@ -1,36 +0,0 @@ -# Feedback -*** - -Tickets allows your users to provide feedback on the support they received: -![Example screenshot](../../img/feedback_example.webp) - -## Enabling Feedback -In order for users to be asked to rate your service, you must first enable feedback on the [web dashboard](https://dashboard.tickets.bot/). - -Select your server and open the settings page: -![Enable feedback](../../img/feedback_enable.webp) - -Check the `Enable User Feedback` box and press submit. -Next time a user closes a ticket, they will be asked for feedback. - -## Viewing Feedback -There are several ways to view feedback: - -### Server Stats -If you are a [premium](https://tickets.bot/premium) subscriber, you can view your feedback statistics with `/stats server`: -![/stats server](../../img/feedback_stats.webp) - -### User Stats -If you are a [premium](https://tickets.bot/premium) subscriber, you can use `/stats user` to view the average rating on tickets claimed by a specific user: -![/stats user](../../img/feedback_user.webp) - -### Placeholders -You can include the following placeholders in your welcome message to display your feedback rating to users: -- %average_rating% -- %rating_count% - -> **Note:** View more placeholders by clicking [here](./placeholders.md). - -### Viewing Individual Ticket Ratings -You can view the ratings of individual tickets by navigating to the transcripts page on the dashboard. Next to each ticket, the rating given by the user will be shown: -![Individual ratings](../../img/feedback_transcripts.webp) diff --git a/src/dashboard/settings/placeholders.md b/src/dashboard/settings/placeholders.md deleted file mode 120000 index 9cf4312..0000000 --- a/src/dashboard/settings/placeholders.md +++ /dev/null @@ -1 +0,0 @@ -../../miscellaneous/placeholders.md \ No newline at end of file diff --git a/src/dashboard/settings/settings.md b/src/dashboard/settings/settings.md deleted file mode 100644 index 12899a3..0000000 --- a/src/dashboard/settings/settings.md +++ /dev/null @@ -1,166 +0,0 @@ -# Settings -*** - -Upon opening the `Settings` tab, extra sections will be displayed (with the first two being expanded): - -- [General](#general) -- [Thread Mode](#thread-mode) -- [Tickets](#tickets) -- [/Open Command](#open-command) -- [Context Menu (Start Ticket Dropdown)](#context-menu-start-ticket-dropdown) -- [Claiming](#claiming) -- [Auto Close](#auto-close) -- [Ticket Permissions](#ticket-permissions) -- [Colour Scheme](#colour-scheme) - -![Settings card](../../img/settings_card.webp) - -## General -Here you will find settings that affect the entire server, not just a specific ticket panel. - -### Per User Simultaneous Ticket Limit -Set the max amount of tickets a server member can have open at one time (staff is immune to this limit.) - -- _This is total number of tickets **per member**, not per panel._ - -### Language -Set the bot's language. - -- _Learn more about Language Customization [here](../../setup/languages.md)._ - -### Allow Users To Close Tickets -Toggle whether the server members that open tickets can close them (or if that will be a permission only given to staff.) - -### Ticket Close Confirmation -Toggle whether a second confirmation is required to close a ticket. - -![Ticket Close Confirmation](../../img/ticket_close_confirmation.webp) - -### Enable User Feedback -Toggle whether a user can provide a star rating feedback on the service they received. - -- _Learn more about User Feedback [here](../../setup/feedback.md)._ - -### Anonymise Dashboard Responses -Check this box to have all responses from the web dashboard come from the bot rather than the support staff. - -## Thread Mode -We now support using private threads for tickets! This is a new optional mode for the bot that drastically changes how tickets operate. - -- _Learn more about Thread Mode [here](../../features/thread-mode.md)._ - -### Enabled -Toggle whether tickets are created using Channel Mode or Thread Mode. - -- _Must be checked for rest of section to work._ - -### Ticket Notification Channel -Select which channel should receive the embedded messages containing a notification to your staff that a ticket has been opened. This same message will also have a button for your staff to click and join the ticket thread. - -## Tickets -This section has a few more optional settings. - -### Transcripts Channel -Select if/which channel should receive an embedded message containing a summary of each closed ticket. If you have also chosen to store transcripts (see below) there will also be a link to the transcript. Only those who had access to the ticket (plus all those with administration permissions in the server) will be able to access it. - -![Archive Message](../../img/archive_message.webp) - -### Overflow Category -Discord has a limit of 50 channels to a category (and 500 channels total per server), so here is where another category can be selected for tickets to go into if the first Ticket Category is full. - -- _Learn more about Ticket Category [here](../reaction-panels.md#ticket-category)._ - -### Store Ticket Transcripts -Toggle whether transcripts of each ticket are stored for later review by your staff. - -### Hide Claim Button -Toggle whether the `Claim` button is shown in each ticket. - -- _Learn more about Claiming [here](./claiming.md)._ - -### Hide Close Button -Toggle whether the `Close` button is shown in each ticket's welcome message. When enabled, the close button will be removed, though users and staff can still close tickets via the `/close` command. - -- _This setting acts as the server-wide default. It can be overridden on a per-panel basis in the panel's Ticket Properties._ - -### Hide Close with Reason Button -Toggle whether the `Close with Reason` button is shown in each ticket's welcome message. When enabled, the close with reason button will be removed, though users and staff can still close tickets with a reason via the `/close` command. - -- _This setting acts as the server-wide default. It can be overridden on a per-panel basis in the panel's Ticket Properties._ - -## /Open Command -This section has settings when using the `/open` command to create a ticket. - -### Disable /Open Command -Toggle whether server members can use `/open` to create a ticket. - -### Channel Category -Select which category the open tickets will display. - -### Naming Scheme -Select a naming scheme: -Ticket followed by numbers or Ticket followed by the username of opener. - -### Welcome Message -The welcome message is the message displayed in the Ticket as soon as the user opens it: - -![Welcome message](../../img/welcome_message.webp) - -> **Note:** the message has a maximum limit of 4096 characters due to Discord limitations. - -- Placeholders can be used in the welcome message. View a list of placeholders [here](./placeholders.md). - -- Discord message formatting can also be used to include links to channels, emojis, roles, or usernames in the welcome message. - - **First**, discord developer mode must be turned on - in your personal discord account settings > advanced > discord developer mode. - - **Second**, right click any channel name, username, message, etc and choose `Copy ID`. - - **Third**, use the `structure` section of [discord's messge formatting chart](https://discord.com/developers/docs/reference#message-formatting) to include it in the welcome message. - -The title of the embed will either be based off of the subject provided by the user when using `/open [Subject]`, or the title will show "No subject given" if one wasn't input. - -## Context Menu (Start Ticket Dropdown) -This section has settings dealing with tickets that are created via the context menu (right clicking a message.) - -- There is a dedicated page documenting this section [here](../../features/start-ticket-from-message.md). - -## Claiming -This section has the settings dealing with claiming tickets. - -- There is a dedicated page documenting this section/feature [here](./claiming.md). - -## Auto Close -This section has settings dealing with automated closing of tickets. - -### Enabled -Toggle whether any auto-close features work or not. - -- _Must be checked for rest of section to work._ - -### Close On User Leave -Toggle whether you'd like open tickets to be automatically closed if the Ticket Opener leaves the server. - -### Since Open With No Response -Set a timeframe in the boxes. If Ticket Opener does not type a message within that timeframe, the ticket will be closed automatically. - -- _This is a premium feature. Learn more about premium [here](https://tickets.bot/premium)._ - -### Since Last Message -Set a timeframe in the boxes. If no messages occur within that timeframe, the ticket will be closed automatically. - -- _This is a premium feature. Learn more about premium [here](https://tickets.bot/premium)._ - -## Ticket Permissions -In this area you can define if some permissions are given to the users who open tickets. - -- **Green toggle buttons** - user **will** receive this permission in their respective ticket channel. -- **Grey toggle buttons** - user **will not** receive this permission in their respective ticket channel. - -## Colour Scheme -Select custom colours for the embedded messages from Tickets bot. - -- _This is a premium feature. Learn more about premium [here](https://tickets.bot/premium)._ - -## Completion -Once you have configured these settings to your liking, click `Submit` for them to take effect in your server. - -## Editing -If you wish to update your settings at a later date, simply change the desired settings and click `Submit` again. diff --git a/src/dashboard/settings/start-ticket-from-message.md b/src/dashboard/settings/start-ticket-from-message.md deleted file mode 120000 index 70c945b..0000000 --- a/src/dashboard/settings/start-ticket-from-message.md +++ /dev/null @@ -1 +0,0 @@ -../../features/start-ticket-from-message.md \ No newline at end of file diff --git a/src/dashboard/settings/thread-mode.md b/src/dashboard/settings/thread-mode.md deleted file mode 120000 index 0ee0d44..0000000 --- a/src/dashboard/settings/thread-mode.md +++ /dev/null @@ -1 +0,0 @@ -../../features/thread-mode.md \ No newline at end of file diff --git a/src/dashboard/staff-teams.md b/src/dashboard/staff-teams.md deleted file mode 100644 index 9b1333d..0000000 --- a/src/dashboard/staff-teams.md +++ /dev/null @@ -1,51 +0,0 @@ -# Staff Teams -*** - -Staff Teams can be used to further customize which of your staff members can see, claim, respond to, and close specific types of tickets. This is possible because Staff Teams get linked to individual ticket panels however you see fit. Click to learn more about [ticket panels](../dashboard/reaction-panels.md) or the [support teams input](../dashboard/reaction-panels.md/#support-teams). - -## Basic Video Walkthrough - - -## Primary View -Upon opening the `Staff Teams` menu, there will be two main areas displayed: -- [Create Team](#create-team) -- [Manage Teams](#manage-teams) - -![Staff team card](../img/staff_teams_card.webp) - -## Create Team -Create new Staff Teams here by typing in a team name and clicking `Submit`. -- *A team must exist before it can be managed.* - -## Manage Teams -Options for managing a team: -- [Staff Teams](#staff-teams) - - [Basic Video Walkthrough](#basic-video-walkthrough) - - [Primary View](#primary-view) - - [Create Team](#create-team) - - [Manage Teams](#manage-teams) - - [Delete a Staff Team](#delete-a-staff-team) - - [Add Members / Roles to a Staff Team](#add-members--roles-to-a-staff-team) - - [Remove Members / Roles from a Staff Team](#remove-members--roles-from-a-staff-team) - - [Default Team](#default-team) - -![Manage teams card](../img/staff_teams_manage.webp) - -### Delete a Staff Team -Select the team you wish to delete, and a red `Delete` button will appear next to #1 of photo above. - -### Add Members / Roles to a Staff Team -- **Select** the team in which you wish to add the members/roles (**#1**) -- **Search** for the member or role you wish to add (**#3**) and click `+ Add To Team` -- **Member/Role will appear** in area **#2** of photo above - -### Remove Members / Roles from a Staff Team -- **Select** the team in which you wish to remove the members/roles (**#1**) -- **Click** `Delete` button next to the name of member/role to remove, in area **#2** of photo above - -![Delete from teams](../img/staff_teams_delete.webp) - -## Default Team -The Default team cannot be deleted. Those members/roles added with the `/addadmin` and `/addsupport` commands get added to this team automatically. -- *Learn more about these two commands [here](../commands/add-admin-support.md).* -- *Learn more about the rest of the commands [here](../commands/commands.md)* diff --git a/src/dashboard/tags.md b/src/dashboard/tags.md deleted file mode 100644 index 46e4c1c..0000000 --- a/src/dashboard/tags.md +++ /dev/null @@ -1,117 +0,0 @@ -# Tags -*** - -Tags are pre-defined snippets of text sent by the bot. These can be useful for quickly sending responses to commonly asked questions or concerns. - -## Primary View -Upon opening the `Tags` menu, there will be one main area that displays any tags that have been created and a button to create new tags. - -![Tags card](../img/tags_card.webp) - -When there are created tags, each tag name will show and some action buttons - `Edit` and `Delete` - -![Tags card with tag examples](../img/tags_card_example.webp) - -## Creating a Tag -Clicking the `+ Create Tag` button will bring up the Tag Editor. - -![Tag editor basic](../img/tags_editor_basic.webp) - -### Tag ID -This is the "name" of the tag and what will be used in the command (i.e. if ID is "docs", command is `/tag docs`.) - -![Tag ID example](../img/tags_id_example.webp) - -### Message Content -This is how the bot will respond when the command is used. - -**Note:** Tags support [placeholders](../miscellaneous/placeholders.md) when used in ticket channels. All welcome message placeholders work in tags, allowing you to create dynamic responses with user information, ticket details, and more. - -![Tag message example](../img/tags_message_example.webp) - -## Use Embed -- *Bot responses may also be in customisable embeds complete with images, if desired.* - -Flipping the `Use Embed` toggle to green will display some more sections: -- [Tags](#tags) - - [Primary View](#primary-view) - - [Creating a Tag](#creating-a-tag) - - [Tag ID](#tag-id) - - [Message Content](#message-content) - - [Use Embed](#use-embed) - - [Embed](#embed) - - [Author](#author) - - [Images](#images) - - [Footer](#footer) - - [Fields](#fields) - - [Using a Tag](#using-a-tag) - -![Tag editor advanced](../img/tags_editor_advanced.webp) - -### Embed - - **Embed Colour** - This is the colour on the left side of the embed. When clicked, a colour picker will open as shown below: - -![Colour picker](../img/colour_picker.webp) - - **Title** - The embed title is the bold text at the *top* of the embed. The embed title has a maximum length of 255 characters. - - - **Title URL (optional)** - The embed title can be turned into a hyperlink to a webpage by filling out this input. - - - **Description** - This is the message content of the embed. - -### Author - - **Author Name** - This will display **above the embed title**. - - - **Author Icon URL (optional)** - This will display to the **left of the author name**. - - - **Author URL (optional)** - The author name can be turned into a hyperlink to a webpage by filling out this input. - -### Images - - **Large Image URL** - Input a URL link to an image here, it will display at the **bottom of the embed**. - - *File path MUST end in .png - easy trick is to send the image as a message in a discord channel, then right click the message and choose "Copy Link." Paste link into the input.* - - - **Small Image URL** - Input a URL link to an image here, it will display at the **top right of the embed**. - - *File path MUST end in .png - easy trick is to send the image as a message in a discord channel, then right click the message and choose "Copy Link." Paste link into the input.* - -### Footer - - **Footer Text** - Will display **below the Large Image at the bottom of the embed**. This text is a little smaller than the Description. - - - **Footer Icon URL (optional)** - Input a URL link to an image here, it will display to the **left of the Footer Text**. - - *File path MUST end in .png - easy trick is to send the image as a message in a discord channel, then right click the message and choose "Copy Link." Paste link into the input.* - - - **Footer Timestamp (optional)** - Choose a date here, it will display **after the Footer Text**. - -### Fields - Additional fields can be added to the embed. Think of these as sections. The field name will appear in bold (as a title to the section), and the Field Value is the text within the section. - -![Tags full example](../img/tags_message_full_example.webp) - -*Example tag embed with Fields not inline* - - - **Field Name** - This is the title of the new field section that will appear in the embed. It will display in bold. - - - **Inline** - *Checked* = Fields display horizontally (columns on the same row) - *Unchecked* = Fields display vertically - - - **Field Value** - This is the description section of the new field that will appear in the embed. - -![Tags full example with inline fields](../img/tags_message_inline.webp) - -*Example tag embed with Fields inline* - -## Using a Tag -Within Discord, use the `/tag` command by typing `/tag` and selecting the tag ID from menu, or type the full `/tag [tagname]` diff --git a/src/dashboard/tickets.md b/src/dashboard/tickets.md deleted file mode 100644 index ea787de..0000000 --- a/src/dashboard/tickets.md +++ /dev/null @@ -1,33 +0,0 @@ -# Ticket List -*** - -Upon opening the `Tickets` menu, there will be one main area that displays any open tickets in your discord server. - -![Tickets card](../img/tickets_card.webp) - -## ID -The unique identification number of the ticket will display. - -## Panel -The ticket panel name of the ticket will display. -- *Learn more about Ticket Panels [here](./reaction-panels.md).* - -## User -The user who opened the ticket will display. - -## View -Click to view the current state of the ticket. - -If we clicked `View` on ticket #15, this would be displayed: - -![View card](../img/tickets_view_card.webp) - -For comparison, this is the current state of ticket #15 in the discord server: - -![View comparison](../img/tickets_view_compare.webp) - -The ticket can be closed from this view, with or without a reason specified. - -### Premium Perks -Those with premium, will get real-time updates, be able to respond to messages, and close the ticket in this view. -- *Learn more about premium [here](https://tickets.bot/premium).* \ No newline at end of file diff --git a/src/dashboard/transcripts.md b/src/dashboard/transcripts.md deleted file mode 100644 index 9e393ec..0000000 --- a/src/dashboard/transcripts.md +++ /dev/null @@ -1,32 +0,0 @@ -# Transcripts -*** - -Upon opening the `Transcripts` menu, you'll have two cards displayed to you: -- Filter Logs -- Transcripts - -![Transcripts card](../img/transcripts_card.webp) - -## Filter Logs -Here you can filter the transcripts displayed in the lower Transcripts section. - -Fill out the inputs as desired and click `Filter` button. - -## Transcripts -Here you can view transcripts of closed tickets. - -### Ticket ID -This unique ticket number cannot be reset or changed. - -### Username -Discord username of the ticket opener. - -### Rating -If user feedback is enabled, the feedback rating given by ticket opener will display. -- *Learn more about User Feedback [here](../setup/feedback.md).* - -### Close Reason -If `close with reason` button was selected (or `/close` was used and a reason was input), it will display. Otherwise, it will display "No reason specified." - -### Transcript -Click to view the transcript. \ No newline at end of file diff --git a/src/features/close-requests.md b/src/features/close-requests.md deleted file mode 100644 index 76b0b2c..0000000 --- a/src/features/close-requests.md +++ /dev/null @@ -1,22 +0,0 @@ -# Close Requests -*** - -Another unique feature of Tickets is close requests. - -When you feel a ticket is able to be closed, you can use the `/closerequest` command to ask the user to confirm they feel everything is resolved: - -![Close Request](../img/close_request.webp) - -If the user chooses to deny the request, the message will be updated: - -![Denied](../img/close_request_deny.webp) - -## Close Delay - -Additionally, you can specify a time (in hours) after which the ticket will be closed automatically if the user has not responded, and a reason for closure of the ticket: - -![Params](../img/close_request_params.webp) - -If a close delay is not specified, the ticket will not be closed until the user accepts the request. - -> **Note:** If a ticket is excluded from being automatically closed via `/autoclose exclude`, close request delays will not apply, even if provided. diff --git a/src/features/feedback.md b/src/features/feedback.md deleted file mode 100644 index 656d0cb..0000000 --- a/src/features/feedback.md +++ /dev/null @@ -1,36 +0,0 @@ -# Feedback -*** - -Tickets allows your users to provide feedback on the support they received: -![Example screenshot](../img/feedback_example.webp) - -## Enabling Feedback -In order for users to be asked to rate your service, you must first enable feedback on the [web dashboard](https://dashboard.tickets.bot/). - -Select your server and open the settings page: -![Enable feedback](../img/feedback_enable.webp) - -Check the `Enable User Feedback` box and press submit. -Next time a user closes a ticket, they will be asked for feedback. - -## Viewing Feedback -There are several ways to view feedback: - -### Server Stats -If you are a [premium](https://tickets.bot/premium) subscriber, you can view your feedback statistics with `/stats server`: -![/stats server](../img/feedback_stats.webp) - -### User Stats -If you are a [premium](https://tickets.bot/premium) subscriber, you can use `/stats user` to view the average rating on tickets claimed by a specific user: -![/stats user](../img/feedback_user.webp) - -### Placeholders -You can include the following placeholders in your welcome message to display your feedback rating to users: -- %average_rating% -- %rating_count% - -> **Note:** View more placeholders by clicking [here](../dashboard/settings/placeholders.md). - -### Viewing Individual Ticket Ratings -You can view the ratings of individual tickets by navigating to the transcripts page on the dashboard. Next to each ticket, the rating given by the user will be shown: -![Individual ratings](../img/feedback_transcripts.webp) diff --git a/src/features/forms.md b/src/features/forms.md deleted file mode 100644 index 2697ed0..0000000 --- a/src/features/forms.md +++ /dev/null @@ -1,51 +0,0 @@ -# Forms -*** - -Tickets has the ability to prompt users for answers to pre-defined questions when opening a ticket: - -![Example](/img/forms/example.webp) - -To set this up, a form must first be created and then applied to a [Ticket Panel](../dashboard/reaction-panels.md). It is possible to assign a single form to multiple different types of tickets. - -## Basic Video Walkthrough - - -## Creating the Form -First, head over to the [dashboard](https://dashboard.tickets.bot) and select your server. - -Then, select the `Forms` tab in the navigation bar: - -![Navbar select](../img/forms/forms_navbar.webp) - -You can now create your first form. Enter a name for it, and press `Create`: - -![Form Creation](../img/forms/create.webp) - -Next, select your form from the `Manage Forms` dropdown list, and add up to 5 inputs. Enter a label for the question, some placeholder text, and select the type of input: - -![Input Creation](../img/forms/inputs.webp) - -> **Note the discord imposed limitations for forms:** -> - Maximum of 5 inputs per form -> - Currently only supports text input style - no radio buttons, or checkboxes -> - Maximum character limits -> - Name - 45 -> - Labels - 45 -> - Placeholder - 100 - -Make sure to save your inputs. -Your form has now been created. In order to show it to users, you must assign it to a `Ticket Panel`. - -## Assign Form to a Panel -Head over to the `Ticket Panels` page of the dashboard via the top navigation bar, as shown in the [panels](../setup/panels.md) documentation. - -Either create a new `Ticket Panel`, or choose an existing one to edit. You will notice a dropdown labeled `Form`. Expand this dropdown, and select your new form: - -![Form assignment](../img/forms/assignment.webp) - -Save your changes, and then test it out! - -![Output example](../img/forms/output.webp) - -## Multipanels -When using [multi-panels](./multipanels) (different types of tickets combined into 1 message with multiple buttons), the form shown to the user is the form associated to the panel of the button clicked. diff --git a/src/features/introduction.md b/src/features/introduction.md deleted file mode 100644 index ba0fbda..0000000 --- a/src/features/introduction.md +++ /dev/null @@ -1,4 +0,0 @@ -# Features -This chapter provides some details about the core features of the bot. - -Use the sidebar to navigate this chapter. \ No newline at end of file diff --git a/src/features/multipanels.md b/src/features/multipanels.md deleted file mode 100644 index ab5fff5..0000000 --- a/src/features/multipanels.md +++ /dev/null @@ -1,76 +0,0 @@ -# Multi Panels -*** - -Multi-panels are the combination of 2 or more Ticket Panels in a single embed: - -![Multipanel example](../img/multipanel_example.webp) - -## Creating A Multi-panel -In order to create a multi-panel, you'll need to head over to the web dashboard and select your server. If you're unfamiliar with how to do that, read our [guide on the web dashboard here](../setup/dashboard.md). - -Once on your server's main settings page, select `Ticket Panels` in the top navigation bar: - -![Ticket panel page](../img/panels_navbar.webp) - -You'll want to focus on the *right* side of the screen. The left side are settings for individual panels (known as [Ticket Panels](../dashboard/reaction-panels.md).) - -Draw your attention to the `New Multi-Panel` card. You'll configure the panel's appearance here: - -![Multipanel card](../img/multipanel_card.webp) - -### Panel Title -The panel title is the bold text at the _top_ of the embed. - -> **Note:** The panel title has a maximum length of 255 characters, and by default, it is set to `Open a ticket!`. - -### Panel Content -The panel content is the text in the long description of the embed. We recommend providing a general overview of how your support system works, such as which languages the support agents are fluent in. - -> **Note:** The panel content has a maximum length of 1024 characters. - -### Panel Colour -This is the colour on the left side of the embed. When clicked, a colour picker will open as shown below: - -![Colour picker](../img/colour_picker.webp) - -### Panel Channel -This is the channel that the multi-panel will be sent in for users to react to. Therefore, this channel should be accessible to your users, and be the only message in the channel to avoid confusion. - -**This should not be the same as your archive / transcript channel.** - -### Panels -This input field is where you select which of your already made individual panels you'd like to include in the multi-panel. - -### Use Dropdown Menu -- **Unchecked** = Ticket options appear as clickable buttons. -- **Checked** = Ticket options appear as a dropdown menu. - -## Advanced Settings -Upon clicking `Toggle Advanced Settings`, you'll have extra fields displayed to you: -- [Large Image URL](#large-image-url) -- [Small Image URL](#small-image-url) - -### Large Image URL -Input a URL link to an image here, it will be shown **underneath the welcome message**. -- *File path MUST end in .png - easy trick is to send the image as a message in a discord channel, then right click the message and choose "Copy Link." Paste link into the input.* - -### Small Image URL -Input a URL link to an image here, it will be shown to the **right of the welcome message**. -- *File path MUST end in .png - easy trick is to send the image as a message in a discord channel, then right click the message and choose "Copy Link." Paste link into the input.* - -## Completion -*** - -Once you have configured the multi-panel to your liking, click `Submit` and the panel will be created in your server. You should be shown a success message in the bottom right hand corner of your screen if successful, or an appropriate error message if you made a mistake: - -![Success](../img/panel_success.webp) - -- If you leave any fields blank, the default values will be used. - -## Editing -If you wish to update a multi-panel at a later date, simply click the edit button in the list of multi-panels and the editing modal will be opened: - -![Multipanel edit](../img/multipanel_edit.webp) -![Multipanel edit modal](../img/multipanel_edit_modal.webp) - -You can also delete a multi-panel by clicking the `Delete` button, or deleting the message containing the multi-panel in Discord. If you only delete the message in Discord, the multi-panel will continue to exist on your Dashboard and you can resubmit it to Discord if needed. \ No newline at end of file diff --git a/src/features/start-ticket-from-message.md b/src/features/start-ticket-from-message.md deleted file mode 100644 index b156dd9..0000000 --- a/src/features/start-ticket-from-message.md +++ /dev/null @@ -1,35 +0,0 @@ -# Start Ticket From Message -*** - -Did you know that you can start a ticket from a channel using message context menus? - -This is a similar functionality to Discord private threads. A common use case is for using tickets to perform moderation, where you can drag a user into a ticket to discuss a specific message with them. - -## How To Use -To start a ticket from a message, simply right click the message (or long press on mobile devices), hover over `Apps`, and select `Start Ticket`: - -![Context menu](../../img/context_menu_start_ticket.webp) - -A new ticket will be created with the user who sent the message. The bot will send a message quoting the user, as well as providing a link to the message: - -![Quote message](../../img/context_menu_quote_message.webp) - -## Configuration -### Required Permission Level -To limit usage of this functionality to staff members: visit the [web dashboard](../setup/dashboard.md), select your server, and take a look at the `Settings` page. - -You will see a dropdown menu labelled `Required Permission Level` under the `Context Menu (Start Ticket Dropdown)` heading. Adjust the setting to your needs, and then press the `Submit` button. - -![Context menu permission level](../../img/context_menu_permission_level.webp) - -### Add Message Sender To Ticket -If you are using this functionality for users to report messages, you may not wish to have the person who is being reported added to the ticket for anonymity. - -![Configuration](../../img/context_menu_add_sender.webp) - -This will also stop the `Conversation moved to ticket` message from being sent. - -### Use Settings From Panel -By default, tickets opened via the context menu use the `/open` command settings. If you wish to use the settings of a specific `Ticket Panel`, i.e. so you can use `Mention On Open`, select the panel you wish to use under the `Use Settings From Panel` dropdown. - -![Configuration](../../img/context_menu_panel.webp) diff --git a/src/features/support-hours.md b/src/features/support-hours.md deleted file mode 100644 index b88c519..0000000 --- a/src/features/support-hours.md +++ /dev/null @@ -1,48 +0,0 @@ -# Support Hours -*** - -Support hours allow you to restrict when tickets can be opened on a panel. You can configure a schedule for each day of the week with a start and end time, and choose what happens when a user tries to open a ticket outside of those hours. - -## Configuration - -Support hours are configured per panel. To set them up, edit a panel from the **Ticket Panels** page on the web dashboard and open the **Support Hours** section. - -### Timezone -Select the timezone that your support hours are based on. This should match the timezone your support team operates in. Any valid IANA timezone is supported (e.g. `America/New_York`, `Europe/London`, `UTC`). The dashboard will display the current time in the selected timezone for reference. - -### Schedule -For each day of the week, you can: -- **Enable or disable** the day β€” disabled days mean the panel is closed all day. -- Set a **start time** and **end time** β€” the window during which tickets can be opened. - -If no days are enabled, support hours are effectively disabled and the panel will be available 24/7. - -#### Presets -The dashboard provides quick preset buttons: -- **Business hours** β€” sets Monday to Friday, 9:00 - 17:00. -- **Copy to weekdays** β€” copies Monday's hours to Tuesday through Friday. -- **Set 24/7** β€” clears all restrictions. - -## Out-of-Hours Behaviour - -When a user tries to open a ticket outside of the configured support hours, the panel's behaviour depends on the **Out-of-Hours Behaviour** setting: - -### Block Creation (default) -The user **cannot** open a ticket. They will be shown an embed with a customisable title, message, and colour explaining that support is currently unavailable. - -### Allow with Warning -The user **can** still open a ticket, but will receive a warning message letting them know that support is currently outside of normal hours and response times may be longer. - -## Customisation - -You can customise the message shown to users when they interact with the panel outside of support hours: - -- **Title** β€” the embed title (max 100 characters). Defaults to "Support is currently unavailable". -- **Message** β€” the embed description (max 500 characters). -- **Colour** β€” the embed accent colour. - -## Premium - -Free servers can configure support hours on **1 panel**. Premium servers can configure support hours on **unlimited panels**. - -- _Learn more about premium [here](https://tickets.bot/premium)._ diff --git a/src/features/thread-mode.md b/src/features/thread-mode.md deleted file mode 100644 index e669c0d..0000000 --- a/src/features/thread-mode.md +++ /dev/null @@ -1,63 +0,0 @@ -# Thread Mode -*** - -We now support using private threads for tickets! This is a new *optional* mode for the bot that drastically changes how tickets operate. - -Instead of the whole support team being added to a ticket when it is opened, the thread starts out with *no staff members*. A button is then sent to your *ticket notification channel* which staff members click to be added to the thread: - -![Example](/img/ticket_notification.webp) - -## Channel vs Thread Comparison -|Channels|Threads| -|--|--| -|Can be sorted by category|Attached to the Ticket Panel channel| -|Can move between categories with `/switchpanel` command|Cannot be moved| -|Tickets cannot be reopened once closed|Tickets can be reopened| -|Transcripts only viewable on dashboard|Transcripts viewable on dashboard, and within Discord| -|Limited to 500 channels total, and only 50 channels in a single category [^note1]|1000 open threads, unlimited closed threads| -|All staff on support team added to ticket | Staff members must press button to join ticket [^note2]| -|Tickets can be claimed |Ticket claiming is unsupported [^note3]| -|`/switchpanel` changes the ticket panel of an existing ticket |`/switchpanel` is unsupported [^note4]| -|No concept of on-call staff|Staff can be marked as on-call to automatically be pinged and added to tickets| -|No spaces in channel names|Spaces in channel names permitted: e.g. `Ticket 1234` -|Can use /notes for a private thread for staff to talk in|Cannot use /notes due to Discord limitation| - -[^note1]: This is a Discord imposed limitation for all servers, not the Tickets bot - -[^note2]: See workaround in FAQ [here](#can-the-support-team-be-added-to-thread-automatically) - -[^note3]: Staff members must individually click a button to join the ticket, so the behaviour is replicated - -[^note4]: This is due to Discord's permission management internals being very different for threads - -## On-Call -Thread mode introduces a new command: `/on-call`. When a staff member runs this command, they will be assigned roles marking them as on call, until they run the command again. When a new ticket is opened, the on call roles are pinged in the ticket, instantly adding all currently on call staff members to the ticket. - -> **Note:** When a staff member becomes on call, they will **not** be added to any existing tickets. They must join them via the ticket notification channel as normal. - -## How do I enable thread mode? -You can enable threads directly within Discord, by using the command `/setup use-threads`, like so: - -![Use Threads Command](/img/threads_command.webp) - -Alternately, you can enable threads via the settings page of the dashboard: - -![Settings page](/img/threads_enable_dashboard.webp) - -## FAQ -### Which mode should I use? -If you run a server with a small team, we would likely recommend sticking with channel mode. If you run a server with a heavy focus on 1-on-1 support or claiming, we would recommend thread mode. Nevertheless, if you require any of the additional features like reopening tickets, you must use thread mode. - -### Can the support team be added to thread automatically? -Although it is intended for the support team to click the `Join Ticket` button in the embed message of the `Ticket Notification` channel, it is possible to add support staff automatically. This requires those individuals/roles to be in the `Support Team` & be listed in the `Mention On Open` input for the `Ticket Panel`. - -### Will channel mode be removed? -No, both modes will be supported forever. Thread mode is completely optional. - -### My users can't type in their support tickets! -You must grant the "Send Messages in Threads" permission to your @everyone role in the **panel channel**: - -![Edit channel](/img/edit_channel.webp) - -![Grant send messages](/img/grant_send_messages_in_thread.webp) - diff --git a/src/img/access_control.webp b/src/img/access_control.webp deleted file mode 100644 index 159d66e..0000000 Binary files a/src/img/access_control.webp and /dev/null differ diff --git a/src/img/addadmin-command.webp b/src/img/addadmin-command.webp deleted file mode 100644 index 294d59c..0000000 Binary files a/src/img/addadmin-command.webp and /dev/null differ diff --git a/src/img/archive_message.webp b/src/img/archive_message.webp deleted file mode 100644 index 249544e..0000000 Binary files a/src/img/archive_message.webp and /dev/null differ diff --git a/src/img/auto_setup.webp b/src/img/auto_setup.webp deleted file mode 100644 index 7684902..0000000 Binary files a/src/img/auto_setup.webp and /dev/null differ diff --git a/src/img/awaiting_response.webp b/src/img/awaiting_response.webp deleted file mode 100644 index 5ee3095..0000000 Binary files a/src/img/awaiting_response.webp and /dev/null differ diff --git a/src/img/blacklist_card.webp b/src/img/blacklist_card.webp deleted file mode 100644 index 82ce033..0000000 Binary files a/src/img/blacklist_card.webp and /dev/null differ diff --git a/src/img/blacklist_role_card.webp b/src/img/blacklist_role_card.webp deleted file mode 100644 index 8856a64..0000000 Binary files a/src/img/blacklist_role_card.webp and /dev/null differ diff --git a/src/img/blacklist_user_card.webp b/src/img/blacklist_user_card.webp deleted file mode 100644 index d31f5d4..0000000 Binary files a/src/img/blacklist_user_card.webp and /dev/null differ diff --git a/src/img/blacklist_user_modal.webp b/src/img/blacklist_user_modal.webp deleted file mode 100644 index 9bcd9b5..0000000 Binary files a/src/img/blacklist_user_modal.webp and /dev/null differ diff --git a/src/img/blacklist_user_selection.webp b/src/img/blacklist_user_selection.webp deleted file mode 100644 index ce25080..0000000 Binary files a/src/img/blacklist_user_selection.webp and /dev/null differ diff --git a/src/img/blacklist_user_success.webp b/src/img/blacklist_user_success.webp deleted file mode 100644 index 090a7ec..0000000 Binary files a/src/img/blacklist_user_success.webp and /dev/null differ diff --git a/src/img/channels.webp b/src/img/channels.webp deleted file mode 100644 index 331e240..0000000 Binary files a/src/img/channels.webp and /dev/null differ diff --git a/src/img/close_request.webp b/src/img/close_request.webp deleted file mode 100644 index 71c92cb..0000000 Binary files a/src/img/close_request.webp and /dev/null differ diff --git a/src/img/close_request_deny.webp b/src/img/close_request_deny.webp deleted file mode 100644 index 98d3b9c..0000000 Binary files a/src/img/close_request_deny.webp and /dev/null differ diff --git a/src/img/close_request_params.webp b/src/img/close_request_params.webp deleted file mode 100644 index 83f1f2b..0000000 Binary files a/src/img/close_request_params.webp and /dev/null differ diff --git a/src/img/colour_picker.webp b/src/img/colour_picker.webp deleted file mode 100644 index 9618a50..0000000 Binary files a/src/img/colour_picker.webp and /dev/null differ diff --git a/src/img/context_menu_add_sender.webp b/src/img/context_menu_add_sender.webp deleted file mode 100644 index 077edd3..0000000 Binary files a/src/img/context_menu_add_sender.webp and /dev/null differ diff --git a/src/img/context_menu_panel.webp b/src/img/context_menu_panel.webp deleted file mode 100644 index 21c8175..0000000 Binary files a/src/img/context_menu_panel.webp and /dev/null differ diff --git a/src/img/context_menu_permission_level.webp b/src/img/context_menu_permission_level.webp deleted file mode 100644 index 9809d71..0000000 Binary files a/src/img/context_menu_permission_level.webp and /dev/null differ diff --git a/src/img/context_menu_quote_message.webp b/src/img/context_menu_quote_message.webp deleted file mode 100644 index 7eb263b..0000000 Binary files a/src/img/context_menu_quote_message.webp and /dev/null differ diff --git a/src/img/context_menu_start_ticket.webp b/src/img/context_menu_start_ticket.webp deleted file mode 100644 index 5bf7bdd..0000000 Binary files a/src/img/context_menu_start_ticket.webp and /dev/null differ diff --git a/src/img/dashboard-no-permission.webp b/src/img/dashboard-no-permission.webp deleted file mode 100644 index a4b1445..0000000 Binary files a/src/img/dashboard-no-permission.webp and /dev/null differ diff --git a/src/img/developer_mode.webp b/src/img/developer_mode.webp deleted file mode 100644 index adf4b9b..0000000 Binary files a/src/img/developer_mode.webp and /dev/null differ diff --git a/src/img/edit_channel.webp b/src/img/edit_channel.webp deleted file mode 100644 index 7d40831..0000000 Binary files a/src/img/edit_channel.webp and /dev/null differ diff --git a/src/img/ez_complete.webp b/src/img/ez_complete.webp deleted file mode 100644 index ff32ad5..0000000 Binary files a/src/img/ez_complete.webp and /dev/null differ diff --git a/src/img/ez_prefix.webp b/src/img/ez_prefix.webp deleted file mode 100644 index 67fba7b..0000000 Binary files a/src/img/ez_prefix.webp and /dev/null differ diff --git a/src/img/feedback_enable.webp b/src/img/feedback_enable.webp deleted file mode 100644 index aa7787b..0000000 Binary files a/src/img/feedback_enable.webp and /dev/null differ diff --git a/src/img/feedback_example.webp b/src/img/feedback_example.webp deleted file mode 100644 index 2bfae3c..0000000 Binary files a/src/img/feedback_example.webp and /dev/null differ diff --git a/src/img/feedback_stats.webp b/src/img/feedback_stats.webp deleted file mode 100644 index f32bc76..0000000 Binary files a/src/img/feedback_stats.webp and /dev/null differ diff --git a/src/img/feedback_transcripts.webp b/src/img/feedback_transcripts.webp deleted file mode 100644 index 4f91c15..0000000 Binary files a/src/img/feedback_transcripts.webp and /dev/null differ diff --git a/src/img/feedback_user.webp b/src/img/feedback_user.webp deleted file mode 100644 index 111990a..0000000 Binary files a/src/img/feedback_user.webp and /dev/null differ diff --git a/src/img/forms/assignment.webp b/src/img/forms/assignment.webp deleted file mode 100644 index 1a01040..0000000 Binary files a/src/img/forms/assignment.webp and /dev/null differ diff --git a/src/img/forms/create.webp b/src/img/forms/create.webp deleted file mode 100644 index bfe3ccb..0000000 Binary files a/src/img/forms/create.webp and /dev/null differ diff --git a/src/img/forms/example.webp b/src/img/forms/example.webp deleted file mode 100644 index 835a7af..0000000 Binary files a/src/img/forms/example.webp and /dev/null differ diff --git a/src/img/forms/forms_navbar.webp b/src/img/forms/forms_navbar.webp deleted file mode 100644 index b87d8c1..0000000 Binary files a/src/img/forms/forms_navbar.webp and /dev/null differ diff --git a/src/img/forms/inputs.webp b/src/img/forms/inputs.webp deleted file mode 100644 index b26c3ee..0000000 Binary files a/src/img/forms/inputs.webp and /dev/null differ diff --git a/src/img/forms/output.webp b/src/img/forms/output.webp deleted file mode 100644 index d2d2f6f..0000000 Binary files a/src/img/forms/output.webp and /dev/null differ diff --git a/src/img/gdpr/gdpr_confirm.png b/src/img/gdpr/gdpr_confirm.png deleted file mode 100644 index 0fd4b40..0000000 Binary files a/src/img/gdpr/gdpr_confirm.png and /dev/null differ diff --git a/src/img/gdpr/gdpr_done.png b/src/img/gdpr/gdpr_done.png deleted file mode 100644 index 47fd59a..0000000 Binary files a/src/img/gdpr/gdpr_done.png and /dev/null differ diff --git a/src/img/gdpr/gdpr_messages_confirm.png b/src/img/gdpr/gdpr_messages_confirm.png deleted file mode 100644 index 07c43ad..0000000 Binary files a/src/img/gdpr/gdpr_messages_confirm.png and /dev/null differ diff --git a/src/img/gdpr/gdpr_queued.png b/src/img/gdpr/gdpr_queued.png deleted file mode 100644 index 36cce57..0000000 Binary files a/src/img/gdpr/gdpr_queued.png and /dev/null differ diff --git a/src/img/gdpr/gdpr_request.png b/src/img/gdpr/gdpr_request.png deleted file mode 100644 index 7c54ebe..0000000 Binary files a/src/img/gdpr/gdpr_request.png and /dev/null differ diff --git a/src/img/grant_send_messages_in_thread.webp b/src/img/grant_send_messages_in_thread.webp deleted file mode 100644 index 5b442af..0000000 Binary files a/src/img/grant_send_messages_in_thread.webp and /dev/null differ diff --git a/src/img/integrations/edit_welcome_message.webp b/src/img/integrations/edit_welcome_message.webp deleted file mode 100644 index f298cd6..0000000 Binary files a/src/img/integrations/edit_welcome_message.webp and /dev/null differ diff --git a/src/img/integrations/example_embed.webp b/src/img/integrations/example_embed.webp deleted file mode 100644 index bbe300c..0000000 Binary files a/src/img/integrations/example_embed.webp and /dev/null differ diff --git a/src/img/integrations/example_success.webp b/src/img/integrations/example_success.webp deleted file mode 100644 index 864ea6d..0000000 Binary files a/src/img/integrations/example_success.webp and /dev/null differ diff --git a/src/img/integrations/fivem/add_to_server.webp b/src/img/integrations/fivem/add_to_server.webp deleted file mode 100644 index 016d419..0000000 Binary files a/src/img/integrations/fivem/add_to_server.webp and /dev/null differ diff --git a/src/img/integrations/fivem/integrations_page.webp b/src/img/integrations/fivem/integrations_page.webp deleted file mode 100644 index 31731c7..0000000 Binary files a/src/img/integrations/fivem/integrations_page.webp and /dev/null differ diff --git a/src/img/integrations/fivem/placeholders.webp b/src/img/integrations/fivem/placeholders.webp deleted file mode 100644 index 4131076..0000000 Binary files a/src/img/integrations/fivem/placeholders.webp and /dev/null differ diff --git a/src/img/integrations/fivem/welcome_message.webp b/src/img/integrations/fivem/welcome_message.webp deleted file mode 100644 index 76ce567..0000000 Binary files a/src/img/integrations/fivem/welcome_message.webp and /dev/null differ diff --git a/src/img/integrations/headers.webp b/src/img/integrations/headers.webp deleted file mode 100644 index 72b543b..0000000 Binary files a/src/img/integrations/headers.webp and /dev/null differ diff --git a/src/img/integrations/integration_preview.webp b/src/img/integrations/integration_preview.webp deleted file mode 100644 index 7b5bad9..0000000 Binary files a/src/img/integrations/integration_preview.webp and /dev/null differ diff --git a/src/img/integrations/metadata.webp b/src/img/integrations/metadata.webp deleted file mode 100644 index 6da298d..0000000 Binary files a/src/img/integrations/metadata.webp and /dev/null differ diff --git a/src/img/integrations/navbar.webp b/src/img/integrations/navbar.webp deleted file mode 100644 index 83a0ec5..0000000 Binary files a/src/img/integrations/navbar.webp and /dev/null differ diff --git a/src/img/integrations/placeholder_creation.webp b/src/img/integrations/placeholder_creation.webp deleted file mode 100644 index a509cc5..0000000 Binary files a/src/img/integrations/placeholder_creation.webp and /dev/null differ diff --git a/src/img/integrations/request_completed.webp b/src/img/integrations/request_completed.webp deleted file mode 100644 index 5eb6015..0000000 Binary files a/src/img/integrations/request_completed.webp and /dev/null differ diff --git a/src/img/integrations/request_url.webp b/src/img/integrations/request_url.webp deleted file mode 100644 index 4e80cae..0000000 Binary files a/src/img/integrations/request_url.webp and /dev/null differ diff --git a/src/img/integrations/secrets_example.webp b/src/img/integrations/secrets_example.webp deleted file mode 100644 index a919d60..0000000 Binary files a/src/img/integrations/secrets_example.webp and /dev/null differ diff --git a/src/img/invite-1.webp b/src/img/invite-1.webp deleted file mode 100644 index 140b932..0000000 Binary files a/src/img/invite-1.webp and /dev/null differ diff --git a/src/img/invite-2.webp b/src/img/invite-2.webp deleted file mode 100644 index 8949473..0000000 Binary files a/src/img/invite-2.webp and /dev/null differ diff --git a/src/img/languages.webp b/src/img/languages.webp deleted file mode 100644 index c02d99d..0000000 Binary files a/src/img/languages.webp and /dev/null differ diff --git a/src/img/login.webp b/src/img/login.webp deleted file mode 100644 index 06e0b33..0000000 Binary files a/src/img/login.webp and /dev/null differ diff --git a/src/img/multi_panel_category.webp b/src/img/multi_panel_category.webp deleted file mode 100644 index 8729edc..0000000 Binary files a/src/img/multi_panel_category.webp and /dev/null differ diff --git a/src/img/multipanel_card.webp b/src/img/multipanel_card.webp deleted file mode 100644 index 41bee3b..0000000 Binary files a/src/img/multipanel_card.webp and /dev/null differ diff --git a/src/img/multipanel_edit.webp b/src/img/multipanel_edit.webp deleted file mode 100644 index baf4091..0000000 Binary files a/src/img/multipanel_edit.webp and /dev/null differ diff --git a/src/img/multipanel_edit_modal.webp b/src/img/multipanel_edit_modal.webp deleted file mode 100644 index cbf856f..0000000 Binary files a/src/img/multipanel_edit_modal.webp and /dev/null differ diff --git a/src/img/multipanel_example.webp b/src/img/multipanel_example.webp deleted file mode 100644 index d930b22..0000000 Binary files a/src/img/multipanel_example.webp and /dev/null differ diff --git a/src/img/navbar_teams.webp b/src/img/navbar_teams.webp deleted file mode 100644 index 6b34989..0000000 Binary files a/src/img/navbar_teams.webp and /dev/null differ diff --git a/src/img/panel_card.webp b/src/img/panel_card.webp deleted file mode 100644 index ea9bad8..0000000 Binary files a/src/img/panel_card.webp and /dev/null differ diff --git a/src/img/panel_edit.webp b/src/img/panel_edit.webp deleted file mode 100644 index bb95815..0000000 Binary files a/src/img/panel_edit.webp and /dev/null differ diff --git a/src/img/panel_success.webp b/src/img/panel_success.webp deleted file mode 100644 index e13d377..0000000 Binary files a/src/img/panel_success.webp and /dev/null differ diff --git a/src/img/panels_navbar.webp b/src/img/panels_navbar.webp deleted file mode 100644 index a67d5db..0000000 Binary files a/src/img/panels_navbar.webp and /dev/null differ diff --git a/src/img/panels_page.webp b/src/img/panels_page.webp deleted file mode 100644 index da72f46..0000000 Binary files a/src/img/panels_page.webp and /dev/null differ diff --git a/src/img/server_language.webp b/src/img/server_language.webp deleted file mode 100644 index d4b6e35..0000000 Binary files a/src/img/server_language.webp and /dev/null differ diff --git a/src/img/server_list.webp b/src/img/server_list.webp deleted file mode 100644 index 91a93bf..0000000 Binary files a/src/img/server_list.webp and /dev/null differ diff --git a/src/img/settings_card.webp b/src/img/settings_card.webp deleted file mode 100644 index 007c67d..0000000 Binary files a/src/img/settings_card.webp and /dev/null differ diff --git a/src/img/settings_claim.webp b/src/img/settings_claim.webp deleted file mode 100644 index 67801cf..0000000 Binary files a/src/img/settings_claim.webp and /dev/null differ diff --git a/src/img/setup_command.webp b/src/img/setup_command.webp deleted file mode 100644 index c0c7130..0000000 Binary files a/src/img/setup_command.webp and /dev/null differ diff --git a/src/img/slash_commands.webp b/src/img/slash_commands.webp deleted file mode 100644 index dfbdad7..0000000 Binary files a/src/img/slash_commands.webp and /dev/null differ diff --git a/src/img/staff_teams_card.webp b/src/img/staff_teams_card.webp deleted file mode 100644 index 957e949..0000000 Binary files a/src/img/staff_teams_card.webp and /dev/null differ diff --git a/src/img/staff_teams_delete.webp b/src/img/staff_teams_delete.webp deleted file mode 100644 index 22abdae..0000000 Binary files a/src/img/staff_teams_delete.webp and /dev/null differ diff --git a/src/img/staff_teams_manage.webp b/src/img/staff_teams_manage.webp deleted file mode 100644 index 78257c2..0000000 Binary files a/src/img/staff_teams_manage.webp and /dev/null differ diff --git a/src/img/tags_card_example.webp b/src/img/tags_card_example.webp deleted file mode 100644 index 1712f5e..0000000 Binary files a/src/img/tags_card_example.webp and /dev/null differ diff --git a/src/img/tags_editor_advanced.webp b/src/img/tags_editor_advanced.webp deleted file mode 100644 index 1253390..0000000 Binary files a/src/img/tags_editor_advanced.webp and /dev/null differ diff --git a/src/img/tags_editor_basic.webp b/src/img/tags_editor_basic.webp deleted file mode 100644 index ad490bb..0000000 Binary files a/src/img/tags_editor_basic.webp and /dev/null differ diff --git a/src/img/tags_id_example.webp b/src/img/tags_id_example.webp deleted file mode 100644 index 71b1743..0000000 Binary files a/src/img/tags_id_example.webp and /dev/null differ diff --git a/src/img/tags_message_example.webp b/src/img/tags_message_example.webp deleted file mode 100644 index 24b7339..0000000 Binary files a/src/img/tags_message_example.webp and /dev/null differ diff --git a/src/img/tags_message_full_example.webp b/src/img/tags_message_full_example.webp deleted file mode 100644 index b4b628b..0000000 Binary files a/src/img/tags_message_full_example.webp and /dev/null differ diff --git a/src/img/tags_message_inline.webp b/src/img/tags_message_inline.webp deleted file mode 100644 index 00398b0..0000000 Binary files a/src/img/tags_message_inline.webp and /dev/null differ diff --git a/src/img/threads_command.webp b/src/img/threads_command.webp deleted file mode 100644 index 469093b..0000000 Binary files a/src/img/threads_command.webp and /dev/null differ diff --git a/src/img/threads_enable_dashboard.webp b/src/img/threads_enable_dashboard.webp deleted file mode 100644 index dc20915..0000000 Binary files a/src/img/threads_enable_dashboard.webp and /dev/null differ diff --git a/src/img/ticket_close_confirmation.webp b/src/img/ticket_close_confirmation.webp deleted file mode 100644 index fb4e0e0..0000000 Binary files a/src/img/ticket_close_confirmation.webp and /dev/null differ diff --git a/src/img/ticket_notification.webp b/src/img/ticket_notification.webp deleted file mode 100644 index e45c7c5..0000000 Binary files a/src/img/ticket_notification.webp and /dev/null differ diff --git a/src/img/tickets_card.webp b/src/img/tickets_card.webp deleted file mode 100644 index d052198..0000000 Binary files a/src/img/tickets_card.webp and /dev/null differ diff --git a/src/img/tickets_docs_readme_usage.webp b/src/img/tickets_docs_readme_usage.webp deleted file mode 100644 index a1f1684..0000000 Binary files a/src/img/tickets_docs_readme_usage.webp and /dev/null differ diff --git a/src/img/tickets_view_compare.webp b/src/img/tickets_view_compare.webp deleted file mode 100644 index bdf2183..0000000 Binary files a/src/img/tickets_view_compare.webp and /dev/null differ diff --git a/src/img/transcripts_card.webp b/src/img/transcripts_card.webp deleted file mode 100644 index acfeb60..0000000 Binary files a/src/img/transcripts_card.webp and /dev/null differ diff --git a/src/img/video_thumbnails/Thumbnail_Forms.webp b/src/img/video_thumbnails/Thumbnail_Forms.webp deleted file mode 100644 index 9b82d1e..0000000 Binary files a/src/img/video_thumbnails/Thumbnail_Forms.webp and /dev/null differ diff --git a/src/img/video_thumbnails/Thumbnail_Reaction_Panels.webp b/src/img/video_thumbnails/Thumbnail_Reaction_Panels.webp deleted file mode 100644 index 3b1cac5..0000000 Binary files a/src/img/video_thumbnails/Thumbnail_Reaction_Panels.webp and /dev/null differ diff --git a/src/img/video_thumbnails/Thumbnail_Staff_Teams.webp b/src/img/video_thumbnails/Thumbnail_Staff_Teams.webp deleted file mode 100644 index 3036c8a..0000000 Binary files a/src/img/video_thumbnails/Thumbnail_Staff_Teams.webp and /dev/null differ diff --git a/src/img/welcome_message.webp b/src/img/welcome_message.webp deleted file mode 100644 index ac8b06e..0000000 Binary files a/src/img/welcome_message.webp and /dev/null differ diff --git a/src/img/whitelabel/activate_premium.webp b/src/img/whitelabel/activate_premium.webp deleted file mode 100644 index 19972d5..0000000 Binary files a/src/img/whitelabel/activate_premium.webp and /dev/null differ diff --git a/src/img/whitelabel/copy_token.webp b/src/img/whitelabel/copy_token.webp deleted file mode 100644 index c4002d9..0000000 Binary files a/src/img/whitelabel/copy_token.webp and /dev/null differ diff --git a/src/img/whitelabel/custom_status.webp b/src/img/whitelabel/custom_status.webp deleted file mode 100644 index 4fbad67..0000000 Binary files a/src/img/whitelabel/custom_status.webp and /dev/null differ diff --git a/src/img/whitelabel/general_information.webp b/src/img/whitelabel/general_information.webp deleted file mode 100644 index 6a41564..0000000 Binary files a/src/img/whitelabel/general_information.webp and /dev/null differ diff --git a/src/img/whitelabel/invite.webp b/src/img/whitelabel/invite.webp deleted file mode 100644 index 4e07715..0000000 Binary files a/src/img/whitelabel/invite.webp and /dev/null differ diff --git a/src/img/whitelabel/kick_bot.webp b/src/img/whitelabel/kick_bot.webp deleted file mode 100644 index 248ebdb..0000000 Binary files a/src/img/whitelabel/kick_bot.webp and /dev/null differ diff --git a/src/img/whitelabel/new_application.webp b/src/img/whitelabel/new_application.webp deleted file mode 100644 index a58e529..0000000 Binary files a/src/img/whitelabel/new_application.webp and /dev/null differ diff --git a/src/img/whitelabel/policies.webp b/src/img/whitelabel/policies.webp deleted file mode 100644 index 52cba4a..0000000 Binary files a/src/img/whitelabel/policies.webp and /dev/null differ diff --git a/src/img/whitelabel/submit_token.webp b/src/img/whitelabel/submit_token.webp deleted file mode 100644 index 2877dbb..0000000 Binary files a/src/img/whitelabel/submit_token.webp and /dev/null differ diff --git a/src/integrations/building-integrations.md b/src/integrations/building-integrations.md deleted file mode 100644 index 288cea2..0000000 --- a/src/integrations/building-integrations.md +++ /dev/null @@ -1,222 +0,0 @@ -# Build Integrations - -Integrations let you include information retrieved from your own web server, or 3rd party APIs, directly in the welcome messages of your tickets! - -In this guide, we'll build an integration from scratch together, from start to finish. - -## What can I use integrations for? -If you run a service that incorporates [Discord OAuth](https://discord.com/developers/docs/topics/oauth2), you have a use case for integrations! Since your user objects are linked to Discord accounts, you can expose an API endpoint that Tickets can request to include information about the user in the ticket. - -A simple example would be a forum! When a user opens a ticket in your Discord server, you could include the user's forum username automatically. - -Integrations do not necessarily need to fetch information about a user either! In the [next tutorial](), we show you how we built the cryptocurrency price integration. - -## Background Setup -Let's say we run a game, where users link their accounts to their Discord accounts. Users have usernames, scores and other metadata which we wish to display in the welcome message when a user opens a ticket. - -The following is some simple code that serves some example JSON data that we will be using for this tutorial. Let's say that this code is running on a web server, accessible at `https://example.tickets.bot`: - -```js -const express = require("express"); -const app = express(); - -let users = { - "585576154958921739": { - online_status: "Online", - user: { - username: "Ryan", - account_created_year: 2019, - scores: { - high_score: 3000, - last_score: 400, - }, - }, - }, -}; - -app.get("/lookup", (req, res) => res.json(users[req.query.user] || {})); - -app.listen(process.env.PORT, () => console.log("Listening...")); -``` - -The server responds with the user object stored in the `users` dictionary if it exists, or alternatively with an empty JSON object, `{}`. - -For example, sending a request to `https://example.tickets.bot/lookup?user=585576154958921739`: - -```bash -$ curl https://example.tickets.bot/lookup?user=585576154958921739 | jq . -{ - "online_status": "Online", - "user": { - "username": "Ryan", - "account_created_year": 2019, - "scores": { - "high_score": 3000, - "last_score": 400 - } - } -} -``` - -Your integration **MUST** return a JSON response. Parsing other data formats is not supported. You may return the data structured in any way you want, as long as it is valid JSON. - -All data types are supported, except for JSON arrays. You should pre-process your arrays and join them to strings. - -## Creating Your Integration -Now that we have somewhere to pull data from, we can start linking it up with Tickets! - -First, head over to our [web dashboard](https://dashboard.tickets.bot), select any server, and then navigate to the Integrations tab in the navbar. From there, you will be able to press the "Create Integration" button: - -![Navigation](/img/integrations/navbar.webp) - -Then, fill out some basic information about your integration: its name, description, and optionally logo image URL and privacy policy. It is recommended to set a privacy policy if you are creating a public integration. You will be able to see a preview on the right-hand side as you type. Once completed, press the "Continue" button. - -![Metadata](/img/integrations/metadata.webp) - -### HTTP Request - -You will be then be prompted to enter information about how the integration works. Lets focus on the "HTTP Request" section first: - -![Request URL](/img/integrations/request_url.webp) - -Upon a ticket being opened, we will send a HTTP request to the provided request URL, to which you should respond with a JSON object that we can extract values of your choice from. You can use the placeholder `%user_id%` in the URL, which will be replaced with the user ID of the user who opened the ticket. In our case, we set this to `https://example.tickets.bot/lookup?user=%user_id%`. - -Requests can either be sent as GET or POST requests. POST requests are sent with a JSON body with information about the ticket. An example body is as follows: - -```json -{ - "guild_id": "508392876359680000", - "user_id": "508391840525975553", - "ticket_id": 30, - "ticket_channel_id": "508392988985262090", - "is_new_ticket": true, - "form_data": { - "What is your question?": "I have a problem with XYZ", - "What is your email address?": "user@example.com" - } -} -``` - -The `is_new_ticket` denotes whether the request is being made due to a new ticket being created. Placeholders are supported in tags and other places, in which case `is_new_ticket` would be `false`. - -The `form_data` field is only included for **private** integrations. There is no reason for public integrations to include form data, as forms are specific to the server. - -### Headers and Secrets -It is recommended that you add some kind of authentication to your API- or if you are making an integration that requests a public API, you will definitely be required to use authentication. Thankfully, you can add HTTP headers to your integration requests! - -Let's say our example app now requires an API key to be sent in the `Authorization` header. Simply press the `Add Additional Header` button, and enter the header name and value, like so: - -![Headers](/img/integrations/headers.webp) - -This functionality can be further extended by using secrets: You can ask users to supply their _own_ secret values, such as API keys, when adding your integration to their server. For example, we may want users to register an application on our own site, generate them an API key, and make them input it when adding your integration. Let's take a look at an example: - -![Completed](/img/integrations/request_completed.webp) - -We have created a secret, called `api_key`, which we are able to use in either headers, or the URL itself, via `%api_key%`. When a user adds your integration to their server, they will be prompted to enter their API key: - -![Secrets example](/img/integrations/secrets_example.webp) - -### Secret Validation -Sometimes, users may provide a secret value in an invalid format, or otherwise incorrect way. You may optionally define a validation URL that we will send an HTTP POST to every time a user adds your integration to a server to dynamically validate their secrets. The request will contain a JSON body containing the user's secret values: -```json -{ - "secret_name": "value", - "secret2_name": "abcde" -} -``` - -If the values satisfy your constraints, simply respond with any 2XX status code. The response body does not matter, so it is recommended to use HTTP 204 No Content with an empty body. - -If the value does not satisfy your constraints, then respond with any non-2XX status code - HTTP 400 Bad Request is well suited. You may also provide a JSON response body with a single "error" field containing a message to show to the user: -```json -{ - "error": "Your API key is invalid." -} -``` - -### Placeholders -Next, we are onto creating the placeholders themselves. Here, you define how each value in your JSON response should be mapped to the variables that can be used in welcome messages. - -As a reminder, in our example application, we respond with the following JSON: - -```json -{ - "online_status": "Online", - "user": { - "username": "Ryan", - "account_created_year": 2019, - "scores": { - "high_score": 3000, - "last_score": 400 - } - } -} -``` - -The JSON path is simply the path of keys to access a value. Nested objects can be accessed by splitting the path with a dot. - -For example, the path `online_status` would yield `Online`, and `user.username` would yield `Ryan`. - -Let's take a look at how we'd register these with the integration settings: - -![Placeholder Creation](/img/integrations/placeholder_creation.webp) - -It should be obvious to see how the values are mapped. Note, your placeholder itself can be named completely separate from the JSON path. - -You have now successfully configured your first integration! All that is left is to press the final "Create" button. After doing this, you should be taken to a preview page for your integration: - -![Integration Preview](/img/integrations/integration_preview.webp) - -You can view the list of available placeholders on the right-hand side of the page. Don't forget to _activate_ the integration in your server, by pressing the "Add to server" button! - -## Using Placeholders -Now that we have created out integration and added it to our server (don't forget this part), we can implement the placeholders! - -You'll need to head over to the "Ticket Panels" tab of the dashboard for your server, press edit on a panel, and open the welcome message editor: - -![Welcome Message Editor](/img/integrations/edit_welcome_message.webp) - -We can then insert our placeholders into the welcome message, like so: - -![Example Embed](/img/integrations/example_embed.webp) - -Let's test it out! - -![Example Success](/img/integrations/example_success.webp) - -As you can see, the placeholders have successfully been fetched from the web server, and replaced with the provided values! - -## Need Help? -If you're still stuck, feel free to ask us in our [Discord server](https://discord.gg/ticketsbot)! - -## Security -We have put **significant** effort into making sure integrations are safe, by ensuring requests are always proxied, and not sent to where they are not supposed to be, including through additional penetration testing. - -Integration HTTP requests should be sent to your server via AS13335 (Cloudflare), and it should not be possible to send a request to a private IP. - - - - -Regarding integrations, we are particularly interested in vulnerabilities related to: - -- Accessing internal services -- Exposing the origin IPs of our nodes -- Accessing secret values of other servers -- Accessing the IP address of another user, via viewing integration logos - -Integration logos are proxied by dedicated images proxy nodes running on AS16276 (OVH). These nodes are located outside of our internal network, and do not serve any other purpose. We are not concerned with hiding the IP addresses of these nodes. Note that integration logos viewed on the integration creation and updating pages are _not_ proxied, as they are only viewable by the integration creator, and so would be classed as a self-attack. - -When performing security research, please: - -- Ensure that target assets are in-scope and operated by us (we utilise serverless functions on infrastructure not run by us). If you are unsure, open a ticket and ask. -- Do not use automated scanners -- Do not launch (D)DoS / resource exhaustion attacks - -If you wish to perform static code analysis for your research, you can view the relevant open source code here: - -- Integration Proxy - - [secure-proxy](https://github.com/TicketsBot-cloud/tickets.rs/tree/master/secure-proxy) - - [global-resolver](https://github.com/TicketsBot-cloud/tickets.rs/tree/master/global-resolver) -- Image Proxy - - [image-proxy](https://github.com/TicketsBot-cloud/tickets.rs/tree/master/image-proxy) - - [global-resolver](https://github.com/TicketsBot-cloud/tickets.rs/tree/master/global-resolver) diff --git a/src/integrations/cloudflare-workers.md b/src/integrations/cloudflare-workers.md deleted file mode 100644 index 7bdba21..0000000 --- a/src/integrations/cloudflare-workers.md +++ /dev/null @@ -1,54 +0,0 @@ -# Using Cloudflare Workers -Sometimes services return data in a slightly different format than you want. Since Tickets integrations are only capable of reading exact JSON keys, some additional processing may be required. - -For example, FiveM servers return data in the following format, which posed an issue when creating our FiveM integration: -```json -{ - ... - "Data": { - ... - "players": [ - ..., - { - "id": 100, - "identifiers": ["discord:111111111111111111", "license:abcdefg"], - "name": "Username", - }, - ... - ] - } -} -``` - -We are given a list of all players on the server, which we must search to find the player with the identifier `discord:%user_id%`. - -Cloudflare Workers come in here. - -## What are Cloudflare Workers -[Cloudflare Workers](https://workers.cloudflare.com/) allow you to deploy serverless code (including JavaScript, and more), for free, with the click of a button. We can write a worker to listen to requests from Tickets, query the service we are integrating with, process the data, and return it to Tickets in an easy to read format. - -Looking at the FiveM integration again, the integration sends a request to `https://worker-name.xxxx.workers.dev/?serverid=%server_id%&user_id=%user_id`. The worker extracts the server ID and user ID from the URL, and then sends a request to the FiveM API with the provided server ID. It then parses the response, finds the user object, and responds with a simple JSON object: -```json -{ - "username": "Username", - "steam_id": 123456, - "steam_url": "https://steamcommunity.com/profiles/123456", - ... -} -``` - -If you want users to be able to include a URL in their welcome messages (e.g. Steam profile URL), a neat trick is to return the full URL as a placeholder, rather than making users construct it themselves in their welcome messages using just the Steam ID. - -If you are serving data that does not frequently change, you can use the workers [Key-Value Storage API](https://developers.cloudflare.com/workers/learning/how-kv-works/) to cache data, to reduce CPU time used. - -The full Cloudflare worker documentation is available [here](https://developers.cloudflare.com/workers/). - -## Security -You should add an Authorization header to your requests, so that malicious people are not able to send extraneous requests to your worker. An example code snippet is as follows: - -```js -let authHeader = request.headers.get("Authorization"); -if (!authHeader || authHeader !== AUTH_SECRET) { - return respondWithCode(401, {error: "Invalid auth key"}); -} -``` diff --git a/src/integrations/fivem.md b/src/integrations/fivem.md deleted file mode 100644 index 1620c58..0000000 --- a/src/integrations/fivem.md +++ /dev/null @@ -1,32 +0,0 @@ -# Using the FiveM Integration -If you run a FiveM server, you can use our FiveM integration to fetch the FiveM IDs, usernames, Steam IDs and more of users who open tickets in your server! - -To activate the FiveM integration in your server, head over to our [web dashboard](https://dashboard.tickets.bot) and select your Discord server. Then, select the "Integrations" tab in the navbar, find the FiveM integration, and press "Add to server": - -![Integrations list](/img/integrations/fivem/integrations_page.webp) - -You will then be prompted for your *FiveM* server ID. This is the 6 character alphanumeric string assigned to your server. If you do not know it, you can find it on [KeyMaster](https://keymaster.fivem.net/), or in the FiveM server list. - -![Add to server](/img/integrations/fivem/add_to_server.webp) - -The integration is now active in your server! The last step is to insert the placeholders of your choice into the ticket welcome message. To do this, head over to the "Ticket Panels" page, press "Edit" on a ticket panel, expand advanced settings, and open the welcome message editor: -![Welcome message editor](/img/integrations/edit_welcome_message.webp) - -Then, customise the welcome message to your liking: -![Welcome message editor](/img/integrations/fivem/placeholders.webp) - -The placeholders provided by the FiveM integration are: -- %fivem_id% -- %fivem_username% -- %steam_id% -- %steam_profile_url% -- %fivem_license% -- %fivem_license2% - -Finally, test it out by opening a ticket: -![Example](/img/integrations/fivem/welcome_message.webp) - -## Limitations -- The user opening the ticket must be connected to your FiveM server at the time -- It is possible to not have a Steam account linked to a FiveM account -- It is possible to not have a Discord account linked to a FiveM account, meaning the integration will be unable to retrieve the data diff --git a/src/integrations/introduction.md b/src/integrations/introduction.md deleted file mode 100644 index 0dbc619..0000000 --- a/src/integrations/introduction.md +++ /dev/null @@ -1,4 +0,0 @@ -# Integrations -This chapter provides information regarding integrations, and how to build them. - -Use the sidebar to navigate this chapter. \ No newline at end of file diff --git a/src/introduction/introduction.md b/src/introduction/introduction.md deleted file mode 100644 index 98aa2a0..0000000 --- a/src/introduction/introduction.md +++ /dev/null @@ -1,18 +0,0 @@ -# Tickets V2 Bot Official Documentation - -These Docs will help you with: -* Setting up the Bot -* Explain each feature of the Bot -* Tell you how to set each feature up -* How to use the bot correctly -* How to fix issues with permissions - -## These Docs are a living Document -Updates to the docs are made frequently. - -
- -**If you find any issues in the Docs like typo's and outdated information then please tell us in our [support server](https://discord.gg/ticketsbot).** -
- -Get started setting up the bot [here](../setup/introduction.md) diff --git a/src/miscellaneous/dashboard-no-permission.md b/src/miscellaneous/dashboard-no-permission.md deleted file mode 100644 index b8129fa..0000000 --- a/src/miscellaneous/dashboard-no-permission.md +++ /dev/null @@ -1,10 +0,0 @@ -# Dashboard: "No Permission" Message -When the bot is first added to the server, you may receive a "No Permission" warning on the dashboard when trying to manage it. - -![No Permission Message](../img/dashboard-no-permission.webp) - -This is because Tickets uses its own permission management system, and ignores any permissions you may have in the Discord server itself. - -In order to gain access to the web dashboard for your server, ask the **server owner** to add you as a bot admin using the `/addadmin @User` command. You can read more about the `/addadmin` command in [the command guide](../commands/add-admin-support.md). - -![Usage of /addadmin command](../img/addadmin-command.webp) diff --git a/src/miscellaneous/introduction.md b/src/miscellaneous/introduction.md deleted file mode 100644 index c6a3944..0000000 --- a/src/miscellaneous/introduction.md +++ /dev/null @@ -1,4 +0,0 @@ -# Miscellaneous -This chapter contains all other documents which do not suit the other chapters. - -Use the sidebar to navigate this chapter. \ No newline at end of file diff --git a/src/miscellaneous/official-links.md b/src/miscellaneous/official-links.md deleted file mode 100644 index ad0e387..0000000 --- a/src/miscellaneous/official-links.md +++ /dev/null @@ -1,17 +0,0 @@ -# Official Links -*** - -### Website -[tickets.bot](https://tickets.bot/) - -### Invite The Bot -[invite.tickets.bot](https://invite.tickets.bot/) - -### Dashboard -[dashboard.tickets.bot](https://dashboard.tickets.bot/) - -### Documentation -[docs.tickets.bot](https://docs.tickets.bot/) - -### Discord Support Server -[Support Server](https://discord.gg/ticketsbot) \ No newline at end of file diff --git a/src/miscellaneous/permissions-explained.md b/src/miscellaneous/permissions-explained.md deleted file mode 100644 index d24fe05..0000000 --- a/src/miscellaneous/permissions-explained.md +++ /dev/null @@ -1,52 +0,0 @@ -# All Bot Permissions Explained - -*** -For the bot to work fully it needs many permissions. - -Either you manually give it each needed permissions or you give it the `Administrator` permission which will just make it "work". For an explanation of how to adjust permissions, [check the Discord help article](https://support.discord.com/hc/en-us/articles/206029707-How-do-I-set-up-Permissions). - -Below is a rough explanation of what each permission is used for: - -* `View Channels` "Allows the bot to view the content of a channel." - -* `Manage Channels` "Allows the bot to create, rename, recategorize, and delete channels." - -* `Manage Roles` "Allows the bot to create and edit roles, give and take away roles from users, and adjust a channel's role permissions." - -* `Manage Webhooks` "Allows the bot to create webhooks for transcripts, and for staff to use the dashboard to send messages or tags in open tickets." - -* `Send Messages` "Allows the bot to send messages in channels." - -* `Send TTS Messages` "Allows the bot to assign this permission to ticket openers and staff members." - -* `Send Messages in Threads` "Allows the bot to send messages in threads." - -* `Create Public Threads` "Allows the bot to create public threads." - -* `Create Private Threads` "Allows the bot to create private threads, such as thread mode tickets and the /notes command for channel tickets." - -* `Embed Links` "Allows the bot to send ticket panels, welcome messages, and tags that include an embedded message." - -* `Attach Files` "Allows the bot to assign this permission to ticket openers and staff members." - -* `Add Reactions` "Allows the bot to add the buttons to ticket panels, welcome messages, and all commands that use buttons." - -* `Use External Emojis` "Allows the bot to use non-server emojis in ticket panels, welcome messages, and tags. The bot must still be in the other server to use them." - -* `Pin Messages` "Allows the bot to pin the welcome message and its buttons on ticket creation." - -* `Mention @Everyone` "Allows the bot to mention everyone, here and all roles in a ticket." - -* `Manage Threads` "Allows the bot to create, rename, close, and delete threads." - -* `Read Message History` "Allows the bot to read all messages in a channel." - -* `Use Application Commands` "Allows the bot's slash commands to work." - -* `Use External Stickers` "Allows the bot to assign this permission to ticket openers and staff members." - -* `Send Voice Messages` "Allows the bot to assign this permission to ticket openers and staff members." - -These permissions are mandatory so that the bot can work. Any other permission can be denied for the bot to use since those aren't used by the bot. - -> **Note:** The used permissions can change when the bot gets a new update or feature. Please keep a lookout, for an announcement about changed permissions in our [support server](https://discord.gg/ticketsbot). diff --git a/src/miscellaneous/placeholders.md b/src/miscellaneous/placeholders.md deleted file mode 100644 index 6d8997e..0000000 --- a/src/miscellaneous/placeholders.md +++ /dev/null @@ -1,82 +0,0 @@ -# Placeholders -*** - -## Welcome Message Placeholders -### Built-in - -|Placeholder|Description | -|--|--| -| %user% | Mentions the user, will display nickname if set | -| %username% | Display the user's name | -| %user_id% | Display the user's numeric ID | -| %ticket_id% | Display the ticket's numeric ID | -| %open_tickets% | Display the number of open tickets in the server | -| %total_tickets% | Display the number of tickets that have ever been opened in the server | -| %user_open_tickets% | Display the number of tickets that the user currently has open in the server | -| %user_total_tickets% | Display the number of tickets that the user has ever opened in the server | -| %ticket_limit% | Display the server's ticket limit | -| %channel% | Mention the channel | -| %rating_count% | Amount of feedback ratings you have received | -| %average_rating% | Displays server's average feedback rating | -| %time% | Display the current time | -| %date% | Display today's date | -| %datetime% | Display the current date and time | -| %timestamp% | Display the current Unix timestamp as a raw number | -| %date_days:N% | Display a date N days from now | -| %date_days:N:FORMAT% | Display a date N days from now with Discord format | -| %date_weeks:N% | Display a date N weeks from now | -| %date_weeks:N:FORMAT% | Display a date N weeks from now with Discord format | -| %date_months:N% | Display a date N months from now | -| %date_months:N:FORMAT% | Display a date N months from now with Discord format | -| %date_timestamp:UNIX% | Convert a Unix timestamp to a date | -| %date_timestamp:UNIX:FORMAT% | Convert a Unix timestamp to a date with Discord format | -| %timestamp_days:N% | Display the raw Unix timestamp N days from now | -| * %first_response_time_weekly% | Staff average first response time to tickets this week | -| * %first_response_time_monthly% | Staff average first response time to tickets this month | -| * %first_response_time_all_time% | Staff average first response time to tickets since the beginning | -| %discord_account_creation_date% | The date and time that the user's Discord account was created | -| %discord_account_age% | How long ago the user's Discord account was created | - -Placeholders marked with a * are premium features. Learn more about premium [here](https://tickets.bot/premium). - -**N** = number of days/weeks/months - -**UNIX** = Unix timestamp - -**FORMAT** = Discord format code: `d` (short date), `D` (long date), `t` (short time), `T` (long time), `f` (short date/time, default), `F` (long date/time), `R` (relative) - -### Integrations -All integration placeholders are automatically active, you do not have to do anything special apart from include them in your welcome message. - -#### Bloxlink -> ⚠️ **Bloxlink placeholders are currently unavailable.** Bloxlink has disabled their Global API, which these placeholders relied upon. We are investigating alternative solutions to restore Roblox placeholder support, but are unable to provide an estimated timeline. - -## Custom Naming Scheme Placeholders: -|Placeholder|Description| -|--|--| -| %id% | Display the unique ticket ID | -| %id_padded% | Display the unique ticket ID to 4 places | -| %username% | Display the user's name | -| %nickname% | Display the user's nickname | -| %claimed% | Display whether the ticket is claimed or unclaimed | -| %claim_indicator% | Display 🟒 if claimed or πŸ”΄ if unclaimed | -| %claimed_by% | Display the claimer's username | -| %date% | Display the current date in short format | -| %date:FORMAT% | Display the current date with custom format | -| %date_days:N% | Display a date N days from now | -| %date_days:N:FORMAT% | Display a date N days from now with custom format | -| %date_weeks:N% | Display a date N weeks from now | -| %date_weeks:N:FORMAT% | Display a date N weeks from now with custom format | -| %date_months:N% | Display a date N months from now | -| %date_months:N:FORMAT% | Display a date N months from now with custom format | -| %date_timestamp:UNIX% | Convert a Unix timestamp to a date | -| %date_timestamp:UNIX:FORMAT% | Convert a Unix timestamp to a date with custom format | - -**N** = number of days/weeks/months - -**UNIX** = Unix timestamp - -**FORMAT** = custom format using tokens: `yyyy` (4-digit year), `yy` (2-digit year), `mm` (zero-padded month), `m` (single-digit month), `dd` (zero-padded day), `d` (single-digit day). Use any separator, e.g. `yyyy-mm-dd`, `d/m/yy`, `dd.mm.yyyy`. Defaults to short format (`jan19`) if not specified. - -## Escaping Placeholders -To display a placeholder as literal text instead of having it replaced, use backslashes: `\%placeholder\%` diff --git a/src/premium/introduction.md b/src/premium/introduction.md deleted file mode 100644 index 365de12..0000000 --- a/src/premium/introduction.md +++ /dev/null @@ -1,4 +0,0 @@ -# Premium -This chapter provides information regarding the premium tiers offered for the bot. - -Use the sidebar to navigate this chapter. diff --git a/src/premium/perks.md b/src/premium/perks.md deleted file mode 100644 index 140a697..0000000 --- a/src/premium/perks.md +++ /dev/null @@ -1,24 +0,0 @@ -# Tier Comparison -*** - -| Feature | Free | Voting
Premium | Premium | Whitelabel | -|--|--|--|--|--| -| Unlimited Tickets | X | X | X | X | -| Automatic Ticket Archives | X | X | X | X | -| Forms | X | X | X | X | -| Ticket Claiming | X | X | X | X | -| Access Control | X | X | X | X | -| Access to Autoclose | OnΒ Leave | On Leave | X | X | -| Max Ticket Panels | 3 | 3 | Unlimited | Unlimited | -| Panel Support Hours | 1 | 1 | Unlimited | Unlimited | -| Message Branding Removal | - | Welcome Message | X | X | -| Access to Statistics | - | X | X | X | -| Awaiting Response Category | - | - | X | X | -| Exit Surveys | - | - | X | X | -| Customise Embed Colour | - | - | X | X | -| Live Message Updates on the Dashboard | - | - | X | X | -| Send Messages Directly from the Dashboard | - | - | X | X | -| Custom Tag Alias | - | - | X | X | -| Customize Bot Name | - | - | - | X | -| Customize Bot Avatar | - | - | - | X | -| Customize Bot Status | - | - | - | X | diff --git a/src/premium/whitelabel-setup-guide.md b/src/premium/whitelabel-setup-guide.md deleted file mode 100644 index 95ddff0..0000000 --- a/src/premium/whitelabel-setup-guide.md +++ /dev/null @@ -1,96 +0,0 @@ -# Whitelabel Setup Guide -*** - -Thanks for purchasing whitelabel and supporting us! - -Please follow this guide **very carefully**. If you skip a single step, the process will not work. The setup is short, and will only need to be done once. - - -## (Step 1 of 5) Link Patreon Account -If you haven't done so already, you'll need to link your Patreon and Discord accounts on [this page](https://www.patreon.com/settings/apps). - -Patreon has a longer guide on how to do this [here](https://support.patreon.com/hc/en-us/articles/212052266-Get-my-Discord-role). - - -## (Step 2 of 5) Create Bot -Next, you'll need to create your custom bot that Tickets will run under. - -To do this, visit the [Discord developer portal](https://discord.com/developers/applications) and press `New Application` in the top right: - -![New application](/img/whitelabel/new_application.webp) - -Enter a name for your bot and press create. - -From here, you can change your bot's avatar: - -![General Information](/img/whitelabel/general_information.webp) - - -## (Step 3 of 5) Start Bot -Next, you have to submit the bot's token. This is like a password to the bot. **Never send this token to anyone, even in our support server.** - -Click on `Bot` on the sidebar of the Discord developer portal and copy the token (you may have to click the `reset token` button before you can copy): - -![Copy Token](/img/whitelabel/copy_token.webp) - -Then head over to the Tickets dashboard [Whitelabel section](https://dashboard.tickets.bot/whitelabel). Paste the token into the `Bot Token` field and press `Submit`: - -> **Note:** -> - There may be up to a 10 minute delay for the whitelabel section of dashboard to recognize your status. -> - Until it does, it will lead you back to the "buy premium/whitelabel" page. - -![Submit Token](/img/whitelabel/submit_token.webp) - -You will then be presented with a message saying that the bot is now online. - -If you receive an error, make sure that you copied the token (not the client secret) fully. Additionally, refresh the page and check the `Error Log` table for any errors. - - -## (Step 4 of 5) Invite Bot To Server -Before you can invite the bot to your server, you must kick the main `Tickets v2#5105` bot from your server. It is **extremely** important that you do this **before** inviting your custom bot to your server. If you do not do this, you risk data loss. - -![Kick Bot](/img/whitelabel/kick_bot.webp) - -To invite your whitelabel bot to your server, click the `Generate Invite Link` button under the Manage Bot section. - -Upon clicking the button, you will be taken to the normal bot invite page - select your server and authorise. It is important that you grant the bot all the permissions that it asks for. - -![Invite](/img/whitelabel/invite.webp) - - -## (Step 5 of 5) Activate Premium Perks -The last mandatory step is to activate the premium perks that come with whitelabel for your server. - -> **Note:** -> - There may be up to a 10 minute delay for the whitelabel bot to recognize the guild/server and synch commands. -> - Until it does, it will error when running commands. -> - If command errors, wait 10 minutes and try the command again. - -Go to your discord server and run the command `/premium`. You must select the command when it displays to you after typing. Make sure to choose `patreon` since that is how you paid for the whitelabel bot. **Giveaway Key is not used here.** - -- *If `Patreon` is not a selectable option, then your premium perks are already applied to the server.* - -![Activate Premium Perks](/img/whitelabel/activate_premium.webp) - -**And you're done!** Your bot should be ready for use. - -There are a few more **optional** steps below, if you wish to take them. - - -## Optional: Set Custom Status -You can optionally change your custom bot's status. Simply enter the new status on the dashboard and press `Submit`. - -`Playing`, `Listening`, `Watching`, `Competing` and `Custom` are all currently available. - -![Custom Status](/img/whitelabel/custom_status.webp) - - -## Optional: Set Privacy Policy & ToS Links -On the `General Information` tab of the Discord developer portal, you may have noticed `Terms Of Service URL` and `Privacy Policy URL` fields. - -You should enter our policies here to inform users of how their data may be used. - -**Terms Of Service:** https://tickets.bot/terms-of-service -**Privacy Policy:** https://tickets.bot/privacy - -![Policies](/img/whitelabel/policies.webp) diff --git a/src/setup/auto.md b/src/setup/auto.md deleted file mode 100644 index e353d41..0000000 --- a/src/setup/auto.md +++ /dev/null @@ -1,14 +0,0 @@ -# Bot Configuration: Automatic Setup -*** - -Tickets provides an option to automatically create a basic configuration for you. This isn't recommended since the settings are unlikely to be to your preference, and a ticket panel is **not** automatically created. For information on creating ticket panels, see our guide [here](./panels.md). - -To run the automatic setup mode, first ensure that you are either the owner of the server, or the owner has designated you as an administrator of the bot using `/addadmin @YourUsername`. Next, simply execute `/setup auto` in a channel the bot can see. - -It will update you as the process progresses: - -![Auto setup](/img/auto_setup.webp) - -Simply assign your support staff the new `Tickets Support` role and your administrators the `Tickets Admin` role and your staff will be able to open and support users in tickets created via `/open` or the context menu (right click > apps > start ticket.) - -You'll probably want to [create a ticket panel](./panels.md) so it's easier for your server members to open a ticket, or tweak the settings on the [web dashboard](./dashboard.md). \ No newline at end of file diff --git a/src/setup/configuration.md b/src/setup/configuration.md deleted file mode 100644 index baa0f2d..0000000 --- a/src/setup/configuration.md +++ /dev/null @@ -1,27 +0,0 @@ -# Bot Configuration -*** - -Let's start getting the bot ready for use in your server! - -Tickets was a very early adopter of slash commands, meaning that you can simply hit `/` in your Discord client to have commands auto-completed with the correct arguments: - -![Slash commands](../img/slash_commands.webp) - -If you're not the owner of the server, now would be a good time to get the owner to designate you as an admin of Tickets. You can do this by asking the owner to run the command `/addadmin @YourUsername` in a channel the bot can see. If successful, Tickets will show you a βœ…. - -We've created a few different ways in which you can configure the bot: -- Via the [web dashboard](https://dashboard.tickets.bot) **[Recommended]** -- Via `/setup` - - Auto - - Individual Settings - -> **Note:** We recommend using the web dashboard to configure the bot, as it's easier and more settings are available - including ticket panels. - -If you'd prefer to stick to configuring the bot via commands in Discord, there are a few different methods in which you can do so: -- `/setup auto` will automatically create roles, channels, and everything else you need (excluding reaction panels) without any interaction required from you. This is okay for simple usecases, but you'll likely want to configure the options yourself. -- **Individual Settings**: Run commands such as `/setup limit` and `/setup use-threads` to change individual settings one by one. - -We have guides on each of the available methods: -- [Web Dashboard](./dashboard.md) **[Recommended]** -- [Auto](./auto.md) -- [Individual Settings](./individual.md) diff --git a/src/setup/dashboard.md b/src/setup/dashboard.md deleted file mode 100644 index 1838da8..0000000 --- a/src/setup/dashboard.md +++ /dev/null @@ -1,93 +0,0 @@ -# Bot Configuration: Web Dashboard -*** - -First, head over to the dashboard at [dashboard.tickets.bot](https://dashboard.tickets.bot). You'll be asked to login with Discord - simply click `Authorize` and you'll be taken back to the dashboard. - -![Login](../img/login.webp) - -A list of servers which you are a Tickets bot administrator (`/addadmin`) and the bot has been invited to should show up. Simply click on the server you want to configure. If the server does not show up, ensure that you are either the owner of the server or have been added as a Tickets bot administrator by the owner using `/addadmin @YourUsername` and log out of, then back into, the dashboard. - -![Server list](../img/server_list.webp) - -You'll be taken to the settings page as follows: - -![Settings page](../img/settings_card.webp) - -You'll first want to pay attention to the main **Settings** card. Here you can edit the following settings: - -## Per User Simultaneous Ticket Limit - -This is the amount of tickets that a **single user** can have open **at a single time**. We usually recommend setting this to 1, but the default is 5. - -For example, if you set this value to 1, a user will be able to open and close tickets an infinite amount of times, but only have a single ticket open at once. This value does not affect the total amount of tickets that can be opened at once in a server. - -We do not impose any limits on the amount of tickets that a server can have open at once. However, please note that Discord only permits a total of 500 channels to exist in a server at once, and 50 channels to exist at once in a category. This means that you can move tickets to a new category if one gets filled, however you are limited to 500 channels overall by Discord. - -## Allow Users To Close Tickets - -This option specifies whether users are allowed to close their own tickets. If unchecked, only your support staff & administrators will be able to close them. - -## Ticket Close Confirmation - -This option specifies whether Tickets will send a confirmation message when closing a ticket via the πŸ”’`close` reaction. If checked, Tickets will send the following message after reacting: - -![Ticket close confirmation](../img/ticket_close_confirmation.webp) - -Simply click the blue βœ”οΈ`close` reaction to confirm you want to close the ticket. - -Close confirmation does not apply to tickets closed using the slash command `/close`. - -## Welcome Message - -The welcome message is the message displayed in the Ticket as soon as the user opens it: - -![Welcome message](../img/welcome_message.webp) - -> **Note:** the message has a maximum limit of 1024 characters due to Discord limitations. - -- You may make use of placeholders in your welcome message. You can view a list of placeholders [here](../miscellaneous/placeholders.md). - -- You may also use discord message formatting to include links to channels, emojis, roles, or usernames in your welcome message. **First**, you will need to have discord developer mode turned on - in your personal discord account settings > advanced > discord developer mode. **Second**, you can right click any channel name, username, message, etc and choose `Copy ID`. **Third**, use the `structure` section of [discord's messge formatting chart](https://discord.com/developers/docs/reference#message-formatting) to include it in your welcome message. - -The title of the embed will either be based off of the subject provided by the user when using `/open [Subject]`, or the title of the ticket panel if used. We are unable to get a subject from the user when using ticket panels currently, however, this will be possible in a future update of Discord. - -## Transcripts Channel - -When Tickets are closed, a transcript will automatically be recorded, encrypted, and stored in cloud based object storage - with no user interaction required. - -A message, similar to the one following, will also be sent to your transcripts channel to notify you the ticket was closed and provide you with a link to the dashboard to view the archive: - -![Archive message](../img/archive_message.webp) - -This message will also be sent via direct messages to the user who opened the ticket. It is not possible to disable this functionality since we believe it is important for transparency purposes that users are also able to access the transcripts. - -If you have privacy concerns, please join our [support server](https://discord.gg/ticketsbot) to enquire. Unfortunately we are unable to answer any questions regarding your user data off-platform in order to verify your identity. - -## Channel Category - -Designates the channel category that tickets will be created under. If you are unsure what a channel category is, Discord has a guide explaining them available [here](https://support.discord.com/hc/en-us/articles/115001580171-Channel-Categories-101). - -Your tickets will be grouped together under the category as follows: - -![Tickets](../img/channels.webp) - -## Overflow Category - -Discord has an imposed limitation that each Channel Category can only hold 50 channels. Once you hit this limit, Tickets bot will fail to be able to open more ticket channels for you and your server members. To help rectify this, you can set an Overflow Category. This is a category that the ticket channels will open in once your selected Channel Category has hit the Discord imposed limit. - -## Naming Scheme - -Defines how the ticket channels should be named. Currently, the 2 options are by ticket ID (`#ticket-1`) or by username (`#ticket-name`). You can define more [custom naming schemes](./panels.md#naming-scheme) in the settings of individual reaction panels, instead of this overall setting. - -## Submission - -Once you are satisfied with your settings, press the `Submit` button to save them. An example follows: - -![Settings](../img/settings_card.webp) - -We now have the basic configuration completed! - -You may wish to configure the following options next: -- [Ticket Panels](./panels.md) -- [Claim Settings](../dashboard/settings/claiming.md) -- [Auto Close](../dashboard/settings/settings.md/#auto-close) diff --git a/src/setup/individual.md b/src/setup/individual.md deleted file mode 100644 index fb87824..0000000 --- a/src/setup/individual.md +++ /dev/null @@ -1,42 +0,0 @@ -# Bot Configuration: Indiviual Commands -*** - -You can also tweak individual settings by using a single command. Note, not all settings are available via command, some are only accessible on the [dashboard](./dashboard.md), such as [ticket panels](./panels.md). - -To run the setup, first ensure that you are either the owner of the server, or the owner has designated you as an administrator of the bot by using `/addadmin @YourUsername`. - -For definitions and explanations of settings, please refer to the [dashboard guide](./dashboard.md#ticket-limit). - -## Setup Commands - -| Command | Description | -| ---------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | -| /setup auto | Bot will make a very basic configuration (no ticket panels - you'll still want to customize on dashboard) | -| /setup limit | Change the quantity of tickets a single user can have open at the same time | -| /setup transcripts | Change the transcripts channel | -| /setup use-threads | Change whether thread mode is enabled | - -### Auto -See our guide on auto setup [here](./auto.md). - -### Ticket Limit -An explanation of ticket limits is available [here](./dashboard.md#ticket-limit). The command `/setup limit` is used to configure the ticket limit. - -> **For example:** to change the per user simultaneous ticket limit to `1` **-** Run `/setup limit 1` - -### Transcripts -An explanation of transcript channels is available [here](./dashboard.md#transcripts-channel). The command `/setup transcripts` is used to configure the transcripts channel. - -> **For example:** to change the transcripts channel to `#logs` **-** Run `/setup transcripts #logs` - -- _Please note, the channel must already exist._ - -### Use Threads -It is recommended to read an explanation of thread mode (and how it compares to channel mode) [here](../features/thread-mode.md) before using this command. The command `/setup use-threads` is used to enable (`true`), or disable (`false`), whether tickets open as private threads instead of channels. It will also be necessary to select the ticket notification channel. - -> **For example:** to enable thread mode **-** Run `/setup use-threads`, choose `true`, click `ticket_notification_channel`, then select the channel desired from list - -- _Please note, the selected channel must already exist._ - -## Additional Settings -Additional settings are available on the [dashboard](./dashboard.md), such as [ticket panels](./panels.md). It is advised that you read these guides next. diff --git a/src/setup/introduction.md b/src/setup/introduction.md deleted file mode 100644 index 39d1393..0000000 --- a/src/setup/introduction.md +++ /dev/null @@ -1,27 +0,0 @@ -# Setup -*** - -Thanks for choosing Tickets as your support solution! In this guide we'll teach you how to get up and running in no time at all. - -> If you need any assistance in the process, feel free to join our [Discord server](https://discord.com/invite/ticketsbot) and open a ticket to talk to our support staff. - -### For those with previous experience configuring Discord bots -*** -Quickly get the absolute basic functions of a ticket system for your server in 5 steps: - -**1.** [Invite the bot](https://invite.tickets.bot) -**2.** Make yourself admin of the bot `/addadmin @YourUsername` -**3.** Go to the [web dashboard](https://dashboard.tickets.bot) -**4.** Make a [ticket panel](../setup/panels.md) -**5.** Go back to discord and add your staff as support so they can see and answer tickets `/addsupport @TheirRole` - -> It is **HIGHLY RECOMMENDED** to continue reading through SETUP and the rest of the documentation, as these steps only provide the most basic working ticket system. There are many ways to customize the system, messages, notifications, and support staff. - -### For beginners with Discord bots -*** - -You'll need to start by inviting Tickets to your server. -- *Learn how to do this [here](../setup/invite.md).* - -**If you've already invited the bot to your server**, feel free to jump ahead and start configuring it. -- *View our guide on this [here](../setup/configuration.md).* diff --git a/src/setup/panels.md b/src/setup/panels.md deleted file mode 120000 index 628512f..0000000 --- a/src/setup/panels.md +++ /dev/null @@ -1 +0,0 @@ -../dashboard/reaction-panels.md \ No newline at end of file diff --git a/src/setup/staff.md b/src/setup/staff.md deleted file mode 100644 index 1479e87..0000000 --- a/src/setup/staff.md +++ /dev/null @@ -1,26 +0,0 @@ -# Support Staff -*** - -Now that the ticket system is in place, Tickets bot needs to know which of your staff should have access to the tickets (and the online dashboard settings - if desired.) - -> **There are two scenarios for how to setup support staff:** -> - Staff members handle **SPECIFIC** tickets -> - Staff members handle **ALL** tickets - - -## Staff members handle SPECIFIC tickets -*** -> Setting the support staff in this scenario can only be accomplished via the [web dashboard](https://dashboard.tickets.bot). A guide on this can be found [here](../dashboard/staff-teams.md). - - -## Staff members handle ALL tickets -> Setting the support staff in this scenario, is recommended via slash commands. - -**Command:** `/addadmin @username` or `/addadmin @role` - -Not only does this add the specified user to the Default Team in Staff Teams, but it also gives that user full administrative privileges of the Tickets bot for your server. This is just having admin of the Tickets bot, **not your server**. -- Having admin privileges of the bot means the user will be able to use the [web dashboard](https://dashboard.tickets.bot) fully, and control all the configuration, settings, customization of the bot, as well as see ALL of the tickets/transcripts contained there. ***Only give this privilege to those you trust.*** - -**Command:** `/addsupport @username` or `/addsupport @role` - -This adds the specified user to the Default Team in Staff Teams. The only thing they will be able to see on the web dashboard are the tickets where the Default Team has been assigned as a support team. diff --git a/src/vid/Forms.mp4 b/src/vid/Forms.mp4 deleted file mode 100644 index ea2ad0d..0000000 Binary files a/src/vid/Forms.mp4 and /dev/null differ diff --git a/src/vid/ReactionPanels.mp4 b/src/vid/ReactionPanels.mp4 deleted file mode 100644 index 4e63e09..0000000 Binary files a/src/vid/ReactionPanels.mp4 and /dev/null differ diff --git a/src/vid/StaffTeams.mp4 b/src/vid/StaffTeams.mp4 deleted file mode 100644 index 0f62b61..0000000 Binary files a/src/vid/StaffTeams.mp4 and /dev/null differ diff --git a/theme/favicon.svg b/theme/favicon.svg deleted file mode 100644 index 4d9c4c3..0000000 Binary files a/theme/favicon.svg and /dev/null differ