Create constants for Mastodon notification types
This commit is contained in:
parent
ea6f7aba40
commit
3e6fea30f2
|
@ -49,15 +49,6 @@ class Notification extends BaseFactory
|
||||||
if (!$this->dba->isResult($notification)) {
|
if (!$this->dba->isResult($notification)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
follow = Someone followed you
|
|
||||||
follow_request = Someone requested to follow you
|
|
||||||
mention = Someone mentioned you in their status
|
|
||||||
reblog = Someone boosted one of your statuses
|
|
||||||
favourite = Someone favourited one of your statuses
|
|
||||||
poll = A poll you have voted in or created has ended
|
|
||||||
status = Someone you enabled notifications for has posted a status
|
|
||||||
*/
|
|
||||||
|
|
||||||
$type = ModelNotification::getType($notification);
|
$type = ModelNotification::getType($notification);
|
||||||
if (empty($type)) {
|
if (empty($type)) {
|
||||||
|
|
|
@ -28,6 +28,7 @@ use Friendica\Core\Logger;
|
||||||
use Friendica\Database\Database;
|
use Friendica\Database\Database;
|
||||||
use Friendica\DI;
|
use Friendica\DI;
|
||||||
use Friendica\Network\HTTPException\InternalServerErrorException;
|
use Friendica\Network\HTTPException\InternalServerErrorException;
|
||||||
|
use Friendica\Object\Api\Mastodon\Notification as MstdnNotification;
|
||||||
use Friendica\Protocol\Activity;
|
use Friendica\Protocol\Activity;
|
||||||
use Psr\Log\LoggerInterface;
|
use Psr\Log\LoggerInterface;
|
||||||
|
|
||||||
|
@ -46,15 +47,15 @@ class Notification extends BaseModel
|
||||||
{
|
{
|
||||||
if (($notification['vid'] == Verb::getID(Activity::FOLLOW)) && ($notification['type'] == Post\UserNotification::TYPE_NONE)) {
|
if (($notification['vid'] == Verb::getID(Activity::FOLLOW)) && ($notification['type'] == Post\UserNotification::TYPE_NONE)) {
|
||||||
$contact = Contact::getById($notification['actor-id'], ['pending']);
|
$contact = Contact::getById($notification['actor-id'], ['pending']);
|
||||||
$type = $contact['pending'] ? 'follow_request' : 'follow';
|
$type = $contact['pending'] ? MstdnNotification::TYPE_INTRODUCTION : MstdnNotification::TYPE_FOLLOW;
|
||||||
} elseif (($notification['vid'] == Verb::getID(Activity::ANNOUNCE)) &&
|
} elseif (($notification['vid'] == Verb::getID(Activity::ANNOUNCE)) &&
|
||||||
in_array($notification['type'], [Post\UserNotification::TYPE_DIRECT_COMMENT, Post\UserNotification::TYPE_DIRECT_THREAD_COMMENT])) {
|
in_array($notification['type'], [Post\UserNotification::TYPE_DIRECT_COMMENT, Post\UserNotification::TYPE_DIRECT_THREAD_COMMENT])) {
|
||||||
$type = 'reblog';
|
$type = MstdnNotification::TYPE_RESHARE;
|
||||||
} elseif (in_array($notification['vid'], [Verb::getID(Activity::LIKE), Verb::getID(Activity::DISLIKE)]) &&
|
} elseif (in_array($notification['vid'], [Verb::getID(Activity::LIKE), Verb::getID(Activity::DISLIKE)]) &&
|
||||||
in_array($notification['type'], [Post\UserNotification::TYPE_DIRECT_COMMENT, Post\UserNotification::TYPE_DIRECT_THREAD_COMMENT])) {
|
in_array($notification['type'], [Post\UserNotification::TYPE_DIRECT_COMMENT, Post\UserNotification::TYPE_DIRECT_THREAD_COMMENT])) {
|
||||||
$type = 'favourite';
|
$type = MstdnNotification::TYPE_LIKE;
|
||||||
} elseif ($notification['type'] == Post\UserNotification::TYPE_SHARED) {
|
} elseif ($notification['type'] == Post\UserNotification::TYPE_SHARED) {
|
||||||
$type = 'status';
|
$type = MstdnNotification::TYPE_POST;
|
||||||
} elseif (in_array($notification['type'], [
|
} elseif (in_array($notification['type'], [
|
||||||
Post\UserNotification::TYPE_EXPLICIT_TAGGED,
|
Post\UserNotification::TYPE_EXPLICIT_TAGGED,
|
||||||
Post\UserNotification::TYPE_IMPLICIT_TAGGED,
|
Post\UserNotification::TYPE_IMPLICIT_TAGGED,
|
||||||
|
@ -62,7 +63,7 @@ class Notification extends BaseModel
|
||||||
Post\UserNotification::TYPE_DIRECT_THREAD_COMMENT,
|
Post\UserNotification::TYPE_DIRECT_THREAD_COMMENT,
|
||||||
Post\UserNotification::TYPE_THREAD_COMMENT
|
Post\UserNotification::TYPE_THREAD_COMMENT
|
||||||
])) {
|
])) {
|
||||||
$type = 'mention';
|
$type = MstdnNotification::TYPE_MENTION;
|
||||||
} else {
|
} else {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@ use Friendica\Core\Logger;
|
||||||
use Friendica\Core\Worker;
|
use Friendica\Core\Worker;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
use Friendica\DI;
|
use Friendica\DI;
|
||||||
|
use Friendica\Object\Api\Mastodon\Notification;
|
||||||
use Minishlink\WebPush\VAPID;
|
use Minishlink\WebPush\VAPID;
|
||||||
|
|
||||||
class Subscription
|
class Subscription
|
||||||
|
@ -142,8 +143,8 @@ class Subscription
|
||||||
$notification = DBA::selectFirst('notification', [], ['id' => $nid]);
|
$notification = DBA::selectFirst('notification', [], ['id' => $nid]);
|
||||||
|
|
||||||
$type = Notification::getType($notification);
|
$type = Notification::getType($notification);
|
||||||
|
$desktop_notification = !in_array($type, [Notification::TYPE_RESHARE, Notification::TYPE_LIKE]);
|
||||||
|
|
||||||
$desktop_notification = !in_array($type, ['reblog', 'favourite']);
|
|
||||||
|
|
||||||
if (DI::pConfig()->get($notification['uid'], 'system', 'notify_like') && ($type == 'favourite')) {
|
if (DI::pConfig()->get($notification['uid'], 'system', 'notify_like') && ($type == 'favourite')) {
|
||||||
$desktop_notification = true;
|
$desktop_notification = true;
|
||||||
|
|
|
@ -74,19 +74,19 @@ class Notifications extends BaseApi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_array('follow_request', $request['exclude_types'])) {
|
if (in_array(Notification::TYPE_INTRODUCTION, $request['exclude_types'])) {
|
||||||
$condition = DBA::mergeConditions($condition,
|
$condition = DBA::mergeConditions($condition,
|
||||||
["(`vid` != ? OR `type` != ? OR NOT EXISTS (SELECT `id` FROM `contact` WHERE `id` = `actor-id` AND `pending`))",
|
["(`vid` != ? OR `type` != ? OR NOT EXISTS (SELECT `id` FROM `contact` WHERE `id` = `actor-id` AND `pending`))",
|
||||||
Verb::getID(Activity::FOLLOW), Post\UserNotification::TYPE_NONE]);
|
Verb::getID(Activity::FOLLOW), Post\UserNotification::TYPE_NONE]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_array('follow', $request['exclude_types'])) {
|
if (in_array(Notification::TYPE_FOLLOW, $request['exclude_types'])) {
|
||||||
$condition = DBA::mergeConditions($condition,
|
$condition = DBA::mergeConditions($condition,
|
||||||
["(`vid` != ? OR `type` != ? OR NOT EXISTS (SELECT `id` FROM `contact` WHERE `id` = `actor-id` AND NOT `pending`))",
|
["(`vid` != ? OR `type` != ? OR NOT EXISTS (SELECT `id` FROM `contact` WHERE `id` = `actor-id` AND NOT `pending`))",
|
||||||
Verb::getID(Activity::FOLLOW), Post\UserNotification::TYPE_NONE]);
|
Verb::getID(Activity::FOLLOW), Post\UserNotification::TYPE_NONE]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_array('favourite', $request['exclude_types'])) {
|
if (in_array(Notification::TYPE_LIKE, $request['exclude_types'])) {
|
||||||
$condition = DBA::mergeConditions($condition, [
|
$condition = DBA::mergeConditions($condition, [
|
||||||
"(NOT `vid` IN (?, ?) OR NOT `type` IN (?, ?))",
|
"(NOT `vid` IN (?, ?) OR NOT `type` IN (?, ?))",
|
||||||
Verb::getID(Activity::LIKE), Verb::getID(Activity::DISLIKE),
|
Verb::getID(Activity::LIKE), Verb::getID(Activity::DISLIKE),
|
||||||
|
@ -94,7 +94,7 @@ class Notifications extends BaseApi
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_array('reblog', $request['exclude_types'])) {
|
if (in_array(Notification::TYPE_RESHARE, $request['exclude_types'])) {
|
||||||
$condition = DBA::mergeConditions($condition, [
|
$condition = DBA::mergeConditions($condition, [
|
||||||
"(NOT `vid` IN (?) OR NOT `type` IN (?, ?))",
|
"(NOT `vid` IN (?) OR NOT `type` IN (?, ?))",
|
||||||
Verb::getID(Activity::ANNOUNCE),
|
Verb::getID(Activity::ANNOUNCE),
|
||||||
|
@ -102,7 +102,7 @@ class Notifications extends BaseApi
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_array('mention', $request['exclude_types'])) {
|
if (in_array(Notification::TYPE_MENTION, $request['exclude_types'])) {
|
||||||
$condition = DBA::mergeConditions($condition, [
|
$condition = DBA::mergeConditions($condition, [
|
||||||
"(NOT `vid` IN (?) OR NOT `type` IN (?, ?, ?, ?, ?))",
|
"(NOT `vid` IN (?) OR NOT `type` IN (?, ?, ?, ?, ?))",
|
||||||
Verb::getID(Activity::POST), Post\UserNotification::TYPE_EXPLICIT_TAGGED,
|
Verb::getID(Activity::POST), Post\UserNotification::TYPE_EXPLICIT_TAGGED,
|
||||||
|
@ -110,7 +110,7 @@ class Notifications extends BaseApi
|
||||||
Post\UserNotification::TYPE_DIRECT_THREAD_COMMENT, Post\UserNotification::TYPE_THREAD_COMMENT]);
|
Post\UserNotification::TYPE_DIRECT_THREAD_COMMENT, Post\UserNotification::TYPE_THREAD_COMMENT]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_array('status', $request['exclude_types'])) {
|
if (in_array(Notification::TYPE_POST, $request['exclude_types'])) {
|
||||||
$condition = DBA::mergeConditions($condition, ["(NOT `vid` IN (?) OR NOT `type` IN (?))",
|
$condition = DBA::mergeConditions($condition, ["(NOT `vid` IN (?) OR NOT `type` IN (?))",
|
||||||
Verb::getID(Activity::POST), Post\UserNotification::TYPE_SHARED]);
|
Verb::getID(Activity::POST), Post\UserNotification::TYPE_SHARED]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ use Friendica\Core\System;
|
||||||
use Friendica\DI;
|
use Friendica\DI;
|
||||||
use Friendica\Model\Subscription;
|
use Friendica\Model\Subscription;
|
||||||
use Friendica\Module\BaseApi;
|
use Friendica\Module\BaseApi;
|
||||||
|
use Friendica\Object\Api\Mastodon\Notification;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see https://docs.joinmastodon.org/methods/notifications/push/
|
* @see https://docs.joinmastodon.org/methods/notifications/push/
|
||||||
|
@ -44,18 +45,18 @@ class PushSubscription extends BaseApi
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$subscription = [
|
$subscription = [
|
||||||
'application-id' => $application['id'],
|
'application-id' => $application['id'],
|
||||||
'uid' => $uid,
|
'uid' => $uid,
|
||||||
'endpoint' => $request['subscription']['endpoint'] ?? '',
|
'endpoint' => $request['subscription']['endpoint'] ?? '',
|
||||||
'pubkey' => $request['subscription']['keys']['p256dh'] ?? '',
|
'pubkey' => $request['subscription']['keys']['p256dh'] ?? '',
|
||||||
'secret' => $request['subscription']['keys']['auth'] ?? '',
|
'secret' => $request['subscription']['keys']['auth'] ?? '',
|
||||||
'follow' => $request['data']['alerts']['follow'] ?? false,
|
Notification::TYPE_FOLLOW => $request['data']['alerts'][Notification::TYPE_FOLLOW] ?? false,
|
||||||
'favourite' => $request['data']['alerts']['favourite'] ?? false,
|
Notification::TYPE_LIKE => $request['data']['alerts'][Notification::TYPE_LIKE] ?? false,
|
||||||
'reblog' => $request['data']['alerts']['reblog'] ?? false,
|
Notification::TYPE_RESHARE => $request['data']['alerts'][Notification::TYPE_RESHARE] ?? false,
|
||||||
'mention' => $request['data']['alerts']['mention'] ?? false,
|
Notification::TYPE_MENTION => $request['data']['alerts'][Notification::TYPE_MENTION] ?? false,
|
||||||
'poll' => $request['data']['alerts']['poll'] ?? false,
|
Notification::TYPE_POLL => $request['data']['alerts'][Notification::TYPE_POLL] ?? false,
|
||||||
'follow_request' => $request['data']['alerts']['follow_request'] ?? false,
|
Notification::TYPE_INTRODUCTION => $request['data']['alerts'][Notification::TYPE_INTRODUCTION] ?? false,
|
||||||
'status' => $request['data']['alerts']['status'] ?? false,
|
Notification::TYPE_POST => $request['data']['alerts'][Notification::TYPE_POST] ?? false,
|
||||||
];
|
];
|
||||||
|
|
||||||
$ret = Subscription::replace($subscription);
|
$ret = Subscription::replace($subscription);
|
||||||
|
@ -82,13 +83,13 @@ class PushSubscription extends BaseApi
|
||||||
}
|
}
|
||||||
|
|
||||||
$fields = [
|
$fields = [
|
||||||
'follow' => $request['data']['alerts']['follow'] ?? false,
|
Notification::TYPE_FOLLOW => $request['data']['alerts'][Notification::TYPE_FOLLOW] ?? false,
|
||||||
'favourite' => $request['data']['alerts']['favourite'] ?? false,
|
Notification::TYPE_LIKE => $request['data']['alerts'][Notification::TYPE_LIKE] ?? false,
|
||||||
'reblog' => $request['data']['alerts']['reblog'] ?? false,
|
Notification::TYPE_RESHARE => $request['data']['alerts'][Notification::TYPE_RESHARE] ?? false,
|
||||||
'mention' => $request['data']['alerts']['mention'] ?? false,
|
Notification::TYPE_MENTION => $request['data']['alerts'][Notification::TYPE_MENTION] ?? false,
|
||||||
'poll' => $request['data']['alerts']['poll'] ?? false,
|
Notification::TYPE_POLL => $request['data']['alerts'][Notification::TYPE_POLL] ?? false,
|
||||||
'follow_request' => $request['data']['alerts']['follow_request'] ?? false,
|
Notification::TYPE_INTRODUCTION => $request['data']['alerts'][Notification::TYPE_INTRODUCTION] ?? false,
|
||||||
'status' => $request['data']['alerts']['status'] ?? false,
|
Notification::TYPE_POST => $request['data']['alerts'][Notification::TYPE_POST] ?? false,
|
||||||
];
|
];
|
||||||
|
|
||||||
$ret = Subscription::update($application['id'], $uid, $fields);
|
$ret = Subscription::update($application['id'], $uid, $fields);
|
||||||
|
|
|
@ -33,9 +33,26 @@ use Friendica\Util\DateTimeFormat;
|
||||||
*/
|
*/
|
||||||
class Notification extends BaseDataTransferObject
|
class Notification extends BaseDataTransferObject
|
||||||
{
|
{
|
||||||
|
/* From the Mastodon documentation:
|
||||||
|
* - follow = Someone followed you
|
||||||
|
* - follow_request = Someone requested to follow you
|
||||||
|
* - mention = Someone mentioned you in their status
|
||||||
|
* - reblog = Someone boosted one of your statuses
|
||||||
|
* - favourite = Someone favourited one of your statuses
|
||||||
|
* - poll = A poll you have voted in or created has ended
|
||||||
|
* - status = Someone you enabled notifications for has posted a status
|
||||||
|
*/
|
||||||
|
public const TYPE_FOLLOW = 'follow';
|
||||||
|
public const TYPE_INTRODUCTION = 'follow_request';
|
||||||
|
public const TYPE_MENTION = 'mention';
|
||||||
|
public const TYPE_RESHARE = 'reblog';
|
||||||
|
public const TYPE_LIKE = 'favourite';
|
||||||
|
public const TYPE_POLL = 'poll';
|
||||||
|
public const TYPE_POST = 'status';
|
||||||
|
|
||||||
/** @var string */
|
/** @var string */
|
||||||
protected $id;
|
protected $id;
|
||||||
/** @var string (Enumerable oneOf) */
|
/** @var string One of the TYPE_* constant values */
|
||||||
protected $type;
|
protected $type;
|
||||||
/** @var string (Datetime) */
|
/** @var string (Datetime) */
|
||||||
protected $created_at;
|
protected $created_at;
|
||||||
|
|
|
@ -42,20 +42,19 @@ class Subscription extends BaseDataTransferObject
|
||||||
/**
|
/**
|
||||||
* Creates a subscription record from an item record.
|
* Creates a subscription record from an item record.
|
||||||
*
|
*
|
||||||
* @param array $subscription
|
* @param array $subscription
|
||||||
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
|
* @param string $vapid
|
||||||
*/
|
*/
|
||||||
public function __construct(array $subscription, string $vapid)
|
public function __construct(array $subscription, string $vapid)
|
||||||
{
|
{
|
||||||
$this->id = (string)$subscription['id'];
|
$this->id = (string)$subscription['id'];
|
||||||
$this->endpoint = $subscription['endpoint'];
|
$this->endpoint = $subscription['endpoint'];
|
||||||
$this->alerts = [
|
$this->alerts = [
|
||||||
'follow' => $subscription['follow'],
|
Notification::TYPE_FOLLOW => $subscription[Notification::TYPE_FOLLOW],
|
||||||
'favourite' => $subscription['favourite'],
|
Notification::TYPE_LIKE => $subscription[Notification::TYPE_LIKE],
|
||||||
'reblog' => $subscription['reblog'],
|
Notification::TYPE_RESHARE => $subscription[Notification::TYPE_RESHARE],
|
||||||
'mention' => $subscription['mention'],
|
Notification::TYPE_MENTION => $subscription[Notification::TYPE_MENTION],
|
||||||
'mention' => $subscription['mention'],
|
Notification::TYPE_POLL => $subscription[Notification::TYPE_POLL],
|
||||||
'poll' => $subscription['poll'],
|
|
||||||
];
|
];
|
||||||
|
|
||||||
$this->server_key = $vapid;
|
$this->server_key = $vapid;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user