feat: Add TOS & Privacy Policy

Signed-off-by: Ben Hall <ben@benh.codes>
This commit is contained in:
Ben Hall 2025-01-07 19:40:18 +00:00
parent 5139f790cc
commit e77fc3c72a
5 changed files with 359 additions and 2 deletions

View File

@ -1,7 +1,7 @@
export const API_URL = env.API_URL || "http://localhost:3000"
export const API_URL = env.API_URL || "https://api.ticketsbot.cloud"
export const PLACEHOLDER_DOCS_URL = "https://docs.ticketsbot.net/setup/placeholders.html"
export const OAUTH = {
clientId: env.CLIENT_ID || "700742994386747404",
clientId: env.CLIENT_ID || "1325579039888511056",
redirectUri: env.REDIRECT_URI || "http://localhost:5000/callback"
}

View File

@ -0,0 +1,63 @@
<Head/>
<div class="wrapper">
<div class="super-container">
<!-- TODO: Make this better :) -->
<!-- {#if currentRoute.component !== Index}
<LoadingScreen/>
{/if} -->
<NotifyModal/>
<div class="content-container">
<Route {currentRoute} {params}/>
</div>
</div>
</div>
<script>
import {Route} from 'svelte-router-spa'
import Head from '../includes/Head.svelte'
import Sidebar from '../includes/Sidebar.svelte'
import LoadingScreen from '../includes/LoadingScreen.svelte'
import NotifyModal from '../includes/NotifyModal.svelte'
import {loadingScreen} from "../js/stores"
import Index from "../views/Index.svelte";
export let currentRoute;
export let params = {};
</script>
<style>
body {
padding: 0 !important;
}
.wrapper {
display: flex;
width: 100%;
height: 100%;
margin: 0 !important;
padding: 0 !important;
}
.super-container {
display: flex;
width: 100%;
height: 100%;
}
.content-container {
display: flex;
width: 100%;
height: 100%;
}
.hide {
visibility: hidden;
}
@media (max-width: 950px) {
.wrapper {
flex-direction: column;
}
}
</style>

View File

@ -36,9 +36,15 @@ import EditPanel from "./views/panels/EditPanel.svelte";
import EditMultiPanel from "./views/panels/EditMultiPanel.svelte";
import SelectServers from "./views/premium/SelectServers.svelte";
import LegalLayout from "./layouts/LegalLayout.svelte"
import PrivacyPolicy from "./views/legal/PrivacyPolicy.svelte"
import TOS from "./views/legal/TOS.svelte"
export const routes = [
{name: '/', component: Index, layout: IndexLayout},
{name: '404', path: '404', component: Error404, layout: ErrorLayout},
{name: "/legal/privacy", component: PrivacyPolicy, layout: LegalLayout },
{name: "/legal/tos", component: TOS, layout: LegalLayout },
{name: '/callback', component: LoginCallback},
{name: '/login', component: Login},
{name: '/logout', component: Logout},

View File

@ -0,0 +1,139 @@
<script>
import Card from "../../components/Card.svelte";
</script>
<div class="content">
<div class="card-wrapper">
<Card footer={false} fill={false}>
<span slot="title"> Privacy Policy </span>
<div slot="body" style="width: 100%">
<h2>What data do you collect & how do you use the data?</h2>
<p>
When you invite Tickets to your server, we cache the guild
object, channel objects and role objects. Additionally, we
may also cache any user or member objects that Discord
provides Tickets with in the GUILD_CREATE payload. Upon
interaction with the bot, we may also cache your member and
user objects if we do not already do so. We store this data
solely for operation of the Tickets service to prevent
excessive API requests to the Discord API.
</p>
<br />
<p>
When a Ticket is closed in a server, all message content and
participants (specifically username, avatar hash and
discriminator) as retrieved and uploaded to our ticket
archive store. We use OVH's object storage offering to store
the data, which is encrypted by us, and additionally
encrypted by OVH at rest. Backups of our database and ticket
transcripts are encrypted and stored in Switzerland, via
Exoscale.
</p>
<br />
<p>
When logging into our web dashboard, we also collect all
guild objects for the servers you are a member of. This is
so we can verify your ownership / status in the server, and
provide a list of servers to manage.
</p>
<hr />
<h2>Third Party Services</h2>
<h3>Bloxlink</h3>
<p>
If you have opted into using our Bloxlink integration, the
IDs of users will be sent to Bloxlink when opening a ticket
to retrieve their Roblox user ID. This is then sent to
Roblox's own API and exchanged for the full Roblox user
object. Only the user's snowflake is shared with Bloxlink.
</p>
<p>
You can view Bloxlink's own Terms of Service <a
href="https://www.iubenda.com/privacy-policy/11935974s"
>here</a
>.
</p>
<h3>User-created Integrations</h3>
<p>
Administrators of Discord servers using our service can
install or create custom integrations. This means that upon
opening a ticket, your user ID (which is not classed as PII
by Discord) is sent to the operators of the service used by
the integration. Custom integrations are able to define
privacy policies. You should ask the administrators of
servers using our service for the privacy policies of
integrations they have installed.
</p>
<h3>Cloudflare</h3>
<p>
All traffic is routed through Cloudflare, whose service we
use for web performance and security.
</p>
<p>
You can view Cloudflare's privacy policy <a
href="https://www.cloudflare.com/privacypolicy/">here</a
>.
</p>
<h3>Google Analytics</h3>
<p>
We use Google Analytics on some of our web pages to track
how we can improve your experience using our sites. Google
Analytics is a industry standard tool, used by most
websites. All data is anonymised before being forwarded. We
do not use this data for advertising purposes.
</p>
<p>
You can view Google Analytics' terms of service and privacy
policy <a
href="https://marketingplatform.google.com/about/analytics/terms/us/"
>here</a
>.
</p>
<hr />
<h2>
How can I contact you regarding concerns with the Tickets
service?
</h2>
<p>
We are happy to resolve any data processing of security
concerns you may have. The best way to get in contact with
us is by joining our Discord support server and opening a
Ticket in the #support channel.
</p>
<hr />
<h2>How can I request my data or data removal?</h2>
<p>
Please join our Discord support server and open a Ticket in
the #support channel. Unfortunately, we are unable to help
you with these queries via external channels, as we would
not be able to reliably verify your identity. We will handle
your request within 30 days of it being logged.
</p>
</div>
</Card>
</div>
</div>
<style>
.content {
display: flex;
height: 100%;
width: 100%;
justify-content: center;
}
h3 {
font-weight: bold !important;
}
.card-wrapper {
display: block;
width: 75%;
margin-top: 5%;
}
@media (max-width: 576px) {
.card-wrapper {
width: 100%;
}
}
</style>

View File

@ -0,0 +1,149 @@
<script>
import Card from "../../components/Card.svelte";
</script>
<div class="content">
<div class="card-wrapper">
<Card footer={false} fill={false}>
<span slot="title"> Terms of Service </span>
<div slot="body" style="width: 100%">
<p>
Please read these terms of service ("terms", "terms of
service") carefully before using Tickets Discord bot and
ticketsbot.cloud (the "service") operated by
ticketsbot.cloud ("us", 'we", "our").
</p>
<br />
<p>
We will provide their services to you, which are subject to
the conditions stated below in this document. Every time you
visit this website, use its services or make a purchase, you
accept the following conditions.
</p>
<br />
<p>
By using the service, you represent and warrant that you
agree to these terms, and have the legal capacity to do so.
</p>
<hr />
<h2>Privacy</h2>
<p>
When you visit this website or use the service, we collect
information about you. Please review our <a
href="/legal/privacy">privacy policy</a
> for further information.
</p>
<hr />
<h2>User Guidelines</h2>
<ol>
<li>
Do not take any actions to attempt to abuse or purposely
disrupt or cause other damage to the service.
</li>
<li>
Do not use the service in a manner inconsistent with any
applicable laws or regulations of your local region and
the United Kingdom.
</li>
<li>
Do not attempt to access any data that you are not
permitted to.
</li>
<li>
Do not interfere with, disrupt, or create an undue
burden on the service or the networks or services
connected to the service.
</li>
<li>
Do not attempt to bypass any measures of the service
designed to prevent or restrict access to the service,
or any portion of the service.
</li>
<li>
Do not use the service to process or store adult visual
media content, including but not restricted to images
and videos.
</li>
<li>
Do not use the service to process or store
privacy-sensitive data from users, such as identity
documents.
</li>
<li>
Do not use the service to, or in association to a way
that would, violate the <a
href="https://discord.com/terms"
>Discord Terms of Service</a
>
or
<a href="https://discord.com/guidelines"
>Discord Community Guidelines</a
>. Please take additional care to review the following
extracts:
<blockquote>
<br />
You agree not to use the Service in order to:
<br />
...
<br />
Exploit, distribute or publicly inform other members
of any game error, miscue or bug which gives an unintended
advantage; violate any applicable laws or regulations;
or promote or encourage illegal activity including, but
not limited to, hacking, cracking or distribution of
counterfeit software, compromised accounts, or cheats
or hacks for the Service.
</blockquote>
<blockquote>
Do not abuse Discord products in any way, such as
selling or purchasing an account or server, or
participating in fraudulent Nitro incentives or
<strong>Boosting activities</strong>.
</blockquote>
</li>
</ol>
</div>
</Card>
</div>
</div>
<style>
blockquote {
border-left: 10px solid #ccc;
margin: 1.5em 10px;
padding: 0.5em 10px;
}
blockquote:before {
color: #ccc;
content: open-quote;
font-size: 4em;
line-height: 0.1em;
margin-right: 0.25em;
vertical-align: -0.4em;
}
blockquote p {
display: inline;
}
.content {
display: flex;
height: 100%;
width: 100%;
justify-content: center;
}
h3 {
font-weight: bold !important;
}
.card-wrapper {
display: block;
width: 75%;
margin-top: 5%;
}
@media (max-width: 576px) {
.card-wrapper {
width: 100%;
}
}
</style>