Add help command

This commit is contained in:
Max Isom 2020-03-16 22:12:02 -05:00
parent ac21b5657b
commit 426d0b0335
14 changed files with 109 additions and 13 deletions

View file

@ -7,7 +7,10 @@ import Command from '.';
@injectable() @injectable()
export default class implements Command { export default class implements Command {
public name = 'clear'; public name = 'clear';
public description = 'clears all songs in queue (except currently playing)'; public examples = [
['clear', 'clears all songs in queue except currently playing']
];
private readonly queueManager: QueueManager; private readonly queueManager: QueueManager;
constructor(@inject(TYPES.Managers.Queue) queueManager: QueueManager) { constructor(@inject(TYPES.Managers.Queue) queueManager: QueueManager) {

View file

@ -6,7 +6,10 @@ import Command from '.';
@injectable() @injectable()
export default class implements Command { export default class implements Command {
public name = 'config'; public name = 'config';
public description = 'changes various bot settings'; public examples = [
['config prefix !', 'set the prefix to !'],
['config channel music-commands', 'bind the bot to the music-commands channel']
];
public async execute(msg: Message, args: string []): Promise<void> { public async execute(msg: Message, args: string []): Promise<void> {
if (args.length === 0) { if (args.length === 0) {

View file

@ -9,7 +9,10 @@ import Command from '.';
@injectable() @injectable()
export default class implements Command { export default class implements Command {
public name = 'fseek'; public name = 'fseek';
public description = 'forward seek position in currently playing song'; public examples = [
['fseek 10', 'skips forward in current song by 10 seconds']
];
private readonly playerManager: PlayerManager; private readonly playerManager: PlayerManager;
private readonly queueManager: QueueManager; private readonly queueManager: QueueManager;

47
src/commands/help.ts Normal file
View file

@ -0,0 +1,47 @@
import {Message} from 'discord.js';
import {injectable} from 'inversify';
import Command from '.';
import {TYPES} from '../types';
import {Settings} from '../models';
import container from '../inversify.config';
@injectable()
export default class implements Command {
public name = 'help';
public examples = [
['help', 'you don\'t need a description']
];
private commands: Command[] = [];
public async execute(msg: Message, _: string []): Promise<void> {
if (this.commands.length === 0) {
// Lazy load to avoid circular dependencies
this.commands = container.getAll<Command>(TYPES.Command);
}
const settings = await Settings.findOne({where: {guildId: msg.guild!.id}});
if (!settings) {
return;
}
const {prefix} = settings;
const res = this.commands.sort((a, b) => a.name.localeCompare(b.name)).reduce((content, command) => {
content += `**${command.name}**:\n`;
command.examples.forEach(example => {
content += `- \`${prefix}${example[0]}\`: ${example[1]}\n`;
});
content += '\n';
return content;
}, '');
await msg.author.send(res);
await msg.react('🇩');
await msg.react('🇲');
}
}

View file

@ -2,6 +2,6 @@ import {Message} from 'discord.js';
export default interface Command { export default interface Command {
name: string; name: string;
description: string; examples: string[][];
execute: (msg: Message, args: string[]) => Promise<void>; execute: (msg: Message, args: string[]) => Promise<void>;
} }

View file

@ -8,7 +8,10 @@ import Command from '.';
@injectable() @injectable()
export default class implements Command { export default class implements Command {
public name = 'pause'; public name = 'pause';
public description = 'pause currently playing song'; public examples = [
['pause', 'pauses currently playing song']
];
private readonly playerManager: PlayerManager; private readonly playerManager: PlayerManager;
constructor(@inject(TYPES.Managers.Player) playerManager: PlayerManager) { constructor(@inject(TYPES.Managers.Player) playerManager: PlayerManager) {

View file

@ -20,7 +20,16 @@ import Command from '.';
@injectable() @injectable()
export default class implements Command { export default class implements Command {
public name = 'play'; public name = 'play';
public description = 'plays a song'; public examples = [
['play', 'resume paused playback'],
['play https://www.youtube.com/watch?v=dQw4w9WgXcQ', 'plays a YouTube video'],
['play cool music', 'plays the first search result for "cool music" from YouTube'],
['play https://www.youtube.com/watch?list=PLi9drqWffJ9FWBo7ZVOiaVy0UQQEm4IbP', 'adds the playlist to the queue'],
['play https://open.spotify.com/track/3ebXMykcMXOcLeJ9xZ17XH?si=tioqSuyMRBWxhThhAW51Ig', 'plays a song from Spotify'],
['play https://open.spotify.com/album/5dv1oLETxdsYOkS2Sic00z?si=bDa7PaloRx6bMIfKdnvYQw', 'adds all songs from album to the queue'],
['play https://open.spotify.com/playlist/37i9dQZF1DX94qaYRnkufr?si=r2fOVL_QQjGxFM5MWb84Xw', 'adds all songs from playlist to the queue']
];
private readonly queueManager: QueueManager; private readonly queueManager: QueueManager;
private readonly playerManager: PlayerManager; private readonly playerManager: PlayerManager;
private readonly youtube: YouTube; private readonly youtube: YouTube;

View file

@ -7,7 +7,10 @@ import Command from '.';
@injectable() @injectable()
export default class implements Command { export default class implements Command {
public name = 'queue'; public name = 'queue';
public description = 'shows current queue'; public examples = [
['queue', 'shows current queue']
];
private readonly queueManager: QueueManager; private readonly queueManager: QueueManager;
constructor(@inject(TYPES.Managers.Queue) queueManager: QueueManager) { constructor(@inject(TYPES.Managers.Queue) queueManager: QueueManager) {

View file

@ -9,7 +9,11 @@ import Command from '.';
@injectable() @injectable()
export default class implements Command { export default class implements Command {
public name = 'seek'; public name = 'seek';
public description = 'seeks position in currently playing song'; public examples = [
['seek 10', 'seeks to 10 seconds from begining of song'],
['seek 1:30', 'seeks to 1 minute and 30 seconds from begining of song']
];
private readonly playerManager: PlayerManager; private readonly playerManager: PlayerManager;
private readonly queueManager: QueueManager; private readonly queueManager: QueueManager;

View file

@ -6,7 +6,11 @@ import Command from '.';
@injectable() @injectable()
export default class implements Command { export default class implements Command {
public name = 'shortcuts'; public name = 'shortcuts';
public description = 'edit shortcuts'; public examples = [
['shortcuts set s skip', 'aliases `s` to `skip`'],
['shortcuts set party play https://www.youtube.com/watch?v=zK6oOJ1wz8k', 'aliases `party` to a specific play command'],
['shortcuts delete party', 'removes the `party` shortcut']
];
public async execute(msg: Message, args: string []): Promise<void> { public async execute(msg: Message, args: string []): Promise<void> {
if (args.length === 0) { if (args.length === 0) {
@ -19,7 +23,13 @@ export default class implements Command {
} }
// Get prefix for guild // Get prefix for guild
const {prefix} = await Settings.findOne({where: {guildId: msg.guild!.id}}) as Settings; const settings = await Settings.findOne({where: {guildId: msg.guild!.id}});
if (!settings) {
return;
}
const {prefix} = settings;
const res = shortcuts.reduce((accum, shortcut) => { const res = shortcuts.reduce((accum, shortcut) => {
accum += `${prefix}${shortcut.shortcut}: ${shortcut.command}\n`; accum += `${prefix}${shortcut.shortcut}: ${shortcut.command}\n`;

View file

@ -7,7 +7,10 @@ import Command from '.';
@injectable() @injectable()
export default class implements Command { export default class implements Command {
public name = 'shuffle'; public name = 'shuffle';
public description = 'shuffle current queue'; public examples = [
['shuffle', 'shuffles the current queue']
];
private readonly queueManager: QueueManager; private readonly queueManager: QueueManager;
constructor(@inject(TYPES.Managers.Queue) queueManager: QueueManager) { constructor(@inject(TYPES.Managers.Queue) queueManager: QueueManager) {

View file

@ -8,7 +8,10 @@ import Command from '.';
@injectable() @injectable()
export default class implements Command { export default class implements Command {
public name = 'skip'; public name = 'skip';
public description = 'skips current song'; public examples = [
['skip', 'skips the current song']
];
private readonly queueManager: QueueManager; private readonly queueManager: QueueManager;
private readonly playerManager: PlayerManager; private readonly playerManager: PlayerManager;

View file

@ -8,7 +8,10 @@ import Command from '.';
@injectable() @injectable()
export default class implements Command { export default class implements Command {
public name = 'unskip'; public name = 'unskip';
public description = 'go back in the queue'; public examples = [
['unskip', 'goes back in the queue by one song']
];
private readonly queueManager: QueueManager; private readonly queueManager: QueueManager;
private readonly playerManager: PlayerManager; private readonly playerManager: PlayerManager;

View file

@ -24,6 +24,7 @@ import Command from './commands';
import Clear from './commands/clear'; import Clear from './commands/clear';
import Config from './commands/config'; import Config from './commands/config';
import ForwardSeek from './commands/fseek'; import ForwardSeek from './commands/fseek';
import Help from './commands/help';
import Pause from './commands/pause'; import Pause from './commands/pause';
import Play from './commands/play'; import Play from './commands/play';
import QueueCommad from './commands/queue'; import QueueCommad from './commands/queue';
@ -47,6 +48,7 @@ container.bind<QueueManager>(TYPES.Managers.Queue).to(QueueManager).inSingletonS
container.bind<Command>(TYPES.Command).to(Clear).inSingletonScope(); container.bind<Command>(TYPES.Command).to(Clear).inSingletonScope();
container.bind<Command>(TYPES.Command).to(Config).inSingletonScope(); container.bind<Command>(TYPES.Command).to(Config).inSingletonScope();
container.bind<Command>(TYPES.Command).to(ForwardSeek).inSingletonScope(); container.bind<Command>(TYPES.Command).to(ForwardSeek).inSingletonScope();
container.bind<Command>(TYPES.Command).to(Help).inSingletonScope();
container.bind<Command>(TYPES.Command).to(Pause).inSingletonScope(); container.bind<Command>(TYPES.Command).to(Pause).inSingletonScope();
container.bind<Command>(TYPES.Command).to(Play).inSingletonScope(); container.bind<Command>(TYPES.Command).to(Play).inSingletonScope();
container.bind<Command>(TYPES.Command).to(QueueCommad).inSingletonScope(); container.bind<Command>(TYPES.Command).to(QueueCommad).inSingletonScope();