From 5fd595c90a3fa195399abe2950b404d8a8ffd0fc Mon Sep 17 00:00:00 2001 From: Clxud Date: Wed, 29 Mar 2023 22:54:26 +0000 Subject: [PATCH] sync --- libs/node.lua | 26 +++++++++--- libs/player.lua | 109 ++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 123 insertions(+), 12 deletions(-) diff --git a/libs/node.lua b/libs/node.lua index fa62661..ec17569 100644 --- a/libs/node.lua +++ b/libs/node.lua @@ -13,6 +13,7 @@ local SearchType = enums.SearchType local Track = require('track') local Playlist = require('playlist') local package = require('../../package') +local Player = require('player') local Emitter = discordia.Emitter local class = discordia.class @@ -118,14 +119,16 @@ function Node:disconnect(forced) if not forced then self:_reconnect() end end -function Node:_send(method, path, _guild_id, _query, _data, include_version) +function Node:_send(method, path, _guild_id, _data, _query, include_version) if include_version and not self._connected then return end - local guild_id = "" + local guild_id = _guild_id or "" local query = _query or "" local data = _data or "" local version = "" + print(dump(_guild_id)) + if include_version then version = "/v" .. self._version .. "/" end @@ -140,7 +143,6 @@ function Node:_send(method, path, _guild_id, _query, _data, include_version) local uri = format('%s%s%s%s%s', self._rest_uri, version, path, guild_id, query) - local res, body = http.request(method, uri, self._headers, data) if res.code == 200 then @@ -171,8 +173,7 @@ function Node:get_tracks(_query, search_type) end - - local data = self:_send('GET', 'loadtracks', nil, query) + local data = self:_send('GET', 'loadtracks', nil, nil, query) local load_type = data.loadType if not load_type then @@ -202,4 +203,19 @@ function Node:get_tracks(_query, search_type) end end +function Node:create_player(vc) + assert(type(vc) ~= "GuildVoiceChannel", "Not a voice channel") + local guild = vc.guild + if not guild then return false, 'Could not find guild' end + if self._players[guild.id] then return self._players[guild.id] end + + local success, err = vc:join() + if not success then return nil, err end + + local player = Player(self, vc) + self._players[guild.id] = player + return player + +end + return Node diff --git a/libs/player.lua b/libs/player.lua index 53dc9a3..a89b3d1 100644 --- a/libs/player.lua +++ b/libs/player.lua @@ -3,31 +3,126 @@ local Emitter = discordia.Emitter local class = discordia.class local Player, get = class('FlarePlayer', Emitter) +local utils = require('utils') local format = string.format local function bind(t, k) return function(...) return t[k](t, ...) end end -function Player:__init(pool, node, guild, channel) +function Player:__init(node, channel) Emitter.__init(self) - self._pool = pool self._node = node self._client = node._client - self._guild = guild self._channel = channel + self._guild = channel.guild + self._playing = false self._paused = false self._volume = 100 - self._track = nil - self._trackPosition = nil - self._lastChecked = nil - self._startedAt = nil + self._current = nil + self._track_pos = nil + self._last_update = nil + + self._player_endpoint_url = string.format("sessions/%s/players", self._node._session_id) self._node:on('event', bind(self, '_onEvent')) self._node:on('killed', bind(self, '_onNodeKilled')) end +function Player:_onEvent(data) + if data.guildId ~= self._guild.id then return end + if data.op == 'playerUpdate' then + if not self._playing then return false end + self._track_pos = data.state.position + self._last_update = data.state.time + elseif data.type == 'TrackEndEvent' then + self:_clearTrack() + self:emit('end', data.reason:lower()) + elseif data.type == 'TrackExceptionEvent' then + self:_clearTrack() + self:emit('end', 'error', data.error) + elseif data.type == 'TrackStuckEvent' then + self:stop() + self:emit('end', data) + else + self:emit('warn', format('Unknown Event %s', data.type)) + end + end + +function Player:play(track, start_time, end_time, _ignore_if_playing) + assert(type(track) == "table", "Invalid track provided") + + local data = { + {"encodedTrack", track._track_id}, + {"position", tostring(start_time)}, + {"endTime", nil} + + } + + if end_time and end_time > 0 then + data["endTime"] = tostring(end_time) + end + + local ignore_if_playing = _ignore_if_playing or false + + self._node:_send('PATCH', self._player_endpoint_url, self._guild.id, data, string.format("noReplace=%s", ignore_if_playing)) + + self._current = track +end + +function Player:stop() + local data = { + {"encodedTrack", nil}, + + } + self._node:_send('PATCH', self._player_endpoint_url, self._guild.id, data) + + self._current = nil + +end + +function Player:destroy() + + self._node:_send('DELETE', self._player_endpoint_url, self._guild.id) + self._node._players[self._guild.id] = nil + +end + +function Player:set_pause(paused) + + local data = {{"paused", paused}} + + self._node:_send('PATCH', self._player_endpoint_url, self._guild.id, data) + + self._paused = paused + +end + +function Player:seek(ms) + + local data = {{"position", ms}} + + self._node:_send('PATCH', self._player_endpoint_url, self._guild.id, data) + +end + +function Player:set_volume(volume) + + local data = {{"volume", volume}} + + self._node:_send('PATCH', self._player_endpoint_url, self._guild.id, data) + + self._volume = volume + +end + +function Player:get_tracks(query, search_type) + return self._node:get_tracks(query, search_type) + +end + + return Player