leref.ts
Version:
Something upcoming for aoi.js and npm packages uses
1 lines • 7.87 kB
JavaScript
;var __decorate=this&&this.__decorate||function(e,t,o,r){var s,n=arguments.length,a=n<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,o):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,o,r);else for(var i=e.length-1;0<=i;i--)(s=e[i])&&(a=(n<3?s(a):3<n?s(t,o,a):s(t,o))||a);return 3<n&&a&&Object.defineProperty(t,o,a),a};Object.defineProperty(exports,"__esModule",{value:!0}),exports.LerefLava=void 0;const lerefNodes_1=require("./lerefNodes"),lerefPlayer_1=require("./lerefPlayer"),tiny_typed_emitter_1=require("tiny-typed-emitter"),validators_1=require("../utils/decorators/validators"),constants_1=require("../utils/constants"),constructs_1=require("../utils/decorators/constructs"),lerefTracking_1=require("./lerefTracking"),rest_1=require("../utils/rest"),lerefQueueSystem_1=require("./lerefQueueSystem");let LerefLava=class extends tiny_typed_emitter_1.TypedEmitter{constructor(e){super(),this.nodes=new Map,this.players=new Map;var t={Node:lerefNodes_1.LerefNodes,Player:lerefPlayer_1.LerefPlayer,Queue:lerefQueueSystem_1.LerefQueueSystem};e.structures&&Object.assign(t,e.structures),e.structures=t,this.options={clientName:"node-leref.ts",shards:1,autoPlay:!0,defaultSearchPlatform:"yt",autoReplay:!0,autoResume:!0,...e},delete this.options.resumeConfig,void 0!==e.resumeConfig&&this.configResume(e.resumeConfig)}get leastUsedNode(){return this.sortAndGetFirstNode((e,t)=>e.calls-t.calls)}get leastLoadNode(){return this.sortAndGetFirstNode((e,t)=>{return(e.stats.cpu?e.stats.cpu.systemLoad/e.stats.cpu.cores*100:0)-(t.stats.cpu?t.stats.cpu.systemLoad/t.stats.cpu.cores*100:0)})}init(e){this.clientID=e;for(const t of this.nodes.values())t.connect()}async search(e,t){const o=this.leastUsedNode;var r=e.source??this.options.defaultSearchPlatform;let s=e.query;/^(?:http|https):\/\//.test(s)||(s=r+"search:"+s);const n=await o.request("/loadtracks?identifier="+encodeURIComponent(s));n||console.log("Query not found");const a={loadType:n.loadType,tracks:n.tracks.map(e=>new lerefTracking_1.LerefTracking(e,t))};return n.loadType===rest_1.LoadTypes.LoadFailed&&(a.error=n.exception),n.loadType===rest_1.LoadTypes.PlaylistLoaded&&(a.playlist={name:n.playlistInfo.name,selectedTrack:-1===n.playlistInfo.selectedTrack?null:a.tracks[n.playlistInfo.selectedTrack],duration:a.tracks.reduce((e,t)=>e+(t.duration||0),0)}),a}async decodeTrack(e){const t=this.leastUsedNode;var o=await t.request("/decodetrack?track="+e);if(!o)throw new Error("No decoded data returned");return{track:e,info:o}}async decodeTracks(e){const t=this.leastUsedNode;e=await t.post("/decodetracks",e,!1);if(!e)throw new Error("No decoded data returned");return e}updateVoiceData(e){const t=this.players.get(e.d.guild_id),o=t.voice;"VOICE_SERVER_UPDATE"===e.t?(o.op=constants_1.OpCodes.VoiceUpdate,o.guildId=e.d.guild_id,o.event=e.d):(o.sessionId=e.d.session_id,t.options.voiceID!==e.d.channel_id&&(this.emit("playerMove",t,t.options.voiceID,e.d.channel_id),t.options.voiceID=e.d.channel_id,e.d.channel_id||(t.voiceState=constants_1.PlayerVoiceStates.Disconnected,t.pause(!0)))),["op","guildId","event","sessionId"].every(e=>e in o)&&t.node.send(o)}configResume(e){this.options.resumeConfig={timeout:60,...e};for(const t of this.nodes.values())t.connected&&t.configResume()}create(e){return new this.options.structures.Player(this,e)}get(e){return this.players.get(e)}destroy(e){const t=this.get(e);t&&t.destroy()}add(e){const r=new this.options.structures.Node(this,e);r.removeAllListeners(),r.on("event",e=>this.handleEvent(r,e)),r.on("connect",()=>this.emit("nodeConnect",r)),r.on("reconnect",()=>this.emit("nodeReconnect",r)),r.on("raw",e=>this.emit("nodeRaw",r,e)),r.on("error",e=>this.emit("nodeError",r,e)),r.on("destroy",()=>{this.emit("nodeDestroy",r),this.nodes.delete(r.options.name)}),r.on("disconnect",e=>{if(this.emit("nodeDisconnect",r,e),this.options.autoReplay)for(const t of this.players.values())if(t.options.node===r.options.name)try{t.setNode(this.leastLoadNode.options.name)}catch(e){this.emit("replayError",t,e)}}),r.on("playerUpdate",(e,t)=>{const o=this.players.get(e);o?(o.lastUpdated=t.time,o.position=t.position,o.voiceConnected=t.connected):r.resumed&&this.options.resumeConfig?.handle(this,e,e=>{e.lastUpdated=t.time,e.position=t.position,e.voiceConnected=t.connected})}),this.clientID&&r.connect()}handleEvent(e,t){if(t.guildId){const s=this.get(t.guildId);if(s){var o=s.queue.current,r=t.type;switch(r){case constants_1.EventTypes.TrackStart:if(s.state=constants_1.PlayerStates.Playing,s.replaying)return void(s.replaying=!1);this.emit("trackStart",s,o,t),s.queue.previous||this.emit("queueStart",s,o,t);break;case constants_1.EventTypes.TrackEnd:if(this.emit("trackEnd",s,o,t),"REPLACED"===t.reason)return;s.queue.length||s.loop!==constants_1.LoopMode.None||this.emit("queueEnd",s,o,t),this.options.autoPlay&&s.play({});break;case constants_1.EventTypes.TrackStuck:this.emit("trackStuck",s,o,t),s.queue.length||s.loop!==constants_1.LoopMode.None||this.emit("queueEnd",s,o,t),this.options.autoPlay&&s.play({});break;case constants_1.EventTypes.TrackException:if("The track was unexpectedly terminated."===t.exception.message)return;this.emit("trackError",s,o,t),s.queue.length||s.loop!==constants_1.LoopMode.None||this.emit("queueEnd",s,o,t),this.options.autoPlay&&s.play({});break;case constants_1.EventTypes.WebSocketClosed:s.voiceConnected||s.voiceState!==constants_1.PlayerVoiceStates.Connected||(this.options.autoResume&&s.options.voiceID?s.connect():s.disconnect()),this.emit("socketClosed",s,t);break;default:this.emit("nodeError",e,new Error(`Node#event unknown event type '${r}'`))}}}}sortAndGetFirstNode(o){const e=new Map;for(var[t,r]of this.nodes.entries())r.connected&&e.set(t,r);const s=[...e.entries()];s.sort(([,e],[,t])=>o(e,t)),e.clear();for(var[n,a]of s)e.set(n,a);return e.values().next().value}};__decorate([validators_1.check(function(e,t){if(!this.clientID){if("string"!=typeof t||!t)throw new TypeError("Parameter 'clientID' must be present and be a non-empty string");return e(t)}})],LerefLava.prototype,"init",null),__decorate([validators_1.check(function(e,t,o){if("object"!=typeof t||null===t)throw new TypeError("Parameter 'query' must be present and be an object");var r=this.leastUsedNode;return r&&r.connected||console.log("No node is connected!"),e(t,o)})],LerefLava.prototype,"search",null),__decorate([validators_1.check(function(e,t){if("string"!=typeof t||!t)throw new TypeError("Parameter 'track' must be present and be a non-empty string");var o=this.leastUsedNode;return o&&o.connected||console.log("No node is connected!"),e(t)})],LerefLava.prototype,"decodeTrack",null),__decorate([validators_1.check(function(e,t){if(!Array.isArray(t))throw new TypeError("Parameter 'tracks' must be present and be a non-empty-string array");var o=this.leastUsedNode;return o&&o.connected||console.log("No node is connected!"),e(t)})],LerefLava.prototype,"decodeTracks",null),__decorate([validators_1.check(function(e,t){if(t&&["VOICE_SERVER_UPDATE","VOICE_STATE_UPDATE"].includes(t.t||"")&&this.players.has(t.d.guild_id)&&("VOICE_STATE_UPDATE"!==t.t||t.d.user_id===this.clientID))return e(t)})],LerefLava.prototype,"updateVoiceData",null),__decorate([validators_1.check(function(e,t){if("object"!=typeof t||null===t)throw new TypeError("Parameters 'config' must be present and be an object");if("string"!=typeof t.key||!t.key)throw new TypeError("Config 'key' must be present and be a non-empty string");if("function"!=typeof t.handle)throw new TypeError("Config 'handle' must be present and be a function");if(void 0!==t.timeout&&("number"!=typeof t.timeout||isNaN(t.timeout)))throw new TypeError("Config 'timeout' must be a number");return e(t)})],LerefLava.prototype,"configResume",null),LerefLava=__decorate([constructs_1.lerefConstructor()],LerefLava),exports.LerefLava=LerefLava;