diff --git a/test/api/v3/integration/quests/POST-groups_groupid_quests_abort.test.js b/test/api/v3/integration/quests/POST-groups_groupid_quests_abort.test.js index d90e4c7b0a..d5278ed9a8 100644 --- a/test/api/v3/integration/quests/POST-groups_groupid_quests_abort.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupid_quests_abort.test.js @@ -127,7 +127,14 @@ describe('POST /groups/:groupId/quests/abort', () => { members: {}, }); expect(Group.prototype.sendChat).to.be.calledOnce; - expect(Group.prototype.sendChat).to.be.calledWithMatch(/aborted the party quest Wail of the Whale.`/); + expect(Group.prototype.sendChat).to.be.calledWithMatch({ + // message: /aborted the party quest Wail of the Whale.`/, + info: { + quest: 'whale', + type: 'quest_abort', + // user: '1526651788146ce91216' + }, + }); stub.restore(); }); diff --git a/test/api/v3/unit/models/group.test.js b/test/api/v3/unit/models/group.test.js index f4c8b5776e..700491cae4 100644 --- a/test/api/v3/unit/models/group.test.js +++ b/test/api/v3/unit/models/group.test.js @@ -205,7 +205,16 @@ describe('Group Model', () => { party = await Group.findOne({_id: party._id}); expect(Group.prototype.sendChat).to.be.calledOnce; - expect(Group.prototype.sendChat).to.be.calledWith('`Participating Member attacks Wailing Whale for 5.0 damage. Wailing Whale attacks party for 7.5 damage.`'); + expect(Group.prototype.sendChat).to.be.calledWith({ + message: '`Participating Member attacks Wailing Whale for 5.0 damage. Wailing Whale attacks party for 7.5 damage.`', + info: { + bossDamage: '7.5', + quest: 'whale', + type: 'boss_damage', + user: 'Participating Member', + userDamage: '5.0', + }, + }); }); it('applies damage only to participating members of party', async () => { @@ -271,7 +280,10 @@ describe('Group Model', () => { party = await Group.findOne({_id: party._id}); expect(Group.prototype.sendChat).to.be.calledTwice; - expect(Group.prototype.sendChat).to.be.calledWith('`You defeated Wailing Whale! Questing party members receive the rewards of victory.`'); + expect(Group.prototype.sendChat).to.be.calledWith({ + message: '`You defeated Wailing Whale! Questing party members receive the rewards of victory.`', + info: { quest: 'whale', type: 'boss_defeated' }, + }); }); it('calls finishQuest when boss has <= 0 hp', async () => { @@ -314,7 +326,10 @@ describe('Group Model', () => { party = await Group.findOne({_id: party._id}); - expect(Group.prototype.sendChat).to.be.calledWith(quest.boss.rage.effect('en')); + expect(Group.prototype.sendChat).to.be.calledWith({ + message: quest.boss.rage.effect('en'), + info: { quest: 'trex_undead', type: 'boss_rage' }, + }); expect(party.quest.progress.hp).to.eql(383.5); expect(party.quest.progress.rage).to.eql(0); }); @@ -364,7 +379,10 @@ describe('Group Model', () => { party = await Group.findOne({_id: party._id}); - expect(Group.prototype.sendChat).to.be.calledWith(quest.boss.rage.effect('en')); + expect(Group.prototype.sendChat).to.be.calledWith({ + message: quest.boss.rage.effect('en'), + info: { quest: 'lostMasterclasser4', type: 'boss_rage' }, + }); expect(party.quest.progress.rage).to.eql(0); let drainedUser = await User.findById(participatingMember._id); @@ -415,7 +433,15 @@ describe('Group Model', () => { party = await Group.findOne({_id: party._id}); expect(Group.prototype.sendChat).to.be.calledOnce; - expect(Group.prototype.sendChat).to.be.calledWith('`Participating Member found 5 Bars of Soap.`'); + expect(Group.prototype.sendChat).to.be.calledWith({ + message: '`Participating Member found 5 Bars of Soap.`', + info: { + items: { soapBars: 5 }, + quest: 'atom1', + type: 'user_found_items', + user: 'Participating Member', + }, + }); }); it('sends a chat message if no progress is made', async () => { @@ -426,7 +452,15 @@ describe('Group Model', () => { party = await Group.findOne({_id: party._id}); expect(Group.prototype.sendChat).to.be.calledOnce; - expect(Group.prototype.sendChat).to.be.calledWith('`Participating Member found 0 Bars of Soap.`'); + expect(Group.prototype.sendChat).to.be.calledWith({ + message: '`Participating Member found 0 Bars of Soap.`', + info: { + items: { soapBars: 0 }, + quest: 'atom1', + type: 'user_found_items', + user: 'Participating Member', + }, + }); }); it('sends a chat message if no progress is made on quest with multiple items', async () => { @@ -443,9 +477,15 @@ describe('Group Model', () => { party = await Group.findOne({_id: party._id}); expect(Group.prototype.sendChat).to.be.calledOnce; - expect(Group.prototype.sendChat).to.be.calledWithMatch(/`Participating Member found/); - expect(Group.prototype.sendChat).to.be.calledWithMatch(/0 Blue Fins/); - expect(Group.prototype.sendChat).to.be.calledWithMatch(/0 Fire Coral/); + expect(Group.prototype.sendChat).to.be.calledWith({ + message: '`Participating Member found 0 Fire Coral, 0 Blue Fins.`', + info: { + items: { blueFins: 0, fireCoral: 0 }, + quest: 'dilatoryDistress1', + type: 'user_found_items', + user: 'Participating Member', + }, + }); }); it('handles collection quests with multiple items', async () => { @@ -462,8 +502,15 @@ describe('Group Model', () => { party = await Group.findOne({_id: party._id}); expect(Group.prototype.sendChat).to.be.calledOnce; - expect(Group.prototype.sendChat).to.be.calledWithMatch(/`Participating Member found/); - expect(Group.prototype.sendChat).to.be.calledWithMatch(/\d* (Tracks|Broken Twigs)/); + expect(Group.prototype.sendChat).to.be.calledWithMatch({ + // message: "`Participating Member found \d* Broken Twigs, \d* Tracks.`", + info: { + // items: { branches: \d*, tracks: \d* }, + quest: 'evilsanta2', + type: 'user_found_items', + user: 'Participating Member', + }, + }); }); it('sends message about victory', async () => { @@ -474,7 +521,10 @@ describe('Group Model', () => { party = await Group.findOne({_id: party._id}); expect(Group.prototype.sendChat).to.be.calledTwice; - expect(Group.prototype.sendChat).to.be.calledWith('`All items found! Party has received their rewards.`'); + expect(Group.prototype.sendChat).to.be.calledWith({ + message: '`All items found! Party has received their rewards.`', + info: { type: 'all_items_found' }, + }); }); it('calls finishQuest when all items are found', async () => { @@ -1123,20 +1173,22 @@ describe('Group Model', () => { }); it('formats message', () => { - const chatMessage = party.sendChat('a new message', { - _id: 'user-id', - profile: { name: 'user name' }, - contributor: { - toObject () { - return 'contributor object'; + const chatMessage = party.sendChat({ + message: 'a new message', user: { + _id: 'user-id', + profile: { name: 'user name' }, + contributor: { + toObject () { + return 'contributor object'; + }, }, - }, - backer: { - toObject () { - return 'backer object'; + backer: { + toObject () { + return 'backer object'; + }, }, - }, - }); + }} + ); const chat = chatMessage; @@ -1153,7 +1205,7 @@ describe('Group Model', () => { }); it('formats message as system if no user is passed in', () => { - const chat = party.sendChat('a system message'); + const chat = party.sendChat({message: 'a system message'}); expect(chat.text).to.eql('a system message'); expect(validator.isUUID(chat.id)).to.eql(true); @@ -1174,7 +1226,7 @@ describe('Group Model', () => { expect(party.chat).to.have.a.lengthOf(220); - party.sendChat('message'); + party.sendChat({message: 'message'}); expect(party.chat).to.have.a.lengthOf(200); }); @@ -1188,13 +1240,13 @@ describe('Group Model', () => { expect(party.chat).to.have.a.lengthOf(420); - party.sendChat('message'); + party.sendChat({message: 'message'}); expect(party.chat).to.have.a.lengthOf(400); }); it('updates users about new messages in party', () => { - party.sendChat('message'); + party.sendChat({message: 'message'}); expect(User.update).to.be.calledOnce; expect(User.update).to.be.calledWithMatch({ @@ -1208,7 +1260,7 @@ describe('Group Model', () => { type: 'guild', }); - group.sendChat('message'); + group.sendChat({message: 'message'}); expect(User.update).to.be.calledOnce; expect(User.update).to.be.calledWithMatch({ @@ -1218,7 +1270,7 @@ describe('Group Model', () => { }); it('does not send update to user that sent the message', () => { - party.sendChat('message', {_id: 'user-id', profile: { name: 'user' }}); + party.sendChat({message: 'message', user: {_id: 'user-id', profile: { name: 'user' }}}); expect(User.update).to.be.calledOnce; expect(User.update).to.be.calledWithMatch({ @@ -1230,7 +1282,7 @@ describe('Group Model', () => { it('skips sending new message notification for guilds with > 5000 members', () => { party.memberCount = 5001; - party.sendChat('message'); + party.sendChat({message: 'message'}); expect(User.update).to.not.be.called; }); @@ -1238,7 +1290,7 @@ describe('Group Model', () => { it('skips sending messages to the tavern', () => { party._id = TAVERN_ID; - party.sendChat('message'); + party.sendChat({message: 'message'}); expect(User.update).to.not.be.called; }); diff --git a/website/server/controllers/api-v3/chat.js b/website/server/controllers/api-v3/chat.js index 34a3868efe..cf1635ad7e 100644 --- a/website/server/controllers/api-v3/chat.js +++ b/website/server/controllers/api-v3/chat.js @@ -179,7 +179,7 @@ api.postChat = { throw new NotAuthorized(res.t('messageGroupChatSpam')); } - const newChatMessage = group.sendChat(req.body.message, user); + const newChatMessage = group.sendChat({message: req.body.message, user}); let toSave = [newChatMessage.save()]; if (group.type === 'party') { diff --git a/website/server/controllers/api-v3/quests.js b/website/server/controllers/api-v3/quests.js index 5af563611b..dba4f5f6ad 100644 --- a/website/server/controllers/api-v3/quests.js +++ b/website/server/controllers/api-v3/quests.js @@ -434,10 +434,13 @@ api.abortQuest = { if (user._id !== group.leader && user._id !== group.quest.leader) throw new NotAuthorized(res.t('onlyLeaderAbortQuest')); let questName = questScrolls[group.quest.key].text('en'); - const newChatMessage = group.sendChat(`\`${common.i18n.t('chatQuestAborted', {username: user.profile.name, questName}, 'en')}\``, null, null, { - type: 'quest_abort', - user: user.profile.name, - quest: group.quest.key, + const newChatMessage = group.sendChat({ + message: `\`${common.i18n.t('chatQuestAborted', {username: user.profile.name, questName}, 'en')}\``, + info: { + type: 'quest_abort', + user: user.profile.name, + quest: group.quest.key, + }, }); await newChatMessage.save(); diff --git a/website/server/controllers/api-v3/tasks/groups.js b/website/server/controllers/api-v3/tasks/groups.js index a349e1250a..b632da066b 100644 --- a/website/server/controllers/api-v3/tasks/groups.js +++ b/website/server/controllers/api-v3/tasks/groups.js @@ -209,10 +209,13 @@ api.assignTask = { // User is claiming the task if (user._id === assignedUserId) { let message = res.t('userIsClamingTask', {username: user.profile.name, task: task.text}); - const newMessage = group.sendChat(message, null, null, { - type: 'claim_task', - user: user.profile.name, - task: task.text, + const newMessage = group.sendChat({ + message, + info: { + type: 'claim_task', + user: user.profile.name, + task: task.text, + }, }); promises.push(newMessage.save()); } diff --git a/website/server/controllers/api-v3/user/spells.js b/website/server/controllers/api-v3/user/spells.js index 59ac561359..c7c0492d26 100644 --- a/website/server/controllers/api-v3/user/spells.js +++ b/website/server/controllers/api-v3/user/spells.js @@ -131,20 +131,26 @@ api.castSpell = { if (party && !spell.silent) { if (targetType === 'user') { - const newChatMessage = party.sendChat(`\`${common.i18n.t('chatCastSpellUser', {username: user.profile.name, spell: spell.text(), target: partyMembers.profile.name}, 'en')}\``, null, null, { - type: 'spell_cast_user', - user: user.profile.name, - class: klass, - spell: spellId, - target: partyMembers.profile.name, + const newChatMessage = party.sendChat({ + message: `\`${common.i18n.t('chatCastSpellUser', {username: user.profile.name, spell: spell.text(), target: partyMembers.profile.name}, 'en')}\``, + info: { + type: 'spell_cast_user', + user: user.profile.name, + class: klass, + spell: spellId, + target: partyMembers.profile.name, + }, }); await newChatMessage.save(); } else { - const newChatMessage = party.sendChat(`\`${common.i18n.t('chatCastSpellParty', {username: user.profile.name, spell: spell.text()}, 'en')}\``, null, null, { - type: 'spell_cast_party', - user: user.profile.name, - class: klass, - spell: spellId, + const newChatMessage = party.sendChat({ + message: `\`${common.i18n.t('chatCastSpellParty', {username: user.profile.name, spell: spell.text()}, 'en')}\``, + info: { + type: 'spell_cast_party', + user: user.profile.name, + class: klass, + spell: spellId, + }, }); await newChatMessage.save(); } diff --git a/website/server/models/group.js b/website/server/models/group.js index 001e03f895..ffc72778ce 100644 --- a/website/server/models/group.js +++ b/website/server/models/group.js @@ -323,66 +323,90 @@ schema.statics.getGroups = async function getGroups (options = {}) { return groupsArray; }; -function _translateSystemMessages (group, user) { +function _translateMessage (lang, info) { + let msg; let foundText = ''; - let lang = user.preferences.language; - for (let i = 0; i < group.chat.length; i++) { - if (!_.isEmpty(group.chat[i].info)) { - let msg; - switch (group.chat[i].info.type) { - case 'quest_start': - msg = `\`${shared.i18n.t('chatQuestStarted', {questName: questScrolls[group.chat[i].info.quest].text(lang)}, lang)}\``; - break; - case 'boss_damage': - msg = `\`${shared.i18n.t('chatBossDamage', {username: group.chat[i].info.user, bossName: questScrolls[group.chat[i].info.quest].boss.name(lang), userDamage: group.chat[i].info.userDamage, bossDamage: group.chat[i].info.bossDamage}, lang)}\``; - break; - case 'boss_dont_attack': - msg = `\`${shared.i18n.t('chatBossDontAttack', {username: group.chat[i].info.user, bossName: questScrolls[group.chat[i].info.quest].boss.name(lang), userDamage: group.chat[i].info.userDamage}, lang)}\``; - break; - case 'boss_rage': - msg = `\`${questScrolls[group.chat[i].info.quest].boss.rage.effect(lang)}\``; - break; - case 'boss_defeated': - msg = `\`${shared.i18n.t('chatBossDefeated', {bossName: questScrolls[group.chat[i].info.quest].boss.name(lang)}, lang)}\``; - break; - case 'user_found_items': - foundText = _.reduce(group.chat[i].info.items, (m, v, k) => { - m.push(`${v} ${questScrolls[group.chat[i].info.quest].collect[k].text(lang)}`); - return m; - }, []).join(', '); - msg = `\`${shared.i18n.t('chatFindItems', {username: group.chat[i].info.user, items: foundText}, lang)}\``; - break; - case 'all_items_found': - msg = `\`${shared.i18n.t('chatItemQuestFinish', lang)}\``; - break; - case 'spell_cast_party': - msg = `\`${shared.i18n.t('chatCastSpellParty', {username: group.chat[i].info.user, spell: shared.content.spells[group.chat[i].info.class][group.chat[i].info.spell].text(lang)}, lang)}\``; - break; - case 'spell_cast_user': - msg = `\`${shared.i18n.t('chatCastSpellUser', {username: group.chat[i].info.user, spell: shared.content.spells[group.chat[i].info.class][group.chat[i].info.spell].text(lang), target: group.chat[i].info.target}, lang)}\``; - break; - case 'quest_abort': - msg = `\`${shared.i18n.t('chatQuestAborted', {username: group.chat[i].info.user, questName: questScrolls[group.chat[i].info.quest].text(lang)}, lang)}\``; - break; - case 'tavern_quest_completed': - msg = `\`${shared.content.quests[group.chat[i].info.quest].completionChat(lang)}\``; - break; - case 'tavern_boss_rage_tired': - msg = `\`${shared.i18n.t('tavernBossTired', {rageName: shared.content.quests[group.chat[i].info.quest].boss.rage.title(lang), bossName: shared.content.quests[group.chat[i].info.quest].boss.name(lang)}, lang)}\``; - break; - case 'tavern_boss_rage': - msg = `\`${shared.content.quests[group.chat[i].info.quest].boss.rage[group.chat[i].info.scene](lang)}\``; - break; - case 'tavern_boss_desperation': - msg = `\`${shared.content.quests[group.chat[i].info.quest].boss.desperation.text(lang)}\``; - break; - case 'claim_task': - msg = `${shared.i18n.t('userIsClamingTask', {username: group.chat[i].info.user, task: group.chat[i].info.task}, lang)}`; - break; - } - group.chat[i].text = msg; - } + let spells = shared.content.spells; + let quests = shared.content.quests; + + switch (info.type) { + case 'quest_start': + msg = `\`${shared.i18n.t('chatQuestStarted', {questName: questScrolls[info.quest].text(lang)}, lang)}\``; + break; + + case 'boss_damage': + msg = `\`${shared.i18n.t('chatBossDamage', {username: info.user, bossName: questScrolls[info.quest].boss.name(lang), userDamage: info.userDamage, bossDamage: info.bossDamage}, lang)}\``; + break; + + case 'boss_dont_attack': + msg = `\`${shared.i18n.t('chatBossDontAttack', {username: info.user, bossName: questScrolls[info.quest].boss.name(lang), userDamage: info.userDamage}, lang)}\``; + break; + + case 'boss_rage': + msg = `\`${questScrolls[info.quest].boss.rage.effect(lang)}\``; + break; + + case 'boss_defeated': + msg = `\`${shared.i18n.t('chatBossDefeated', {bossName: questScrolls[info.quest].boss.name(lang)}, lang)}\``; + break; + + case 'user_found_items': + foundText = _.reduce(info.items, (m, v, k) => { + m.push(`${v} ${questScrolls[info.quest].collect[k].text(lang)}`); + return m; + }, []).join(', '); + msg = `\`${shared.i18n.t('chatFindItems', {username: info.user, items: foundText}, lang)}\``; + break; + + case 'all_items_found': + msg = `\`${shared.i18n.t('chatItemQuestFinish', lang)}\``; + break; + + case 'spell_cast_party': + msg = `\`${shared.i18n.t('chatCastSpellParty', {username: info.user, spell: spells[info.class][info.spell].text(lang)}, lang)}\``; + break; + + case 'spell_cast_user': + msg = `\`${shared.i18n.t('chatCastSpellUser', {username: info.user, spell: spells[info.class][info.spell].text(lang), target: info.target}, lang)}\``; + break; + + case 'quest_abort': + msg = `\`${shared.i18n.t('chatQuestAborted', {username: info.user, questName: questScrolls[info.quest].text(lang)}, lang)}\``; + break; + + case 'tavern_quest_completed': + msg = `\`${quests[info.quest].completionChat(lang)}\``; + break; + + case 'tavern_boss_rage_tired': + msg = `\`${shared.i18n.t('tavernBossTired', {rageName: quests[info.quest].boss.rage.title(lang), bossName: quests[info.quest].boss.name(lang)}, lang)}\``; + break; + + case 'tavern_boss_rage': + msg = `\`${quests[info.quest].boss.rage[info.scene](lang)}\``; + break; + + case 'tavern_boss_desperation': + msg = `\`${quests[info.quest].boss.desperation.text(lang)}\``; + break; + + case 'claim_task': + msg = `${shared.i18n.t('userIsClamingTask', {username: info.user, task: info.task}, lang)}`; + break; } + + return msg; +} + +function _translateSystemMessages (group, user) { + let lang = user.preferences.language; + + group.chat.forEach((chat, i, chatArray) => { + if (!_.isEmpty(chat.info)) { + chatArray[i].text = _translateMessage(lang, chat.info); + } + }); + return group; } @@ -612,7 +636,8 @@ function setUserStyles (newMessage, user) { newMessage.markModified('userStyles'); } -schema.methods.sendChat = function sendChat (message, user, metaData, info = {}) { +schema.methods.sendChat = function sendChat (options = {}) { + const {message, user, metaData, info = {}} = options; let newMessage = chatDefaults(message, user, info); let newChatMessage = new Chat(); newChatMessage = Object.assign(newChatMessage, newMessage); @@ -785,11 +810,15 @@ schema.methods.startQuest = async function startQuest (user) { }, }, { multi: true }).exec(); - const newMessage = this.sendChat(`\`${shared.i18n.t('chatQuestStarted', {questName: quest.text('en')}, 'en')}\``, null, { - participatingMembers: this.getParticipatingQuestMembers().join(', '), - }, { - type: 'quest_start', - quest: quest.key, + const newMessage = this.sendChat({ + message: `\`${shared.i18n.t('chatQuestStarted', {questName: quest.text('en')}, 'en')}\``, + metaData: { + participatingMembers: this.getParticipatingQuestMembers().join(', '), + }, + info: { + type: 'quest_start', + quest: quest.key, + }, }); await newMessage.save(); @@ -1047,20 +1076,26 @@ schema.methods._processBossQuest = async function processBossQuest (options) { group.quest.progress.hp -= progress.up; if (CRON_SAFE_MODE || CRON_SEMI_SAFE_MODE) { - const groupMessage = group.sendChat(`\`${shared.i18n.t('chatBossDontAttack', {bossName: quest.boss.name('en')}, 'en')}\``, null, null, { - type: 'boss_dont_attack', - user: user.profile.name, - quest: group.quest.key, - userDamage: progress.up.toFixed(1), + const groupMessage = group.sendChat({ + message: `\`${shared.i18n.t('chatBossDontAttack', {bossName: quest.boss.name('en')}, 'en')}\``, + info: { + type: 'boss_dont_attack', + user: user.profile.name, + quest: group.quest.key, + userDamage: progress.up.toFixed(1), + }, }); promises.push(groupMessage.save()); } else { - const groupMessage = group.sendChat(`\`${shared.i18n.t('chatBossDamage', {username: user.profile.name, bossName: quest.boss.name('en'), userDamage: progress.up.toFixed(1), bossDamage: Math.abs(down).toFixed(1)}, user.preferences.language)}\``, null, null, { - type: 'boss_damage', - user: user.profile.name, - quest: group.quest.key, - userDamage: progress.up.toFixed(1), - bossDamage: Math.abs(down).toFixed(1), + const groupMessage = group.sendChat({ + message: `\`${shared.i18n.t('chatBossDamage', {username: user.profile.name, bossName: quest.boss.name('en'), userDamage: progress.up.toFixed(1), bossDamage: Math.abs(down).toFixed(1)}, user.preferences.language)}\``, + info: { + type: 'boss_damage', + user: user.profile.name, + quest: group.quest.key, + userDamage: progress.up.toFixed(1), + bossDamage: Math.abs(down).toFixed(1), + }, }); promises.push(groupMessage.save()); } @@ -1069,9 +1104,12 @@ schema.methods._processBossQuest = async function processBossQuest (options) { if (quest.boss.rage) { group.quest.progress.rage += Math.abs(down); if (group.quest.progress.rage >= quest.boss.rage.value) { - const rageMessage = group.sendChat(quest.boss.rage.effect('en'), null, null, { - type: 'boss_rage', - quest: quest.key, + const rageMessage = group.sendChat({ + message: quest.boss.rage.effect('en'), + info: { + type: 'boss_rage', + quest: quest.key, + }, }); promises.push(rageMessage.save()); group.quest.progress.rage = 0; @@ -1100,9 +1138,12 @@ schema.methods._processBossQuest = async function processBossQuest (options) { // Boss slain, finish quest if (group.quest.progress.hp <= 0) { - const questFinishChat = group.sendChat(`\`${shared.i18n.t('chatBossDefeated', {bossName: quest.boss.name('en')}, 'en')}\``, null, null, { - type: 'boss_defeated', - quest: quest.key, + const questFinishChat = group.sendChat({ + message: `\`${shared.i18n.t('chatBossDefeated', {bossName: quest.boss.name('en')}, 'en')}\``, + info: { + type: 'boss_defeated', + quest: quest.key, + }, }); promises.push(questFinishChat.save()); @@ -1156,11 +1197,14 @@ schema.methods._processCollectionQuest = async function processCollectionQuest ( }, []); foundText = foundText.join(', '); - const foundChat = group.sendChat(`\`${shared.i18n.t('chatFindItems', {username: user.profile.name, items: foundText}, 'en')}\``, null, null, { - type: 'user_found_items', - user: user.profile.name, - quest: quest.key, - items: itemsFound, + const foundChat = group.sendChat({ + message: `\`${shared.i18n.t('chatFindItems', {username: user.profile.name, items: foundText}, 'en')}\``, + info: { + type: 'user_found_items', + user: user.profile.name, + quest: quest.key, + items: itemsFound, + }, }); group.markModified('quest.progress.collect'); @@ -1174,8 +1218,11 @@ schema.methods._processCollectionQuest = async function processCollectionQuest ( } await group.finishQuest(quest); - const allItemsFoundChat = group.sendChat(`\`${shared.i18n.t('chatItemQuestFinish', 'en')}\``, null, null, { - type: 'all_items_found', + const allItemsFoundChat = group.sendChat({ + message: `\`${shared.i18n.t('chatItemQuestFinish', 'en')}\``, + info: { + type: 'all_items_found', + }, }); const promises = [group.save(), foundChat.save(), allItemsFoundChat.save()]; @@ -1237,9 +1284,12 @@ schema.statics.tavernBoss = async function tavernBoss (user, progress) { const chatPromises = []; if (tavern.quest.progress.hp <= 0) { - const completeChat = tavern.sendChat(quest.completionChat('en'), null, null, { - type: 'tavern_quest_completed', - quest: quest.key, + const completeChat = tavern.sendChat({ + message: quest.completionChat('en'), + info: { + type: 'tavern_quest_completed', + quest: quest.key, + }, }); chatPromises.push(completeChat.save()); await tavern.finishQuest(quest); @@ -1269,17 +1319,23 @@ schema.statics.tavernBoss = async function tavernBoss (user, progress) { } if (!scene) { - const tiredChat = tavern.sendChat(`\`${shared.i18n.t('tavernBossTired', {rageName: quest.boss.rage.title('en'), bossName: quest.boss.name('en')}, 'en')}\``, null, null, { - type: 'tavern_boss_rage_tired', - quest: quest.key, + const tiredChat = tavern.sendChat({ + message: `\`${shared.i18n.t('tavernBossTired', {rageName: quest.boss.rage.title('en'), bossName: quest.boss.name('en')}, 'en')}\``, + info: { + type: 'tavern_boss_rage_tired', + quest: quest.key, + }, }); chatPromises.push(tiredChat.save()); tavern.quest.progress.rage = 0; // quest.boss.rage.value; } else { - const rageChat = tavern.sendChat(quest.boss.rage[scene]('en'), null, null, { - type: 'tavern_boss_rage', - quest: quest.key, - scene, + const rageChat = tavern.sendChat({ + message: quest.boss.rage[scene]('en'), + info: { + type: 'tavern_boss_rage', + quest: quest.key, + scene, + }, }); chatPromises.push(rageChat.save()); tavern.quest.extra.worldDmg[scene] = true; @@ -1292,9 +1348,12 @@ schema.statics.tavernBoss = async function tavernBoss (user, progress) { } if (quest.boss.desperation && tavern.quest.progress.hp < quest.boss.desperation.threshold && !tavern.quest.extra.desperate) { - const progressChat = tavern.sendChat(quest.boss.desperation.text('en'), null, null, { - type: 'tavern_boss_desperation', - quest: quest.key, + const progressChat = tavern.sendChat({ + message: quest.boss.desperation.text('en'), + info: { + type: 'tavern_boss_desperation', + quest: quest.key, + }, }); chatPromises.push(progressChat.save()); tavern.quest.extra.desperate = true;