mirror of https://github.com/cloudwithax/flare.git
sync
This commit is contained in:
parent
fe3f7d0b48
commit
5fd595c90a
|
|
@ -13,6 +13,7 @@ local SearchType = enums.SearchType
|
||||||
local Track = require('track')
|
local Track = require('track')
|
||||||
local Playlist = require('playlist')
|
local Playlist = require('playlist')
|
||||||
local package = require('../../package')
|
local package = require('../../package')
|
||||||
|
local Player = require('player')
|
||||||
|
|
||||||
local Emitter = discordia.Emitter
|
local Emitter = discordia.Emitter
|
||||||
local class = discordia.class
|
local class = discordia.class
|
||||||
|
|
@ -118,14 +119,16 @@ function Node:disconnect(forced)
|
||||||
if not forced then self:_reconnect() end
|
if not forced then self:_reconnect() end
|
||||||
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
|
if include_version and not self._connected then return end
|
||||||
|
|
||||||
local guild_id = ""
|
local guild_id = _guild_id or ""
|
||||||
local query = _query or ""
|
local query = _query or ""
|
||||||
local data = _data or ""
|
local data = _data or ""
|
||||||
local version = ""
|
local version = ""
|
||||||
|
|
||||||
|
print(dump(_guild_id))
|
||||||
|
|
||||||
if include_version then
|
if include_version then
|
||||||
version = "/v" .. self._version .. "/"
|
version = "/v" .. self._version .. "/"
|
||||||
end
|
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 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)
|
local res, body = http.request(method, uri, self._headers, data)
|
||||||
|
|
||||||
if res.code == 200 then
|
if res.code == 200 then
|
||||||
|
|
@ -171,8 +173,7 @@ function Node:get_tracks(_query, search_type)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local data = self:_send('GET', 'loadtracks', nil, nil, query)
|
||||||
local data = self:_send('GET', 'loadtracks', nil, query)
|
|
||||||
local load_type = data.loadType
|
local load_type = data.loadType
|
||||||
|
|
||||||
if not load_type then
|
if not load_type then
|
||||||
|
|
@ -202,4 +203,19 @@ function Node:get_tracks(_query, search_type)
|
||||||
end
|
end
|
||||||
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
|
return Node
|
||||||
|
|
|
||||||
109
libs/player.lua
109
libs/player.lua
|
|
@ -3,31 +3,126 @@ local Emitter = discordia.Emitter
|
||||||
local class = discordia.class
|
local class = discordia.class
|
||||||
|
|
||||||
local Player, get = class('FlarePlayer', Emitter)
|
local Player, get = class('FlarePlayer', Emitter)
|
||||||
|
local utils = require('utils')
|
||||||
local format = string.format
|
local format = string.format
|
||||||
|
|
||||||
local function bind(t, k)
|
local function bind(t, k)
|
||||||
return function(...) return t[k](t, ...) end
|
return function(...) return t[k](t, ...) end
|
||||||
end
|
end
|
||||||
|
|
||||||
function Player:__init(pool, node, guild, channel)
|
function Player:__init(node, channel)
|
||||||
Emitter.__init(self)
|
Emitter.__init(self)
|
||||||
self._pool = pool
|
|
||||||
self._node = node
|
self._node = node
|
||||||
self._client = node._client
|
self._client = node._client
|
||||||
|
|
||||||
self._guild = guild
|
|
||||||
self._channel = channel
|
self._channel = channel
|
||||||
|
self._guild = channel.guild
|
||||||
|
|
||||||
|
|
||||||
self._playing = false
|
self._playing = false
|
||||||
self._paused = false
|
self._paused = false
|
||||||
self._volume = 100
|
self._volume = 100
|
||||||
self._track = nil
|
self._current = nil
|
||||||
self._trackPosition = nil
|
self._track_pos = nil
|
||||||
self._lastChecked = nil
|
self._last_update = nil
|
||||||
self._startedAt = nil
|
|
||||||
|
self._player_endpoint_url = string.format("sessions/%s/players", self._node._session_id)
|
||||||
|
|
||||||
self._node:on('event', bind(self, '_onEvent'))
|
self._node:on('event', bind(self, '_onEvent'))
|
||||||
self._node:on('killed', bind(self, '_onNodeKilled'))
|
self._node:on('killed', bind(self, '_onNodeKilled'))
|
||||||
end
|
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
|
return Player
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue