UNPKG

munar-plugin-karma

Version:

Munar plugin that allows users to give each other internet points.

378 lines (322 loc) 13.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _munarCore = require("munar-core"); var _randomItem = _interopRequireDefault(require("random-item")); var _moment = _interopRequireDefault(require("moment")); var utils = _interopRequireWildcard(require("./utils")); var _Karma = _interopRequireDefault(require("./Karma")); var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _class, _class2, _temp; function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; } const debug = require('debug')('munar:karma'); let UserKarma = (_dec = (0, _munarCore.command)('karma', { description: 'Show a user\'s karma.', arguments: [_munarCore.command.arg.user(), _munarCore.command.arg.string()] }), _dec2 = (0, _munarCore.command)('karmawhores', { description: 'Show the top 5 most popular users.', arguments: [_munarCore.command.arg.string()] }), _dec3 = (0, _munarCore.command)('bump', { description: 'Increase someone\'s karma.', arguments: [_munarCore.command.arg.user()] }), _dec4 = (0, _munarCore.command)('thump', { description: 'Decrease someone\'s karma.', arguments: [_munarCore.command.arg.user()] }), _dec5 = (0, _munarCore.command)('bitch', { description: 'Show the user who has given you the most karma recently.', arguments: [_munarCore.command.arg.string()] }), _dec6 = (0, _munarCore.command)('pimp', { description: 'Show the user who has received the most karma from you recently.', arguments: [_munarCore.command.arg.string()] }), _dec7 = (0, _munarCore.command)('fistbump', { description: 'Show a random bump.' }), _dec8 = (0, _munarCore.command)('fistthump', { description: 'Show a random thump.' }), (_class = (_temp = _class2 = class UserKarma extends _munarCore.Plugin { constructor(bot, options) { super(bot, options); this.models({ Karma: _Karma.default }); } async karma(message, username, time = 'w') { const User = this.model('User'); const Karma = this.model('Karma'); let self = false; if (username && /(^[dwmf]$)|(^\d+$)/.test(username)) { self = true; time = username; } const since = utils.spanToTime(time); const hours = (0, _moment.default)().diff(since, 'hours'); const allTime = time === 'f'; if (username && username.charAt(0) === '@') username = username.slice(1); if (!self && username) { const adapter = message.source.getAdapterName(); const other = message.source.getUserByName(username); let user; if (other) { user = await User.from(other); } if (!user) { user = await this.bot.findUser(username, { adapter: adapter }); } if (!user) { message.reply(`I don't know ${username} yet`); return; } const karmaList = await Karma.find({ createdAt: { $gte: since.toDate() }, target: user._id }).select('amount'); const karma = karmaList.reduce((a, b) => a + b.amount, 0); let msg = `${user.username} has ${karma} karma`; if (!allTime) msg += ` from the past ${utils.days(hours)}`; message.reply(`${msg}.`); } else { const user = await User.from(message.user); if (!user) { message.reply('who are you?'); return; } const karmaList = await Karma.find({ createdAt: { $gte: since.toDate() }, target: user._id }).select('amount'); const karma = karmaList.reduce((a, b) => a + b.amount, 0); let msg = `you have ${karma} karma`; if (!allTime) msg += ` from the past ${utils.days(hours)}`; message.reply(`${msg}.`); } } async karmawhores(message, time = 'w') { const User = this.model('User'); const Karma = this.model('Karma'); // stole all this shit from !mostplayed in MediaStats const since = utils.spanToTime(time); const hours = (0, _moment.default)().diff(since, 'hours'); const allTime = time === 'f'; const karmaList = await Karma.aggregate().match({ createdAt: { $gte: since.toDate() } }).group({ _id: '$target', karma: { $sum: '$amount' } }).sort({ karma: -1 }).limit(5).exec(); if (karmaList.length === 0) { message.reply('none of you like each other T_T'); } else { let karmas = {}; karmaList.forEach(k => { karmas[k._id] = k.karma; }); const users = await User.where('_id').in(Object.keys(karmas)).lean(); users.forEach(model => { model.karma = karmas[model._id]; }); users.sort((a, b) => a.karma > b.karma ? -1 : 1); let response = 'Karma leaders'; if (!allTime) response += ` over the last ${utils.days(hours)}`; response += ':\n' + users.map((u, rank) => `${rank + 1} - ${u.username}: ${u.karma}`).join('\n'); message.reply(response); } } async bump(message, username, ...reason) { const User = this.model('User'); const Karma = this.model('Karma'); const { user } = message; if (!username) { message.reply('You must provide a user to bump'); return; } if (username.charAt(0) === '@') username = username.slice(1); let other = message.source.getUserByName(username); if (!other) { message.reply('That\'s not a real person…'); return; } if (other.id === user.id) { message.reply('Nice try, smartass!'); return; } debug('karma bump', `${other.username} (${other.id})`); const target = await User.from(other); const giver = await User.from(user); if (target) { let bump = new Karma({ target, giver }); if (reason && reason.length > 0) { bump.reason = reason.join(' '); } await bump.save(); if (reason && reason.length > 0) { message.send(`@${user.username} bumped @${other.username}\'s karma ${reason.join(' ')}`); } else { message.send(`@${user.username} bumped @${other.username}\'s karma!`); } return target; } } async thump(message, username, ...reason) { const User = this.model('User'); const Karma = this.model('Karma'); const { user } = message; if (!username) { debug('karma thump no username'); message.reply('You must provide a user to thump'); return; } if (username.charAt(0) === '@') username = username.slice(1); let other = message.source.getUserByName(username); if (!other) { message.reply('That\'s not a real person…'); return; } if (other.id === user.id) { message.reply('Whatever you want'); } const target = await User.from(other); const giver = await User.from(user); if (target) { let thump = new Karma({ target, giver, amount: -1 }); if (reason && reason.length > 0) { thump.reason = reason.join(' '); } await thump.save(); if (reason && reason.length > 0) { message.send(`@${user.username} thumped @${other.username}\'s karma ${reason.join(' ')}`); } else { message.send(`@${user.username} thumped @${other.username}\'s karma!`); } return target; } } async bitch(message, time = 'w') { const User = this.model('User'); const Karma = this.model('Karma'); const since = utils.spanToTime(time); const hours = (0, _moment.default)().diff(since, 'hours'); const allTime = time === 'f'; const user = await User.from(message.user); const karmaList = await Karma.aggregate().match({ target: user._id, giver: { $ne: 0 }, createdAt: { $gte: since.toDate() } }).group({ _id: '$giver', karma: { $sum: '$amount' } }).sort({ karma: -1 }).exec(); if (karmaList.length === 0) { let msg = 'you have no bitches'; if (!allTime) msg += ` from the past ${utils.days(hours)}`; message.reply(`${msg}. :cry:`); } else { let karma = karmaList[0].karma; const usar = await User.findById(karmaList[0]._id); let msg = `${usar.username} is your bitch. They gave you ${karma} karma`; if (!allTime) msg += ` in the past ${utils.days(hours)}`; message.reply(`${msg}.`); } } async pimp(message, time = 'w') { const User = this.model('User'); const Karma = this.model('Karma'); const since = utils.spanToTime(time); const hours = (0, _moment.default)().diff(since, 'hours'); const allTime = time === 'f'; const user = await User.from(message.user); const karmaList = await Karma.aggregate().match({ giver: user._id, target: { $ne: 0 }, createdAt: { $gte: since.toDate() } }).group({ _id: '$target', karma: { $sum: '$amount' } }).sort({ karma: -1 }).exec(); if (karmaList.length === 0) { let msg = 'you have been noone\'s bitch'; if (!allTime) msg += ` in the past ${utils.days(hours)}`; message.reply(`${msg}. :smirk:`); } else { let karma = karmaList[0].karma; const usar = await User.findById(karmaList[0]._id); let msg = `${usar.username} is your pimp. You gave them ${karma} karma`; if (!allTime) msg += ` in the past ${utils.days(hours)}`; message.reply(`${msg}.`); } } async fistbump(message) { const User = this.model('User'); const Karma = this.model('Karma'); const user = await User.from(message.user); const reasonList = await Karma.find({ target: user._id, reason: { $ne: null } }).where('amount').gt(0).populate('giver'); if (reasonList.length > 0) { let chosen = (0, _randomItem.default)(reasonList); message.reply(`you were bumped by @${chosen.giver.username} ` + `"${chosen.reason}" ${(0, _moment.default)(chosen.createdAt).fromNow()}`); } else { message.reply('no one can explain your mysterious allure.'); } } async fistthump(message) { const User = this.model('User'); const Karma = this.model('Karma'); const user = await User.from(message.user); const reasonList = await Karma.find({ target: user._id, reason: { $ne: null } }).where('amount').lt(0).populate('giver'); if (reasonList.length > 0) { let chosen = (0, _randomItem.default)(reasonList); message.reply(`you were thumped by @${chosen.giver.username} ` + `"${chosen.reason}" ${(0, _moment.default)(chosen.createdAt).fromNow()}`); } else { message.reply('no reason was ever given.'); } } }, _class2.description = 'Keeps track of users\' earned internet points.', _temp), (_applyDecoratedDescriptor(_class.prototype, "karma", [_dec], Object.getOwnPropertyDescriptor(_class.prototype, "karma"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, "karmawhores", [_dec2], Object.getOwnPropertyDescriptor(_class.prototype, "karmawhores"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, "bump", [_dec3], Object.getOwnPropertyDescriptor(_class.prototype, "bump"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, "thump", [_dec4], Object.getOwnPropertyDescriptor(_class.prototype, "thump"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, "bitch", [_dec5], Object.getOwnPropertyDescriptor(_class.prototype, "bitch"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, "pimp", [_dec6], Object.getOwnPropertyDescriptor(_class.prototype, "pimp"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, "fistbump", [_dec7], Object.getOwnPropertyDescriptor(_class.prototype, "fistbump"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, "fistthump", [_dec8], Object.getOwnPropertyDescriptor(_class.prototype, "fistthump"), _class.prototype)), _class)); exports.default = UserKarma;