Skip to content

Commit

Permalink
created next command and functionality for sending playing track info
Browse files Browse the repository at this point in the history
  • Loading branch information
at-elcapitan committed Jan 31, 2025
1 parent e0b6f79 commit 7359959
Show file tree
Hide file tree
Showing 4 changed files with 149 additions and 18 deletions.
2 changes: 1 addition & 1 deletion src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ int main(void) {
struct coglink_client *client;
struct discord *bot;

puts("AT PROJECT Limited, 2021 - 2025; ATNiC-319120250634JST");
puts("AT PROJECT Limited, 2021 - 2025; ATNiC-v0.0.1");
puts("Product licensed by GPLv3, file `LICENSE`");
puts("This is a prototype version and should not be used in production environments");
puts("by Vladislav 'ElCapitan' Nazarov");
Expand Down
161 changes: 144 additions & 17 deletions src/music.c
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
#include "music.h"

#define GET_TRACK_CURL_ERROR 1
#define GET_TRACK_ALLCATION_ERORR 2
#define GET_TRACK_CURL_ESCAPE_ERROR 3

#define GET_TRACK_CURL_ERROR 1
#define GET_TRACK_ALLCATION_ERORR 2
#define GET_TRACK_CURL_ESCAPE_ERROR 3
#define MUSIC_TITLE_STRLEN 276
// Private functions
/**
* @brief Retrieves a track from a given query using the Coglink library.
Expand Down Expand Up @@ -35,7 +35,7 @@ tnic_errnoReturn getTrackFromQuery(const char *query, struct coglink_client *cli
.Ok = NULL
};
}

log_trace("%s", query);
char *search = curl_easy_escape(curl, query, strlen(query));
if (!search) {
log_debug("[TNIC/Errno] Errno: tnic_IS_NULL 3, position: %d, at %s", __LINE__, __FILE__);
Expand All @@ -59,7 +59,11 @@ tnic_errnoReturn getTrackFromQuery(const char *query, struct coglink_client *cli
};
}

snprintf(searchQuery, strlen(search) + sizeof("ytsearch:") + 1, "ytsearch:%s", search);
if (strncmp(query, "http://", sizeof("http://") - 1) != 0 && strncmp(query, "https://", sizeof("https://") - 1) != 0) {
snprintf(searchQuery, strlen(search) + sizeof("ytsearch:") + 1, "ytsearch:%s", search);
} else {
strcpy(searchQuery, search);
}

struct coglink_load_tracks *response = (struct coglink_load_tracks*)malloc(sizeof(struct coglink_load_tracks *));

Expand Down Expand Up @@ -133,6 +137,30 @@ void playTrack(tnic_application app, struct coglink_player *player, tnic_track *
coglink_update_player(app.client, player, &params, NULL);
}

macro_testCommand()
void testSendTrackInfo(tnic_application app, const struct discord_interaction *event, char title[256]) {
char *description = (char*)malloc(MUSIC_TITLE_STRLEN);
snprintf(description, MUSIC_TITLE_STRLEN, "Now playing: **%s**", title);

struct discord_embed embed = {
.color = 0xFF0000,
.description = description
};

struct discord_interaction_response interactionRespParams = {
.type = DISCORD_INTERACTION_CHANNEL_MESSAGE_WITH_SOURCE,
.data = &(struct discord_interaction_callback_data) {
.embeds = &(struct discord_embeds){
.size = 1,
.array = &embed,
}
}
};

discord_create_interaction_response(app.bot, event->id, event->token, &interactionRespParams, NULL);
free(description);
}

void youtube(tnic_application app, const struct discord_interaction *event) {
struct coglink_player *player = coglink_create_player(app.client, event->guild_id);
if (!player) {
Expand Down Expand Up @@ -175,20 +203,34 @@ void youtube(tnic_application app, const struct discord_interaction *event) {

if (app.playlistController->playlist == NULL) {
app.playlistController->playlist = playlist_init(track);

// NOT FOR RELEASE ---------------
app.playlistController->playlist->channelId = event->channel_id;
testSendTrackInfo(app, event, track->trackInfo->title);
// NOT FOR RELEASE ---------------

playTrack(app, player, track, event->guild_id, user->channel_id);
} else {
tnic_errnoReturn errno = playlist_addTrack(app.playlistController->playlist, track);
return;
}

if (errno.Err == tnic_IS_NULL) {
tnic_sendErrorEmbed(app, event, "#eAx1",
"Failed to process request. Report this issue to administrator");
return;
}
tnic_errnoReturn errno = playlist_addTrack(app.playlistController->playlist, track);

// NOT FOR RELEASE ---------------
app.playlistController->playlist->channelId = event->channel_id;
// NOT FOR RELEASE ---------------

if (errno.additionalNumber == 1) {
log_debug("Playing");
playTrack(app, player, track, event->guild_id, user->channel_id);
}
if (errno.Err == tnic_IS_NULL) {
tnic_sendErrorEmbed(app, event, "#eAx1",
"Failed to process request. Report this issue to administrator");
return;
}

if (errno.additionalNumber == 1) {
// NOT FOR RELEASE ---------------
testSendTrackInfo(app, event, track->trackInfo->title);
// NOT FOR RELEASE ---------------
playTrack(app, player, track, event->guild_id, user->channel_id);
return;
}

struct discord_interaction_response interactionRespParams = {
Expand Down Expand Up @@ -304,13 +346,66 @@ void testPause(const tnic_application app, const struct discord_interaction *eve
discord_create_interaction_response(app.bot, event->id, event->token, &interactionRespParams, NULL);
}

macro_testCommand()
void testnEXT(tnic_application app, const struct discord_interaction *event) {
tnic_errnoReturn errno = playlist_changeTrack(app.playlistController->playlist, false, false);

if (errno.Err == tnic_PLAYLIST_END) {
tnic_sendErrorEmbed(app, event, "the_end", "End of playlist");
coglink_destroy_player(app.client, coglink_get_player(app.client, event->guild_id));
coglink_remove_player(app.client, coglink_get_player(app.client, event->guild_id));
return;
}

if (app.playlistController->playlist->tracks == NULL) {
tnic_sendErrorEmbed(app, event, "#e005", "Not playing anything");
return;
}

tnic_track *track = (tnic_track*)errno.Ok;

struct coglink_update_player_params params = {
.track = &(struct coglink_update_player_track_params) {
.encoded = track->encodedTrack
}
};

char *description = (char*)malloc(MUSIC_TITLE_STRLEN);
snprintf(description, MUSIC_TITLE_STRLEN, "Now playing: **%s**", track->trackInfo->title);

struct discord_embed embed = {
.color = 0xFF0000,
.description = description
};

struct discord_interaction_response interactionRespParams = {
.type = DISCORD_INTERACTION_CHANNEL_MESSAGE_WITH_SOURCE,
.data = &(struct discord_interaction_callback_data) {
.embeds = &(struct discord_embeds){
.size = 1,
.array = &embed,
}
}
};

discord_create_interaction_response(app.bot, event->id, event->token, &interactionRespParams, NULL);
free(description);

coglink_update_player(app.client, coglink_get_player(app.client, event->guild_id), &params, NULL);
}

// Public functions
void tnic_proccessApplicationCommand(tnic_application app, const struct discord_interaction *event) {
if (strcmp(event->data->name, "youtube") == 0) {
youtube(app, event);
return;
}

if (app.playlistController->playlist == NULL) {
tnic_sendErrorEmbed(app, event, "#e002a", "Bot is not connected to the voice channel");
return;
}

if (strcmp(event->data->name, "disconnect") == 0) {
disconnect(app, event);
return;
Expand All @@ -325,6 +420,11 @@ void tnic_proccessApplicationCommand(tnic_application app, const struct discord_
testRepeat(app, event);
return;
}

if (strcmp(event->data->name, "next") == 0) {
testnEXT(app, event);
return;
}
}

void tnic_registerMusicCommands(struct discord *bot, const struct discord_ready *event) {
Expand Down Expand Up @@ -359,6 +459,12 @@ void tnic_registerMusicCommands(struct discord *bot, const struct discord_ready
.description = "Toggle pause for current track"
};

struct discord_create_global_application_command nextCommand = {
.name = "next",
.description = "Skip this track"
};

discord_create_global_application_command(bot, event->application->id, &nextCommand, NULL);
discord_create_global_application_command(bot, event->application->id, &pauseCommand, NULL);
discord_create_global_application_command(bot, event->application->id, &repeatCommand, NULL);
discord_create_global_application_command(bot, event->application->id, &youtubeCommand, NULL);
Expand Down Expand Up @@ -386,6 +492,27 @@ void tnic_cmusicProcessEvent(tnic_application app, struct coglink_client *c_clie
}
};

if (app.playlistController->playlist->currentState != PLAYLIST_REPEAT_SINGLE_TRACK) {
char *description = (char*)malloc(MUSIC_TITLE_STRLEN);
snprintf(description, MUSIC_TITLE_STRLEN, "Now playing: **%s**", track->trackInfo->title);

struct discord_embed embed = {
.color = 0xFF0000,
.description = description
};

struct discord_create_message params = {
.flags = 0,
.embeds = &(struct discord_embeds){
.size = 1,
.array = &embed,
},
};

discord_create_message(app.bot, app.playlistController->playlist->channelId, &params, NULL);
free(description);
}

coglink_update_player(app.client, coglink_get_player(app.client, trackEnd->guildId), &params, NULL);
}
}
2 changes: 2 additions & 0 deletions src/playlist.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ void playlist_clearPlaylist(tnic_playlist *playlist) {
playlist->currentState = PLAYLIST_NORMAL;

free(playlist->tracks);
playlist->tracks = NULL;
}

tnic_errnoReturn playlist_getTrack(tnic_playlist *playlist, const uint32_t position) {
Expand Down Expand Up @@ -110,6 +111,7 @@ tnic_playlist* playlist_init(tnic_track *track) {
tnic_playlist *playlist = (tnic_playlist*)malloc(sizeof(tnic_playlist));
playlist->tracks = malloc(sizeof(tnic_track*));

playlist->currentState = PLAYLIST_NORMAL;
playlist->currentTrack = track;
playlist->tracks[0] = track;
playlist->isPaused = false;
Expand Down
2 changes: 2 additions & 0 deletions src/playlist.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ typedef struct {
size_t size;
uint32_t position;

u64snowflake channelId; // NOT FOR RELEASE

tnic_track **tracks;
tnic_track *currentTrack;
} tnic_playlist;
Expand Down

0 comments on commit 7359959

Please sign in to comment.