Skip to content

Commit 29b7d9f

Browse files
committed
api and some settings
1 parent d2ef385 commit 29b7d9f

File tree

16 files changed

+299
-37
lines changed

16 files changed

+299
-37
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
build-linux/
22
build-android/
33
build-armv8/
4+
test/build-linux
5+
test/compile_commands.json
46
.cache/
57
#libs/
68
libs.old/

CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ file(GLOB SOURCES
3535
src/Settings/*.cpp
3636
src/Utils/*.cpp
3737
src/Styles/*.cpp
38+
include/*.cpp
3839
)
3940

4041
# Set up the mod binary
@@ -70,6 +71,10 @@ if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux" AND WIN32)
7071
elseif(${GEODE_TARGET_PLATFORM} STREQUAL "Win32")
7172
target_link_libraries(${PROJECT_NAME} opengl32 ws2_32 Crypt32 Wldap32 Normaliz)
7273
endif()
74+
if (WIN32)
75+
# Disable annoying warnings
76+
target_compile_definitions(${PROJECT_NAME} PRIVATE _CRT_SECURE_NO_WARNINGS)
77+
endif()
7378

7479
# Set up dependencies, resources, link Geode
7580
setup_geode_mod(${PROJECT_NAME})

README.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,43 @@ __**Join the Discord and Follow the instructions to Receive your In-Game Perks!*
6666
### Moderator Info
6767
* You can view a description of either the Moderator, Elder Moderator, or other badges users have by clicking on the badge itself on the profile!
6868

69+
## API Usage
70+
Incase you want to utilize GDUtils for your Geode Mod, you can do so by using it's events!
71+
72+
### Events
73+
- `RateEvent` - For other mods wanting to "notify" the user through GDUtils. (You shouldn't use this as a listener)
74+
- `OnRate` - For checking when GDUtils gives out a rate notification. (You should use this only as a listener)
75+
76+
### Example Code (Pushing out a notification)
77+
```cpp
78+
EventData data = {
79+
true, // demon
80+
2, // starsum
81+
6, // stars
82+
1, // rate (0 = unrated, 1 = featured, 2 = epic, 3 = legendary, 4 = mythic)
83+
EventType::Rate, // type of notification
84+
"Custom Notification!", // notification title
85+
"GJ_square02.png", // sprite (MUST BE VALID OR WILL CRASH!)
86+
"Tidal Wave", // level name
87+
"By OniLinkGD", // level creator
88+
0, // coins
89+
false, // whether coins are verified
90+
false // if its platformer
91+
}; // Level ID is optional
92+
GDUtils::Events::RateEvent::emit(data);
93+
```
94+
95+
### Example Code (Listening for notification events from GDUtils)
96+
```cpp
97+
$execute {
98+
new EventListener<EventFilter<GDUtils::Events::OnRate>>(+[](GDUtils::Events::OnRate* e) {
99+
log::info("A rate event with the title {}", e->getTitle()); // A rate event with the title Small Daily Chest available!
100+
return ListenerResult::Propagate;
101+
});
102+
}
103+
```
104+
View the `test` directory if you want to view an example mod using the API.
105+
69106
## Libraries Used
70107
- [Geode](https://github.com/geode-sdk/geode)
71108
- [socket.io-client-cpp](https://github.com/socketio/socket.io-client-cpp)

changelog.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# Changelog
2+
## <cj>v1.4.0-beta.6</c> <cb>(2025-01-24)</c>
3+
* <cg>Added</c> an <cp>API</c> for GDUtils events and notifications!
4+
* <cy>Fixed</c> scale for demon placement if too large.
5+
26
## <cj>v1.4.0-beta.5</c> <cb>(2024-12-09)</c>
3-
* <cg>Added</c> <cj>Force</c>gauntlet designs.
7+
* <cg>Added</c> <cj>Force</c> gauntlet designs.
48
* <cy>Updated</c> preview icons button position.
59
* <cy>Fixed</c> gauntlets positions where they are less than 3.
610

include/RateEvent.hpp

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#pragma once
2+
3+
#include <Geode/loader/Event.hpp>
4+
#include "Types.hpp"
5+
6+
namespace GDUtils::Events {
7+
class RateEvent : public geode::Event {
8+
protected:
9+
EventData m_eventData;
10+
public:
11+
RateEvent(EventData data) : m_eventData(data) {};
12+
13+
EventType getEventType() const { return m_eventData.type; };
14+
std::string getLevelName() const { return m_eventData.level_name; };
15+
int getLevelID() const { return m_eventData.level_id; };
16+
static void emit(EventData data) {
17+
RateEvent(data).post();
18+
};
19+
EventData getData() const { return m_eventData; };
20+
static EventType intToType(int type) {
21+
switch (type) {
22+
default:
23+
return EventType::NA;
24+
case 0: // Rate
25+
return EventType::Rate;
26+
case 1: // Daily
27+
return EventType::Daily;
28+
case 2: // Weekly
29+
return EventType::Weekly;
30+
case 3: // Small chest
31+
return EventType::smallChest;
32+
case 4: // Large chest
33+
return EventType::largeChest;
34+
case 5: // List
35+
return EventType::List;
36+
case 6: // Event
37+
return EventType::Event;
38+
}
39+
}
40+
static int typeToInt(EventType type) {
41+
switch (type) {
42+
case EventType::NA:
43+
return -1;
44+
case EventType::Rate: // Rate
45+
return 0;
46+
case EventType::Daily: // Daily
47+
return 1;
48+
case EventType::Weekly: // Weekly
49+
return 2;
50+
case EventType::smallChest: // Small chest
51+
return 3;
52+
case EventType::largeChest: // Large chest
53+
return 4;
54+
case EventType::List: // List
55+
return 5;
56+
case EventType::Event: // Event
57+
return 6;
58+
}
59+
}
60+
};
61+
62+
class OnRate : public geode::Event {
63+
protected:
64+
EventData m_eventData;
65+
public:
66+
OnRate(EventData data) : m_eventData(data) {};
67+
68+
std::string getTitle() const { return m_eventData.title; };
69+
EventType getEventType() const { return m_eventData.type; };
70+
std::string getLevelName() const { return m_eventData.level_name; };
71+
int getLevelID() const { return m_eventData.level_id; };
72+
EventData getData() const { return m_eventData; };
73+
};
74+
}

include/Types.hpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#pragma once
2+
3+
#include <Geode/Geode.hpp>
4+
enum EventType {
5+
Rate,
6+
Daily,
7+
Weekly,
8+
Event,
9+
smallChest,
10+
largeChest,
11+
List,
12+
NA
13+
};
14+
15+
struct EventData {
16+
bool demon;
17+
uint8_t starsum;
18+
uint8_t stars;
19+
uint8_t rate;
20+
EventType type;
21+
std::string title;
22+
std::string sprite;
23+
std::string level_name;
24+
std::string level_creator;
25+
uint8_t coins;
26+
bool verified_coins;
27+
bool platformer;
28+
int level_id = -1;
29+
};

mod.json

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
2-
"geode": "4.0.1",
3-
"version": "v1.4.0-beta.5",
2+
"geode": "4.2.0",
3+
"version": "v1.4.0-beta.6",
44
"gd": {
55
"win": "2.2074",
66
"mac": "2.2074",
@@ -27,6 +27,9 @@
2727
"importance": "required"
2828
}
2929
],
30+
"api": {
31+
"include": [ "include/*.hpp" ]
32+
},
3033
"tags": [
3134
"online",
3235
"enhancement",
@@ -243,6 +246,12 @@
243246
"type": "bool",
244247
"default": true
245248
},
249+
"eventLevelInfo": {
250+
"name": "Event Level Info",
251+
"description": "Adds an info button to show the current event information!",
252+
"type": "bool",
253+
"default": true
254+
},
246255
"misc-section": {
247256
"name": "Miscellaneous",
248257
"description": "This category is for any other feature for <cy>GDUtils</c>.\nYou can choose whether to <cy>enable</c> or <cy>disable</c> some options if you do not want them.",

src/Notifications/EventsPush.cpp

Lines changed: 52 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,47 @@ const char* getDifficultyIcon(int stars) {
7979
}
8080
}
8181

82+
sio::message::ptr eventToSio(EventData eventData) {
83+
sio::message::ptr data = sio::object_message::create();
84+
data->get_map()["coins"] = sio::int_message::create(eventData.coins);
85+
data->get_map()["verified_coins"] = sio::int_message::create(eventData.verified_coins);
86+
data->get_map()["platformer"] = sio::int_message::create(eventData.platformer);
87+
data->get_map()["title"] = sio::string_message::create(eventData.title);
88+
data->get_map()["demon"] = sio::int_message::create(eventData.demon);
89+
data->get_map()["type"] = sio::int_message::create(GDUtils::Events::RateEvent::typeToInt(eventData.type));
90+
data->get_map()["stars"] = sio::int_message::create(eventData.stars);
91+
data->get_map()["starsum"] = sio::int_message::create(eventData.starsum);
92+
data->get_map()["level_name"] = sio::string_message::create(eventData.level_name);
93+
data->get_map()["level_creator"] = sio::string_message::create(eventData.level_creator);
94+
data->get_map()["sprite"] = sio::string_message::create(eventData.sprite);
95+
data->get_map()["rate"] = sio::int_message::create(eventData.rate);
96+
if (eventData.level_id != -1) {
97+
data->get_map()["level_id"] = sio::int_message::create(eventData.level_id);
98+
}
99+
return data;
100+
}
101+
102+
EventData sioToEvent(sio::message::ptr const& data) {
103+
auto map = data->get_map();
104+
EventData eventData;
105+
eventData.coins = map["coins"]->get_int();
106+
eventData.verified_coins = map["verified_coins"]->get_int() == 1;
107+
eventData.platformer = map["platformer"]->get_int();
108+
eventData.title = map["title"]->get_string();
109+
eventData.demon = map["demon"]->get_int() == 1;
110+
eventData.type = GDUtils::Events::RateEvent::intToType(map["type"]->get_int());
111+
eventData.stars = map["stars"]->get_int();
112+
eventData.starsum = map["starsum"]->get_int();
113+
eventData.level_name = map["level_name"]->get_string();
114+
eventData.level_creator = map["level_creator"]->get_string();
115+
eventData.sprite = map["sprite"]->get_string();
116+
eventData.rate = map["rate"]->get_int();
117+
if (map.find("level_id") != map.end()) {
118+
eventData.level_id = map["level_id"]->get_int();
119+
}
120+
return eventData;
121+
}
122+
82123
void EventsPush::destroySelf() {
83124
auto scene = CCDirector::sharedDirector()->getRunningScene();
84125
auto layer = reinterpret_cast<CCLayer*>(scene->getChildByTag(1932));
@@ -426,29 +467,7 @@ bool EventsPush::init(sio::message::ptr const& data) {
426467
bool smallChest = Mod::get()->template getSettingValue<bool>("smallChest");
427468
bool largeChest = Mod::get()->template getSettingValue<bool>("largeChest");
428469
bool list = Mod::get()->template getSettingValue<bool>("newListRate");
429-
switch (type) {
430-
case 0: // Rate
431-
eventType = EventType::Rate;
432-
break;
433-
case 1: // Daily
434-
eventType = EventType::Daily;
435-
break;
436-
case 2: // Weekly
437-
eventType = EventType::Weekly;
438-
break;
439-
case 3: // Small chest
440-
eventType = EventType::smallChest;
441-
break;
442-
case 4: // Large chest
443-
eventType = EventType::largeChest;
444-
break;
445-
case 5: // List
446-
eventType = EventType::List;
447-
break;
448-
case 6: // Event
449-
eventType = EventType::Event;
450-
break;
451-
}
470+
eventType = GDUtils::Events::RateEvent::intToType(type);
452471
if (type == 0 && !newRate) {
453472
EventsPush::eventCompletedCallback(scene);
454473
return true;
@@ -909,6 +928,7 @@ void EventsPush::processNextEvent(CCScene* self) {
909928
processingEvents = true;
910929

911930
auto layer = EventsPush::create(data);
931+
GDUtils::Events::OnRate(sioToEvent(data)).post();
912932
// Set a callback function that will be called when the event is completed
913933
//layer->setEventCompletedCallback(std::bind(&EventsPush::eventCompletedCallback, this));
914934
self->addChild(layer);
@@ -922,3 +942,12 @@ void EventsPush::eventCompletedCallback(CCScene* self) {
922942
// Process the next event (if any)
923943
EventsPush::processNextEvent(self);
924944
}
945+
946+
$execute {
947+
new EventListener<EventFilter<GDUtils::Events::RateEvent>>(+[](GDUtils::Events::RateEvent* e) {
948+
if (auto scene = CCScene::get()) {
949+
EventsPush::pushRateLevel(scene, eventToSio(e->getData()));
950+
}
951+
return ListenerResult::Stop;
952+
});
953+
}

src/Notifications/EventsPush.h

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,9 @@
11
#pragma once
22
#include <Geode/Geode.hpp>
33
#include <Geode/loader/Mod.hpp>
4+
#include "../../include/RateEvent.hpp"
45
#include "../includes.h"
56
using namespace geode::prelude;
6-
enum EventType {
7-
Rate,
8-
Daily,
9-
Weekly,
10-
Event,
11-
smallChest,
12-
largeChest,
13-
List,
14-
NA
15-
};
167

178
class EventsPush : public CCLayer {
189
protected:

src/Styles/EventLevelInformation.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class $modify(EventPage, DailyLevelPage) {
1212

1313
if (type != GJTimedLevelType::Event) return true;
1414

15+
if (!Mod::get()->template getSettingValue<bool>("eventLevelInfo")) return true;
16+
1517
auto infoSpr = CCSprite::createWithSpriteFrameName("info_btn.png"_spr);
1618
auto infoBtn = CCMenuItemSpriteExtra::create(infoSpr, this, menu_selector(EventPage::onInfo));
1719

@@ -111,4 +113,4 @@ void EventLevelInformation::onDownloadFail() {
111113
void EventLevelInformation::fadeLoadingCircle() {
112114
if (loading_circle == nullptr) return;
113115
loading_circle->fadeAndRemove();
114-
};
116+
};

0 commit comments

Comments
 (0)