Skip to content

Commit ddfe39e

Browse files
authored
Merge pull request #46 from Yey007/fix/concurrency-improvements
Improved concurrency
2 parents bafacec + 899f6fa commit ddfe39e

File tree

11 files changed

+60
-52
lines changed

11 files changed

+60
-52
lines changed

src/services/interface/commandexecutor.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,20 +68,20 @@ export class CommandExecutor {
6868
accepts at most ${allLength} ${allPlural} but you provided ${args.length - 1}.`;
6969

7070
embed.setFooter(`Use "help ${args[0]}" for more information.`);
71-
checkedSend(message.channel, embed);
71+
await checkedSend(message.channel, embed);
7272
Logger.verbose(
7373
`Execution of command "${trimmed}" aborted because number of arguments was wrong`,
7474
LogOrigin.Discord
7575
);
7676
return;
7777
}
7878
Logger.verbose(`Executing command "${trimmed}"`, LogOrigin.Discord);
79-
cmd.execute(message, args);
79+
await cmd.execute(message, args);
8080
} else {
8181
const embed = this.maker.makeWarning();
8282
embed.title = 'Command not found';
8383
embed.description = `The command "${args[0]}" does not exist.`;
84-
checkedSend(message.channel, embed);
84+
await checkedSend(message.channel, embed);
8585
Logger.verbose(
8686
`Execution of command "${trimmed}" aborted because command was not found`,
8787
LogOrigin.Discord

src/services/interface/commands/help.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@ export class HelpCommand extends BotCommand {
1717

1818
public async execute(message: Message, args: string[]): Promise<void> {
1919
if (args[1]) {
20-
this.specificHelp(message, args[1]);
20+
await this.specificHelp(message, args[1]);
2121
} else {
22-
this.genericHelp(message);
22+
await this.genericHelp(message);
2323
}
2424
}
2525

26-
private genericHelp(message: Message) {
26+
private async genericHelp(message: Message) {
2727
const e = this.maker.makeInfo();
2828
e.title = 'Help';
2929

@@ -45,12 +45,12 @@ export class HelpCommand extends BotCommand {
4545
`You can address the bot in two ways\n\n1. Mention the bot at the start of your message, like this: **${message.guild.me.toString()} command**\n2. Use the prefix (! by default), like this: **!command**`
4646
);
4747

48-
checkedSend(message.channel, e);
48+
await checkedSend(message.channel, e);
4949
Logger.verbose(`Generic help sent in channel with id ${message.channel.id}`, LogOrigin.Discord);
5050
}
5151

5252
//Argument order, which arguments are required etc.
53-
private specificHelp(message: Message, command: string) {
53+
private async specificHelp(message: Message, command: string) {
5454
const cmd = this.mapper.map(command);
5555
if (cmd !== undefined) {
5656
const embed = this.maker.makeInfo();
@@ -71,13 +71,13 @@ export class HelpCommand extends BotCommand {
7171
if (argumentString !== '') {
7272
embed.addField('Arguments', argumentString);
7373
}
74-
checkedSend(message.channel, embed);
74+
await checkedSend(message.channel, embed);
7575
Logger.verbose(`Specific help sent in channel ${message.channel.id}`, LogOrigin.Discord);
7676
} else {
7777
const embed = this.maker.makeWarning();
7878
embed.title = 'Command not found';
7979
embed.description = `The command "${command}" does not exist.`;
80-
checkedSend(message.channel, embed);
80+
await checkedSend(message.channel, embed);
8181
Logger.verbose(
8282
`Command not found while trying to send specific help in channel with id ${message.channel.id}`,
8383
LogOrigin.Discord

src/services/interface/commands/join.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,20 @@ export class ChannelJoinCommand extends BotCommand {
2727
const embed = this.embedMaker.makeWarning();
2828
embed.title = 'Channel Unavailable';
2929
embed.description = "I can't join that channel. Please make sure I have the correct permissions.";
30-
checkedSend(message.channel, embed);
30+
await checkedSend(message.channel, embed);
3131
Logger.verbose(`Unable to join voice channel with id ${vc.channel.id}`, LogOrigin.Discord);
3232
return;
3333
}
3434

3535
//Due to the wacky API on recieving audio, something must be sent before we can recieve anything
3636
const dispatcher = vc.play(process.cwd() + '/resources/dummy.mp3', { volume: 0 });
3737

38-
dispatcher.on('error', () => {
38+
dispatcher.on('error', async () => {
3939
const embed = this.embedMaker.makeError();
4040
embed.title = 'Transcription Error';
4141
embed.description =
4242
'There was a problem recieving audio from this channel. If this keeps happening, please contact the author.';
43-
checkedSend(message.channel, embed);
43+
await checkedSend(message.channel, embed);
4444
Logger.warn(`Unable to dispatch audio in voice channel with id ${vc.channel.id}`, LogOrigin.Discord);
4545
});
4646
}

src/services/interface/commands/prefix.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,24 +37,25 @@ export class PrefixCommand extends BotCommand {
3737
if (prefix.length > 5) {
3838
const embed = this.maker.makeWarning();
3939
embed.description = 'Prefix cannot be more than 5 characters.';
40-
checkedSend(message.channel, embed);
40+
await checkedSend(message.channel, embed);
4141
return;
4242
}
43-
await this.repo.save<GuildSettings>({
43+
const repoSave = this.repo.save<GuildSettings>({
4444
guildId: message.guild.id,
4545
prefix: prefix
4646
});
4747
const embed = this.maker.makeSuccess();
4848
embed.description = `Prefix set to \`${prefix}\``;
49-
checkedSend(message.channel, embed);
49+
const send = checkedSend(message.channel, embed);
50+
await Promise.all([repoSave, send]);
5051
Logger.verbose(`Sent prefix set success message in channel with id ${message.channel.id}`, LogOrigin.Discord);
5152
}
5253

