Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
f01d9e3
rewrite (not finished)
FireMario211 Feb 6, 2026
0215cea
feat: daily chests
FireMario211 Feb 8, 2026
3736fb3
add more to rewrite
FireMario211 Feb 16, 2026
2ebbb75
mod.json
FireMario211 Feb 21, 2026
6179420
whoops
FireMario211 Feb 21, 2026
260b57b
events ui temp fix
FireMario211 Mar 7, 2026
0e11a19
push version
FireMario211 Mar 8, 2026
1d9e358
fix chest issue
FireMario211 Mar 8, 2026
c39d807
add backgrounds and remove level sharing temporarily
FireMario211 Apr 3, 2026
7712f46
Fix image URL formatting in about.md (#69)
Cvolton Apr 11, 2026
34fb167
push current changes (unfinished)
FireMario211 Apr 19, 2026
ac0b50a
update(rewrite): Fixed badge crash
Jouca Apr 22, 2026
563b76c
add refresh rewards
FireMario211 Apr 22, 2026
681388b
fix mod from not compiling on actions
FireMario211 Apr 22, 2026
ce40f22
update(rewrite): Add back MoreLeaderboards
Jouca Apr 22, 2026
78fc96e
Merge branch 'rewrite' of https://github.com/Jouca/GDUtils-Geode into…
Jouca Apr 22, 2026
5968023
add(rewrite): Add gdAwards2025Badge
Jouca Apr 22, 2026
f3eb477
revert to step2 as the other doesnt appear to work
FireMario211 Apr 23, 2026
936fb13
fix(rewrite): Tentative of fixing chest bug
Jouca Apr 23, 2026
bf724c2
update(rewrite): Rewrite DailyChest
Jouca Apr 23, 2026
5116dfb
update(rewrite): Rewrite gauntlets
Jouca Apr 23, 2026
381604c
release(rewrite): Push beta version
Jouca Apr 23, 2026
09f5478
fix(rewrite): Fixed comments colors for roles
Jouca Apr 24, 2026
f63b777
fix(main): Fix daily chest delegate
Jouca May 12, 2026
81fd701
update(rewrite): Bump geode version to 5.7.1
Jouca May 12, 2026
969347a
release(rewrite): Bump version to v1.6.0-beta.4
Jouca May 12, 2026
f692673
update(rewrite): Revert geode version to 5.6.1
Jouca May 12, 2026
4f6d9e5
update(rewrite): Remove discord-rpc submodule and related binaries
Jouca May 13, 2026
b235bb9
fix aredl (pointercrate blocked unfortunately)
FireMario211 Jun 30, 2026
6feb03a
update(rewrite): enhance AMQT::setupChannel with queue expiration safety
Jouca Aug 3, 2026
ce3241a
update(mod.json): upgrade geode version to 5.8.2
Jouca Aug 3, 2026
cf811bc
update(badges): replace badge images with updated versions
Jouca Aug 3, 2026
fa7a6ac
update(changelog): finalize version 1.6.0 and update mod.json version
Jouca Aug 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
build-linux/
build-android/
build-armv8/
build-android*/
test/build-linux
test/compile_commands.json
.cache/
Expand Down
5 changes: 1 addition & 4 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
[submodule "libs/pl_mpeg"]
[submodule "libs/pl_mpeg"]
path = libs/pl_mpeg
url = https://github.com/phoboslab/pl_mpeg
[submodule "libs/discord-rpc"]
path = libs/discord-rpc
url = https://github.com/discord/discord-rpc
23 changes: 17 additions & 6 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -1,19 +1,30 @@
{
// 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": [
{
"name": "(Windows) Launch",
"name": "Launch GD (Debug)",
"type": "cppvsdbg",
"request": "launch",
"program": "C:\\Program Files (x86)\\Steam\\steamapps\\common\\Geometry Dash\\GeometryDash.exe",
"args": [],
"stopAtEntry": false,
"cwd": "C:\\Program Files (x86)\\Steam\\steamapps\\common\\Geometry Dash\\",
"environment": [],
"console": "internalConsole"
"console": "internalConsole",
"symbolSearchPath": "${workspaceFolder}\\build",
"sourceFileMap": {
"C:/Users/proga/Desktop/Codes/Geode projets/GDUtils-Geode": "${workspaceFolder}"
}
},
{
"name": "Attach to GD",
"type": "cppvsdbg",
"request": "attach",
"processId": "${command:pickProcess}",
"symbolSearchPath": "${workspaceFolder}\\build",
"sourceFileMap": {
"C:/Users/proga/Desktop/Codes/Geode projets/GDUtils-Geode": "${workspaceFolder}"
}
}
]
}
}
42 changes: 9 additions & 33 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,39 +14,10 @@ endif()
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
include(cmake/CPM.cmake)

if(NOT DEFINED GEODE_TARGET_PLATFORM)
set(GEODE_TARGET_PLATFORM "Win64")
set(GEODE_GD_VERSION 2.2074)
set(GEODE_COMP_GD_VERSION 22074)
endif()

if (${GEODE_TARGET_PLATFORM} STREQUAL "Win64")
set(GEODE_COMPILER "clang-cl")
set(GEODE_CCACHE_VARIANT "sccache")
#set(GEODE_TRIPLE "x86_64-unknown-windows-msvc")
if(WIN32) # force it!
set(CMAKE_SYSTEM_PROCESSOR x86_64)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m64")
endif()
endif()

set(PROJECT_NAME GDUtils)
project(${PROJECT_NAME} VERSION 1.0.0)

# Use GLOB_RECURSE instead of GLOB
# to recursively add all source files
# under src/
file(GLOB SOURCES
src/*.cpp
src/MoreLeaderboards/*.cpp
src/Notifications/*.cpp
src/Secret/*.cpp
src/Settings/*.cpp
src/Utils/*.cpp
src/Styles/*.cpp
include/*.cpp
)
file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS src/*.cpp)

# Set up the mod binary
add_library(${PROJECT_NAME} SHARED ${SOURCES})
Expand All @@ -60,19 +31,24 @@ set(BUILD_TOOLS_DOCS OFF)
#set(INSTALL_STATIC_LIBS OFF)
CPMAddPackage("gh:alanxz/rabbitmq-c#035eaa8")

if (WIN32)
target_compile_options(rabbitmq-static PRIVATE -Wno-incompatible-pointer-types)
endif()

set(BUILD_TESTING OFF)
set(BUILD_BENCH OFF)
set(BUILD_SHARED_LIBS OFF)

#CPMAddPackage("gh:libuv/libuv#c1a9f01")
#CPMAddPackage("gh:CopernicaMarketingSoftware/AMQP-CPP#ca49382")

CPMAddPackage("gh:camila314/uibuilder#main") # i love it

target_include_directories(${PROJECT_NAME} PRIVATE
libs/filesystem
libs/pl_mpeg/
libs/glew/
${rabbitmq-c_SOURCE_DIR}/include
src/
#${amqpcpp_SOURCE_DIR}/src
#${amqpcpp_SOURCE_DIR}/include
#${libuv_SOURCE_DIR}/include
Expand All @@ -87,10 +63,10 @@ endif()
add_subdirectory($ENV{GEODE_SDK} ${CMAKE_CURRENT_BINARY_DIR}/geode)

if (APPLE AND NOT (${CMAKE_SYSTEM_NAME} STREQUAL "iOS" OR IOS))
target_link_libraries(${PROJECT_NAME} rabbitmq::rabbitmq-static "-framework OpenGL")
target_link_libraries(${PROJECT_NAME} UIBuilder rabbitmq::rabbitmq-static "-framework OpenGL")
#target_link_libraries(${PROJECT_NAME} uv_a amqpcpp "-framework OpenGL")
else()
target_link_libraries(${PROJECT_NAME} rabbitmq::rabbitmq-static)
target_link_libraries(${PROJECT_NAME} UIBuilder rabbitmq::rabbitmq-static)
#target_link_libraries(${PROJECT_NAME} uv_a amqpcpp)
endif()
if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux" AND WIN32)
Expand Down
25 changes: 21 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,28 @@ EventData data = {
GDUtils::Events::RateEvent::emit(data);
```

### Example Code (Listening for notification events from GDUtils)
### Example Code (Listening for notification events from GDUtils, and checking if the server is online)
```cpp
$execute {
new EventListener<EventFilter<GDUtils::Events::OnRate>>(+[](GDUtils::Events::OnRate* e) {
log::info("A rate event with the title {}", e->getTitle()); // A rate event with the title Small Daily Chest available!
// Listening for *any* rate event.
GDUtils::Events::OnRate().listen([](EventData const& e) {
log::info("A rate event with the title {}", e.getTitle()); // A rate event with the title Small Daily Chest available!
return ListenerResult::Propagate;
});

// Listening for rate events, filtering only by daily
GDUtils::Events::OnRate(EventType::Daily).listen([](EventData const& e) {
log::info("A daily event with the level name {}", e.getLevelName()); // A daily event with the level name Cycles
return ListenerResult::Propagate;
});

// Checking when we connected.
GDUtils::Events::OnServerConnect().listen([](bool const& connected) {
Loader::get()->queueInMainThread([connected]() {
if (connected) {
log::info("I am connected to the notifiaction servers!");
}
});
return ListenerResult::Propagate;
});
}
Expand All @@ -105,7 +122,7 @@ View the `test` directory if you want to view an example mod using the API.

## Libraries Used
- [Geode](https://github.com/geode-sdk/geode)
- [socket.io-client-cpp](https://github.com/socketio/socket.io-client-cpp)
- [rabbitmq-c](https://github.com/alanxz/rabbitmq-c)
- [pl_mpeg](https://github.com/phoboslab/pl_mpeg)

## Credits
Expand Down
2 changes: 1 addition & 1 deletion about.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
**by [Jouca](user:7026949) and [Firee](user:6253758)**
A Geometry Dash Mod for adding more tools such as Notifications, auto-song mute, game fixes & more!

![Mod Example](gdutilsdevs.gdutils/Screenshot_1.png&scale:0.8)
![Mod Example](gdutilsdevs.gdutils/Screenshot_1.png?scale:0.8)

# Need help?
* You can join our [Discord server](https://discord.gg/MU4Rpc6xbJ) for **any assistance** or about **next updates**, **sneak peeks** & **more**!
Expand Down
40 changes: 39 additions & 1 deletion changelog.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,44 @@
# Changelog
## <cj>v...</c> <cb>(---)</c>
## <cj>v1.6.0</c> <cb>(2026-08-03)</c>
* <cp>GDUtils ported & rewritten for Geode v5 (GD 2.2081)</c>
* <cg>Added</c> 2025 GD Awards badge.
* <cy>Changed</c> logic for chest notifications.
* <cy>Changed</c> locations for where GDUtils stores files.
* <cy>Adjusted</c> default parameters for the demon list to be <cb>AreDL</cy>
* <cy>Updated</c> UL staff badges textures.
* <cy>Fixed</c> Spotify feature not unmuting when playtesting in Editor.
* <cy>Fixed</c> notification being clickable.
* <cy>Fixed</c> chests crashing upon opening for Android.
* <cy>Fixed</c> daily chests being ignore on claiming.
* <cy>Fixed</c> GDUtils badges crashing when clicking to view details.
* <cy>Fixed</c> daily chests crashing.
* <cy>Fixed</c> AreDL demon placement not working.
* <cy>Fixed</c> notifications queue potentially staying open if the connection didn't close properly.

## <co>v1.6.0-beta.5</c> <cb>(2026-06-30)</c>
* <cy>Adjusted</c> default parameters for the demon list to be <cb>AreDL</cy>
* <cy>Fixed</c> AreDL demon placement not working.

## <co>v1.6.0-beta.4</c> <cb>(2026-05-13)</c>
* <cg>Added</c> 2025 GD Awards badge.
* <cy>Fixed</c> daily chests crashing.

## <co>v1.6.0-beta.3</c> <cb>(2026-04-24)</c>
* <cg>Added</c> back leaderboards & moderator list.
* <cg>Added</c> back custom backgrounds.
* <cy>Fixed</c> daily chests being ignore on claiming.
* <cy>Fixed</c> GDUtils badges crashing when clicking to view details.

## <co>v1.6.0-beta.2</c> <cb>(2026-03-08)</c>
* <cy>Fixed</c> chests crashing upon opening for Android.

## <co>v1.6.0-beta.1</c> <cb>(2026-03-08)</c>
* <cp>GDUtils ported to Geode 5.0.0 (GD 2.2081)</c>
* <cy>Changed</c> logic for chest notifications.
* <cy>Changed</c> locations for where GDUtils stores files.
* <cy>Temporarily removed</c> leaderboards due to not being rewritten yet.
* <cy>Fixed</c> Spotify feature not unmuting when playtesting in Editor.
* <cy>Fixed</c> notification being clickable.

## <cj>v1.5.4</c> <cb>(2025-09-09)</c>
* <cg>Added</c> coloured container animation when searching a friend on the friend list.
Expand Down
74 changes: 8 additions & 66 deletions include/RateEvent.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,75 +4,17 @@
#include "Types.hpp"

namespace GDUtils::Events {
class RateEvent : public geode::Event {
protected:
EventData m_eventData;
class RateEvent : public geode::Event<RateEvent, bool(EventData&)> {
public:
RateEvent(EventData data) : m_eventData(data) {};

EventType getEventType() const { return m_eventData.type; };
std::string getLevelName() const { return m_eventData.level_name; };
int getLevelID() const { return m_eventData.level_id; };
using Event::Event;
static void emit(EventData data) {
RateEvent(data).post();
RateEvent().send(data);
};
EventData getData() const { return m_eventData; };
static EventType intToType(int type) {
switch (type) {
default:
return EventType::NA;
case 0: // Rate
return EventType::Rate;
case 1: // Daily
return EventType::Daily;
case 2: // Weekly
return EventType::Weekly;
case 3: // Small chest
return EventType::smallChest;
case 4: // Large chest
return EventType::largeChest;
case 5: // List
return EventType::List;
case 6: // Event
return EventType::Event;
case 7: // Announcement
return EventType::Announcement;
}
}
static int typeToInt(EventType type) {
switch (type) {
case EventType::NA:
return -1;
case EventType::Rate: // Rate
return 0;
case EventType::Daily: // Daily
return 1;
case EventType::Weekly: // Weekly
return 2;
case EventType::smallChest: // Small chest
return 3;
case EventType::largeChest: // Large chest
return 4;
case EventType::List: // List
return 5;
case EventType::Event: // Event
return 6;
case EventType::Announcement: // Announcement
return 7;
}
}
};

class OnRate : public geode::Event {
protected:
EventData m_eventData;
public:
OnRate(EventData data) : m_eventData(data) {};

std::string getTitle() const { return m_eventData.title; };
EventType getEventType() const { return m_eventData.type; };
std::string getLevelName() const { return m_eventData.level_name; };
int getLevelID() const { return m_eventData.level_id; };
EventData getData() const { return m_eventData; };
struct OnRate final : geode::GlobalEvent<OnRate, bool(EventData&), bool(EventData&), EventType> {
using GlobalEvent::GlobalEvent;
};
struct OnServerConnect final : geode::ThreadSafeEvent<OnServerConnect, bool(bool)> {
using ThreadSafeEvent::ThreadSafeEvent;
};
}
68 changes: 68 additions & 0 deletions include/Types.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once
#include <Geode/Geode.hpp>
#include "RateEvent.hpp"
enum EventType {
Rate,
Daily,
Expand Down Expand Up @@ -28,6 +29,54 @@ struct EventData {
int level_id = -1;
std::string levels_list;
int maxToCompleteList = 0;
std::string getTitle() const { return title; };
EventType getEventType() const { return type; };
std::string getLevelName() const { return level_name; };
int getLevelID() const { return level_id; };
int typeToInt() const {
switch (type) {
case EventType::NA:
return -1;
case EventType::Rate: // Rate
return 0;
case EventType::Daily: // Daily
return 1;
case EventType::Weekly: // Weekly
return 2;
case EventType::smallChest: // Small chest
return 3;
case EventType::largeChest: // Large chest
return 4;
case EventType::List: // List
return 5;
case EventType::Event: // Event
return 6;
case EventType::Announcement: // Announcement
return 7;
}
}
EventType intToType(int intType) const {
switch (intType) {
default:
return EventType::NA;
case 0: // Rate
return EventType::Rate;
case 1: // Daily
return EventType::Daily;
case 2: // Weekly
return EventType::Weekly;
case 3: // Small chest
return EventType::smallChest;
case 4: // Large chest
return EventType::largeChest;
case 5: // List
return EventType::List;
case 6: // Event
return EventType::Event;
case 7: // Announcement
return EventType::Announcement;
}
}
};

template<>
Expand Down Expand Up @@ -110,4 +159,23 @@ struct matjson::Serialize<EventData> {
}
return geode::Ok(data);
}
static matjson::Value toJson(EventData const& value) {
auto val = Value::object();
val.set("demon", value.demon);
val.set("starsum", value.starsum);
val.set("starsum", value.starsum);
val.set("stars", value.stars);
val.set("rate", value.rate);
val.set("type", value.typeToInt());
val.set("title", value.title);
val.set("level_name", value.level_name);
val.set("level_creator", value.level_creator);
val.set("coins", value.coins);
val.set("verified_coins", value.verified_coins);
val.set("platformer", value.platformer);
val.set("level_id", value.level_id);
val.set("levels_list", value.levels_list);
val.set("maxToCompleteList", value.maxToCompleteList);
return val;
}
};
Loading
Loading