From fe3f7d0b48f4e0c324bc538c212ecc33e9abda94 Mon Sep 17 00:00:00 2001 From: cloudwithax Date: Tue, 28 Mar 2023 11:17:18 -0400 Subject: [PATCH] man idek what i added --- init.lua | 3 ++ libs/node.lua | 67 ++++++++++++++++++++++++++++++++----------- libs/playlist.lua | 19 ++++++++++++ libs/pool.lua | 13 ++++----- libs/routeplanner.lua | 0 libs/track.lua | 20 +++++++++++++ libs/utils.lua | 48 ++++++++++++++++++++++++------- 7 files changed, 135 insertions(+), 35 deletions(-) create mode 100644 libs/playlist.lua create mode 100644 libs/routeplanner.lua create mode 100644 libs/track.lua diff --git a/init.lua b/init.lua index 494fd46..9ae79b7 100644 --- a/init.lua +++ b/init.lua @@ -2,6 +2,9 @@ return { Enums = require('enums'), Node = require('node'), Player = require('player'), + Playlist = require('playlist'), Pool = require('pool'), + RoutePlanner = require('routeplanner'), + Track = require('track'), Utils = require('utils') } diff --git a/libs/node.lua b/libs/node.lua index c5ea9c1..fa62661 100644 --- a/libs/node.lua +++ b/libs/node.lua @@ -1,14 +1,18 @@ +---@diagnostic disable: need-check-nil local discordia = require('discordia') local websocket = require('coro-websocket') local http = require('coro-http') local json = require('json') -local querystring = require('querystring') local utils = require('utils') local enums = require('enums') local interp = utils.interp local split = utils.split local dump = utils.dump +local url = require('url') local SearchType = enums.SearchType +local Track = require('track') +local Playlist = require('playlist') +local package = require('../../package') local Emitter = discordia.Emitter local class = discordia.class @@ -52,7 +56,7 @@ function Node:__init(client, options) { 'Authorization', self._password }, { 'Num-Shards', self._client.shardCount }, { 'User-Id', self._client.user.id }, - { 'Client-Name', "Flare/1.0.0" } + { 'Client-Name', format("Flare/%s", package.version) } } self._res = nil @@ -76,7 +80,6 @@ function Node:_listen() self:emit('stats', self._stats) elseif payload.op == 'ready' then self._session_id = payload.sessionId - print(self._session_id) elseif payload.op == 'event' then self:emit('event', payload) end @@ -84,7 +87,6 @@ function Node:_listen() self:disconnect() end end - self:close() end function Node:connect() @@ -133,9 +135,7 @@ function Node:_send(method, path, _guild_id, _query, _data, include_version) end if _query then - query = querystring.stringify({ - identifier = _query - }) + query = "?" .. _query end local uri = format('%s%s%s%s%s', self._rest_uri, version, path, guild_id, query) @@ -144,11 +144,7 @@ function Node:_send(method, path, _guild_id, _query, _data, include_version) local res, body = http.request(method, uri, self._headers, data) if res.code == 200 then - if type(body) == "string" then - return body - else - return json.decode(body) - end + return json.decode(body) elseif res.code == 204 or method == "DELETE" then return nil else @@ -158,13 +154,52 @@ end function Node:get_tracks(_query, search_type) if not self._connected then return end - assert(type(search_type) == type(SearchType), "Search type is not valid") + assert(_query, "Query must be provided.") - local query = search_type .. ":" .. _query + local query = nil - print(query) + if not search_type then + local parsed = url.parse(_query) + if parsed.host then + query = "identifier=" .. utils.escape(_query) + else + query = "identifier=" .. SearchType.YOUTUBE .. ":" .. utils.escape(_query) + end + else + assert(utils.valueintb(SearchType, search_type), "Search type not valid.") + query = "identifier=" .. search_type .. ":" .. utils.escape(_query) + end - -- local tracks = self:_send('GET', 'loadtracks', nil, '') + + + local data = self:_send('GET', 'loadtracks', nil, query) + local load_type = data.loadType + + if not load_type then + return print("There was an error while trying to load this track.") + end + + if load_type == "NO_MATCHES" then + return nil + elseif load_type == "LOAD_FAILED" then + local exception = data.exception + return print(format("Error loading track: %s [%s]", exception.message, exception.severity)) + elseif load_type == "SEARCH_RESULT" or load_type == "TRACK_LOADED" then + local tracks = {} + for _, v in pairs(data.tracks) do + table.insert(tracks, Track(v)) + end + return tracks + elseif load_type == "PLAYLIST_LOADED" then + local tracks = {} + for _, v in pairs(data.tracks) do + table.insert(tracks, Track(v)) + end + + return Playlist(data, tracks) + else + return print("There was an error while trying to load this track.") + end end return Node diff --git a/libs/playlist.lua b/libs/playlist.lua new file mode 100644 index 0000000..b4e695d --- /dev/null +++ b/libs/playlist.lua @@ -0,0 +1,19 @@ +local discordia = require('discordia') +local class = discordia.class + +local Playlist = class('Playlist') + +function Playlist:__init(data, tracks) + local info = data.playlistInfo + self._selected_track = info.selectedTrack + self._name = info.name + self._tracks = tracks + + if self._selected_track ~= -1 then + self._selected_track = self._tracks[self._selected_track] + end + + self._track_count = #self._tracks +end + +return Playlist diff --git a/libs/pool.lua b/libs/pool.lua index 0b399bf..5698ac2 100644 --- a/libs/pool.lua +++ b/libs/pool.lua @@ -2,9 +2,7 @@ local discordia = require('discordia') local class = discordia.class local Node = require('node') -local Pool, get = class('Pool') -local dump = require('utils').dump -local random_value = require('utils').random_value +local Pool = class('Pool') local format = string.format @@ -21,17 +19,16 @@ function Pool:create_node(client, options) end options.pool = self - local id = options.identifier - self._nodes[id] = Node(client, options) + local node = Node(client, options) + self._nodes[options.identifier] = node + return node end function Pool:get_node(identifier) if self._nodes[identifier] then return self._nodes[identifier] else - print("getting random node") - local node = random_value(self._nodes) - print(node) + return self._nodes[next(self._nodes)] end end diff --git a/libs/routeplanner.lua b/libs/routeplanner.lua new file mode 100644 index 0000000..e69de29 diff --git a/libs/track.lua b/libs/track.lua new file mode 100644 index 0000000..5aad8f6 --- /dev/null +++ b/libs/track.lua @@ -0,0 +1,20 @@ +local discordia = require('discordia') +local class = discordia.class + +local Track = class('Track') + +function Track:__init(data) + local info = data.info + self._track_id = data.encoded + self._author = info.author + self._identifier = info.identifier + self._uri = info.uri + self._source_name = info.sourceName + self._title = info.title + self._position = info.position + self._length = info.length + self._is_stream = info.isStream + self._is_seekable = info.isSeekable +end + +return Track diff --git a/libs/utils.lua b/libs/utils.lua index 20c5e75..e8cbdb6 100644 --- a/libs/utils.lua +++ b/libs/utils.lua @@ -31,23 +31,49 @@ function split(str, character) return result end -function random_value(tb) - local values = {} - for k, v in pairs(tb) do table.insert(values, v) end - print(values.index) - return tb[values[math.random(#values)]] +function valueintb(tb, value) + local found = nil + for _, v in pairs(tb) do + if v == value then + found = v + end + end + if found then + return true + else + return false + end end -function random_key(tb) - local keys = {} - for k in pairs(tb) do table.insert(keys, k) end - return tb[keys[math.random(#keys)]] +function escape(s) + return (string.gsub(s, "([^A-Za-z0-9_])", function(c) + return string.format("%%%02x", string.byte(c)) + end)) +end + +function starts_with(str, start) + return str:sub(1, #start) == start +end + +function shift(tb) + local shifted = table.remove(tb, 1) + for i = 1, #tb do + tb[i] = tb[i + 1] + end + tb[#tb] = nil + return shifted +end + +function randval(tb) + return tb[math.random(1, #tb)] end return { dump = dump, interp = interp, split = split, - random_value = random_value, - random_key = random_key + valueintb = valueintb, + escape = escape, + starts_with = starts_with, + shift = shift }