Skip to content

Commit

Permalink
Merge pull request #114 from streamdevs/50-ts-abstract-reaction
Browse files Browse the repository at this point in the history
refactor: new 'Reaction' abstract class
  • Loading branch information
orestes authored Apr 20, 2020
2 parents d663dba + 8079b7f commit 3d221bb
Show file tree
Hide file tree
Showing 7 changed files with 241 additions and 192 deletions.
88 changes: 18 additions & 70 deletions src/reactions/github/ping.ts
Original file line number Diff line number Diff line change
@@ -1,74 +1,22 @@
import { StreamLabs } from '../../services/StreamLabs';
import { TwitchChat } from '../../services/TwitchChat';

interface PingConfig {
streamlabs: StreamLabs;
twitchChat: TwitchChat;
}

interface HandleOptions {
// FIXME: add Payload type
payload: any;
}

export class Ping {
private streamlabs: StreamLabs;
private twitchChat: TwitchChat;

public constructor({ streamlabs, twitchChat }: PingConfig) {
this.streamlabs = streamlabs;
this.twitchChat = twitchChat;
import {
Reaction,
ReactionCanHandleOptions,
ReactionHandleOptions,
} from './reaction';

export class Ping extends Reaction {
canHandle({ payload, event }: ReactionCanHandleOptions): boolean {
return (
event === 'ping' &&
(payload.hook.events.includes('star') ||
payload.hook.events.includes('fork') ||
payload.hook.events.includes('pull_request'))
);
}

private async notifyStreamlabs({ payload }: HandleOptions) {
try {
const streamlabsMessage = `🎉 Your repo *${payload.repository.full_name}* is configured correctly for *${payload.hook.events}* events 🎉`;
await this.streamlabs.alert({
message: streamlabsMessage,
});

return {
notified: true,
message: streamlabsMessage,
};
} catch {
// TODO: add logging

return {
notified: false,
message: '',
};
}
getStreamLabsMessage({ payload }: ReactionHandleOptions): string {
return `🎉 Your repo *${payload.repository.full_name}* is configured correctly for *${payload.hook.events}* events 🎉`;
}

private async notifyTwitch({ payload }: HandleOptions) {
try {
const message = `🎉 Your repo *${payload.repository.full_name}* is configured correctly for *${payload.hook.events}* events 🎉`;
await this.twitchChat.send(message);

return {
notified: true,
message,
};
} catch {
// TODO: add logging

return {
notified: false,
message: '',
};
}
}

public async handle({ payload }: HandleOptions) {
const [streamlabs, twitchChat] = await Promise.all([
this.notifyStreamlabs({ payload }),
this.notifyTwitch({ payload }),
]);

return {
twitchChat,
streamlabs,
};
getTwitchChatMessage({ payload }: ReactionHandleOptions): string {
return `🎉 Your repo *${payload.repository.full_name}* is configured correctly for *${payload.hook.events}* events 🎉`;
}
}
72 changes: 13 additions & 59 deletions src/reactions/github/pull-request-opened.ts
Original file line number Diff line number Diff line change
@@ -1,63 +1,17 @@
import { TwitchChat } from '../../services/TwitchChat';
import { StreamLabs } from '../../services/StreamLabs';

interface HandleOptions {
payload: any;
}

export class PullRequestOpened {
public constructor(
private twitchChat: TwitchChat,
private streamlabs: StreamLabs,
) {}

private async notifyTwitch({ payload }: HandleOptions) {
try {
const message = `*${payload.pull_request.user.login}* just opened a pull request in ${payload.repository.html_url}`;
await this.twitchChat.send(message);

return {
notified: true,
message,
};
} catch {
// TODO: add logging

return {
notified: false,
message: '',
};
}
import {
Reaction,
ReactionCanHandleOptions,
ReactionHandleOptions,
} from './reaction';

export class PullRequestOpened extends Reaction {
canHandle({ payload, event }: ReactionCanHandleOptions): boolean {
return event === 'pull_request' && payload.action === 'opened';
}

public async notifyStreamLabs({ payload }: HandleOptions) {
try {
const message = `*${payload.pull_request.user.login}* just opened a pull request in *${payload.repository.full_name}*`;
await this.streamlabs.alert({ message });

return {
notified: true,
message,
};
} catch {
// TODO: add logging

return {
notified: false,
message: '',
};
}
getStreamLabsMessage({ payload }: ReactionHandleOptions): string {
return `*${payload.pull_request.user.login}* just opened a pull request in *${payload.repository.full_name}*`;
}

public async handle({ payload }: HandleOptions) {
const [twitchChat, streamlabs] = await Promise.all([
this.notifyTwitch({ payload }),
this.notifyStreamLabs({ payload }),
]);

return {
twitchChat,
streamlabs,
};
getTwitchChatMessage({ payload }: ReactionHandleOptions): string {
return `*${payload.pull_request.user.login}* just opened a pull request in ${payload.repository.html_url}`;
}
}
75 changes: 75 additions & 0 deletions src/reactions/github/reaction.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import { StreamLabs } from '../../services/StreamLabs';
import { TwitchChat } from '../../services/TwitchChat';

export interface ReactionHandleOptions {
// FIXME: add Payload type
payload: any;
}

export interface ReactionCanHandleOptions {
payload: any;
event: string;
}

export abstract class Reaction {
public constructor(
private twitchChat: TwitchChat,
private streamlabs: StreamLabs,
) {}

abstract getStreamLabsMessage({ payload }: ReactionHandleOptions): string;
abstract getTwitchChatMessage({ payload }: ReactionHandleOptions): string;
abstract canHandle({ payload, event }: ReactionCanHandleOptions): boolean;

private async notifyStreamlabs({ payload }: ReactionHandleOptions) {
try {
const message = this.getStreamLabsMessage({ payload });
await this.streamlabs.alert({
message,
});

return {
notified: true,
message,
};
} catch {
// TODO: add logging

return {
notified: false,
message: '',
};
}
}

private async notifyTwitch({ payload }: ReactionHandleOptions) {
try {
const message = this.getTwitchChatMessage({ payload });
await this.twitchChat.send(message);

return {
notified: true,
message,
};
} catch {
// TODO: add logging

return {
notified: false,
message: '',
};
}
}

public async handle({ payload }: ReactionHandleOptions) {
const [streamlabs, twitchChat] = await Promise.all([
this.notifyStreamlabs({ payload }),
this.notifyTwitch({ payload }),
]);

return {
twitchChat,
streamlabs,
};
}
}
70 changes: 13 additions & 57 deletions src/reactions/github/star.ts
Original file line number Diff line number Diff line change
@@ -1,63 +1,19 @@
import { TwitchChat } from '../../services/TwitchChat';
import { StreamLabs } from '../../services/StreamLabs';

interface HandleOptions {
payload: any;
}

export class Star {
public constructor(
private twitchChat: TwitchChat,
private streamlabs: StreamLabs,
) {}

private async notifyTwitch({ payload }: HandleOptions) {
try {
const message = `*${payload.sender.login}* just starred ${payload.repository.html_url}`;
await this.twitchChat.send(message);

return {
notified: true,
message,
};
} catch {
// TODO: add logging

return {
notified: false,
message: '',
};
}
import {
Reaction,
ReactionCanHandleOptions,
ReactionHandleOptions,
} from './reaction';

export class Star extends Reaction {
canHandle({ payload, event }: ReactionCanHandleOptions): boolean {
return event === 'star' && payload.action === 'created';
}

private async notifyStreamLabs({ payload }: HandleOptions) {
try {
const message = `*${payload.sender.login}* just starred *${payload.repository.full_name}*`;
await this.streamlabs.alert({ message });

return {
notified: true,
message,
};
} catch {
// TODO: add logging

return {
notified: false,
message: '',
};
}
getStreamLabsMessage({ payload }: ReactionHandleOptions): string {
return `*${payload.sender.login}* just starred *${payload.repository.full_name}*`;
}

public async handle({ payload }: HandleOptions) {
const [twitchChat, streamlabs] = await Promise.all([
this.notifyTwitch({ payload }),
this.notifyStreamLabs({ payload }),
]);

return {
twitchChat,
streamlabs,
};
getTwitchChatMessage({ payload }: ReactionHandleOptions): string {
return `*${payload.sender.login}* just starred ${payload.repository.html_url}`;
}
}
Loading

0 comments on commit 3d221bb

Please sign in to comment.