Move postman and web inside src

This commit is contained in:
jude
2024-03-24 20:23:16 +00:00
parent 075fde71df
commit 4a80d42f86
152 changed files with 833 additions and 779 deletions

View File

@ -0,0 +1,89 @@
<!DOCTYPE html>
<html lang="EN">
<head>
<script src="/static/js/reporter.js" type="application/javascript"></script>
<meta name="description" content="The most powerful Discord Reminders Bot">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="UTF-8">
<meta name="yandex-verification" content="bb77b8681eb64a90"/>
<meta name="google-site-verification" content="7h7UVTeEe0AOzHiH3cFtsqMULYGN-zCZdMT_YCkW1Ho"/>
<!-- <meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src *; font-src fonts.gstatic.com 'self'"> -->
<!-- favicon -->
<link rel="apple-touch-icon" sizes="180x180"
href="/static/favicon/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32"
href="/static/favicon/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16"
href="/static/favicon/favicon-16x16.png">
<link rel="manifest" href="/static/favicon/site.webmanifest">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff">
<title>Reminder Bot | Admin</title>
<!-- styles -->
<link rel="stylesheet" href="/static/css/bulma.min.css">
<link rel="stylesheet" href="/static/css/fa.css">
<link rel="stylesheet" href="/static/css/font.css">
<link rel="stylesheet" href="/static/css/style.css">
<link rel="stylesheet" href="/static/css/dtsel.css">
<script src="/static/js/luxon.min.js"></script>
</head>
<body style="width: 100%;">
<p class="title pageTitle">Admin dashboard</p>
<section id="main">
<div class="stat-row">
<div class="stat-box" style="height: 400px;">
<canvas id="schedule"></canvas>
</div>
</div>
<div class="stat-row">
<div class="stat-box figure">
<p>Backlog</p>
<p class="figure-num" id="backlog">?</p>
</div>
<div class="stat-box figure">
<p>Reminders</p>
<p class="figure-num" id="reminders">?</p>
</div>
<div class="stat-box figure">
<p>Intervals</p>
<p class="figure-num" id="intervals">?</p>
</div>
</div>
<div class="stat-row">
<div class="stat-box" style="height: 400px;">
<canvas id="scheduleLong"></canvas>
</div>
</div>
<div class="stat-row">
<div class="stat-box figure">
<p>Last 31 days (success)</p>
<p class="figure-num" id="historySent">?</p>
</div>
<div class="stat-box figure">
<p>Last 31 days (failed)</p>
<p class="figure-num" id="historyFailed">?</p>
</div>
<div class="stat-box figure">
<p>Last 31 days (failure rate)</p>
<p class="figure-num" id="failRate">?</p>
</div>
</div>
<div class="stat-row">
<div class="stat-box" style="height: 400px;">
<canvas id="historyLong"></canvas>
</div>
</div>
</section>
<script src="/static/js/chart.js" defer></script>
<script src="/static/js/chartjs-adapter-luxon.js" defer></script>
<script src="/static/js/admin.js" defer></script>
</body>
</html>

186
templates/base.html.tera Normal file
View File

@ -0,0 +1,186 @@
<!DOCTYPE html>
{% block init %}
{% endblock %}
<html lang="EN">
<head>
<meta name="description" content="The most powerful Discord Reminders Bot">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="UTF-8">
<meta name="yandex-verification" content="bb77b8681eb64a90" />
<meta name="google-site-verification" content="7h7UVTeEe0AOzHiH3cFtsqMULYGN-zCZdMT_YCkW1Ho" />
<!-- favicon -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/favicon/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/favicon/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/favicon/favicon-16x16.png">
<link rel="manifest" href="/static/site.webmanifest">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff">
<title>Reminder Bot | {{ title }}</title>
<!-- styles -->
<link rel="stylesheet" href="/static/css/bulma.min.css">
<link rel="stylesheet" href="/static/css/fa.css">
<link rel="stylesheet" href="/static/css/font.css">
<link rel="stylesheet" href="/static/css/style.css">
</head>
<body>
{% if flashed_message %}
<div class="notification is-{{ flashed_grade }} flash-message is-active">
<span class="icon"><i class="far fa-exclamation-circle"></i></span> {{ flashed_message }}
</div>
{% endif %}
<div style="min-height: 100vh;">
<nav class="navbar is-dark is-spaced is-size-4" role="navigation" aria-label="main navigation">
<div class="navbar-brand">
<a class="navbar-item" href="/">
<figure class="image">
<img src="/static/img/logo_flat.webp" alt="Reminder Bot Logo" class="is-rounded" style="width: auto;">
</figure>
</a>
<a role="button" class="navbar-burger is-right" aria-label="menu" aria-expanded="false" data-target="pageNavbar">
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
</a>
</div>
<div class="navbar-menu">
<div class="navbar-start">
<a class="navbar-item" href="https://invite.reminder-bot.com">
<i class="fas fa-plus"></i>
</a>
<a class="navbar-item" href="https://gitea.jellypro.xyz/jude">
<i class="fab fa-git-square"></i>
</a>
<a class="navbar-item" href="https://discord.jellywx.com">
<i class="fab fa-discord"></i>
</a>
<a class="navbar-item" href="/help">
<i class="fas fa-book"></i>
</a>
</div>
<div class="navbar-end">
<div class="navbar-item">
<a class="button is-rounded is-light" href="/dashboard">
<p>
<span>Dashboard</span> <span class="icon"><i class="fas fa-chevron-right"></i></span>
</p>
</a>
</div>
</div>
</div>
<div class="navbar-menu is-hidden-desktop" id="pageNavbar">
<a class="navbar-item" href="https://invite.reminder-bot.com">
<i class="fas fa-plus"></i>
</a>
<a class="navbar-item" href="https://github.com/jellywx">
<i class="fab fa-github"></i>
</a>
<a class="navbar-item" href="https://discord.jellywx.com">
<i class="fab fa-discord"></i>
</a>
<a class="navbar-item" href="/help">
<i class="fas fa-book"></i>
</a>
<div class="navbar-item">
<a href="/dashboard">
<p>
Dashboard <span class="icon"><i class="fas fa-chevron-right"></i></span>
</p>
</a>
</div>
</div>
</nav>
{% if not hide_title_block %}
<section class="hero is-small is-dark">
<div class="hero-body">
<div class="">
<h1 class="title is-1">{{ page_title }}</h1>
<h2 class="subtitle is-3">{{ page_subtitle }}
{% if page_emoji %}
<span class="icon"><i class="fas {{ page_emoji }}"></i></span>
{% endif %}
</h2>
</div>
</div>
{% if show_invite %}
<div class="hero-foot has-text-centered">
<a class="button is-size-4 is-rounded is-success" href="https://invite.reminder-bot.com">
<p class="is-size-4">
<span>Add to your Server</span> <span class="icon"><i class="fas fa-chevron-right"></i></span>
</p>
</a>
</div>
{% elif show_contact %}
<div class="hero-foot has-text-centered">
<a class="button is-size-4 is-rounded is-primary" href="https://discord.jellywx.com">
<p class="is-size-4">
<span>Join Discord</span> <span class="icon"><i class="fas fa-chevron-right"></i></span>
</p>
</a>
</div>
{% elif show_login %}
<div class="hero-foot has-text-centered">
<a class="button is-size-4 is-rounded is-light" href="/login/discord">
<p class="is-size-4">
<span>Login with Discord</span> <span class="icon"><i class="fas fa-chevron-right"></i></span>
</p>
</a>
</div>
{% endif %}
</section>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1440 160">
<path transform="scale(1, 0.5)" fill="#98dc9a" fill-opacity="1" d="M0,288L80,266.7C160,245,320,203,480,202.7C640,203,800,245,960,218.7C1120,192,1280,96,1360,48L1440,0L1440,0L1360,0C1280,0,1120,0,960,0C800,0,640,0,480,0C320,0,160,0,80,0L0,0Z"></path>
<path transform="scale(1, 0.5)" fill="#363636" fill-opacity="1" d="M0,224L60,202.7C120,181,240,139,360,138.7C480,139,600,181,720,197.3C840,213,960,203,1080,176C1200,149,1320,107,1380,85.3L1440,64L1440,0L1380,0C1320,0,1200,0,1080,0C960,0,840,0,720,0C600,0,480,0,360,0C240,0,120,0,60,0L0,0Z">
</path>
</svg>
{% endif %}
{% block content %}
{% endblock %}
</div>
<br>
<footer class="footer">
<div class="content has-text-centered">
<p>
<strong>Reminder Bot</strong>, created by <a href="https://github.com/JellyWX"><strong>JellyWX</strong></a>
<br>
<a href="/cookies">Cookies</a> | <a href="/privacy">Privacy Policy</a> | <a href="/terms">Terms of Service</a>
<br>
<a href="https://patreon.com/jellywx"><strong>Patreon</strong></a> | <a href="https://discord.jellywx.com"><strong>Discord</strong></a> | <a href="https://gitea.jellypro.xyz/jude"><strong>Gitea</strong></a>
<br>
or, <a href="mailto:jude@jellywx.com">Email me</a>
</p>
</div>
</footer>
<script>
document.addEventListener('DOMContentLoaded', () => {
const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0);
if ($navbarBurgers.length > 0) {
$navbarBurgers.forEach( el => {
el.addEventListener('click', () => {
const target = el.dataset.target;
const $target = document.getElementById(target);
el.classList.toggle('is-active');
$target.classList.toggle('is-active');
});
});
}
});
</script>
</body>
</html>

