feat(notif): Add Pushbullet notification agent (#950)

This commit is contained in:
TheCatLady
2021-02-17 21:26:22 -05:00
committed by GitHub
parent c9a150b1db
commit 29b97ef6d8
15 changed files with 515 additions and 21 deletions

View File

@@ -4,11 +4,12 @@ Overseerr already supports a good number of notification agents, such as **Disco
## Currently Supported Notification Agents ## Currently Supported Notification Agents
- Email
- Discord - Discord
- Email
- Pushbullet
- Pushover
- Slack - Slack
- Telegram - Telegram
- Pushover
- [Webhooks](./webhooks.md) - [Webhooks](./webhooks.md)
## Setting Up Notifications ## Setting Up Notifications

View File

@@ -1124,6 +1124,20 @@ components:
type: string type: string
chatId: chatId:
type: string type: string
PushbulletSettings:
type: object
properties:
enabled:
type: boolean
example: false
types:
type: number
example: 2
options:
type: object
properties:
accessToken:
type: string
PushoverSettings: PushoverSettings:
type: object type: object
properties: properties:
@@ -1142,8 +1156,6 @@ components:
type: string type: string
priority: priority:
type: number type: number
sound:
type: string
NotificationSettings: NotificationSettings:
type: object type: object
properties: properties:
@@ -2356,6 +2368,52 @@ paths:
responses: responses:
'204': '204':
description: Test notification attempted description: Test notification attempted
/settings/notifications/pushbullet:
get:
summary: Get Pushbullet notification settings
description: Returns current Pushbullet notification settings in a JSON object.
tags:
- settings
responses:
'200':
description: Returned Pushbullet settings
content:
application/json:
schema:
$ref: '#/components/schemas/PushbulletSettings'
post:
summary: Update Pushbullet notification settings
description: Update Pushbullet notification settings with the provided values.
tags:
- settings
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PushbulletSettings'
responses:
'200':
description: 'Values were sucessfully updated'
content:
application/json:
schema:
$ref: '#/components/schemas/PushbulletSettings'
/settings/notifications/pushbullet/test:
post:
summary: Test Pushover settings
description: Sends a test notification to the Pushover agent.
tags:
- settings
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PushoverSettings'
responses:
'204':
description: Test notification attempted
/settings/notifications/pushover: /settings/notifications/pushover:
get: get:
summary: Get Pushover notification settings summary: Get Pushover notification settings
@@ -2370,7 +2428,7 @@ paths:
schema: schema:
$ref: '#/components/schemas/PushoverSettings' $ref: '#/components/schemas/PushoverSettings'
post: post:
summary: Update pushover notification settings summary: Update Pushover notification settings
description: Update Pushover notification settings with the provided values. description: Update Pushover notification settings with the provided values.
tags: tags:
- settings - settings

View File

@@ -24,6 +24,7 @@ import SlackAgent from './lib/notifications/agents/slack';
import PushoverAgent from './lib/notifications/agents/pushover'; import PushoverAgent from './lib/notifications/agents/pushover';
import WebhookAgent from './lib/notifications/agents/webhook'; import WebhookAgent from './lib/notifications/agents/webhook';
import { getClientIp } from '@supercharge/request-ip'; import { getClientIp } from '@supercharge/request-ip';
import PushbulletAgent from './lib/notifications/agents/pushbullet';
const API_SPEC_PATH = path.join(__dirname, '../overseerr-api.yml'); const API_SPEC_PATH = path.join(__dirname, '../overseerr-api.yml');
@@ -51,9 +52,10 @@ app
notificationManager.registerAgents([ notificationManager.registerAgents([
new DiscordAgent(), new DiscordAgent(),
new EmailAgent(), new EmailAgent(),
new PushbulletAgent(),
new PushoverAgent(),
new SlackAgent(), new SlackAgent(),
new TelegramAgent(), new TelegramAgent(),
new PushoverAgent(),
new WebhookAgent(), new WebhookAgent(),
]); ]);

View File

@@ -0,0 +1,146 @@
import axios from 'axios';
import { hasNotificationType, Notification } from '..';
import logger from '../../../logger';
import { getSettings, NotificationAgentPushbullet } from '../../settings';
import { BaseAgent, NotificationAgent, NotificationPayload } from './agent';
interface PushbulletPayload {
title: string;
body: string;
}
class PushbulletAgent
extends BaseAgent<NotificationAgentPushbullet>
implements NotificationAgent {
protected getSettings(): NotificationAgentPushbullet {
if (this.settings) {
return this.settings;
}
const settings = getSettings();
return settings.notifications.agents.pushbullet;
}
public shouldSend(type: Notification): boolean {
if (
this.getSettings().enabled &&
this.getSettings().options.accessToken &&
hasNotificationType(type, this.getSettings().types)
) {
return true;
}
return false;
}
private constructMessageDetails(
type: Notification,
payload: NotificationPayload
): {
title: string;
body: string;
} {
let messageTitle = '';
let message = '';
const title = payload.subject;
const plot = payload.message;
const username = payload.notifyUser.displayName;
switch (type) {
case Notification.MEDIA_PENDING:
messageTitle = 'New Request';
message += `${title}`;
if (plot) {
message += `\n\n${plot}`;
}
message += `\n\nRequested By: ${username}`;
message += `\nStatus: Pending Approval`;
break;
case Notification.MEDIA_APPROVED:
messageTitle = 'Request Approved';
message += `${title}`;
if (plot) {
message += `\n\n${plot}`;
}
message += `\n\nRequested By: ${username}`;
message += `\nStatus: Processing`;
break;
case Notification.MEDIA_AVAILABLE:
messageTitle = 'Now Available';
message += `${title}`;
if (plot) {
message += `\n\n${plot}`;
}
message += `\n\nRequested By: ${username}`;
message += `\nStatus: Available`;
break;
case Notification.MEDIA_DECLINED:
messageTitle = 'Request Declined';
message += `${title}`;
if (plot) {
message += `\n\n${plot}`;
}
message += `\n\nRequested By: ${username}`;
message += `\nStatus: Declined`;
break;
case Notification.MEDIA_FAILED:
messageTitle = 'Failed Request';
message += `${title}`;
if (plot) {
message += `\n\n${plot}`;
}
message += `\n\nRequested By: ${username}`;
message += `\nStatus: Failed`;
break;
case Notification.TEST_NOTIFICATION:
messageTitle = 'Test Notification';
message += `${plot}`;
break;
}
return {
title: messageTitle,
body: message,
};
}
public async send(
type: Notification,
payload: NotificationPayload
): Promise<boolean> {
logger.debug('Sending Pushbullet notification', { label: 'Notifications' });
try {
const endpoint = 'https://api.pushbullet.com/v2/pushes';
const { accessToken } = this.getSettings().options;
const { title, body } = this.constructMessageDetails(type, payload);
await axios.post(
endpoint,
{
type: 'note',
title: title,
body: body,
} as PushbulletPayload,
{
headers: {
'Access-Token': accessToken,
},
}
);
return true;
} catch (e) {
logger.error('Error sending Pushbullet notification', {
label: 'Notifications',
message: e.message,
});
return false;
}
}
}
export default PushbulletAgent;

View File

@@ -111,12 +111,17 @@ export interface NotificationAgentTelegram extends NotificationAgentConfig {
}; };
} }
export interface NotificationAgentPushbullet extends NotificationAgentConfig {
options: {
accessToken: string;
};
}
export interface NotificationAgentPushover extends NotificationAgentConfig { export interface NotificationAgentPushover extends NotificationAgentConfig {
options: { options: {
accessToken: string; accessToken: string;
userToken: string; userToken: string;
priority: number; priority: number;
sound: string;
}; };
} }
@@ -129,11 +134,12 @@ export interface NotificationAgentWebhook extends NotificationAgentConfig {
} }
interface NotificationAgents { interface NotificationAgents {
email: NotificationAgentEmail;
discord: NotificationAgentDiscord; discord: NotificationAgentDiscord;
email: NotificationAgentEmail;
pushbullet: NotificationAgentPushbullet;
pushover: NotificationAgentPushover;
slack: NotificationAgentSlack; slack: NotificationAgentSlack;
telegram: NotificationAgentTelegram; telegram: NotificationAgentTelegram;
pushover: NotificationAgentPushover;
webhook: NotificationAgentWebhook; webhook: NotificationAgentWebhook;
} }
@@ -224,6 +230,13 @@ class Settings {
sendSilently: false, sendSilently: false,
}, },
}, },
pushbullet: {
enabled: false,
types: 0,
options: {
accessToken: '',
},
},
pushover: { pushover: {
enabled: false, enabled: false,
types: 0, types: 0,
@@ -231,7 +244,6 @@ class Settings {
accessToken: '', accessToken: '',
userToken: '', userToken: '',
priority: 0, priority: 0,
sound: '',
}, },
}, },
webhook: { webhook: {

View File

@@ -7,6 +7,7 @@ import SlackAgent from '../../lib/notifications/agents/slack';
import TelegramAgent from '../../lib/notifications/agents/telegram'; import TelegramAgent from '../../lib/notifications/agents/telegram';
import PushoverAgent from '../../lib/notifications/agents/pushover'; import PushoverAgent from '../../lib/notifications/agents/pushover';
import WebhookAgent from '../../lib/notifications/agents/webhook'; import WebhookAgent from '../../lib/notifications/agents/webhook';
import PushbulletAgent from '../../lib/notifications/agents/pushbullet';
const notificationRoutes = Router(); const notificationRoutes = Router();
@@ -135,6 +136,40 @@ notificationRoutes.post('/telegram/test', (req, res, next) => {
return res.status(204).send(); return res.status(204).send();
}); });
notificationRoutes.get('/pushbullet', (_req, res) => {
const settings = getSettings();
res.status(200).json(settings.notifications.agents.pushbullet);
});
notificationRoutes.post('/pushbullet', (req, res) => {
const settings = getSettings();
settings.notifications.agents.pushbullet = req.body;
settings.save();
res.status(200).json(settings.notifications.agents.pushbullet);
});
notificationRoutes.post('/pushbullet/test', (req, res, next) => {
if (!req.user) {
return next({
status: 500,
message: 'User information missing from request',
});
}
const pushbulletAgent = new PushbulletAgent(req.body);
pushbulletAgent.send(Notification.TEST_NOTIFICATION, {
notifyUser: req.user,
subject: 'Test Notification',
message:
'This is a test notification! Check check, 1, 2, 3. Are we coming in clear?',
});
return res.status(204).send();
});
notificationRoutes.get('/pushover', (_req, res) => { notificationRoutes.get('/pushover', (_req, res) => {
const settings = getSettings(); const settings = getSettings();

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg preserveAspectRatio="xMidYMid" version="1.1" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><metadata><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title/></cc:Work></rdf:RDF></metadata><path d="m128 0c-70.692 0-128 57.308-128 128s57.308 128 128 128 128-57.308 128-128-57.308-128-128-128zm-51 64.268h3.334c16.733 0 16.732-5.78e-4 16.732 16.732v91.867c-1e-6 16.733 5.77e-4 16.732-16.732 16.732h-3.334c-16.733 0-16.732 5.8e-4 -16.732-16.732v-91.867c0-16.733-5.78e-4 -16.732 16.732-16.732zm44.041 0h37.537c32.178 0 52.627 32.273 52.627 63.025 0 30.752-20.627 62.307-52.627 62.307h-37.537c-5.699 0-8.5078-2.8088-8.5078-8.5078v-108.32c0-5.698 2.8088-8.5059 8.5078-8.5059z" fill="#fff" mask="url(#mask-2)"/></svg>

After

Width:  |  Height:  |  Size: 992 B

View File

@@ -0,0 +1,198 @@
import React from 'react';
import { Field, Form, Formik } from 'formik';
import useSWR from 'swr';
import LoadingSpinner from '../../../Common/LoadingSpinner';
import Button from '../../../Common/Button';
import { defineMessages, useIntl } from 'react-intl';
import axios from 'axios';
import * as Yup from 'yup';
import { useToasts } from 'react-toast-notifications';
import Alert from '../../../Common/Alert';
import NotificationTypeSelector from '../../../NotificationTypeSelector';
const messages = defineMessages({
save: 'Save Changes',
saving: 'Saving…',
agentEnabled: 'Enable Agent',
accessToken: 'Access Token',
validationAccessTokenRequired: 'You must provide an access token.',
pushbulletSettingsSaved: 'Pushbullet notification settings saved!',
pushbulletSettingsFailed: 'Pushbullet notification settings failed to save.',
testSent: 'Test notification sent!',
test: 'Test',
settingUpPushbullet: 'Setting Up Pushbullet Notifications',
settingUpPushbulletDescription:
'To configure Pushbullet notifications, you need to <CreateAccessTokenLink>create an access token</CreateAccessTokenLink> and enter it below.',
notificationTypes: 'Notification Types',
});
const NotificationsPushbullet: React.FC = () => {
const intl = useIntl();
const { addToast } = useToasts();
const { data, error, revalidate } = useSWR(
'/api/v1/settings/notifications/pushbullet'
);
const NotificationsPushbulletSchema = Yup.object().shape({
accessToken: Yup.string().required(
intl.formatMessage(messages.validationAccessTokenRequired)
),
});
if (!data && !error) {
return <LoadingSpinner />;
}
return (
<Formik
initialValues={{
enabled: data?.enabled,
types: data?.types,
accessToken: data?.options.accessToken,
}}
validationSchema={NotificationsPushbulletSchema}
onSubmit={async (values) => {
try {
await axios.post('/api/v1/settings/notifications/pushbullet', {
enabled: values.enabled,
types: values.types,
options: {
accessToken: values.accessToken,
},
});
addToast(intl.formatMessage(messages.pushbulletSettingsSaved), {
appearance: 'success',
autoDismiss: true,
});
} catch (e) {
addToast(intl.formatMessage(messages.pushbulletSettingsFailed), {
appearance: 'error',
autoDismiss: true,
});
} finally {
revalidate();
}
}}
>
{({ errors, touched, isSubmitting, values, isValid, setFieldValue }) => {
const testSettings = async () => {
await axios.post('/api/v1/settings/notifications/pushbullet/test', {
enabled: true,
types: values.types,
options: {
accessToken: values.accessToken,
},
});
addToast(intl.formatMessage(messages.testSent), {
appearance: 'info',
autoDismiss: true,
});
};
return (
<>
<Alert
title={intl.formatMessage(messages.settingUpPushbullet)}
type="info"
>
{intl.formatMessage(messages.settingUpPushbulletDescription, {
CreateAccessTokenLink: function CreateAccessTokenLink(msg) {
return (
<a
href="https://www.pushbullet.com/#settings"
className="text-indigo-100 hover:text-white hover:underline"
target="_blank"
rel="noreferrer"
>
{msg}
</a>
);
},
})}
</Alert>
<Form className="section">
<div className="form-row">
<label htmlFor="enabled" className="checkbox-label">
{intl.formatMessage(messages.agentEnabled)}
</label>
<div className="form-input">
<Field type="checkbox" id="enabled" name="enabled" />
</div>
</div>
<div className="form-row">
<label htmlFor="accessToken" className="text-label">
{intl.formatMessage(messages.accessToken)}
</label>
<div className="form-input">
<div className="flex max-w-lg rounded-md shadow-sm">
<Field
id="accessToken"
name="accessToken"
type="text"
placeholder={intl.formatMessage(messages.accessToken)}
/>
</div>
{errors.accessToken && touched.accessToken && (
<div className="error">{errors.accessToken}</div>
)}
</div>
</div>
<div
role="group"
aria-labelledby="group-label"
className="form-group"
>
<div className="form-row">
<span id="group-label" className="group-label">
{intl.formatMessage(messages.notificationTypes)}
</span>
<div className="form-input">
<div className="max-w-lg">
<NotificationTypeSelector
currentTypes={values.types}
onUpdate={(newTypes) =>
setFieldValue('types', newTypes)
}
/>
</div>
</div>
</div>
</div>
<div className="actions">
<div className="flex justify-end">
<span className="inline-flex ml-3 rounded-md shadow-sm">
<Button
buttonType="warning"
disabled={isSubmitting || !isValid}
onClick={(e) => {
e.preventDefault();
testSettings();
}}
>
{intl.formatMessage(messages.test)}
</Button>
</span>
<span className="inline-flex ml-3 rounded-md shadow-sm">
<Button
buttonType="primary"
type="submit"
disabled={isSubmitting || !isValid}
>
{isSubmitting
? intl.formatMessage(messages.saving)
: intl.formatMessage(messages.save)}
</Button>
</span>
</div>
</div>
</Form>
</>
);
}}
</Formik>
);
};
export default NotificationsPushbullet;

View File

@@ -24,9 +24,9 @@ const messages = defineMessages({
test: 'Test', test: 'Test',
settinguppushover: 'Setting Up Pushover Notifications', settinguppushover: 'Setting Up Pushover Notifications',
settinguppushoverDescription: settinguppushoverDescription:
'To setup Pushover you need to <RegisterApplicationLink>register an application</RegisterApplicationLink> and get the access token.\ 'To configure Pushover notifications, you need to <RegisterApplicationLink>register an application</RegisterApplicationLink> and get the access token.\
When setting up the application you can use one of the icons in the <IconLink>public folder</IconLink> on github.\ When setting up the application, you can use one of the icons in the <IconLink>public folder</IconLink> on GitHub.\
You also need the pushover user token which can be found on the start page when you log in.', You also need the Pushover user token, which can be found on the start page when you log in.',
notificationtypes: 'Notification Types', notificationtypes: 'Notification Types',
}); });

View File

@@ -22,7 +22,7 @@ const messages = defineMessages({
test: 'Test', test: 'Test',
settingupslack: 'Setting Up Slack Notifications', settingupslack: 'Setting Up Slack Notifications',
settingupslackDescription: settingupslackDescription:
'To use Slack notifications, you will need to create an <WebhookLink>Incoming Webhook</WebhookLink> integration and use the provided webhook URL below.', 'To configure Slack notifications, you will need to create an <WebhookLink>Incoming Webhook</WebhookLink> integration and enter the webhook URL below.',
notificationtypes: 'Notification Types', notificationtypes: 'Notification Types',
validationWebhookUrl: 'You must provide a valid URL', validationWebhookUrl: 'You must provide a valid URL',
}); });

