Created
April 7, 2021 03:00
-
-
Save SagnikPradhan/7ea02ec40cf898c0e5e996cb5f3adc74 to your computer and use it in GitHub Desktop.
ποΈ Server plugin system
This file contains hidden or 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
import discord from 'eris' | |
import { Module, Server } from '../../server' | |
export interface DiscordEvents { | |
clientConnected: [] | |
} | |
interface DiscordModuleInjected { | |
startClient: () => Promise<void> | |
} | |
export const DiscordModule = ( | |
token: string | |
): Module<DiscordModuleInjected, DiscordEvents> => (server, logger) => { | |
const client = new discord.Client(token) | |
client.on('ready', () => server.events.emit('clientConnected')) | |
return Object.assign(server, { | |
startClient: () => client.connect(), | |
} as Server<DiscordModuleInjected, DiscordEvents>) | |
} |
This file contains hidden or 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
import { handleError } from './error' | |
import { DiscordModule } from './modules/discord' | |
import { createServer } from './server' | |
async function main() { | |
const server = createServer() | |
.addModule(DiscordModule('')) | |
} | |
main().catch(handleError) |
This file contains hidden or 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
import EventEmitter, { ValidEventTypes } from 'eventemitter3' | |
import { Logger } from 'tslog' | |
import { handleError } from '../error' | |
export type Module< | |
M = {}, | |
E extends ValidEventTypes = {}, | |
IM = {}, | |
IE extends ValidEventTypes = DefaultServerEvents | |
> = (server: Server<IM, E & IE>, logger: Logger) => Server<M & IM, E & IE> | |
export interface DefaultServerEvents { | |
error: [Error] | |
} | |
export type Server<ModuleInjected, Events extends ValidEventTypes> = { | |
events: EventEmitter<Events> | |
addModule: < | |
M = {}, | |
E extends ValidEventTypes = {}, | |
IM = {}, | |
IE extends ValidEventTypes = DefaultServerEvents | |
>( | |
module: Module<M, E, IM, IE> | |
) => Server<IM & M, E & IE> | |
} & ModuleInjected | |
export const createServer = () => { | |
const logger = new Logger() | |
const events = new EventEmitter<DefaultServerEvents>() | |
const server: Server<{}, DefaultServerEvents> = { | |
events, | |
addModule: < | |
M = {}, | |
E extends ValidEventTypes = {}, | |
IM = {}, | |
IE extends ValidEventTypes = DefaultServerEvents | |
>( | |
module: Module<M, E, IM, IE> | |
) => { | |
return module( | |
(server as unknown) as Server<IM, E & IE>, | |
logger.getChildLogger() | |
) | |
}, | |
} | |
events.on('error', (error) => handleError(error)) | |
return server | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment