-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #114 from streamdevs/50-ts-abstract-reaction
refactor: new 'Reaction' abstract class
- Loading branch information
Showing
7 changed files
with
241 additions
and
192 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 🎉`; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}`; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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, | ||
}; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}`; | ||
} | ||
} |
Oops, something went wrong.