View File

@@ -24,9 +24,9 @@ const messages = defineMessages({
test: 'Test', test: 'Test',
settinguptelegram: 'Setting Up Telegram Notifications', settinguptelegram: 'Setting Up Telegram Notifications',
settinguptelegramDescription: settinguptelegramDescription:
'To setup Telegram you need to <CreateBotLink>create a bot</CreateBotLink> and get the bot API key.\ 'To configure Telegram notifications, you need to <CreateBotLink>create a bot</CreateBotLink> and get the bot API key.\
Additionally, you need the chat ID for the chat you want the bot to send notifications to.\ Additionally, you need the chat ID for the chat where you would like the bot to send notifications.\
You can do this by adding <GetIdBotLink>@get_id_bot</GetIdBotLink> to the chat or group chat.', You can get this by adding <GetIdBotLink>@get_id_bot</GetIdBotLink> to the chat or group chat.',
notificationtypes: 'Notification Types', notificationtypes: 'Notification Types',
sendSilently: 'Send Silently', sendSilently: 'Send Silently',
sendSilentlyTip: 'Send notifications with no sound', sendSilentlyTip: 'Send notifications with no sound',

View File

@@ -2,9 +2,10 @@ import Link from 'next/link';
import { useRouter } from 'next/router'; import { useRouter } from 'next/router';
import React from 'react'; import React from 'react';
import { defineMessages, useIntl } from 'react-intl'; import { defineMessages, useIntl } from 'react-intl';
import DiscordLogo from '../../assets/extlogos/discord_white.svg'; import DiscordLogo from '../../assets/extlogos/discord.svg';
import SlackLogo from '../../assets/extlogos/slack.svg'; import SlackLogo from '../../assets/extlogos/slack.svg';
import TelegramLogo from '../../assets/extlogos/telegram.svg'; import TelegramLogo from '../../assets/extlogos/telegram.svg';
import PushbulletLogo from '../../assets/extlogos/pushbullet.svg';
import PushoverLogo from '../../assets/extlogos/pushover.svg'; import PushoverLogo from '../../assets/extlogos/pushover.svg';
import Bolt from '../../assets/bolt.svg'; import Bolt from '../../assets/bolt.svg';
import { Field, Form, Formik } from 'formik'; import { Field, Form, Formik } from 'formik';
@@ -95,6 +96,17 @@ const settingsRoutes: SettingsRoute[] = [
route: '/settings/notifications/telegram', route: '/settings/notifications/telegram',
regex: /^\/settings\/notifications\/telegram/, regex: /^\/settings\/notifications\/telegram/,
}, },
{
text: 'Pushbullet',
content: (
<span className="flex items-center">
<PushbulletLogo className="h-4 mr-2" />
Pushbullet
</span>
),
route: '/settings/notifications/pushbullet',
regex: /^\/settings\/notifications\/pushbullet/,
},
{ {
text: 'Pushover', text: 'Pushover',
content: ( content: (

View File

@@ -236,6 +236,18 @@
"components.ResetPassword.validationpasswordrequired": "You must provide a password", "components.ResetPassword.validationpasswordrequired": "You must provide a password",
"components.Search.search": "Search", "components.Search.search": "Search",
"components.Search.searchresults": "Search Results", "components.Search.searchresults": "Search Results",
"components.Settings.Notifications.NotificationsPushbullet.accessToken": "Access Token",
"components.Settings.Notifications.NotificationsPushbullet.agentEnabled": "Enable Agent",
"components.Settings.Notifications.NotificationsPushbullet.notificationTypes": "Notification Types",
"components.Settings.Notifications.NotificationsPushbullet.pushbulletSettingsFailed": "Pushbullet notification settings failed to save.",
"components.Settings.Notifications.NotificationsPushbullet.pushbulletSettingsSaved": "Pushbullet notification settings saved!",
"components.Settings.Notifications.NotificationsPushbullet.save": "Save Changes",
"components.Settings.Notifications.NotificationsPushbullet.saving": "Saving…",
"components.Settings.Notifications.NotificationsPushbullet.settingUpPushbullet": "Setting Up Pushbullet Notifications",
"components.Settings.Notifications.NotificationsPushbullet.settingUpPushbulletDescription": "To configure Pushbullet notifications, you need to <CreateAccessTokenLink>create an access token</CreateAccessTokenLink> and enter it below.",
"components.Settings.Notifications.NotificationsPushbullet.test": "Test",
"components.Settings.Notifications.NotificationsPushbullet.testSent": "Test notification sent!",
"components.Settings.Notifications.NotificationsPushbullet.validationAccessTokenRequired": "You must provide an access token.",
"components.Settings.Notifications.NotificationsPushover.accessToken": "Access Token", "components.Settings.Notifications.NotificationsPushover.accessToken": "Access Token",
"components.Settings.Notifications.NotificationsPushover.agentenabled": "Enable Agent", "components.Settings.Notifications.NotificationsPushover.agentenabled": "Enable Agent",
"components.Settings.Notifications.NotificationsPushover.notificationtypes": "Notification Types", "components.Settings.Notifications.NotificationsPushover.notificationtypes": "Notification Types",
@@ -244,7 +256,7 @@
"components.Settings.Notifications.NotificationsPushover.save": "Save Changes", "components.Settings.Notifications.NotificationsPushover.save": "Save Changes",
"components.Settings.Notifications.NotificationsPushover.saving": "Saving…", "components.Settings.Notifications.NotificationsPushover.saving": "Saving…",
"components.Settings.Notifications.NotificationsPushover.settinguppushover": "Setting Up Pushover Notifications", "components.Settings.Notifications.NotificationsPushover.settinguppushover": "Setting Up Pushover Notifications",
"components.Settings.Notifications.NotificationsPushover.settinguppushoverDescription": "To set up Pushover, you need to <RegisterApplicationLink>register an application</RegisterApplicationLink> and get the access token. When setting up the application, you can use one of the icons in the <IconLink>public folder</IconLink> on GitHub. You also need the Pushover user token, which can be found on the start page when you log in.", "components.Settings.Notifications.NotificationsPushover.settinguppushoverDescription": "To configure Pushover notifications, you need to <RegisterApplicationLink>register an application</RegisterApplicationLink> and get the access token. When setting up the application, you can use one of the icons in the <IconLink>public folder</IconLink> on GitHub. You also need the Pushover user token, which can be found on the start page when you log in.",
"components.Settings.Notifications.NotificationsPushover.test": "Test", "components.Settings.Notifications.NotificationsPushover.test": "Test",
"components.Settings.Notifications.NotificationsPushover.testsent": "Test notification sent!", "components.Settings.Notifications.NotificationsPushover.testsent": "Test notification sent!",
"components.Settings.Notifications.NotificationsPushover.userToken": "User Token", "components.Settings.Notifications.NotificationsPushover.userToken": "User Token",
@@ -255,7 +267,7 @@
"components.Settings.Notifications.NotificationsSlack.save": "Save Changes", "components.Settings.Notifications.NotificationsSlack.save": "Save Changes",
"components.Settings.Notifications.NotificationsSlack.saving": "Saving…", "components.Settings.Notifications.NotificationsSlack.saving": "Saving…",
"components.Settings.Notifications.NotificationsSlack.settingupslack": "Setting Up Slack Notifications", "components.Settings.Notifications.NotificationsSlack.settingupslack": "Setting Up Slack Notifications",
"components.Settings.Notifications.NotificationsSlack.settingupslackDescription": "To use Slack notifications, you will need to create an <WebhookLink>Incoming Webhook</WebhookLink> integration and use the provided webhook URL below.", "components.Settings.Notifications.NotificationsSlack.settingupslackDescription": "To configure Slack notifications, you will need to create an <WebhookLink>Incoming Webhook</WebhookLink> integration and enter the webhook URL below.",
"components.Settings.Notifications.NotificationsSlack.slacksettingsfailed": "Slack notification settings failed to save.", "components.Settings.Notifications.NotificationsSlack.slacksettingsfailed": "Slack notification settings failed to save.",
"components.Settings.Notifications.NotificationsSlack.slacksettingssaved": "Slack notification settings saved!", "components.Settings.Notifications.NotificationsSlack.slacksettingssaved": "Slack notification settings saved!",
"components.Settings.Notifications.NotificationsSlack.test": "Test", "components.Settings.Notifications.NotificationsSlack.test": "Test",
@@ -299,7 +311,7 @@
"components.Settings.Notifications.sendSilentlyTip": "Send notifications with no sound", "components.Settings.Notifications.sendSilentlyTip": "Send notifications with no sound",
"components.Settings.Notifications.senderName": "Sender Name", "components.Settings.Notifications.senderName": "Sender Name",
"components.Settings.Notifications.settinguptelegram": "Setting Up Telegram Notifications", "components.Settings.Notifications.settinguptelegram": "Setting Up Telegram Notifications",
"components.Settings.Notifications.settinguptelegramDescription": "To set up Telegram, you need to <CreateBotLink>create a bot</CreateBotLink> and get the bot API key. Additionally, you need the chat ID for the chat you want the bot to send notifications to. You can do this by adding <GetIdBotLink>@get_id_bot</GetIdBotLink> to the chat or group chat.", "components.Settings.Notifications.settinguptelegramDescription": "To configure Telegram notifications, you need to <CreateBotLink>create a bot</CreateBotLink> and get the bot API key. Additionally, you need the chat ID for the chat where you would like the bot to send notifications. You can get this by adding <GetIdBotLink>@get_id_bot</GetIdBotLink> to the chat or group chat.",
"components.Settings.Notifications.smtpHost": "SMTP Host", "components.Settings.Notifications.smtpHost": "SMTP Host",
"components.Settings.Notifications.smtpPort": "SMTP Port", "components.Settings.Notifications.smtpPort": "SMTP Port",
"components.Settings.Notifications.ssldisabletip": "SSL should be disabled on standard TLS connections (port 587)", "components.Settings.Notifications.ssldisabletip": "SSL should be disabled on standard TLS connections (port 587)",

View File

@@ -0,0 +1,17 @@
import { NextPage } from 'next';
import React from 'react';
import NotificationsPushbullet from '../../../components/Settings/Notifications/NotificationsPushbullet';
import SettingsLayout from '../../../components/Settings/SettingsLayout';
import SettingsNotifications from '../../../components/Settings/SettingsNotifications';
const NotificationsPage: NextPage = () => {
return (
<SettingsLayout>
<SettingsNotifications>
<NotificationsPushbullet />
</SettingsNotifications>
</SettingsLayout>
);
};
export default NotificationsPage;