39 song_api::song_api(
const snowflake guildIdNew) {
44 onSongCompletionEvent.functions.clear();
45 eventToken = onSongCompletionEvent.add(handler);
50 audioDataBuffer.clearContents();
51 auto returnValue = discord_core_client::getVoiceConnection(guildId).skip(wasItAFail);
52 audioDataBuffer.send(std::move(dataFrame));
57 std::unique_lock lock{ accessMutex };
58 jsonifier::vector<song> vector01{};
59 jsonifier::vector<song> vector02{};
60 if (searchQuery.find(
"soundcloud") == jsonifier::string::npos && searchQuery.find(
"youtube") == jsonifier::string::npos) {
61 vector01 = discord_core_client::getSoundCloudAPI(guildId).searchForSong(searchQuery, limit);
62 vector02 = discord_core_client::getYouTubeAPI(guildId).searchForSong(searchQuery, limit);
63 }
else if (searchQuery.find(
"youtube") != jsonifier::string::npos) {
64 vector02 = discord_core_client::getYouTubeAPI(guildId).searchForSong(searchQuery, limit);
65 }
else if (searchQuery.find(
"soundcloud") != jsonifier::string::npos) {
66 vector01 = discord_core_client::getSoundCloudAPI(guildId).searchForSong(searchQuery, limit);
68 uint64_t totalLength = vector01.size() + vector02.size();
69 jsonifier::vector<song> newVector{};
70 uint64_t vector01Used{};
71 uint64_t vector02Used{};
72 for (uint64_t x = 0; x < totalLength; ++x) {
73 if ((vector01Used < vector01.size()) && (x % 2 == 0) && vector01.size() > 0) {
74 newVector.emplace_back(vector01[vector01Used]);
77 }
else if (vector02Used < vector02.size() && vector02.size() > 0) {
78 newVector.emplace_back(vector02[vector02Used]);
87 std::unique_lock lock{ accessMutex };
91 discord_core_client::getVoiceConnection(guildId).currentUserId = songNew.addedByUserId;
93 song newerSong{ discord_core_client::getSoundCloudAPI(guildId).collectFinalSong(songNew) };
94 taskThread = discord_core_client::getSoundCloudAPI(guildId).downloadAndStreamAudio(newerSong);
97 song newerSong{ discord_core_client::getYouTubeAPI(guildId).collectFinalSong(songNew) };
98 taskThread = discord_core_client::getYouTubeAPI(guildId).downloadAndStreamAudio(newerSong);
100 return discord_core_client::getVoiceConnection(guildId).play();
104 return discord_core_client::getVoiceConnection(guildId).areWeCurrentlyPlaying();
108 return discord_core_client::getVoiceConnection(guildId).play();
112 return discord_core_client::getVoiceConnection(guildId).pauseToggle();
116 bool returnValue = discord_core_client::getVoiceConnection(guildId).stop();
120 audioDataBuffer.clearContents();
124 void song_api::disconnect() {
128 onSongCompletionEvent.erase(eventToken);
129 audioDataBuffer.clearContents();
130 stop_watch<milliseconds> stopWatch{ 10000ms };
132 while (discord_core_client::getSoundCloudAPI(guildId).areWeWorking() || discord_core_client::getYouTubeAPI(guildId).areWeWorking()) {
133 if (stopWatch.hasTimeElapsed()) {
136 std::this_thread::sleep_for(1ms);
A co_routine - representing a potentially asynchronous operation/function.
co_routine_status getStatus()
Collects the status of the co_routine.
return_type cancelAndWait()
Cancels the currently running co_routine, while blocking to wait for it to complete.
bool areWeCurrentlyPlaying() const
Checks if there is currently playing music for the current guild.
bool skip(bool wasItAfail=false)
Skips to the next song in the queue, if applicable.
bool pauseToggle()
Toggles pausing on and off.
void onSongCompletion(std::function< co_routine< void, false >(song_completion_event_data)> handler)
For setting up behavior in response to a completed song.
bool play()
Plays the current song. (assuming that you are currently connected to a voice_connection).
jsonifier::vector< song > searchForSong(jsonifier::string_view searchQuery, uint64_t limit=20)
Search for a song to play.
bool stop()
Stops the currently playing song.
The main namespace for the forward-facing interfaces.
Represents a single frame of audio data.
Song completion event data.