Skip to content

Instantly share code, notes, and snippets.

@SagnikPradhan
Created April 7, 2021 03:00
Show Gist options
  • Save SagnikPradhan/7ea02ec40cf898c0e5e996cb5f3adc74 to your computer and use it in GitHub Desktop.
Save SagnikPradhan/7ea02ec40cf898c0e5e996cb5f3adc74 to your computer and use it in GitHub Desktop.
πŸ—οΈ Server plugin system
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>)
}
import { handleError } from './error'
import { DiscordModule } from './modules/discord'
import { createServer } from './server'
async function main() {
const server = createServer()
.addModule(DiscordModule(''))
}
main().catch(handleError)
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