Skip to content

Instantly share code, notes, and snippets.

@tanner0101
Created December 13, 2019 19:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tanner0101/a8f65e6d487b1fdc7bea6d4d147f2cd1 to your computer and use it in GitHub Desktop.
Save tanner0101/a8f65e6d487b1fdc7bea6d4d147f2cd1 to your computer and use it in GitHub Desktop.
protocol HookEvent { }
protocol HookEventHandler {
func handle(_ event: HookEvent)
}
protocol DiscordEventHandler: HookEventHandler {
func handle(_ event: DiscordEvent)
}
extension DiscordEventHandler {
func handle(_ event: HookEvent) {
guard let event as? DiscordEvent else {
return nil
}
self.handle(event)
}
}
struct Discord {
@propertyWrapper
struct GuildCreate: DiscordEventHandler {
var value: (Guild) -> ()
func handle(_ event: DiscordEvent) {
guard case .guildCreate(let guild) = event else {
return
}
self.value(guild)
}
}
}
protocol MessageCreateEvent {
var content: String { get }
}
struct Global {
@propertyWrapper
struct MessageCreate: HookEventHandler {
var value: (MessageCreateEvent) -> ()
func handle(_ event: HookEvent) {
guard let create = event as? MessageCreateEvent else {
return
}
self.value(create)
}
}
}
struct MyPlugins: Plugins {
@Discord.GuildCreate
var guildListener = { guild in
print("created guild \(guild)")
}
@Global.MessageCreate
var globalMessageListener = { message in
print("Global: \(message.content)")
}
}
// internal in swift hook
let event: HookEvent
for handler in plugins.handlers {
handler.handle(event)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment