From b2f40f21cf9481f4f3235991acfc74c04ff5f52d Mon Sep 17 00:00:00 2001 From: HappyTanuki Date: Tue, 12 Dec 2023 22:20:01 +0900 Subject: [PATCH] =?UTF-8?q?join,=20play=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 7 ++ .vscode/c_cpp_properties.json | 0 .vscode/launch.json | 30 +++++++- .vscode/settings.json | 85 +++++++++++---------- .vscode/tasks.json | 54 +++++++------ CMakeLists.txt | 76 +++++++++++++++++++ audioplayback.ogg | Bin 0 -> 373294 bytes cmake/FindDPP.cmake | 7 ++ include/Bot.cpp | 6 -- include/Bot.hpp | 14 +++- include/BumbleCee.cpp | 2 - include/BumbleCee.hpp | 15 ---- include/BumbleCeepp.hpp | 20 +++++ include/CommandType.hpp | 12 +++ include/Commands.hpp | 4 + include/Commands/Join.hpp | 10 +++ include/Commands/Play.hpp | 10 +++ include/Commands/Queue.hpp | 10 +++ main | Bin 460696 -> 0 bytes main.cpp | 13 ---- src/Bot.cpp | 40 ++++++++++ src/BumbleCeepp.cpp | 15 ++++ src/Join.cpp | 25 ++++++ src/Play.cpp | 138 ++++++++++++++++++++++++++++++++++ src/Queue.cpp | 14 ++++ src/main.cpp | 27 +++++++ 26 files changed, 526 insertions(+), 108 deletions(-) create mode 100644 .gitignore delete mode 100644 .vscode/c_cpp_properties.json create mode 100644 CMakeLists.txt create mode 100644 audioplayback.ogg create mode 100644 cmake/FindDPP.cmake delete mode 100644 include/Bot.cpp delete mode 100644 include/BumbleCee.cpp delete mode 100644 include/BumbleCee.hpp create mode 100644 include/BumbleCeepp.hpp create mode 100644 include/CommandType.hpp create mode 100644 include/Commands.hpp create mode 100644 include/Commands/Join.hpp create mode 100644 include/Commands/Play.hpp create mode 100644 include/Commands/Queue.hpp delete mode 100755 main delete mode 100644 main.cpp create mode 100644 src/Bot.cpp create mode 100644 src/BumbleCeepp.cpp create mode 100644 src/Join.cpp create mode 100644 src/Play.cpp create mode 100644 src/Queue.cpp create mode 100644 src/main.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..42f7c7e --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +build/ +out/ +.vs/ +.vscode/ +.idea/ +tmp/ +config.json diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json deleted file mode 100644 index e69de29..0000000 diff --git a/.vscode/launch.json b/.vscode/launch.json index 5c7247b..07565c9 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,7 +1,29 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", - "configurations": [] + "configurations": [ + { + "name": "Debug", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/build/BumbleCee", + "stopAtEntry": false, + "cwd": "${fileDirname}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "description": "Set Disassembly Flavor to Intel", + "text": "-gdb-set disassembly-flavor intel", + "ignoreFailures": true + } + ], + "preLaunchTask": "${defaultBuildTask}" + } + ] } \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 7695765..e238adf 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,19 +1,56 @@ { "files.associations": { "iostream": "cpp", + "any": "cpp", + "chrono": "cpp", + "codecvt": "cpp", + "compare": "cpp", + "condition_variable": "cpp", + "deque": "cpp", + "forward_list": "cpp", + "list": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "optional": "cpp", + "string_view": "cpp", + "random": "cpp", + "*.tcc": "cpp", + "fstream": "cpp", + "future": "cpp", + "initializer_list": "cpp", + "istream": "cpp", + "mutex": "cpp", + "new": "cpp", + "ostream": "cpp", + "ranges": "cpp", + "semaphore": "cpp", + "shared_mutex": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "stop_token": "cpp", + "streambuf": "cpp", + "system_error": "cpp", + "thread": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "typeinfo": "cpp", + "valarray": "cpp", + "variant": "cpp", "array": "cpp", "atomic": "cpp", "bit": "cpp", - "*.tcc": "cpp", - "bitset": "cpp", "cctype": "cpp", - "chrono": "cpp", + "charconv": "cpp", "clocale": "cpp", "cmath": "cpp", - "compare": "cpp", - "complex": "cpp", "concepts": "cpp", - "condition_variable": "cpp", + "coroutine": "cpp", "csignal": "cpp", "cstdarg": "cpp", "cstddef": "cpp", @@ -24,48 +61,14 @@ "ctime": "cpp", "cwchar": "cpp", "cwctype": "cpp", - "deque": "cpp", - "list": "cpp", "map": "cpp", - "set": "cpp", - "string": "cpp", - "unordered_map": "cpp", - "unordered_set": "cpp", - "vector": "cpp", - "exception": "cpp", "algorithm": "cpp", - "functional": "cpp", - "iterator": "cpp", - "memory": "cpp", - "memory_resource": "cpp", "numeric": "cpp", - "random": "cpp", "ratio": "cpp", - "regex": "cpp", - "source_location": "cpp", - "string_view": "cpp", - "system_error": "cpp", - "tuple": "cpp", - "type_traits": "cpp", "utility": "cpp", - "fstream": "cpp", - "future": "cpp", - "initializer_list": "cpp", "iomanip": "cpp", "iosfwd": "cpp", - "istream": "cpp", "limits": "cpp", - "mutex": "cpp", - "new": "cpp", - "numbers": "cpp", - "ostream": "cpp", - "semaphore": "cpp", - "sstream": "cpp", - "stdexcept": "cpp", - "stop_token": "cpp", - "streambuf": "cpp", - "thread": "cpp", - "cinttypes": "cpp", - "typeinfo": "cpp" + "numbers": "cpp" } } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index e30858d..1b14456 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,31 +1,35 @@ { + "version": "2.0.0", "tasks": [ - { - "type": "cppbuild", - "label": "C/C++: g++ build active file", - "command": "/usr/bin/g++", - "args": [ - "-fdiagnostics-color=always", - "-g", - "${file}", - "-o", - "${fileDirname}/${fileBasenameNoExtension}", - "-I", - "${fileDirname}/include", - "-ldpp" - ], - "options": { - "cwd": "${fileDirname}" + { + "type": "cppbuild", + "label": "make", + "command": "make", + "args": [], + "options": { + "cwd": "${fileDirname}/../build" + }, + "group": { + "kind": "build", + "isDefault": true + }, + "dependsOn": ["cmake"] }, - "problemMatcher": [ - "$gcc" - ], - "group": { - "kind": "build", - "isDefault": true + { + "type": "shell", + "label": "cmake", + "command": "cmake", + "args": [ + ".." + ], + "options": { + "cwd": "${fileDirname}/../build" + }, + "group": { + "kind": "build", + "isDefault": false + } }, - "detail": "compiler: /usr/bin/g++" - } ] - } \ No newline at end of file +} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..cf49b53 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,76 @@ +cmake_minimum_required (VERSION 3.6) + +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) +set(BOT_NAME "BumbleCee") + +project(${BOT_NAME}) +aux_source_directory("src" coresrc) +add_executable(${BOT_NAME} ${coresrc}) + +string(ASCII 27 Esc) + +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + +set_target_properties(${BOT_NAME} PROPERTIES + CXX_STANDARD 17 + CXX_STANDARD_REQUIRED ON +) + +set(THREADS_PREFER_PTHREAD_FLAG TRUE) +find_package(Threads REQUIRED) +find_package(DPP) +if(APPLE) + if(CMAKE_APPLE_SILICON_PROCESSOR) + set(OPENSSL_ROOT_DIR "/opt/homebrew/opt/openssl") + else() + set(OPENSSL_ROOT_DIR "/usr/local/opt/openssl") + endif() + find_package(OpenSSL REQUIRED) +else() + find_package(OpenSSL REQUIRED) +endif() + +target_include_directories(${BOT_NAME} PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${OPENSSL_INCLUDE_DIR} + /usr/local/include/opus +) + +target_link_libraries(${BOT_NAME} + dl + oggz + opus + opusfile + ogg + ${CMAKE_THREAD_LIBS_INIT} + ${OPENSSL_CRYPTO_LIBRARY} + ${OPENSSL_SSL_LIBRARY} +) + +if (DPP_FOUND) + target_link_libraries(${BOT_NAME} ${DPP_LIBRARIES}) + target_include_directories(${BOT_NAME} PUBLIC ${DPP_INCLUDE_DIR}) +else() + message(WARNING "Could not find DPP install. Building from source instead.") + option(DPP_BUILD_TEST "" OFF) + include(FetchContent) + + FetchContent_Declare( + libdpp + GIT_REPOSITORY https://github.com/brainboxdotcc/DPP.git + GIT_TAG master) + + FetchContent_GetProperties(libdpp) + if(NOT libdpp_POPULATED) + FetchContent_Populate(libdpp) + target_include_directories(${BOT_NAME} PUBLIC + ${libdpp_SOURCE_DIR}/include + ) + add_subdirectory( + ${libdpp_SOURCE_DIR} + ${libdpp_BINARY_DIR} + EXCLUDE_FROM_ALL) + endif() + + target_link_libraries(${BOT_NAME} dpp) +endif() diff --git a/audioplayback.ogg b/audioplayback.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1abef2c30ac31cedba2b61a38fe5b9e63e59908b GIT binary patch literal 373294 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