View File

@ -0,0 +1,61 @@
{% extends "base" %}
{% block init %}
{% set title = "Cookies" %}
{% set page_title = "Cookies" %}
{% set page_subtitle = "Data this website stores on your computer" %}
{% set page_emoji = "fa-gingerbread-man" %}
{% endblock %}
{% block content %}
<section class="section">
<div class="container">
<h2 class="title">User data</h2>
<p class="is-size-5 pl-6">
This website uses some necessary cookies and session data to operate. None of this can be disabled, since
it is all necessary for the site to function. <strong>However,</strong> it is worth mentioning that all of
this data is <strong>first-party only</strong>, i.e we use no tracking scripts like Google Analytics, and
no adverts are served on this site.
</p>
</div>
</section>
<section class="section">
<div class="container">
<h2 class="title">Cookies</h2>
<p class="is-size-5 pl-6">
Cookies are data that are persistent between browser restarts. Cookies are read and written by the website
running on your computer, not by our server.
<br>
Cookies store information on your preferences, including if <strong>you prefer AM/PM or 24 hour
clock</strong>, if <strong>you have closed the cookie popup before</strong>, and <strong>what
order you have the servers in on the dashboard</strong>.
</p>
</div>
</section>
<section class="section">
<div class="container">
<h2 class="title">Session storage</h2>
<p class="is-size-5 pl-6">
Session data are data that is stored just for the active browser session. Session storage is read and
written by our server and cannot be modified on your computer.
<br>
Session data stores an <strong>access token provided by Discord</strong>, used to retrieve information
about your account. Also stored is an <strong>internal ID for use with our API</strong>.
</p>
</div>
</section>
<section class="section">
<div class="container">
<h2 class="title">How can we trust you?</h2>
<p class="is-size-5 pl-6">
Feel free to audit this website. Go to our <a href="https://github.com/reminder-bot">GitHub</a> to get started, or just press <kbd>F12</kbd>
</p>
</div>
</section>
{% endblock %}

View File

