11import Discord from 'discord.js' ;
22import { polishPlurals } from 'polish-plurals' ;
3+ import Bluebird from 'bluebird' ;
34
45import {
56 getEmojiForKarmaValue ,
67 getKarmaForMember ,
7- getKarmaForMembers ,
8+ getKarmaForAllMembers ,
89 KarmaAgg ,
10+ getKarmaForMembers ,
911} from '../data/karma' ;
1012import { getKarmaCollection , initDb } from '../db' ;
1113import type { Command } from '../types' ;
1214
1315export const KARMA_REGEX = new RegExp (
14- `^${ Discord . MessageMentions . USERS_PATTERN . source } \\s*\\+\\+\\s*(?<description>.*) $` ,
16+ `^( ${ Discord . MessageMentions . USERS_PATTERN . source } \\s*)+ \\+\\+\\s*$` ,
1517) ;
1618
1719const addKarma : Command = {
1820 name : '++' ,
1921 description : 'Podziękuj użytkownikom wpisując `@nazwa ++`' ,
20- args : false ,
21- cooldown : 10 ,
22+ args : 'optional' ,
23+ cooldown : 5 ,
2224 async execute ( msg ) {
23- const member = await msg . mentions . members ?. first ( ) ?. fetch ( ) ;
24- if ( ! member ) {
25+ if ( ! msg . mentions . members ?. size ) {
2526 return null ;
2627 }
2728
29+ const db = await initDb ( ) ;
30+ const karmaCollection = getKarmaCollection ( db ) ;
31+
2832 const from = msg . author . id ;
29- const to = member . id ;
3033
31- if ( from === to ) {
34+ const membersToReward = await Bluebird . resolve ( Array . from ( msg . mentions . members . values ( ) ) )
35+ . map ( ( m ) => m . fetch ( ) )
36+ . filter ( ( m ) => m && m . id !== from ) ;
37+
38+ if ( membersToReward . length === 0 ) {
3239 return null ;
3340 }
3441
35- const db = await initDb ( ) ;
36- const karmaCollection = getKarmaCollection ( db ) ;
37-
38- await karmaCollection . insertOne ( {
39- from,
40- to,
41- createdAt : new Date ( ) ,
42- value : 1 ,
43- } ) ;
42+ await karmaCollection . insertMany (
43+ membersToReward . map ( ( m ) => {
44+ return {
45+ from,
46+ to : m . id ,
47+ createdAt : new Date ( ) ,
48+ value : 1 ,
49+ } ;
50+ } ) ,
51+ ) ;
4452
45- const agg = await getKarmaForMember ( to , db ) ;
46- const value = agg ?. value ?? 0 ;
53+ const membersKarma = await getKarmaForMembers (
54+ db ,
55+ membersToReward . map ( ( m ) => m . id ) ,
56+ ) ;
4757
48- return msg . channel . send (
49- `${ msg . author . toString ( ) } podziękował(a) ${ member . toString ( ) } ! Karma ${ member . toString ( ) } wynosi ${ value . toFixed (
58+ const messages = membersKarma . map ( ( { value, _id } ) => {
59+ const member = membersToReward . find ( ( m ) => m . id === _id ) ;
60+ return `${ msg . author . toString ( ) } podziękował(a) ${ member ?. toString ( ) } ! Karma ${ member ?. toString ( ) } wynosi ${ value . toFixed (
5061 2 ,
51- ) } ${ getEmojiForKarmaValue ( value ) } `,
52- ) ;
62+ ) } ${ getEmojiForKarmaValue ( value ) } `;
63+ } ) ;
64+
65+ return msg . channel . send ( messages . join ( '\n' ) ) ;
5366 } ,
5467} ;
5568
5669const karma : Command = {
5770 name : 'karma' ,
5871 description : 'Sprawdź ile kto ma pkt. karmy.' ,
59- args : false ,
72+ args : 'optional' ,
6073 async execute ( msg ) {
6174 const member = await msg . mentions . members ?. first ( ) ?. fetch ( ) ;
6275
@@ -72,7 +85,7 @@ const karma: Command = {
7285 `${ member . displayName } ma ${ value . toFixed ( 2 ) } ${ pkt } karmy ${ getEmojiForKarmaValue ( value ) } ` ,
7386 ) ;
7487 } else {
75- const agg = await getKarmaForMembers ( db ) ;
88+ const agg = await getKarmaForAllMembers ( db ) ;
7689 const data = agg . filter ( ( el ) : el is KarmaAgg => ! ! el ) ;
7790 await Promise . allSettled ( data . map ( ( { _id : memberId } ) => msg . guild ?. members . fetch ( memberId ) ) ) ;
7891
0 commit comments