munar-plugin-karma
Version:
Munar plugin that allows users to give each other internet points.
378 lines (322 loc) • 13.2 kB
JavaScript
;
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;