diff options
Diffstat (limited to 'discord/pylon.lua')
-rw-r--r-- | discord/pylon.lua | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/discord/pylon.lua b/discord/pylon.lua new file mode 100644 index 0000000..7f7549b --- /dev/null +++ b/discord/pylon.lua @@ -0,0 +1,92 @@ +local consts = require'discord.consts' +local opcodes = consts.opcodes +local websocket = require'http.websocket' +local json = require 'dkjson' +local Queue = require 'queue' +local exec_webhook = require'discord.the' +local cqueues = require 'cqueues' +local pylon = require 'pylon' +local pprint = require 'pprint' +local Channel = require 'channel' + +local Discord = pylon.subclass "discord" + +function Discord.init(self) + self:check_config "token" +end + +local function identify_payload(token) + local I = consts.intents + return json.encode{ + op = opcodes.identify, + d = { + properties = { + os = "wilson", browser = "wilson", device = "wilson", + }, + intents = I.guilds + I.guild_messages + I.message_content, + token = token, + } + } +end + +function Discord._connect(self) + local uri = "wss://gateway.discord.gg/?v=10&encoding=json" + self.ws = websocket.new_from_uri(uri) + assert(self.ws:connect()) + self.ws:send(identify_payload(self.token), 'text') +end + +function Discord._heartbeat(self, interval_ms) + local interval = interval_ms / 1000 + cqueues.sleep(interval * math.random()) + while true do + self.ws:send(json.encode{ + op = opcodes.heartbeat, + d = self.sequence_number, + }) + cqueues.sleep(interval) + end +end + +function Discord.recving(self) + for packet in self.ws:each() do + local event = json.decode(packet) + print(event.s, event.op, event.t) + if event.op ~= opcodes.dispatch then + pprint(event.d) + end + + if event.s then self.sequence_number = event.s end + + if event.op == opcodes.hello then + self.cq:wrap(self._heartbeat, self, event.d.heartbeat_interval) + elseif event.op == opcodes.dispatch then + self:handle_dispatch(event) + end + end +end + +function Discord.handle_dispatch(self, event) + local d = event.d + if event.t == 'MESSAGE_CREATE' then + if d.author.id == '293066066605768714' then + self.wilson:deliver(Channel(self, d.channel_id), { + body = d.content, + sender = '[d]' .. d.author.username + }) + end + end +end + +function Discord.sending(self) + for dest_channel, message in self.inbox:iter() do + print('DDD',message.sender,message.body) + exec_webhook(self.temp_wh, { + username = message.sender, + content = message.body, + }) + end +end + +return Discord + |