Current section

Files

Jump to
discord_gleam src discord_gleam event_handler.gleam
Raw

src/discord_gleam/event_handler.gleam

import bravo/uset
import discord_gleam/types/bot
import discord_gleam/ws/packets/generic
import discord_gleam/ws/packets/interaction_create
import discord_gleam/ws/packets/message
import discord_gleam/ws/packets/message_delete
import discord_gleam/ws/packets/ready
import gleam/list
import gleam/option
import gleam/result
pub type EventHandler =
fn(bot.Bot, Packet) -> Nil
pub type Packet {
MessagePacket(message.MessagePacket)
ReadyPacket(ready.ReadyPacket)
UnknownPacket(generic.GenericPacket)
MessageDeletePacket(message_delete.MessageDeletePacket)
InteractionCreate(interaction_create.InteractionCreate)
}
fn internal_handler(bot: bot.Bot, packet: Packet) -> Nil {
case packet {
MessagePacket(msg) -> {
case bot.cache.messages {
option.Some(cache) -> {
uset.insert(cache, [#(msg.d.id, msg.d)])
Nil
}
option.None -> {
Nil
}
}
Nil
}
_ -> Nil
}
}
pub fn handle_event(
bot: bot.Bot,
msg: String,
handlers: List(EventHandler),
) -> Nil {
let packet = decode_packet(msg)
case packet {
UnknownPacket(_) -> Nil
_ -> internal_handler(bot, packet)
}
list.each(handlers, fn(handler) { handler(bot, packet) })
}
fn decode_packet(msg: String) -> Packet {
let generic_packet = generic.string_to_data(msg)
case generic_packet.t {
"MESSAGE_CREATE" ->
message.string_to_data(msg)
|> result.map(MessagePacket)
|> result.unwrap(UnknownPacket(generic_packet))
"READY" ->
ready.string_to_data(msg)
|> result.map(ReadyPacket)
|> result.unwrap(UnknownPacket(generic_packet))
"MESSAGE_DELETE" ->
message_delete.string_to_data(msg)
|> result.map(MessageDeletePacket)
|> result.unwrap(UnknownPacket(generic_packet))
"INTERACTION_CREATE" ->
interaction_create.string_to_data(msg)
|> result.map(InteractionCreate)
|> result.unwrap(UnknownPacket(generic_packet))
_ -> UnknownPacket(generic_packet)
}
}