
commit e946bf124602f224ce0e371ba1374f0355b537eb
Merge: d6a4e64
4505909
Author: Rosemary Witchaven <32779090+in1tiate@users.noreply.github.com>
Date: Fri Jan 28 19:43:36 2022 -0600
Merge pull request #225 from Salanto/Dynamic-Area-Musiclist-Take2
Allow users to add custom songs to the music list on a per-area basis
commit 45059092d2888b60912f721e43a380910d10ccd8
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Mon Jan 24 22:05:27 2022 +0100
TIL what a typedef is
commit 02584db9640fff0a1969a7f516c4bccfae9b5388
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Mon Jan 24 21:39:17 2022 +0100
Not all OR are equal. Explain weird command splitting
Remove hardcoded URLs
commit d00ebd5692296cd0c29dd377113b53fe0e7b99c0
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Mon Jan 24 21:28:08 2022 +0100
Salanto PR Language Update by in1tiate
As usual, my English is absolutely unreadable.
Co-authored-by: Rosemary Witchaven <32779090+in1tiate@users.noreply.github.com>
commit d3842106e06350dc02d8864bb28232fdc5643f00
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Mon Jan 24 20:35:32 2022 +0100
Add missing config file + document commands for help
commit ac64360e1c1741023b01052977de77a7d5ea4f8c
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Mon Jan 24 19:52:13 2022 +0100
Minor improvements to command usage and addition of clear command
commit c614578e78ce9afa0c8e22aa36bdf46a70a97169
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Sun Jan 23 22:19:54 2022 +0100
Purge last traces of old songInformation system
commit 07618761f044a13d75587b28a9c994342a5980e2
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Sun Jan 23 22:10:54 2022 +0100
Working version, needs some refinement and debugging in AOClient
commit 33c0358c98c0fd2de805356a9aa3ac7bbed204e1
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Sun Jan 23 21:48:05 2022 +0100
Almost functional implementation
Now only need to determine why I can't play the customs yet
commit b0acbace78b3f16f2fe4f3c6f65a422e3343f992
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Sun Jan 23 15:26:42 2022 +0100
Fix build error, expand validation test slightly
commit a48c4f503998ce8e42f0bb409c5a3c7dc5e40329
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Sun Jan 23 01:03:27 2022 +0100
Add commands
commit 88ab0b473953873166e291e5009b97df31547b3f
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Sat Jan 22 15:10:26 2022 +0100
Float sucks, int has to be good enough
+ add retrival of song information
commit e924e1340be1a0909eba84072f1646fe9770bd02
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Thu Jan 20 22:28:35 2022 +0100
Fix removing moving
Add necessary tests
commit 3df088f8d07ce7e0d8fe08b6a97608a623e6ef97
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Wed Jan 19 19:34:16 2022 +0100
Start work on adding this shit into commands
commit c293ecfa99d1b2bd1e0b34cb8752d69b2eca057c
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Tue Jan 18 19:07:11 2022 +0100
Fix typo and add singal for incremental upgrades
commit 10a42322e1e23af5795278a40b2ac59f3ab952ef
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Tue Jan 18 06:17:51 2022 +0100
Hookup packet sending to music manager
This might sound like a bad idea on first glance, but otherwise it breaks the AreaData tests and I am NOT gonna try to fix those without even understanding why they break.
commit 319836296374162b0b847432e8a626778317b869
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Tue Jan 18 06:17:51 2022 +0100
Enraged comments, make area send FM packet
Revert "Enraged comments, make area send FM packet"
This reverts commit ec7a1a25646b2c2acc8a3a748b853851cc47d205.
commit 224a0d7efe989a5f336167c3f716061813f93ee3
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Tue Jan 18 05:10:18 2022 +0100
Change packet communication from area to client
First steps to hookup the custom musiclist.
commit 65aa8f7855a36f2c668b1399a5ed22fefeaf186d
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Mon Jan 17 00:48:38 2022 +0100
Add test for custom list sanitisation.
+ Fix intentionally broken tests
commit 7c00ab437a6ff12033742d029ce49037f5bb1ebe
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Mon Jan 17 00:29:51 2022 +0100
Sanitise the custom list opposed to deleting it
This will fail tests intentionally to test the CI.
commit 80ad401267068e75707b2517a0bf836763141f8b
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Sun Jan 16 17:17:12 2022 +0100
Add custom category capabilities
commit 08d8f5f8f683816ceba532f9c47cd0d5ab34389a
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Sun Jan 16 03:58:18 2022 +0100
Fix music addition and move relevant tests
commit 6ebf0d03b5da61a9c287115009d28038710ba7af
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Sat Jan 15 08:08:20 2022 +0100
Hookup music_manager into server, change default musiclist source for new clients
+ More tests 🆒
commit bd50c62376f131e2508ecdd3e272209894ecaec1
Author: Salanto <62221668+Salanto@users.noreply.github.com>
Date: Sat Jan 15 03:13:42 2022 +0100
Add central song validator for other classes
Also added applicable test cases to ensure proper operation.
215 lines
7.0 KiB
C++
215 lines
7.0 KiB
C++
//////////////////////////////////////////////////////////////////////////////////////
|
|
// akashi - a server for Attorney Online 2 //
|
|
// Copyright (C) 2020 scatterflower //
|
|
// //
|
|
// This program is free software: you can redistribute it and/or modify //
|
|
// it under the terms of the GNU Affero General Public License as //
|
|
// published by the Free Software Foundation, either version 3 of the //
|
|
// License, or (at your option) any later version. //
|
|
// //
|
|
// This program is distributed in the hope that it will be useful, //
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
|
|
// GNU Affero General Public License for more details. //
|
|
// //
|
|
// You should have received a copy of the GNU Affero General Public License //
|
|
// along with this program. If not, see <https://www.gnu.org/licenses/>. //
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
#ifndef MUSIC_MANAGER_H
|
|
#define MUSIC_MANAGER_H
|
|
|
|
#include <QObject>
|
|
#include <QMap>
|
|
#include <QHash>
|
|
#include <QPair>
|
|
|
|
#include <include/config_manager.h>
|
|
#include <include/aopacket.h>
|
|
|
|
class MusicManager : public QObject
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
|
|
/**
|
|
* @brief Constructor for the server-wide musiclist manager.
|
|
*
|
|
* @param Copy of the server musiclist generated by ConfigManager::musiclist();
|
|
*/
|
|
MusicManager(QObject* parent = nullptr, QStringList f_root_ordered = {}, QStringList f_cdns = {"cdn.discord.com"},
|
|
QMap<QString, QPair<QString, int> > f_root_list = ConfigManager::musiclist());
|
|
|
|
/**
|
|
* @brief Destructor for the server-wide musiclist manager.
|
|
*/
|
|
virtual ~MusicManager();
|
|
|
|
/**
|
|
* @brief Returns a musiclist with aliased names.
|
|
*
|
|
* @return See short description.
|
|
*/
|
|
QStringList musiclist(int f_area_id);
|
|
|
|
/**
|
|
* @brief Returns only the root musiclist with aliased names.
|
|
*
|
|
*/
|
|
QStringList rootMusiclist();
|
|
|
|
/**
|
|
* @brief Adds a new area to the music_manager.
|
|
*
|
|
* @param f_area_id ID of the new area being added.
|
|
*
|
|
* @return Returns false if registering the area fails.
|
|
*/
|
|
bool registerArea(int f_area_id);
|
|
|
|
/**
|
|
* @brief Validates the song candidate to be played. If validation fails, false is returned.
|
|
*
|
|
* @param f_song_name The song to be played. Can be an http/https stream or a local file.
|
|
*
|
|
* @param f_approved_cdns A list of approved remote content sources.
|
|
*
|
|
* @return Wether or not the song can be played or added.
|
|
*/
|
|
bool validateSong(QString f_song_name, QStringList f_approved_cdns);
|
|
|
|
/**
|
|
* @brief Attempts to add the new song to the custom musiclist.
|
|
*
|
|
* @param f_song_name Friendly name shown in the clients musiclist.
|
|
*
|
|
* @param f_real_name Real name/url of the file.
|
|
*
|
|
* @param f_duration Playtime of the musicfile in seconds.
|
|
*
|
|
* @param f_area_id Area id of the clients current area.
|
|
*
|
|
* @return Returns true on success, false on fail.
|
|
*/
|
|
bool addCustomSong(QString f_song_name, QString f_real_name, int f_duration, int f_area_id);
|
|
|
|
/**
|
|
* @brief Attempts to add the new category to the custom musiclist.
|
|
*
|
|
* @param f_category_name Category name candidate.
|
|
*
|
|
* @return Returns true on saccess, false on fail.
|
|
*/
|
|
bool addCustomCategory(QString f_category_name, int f_area_id);
|
|
|
|
/**
|
|
* @brief Removes either a song or a category from the custom list.
|
|
*
|
|
* @param Name of the category or song to remove
|
|
*
|
|
* @return True on success, false on failure.
|
|
*/
|
|
bool removeCategorySong(QString f_songcategory_name, int f_area_id);
|
|
|
|
/**
|
|
* @brief Toggles wether the root list is included for this area.
|
|
* This also delets the custom llist if it was enabled prior.
|
|
*
|
|
* @return Current state of the music list.
|
|
*/
|
|
bool toggleRootEnabled(int f_area_id);
|
|
|
|
/**
|
|
* @brief Removes conflicting songnames from the custom list.
|
|
*
|
|
* @param f_area_id Id of the area this is invoked in.
|
|
*/
|
|
void sanitiseCustomList(int f_area_id);
|
|
|
|
/**
|
|
* @brief Removes all entries from the custom list.
|
|
* @param f_area_id Id of the area custom list.
|
|
*/
|
|
void clearCustomList(int f_area_id);
|
|
|
|
/**
|
|
* @brief Returns song information necessary for the operation of the jukebox.
|
|
* @param Alias name of the song.
|
|
* @param Area of the jukebox checking for information.
|
|
* @return Returns a QPair with the true name and duration of the invoked song.
|
|
*/
|
|
QPair<QString, int> songInformation(QString f_song_name, int f_area_id);
|
|
|
|
/**
|
|
* @brief Checks if a song is part of the clients current area custom list.
|
|
*
|
|
* @return Returns true if the song exists as a custom song.
|
|
*/
|
|
bool isCustom(int f_area_id, QString f_song_name);
|
|
|
|
public slots:
|
|
|
|
/**
|
|
* @brief Updates the root musiclist and CDN list.
|
|
*/
|
|
void reloadRequest();
|
|
|
|
/**
|
|
* @brief Triggers sending of FM packet to client joining a new area.
|
|
*/
|
|
void userJoinedArea(int f_area_index, int f_user_id);
|
|
|
|
signals:
|
|
|
|
/**
|
|
* @brief Sends the FM packet with the musiclist of the area when a client enters.
|
|
*
|
|
* @param f_packet FM packet with the full musiclist, when enabled, and custom list.
|
|
*
|
|
* @param f_user_id temporary userid of the incoming client.
|
|
*/
|
|
void sendFMPacket(AOPacket f_packet, int f_user_id);
|
|
|
|
/**
|
|
* @brief Sends the FM packet with the musiclist of the area when changes are made.
|
|
*
|
|
* @param f_packet FM packet with the full musiclist, when enabled, and eventual custom list.
|
|
*
|
|
* @param f_area_index Index of the current area the edit is made in.
|
|
*/
|
|
void sendAreaFMPacket(AOPacket f_packet, int f_area_index);
|
|
|
|
private:
|
|
|
|
/**
|
|
* @brief Contains all custom lists of all areas in the server.
|
|
*/
|
|
QHash<int,MusicList>* m_custom_lists;
|
|
|
|
/**
|
|
* @brief Server musiclist shared among all areas.
|
|
*/
|
|
MusicList m_root_list;
|
|
|
|
/**
|
|
* @brief QList with the ordered musiclist.
|
|
*/
|
|
QStringList m_root_ordered;
|
|
|
|
/**
|
|
* @brief Contains all custom songs ordered in a per-area buffer.
|
|
*/
|
|
QMap<int,QStringList> m_customs_ordered;
|
|
|
|
/**
|
|
* @brief Wether the global musiclist is prepend and validation when adding custom music.
|
|
*/
|
|
QHash<int,bool> m_global_enabled;
|
|
|
|
/**
|
|
* @brief Contains all server approved content sources.
|
|
*/
|
|
QStringList m_cdns;
|
|
};
|
|
|
|
#endif // MUSIC_MANAGER_H
|