diff --git a/website/common/locales/en/groups.json b/website/common/locales/en/groups.json index 055aee204e..637a7fbb8a 100644 --- a/website/common/locales/en/groups.json +++ b/website/common/locales/en/groups.json @@ -487,5 +487,6 @@ "recurringCompletion": "None - Group task does not complete", "singleCompletion": "Single - Completes when any assigned user finishes", "allAssignedCompletion": "All - Completes when all assigned users finish", - "suggestedGroup": "Suggested because you’re new to Habitica." + "suggestedGroup": "Suggested because you’re new to Habitica.", + "groupActivityNotificationTitle": "<%= user %> posted in <%= group %>" } diff --git a/website/server/controllers/api-v3/chat.js b/website/server/controllers/api-v3/chat.js index 29d75b4e41..e56337e76d 100644 --- a/website/server/controllers/api-v3/chat.js +++ b/website/server/controllers/api-v3/chat.js @@ -11,8 +11,8 @@ import { import { removeFromArray } from '../../libs/collectionManipulators'; import { getUserInfo, getGroupUrl, sendTxn } from '../../libs/email'; import slack from '../../libs/slack'; -import { getAuthorEmailFromMessage } from '../../libs/chat'; import { chatReporterFactory } from '../../libs/chatReporting/chatReporterFactory'; +import { getAuthorEmailFromMessage} from '../../libs/chat'; import nconf from 'nconf'; import bannedWords from '../../libs/bannedWords'; import guildsAllowingBannedWords from '../../libs/guildsAllowingBannedWords'; @@ -223,7 +223,7 @@ api.postChat = { }); } - const newChatMessage = group.sendChat({message: req.body.message, user, flagCount, metaData: null, client}); + const newChatMessage = group.sendChat({message: req.body.message, user, flagCount, metaData: null, client, translate: res.t}); let toSave = [newChatMessage.save()]; if (group.type === 'party') { diff --git a/website/server/libs/chat.js b/website/server/libs/chat.js index 3554bc90ee..a19e9b260c 100644 --- a/website/server/libs/chat.js +++ b/website/server/libs/chat.js @@ -1,5 +1,6 @@ import { model as User } from '../models/user'; import { getUserInfo } from './email'; +import {sendNotification as sendPushNotification} from './pushNotifications'; export async function getAuthorEmailFromMessage (message) { let authorId = message.uuid; @@ -16,3 +17,26 @@ export async function getAuthorEmailFromMessage (message) { return 'Author Account Deleted'; } } + +export async function sendChatPushNotifications (user, group, message, translate) { + let members = await User.find({ + 'party._id': group._id, + _id: {$ne: user._id}, + }) + .select('preferences.pushNotifications preferences.language profile.name pushDevices') + .exec(); + members.forEach(member => { + if (member.preferences.pushNotifications.partyActivity !== false) { + sendPushNotification( + member, + { + title: translate('groupActivityNotificationTitle', {user: message.user, group: group.name}, member.preferences.language), + message: message.text, + identifier: 'groupActivity', + category: 'groupActivity', + payload: {groupID: group._id, type: group.type, groupName: group.name, message: message.text, timestamp: message.timestamp, senderName: message.user}, + } + ); + } + }); +} \ No newline at end of file diff --git a/website/server/libs/inbox/index.js b/website/server/libs/inbox/index.js index fbc1b81ffe..9cb610cc5e 100644 --- a/website/server/libs/inbox/index.js +++ b/website/server/libs/inbox/index.js @@ -6,10 +6,11 @@ const PM_PER_PAGE = 10; export async function sentMessage (sender, receiver, message, translate) { const messageSent = await sender.sendMessage(receiver, { receiverMsg: message }); + const senderName = getUserInfo(sender, ['name']).name; if (receiver.preferences.emailNotifications.newPM !== false) { sendTxnEmail(receiver, 'new-pm', [ - {name: 'SENDER', content: getUserInfo(sender, ['name']).name}, + {name: 'SENDER', content: senderName}, ]); } @@ -21,7 +22,7 @@ export async function sentMessage (sender, receiver, message, translate) { message, identifier: 'newPM', category: 'newPM', - payload: {replyTo: sender._id}, + payload: {replyTo: sender._id, senderName, message}, } ); } diff --git a/website/server/models/group.js b/website/server/models/group.js index 20c992d360..f7325bc636 100644 --- a/website/server/models/group.js +++ b/website/server/models/group.js @@ -39,6 +39,7 @@ import amazonPayments from '../libs/payments/amazon'; import stripePayments from '../libs/payments/stripe'; import { getGroupChat, translateMessage } from '../libs/chat/group-chat'; import { model as UserNotification } from './userNotification'; +import { sendChatPushNotifications } from '../libs/chat'; const questScrolls = shared.content.quests; const questSeriesAchievements = shared.content.questSeriesAchievements; @@ -512,7 +513,7 @@ schema.methods.getMemberCount = async function getMemberCount () { }; schema.methods.sendChat = function sendChat (options = {}) { - const {message, user, metaData, client, flagCount = 0, info = {}} = options; + const {message, user, metaData, client, flagCount = 0, info = {}, translate} = options; let newMessage = messageDefaults(message, user, client, flagCount, info); let newChatMessage = new Chat(); newChatMessage = Object.assign(newChatMessage, newMessage); @@ -574,6 +575,10 @@ schema.methods.sendChat = function sendChat (options = {}) { User.update(query, lastSeenUpdateAddNew, {multi: true}).exec(); }); + if (this.type === 'party' && user) { + sendChatPushNotifications(user, this, newChatMessage, translate); + } + return newChatMessage; }; diff --git a/website/server/models/user/schema.js b/website/server/models/user/schema.js index ccf2c3e966..66222b5eee 100644 --- a/website/server/models/user/schema.js +++ b/website/server/models/user/schema.js @@ -503,6 +503,7 @@ let schema = new Schema({ questStarted: {$type: Boolean, default: true}, invitedQuest: {$type: Boolean, default: true}, majorUpdates: {$type: Boolean, default: true}, + partyActivity: {$type: Boolean, default: true}, }, suppressModals: { levelUp: {$type: Boolean, default: false},