@ -0,0 +1,389 @@
<!DOCTYPE html>
<html lang="EN">
<head>
<script src="/static/js/reporter.js" type="application/javascript"></script>
<meta name="description" content="The most powerful Discord Reminders Bot">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="UTF-8">
<meta name="yandex-verification" content="bb77b8681eb64a90"/>
<meta name="google-site-verification" content="7h7UVTeEe0AOzHiH3cFtsqMULYGN-zCZdMT_YCkW1Ho"/>
<!-- <meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src *; font-src fonts.gstatic.com 'self'"> -->
<!-- favicon -->
<link rel="apple-touch-icon" sizes="180x180"
href="/static/favicon/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32"
href="/static/favicon/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16"
href="/static/favicon/favicon-16x16.png">
<link rel="manifest" href="/static/favicon/site.webmanifest">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff">
<title>Reminder Bot | Dashboard</title>
<!-- styles -->
<link rel="stylesheet" href="/static/css/bulma.min.css">
<link rel="stylesheet" href="/static/css/fa.css">
<link rel="stylesheet" href="/static/css/font.css">
<link rel="stylesheet" href="/static/css/style.css?v{{ version }}">
<link rel="stylesheet" href="/static/css/dtsel.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tributejs/5.1.3/tribute.css" integrity="sha512-GnwBnXd+ZGO9CdP343MUr0jCcJXCr++JVtQRnllexRW2IDq4Zvrh/McTQjooAKnSUbXZ7wamp7AQSweTnfMVoA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<script src="/static/js/luxon.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tributejs/5.1.3/tribute.min.js" integrity="sha512-KJYWC7RKz/Abtsu1QXd7VJ1IJua7P7GTpl3IKUqfa21Otg2opvRYmkui/CXBC6qeDYCNlQZ7c+7JfDXnKdILUA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
</head>
<body>
<nav class="navbar is-spaced is-size-4 is-hidden-desktop dashboard-navbar" role="navigation"
aria-label="main navigation">
<div class="navbar-brand">
<a class="navbar-item" href="/">
<figure class="image">
<img width="28px" height="28px" src="/static/img/logo_nobg.webp" alt="Reminder Bot Logo">
</figure>
</a>
<p class="navbar-item pageTitle">
</p>
<a role="button" class="dashboard-burger navbar-burger is-right" aria-label="menu" aria-expanded="false"
data-target="mobileSidebar">
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
</a>
</div>
</nav>
<div id="loader" class="is-hidden hero is-fullheight">
<div class="hero-body">
<div class="container has-text-centered">
<p class="title">
<i class="fas fa-cog fa-spin"></i>
</p>
<p class="subtitle">
<strong>Loading...</strong>
</p>
</div>
</div>
</div>
<!-- dead image used to check which other images are dead -->
<img src="" id="dead">
<div class="notification is-danger flash-message" id="errors">
<span class="icon"><i class="far fa-exclamation-circle"></i></span> <span class="error-message"></span>
</div>
<div class="notification is-success flash-message" id="success">
<span class="icon"><i class="far fa-check"></i></span> <span class="success-message"></span>
</div>
<div class="modal" id="addImageModal">
<div class="modal-background"></div>
<div class="modal-card">
<header class="modal-card-head">
<label class="modal-card-title" for="urlInput">Enter Image URL</label>
<button class="delete close-modal" aria-label="close"></button>
</header>
<section class="modal-card-body">
<input class="input" id="urlInput" placeholder="Image URL...">
</section>
<footer class="modal-card-foot">
<button class="button is-success" id="setImgUrl">Save</button>
<button class="button close-modal">Cancel</button>
</footer>
</div>
<button class="modal-close is-large close-modal" aria-label="close"></button>
</div>
<div class="modal" id="pickColorModal">
<div class="modal-background"></div>
<div class="modal-card">
<header class="modal-card-head">
<label class="modal-card-title" for="colorInput">Select Color</label>
<button class="delete close-modal" aria-label="close"></button>
</header>
<section class="modal-card-body">
<div class="colorpicker-container">
<div id="colorpicker"></div>
</div>
<input class="input" id="colorInput">
</section>
<footer class="modal-card-foot">
<button class="button is-success">Save</button>
<button class="button close-modal">Cancel</button>
</footer>
</div>
<button class="modal-close is-large close-modal" aria-label="close"></button>
</div>
<div class="modal" id="chooseTimezoneModal">
<div class="modal-background"></div>
<div class="modal-card">
<header class="modal-card-head">
<label class="modal-card-title" for="urlInput">Update Timezone <a href="/help/timezone"><span><i class="fa fa-question-circle"></i></span></a></label>
<button class="delete close-modal" aria-label="close"></button>
</header>
<section class="modal-card-body">
<p>
Your configured timezone is: <strong><span class="set-timezone">%browsertimezone%</span></strong> (<span class="set-time">HH:mm</span>)
<br>
<br>
Your browser timezone is: <strong><span class="browser-timezone">%browsertimezone%</span></strong> (<span class="browser-time">HH:mm</span>)
<br>
Your bot timezone is: <strong><span class="bot-timezone">%bottimezone%</span></strong> (<span class="bot-time">HH:mm</span>)
</p>
<br>
<div class="has-text-centered">
<button class="button is-success close-modal" id="set-browser-timezone">Use Browser Timezone</button>
<button class="button is-link close-modal" id="set-bot-timezone">Use Bot Timezone</button>
<button class="button is-warning close-modal" id="update-bot-timezone">Set Bot Timezone</button>
</div>
</section>
</div>
<button class="modal-close is-large close-modal" aria-label="close"></button>
</div>
<div class="modal" id="chooseTemplateModal">
<div class="modal-background"></div>
<div class="modal-card">
<header class="modal-card-head">
<label class="modal-card-title" for="urlInput">Load Template</label>
<button class="delete close-modal" aria-label="close"></button>
</header>
<section class="modal-card-body">
<div class="control has-icons-left">
<div class="select is-fullwidth">
<select id="templateSelect">
</select>
</div>
<div class="icon is-small is-left">
<i class="fas fa-file-spreadsheet"></i>
</div>
</div>
<br>
<div class="has-text-centered">
<button class="button is-success close-modal" id="load-template">Load Template</button>
<button class="button is-danger" id="delete-template">Delete</button>
</div>
</section>
</div>
<button class="modal-close is-large close-modal" aria-label="close"></button>
</div>
<div class="modal" id="dataManagerModal">
<div class="modal-background"></div>
<div class="modal-card">
<header class="modal-card-head">
<label class="modal-card-title" for="urlInput">Import/Export Manager <a href="/help/iemanager"><span><i class="fa fa-question-circle"></i></span></a></label>
<button class="delete close-modal" aria-label="close"></button>
</header>
<section class="modal-card-body">
<div class="control">
<div class="field">
<label>
<input type="radio" class="default-width" name="exportSelect" value="reminders" checked>
Reminders
</label>
</div>
</div>
<br>
<div class="has-text-centered">
<div style="color: red">
Please first read the <a href="/help/iemanager">support page</a>
</div>
<button class="button is-success is-outlined" id="import-data">Import Data</button>
<button class="button is-success" id="export-data">Export Data</button>
</div>
<a id="downloader" download="export.csv" class="is-hidden"></a>
<input id="uploader" type="file" hidden></input>
</section>
</div>
<button class="modal-close is-large close-modal" aria-label="close"></button>
</div>
<div class="modal" id="deleteReminderModal">
<div class="modal-background"></div>
<div class="modal-card">
<header class="modal-card-head">
<label class="modal-card-title">Delete Reminder</label>
<button class="delete close-modal" aria-label="close"></button>
</header>
<section class="modal-card-body">
<p>
This reminder will be permanently deleted. Are you sure?
</p>
<br>
<div class="has-text-centered">
<button class="button is-danger" id="delete-reminder-confirm">Delete</button>
<button class="button is-light close-modal">Cancel</button>
</div>
</section>
</div>
<button class="modal-close is-large close-modal" aria-label="close"></button>
</div>
<div class="columns is-gapless dashboard-frame">
<div class="column is-2 is-sidebar-menu dashboard-sidebar is-hidden-touch">
<a href="/">
<div class="brand">
<img src="/static/img/logo_nobg.webp" alt="Reminder bot logo"
width="52px" height="52px"
class="dashboard-brand">
</div>
</a>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1440 160">
<g transform="scale(1, 0.5)">
<path fill="#8fb677" fill-opacity="1"
d="M0,192L60,170.7C120,149,240,107,360,96C480,85,600,107,720,138.7C840,171,960,213,1080,197.3C1200,181,1320,107,1380,69.3L1440,32L1440,0L1380,0C1320,0,1200,0,1080,0C960,0,840,0,720,0C600,0,480,0,360,0C240,0,120,0,60,0L0,0Z"></path>
</g>
</svg>
<aside class="menu">
<p class="menu-label">
Servers
</p>
<ul class="menu-list guildList">
</ul>
<div class="aside-footer">
<p class="menu-label">
Options
</p>
<ul class="menu-list">
<li>
<a class="show-modal" data-modal="dataManagerModal">
<span class="icon"><i class="fas fa-exchange"></i></span> Import/Export
</a>
<a class="show-modal" data-modal="chooseTimezoneModal">
<span class="icon"><i class="fas fa-map-marked"></i></span> Timezone
</a>
<a href="/login/discord/logout">
<span class="icon"><i class="fas fa-sign-out"></i></span> Log out
</a>
<a href="https://discord.jellywx.com" class="feedback">
<span class="icon"><i class="fab fa-discord"></i></span> Give feedback
</a>
</li>
</ul>
</div>
</aside>
</div>
<div class="dashboard-sidebar mobile-sidebar is-hidden-desktop" id="mobileSidebar">
<a href="/">
<div class="brand">
<img src="/static/img/logo_nobg.webp" alt="Reminder bot logo"
class="dashboard-brand">
</div>
</a>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1440 160">
<g transform="scale(1, 0.5)">
<path fill="#8fb677" fill-opacity="1"
d="M0,192L60,170.7C120,149,240,107,360,96C480,85,600,107,720,138.7C840,171,960,213,1080,197.3C1200,181,1320,107,1380,69.3L1440,32L1440,0L1380,0C1320,0,1200,0,1080,0C960,0,840,0,720,0C600,0,480,0,360,0C240,0,120,0,60,0L0,0Z"></path>
</g>
</svg>
<aside class="menu">
<p class="menu-label">
Servers
</p>
<ul class="menu-list guildList">
</ul>
<div class="aside-footer">
<p class="menu-label">
Settings
</p>
<ul class="menu-list">
<li>
<a class="show-modal" data-modal="dataManagerModal">
<span class="icon"><i class="fas fa-exchange"></i></span> Import/Export
</a>
<a class="show-modal" data-modal="chooseTimezoneModal">
<span class="icon"><i class="fas fa-map-marked"></i></span> Timezone
</a>
<a href="/login/discord/logout">
<span class="icon"><i class="fas fa-sign-out"></i></span> Log out
</a>
<a href="https://discord.jellywx.com/" class="feedback">
<span class="icon"><i class="fab fa-discord"></i></span> Give feedback
</a>
</li>
</ul>
</div>
</aside>
</div>
<!-- main content -->
<div class="column is-main-content">
<p class="title pageTitle"></p>
<section id="welcome">
<div class="has-text-centered">
<p class="title">Welcome!</p>
<p class="subtitle is-hidden-touch">Select an option from the side to get started</p>
<p class="subtitle is-hidden-desktop">Press the <span class="icon"><i class="fal fa-bars"></i></span> to get started</p>
</div>
</section>
<section id="reminders" class="is-hidden">
{% include "reminder_dashboard/reminder_dashboard" %}
</section>
<section id="reminder-errors" class="is-hidden">
{% include "reminder_dashboard/reminder_errors" %}
</section>
<section id="guild-error" class="is-hidden">
{% include "reminder_dashboard/guild_error" %}
</section>
<section id="user-error" class="is-hidden">
{% include "reminder_dashboard/user_error" %}
</section>
</div>
<!-- /main content -->
</div>
<template id="embedFieldTemplate">
<div data-inlined="1" class="embed-field-box">
<div class="is-flex">
<label>
<span class="is-sr-only">Field Title</span>
<textarea class="discord-field-title field-input message-input autoresize"
placeholder="Field Title..." rows="1"
maxlength="256" name="embed_field_title[]"></textarea>
</label>
<button class="button is-small inline-btn">
<span class="is-sr-only">Toggle field inline</span><i class="fas fa-arrows-h"></i>
</button>
</div>
<label>
<span class="is-sr-only">Field Value</span>
<textarea
class="discord-field-value field-input message-input autoresize"
placeholder="Field Value..."
maxlength="1024" name="embed_field_value[]"
rows="1"></textarea>
</label>
</div>
</template>
<template id="guildListEntry">
<li>
<a class="switch-pane" data-pane="guild">
<span class="icon"><i class="fas fa-map-pin"></i></span> <span class="guild-name">%guildname%</span>
</a>
</li>
</template>
<template id="guildReminder">
{% include "reminder_dashboard/guild_reminder" %}
</template>
<script src="/static/js/iro.js"></script>
<script src="/static/js/dtsel.js"></script>
<script src="/static/js/interval.js?v{{ version }}"></script>
<script src="/static/js/timezone.js?v{{ version }}" defer></script>
<script src="/static/js/main.js?v{{ version }}" defer></script>
</body>
</html>