5354
private async prefixGet(message: Message): Promise<void> {
5455
const embed = this.maker.makeInfo();
5556
const settings = await this.repo.findOneOrDefaults(message.guild.id);
5657
embed.description = `The prefix is currently \`${settings.prefix}\``;
57-
checkedSend(message.channel, embed);
58+
await checkedSend(message.channel, embed);
5859
Logger.verbose(`Sent prefix get message in channel with id ${message.channel.id}`, LogOrigin.Discord);
5960
}
6061

src/services/interface/commands/recordingpermission.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,32 +29,34 @@ export class RecordingPermissionCommand extends BotCommand {
2929
public async execute(message: Message, args: string[]): Promise<void> {
3030
if (args[1]) {
3131
const maker = this.maker;
32-
const success = function () {
32+
const success = async function () {
3333
const embed = maker.makeSuccess();
3434
embed.description = `Recording permission set to \`${args[1]}\``;
35-
checkedSend(message.channel, embed);
35+
await checkedSend(message.channel, embed);
3636
Logger.verbose(
3737
`Sent recording permission set success message in channel with id ${message.channel.id}`,
3838
LogOrigin.Discord
3939
);
4040
};
4141

4242
if (args[1] === 'accept') {
43-
await this.repo.save<UserSettings>({
43+
const repoSave = this.repo.save<UserSettings>({
4444
userId: message.member.user.id,
4545
permission: RecordingPermissionState.Consent
4646
});
47-
success();
47+
const successSend = success();
48+
await Promise.all([repoSave, successSend]);
4849
return;
4950
} else if (args[1] === 'deny') {
50-
await this.repo.save<UserSettings>({
51+
const repoSave = this.repo.save<UserSettings>({
5152
userId: message.member.user.id,
5253
permission: RecordingPermissionState.NoConsent
5354
});
54-
success();
55+
const successSend = success();
56+
await Promise.all([repoSave, successSend]);
5557
return;
5658
}
57-
message.channel.send('Invalid setting. Acceptable arguments are `accept` and `deny`.');
59+
await checkedSend(message.channel, 'Invalid setting. Acceptable arguments are `accept` and `deny`.');
5860
Logger.verbose(
5961
`Sent recording permission set failure message in channel with id ${message.channel.id}`,
6062
LogOrigin.Discord
@@ -64,7 +66,7 @@ export class RecordingPermissionCommand extends BotCommand {
6466
const settings = await this.repo.findOneOrDefaults(message.member.user.id);
6567
const perm = settings.permission === RecordingPermissionState.Consent ? 'accept' : 'deny';
6668
embed.description = `Your recording preference is currently set to \`${perm}\``;
67-
checkedSend(message.channel, embed);
69+
await checkedSend(message.channel, embed);
6870
Logger.verbose(
6971
`Sent recording permission get message in channel with id ${message.channel.id}`,
7072
LogOrigin.Discord

src/services/interface/commands/transcriptchannel.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,30 +46,31 @@ export class TranscriptChannelCommand extends BotCommand {
4646
} else {
4747
const embed = this.maker.makeWarning();
4848
embed.description = 'Invalid operation. Valid operations are `create`, `remove`, and `all`';
49-
checkedSend(message.channel, embed);
49+
await checkedSend(message.channel, embed);
5050
}
5151
}
5252

5353
@managerOrAdminRequired
5454
public async setChannel(message: Message, args: string[]): Promise<void> {
5555
const vc = message.guild.channels.cache.find((x) => x.name === args[2] && x.type === 'voice');
5656
if (vc !== undefined) {
57-
await this.repo.save<TranscriptionPair>({
57+
const repoSave = this.repo.save<TranscriptionPair>({
5858
voiceId: vc.id,
5959
textId: message.channel.id,
6060
guildId: message.guild.id
6161
});
6262
const embed = this.maker.makeSuccess();
6363
embed.description = `Set the transcription channel for \`${args[2]}\` to this channel`;
64-
checkedSend(message.channel, embed);
64+
const send = checkedSend(message.channel, embed);
65+
await Promise.all([repoSave, send]);
6566
Logger.verbose(
6667
`Sent transcription channel set success message in channel with id ${message.channel.id}`,
6768
LogOrigin.Discord
6869
);
6970
} else {
7071
const embed = this.maker.makeWarning();
7172
embed.description = `Voice channel \`${args[2]}\` not found`;
72-
checkedSend(message.channel, embed);
73+
await checkedSend(message.channel, embed);
7374
Logger.verbose(
7475
`Sent transcription channel set failure message in channel with id ${message.channel.id}`,
7576
LogOrigin.Discord
@@ -89,18 +90,19 @@ export class TranscriptChannelCommand extends BotCommand {
8990
return;
9091
}
9192

92-
await this.repo.delete({ voiceId: vc.id });
93+
const del = this.repo.delete({ voiceId: vc.id });
9394
const embed = this.maker.makeSuccess();
9495
embed.description = `Removed the transcription channel for \`${args[2]}\``;
95-
checkedSend(message.channel, embed);
96+
const send = checkedSend(message.channel, embed);
97+
await Promise.all([del, send]);
9698
Logger.verbose(
9799
`Sent transcription channel remove success message in channel with id ${message.channel.id}`,
98100
LogOrigin.Discord
99101
);
100102
} else {
101103
const embed = this.maker.makeWarning();
102104
embed.description = `Voice channel \`${args[2]}\` not found`;
103-
checkedSend(message.channel, embed);
105+
await checkedSend(message.channel, embed);
104106
Logger.verbose(
105107
`Sent transcription channel remove failure message in channel with id ${message.channel.id}`,
106108
LogOrigin.Discord
@@ -123,7 +125,7 @@ export class TranscriptChannelCommand extends BotCommand {
123125
for (const namePair of allNames) {
124126
embed.description += `${namePair.voice} :arrow_right: ${namePair.text}\n`;
125127
}
126-
checkedSend(message.channel, embed);
128+
await checkedSend(message.channel, embed);
127129
}
128130

129131
public get help(): string {

src/services/permissions/rolemanager.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import { LogOrigin } from '../logging/logorigin';
77
export class RoleManager {
88
public readonly roleName = 'TranscriberBot Manager';
99

10-
public create(guild: Guild): Promise<Role> {
10+
public async create(guild: Guild): Promise<Role> {
1111
const role = guild.roles.cache.find((role) => role.name === this.roleName);
1212
if (!role) {
1313
Logger.verbose(`Creating manager role in guild with id ${guild.id}`, LogOrigin.Discord);
14-
return guild.roles.create({
14+
return await guild.roles.create({
1515
data: {
1616
name: this.roleName,
1717
color: 0x4399b5,
@@ -24,8 +24,6 @@ export class RoleManager {
2424
`Found existing manager role, returning that instead of creating a new one for guild with id ${guild.id}`,
2525
LogOrigin.Discord
2626
);
27-
return new Promise((resolutionFunc: (role: Role) => void) => {
28-
resolutionFunc(role);
29-
});
27+
return role;
3028
}
3129
}

src/services/permissions/rolerequierments.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export function managerOrAdminRequired(
1313
descriptor: TypedPropertyDescriptor<(message: Message, ...args: unknown[]) => Promise<void>>
1414
): void {
1515
const original = descriptor.value;
16-
descriptor.value = function (message: Message, ...args: unknown[]): Promise<void> {
16+
descriptor.value = async function (message: Message, ...args: unknown[]): Promise<void> {
1717
//Dumb but only way
1818
const roleManager = Container.get(RoleManager);
1919
const embedMaker = Container.get(StandardEmbedMaker);
@@ -27,12 +27,12 @@ export function managerOrAdminRequired(
2727
`Allowing execution of restricted command because user with id ${message.member.user.id} had manager role or administrator level access`,
2828
LogOrigin.Discord
2929
);
30-
return original.call(this, message, ...args);
30+
return await original.call(this, message, ...args);
3131
} else {
3232
const embed = embedMaker.makeWarning();
3333
embed.title = 'Permission Denied';
3434
embed.description = `You must have the role \`${roleManager.roleName}\` or be an administrator in order to use this command.`;
35-
checkedSend(message.channel, embed);
35+
await checkedSend(message.channel, embed);
3636
Logger.verbose(
3737
`Did not allow execution of restricted command because user with id ${message.member.user.id} did not have manager role or administrator level access`,
3838
LogOrigin.Discord

src/services/transcription/recpermissiongetter.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,19 @@ export class RecPermissionGetter {
2929
}
3030

3131
private async askUser(user: User): Promise<RecordingPermissionState> {
32-
await this.userSettingsRepo.save<UserSettings>({
32+
const save = this.userSettingsRepo.save<UserSettings>({
3333
userId: user.id,
3434
permission: RecordingPermissionState.Unknown
3535
});
3636

3737
let dm: DMChannel;
3838
try {
3939
dm = await user.createDM();
40-
await dm.send(
40+
const send = dm.send(
4141
"Hey! I'm currently transcribing audio from the voice channel you're in, but before I can transcribe your voice," +
4242
' I need your permission. Type `!accept` to accept and `!deny` to deny.'
4343
);
44+
await Promise.all([save, send]);
4445
Logger.verbose(
4546
`Asked for recording permission from user with id ${user.id}. Awaiting response...`,
4647
LogOrigin.Transcription
@@ -72,26 +73,28 @@ export class RecPermissionGetter {
7273
}
7374
);
7475
} catch (error) {
75-
dm.send('Assumed no permission after 30 seconds.');
76+
await dm.send('Assumed no permission after 30 seconds.');
7677
Logger.verbose(`No accept or deny message recieved from user with id ${user.id}`, LogOrigin.Transcription);
7778
return RecordingPermissionState.NoConsent;
7879
}
7980

8081
const preference = collected.first().content;
8182
if (preference === '!accept') {
82-
await this.userSettingsRepo.save<UserSettings>({
83+
const save = this.userSettingsRepo.save<UserSettings>({
8384
userId: user.id,
8485
permission: RecordingPermissionState.Consent
8586
});
86-
dm.send(`Preference set to \`${preference.slice(1)}\``);
87+
const send = dm.send(`Preference set to \`${preference.slice(1)}\``);
88+
await Promise.all([save, send]);
8789
Logger.verbose(`Recieved accept message from user with id ${user.id}`, LogOrigin.Transcription);
8890
return RecordingPermissionState.Consent;
8991
} else {
90-
await this.userSettingsRepo.save<UserSettings>({
92+
const save = this.userSettingsRepo.save<UserSettings>({
9193
userId: user.id,
9294
permission: RecordingPermissionState.NoConsent
9395
});
94-
dm.send(`Preference set to \`${preference.slice(1)}\``);
96+
const send = dm.send(`Preference set to \`${preference.slice(1)}\``);
97+
await Promise.all([save, send]);
9598
Logger.verbose(`Recieved deny message from user with id ${user.id}`, LogOrigin.Transcription);
9699
return RecordingPermissionState.NoConsent;
97100
}

src/services/transcription/transcriptionmanager.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { RecordingPermissionState } from '../interface/misc/misctypes';
88
import { Logger } from '../logging/logger';
99
import { LogOrigin } from '../logging/logorigin';
1010
import { Service } from 'typedi';
11+
import { checkedSend } from '../interface/misc/checkedsend';
1112

1213
@Service()
1314
export class TranscriptionManager {
@@ -34,9 +35,9 @@ export class TranscriptionManager {
3435

3536
const channel = await this.transcriptionChannelGetter.get(member.guild, vc.channel.id);
3637
if (channel !== undefined) {
37-
this.transcriber.transcribe(stream, function (words: string, err: unknown) {
38+
this.transcriber.transcribe(stream, async function (words: string, err: unknown) {
3839
if (err === undefined) {
39-
s.send(member, channel, vc.channel.name, words);
40+
await s.send(member, channel, vc.channel.name, words);
4041
Logger.verbose(
4142
`Transcription succeeded for user with id ${member.user.id} in voice channel with id ${vc.channel.id}`,
4243
LogOrigin.Transcription
@@ -45,7 +46,7 @@ export class TranscriptionManager {
4546
const e = embed.makeWarning();
4647
e.description =
4748
"Problem transcribing audio. This usually doesn't happen, but it's nothing to worry about.";
48-
channel.send(e);
49+
await checkedSend(channel, e);
4950
Logger.verbose(
5051
`Transcription failed for user with id ${member.user.id} in voice channel with id ${vc.channel.id}`,
5152
LogOrigin.Transcription

0 commit comments

Comments
 (0)