BetterDiscordApp-v2/client/src/builtin/Emotes/EmoteAc.js

105 lines
3.6 KiB
JavaScript

/**
* BetterDiscord Emote Autocomplete Module
* Copyright (c) 2015-present Jiiks/JsSucks - https://github.com/Jiiks / https://github.com/JsSucks
* All rights reserved.
* https://betterdiscord.net
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import { Settings } from 'modules';
import BuiltinModule from '../BuiltinModule';
import EmoteModule, { EMOTE_SOURCES } from './EmoteModule';
import GlobalAc from 'autocomplete';
import { BdContextMenu } from 'ui';
export default new class EmoteAc extends BuiltinModule {
/* Getters */
get moduleName() { return 'EmoteAC' }
get settingPath() { return ['emotes', 'default', 'emoteac'] }
async enabled(e) {
GlobalAc.add(';', this);
window.removeEventListener('contextmenu', this.acCm);
window.addEventListener('contextmenu', this.acCm);
}
disabled(e) {
GlobalAc.remove(';');
window.removeEventListener('contextmenu', this.acCm);
}
/* Methods */
acCm(e) {
const row = e.target.closest('.bd-emotAc');
if (!row) return;
const img = row.querySelector('img');
if (!img || !img.alt) return;
BdContextMenu.show(e, [
{
text: 'Test',
items: [
{
text: 'Favourite',
type: 'toggle',
checked: EmoteModule.isFavourite(img.alt.replace(/;/g, '')),
onChange: checked => {
if (!img || !img.alt) return;
const emote = img.alt.replace(/;/g, '');
if (!checked) return EmoteModule.removeFavourite(emote), false;
return EmoteModule.addFavourite(emote), true;
}
}
]
}
]);
}
/**
* Search for autocomplete
* @param {any} regex
*/
acsearch(regex) {
const acType = Settings.getSetting('emotes', 'default', 'emoteactype').value;
if (regex.length <= 0) {
return {
type: 'imagetext',
title: [`Your ${acType ? 'most used' : 'favourite'} emotes`, '', `${acType ? 'Favourites' : 'Most Used'}`],
items: EmoteModule[acType ? 'mostUsed' : 'favourites'].sort((a, b) => b.useCount - a.useCount).map(mu => {
return {
key: acType ? mu.key : mu.name,
value: {
src: EMOTE_SOURCES[mu.type].replace(':id', mu.id),
replaceWith: `;${acType ? mu.key : mu.name};`,
hint: mu.useCount ? `Used ${mu.useCount} times` : null
}
}
}),
extraClasses: ['bd-emotAc']
}
}
const results = EmoteModule.search(regex);
return {
type: 'imagetext',
title: ['Matching', regex.length],
items: results.map(result => {
result.value.src = EMOTE_SOURCES[result.value.type].replace(':id', result.value.id);
result.value.replaceWith = `;${result.key};`;
return result;
}),
extraClasses: ['bd-emotAc']
}
}
toggle(sterm) {
if (sterm.length > 1) return false;
Settings.getSetting('emotes', 'default', 'emoteactype').value = !Settings.getSetting('emotes', 'default', 'emoteactype').value;
return true;
}
}