View File

@ -0,0 +1,10 @@
{% extends "base" %}
{% block init %}
{% set title = "401 Not Authorized" %}
{% set show_login = True %}
{% set page_title = "Not Authorized" %}
{% set page_subtitle = "You must be logged in to access this page, if it exists." %}
{% endblock %}

View File

@ -0,0 +1,10 @@
{% extends "base" %}
{% block init %}
{% set title = "403 Forbidden" %}
{% set show_contact = True %}
{% set page_title = "Forbidden" %}
{% set page_subtitle = "You currently cannot access this page, if it exists." %}
{% endblock %}

View File

@ -0,0 +1,10 @@
{% extends "base" %}
{% block init %}
{% set title = "404 File Not Found" %}
{% set show_contact = True %}
{% set page_title = "File Not Found" %}
{% set page_subtitle = "This page does not exist." %}
{% endblock %}

View File

@ -0,0 +1,9 @@
{% extends "base" %}
{% block init %}
{% set title = "500 Internal Server Error" %}
{% set show_contact = True %}
{% set page_title = "An Error Has Occurred" %}
{% set page_subtitle = "A server error has occurred. Please retry, or ask in our Discord." %}
{% endblock %}

161
templates/help.html.tera Normal file
View File

@ -0,0 +1,161 @@
{% extends "base" %}
{% block init %}
{% set title = "Support" %}
{% set page_title = "Support Articles" %}
{% set page_subtitle = "Can't find what you're looking for? Join our Discord!" %}
{% set show_contact = true %}
{% endblock %}
{% block content %}
<div class="inset-content" >
<div class="tile is-ancestor">
<div class="tile is-parent">
<article class="tile is-child notification">
<p class="title">Timezone</p>
<p class="subtitle">Learn how to configure your timezone</p>
<div class="content has-text-centered">
<a class="button is-size-4 is-rounded is-light" href="/help/timezone">
<p class="is-size-4">
Read <span class="icon"><i class="fas fa-chevron-right"></i></span>
</p>
</a>
</div>
</article>
</div>
<div class="tile is-parent">
<article class="tile is-child notification">
<p class="title">Create reminders</p>
<p class="subtitle">Learn to create reminders for your server</p>
<div class="content has-text-centered">
<a class="button is-size-4 is-rounded is-light" href="/help/create_reminder">
<p class="is-size-4">
Read <span class="icon"><i class="fas fa-chevron-right"></i></span>
</p>
</a>
</div>
</article>
</div>
<div class="tile is-parent is-vertical">
<article class="tile is-child notification">
<p class="title">Delete reminders</p>
<p class="subtitle">Learn to delete reminders that you've created</p>
<div class="content has-text-centered">
<a class="button is-size-4 is-rounded is-light" href="/help/delete_reminder">
<p class="is-size-4">
Read <span class="icon"><i class="fas fa-chevron-right"></i></span>
</p>
</a>
</div>
</article>
</div>
</div>
<!-- <div class="tile is-ancestor">-->
<!-- <div class="tile is-parent">-->
<!-- <article class="tile is-child notification">-->
<!-- <p class="title">Timers</p>-->
<!-- <p class="subtitle">Learn to manage timers</p>-->
<!-- <div class="content has-text-centered">-->
<!-- <a class="button is-size-4 is-rounded is-light" href="/help/timers">-->
<!-- <p class="is-size-4">-->
<!-- Read <span class="icon"><i class="fas fa-chevron-right"></i></span>-->
<!-- </p>-->
<!-- </a>-->
<!-- </div>-->
<!-- </article>-->
<!-- </div>-->
<!-- <div class="tile is-parent">-->
<!-- <article class="tile is-child notification">-->
<!-- <p class="title">Todo Lists</p>-->
<!-- <p class="subtitle">Learn to manage various todo lists</p>-->
<!-- <div class="content has-text-centered">-->
<!-- <a class="button is-size-4 is-rounded is-light" href="/help/todo_lists">-->
<!-- <p class="is-size-4">-->
<!-- Read <span class="icon"><i class="fas fa-chevron-right"></i></span>-->
<!-- </p>-->
<!-- </a>-->
<!-- </div>-->
<!-- </article>-->
<!-- </div>-->
<!-- <div class="tile is-parent is-vertical">-->
<!-- <article class="tile is-child notification">-->
<!-- <p class="title">Macros</p>-->
<!-- <p class="subtitle">Learn how to create combination commands called macros, to suit advanced use cases</p>-->
<!-- <div class="content has-text-centered">-->
<!-- <a class="button is-size-4 is-rounded is-light" href="/help/macros">-->
<!-- <p class="is-size-4">-->
<!-- Read <span class="icon"><i class="fas fa-chevron-right"></i></span>-->
<!-- </p>-->
<!-- </a>-->
<!-- </div>-->
<!-- </article>-->
<!-- </div>-->
<!-- </div>-->
<div class="tile is-ancestor">
<div class="tile is-parent">
<article class="tile is-child notification">
<p class="title">Intervals</p>
<p class="subtitle">Learn about repeating reminders</p>
<div class="content has-text-centered">
<a class="button is-size-4 is-rounded is-light" href="/help/intervals">
<p class="is-size-4">
Read <span class="icon"><i class="fas fa-chevron-right"></i></span>
</p>
</a>
</div>
</article>
</div>
<div class="tile is-parent is-vertical">
{#
<article class="tile is-child notification">
<p class="title">Import/export</p>
<p class="subtitle">Learn how to import and export data from the dashboard</p>
<div class="content has-text-centered">
<a class="button is-size-4 is-rounded is-light" href="/help/iemanager">
<p class="is-size-4">
Read <span class="icon"><i class="fas fa-chevron-right"></i></span>
</p>
</a>
</div>
</article>
#}
</div>
<div class="tile is-parent">
{#
<article class="tile is-child notification">
<p class="title">Dashboard</p>
<p class="subtitle">Learn to use the interactive web dashboard</p>
<div class="content has-text-centered">
<a class="button is-size-4 is-rounded is-light" href="/help/dashboard">
<p class="is-size-4">
Read <span class="icon"><i class="fas fa-chevron-right"></i></span>
</p>
</a>
</div>
</article>
#}
</div>
</div>
</div>
<section class="hero is-small">
<div class="hero-body">
<div class="container has-text-centered">
<p class="title">Need more help?</p>
<p class="content">
Please come and ask us!
</p>
</div>
</div>
<div class="hero-foot has-text-centered">
<a class="button is-size-6 is-rounded is-primary" href="https://discord.jellywx.com">
<p class="is-size-6">
<span>Join Discord</span> <span class="icon"><i class="fas fa-chevron-right"></i></span>
</p>
</a>
</div>
</section>
{% endblock %}

95
templates/index.html.tera Normal file
View File

@ -0,0 +1,95 @@
{% extends "base" %}
{% block init %}
{% set title = "Home" %}
{% set page_title = "Reminder Bot" %}
{% set page_subtitle = "Powerful Discord Reminders" %}
{% set page_emoji = "fa-hourglass-half" %}
{% set show_invite = true %}
{% endblock %}
{% block content %}
<div class="inset-content" >
<div class="tile is-ancestor">
<div class="tile is-parent">
<article class="tile is-child notification">
<p class="title">Slash-command Ready <svg aria-hidden="false" width="28" height="28" viewBox="0 0 24 24"><path fill="#777" fill-rule="evenodd" clip-rule="evenodd" d="M5 3C3.89543 3 3 3.89543 3 5V19C3 20.1046 3.89543 21 5 21H19C20.1046 21 21 20.1046 21 19V5C21 3.89543 20.1046 3 19 3H5ZM16.8995 8.41419L15.4853 6.99998L7 15.4853L8.41421 16.8995L16.8995 8.41419Z"></path></svg></p>
<p class="subtitle">Set reminders easily and quickly from anywhere.</p>
<figure class="image">
<img class="rounded-corners" src="/static/img/slash-commands.png" alt="Discord slash commands demonstration">
</figure>
</article>
</div>
<div class="tile is-parent">
<article class="tile is-child notification">
<p class="title">Advanced Options <span class="icon"><i class="fad fa-palette"></i></span></p>
<p class="subtitle">Decorate your announcements with our web dashboard.</p>
<figure class="image">
<img class="rounded-corners" src="/static/img/tournament-demo.png" alt="Advanced options demonstration">
</figure>
</article>
</div>
<div class="tile is-parent is-vertical">
<article class="tile is-child notification">
<p class="title">Unlimited Reminders <span class="icon"><i class="far fa-infinity"></i></span></p>
<p class="subtitle">Never forget a thing.</p>
</article>
<article class="tile is-child notification">
<p class="title">Repeating Reminders <span class="icon"><i class="fas fa-repeat"></i></span></p>
<p class="subtitle">Available to <a href="https://patreon.com/jellywx"><span class="patreon-color">Patreon <span class="icon"><i class="fab fa-patreon"></i></span></span></a> subscribers at <strong>$2/month</strong>.</p>
</article>
</div>
</div>
</div>
<section class="hero is-medium">
<div class="hero-body">
<div class="columns">
<div class="column">
<div class="container has-text-centered">
<p class="title">Technically-minded?</p>
<p class="content">
Install the bot on your own computer
</p>
<a class="button is-size-6 is-rounded is-link" href="https://gitea.jellypro.xyz/jude/reminder-bot">
<p class="is-size-6">
<span>Install</span> <span class="icon"><i class="fas fa-chevron-right"></i></span>
</p>
</a>
</div>
</div>
<div class="column">
<div class="container has-text-centered">
<p class="title">Ready to go?</p>
<p class="content">
Add the bot to get started
</p>
<a class="button is-size-6 is-rounded is-success" href="https://invite.reminder-bot.com">
<p class="is-size-6">
<span>Add Now</span> <span class="icon"><i class="fas fa-chevron-right"></i></span>
</p>
</a>
</div>
</div>
<div class="column">
<div class="container has-text-centered">
<p class="title">Need support?</p>
<p class="content">
Check out our guides, or join our Discord
</p>
<a class="button is-size-6 is-rounded is-primary" href="/help">
<p class="is-size-6">
<span>Guides</span> <span class="icon"><i class="fas fa-chevron-right"></i></span>
</p>
</a>
</div>
</div>
</div>
</div>
</section>
{% endblock %}

View File

@ -0,0 +1,78 @@
{% extends "base" %}
{% block init %}
{% set title = "Privacy Policy" %}
{% set page_title = "Privacy Policy" %}
{% set page_subtitle = "" %}
{% set page_emoji = "" %}
{% endblock %}
{% block content %}
<section class="section">
<div class="container">
<h2 class="title">Who we are</h2>
<p>
Reminder Bot is operated solely by Jude Southworth. You can contact me by email at
<a href="mailto:jude@jellywx.com">jude@jellywx.com</a>, or via private/public message on Discord at
<a href="https://discord.jellywx.com">https://discord.jellywx.com</a>.
</p>
</div>
</section>
<section class="section">
<div class="container">
<h2 class="title">What data we collect</h2>
<p>
Reminder Bot stores limited data necessary for the function of the bot. This data
is your <strong>unique user ID</strong>, <strong>timezone</strong>, and <strong>direct message channel</strong>.
<br>
<br>
Timezones are provided by the user or the user's browser.
<br><br>
Some additional information is collected by the dashboard for the purpose of debugging. This is your
<strong>time spent on the website</strong>, <strong>current URL</strong>, <strong>unique user ID</strong>,
<strong>unique session token</strong>, <strong>contents of any client errors</strong>.
</p>
</div>
</section>
<section class="section">
<div class="container">
<h2 class="title">Why we collect this data</h2>
<p>
Unique user IDs are stored to <strong>keep track of who sets reminders</strong>. User timezones are
stored to allow users to set reminders in their local timezone. Direct message channels are stored to
allow the setting of reminders for your direct message channel.
<br>
Information collected by the dashboard is for resolving bugs.
</p>
</div>
</section>
<section class="section">
<div class="container">
<h2 class="title">Who your data is shared with</h2>
<p>
Your data is also guarded by the privacy policies of <strong>MEGA</strong>, our backup provider, and
<strong>Hetzner</strong>, our hosting provider.
</p>
</div>
</section>
<section class="section">
<div class="container">
<h2 class="title">Accessing or removing your data</h2>
<p>
Your timezone can be removed with the command <strong>/timezone UTC</strong>. Other data can be removed
on request. Please contact me.
<br>
<br>
Reminders created in a guild/channel will be removed automatically when the bot is removed from the
guild, the guild is deleted, or channel is deleted. Data is otherwise not removed automatically.
</p>
</div>
</section>
{% endblock %}

View File

@ -0,0 +1,17 @@
<div class="hero is-fullheight">
<div class="hero-body">
<div class="container has-text-centered">
<p class="title">
We couldn't get this server's data
</p>
<p class="subtitle">
Please check Reminder Bot is in the server, and has correct permissions.
</p>
<a class="button is-size-4 is-rounded is-success" href="https://invite.reminder-bot.com">
<p class="is-size-4">
<span>Add to Server</span> <span class="icon"><i class="fas fa-chevron-right"></i></span>
</p>
</a>
</div>
</div>
</div>

View File

@ -0,0 +1,269 @@
<div class="reminderContent {% if creating %}creator{% endif %}">
<div class="columns is-mobile column reminder-topbar">
{% if not creating %}
<div class="invert-collapses channel-bar">
#channel
</div>
{% endif %}
<div class="name-bar">
<div class="field">
<div class="control">
<label class="label sr-only">Reminder Name</label>
<input class="input" type="text" name="name" placeholder="Reminder Name" maxlength="100">
</div>
</div>
</div>
<div class="hide-button-bar">
<button class="button hide-box">
<span class="is-sr-only">Hide reminder</span><i class="fas fa-chevron-down"></i>
</button>
</div>
</div>
<div class="columns reminder-settings">
<div class="column discord-frame">
<article class="media">
<figure class="media-left">
<p class="image is-32x32 customizable">
<a>
<img class="is-rounded avatar" src="/static/img/bg.webp" alt="Image for discord avatar">
</a>
</p>
</figure>
<div class="media-content">
<div class="content">
<div class="discord-message-header">
<label class="is-sr-only">Username Override</label>
<input class="discord-username message-input" placeholder="Username Override"
maxlength="32" name="username">
</div>
<label class="is-sr-only">Message</label>
<textarea class="message-input autoresize discord-content"
placeholder="Message Content..."
maxlength="2000" name="content" rows="1"></textarea>
<div class="discord-embed">
<div class="embed-body">
<button class="change-color button is-rounded is-small">
<span class="is-sr-only">Choose embed color</span><i class="fas fa-eye-dropper"></i>
</button>
<div class="a">
<div class="embed-author-box">
<div class="a">
<p class="image is-24x24 customizable">
<a>
<img class="is-rounded embed_author_url" src="/static/img/bg.webp" alt="Image for embed author">
</a>
</p>
</div>
<div class="b">
<label class="is-sr-only" for="embedAuthor">Embed Author</label>
<textarea
class="discord-embed-author message-input autoresize"
placeholder="Embed Author..." rows="1" maxlength="256"
name="embed_author"></textarea>
</div>
</div>
<label class="is-sr-only" for="embedTitle">Embed Title</label>
<textarea class="discord-title message-input autoresize"
placeholder="Embed Title..."
maxlength="256" rows="1"
name="embed_title"></textarea>
<br>
<label class="is-sr-only" for="embedDescription">Embed Description</label>
<textarea class="discord-description message-input autoresize "
placeholder="Embed Description..."
maxlength="4096" name="embed_description"
rows="1"></textarea>
<br>
<div class="embed-multifield-box">
<div data-inlined="1" class="embed-field-box">
<label class="is-sr-only" for="embedFieldTitle">Field Title</label>
<div class="is-flex">
<textarea class="discord-field-title field-input message-input autoresize"
placeholder="Field Title..." rows="1"
maxlength="256" name="embed_field_title[]"></textarea>
<button class="button is-small inline-btn">
<span class="is-sr-only">Toggle field inline</span><i class="fas fa-arrows-h"></i>
</button>
</div>
<label class="is-sr-only" for="embedFieldValue">Field Value</label>
<textarea
class="discord-field-value field-input message-input autoresize "
placeholder="Field Value..."
maxlength="1024" name="embed_field_value[]"
rows="1"></textarea>
</div>
</div>
</div>
<div class="b">
<p class="image thumbnail customizable">
<a>
<img class="embed_thumbnail_url" src="/static/img/bg.webp" alt="Square thumbnail embedded image">
</a>
</p>
</div>
</div>
<p class="image is-400x300 customizable">
<a>
<img class="embed_image_url" src="/static/img/bg.webp" alt="Large embedded image">
</a>
</p>
<div class="embed-footer-box">
<p class="image is-20x20 customizable">
<a>
<img class="is-rounded embed_footer_url" src="/static/img/bg.webp" alt="Footer profile-like image">
</a>
</p>
<label class="is-sr-only" for="embedFooter">Embed Footer text</label>
<textarea class="discord-embed-footer message-input autoresize "
placeholder="Embed Footer..."
maxlength="2048" name="embed_footer" rows="1"></textarea>
</div>
</div>
</div>
</div>
</article>
</div>
<div class="column settings">
<div class="field channel-field">
<div class="collapses">
<label class="label" for="channelOption">Channel*</label>
</div>
<div class="control has-icons-left">
<div class="select">
<select name="channel" class="channel-selector">
</select>
</div>
<div class="icon is-small is-left">
<i class="fas fa-hashtag"></i>
</div>
</div>
</div>
<div class="field">
<div class="control">
<label class="label collapses">
Time*
<input class="input prefill-now" type="datetime-local" step="1" name="time">
</label>
</div>
</div>
<div class="collapses split-controls">
<div>
<div class="patreon-only">
<div class="patreon-invert foreground">
Intervals available on <a href="https://patreon.com/jellywx">Patreon</a> or <a href="https://gitea.jellypro.xyz/jude/reminder-bot">self-hosting</a>
</div>
<div class="field">
<label class="label">Interval <a class="foreground" href="/help/intervals"><i class="fas fa-question-circle"></i></a></label>
<div class="control intervalSelector">
<div class="input interval-group">
<div class="interval-group-left">
<span class="no-break">
<label>
<span class="is-sr-only">Interval months</span>
<input class="w2" type="text" pattern="\d*" name="interval_months" maxlength="2" placeholder=""> <span class="half-rem"></span> months, <span class="half-rem"></span>
</label>
<label>
<span class="is-sr-only">Interval days</span>
<input class="w3" type="text" pattern="\d*" name="interval_days" maxlength="4" placeholder=""> <span class="half-rem"></span> days, <span class="half-rem"></span>
</label>
</span>
<span class="no-break">
<label>
<span class="is-sr-only">Interval hours</span>
<input class="w2" type="text" pattern="\d*" name="interval_hours" maxlength="2" placeholder="HH">:
</label>
<label>
<span class="is-sr-only">Interval minutes</span>
<input class="w2" type="text" pattern="\d*" name="interval_minutes" maxlength="2" placeholder="MM">:
</label>
<label>
<span class="is-sr-only">Interval seconds</span>
<input class="w2" type="text" pattern="\d*" name="interval_seconds" maxlength="2" placeholder="SS">
</label>
</span>
</div>
<button class="clear"><span class="is-sr-only">Clear interval</span><span class="icon"><i class="fas fa-trash"></i></span></button>
</div>
</div>
</div>
<div class="field">
<div class="control">
<label class="label">
Expiration
<input class="input" type="datetime-local" step="1" name="expiration">
</label>
</div>
</div>
</div>
<div class="columns is-mobile tts-row">
<div class="column has-text-centered">
<div class="is-boxed">
<label class="label">Enable TTS <input type="checkbox" name="tts"></label>
</div>
</div>
<div class="column has-text-centered">
<div class="file is-small is-boxed">
<label class="file-label">
<input class="file-input" type="file" name="attachment">
<span class="file-cta">
<span class="file-label">
Add Attachment
</span>
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
</span>
</label>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% if creating %}
<div class="button-row">
<div class="button-row-reminder">
<button class="button is-success" id="createReminder">
<span>Create Reminder</span> <span class="icon"><i class="fas fa-sparkles"></i></span>
</button>
</div>
<div class="button-row-template">
<div>
<button class="button is-success is-outlined" id="createTemplate">
<span>Create Template</span> <span class="icon"><i class="fas fa-file-spreadsheet"></i></span>
</button>
</div>
<div>
<button class="button is-outlined show-modal is-pulled-right" data-modal="chooseTemplateModal">
Load Template
</button>
</div>
</div>
</div>
{% else %}
<div class="button-row-edit">
<button class="button is-success save-btn">
<span>Save</span> <span class="icon"><i class="fas fa-save"></i></span>
</button>
<button class="button is-warning disable-enable">
</button>
<button class="button is-danger delete-reminder">
Delete
</button>
</div>
{% endif %}
</div>

View File

@ -0,0 +1,52 @@
<div class="create-reminder">
<strong>Create Reminder</strong>
<div id="reminderCreator">
{% set creating = true %}
{% include "reminder_dashboard/guild_reminder" %}
{% set creating = false %}
</div>
<br>
<div class="field">
<div class="columns is-mobile">
<div class="column">
<strong>Reminders</strong>
</div>
<div class="column is-narrow">
<div class="control has-icons-left">
<div class="select is-small">
<select id="orderBy">
<option value="time" selected>Time</option>
<option value="name">Name</option>
<option value="channel">Channel</option>
</select>
</div>
<div class="icon is-small is-left">
<i class="fas fa-sort-amount-down"></i>
</div>
</div>
</div>
<div class="column is-narrow">
<div class="control has-icons-left">
<div class="select is-small">
<select id="expandAll">
<option value="" selected></option>
<option value="expand">Expand All</option>
<option value="collapse">Collapse All</option>
</select>
</div>
<div class="icon is-small is-left">
<i class="fas fa-expand-arrows"></i>
</div>
</div>
</div>
</div>
</div>
<div id="guildReminders">
</div>
</div>
<script src="/static/js/sort.js"></script>
<script src="/static/js/expand.js"></script>

View File

@ -0,0 +1,5 @@
<div>
</div>
<!--<script src="/static/js/reminder_errors.js"></script>-->

View File

@ -0,0 +1,12 @@
<div class="hero is-fullheight">
<div class="hero-body">
<div class="container has-text-centered">
<p class="title">
You do not have permissions for this server
</p>
<p class="subtitle">
Ask an admin to grant you the "Manage Messages" permission.
</p>
</div>
</div>
</div>

View File

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Reminder Bot | Redirecting...</title>
</head>
<body>
<a href="/{{ to }}">Press here if you aren't redirected</a>
<script>
document.location = "/{{ to }}";
</script>
</body>
</html>

View File

@ -0,0 +1,40 @@
{% extends "base" %}
{% block init %}
{% set title = "Support" %}
{% set page_title = "Create Reminders" %}
{% set page_subtitle = "" %}
{% endblock %}
{% block content %}
<section class="hero is-small">
<div class="hero-body">
<div class="container">
<p class="title">Create reminders via commands</p>
<p class="content">
You can create reminders with the <code>/remind</code> command.
<br>
Fill out the "time" and "content" fields. If you wish, press on "Optional" to view other options
for the reminder.
</p>
</div>
</div>
</section>
<section class="hero is-small">
<div class="hero-body">
<div class="container">
<p class="title">Create reminders via the dashboard</p>
<p class="content">
Reminders can also be created on the dashboard. The dashboard offers more options for configuring
reminders, and offers templates for quick recreation of reminders.
<a href="/dashboard">Access the dashboard.</a>
</p>
</div>
</div>
</section>
{% endblock %}

View File

@ -0,0 +1,22 @@
{% extends "base" %}
{% block init %}
{% set title = "Support" %}
{% set page_title = "Dashboard" %}
{% set page_subtitle = "" %}
{% endblock %}
{% block content %}
<section class="hero is-small">
<div class="hero-body">
<div class="container">
<p class="title">Accessing the dashboard</p>
<p class="content">
</p>
</div>
</div>
</section>
{% endblock %}

View File

@ -0,0 +1,82 @@
{% extends "base" %}
{% block init %}
{% set title = "Support" %}
{% set page_title = "Deleting Reminders" %}
{% set page_subtitle = "" %}
{% set show_invite = false %}
{% endblock %}
{% block content %}
<section class="hero is-small">
<div class="hero-body">
<div class="container">
<p class="title">Deleting reminders via commands</p>
<p class="content">
Deleting reminders is as easy as typing <code>/del</code>.
<br>
</p>
<figure>
<img src="/static/img/support/delete_reminder/cmd-1.png" alt="/del">
</figure>
<figure>
<img src="/static/img/support/delete_reminder/cmd-2.png" alt="Reminder deleted">
</figure>
<p class="content">
Note that you cannot delete reminders that were set for another user's direct messages. To delete
reminders in your direct messages, use <code>/del</code> in the direct message channel with
Reminder Bot.
</p>
</div>
</div>
</section>
<section class="hero is-small">
<div class="hero-body">
<div class="container">
<p class="title">Deleting reminders you've just created</p>
<p class="content">
If you made a mistake, you can quickly delete a reminder you made by pressing "Cancel"
<br>
</p>
<figure>
<img src="/static/img/support/delete_reminder/cancel-1.png" alt="Cancel button">
</figure>
<figure>
<img src="/static/img/support/delete_reminder/cancel-2.png" alt="Reminder deleted">
</figure>
</div>
</div>
</section>
<section class="hero is-small">
<div class="hero-body">
<div class="container">
<p class="title">Deleting reminders via the dashboard</p>
<p class="content">
Reminders in servers can be deleted via the dashboard. First, select your server from the menu.
</p>
<figure>
<img src="/static/img/support/delete_reminder/1.png" alt="Selecting server">
</figure>
<br>
<p class="content">
Then, find the reminder you wish to delete.
</p>
<figure>
<img src="/static/img/support/delete_reminder/2.png" alt="Finding reminder">
</figure>
<br>
<p class="content">
Finally, press the 'Delete' button under the reminder.
</p>
<figure>
<img src="/static/img/support/delete_reminder/3.png" alt="Delete button">
</figure>
</div>
</div>
</section>
{% endblock %}

View File

@ -0,0 +1,87 @@
{% extends "base" %}
{% block init %}
{% set title = "Support" %}
{% set page_title = "Import/Export" %}
{% set page_subtitle = "" %}
{% endblock %}
{% block content %}
<section class="hero is-small">
<div class="hero-body">
<div class="container">
<p class="title">Export data</p>
<p class="content">
You can export data associated with your server from the dashboard. The data will export as a CSV
file. The CSV file can then be edited and imported to bulk edit server data.
</p>
</div>
</div>
</section>
<section class="hero is-small">
<div class="hero-body">
<div class="container">
<p class="title">Import data</p>
<p class="content">
You can import previous exports or modified exports. When importing a file, the new data will be added alongside existing data.
</p>
</div>
</div>
</section>
<section class="hero is-small">
<div class="hero-body">
<div class="container content">
<p class="title">Edit your data</p>
<p>
The CSV can be edited either as a text file or in a spreadsheet editor such as LibreOffice Calc. To
set up LibreOffice Calc for editing, do the following:
</p>
<ol>
<li>
Export data from dashboard.
<figure>
<img src="/static/img/support/iemanager/select_export.png" alt="Selecting export button">
</figure>
</li>
<li>
Open the file in LibreOffice. <strong>During the import dialogue, select "Format quoted field as text".</strong>
<figure>
<img src="/static/img/support/iemanager/format_text.png" alt="Selecting format button">
</figure>
</li>
<li>
Make edits to the spreadsheet. You can add, edit, and remove rows for reminders. Don't remove the top-most (title) row.
<figure>
<img src="/static/img/support/iemanager/edit_spreadsheet.png" alt="Editing spreadsheet">
</figure>
</li>
<li>
Save the edited CSV file and import it on the dashboard.
<figure>
<img src="/static/img/support/iemanager/import.png" alt="Import new reminders">
</figure>
</li>
</ol>
Other spreadsheet tools can also be used to edit exports, as long as they are properly configured:
<ul>
<li>
<strong>Google Sheets</strong>: Create a new blank spreadsheet. Select <strong>File > Import > Upload > export.csv</strong>.
Use the following import settings:
<figure>
<img src="/static/img/support/iemanager/sheets_settings.png" alt="Google sheets import settings">
</figure>
</li>
<li>
<strong>Excel (including Excel Online)</strong>: Avoid using Excel. Excel will not correctly import channels, or give
clear options to correct imports.
</li>
</ul>
</div>
</div>
</section>
{% endblock %}

View File

@ -0,0 +1,71 @@
{% extends "base" %}
{% block init %}
{% set title = "Support" %}
{% set page_title = "Intervals" %}
{% set page_subtitle = "Interval reminders, or repeating reminders, are available to our Patreon supporters" %}
{% endblock %}
{% block content %}
<section class="hero is-small">
<div class="hero-body">
<div class="container">
<p class="title">Fixed intervals</p>
<p class="content">
The main type of interval is the fixed interval. Fixed intervals are ideal for hourly, daily, or
reminders repeating at any other fixed amount of time.
<br>
You can create fixed interval reminders via the dashboard or via the <code>/remind</code> command.
When you have filled out the "time" and "content" on the command, press <kbd>tab</kbd>. Select the
"interval" option. Then, write the interval you wish to use: for example, "1 day" for daily (starting
at the time specified in "time").
</p>
</div>
</div>
</section>
<section class="hero is-small">
<div class="hero-body">
<div class="container">
<p class="title">Daylight savings</p>
<p class="content">
If you live in a region that uses daylight savings (DST), then your interval reminders may become
offset by an hour due to clock changes.
<br>
Reminder Bot offers a quick solution to this via the <code>/offset</code> command. This command
moves all existing reminders on a server by a certain amount of time. You can use offset to move
your reminders forward or backward by an hour when daylight savings happens.
</p>
</div>
</div>
</section>
<section class="hero is-small">
<div class="hero-body">
<div class="container">
<p class="title">Monthly/yearly intervals</p>
<p class="content">
Monthly or yearly intervals are configured the same as fixed intervals. Instead of a fixed time
interval, these reminders repeat on a certain day each month or each year. This makes them ideal
for marking calendar events.
</p>
</div>
</div>
</section>
<section class="hero is-small">
<div class="hero-body">
<div class="container">
<p class="title">Interval expiration</p>
<p class="content">
An expiration time can also be specified, both via commands and dashboard, for repeating reminders.
This is optional, and if omitted, the reminder will repeat indefinitely. Otherwise, the reminder
will be deleted once the expiration date is reached.
</p>
</div>
</div>
</section>
{% endblock %}

View File

@ -0,0 +1,23 @@
{% extends "base" %}
{% block init %}
{% set title = "Support" %}
{% set page_title = "Manage Macros" %}
{% set page_subtitle = "For advanced functionality" %}
{% set show_invite = false %}
{% endblock %}
{% block content %}
<section class="hero is-small">
<div class="hero-body">
<div class="container">
<p class="title">Create macros via commands</p>
<p class="content">
</p>
</div>
</div>
</section>
{% endblock %}

View File

@ -0,0 +1,23 @@
{% extends "base" %}
{% block init %}
{% set title = "Support" %}
{% set page_title = "Timers" %}
{% set page_subtitle = "" %}
{% set show_invite = false %}
{% endblock %}
{% block content %}
<section class="hero is-small">
<div class="hero-body">
<div class="container">
<p class="title">Create timers via commands</p>
<p class="content">
</p>
</div>
</div>
</section>
{% endblock %}

View File

@ -0,0 +1,47 @@
{% extends "base" %}
{% block init %}
{% set title = "Support" %}
{% set page_title = "Timezones" %}
{% set page_subtitle = "" %}
{% set show_invite = false %}
{% endblock %}
{% block content %}
<section class="hero is-small">
<div class="hero-body">
<div class="container">
<p class="title">Selecting your timezone manually</p>
<p class="content">
To select your timezone manually, use <code>/timezone</code>. This will set your timezone
across all servers with Reminder Bot.
<br>
You should only ever have to do this once. To avoid needing to change timezone due to daylight
savings, choose a DST-aware region, for example <strong>Europe/London</strong> instead of
<strong>GMT</strong>, or <strong>US/New_York</strong> instead of <strong>EST</strong>.
</p>
</div>
</div>
</section>
<section class="hero is-small">
<div class="hero-body">
<div class="container">
<p class="title">Selecting your timezone automatically</p>
<p class="content">
You can also configure Reminder Bot's timezone from your browser. To do
this, go to our dashboard, press 'Timezone' in the bottom left (desktop) or at the bottom of the
navigation menu (mobile). Then, choose 'Set Bot Timezone' to set Reminder Bot to use your browser's
timezone.
<br>
From here, you can also configure the dashboard to alternatively use the manually configured
timezone instead of the browser's timezone, if your browser is reporting your timezone incorrectly,
or if you have a special use-case.
</p>
</div>
</div>
</section>
{% endblock %}

View File

@ -0,0 +1,23 @@
{% extends "base" %}
{% block init %}
{% set title = "Support" %}
{% set page_title = "Todo lists" %}
{% set page_subtitle = "" %}
{% set show_invite = false %}
{% endblock %}
{% block content %}
<section class="hero is-small">
<div class="hero-body">
<div class="container">
<p class="title">Add to todo lists via commands</p>
<p class="content">
</p>
</div>
</div>
</section>
{% endblock %}

84
templates/terms.html.tera Normal file
View File

@ -0,0 +1,84 @@
{% extends "base" %}
{% block init %}
{% set title = "Terms of Service" %}
{% set page_title = "Terms of Service" %}
{% set page_subtitle = "" %}
{% set page_emoji = "" %}
{% endblock %}
{% block content %}
<section class="section">
<div class="container">
<h2 class="title">Outline</h2>
<p class="">
The Terms of Service apply whenever you use the hosted edition of <strong>Reminder Bot</strong> and the
<strong>JellyWX's Home</strong> Discord server.
<br>
<br>
Violating the Terms of Service may result in receiving a permanent ban from the Discord server,
permanent restriction on your usage of Reminder Bot, or removal of some or all of your content on
Reminder Bot or the Discord server. None of these will necessarily be preceded or succeeded by a warning
or notice.
<br>
<br>
The Terms of Service may be updated. Notice will be provided via the Discord server. You
should consider the Terms of Service to be a guide for appropriate behaviour.
</p>
</div>
</section>
<section class="section">
<div class="container">
<h2 class="title">Reminder Bot</h2>
<p>
The Terms of Service <strong>do not</strong> apply to self-hosting users who are using the source code
or pre-packaged Debian files to run their own instance of Reminder Bot.
</p>
<br>
<h3 class="subtitle">Your access to Reminder Bot may be restricted if you:</h3>
<ul class="pl-6" style="list-style: disc">
<li>Abuse exploits or bugs in Reminder Bot.</li>
<li>Use the bot to harass other Discord users.</li>
<li>Use the bot to transmit malware or other illegal content.</li>
<li>Use the bot to send more than 15 messages during a 60 second period.</li>
<li>
Attempt to circumvent restrictions imposed by the bot or website, including trying to access
data of other users, circumvent Patreon restrictions, or uploading files and creating reminders that
are too large for the bot to send or process.
</li>
</ul>
<br>
<p>
Some or all of these actions may be illegal in your country.
</p>
</div>
</section>
<section class="section">
<div class="container">
<h2 class="title">JellyWX's Home</h2>
<h3 class="subtitle">Your access to the JellyWX's Home Discord server may be restricted if you:</h3>
<ul class="pl-6" style="list-style: disc">
<li>Discuss politics, harass other users, or use language intended to upset other users.</li>
<li>Abuse any exploits.</li>
<li>Share personal information about yourself or any other user. This includes but is not
limited to real names<sup>1</sup>, addresses, phone numbers, country of origin<sup>2</sup>, religion, email address,
IP address.</li>
<li>Send malicious links or attachments.</li>
<li>Advertise without permission.</li>
<li>Send unwarranted direct messages.</li>
</ul>
<p class="small">
<sup>1</sup> Some users may use their real name on their account. In this case, do not assert that
this is a user's real name, or use it to try and identify a user.
<br>
<sup>2</sup> Country of current residence may be discussed, as this is relevant to timezone and
DST selection.
</p>
</div>
</section>
{% endblock %}